Modify usage of videoinfo

This commit is contained in:
taizan-hokuto
2020-01-26 23:29:50 +09:00
parent cc78551e90
commit 38253e1d18
3 changed files with 31 additions and 19 deletions

View File

@@ -0,0 +1,3 @@
from . videoinfo import VideoInfo
def videoinfo(video_id):
return VideoInfo(video_id)

View File

@@ -5,10 +5,11 @@ import traceback
from urllib.parse import quote from urllib.parse import quote
from . import parser from . import parser
from . import videoinfo
from .. import config from .. import config
from .. import util from .. import util
from .. paramgen import arcparam from .. paramgen import arcparam
from ..exceptions import InvalidVideoIdException
logger = config.logger(__name__) logger = config.logger(__name__)
headers=config.headers headers=config.headers

View File

@@ -7,24 +7,32 @@ from ..exceptions import InvalidVideoIdException
headers = config.headers headers = config.headers
pattern=re.compile(r"yt\.setConfig\({'PLAYER_CONFIG': ({.*})}\);") pattern=re.compile(r"yt\.setConfig\({'PLAYER_CONFIG': ({.*})}\);")
def _parse(html): class VideoInfo:
result = re.search(pattern, html) def __init__(self,video_id):
res= json.loads(result.group(1)) self.video_id = video_id
response = res["args"].get("embedded_player_response") self.info = self._get_info(video_id)
if response is None:
raise InvalidVideoIdException("Invalid video_id.")
renderer = (json.loads(response))["embedPreview"]["thumbnailPreviewRenderer"]
return {
"duration": int(renderer["videoDurationSeconds"]),
"title" : [''.join(run["text"]) for run in renderer["title"]["runs"]][0],
"channelId" : renderer["videoDetails"]["embeddedPlayerOverlayVideoDetailsRenderer"]["channelThumbnailEndpoint"]["channelThumbnailEndpoint"]["urlEndpoint"]["urlEndpoint"]["url"][9:]
}
def get_info(video_id): def _get_info(self,video_id):
url = f"https://www.youtube.com/embed/{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() resp.raise_for_status()
return _parse(resp.text) return self._parse(resp.text)
def _parse(self,html):
result = re.search(pattern, html)
res= json.loads(result.group(1))
response = res["args"].get("embedded_player_response")
if response is None:
raise InvalidVideoIdException("動画IDが無効です。")
renderer = (json.loads(response))["embedPreview"]["thumbnailPreviewRenderer"]
return {
"duration": int(renderer["videoDurationSeconds"]),
"title" : [''.join(run["text"]) for run in renderer["title"]["runs"]][0],
"channelId" : renderer["videoDetails"]["embeddedPlayerOverlayVideoDetailsRenderer"]["channelThumbnailEndpoint"]["channelThumbnailEndpoint"]["urlEndpoint"]["urlEndpoint"]["url"][9:]
}
def get(self,item):
return self.info.get(item)