feat: persist selected yt-dlp format details after each successful download

Signed-off-by: Nguyen Huy Hoang <181364121+huyhoang171106@users.noreply.github.com>
This commit is contained in:
Nguyen Huy Hoang 2026-03-26 23:42:11 +07:00
parent b6942c8352
commit e77909416a
1 changed files with 59 additions and 0 deletions

View File

@ -53,6 +53,7 @@ class VideoDownloader(DownloaderBase):
def __init__(self, task=False):
super().__init__(task)
self.obs = False
self._last_info = False
self._build_obs()
def run_queue(self, auto_only=False) -> tuple[int, int]:
@ -73,6 +74,7 @@ class VideoDownloader(DownloaderBase):
print(f"{youtube_id}: Downloading video")
self._notify(video_data, "Validate download format")
self._last_info = False
success = self._dl_single_vid(youtube_id, channel_id)
if not success:
failed += 1
@ -81,6 +83,7 @@ class VideoDownloader(DownloaderBase):
self._notify(video_data, "Add video metadata to index", progress=1)
video_type = VideoTypeEnum(video_data["vid_type"])
vid_dict = index_new_video(youtube_id, video_type=video_type)
self._save_selected_formats(youtube_id)
RedisQueue(self.CHANNEL_QUEUE).add(channel_id)
RedisQueue(self.VIDEO_QUEUE).add(youtube_id)
@ -143,10 +146,66 @@ class VideoDownloader(DownloaderBase):
except KeyError:
message = "processing"
info_dict = response.get("info_dict")
if info_dict:
self._last_info = info_dict
if self.task:
title = response["info_dict"]["title"]
self.task.send_progress([title, message], progress=progress)
def _save_selected_formats(self, youtube_id):
"""persist selected format data after successful download"""
if not self._last_info or self._last_info.get("id") != youtube_id:
return
format_data = self._normalize_selected_formats(self._last_info)
if not format_data:
return
data = {
"doc": {
"selected_formats": format_data,
"selected_formats_captured_at": datetime.now().isoformat(),
}
}
_, status_code = ElasticWrap(f"ta_video/_update/{youtube_id}").post(data=data)
if status_code not in [200, 201]:
print(f"{youtube_id}: failed to persist selected formats")
@staticmethod
def _normalize_selected_formats(info_dict):
"""normalize selected format payload"""
normalized = []
for format_item in info_dict.get("requested_formats", []):
item = VideoDownloader._normalize_format_item(format_item)
if item:
normalized.append(item)
if normalized:
return normalized
single_item = VideoDownloader._normalize_format_item(info_dict)
if single_item:
return [single_item]
return False
@staticmethod
def _normalize_format_item(format_item):
"""normalize one selected format"""
format_id = format_item.get("format_id")
if format_id is None:
return False
data = {"format_id": str(format_id)}
for key in ["height", "width", "fps", "vcodec", "acodec", "tbr", "vbr", "abr"]:
value = format_item.get(key)
if value is not None:
data[key] = value
return data
def _build_obs(self):
"""collection to build all obs passed to yt-dlp"""
self._build_obs_basic()