Spaces:
Running
Running
from pathlib import Path | |
import yt_dlp | |
import tempfile | |
import streamlit as st | |
from video_processor import VideoProcessor | |
from audio_processor import AudioProcessor | |
import re | |
import os | |
class LinkDownloader: | |
def __init__(self, output_dir): | |
self.output_dir = Path(output_dir) | |
self.output_dir.mkdir(parents=True, exist_ok=True) | |
def sanitize_filename(self, title): | |
"""Sanitize filename by removing special characters and limiting length""" | |
# Replace special characters with underscore | |
clean_name = re.sub(r'[^a-zA-Z0-9.]', '_', title) | |
# Limit length | |
if len(clean_name) > 50: | |
clean_name = clean_name[:50] | |
return clean_name | |
def download_from_url(self, url): | |
"""Download video from URL using yt-dlp""" | |
try: | |
# Create a temporary filename template | |
temp_filename = 'downloaded_video.%(ext)s' | |
temp_filepath = str(self.output_dir / temp_filename) | |
# Configure yt-dlp options | |
ydl_opts = { | |
'format': 'best', | |
'outtmpl': temp_filepath, | |
'quiet': False, # Enable output for debugging | |
'no_warnings': False, | |
'extract_audio': False, | |
} | |
st.info("Starting video download...") | |
print(f"Download directory: {self.output_dir}") | |
print(f"Download template: {temp_filepath}") | |
# Download the video | |
with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
# Extract info first | |
info = ydl.extract_info(url, download=False) | |
# Get the actual extension | |
ext = info.get('ext', 'mp4') | |
# Download the video | |
ydl.download([url]) | |
# Construct the actual file path | |
actual_filepath = str(self.output_dir / f"downloaded_video.{ext}") | |
print(f"Expected downloaded file: {actual_filepath}") | |
# Verify file exists | |
if not os.path.exists(actual_filepath): | |
print(f"Files in directory: {os.listdir(self.output_dir)}") | |
raise FileNotFoundError(f"Downloaded file not found at {actual_filepath}") | |
print(f"File size: {os.path.getsize(actual_filepath)} bytes") | |
return actual_filepath | |
except Exception as e: | |
st.error(f"Error during download: {str(e)}") | |
print(f"Download error details: {str(e)}") | |
return None |