import subprocess import threading from pathlib import Path from database.database import SessionLocal from model.video import Video VIDEOS_DIR = "/videos" MIN_VALID_SIZE = 1024 * 100 # 100 KB def downloadAsync(videoId: int, youtubeUrl: str, maxHeight: int = 1080): threading.Thread(target=downloadVideo, args=(videoId, youtubeUrl, maxHeight)).start() def downloadVideo(videoId: int, youtubeUrl: str, maxHeight: int = 1080): outputPath = f"{VIDEOS_DIR}/{videoId}.mp4" formatFilter = f"bestvideo[ext=mp4][vcodec^=avc][height<={maxHeight}]+bestaudio[ext=m4a]/best[ext=mp4]" subprocess.run( [ "yt-dlp", "--cookies", "/app/cookies.txt", "--remote-components", "ejs:github", "-f", formatFilter, "-o", outputPath, "--merge-output-format", "mp4", "--force-overwrites", "--no-continue", youtubeUrl, ], check=True, ) path = Path(outputPath) if not path.exists() or path.stat().st_size < MIN_VALID_SIZE: return db = SessionLocal() try: Video.updateFilePath(db, videoId, outputPath) finally: db.close()