Change VideoInfo functions to accessor style

This commit is contained in:
taizan-hokuto
2020-02-29 03:10:20 +09:00
parent fe2047502a
commit ff9e7de796
10 changed files with 171 additions and 37 deletions

View File

@@ -4,8 +4,10 @@ import requests
from .. import config
from .. import util
from ..exceptions import InvalidVideoIdException
headers = config.headers
pattern=re.compile(r"yt\.setConfig\({'PLAYER_CONFIG': ({.*})}\);")
pattern = re.compile(r"yt\.setConfig\({'PLAYER_CONFIG': ({.*})}\);")
item_channel_id =[
"videoDetails",
@@ -36,7 +38,6 @@ item_author_image =[
"url"
]
item_thumbnail = [
"defaultThumbnail",
"thumbnails",
@@ -63,24 +64,27 @@ item_moving_thumbnail = [
]
class VideoInfo:
def __init__(self,video_id):
'''
VideoInfo object retrieves YouTube video informations
from the video page.
Parameter
---------
video_id : str
Exception
---------
InvalidVideoIdException :
Occurs when video_id does not exist on YouTube.
'''
def __init__(self, video_id):
self.video_id = video_id
text = self._get_page_text(video_id)
self._parse(text)
self._get_attributes()
def _get_attributes(self):
self.duration = self._duration()
self.channel_id = self._channel_id()
self.channel_name = self._channel_name()
self.thumbnail = self._thumbnail()
self.author_image = self._author_image()
self.title = self._title()
self.moving_thumbnail = self._moving_thumbnail()
def _get_page_text(self,video_id):
def _get_page_text(self, video_id):
url = f"https://www.youtube.com/embed/{video_id}"
resp= requests.get(url, headers = headers)
resp = requests.get(url, headers = headers)
resp.raise_for_status()
return resp.text
@@ -91,8 +95,8 @@ class VideoInfo:
if response is None:
raise InvalidVideoIdException(
f"Specified video_id [{self.video_id}] is invalid.")
self.renderer = self._get_item(json.loads(response), item_renderer)
if self.renderer is None:
self._renderer = self._get_item(json.loads(response), item_renderer)
if self._renderer is None:
raise InvalidVideoIdException(
f"No renderer found in video_id: [{self.video_id}].")
@@ -111,29 +115,35 @@ class VideoInfo:
return None
return dict_body
def _duration(self):
return int(self.renderer.get("videoDurationSeconds") or 0)
def _title(self):
if self.renderer.get("title"):
return [''.join(run["text"])
for run in self.renderer["title"]["runs"]][0]
def get_duration(self):
duration_seconds = self._renderer.get("videoDurationSeconds")
if duration_seconds:
'''Fetched value is string, so cast to integer.'''
return int(duration_seconds)
'''When key is not found, explicitly returns None.'''
return None
def _channel_id(self):
channel_url = self._get_item(self.renderer, item_channel_id)
def get_title(self):
print(self._renderer)
if self._renderer.get("title"):
return [''.join(run["text"])
for run in self._renderer["title"]["runs"]][0]
return None
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 _author_image(self):
return self._get_item(self.renderer, item_author_image)
def get_author_image(self):
return self._get_item(self._renderer, item_author_image)
def _thumbnail(self):
return self._get_item(self.renderer, item_thumbnail)
def get_thumbnail(self):
return self._get_item(self._renderer, item_thumbnail)
def _channel_name(self):
return self._get_item(self.renderer, item_channel_name)
def get_channel_name(self):
return self._get_item(self._renderer, item_channel_name)
def _moving_thumbnail(self):
return self._get_item(self.renderer, item_moving_thumbnail)
def get_moving_thumbnail(self):
return self._get_item(self._renderer, item_moving_thumbnail)