Files
youtube-app/backend/services/download_service.py
2026-04-05 12:25:41 +02:00

59 lines
1.5 KiB
Python

import subprocess
from database import SessionLocal
from services.video_service import get_video, update_file_path
VIDEOS_DIR = "/videos"
def download_video(video_id: int, youtube_url: str):
output_path = f"{VIDEOS_DIR}/{video_id}.mp4"
subprocess.run(
[
"yt-dlp",
"-f", "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]",
"-o", output_path,
"--merge-output-format", "mp4",
youtube_url,
],
check=True,
)
db = SessionLocal()
try:
update_file_path(db, video_id, output_path)
finally:
db.close()
def stream_video_live(youtube_url: str):
result = subprocess.run(
[
"yt-dlp",
"-f", "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best",
"-g", youtube_url,
],
capture_output=True, text=True, check=True,
)
urls = result.stdout.strip().split("\n")
cmd = ["ffmpeg"]
for url in urls:
cmd.extend(["-i", url])
cmd.extend(["-c", "copy", "-movflags", "frag_keyframe+empty_moov", "-f", "mp4", "pipe:1"])
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
try:
while True:
chunk = process.stdout.read(1024 * 1024)
if not chunk:
break
yield chunk
process.wait()
except GeneratorExit:
process.kill()
finally:
if process.poll() is None:
process.kill()