Spaces:
Sleeping
Sleeping
File size: 3,249 Bytes
2c19cb5 147c80a 1c67333 147c80a 1c67333 6542b78 105e5dd 1c67333 105e5dd 1c67333 105e5dd 581993c 105e5dd 1c67333 105e5dd 410f6c0 105e5dd 410f6c0 105e5dd 1c67333 105e5dd 1c67333 105e5dd a6f5db7 410f6c0 581993c 410f6c0 2505d33 581993c 2505d33 105e5dd 410f6c0 105e5dd 410f6c0 147c80a 1c67333 410f6c0 105e5dd 419ec35 105e5dd 410f6c0 1c67333 6542b78 410f6c0 6542b78 105e5dd 410f6c0 105e5dd 1c67333 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
import os
import gradio as gr
import yt_dlp
from pydub import AudioSegment
import re
import subprocess
import time
if not os.path.exists("downloads"):
os.makedirs("downloads")
def sanitize_filename(filename):
"""Sanitize filenames to avoid special characters."""
return re.sub(r'[^a-zA-Z0-9_-]', '_', filename)
def process_youtube_or_audio(url, uploaded_audio, start_time, end_time):
try:
filename = None
song_name = None
print(f"URL: {url}") # Debug: Check URL input
print(f"Uploaded audio: {uploaded_audio}") # Debug: Check if audio is uploaded
print(f"Start time: {start_time}, End time: {end_time}") # Debug: Check times
# Process YouTube URL
if url:
print("Processing YouTube URL...")
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': 'downloads/%(id)s.%(ext)s',
'cookiefile': 'cookies.txt'
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=True)
filename = os.path.join('downloads', f"{info['id']}.webm")
song_name = sanitize_filename(info['title'])
# Process uploaded audio file
elif uploaded_audio:
print("Processing uploaded audio...")
filename = uploaded_audio.name # Using the uploaded file's name
song_name = "uploaded_audio"
if not filename or not os.path.exists(filename):
print(f"Error: No valid file found at {filename}") # Debug
return None, None
# Load audio and trim it
audio = AudioSegment.from_file(filename)
start_time_ms = start_time * 1000
end_time_ms = end_time * 1000
start_time_ms = max(0, min(start_time_ms, len(audio)))
end_time_ms = max(start_time_ms, min(end_time_ms, len(audio)))
trimmed_audio = audio[start_time_ms:end_time_ms]
# Export trimmed audio
mp3_filename = f"downloads/{song_name}.mp3"
trimmed_audio.export(mp3_filename, format="mp3")
# Convert to m4r format for iPhone
m4a_filename = f"downloads/{song_name}.m4a"
try:
subprocess.run([
'ffmpeg', '-i', mp3_filename, '-vn', '-acodec', 'aac', '-b:a', '192k', m4a_filename
], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=30, check=True)
except subprocess.TimeoutExpired:
print("Error: ffmpeg took too long to process the file.")
return None, None
except subprocess.CalledProcessError as e:
print(f"ffmpeg error: {e}")
return None, None
# Ensure the file exists before renaming
if os.path.exists(m4a_filename):
m4r_filename = f"downloads/{song_name}.m4r"
os.rename(m4a_filename, m4r_filename)
print(f"Files saved: {mp3_filename}, {m4r_filename}") # Debug
return os.path.abspath(mp3_filename), os.path.abspath(m4r_filename)
else:
print("Error: M4A file not created.")
return None, None
except Exception as e:
print(f"Error: {e}") # Debug: Print the error
return None, None
|