Add setup.py

This commit is contained in:
taizan-hokuto
2020-04-16 23:18:58 +09:00
parent 99423ddcd0
commit 1100346971
10 changed files with 182 additions and 32 deletions

2
MANIFEST.in Normal file
View File

@@ -0,0 +1,2 @@
include requirements.txt
global-exclude pytchat/testrun*.py

55
README.md Normal file
View 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

View File

1
requirements.txt Normal file
View File

@@ -0,0 +1 @@
requests

View File

@@ -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
View 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

View File

@@ -1,10 +1,10 @@
from . import config
import emoji
import json
import re
import requests
import config
from exceptions import InvalidVideoIdException
headers = config.headers
from . import util
from . exceptions import InvalidVideoIdException
pattern = re.compile(r"yt\.setConfig\({'PLAYER_CONFIG': ({.*})}\);")
@@ -44,7 +44,7 @@ item_thumbnail = [
"url"
]
item_channel_name = [
item_owner_name = [
"videoDetails",
"embeddedPlayerOverlayVideoDetailsRenderer",
"expandedRenderer",
@@ -55,25 +55,17 @@ item_channel_name = [
"text"
]
item_username = [
item_user_name = [
"args",
"user_display_name",
]
item_userimage = [
item_user_image = [
"args",
"user_display_image",
]
item_moving_thumbnail = [
"movingThumbnail",
"thumbnails",
0,
"url"
]
class VideoInfo:
'''
VideoInfo object retrieves YouTube video information.
@@ -88,7 +80,7 @@ class VideoInfo:
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:
self.session = session
else:
@@ -100,16 +92,17 @@ class VideoInfo:
def _get_page_text(self, 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()
return resp.text
def _parse(self, text):
result = re.search(pattern, text)
res = json.loads(result.group(1))
response = self._get_item(res, item_response)
self._res = json.loads(result.group(1))
response = self._get_item(self._res, item_response)
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)
if self._renderer is None:
raise InvalidVideoIdException(
@@ -151,26 +144,51 @@ class VideoInfo:
for run in self._renderer["title"]["runs"]][0]
return None
def get_title_escaped(self):
return self._no_emoji(self.get_title())
def get_channel_id(self):
channel_url = self._get_item(self._renderer, item_channel_id)
if channel_url:
return channel_url[9:]
return None
def get_owner_image(self):
return self._get_item(self._renderer, item_owner_image)
def get_thumbnail(self):
return self._get_item(self._renderer, item_thumbnail)
def get_channel_name(self):
return self._get_item(self._renderer, item_channel_name)
def get_owner_image(self):
return self._get_item(self._renderer, item_owner_image)
def get_username(self):
return self._get_item(self._renderer, item_username)
def get_owner_name(self):
return self._get_item(self._renderer, item_owner_name)
def get_userimage(self):
return self._get_item(self._renderer, item_userimage)
def get_owner_name_escaped(self):
return self._no_emoji(self.get_owner_name())
def get_moving_thumbnail(self):
return self._get_item(self._renderer, item_moving_thumbnail)
def get_user_name(self):
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)