pass whole video object into YoutubeSubtitle class

This commit is contained in:
simon 2022-02-09 23:40:15 +07:00
parent 4e2d0fa464
commit 4e4cfe3334
No known key found for this signature in database
GPG Key ID: 2C15AA5E89985DD4

View File

@ -18,16 +18,13 @@ from ryd_client import ryd_client
class YoutubeSubtitle: class YoutubeSubtitle:
"""handle video subtitle functionality""" """handle video subtitle functionality"""
def __init__(self, config, youtube_meta, media_url, youtube_id): def __init__(self, video):
self.config = config self.video = video
self.youtube_meta = youtube_meta
self.media_url = media_url
self.youtube_id = youtube_id
self.languages = False self.languages = False
def sub_conf_parse(self): def sub_conf_parse(self):
"""add additional conf values to self""" """add additional conf values to self"""
languages_raw = self.config["downloads"]["subtitle"] languages_raw = self.video.config["downloads"]["subtitle"]
self.languages = [i.strip() for i in languages_raw.split(",")] self.languages = [i.strip() for i in languages_raw.split(",")]
def get_subtitles(self): def get_subtitles(self):
@ -41,7 +38,7 @@ class YoutubeSubtitle:
if relevant_subtitles: if relevant_subtitles:
return relevant_subtitles return relevant_subtitles
if self.config["downloads"]["subtitle_source"] == "auto": if self.video.config["downloads"]["subtitle_source"] == "auto":
relevant_auto = self.get_auto_caption() relevant_auto = self.get_auto_caption()
return relevant_auto return relevant_auto
@ -49,8 +46,8 @@ class YoutubeSubtitle:
def get_auto_caption(self): def get_auto_caption(self):
"""get auto_caption subtitles""" """get auto_caption subtitles"""
print(f"{self.youtube_id}: get auto generated subtitles") print(f"{self.video.youtube_id}: get auto generated subtitles")
all_subtitles = self.youtube_meta.get("automatic_captions") all_subtitles = self.video.youtube_meta.get("automatic_captions")
if not all_subtitles: if not all_subtitles:
return False return False
@ -58,7 +55,8 @@ class YoutubeSubtitle:
relevant_subtitles = [] relevant_subtitles = []
for lang in self.languages: for lang in self.languages:
media_url = self.media_url.replace(".mp4", f"-{lang}.vtt") video_media_url = self.video.json_data["media_url"]
media_url = video_media_url.replace(".mp4", f"-{lang}.vtt")
all_formats = all_subtitles.get(lang) all_formats = all_subtitles.get(lang)
subtitle = [i for i in all_formats if i["ext"] == "vtt"][0] subtitle = [i for i in all_formats if i["ext"] == "vtt"][0]
subtitle.update( subtitle.update(
@ -71,7 +69,7 @@ class YoutubeSubtitle:
def _normalize_lang(self): def _normalize_lang(self):
"""normalize country specific language keys""" """normalize country specific language keys"""
all_subtitles = self.youtube_meta.get("subtitles") all_subtitles = self.video.youtube_meta.get("subtitles")
if not all_subtitles: if not all_subtitles:
return False return False
@ -87,7 +85,7 @@ class YoutubeSubtitle:
def get_user_subtitles(self): def get_user_subtitles(self):
"""get subtitles uploaded from channel owner""" """get subtitles uploaded from channel owner"""
print(f"{self.youtube_id}: get user uploaded subtitles") print(f"{self.video.youtube_id}: get user uploaded subtitles")
all_subtitles = self._normalize_lang() all_subtitles = self._normalize_lang()
if not all_subtitles: if not all_subtitles:
return False return False
@ -95,7 +93,8 @@ class YoutubeSubtitle:
relevant_subtitles = [] relevant_subtitles = []
for lang in self.languages: for lang in self.languages:
media_url = self.media_url.replace(".mp4", f"-{lang}.vtt") video_media_url = self.video.json_data["media_url"]
media_url = video_media_url.replace(".mp4", f"-{lang}.vtt")
all_formats = all_subtitles.get(lang) all_formats = all_subtitles.get(lang)
subtitle = [i for i in all_formats if i["ext"] == "vtt"][0] subtitle = [i for i in all_formats if i["ext"] == "vtt"][0]
subtitle.update( subtitle.update(
@ -108,10 +107,9 @@ class YoutubeSubtitle:
def download_subtitles(self, relevant_subtitles): def download_subtitles(self, relevant_subtitles):
"""download subtitle files to archive""" """download subtitle files to archive"""
videos_base = self.video.config["application"]["videos"]
for subtitle in relevant_subtitles: for subtitle in relevant_subtitles:
dest_path = os.path.join( dest_path = os.path.join(videos_base, subtitle["media_url"])
self.config["application"]["videos"], subtitle["media_url"]
)
response = requests.get(subtitle["url"]) response = requests.get(subtitle["url"])
if subtitle["source"] == "auto": if subtitle["source"] == "auto":
parser = SubtitleParser(response.text) parser = SubtitleParser(response.text)
@ -125,7 +123,7 @@ class YoutubeSubtitle:
with open(dest_path, "w", encoding="utf-8") as subfile: with open(dest_path, "w", encoding="utf-8") as subfile:
subfile.write(subtitle_str_clean) subfile.write(subtitle_str_clean)
else: else:
print(f"{self.youtube_id}: failed to download subtitle") print(f"{self.video.youtube_id}: failed to download subtitle")
class SubtitleParser: class SubtitleParser:
@ -375,12 +373,7 @@ class YoutubeVideo(YouTubeItem, YoutubeSubtitle):
def _check_subtitles(self): def _check_subtitles(self):
"""optionally add subtitles""" """optionally add subtitles"""
handler = YoutubeSubtitle( handler = YoutubeSubtitle(self)
self.config,
self.youtube_meta,
media_url=self.json_data["media_url"],
youtube_id=self.youtube_id,
)
subtitles = handler.get_subtitles() subtitles = handler.get_subtitles()
if subtitles: if subtitles:
self.json_data["subtitles"] = subtitles self.json_data["subtitles"] = subtitles