From 71bc8383e5d4cc58033845eb7c5fe6d40f364e90 Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 25 Jan 2026 11:56:12 +0700 Subject: [PATCH] persist temporary cookie, add cachepath, #1081 --- .../config/management/commands/ta_startup.py | 1 + backend/download/src/yt_dlp_base.py | 38 ++++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/backend/config/management/commands/ta_startup.py b/backend/config/management/commands/ta_startup.py index 3159ae96..dc5e8aa2 100644 --- a/backend/config/management/commands/ta_startup.py +++ b/backend/config/management/commands/ta_startup.py @@ -72,6 +72,7 @@ class Command(BaseCommand): "import", "playlists", "videos", + "ytdlp", ] cache_dir = EnvironmentSettings.CACHE_DIR for folder in folders: diff --git a/backend/download/src/yt_dlp_base.py b/backend/download/src/yt_dlp_base.py index 462e12c4..f6d58952 100644 --- a/backend/download/src/yt_dlp_base.py +++ b/backend/download/src/yt_dlp_base.py @@ -7,9 +7,11 @@ functionality: from datetime import datetime from http import cookiejar from io import StringIO +from os import path import yt_dlp from appsettings.src.config import AppConfig +from common.src.env_settings import EnvironmentSettings from common.src.ta_redis import RedisArchivist from django.conf import settings @@ -23,6 +25,9 @@ class YtWrap: "socket_timeout": 10, "extractor_retries": 3, "retries": 10, + "cachedir": path.abspath( + path.join(EnvironmentSettings.CACHE_DIR, "ytdlp") + ), } def __init__(self, obs_request, config=False): @@ -47,7 +52,10 @@ class YtWrap: """add cookie if enabled""" if self.config["downloads"]["cookie_import"]: cookie_io = CookieHandler(self.config).get() - self.obs["cookiefile"] = cookie_io + else: + cookie_io = CookieHandler(self.config).get("cookie_temp") + + self.obs["cookiefile"] = cookie_io def _add_potoken(self): """add potoken if enabled""" @@ -126,27 +134,37 @@ class YtWrap: def _validate_cookie(self): """check cookie and write it back for next use""" - if not self.obs.get("cookiefile"): - return + self.obs["cookiefile"].seek(0) + new_cookie = self.obs["cookiefile"].read().strip("\x00") - new_cookie = self.obs["cookiefile"].read() - old_cookie = RedisArchivist().get_message_str("cookie") + if self.config["downloads"]["cookie_import"]: + cookie_key = "cookie" + expire = False + else: + cookie_key = "cookie_temp" + expire = 60 * 30 # 30 min + + old_cookie = RedisArchivist().get_message_str(cookie_key) if new_cookie and old_cookie != new_cookie: - print("refreshed stored cookie") - RedisArchivist().set_message("cookie", new_cookie, save=True) + print(f"refreshed stored {cookie_key}") + RedisArchivist().set_message( + cookie_key, new_cookie, expire=expire, save=True + ) class CookieHandler: """handle youtube cookie for yt-dlp""" + COOKIE_EMPTY = "# Netscape HTTP Cookie File\n" + def __init__(self, config): self.cookie_io = False self.config = config - def get(self): + def get(self, message_str: str = "cookie"): """get cookie io stream""" - cookie = RedisArchivist().get_message_str("cookie") - self.cookie_io = StringIO(cookie) + cookie = RedisArchivist().get_message_str(message_str) + self.cookie_io = StringIO(cookie or self.COOKIE_EMPTY) return self.cookie_io def set_cookie(self, cookie):