Add setup.py
This commit is contained in:
2
MANIFEST.in
Normal file
2
MANIFEST.in
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
include requirements.txt
|
||||||
|
global-exclude pytchat/testrun*.py
|
||||||
55
README.md
Normal file
55
README.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
## Install
|
||||||
|
```bash
|
||||||
|
pip install yvi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
```python
|
||||||
|
import yvi
|
||||||
|
|
||||||
|
info = yvi.get_info(video_id = "xxxxxxxx")
|
||||||
|
info.get_title()
|
||||||
|
info.get_channel_id()
|
||||||
|
```
|
||||||
|
## Parameter
|
||||||
|
### video_id
|
||||||
|
|
||||||
|
- video id
|
||||||
|
|
||||||
|
### session
|
||||||
|
|
||||||
|
- session object of requests.
|
||||||
|
|
||||||
|
## Funtions
|
||||||
|
### get_duration()
|
||||||
|
動画の長さ(アーカイブのみ。ライブ動画または待機画面の場合0)
|
||||||
|
|
||||||
|
### get_title()
|
||||||
|
- 動画タイトル
|
||||||
|
|
||||||
|
### get_title_escaped()
|
||||||
|
- 動画タイトル(絵文字なし。GUIライブラリ等で絵文字が含まれていてエラーが出る場合はこちらを使用してください)
|
||||||
|
|
||||||
|
### get_channel_id()
|
||||||
|
- チャンネルID
|
||||||
|
|
||||||
|
### get_thumbnail()
|
||||||
|
- 動画サムネイルURL
|
||||||
|
|
||||||
|
### get_owner_name()
|
||||||
|
- 配信者名
|
||||||
|
|
||||||
|
### get_owner_name_escaped()
|
||||||
|
- 配信者名(絵文字なし)
|
||||||
|
|
||||||
|
### get_owner_image()
|
||||||
|
- 配信者プロフィール画像URL
|
||||||
|
|
||||||
|
### get_user_name()
|
||||||
|
- 視聴者名
|
||||||
|
|
||||||
|
### get_user_name_escaped()
|
||||||
|
- 視聴者名(絵文字なし)
|
||||||
|
|
||||||
|
### get_user_image()
|
||||||
|
- 視聴者プロフィール画像URL
|
||||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
requests
|
||||||
62
setup.py
62
setup.py
@@ -0,0 +1,62 @@
|
|||||||
|
from setuptools import setup, find_packages, Command
|
||||||
|
from os import path, system, remove, rename, removedirs
|
||||||
|
import re
|
||||||
|
|
||||||
|
package_name = "yvi"
|
||||||
|
|
||||||
|
root_dir = path.abspath(path.dirname(__file__))
|
||||||
|
|
||||||
|
def _requirements():
|
||||||
|
return [name.rstrip()
|
||||||
|
for name in open(path.join(
|
||||||
|
root_dir, 'requirements.txt')).readlines()]
|
||||||
|
|
||||||
|
with open(path.join(root_dir, package_name, '__init__.py')) as f:
|
||||||
|
init_text = f.read()
|
||||||
|
version = re.search(
|
||||||
|
r'__version__\s*=\s*[\'\"](.+?)[\'\"]', init_text).group(1)
|
||||||
|
license = re.search(
|
||||||
|
r'__license__\s*=\s*[\'\"](.+?)[\'\"]', init_text).group(1)
|
||||||
|
author = re.search(
|
||||||
|
r'__author__\s*=\s*[\'\"](.+?)[\'\"]', init_text).group(1)
|
||||||
|
author_email = re.search(
|
||||||
|
r'__author_email__\s*=\s*[\'\"](.+?)[\'\"]', init_text).group(1)
|
||||||
|
url = re.search(
|
||||||
|
r'__url__\s*=\s*[\'\"](.+?)[\'\"]', init_text).group(1)
|
||||||
|
|
||||||
|
assert version
|
||||||
|
assert license
|
||||||
|
assert author
|
||||||
|
assert author_email
|
||||||
|
assert url
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
with open('README.md', encoding='utf-8') as f:
|
||||||
|
long_description = f.read()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
setup(
|
||||||
|
author=author,
|
||||||
|
author_email=author_email,
|
||||||
|
classifiers=[
|
||||||
|
'Natural Language :: Japanese',
|
||||||
|
'Development Status :: 4 - Beta',
|
||||||
|
'Programming Language :: Python',
|
||||||
|
'Programming Language :: Python :: 3.7',
|
||||||
|
'Programming Language :: Python :: 3.8',
|
||||||
|
'License :: OSI Approved :: MIT License',
|
||||||
|
],
|
||||||
|
description="Retrieve youtube video info.",
|
||||||
|
install_requires=_requirements(),
|
||||||
|
keywords='youtube',
|
||||||
|
license=license,
|
||||||
|
long_description=long_description,
|
||||||
|
long_description_content_type='text/markdown',
|
||||||
|
name=package_name,
|
||||||
|
packages=find_packages(exclude=['*log.txt','*tests','*testrun']),
|
||||||
|
url=url,
|
||||||
|
version=version,
|
||||||
|
)
|
||||||
12
yvi/__init__.py
Normal file
12
yvi/__init__.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
"""
|
||||||
|
Retriever tool for youtube video information.
|
||||||
|
"""
|
||||||
|
__copyright__ = 'Copyright (C) 2020 taizan-hokuto'
|
||||||
|
__version__ = '0.0.0'
|
||||||
|
__license__ = 'MIT'
|
||||||
|
__author__ = 'taizan-hokuto'
|
||||||
|
__author_email__ = '55448286+taizan-hokuto@users.noreply.github.com'
|
||||||
|
__url__ = 'https://github.com/taizan-hokuto/yvi'
|
||||||
|
|
||||||
|
from yvi.yvi import get_info
|
||||||
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
|
from . import config
|
||||||
|
import emoji
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
import requests
|
import requests
|
||||||
import config
|
from . import util
|
||||||
from exceptions import InvalidVideoIdException
|
from . exceptions import InvalidVideoIdException
|
||||||
|
|
||||||
headers = config.headers
|
|
||||||
|
|
||||||
pattern = re.compile(r"yt\.setConfig\({'PLAYER_CONFIG': ({.*})}\);")
|
pattern = re.compile(r"yt\.setConfig\({'PLAYER_CONFIG': ({.*})}\);")
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ item_thumbnail = [
|
|||||||
"url"
|
"url"
|
||||||
]
|
]
|
||||||
|
|
||||||
item_channel_name = [
|
item_owner_name = [
|
||||||
"videoDetails",
|
"videoDetails",
|
||||||
"embeddedPlayerOverlayVideoDetailsRenderer",
|
"embeddedPlayerOverlayVideoDetailsRenderer",
|
||||||
"expandedRenderer",
|
"expandedRenderer",
|
||||||
@@ -55,25 +55,17 @@ item_channel_name = [
|
|||||||
"text"
|
"text"
|
||||||
]
|
]
|
||||||
|
|
||||||
item_username = [
|
item_user_name = [
|
||||||
"args",
|
"args",
|
||||||
"user_display_name",
|
"user_display_name",
|
||||||
]
|
]
|
||||||
|
|
||||||
item_userimage = [
|
item_user_image = [
|
||||||
"args",
|
"args",
|
||||||
"user_display_image",
|
"user_display_image",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
item_moving_thumbnail = [
|
|
||||||
"movingThumbnail",
|
|
||||||
"thumbnails",
|
|
||||||
0,
|
|
||||||
"url"
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class VideoInfo:
|
class VideoInfo:
|
||||||
'''
|
'''
|
||||||
VideoInfo object retrieves YouTube video information.
|
VideoInfo object retrieves YouTube video information.
|
||||||
@@ -88,7 +80,7 @@ class VideoInfo:
|
|||||||
Occurs when video_id does not exist on YouTube.
|
Occurs when video_id does not exist on YouTube.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def __init__(self, video_id, session=None):
|
def __init__(self, video_id, session:requests.Session = None):
|
||||||
if session:
|
if session:
|
||||||
self.session = session
|
self.session = session
|
||||||
else:
|
else:
|
||||||
@@ -100,16 +92,17 @@ class VideoInfo:
|
|||||||
|
|
||||||
def _get_page_text(self, video_id):
|
def _get_page_text(self, video_id):
|
||||||
url = f"https://www.youtube.com/embed/{video_id}"
|
url = f"https://www.youtube.com/embed/{video_id}"
|
||||||
resp = self.session.get(url, headers=headers)
|
resp = self.session.get(url)
|
||||||
resp.raise_for_status()
|
resp.raise_for_status()
|
||||||
return resp.text
|
return resp.text
|
||||||
|
|
||||||
def _parse(self, text):
|
def _parse(self, text):
|
||||||
result = re.search(pattern, text)
|
result = re.search(pattern, text)
|
||||||
res = json.loads(result.group(1))
|
self._res = json.loads(result.group(1))
|
||||||
response = self._get_item(res, item_response)
|
response = self._get_item(self._res, item_response)
|
||||||
if response is None:
|
if response is None:
|
||||||
self._check_video_is_private(res.get("args"))
|
self._check_video_is_private(self._res.get("args"))
|
||||||
|
|
||||||
self._renderer = self._get_item(json.loads(response), item_renderer)
|
self._renderer = self._get_item(json.loads(response), item_renderer)
|
||||||
if self._renderer is None:
|
if self._renderer is None:
|
||||||
raise InvalidVideoIdException(
|
raise InvalidVideoIdException(
|
||||||
@@ -151,26 +144,51 @@ class VideoInfo:
|
|||||||
for run in self._renderer["title"]["runs"]][0]
|
for run in self._renderer["title"]["runs"]][0]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_title_escaped(self):
|
||||||
|
return self._no_emoji(self.get_title())
|
||||||
|
|
||||||
def get_channel_id(self):
|
def get_channel_id(self):
|
||||||
channel_url = self._get_item(self._renderer, item_channel_id)
|
channel_url = self._get_item(self._renderer, item_channel_id)
|
||||||
if channel_url:
|
if channel_url:
|
||||||
return channel_url[9:]
|
return channel_url[9:]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_owner_image(self):
|
|
||||||
return self._get_item(self._renderer, item_owner_image)
|
|
||||||
|
|
||||||
def get_thumbnail(self):
|
def get_thumbnail(self):
|
||||||
return self._get_item(self._renderer, item_thumbnail)
|
return self._get_item(self._renderer, item_thumbnail)
|
||||||
|
|
||||||
def get_channel_name(self):
|
def get_owner_image(self):
|
||||||
return self._get_item(self._renderer, item_channel_name)
|
return self._get_item(self._renderer, item_owner_image)
|
||||||
|
|
||||||
def get_username(self):
|
def get_owner_name(self):
|
||||||
return self._get_item(self._renderer, item_username)
|
return self._get_item(self._renderer, item_owner_name)
|
||||||
|
|
||||||
def get_userimage(self):
|
def get_owner_name_escaped(self):
|
||||||
return self._get_item(self._renderer, item_userimage)
|
return self._no_emoji(self.get_owner_name())
|
||||||
|
|
||||||
def get_moving_thumbnail(self):
|
def get_user_name(self):
|
||||||
return self._get_item(self._renderer, item_moving_thumbnail)
|
return self._get_item(self._res, item_user_name)
|
||||||
|
|
||||||
|
def get_user_name_escaped(self):
|
||||||
|
return self._no_emoji(self.get_user_name())
|
||||||
|
|
||||||
|
def get_user_image(self):
|
||||||
|
return self._get_item(self._res, item_user_image)
|
||||||
|
|
||||||
|
def _no_emoji(self, text:str):
|
||||||
|
if text is None:
|
||||||
|
return None
|
||||||
|
return ''.join(c for c in text
|
||||||
|
if c not in emoji.UNICODE_EMOJI)
|
||||||
|
|
||||||
|
def get_info(video_id:str, session:requests.Session = None) -> VideoInfo:
|
||||||
|
"""
|
||||||
|
Paaramters
|
||||||
|
----------
|
||||||
|
video_id : str :
|
||||||
|
video_id
|
||||||
|
|
||||||
|
session : requests.Session
|
||||||
|
session object
|
||||||
|
"""
|
||||||
|
|
||||||
|
return VideoInfo(video_id = video_id, session = session)
|
||||||
Reference in New Issue
Block a user