implement artwork restore

This commit is contained in:
Simon 2025-12-25 15:59:10 +07:00
parent a3cda2ca59
commit 5c3898e7b8
No known key found for this signature in database
GPG Key ID: 2C15AA5E89985DD4
1 changed files with 49 additions and 2 deletions

View File

@ -9,6 +9,7 @@ from channel.serializers import ChannelSerializer
from channel.src.index import YoutubeChannel
from common.src.env_settings import EnvironmentSettings
from common.src.es_connect import ElasticWrap, IndexPaginate
from download.src.thumbnails import ThumbManager
from mutagen.mp4 import MP4, MP4FreeForm
from video.serializers import (
CommentsSerializer,
@ -71,6 +72,7 @@ class IndexFromEmbed:
"""restore from embedded metadata, potential untrusted"""
VIDEOS_BASE = EnvironmentSettings.MEDIA_DIR
CACHE_DIR = EnvironmentSettings.CACHE_DIR
HOST_UID = EnvironmentSettings.HOST_UID
HOST_GID = EnvironmentSettings.HOST_GID
@ -101,8 +103,8 @@ class IndexFromEmbed:
def _get_embedded(self) -> dict | None:
"""get embedded metadata"""
video = MP4(self.file_path)
ta_data = video.get("----:com.tubearchivist:ta")
video_mutagen = MP4(self.file_path)
ta_data = video_mutagen.get("----:com.tubearchivist:ta")
if not ta_data:
return None
@ -199,6 +201,51 @@ class IndexFromEmbed:
if self.HOST_UID and self.HOST_GID:
os.chown(new_path, self.HOST_UID, self.HOST_GID)
def restore_artwork(self, video):
"""restore artwork if needed"""
video_mutagen = MP4(self.file_path)
thumb = ThumbManager(video.youtube_id).vid_thumb_path(absolute=True)
self._restore_art_item(video_mutagen, "covr", thumb)
channel_id = video.json_data["channel"]["channel_id"]
banner_path = os.path.join(
self.CACHE_DIR, "channels", f"{channel_id}_banner.jpg"
)
self._restore_art_item(
video_mutagen, "----:com.tubearchivist:channel_banner", banner_path
)
channel_icon = os.path.join(
self.CACHE_DIR, "channels", f"{channel_id}_thumb.jpg"
)
self._restore_art_item(
video_mutagen, "----:com.tubearchivist:channel_icon", channel_icon
)
tv_art_path = os.path.join(
self.CACHE_DIR, "channels", f"{channel_id}_tvart.jpg"
)
self._restore_art_item(
video_mutagen, "----:com.tubearchivist:channel_tv", tv_art_path
)
def _restore_art_item(
self, video_mutagen, mutagen_key: str, target_path: str
) -> None:
"""restore single art item"""
if os.path.exists(target_path):
# don't overwrite
return
art_item = video_mutagen.get(mutagen_key)
if not art_item and not isinstance(art_item, list):
# is not embedded
return
with open(target_path, "wb") as f:
f.write(bytes(art_item[0]))
def index_subtitles(self, json_embed, video):
"""index subtitles"""
subtitle_data = json_embed.get("subtitles")