Add cookies support to yt_download.py for YouTube bot detection bypass

This commit is contained in:
Sebastjan Artič 2026-04-28 15:47:59 +00:00
parent 8e41bf21f6
commit 47509b4f06

View File

@ -6,13 +6,14 @@ Primer:
python3 yt_download.py "https://youtu.be/dQw4w9WgXcQ" /data/uploads/video.mp4 python3 yt_download.py "https://youtu.be/dQw4w9WgXcQ" /data/uploads/video.mp4
""" """
import argparse import argparse
import os
import subprocess import subprocess
import sys import sys
from pathlib import Path from pathlib import Path
import json import json
def download(url, output, max_height=1080, format_str=None): def download(url, output, max_height=1080, format_str=None, cookies_file=None):
""" """
Download YT video. Privzeto: best mp4 1080p z audiotrackom. Download YT video. Privzeto: best mp4 1080p z audiotrackom.
""" """
@ -30,8 +31,23 @@ def download(url, output, max_height=1080, format_str=None):
"--write-info-json", "--write-info-json",
"--restrict-filenames", "--restrict-filenames",
"-o", str(output), "-o", str(output),
url,
] ]
# Auto-detect cookies file če ni eksplicitno podan
if cookies_file is None:
for candidate in [
"/data/cookies/youtube.txt",
os.environ.get("YT_COOKIES_FILE", ""),
]:
if candidate and Path(candidate).exists():
cookies_file = candidate
break
if cookies_file and Path(cookies_file).exists():
cmd += ["--cookies", str(cookies_file)]
print(f"🍪 Using cookies: {cookies_file}", file=sys.stderr)
cmd.append(url)
print(f"⬇ Downloading {url}...", file=sys.stderr) print(f"⬇ Downloading {url}...", file=sys.stderr)
result = subprocess.run(cmd, capture_output=True, text=True) result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0: if result.returncode != 0:
@ -41,9 +57,17 @@ def download(url, output, max_height=1080, format_str=None):
return output return output
def get_info(url): def get_info(url, cookies_file=None):
"""Vrni metadata brez prenosa.""" """Vrni metadata brez prenosa."""
cmd = ["yt-dlp", "--dump-json", "--no-playlist", url] cmd = ["yt-dlp", "--dump-json", "--no-playlist"]
if cookies_file is None:
for candidate in ["/data/cookies/youtube.txt", os.environ.get("YT_COOKIES_FILE", "")]:
if candidate and Path(candidate).exists():
cookies_file = candidate
break
if cookies_file and Path(cookies_file).exists():
cmd += ["--cookies", str(cookies_file)]
cmd.append(url)
result = subprocess.run(cmd, capture_output=True, text=True) result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0: if result.returncode != 0:
return None return None
@ -55,12 +79,14 @@ def main():
ap.add_argument("url") ap.add_argument("url")
ap.add_argument("output") ap.add_argument("output")
ap.add_argument("--max-height", type=int, default=1080) ap.add_argument("--max-height", type=int, default=1080)
ap.add_argument("--cookies", default=None,
help="Pot do cookies.txt (Netscape format)")
ap.add_argument("--info-only", action="store_true", ap.add_argument("--info-only", action="store_true",
help="Samo metadata, brez prenosa") help="Samo metadata, brez prenosa")
args = ap.parse_args() args = ap.parse_args()
if args.info_only: if args.info_only:
info = get_info(args.url) info = get_info(args.url, cookies_file=args.cookies)
if info: if info:
print(json.dumps({ print(json.dumps({
"title": info.get("title"), "title": info.get("title"),
@ -73,7 +99,7 @@ def main():
sys.exit(1) sys.exit(1)
return return
download(args.url, args.output, max_height=args.max_height) download(args.url, args.output, max_height=args.max_height, cookies_file=args.cookies)
if __name__ == "__main__": if __name__ == "__main__":