44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
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()
|