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