Spaces:
Running
on
Zero
Running
on
Zero
File size: 6,905 Bytes
c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf c3eda24 c1683bf |
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
import os
import re
import validators
import yt_dlp
import requests
import shutil
try:
import gdown
except ImportError:
os.system('pip install gdown')
import gdown
try:
from google.colab import drive
except ImportError:
drive = None
from helpers import INPUT_DIR, COOKIE_PATH, clear_directory, clear_temp_folder, BASE_DIR
import yaml
from assets.i18n.i18n import I18nAuto
i18n = I18nAuto()
def sanitize_filename(filename):
sanitized = re.sub(r'[^a-zA-Z0-9_-]', '_', filename)
sanitized = re.sub(r'_+', '_', sanitized)
sanitized = sanitized.strip('_')
return sanitized
def download_callback(url, download_type='direct', cookie_file=None):
# Clear temporary and input directories
clear_temp_folder("/tmp", exclude_items=["gradio", "config.json"])
clear_directory(INPUT_DIR)
os.makedirs(INPUT_DIR, exist_ok=True)
# Validate URL
if not url or not isinstance(url, str) or not (url.startswith('http://') or url.startswith('https://')):
return None, i18n("invalid_url"), None, None, None, None
# Load cookie file
if cookie_file is not None:
try:
with open(cookie_file.name, "rb") as f:
cookie_content = f.read()
with open(COOKIE_PATH, "wb") as f:
f.write(cookie_content)
print(i18n("cookie_file_updated"))
except Exception as e:
print(i18n("cookie_installation_error").format(str(e)))
wav_path = None
download_success = False
drive_mounted = False
# Mount Google Drive (optional)
if drive is not None:
try:
drive.mount('/content/drive', force_remount=True)
drive_mounted = True
except Exception as e:
print(i18n("google_drive_mount_error").format(str(e)))
print(i18n("continuing_without_google_drive"))
# 1. Direct file links
if any(url.endswith(ext) for ext in ['.wav', '.mp3', '.m4a', '.ogg', '.flac']):
try:
file_name = os.path.basename(url.split('?')[0])
sanitized_base_name = sanitize_filename(os.path.splitext(file_name)[0])
output_path = os.path.join(INPUT_DIR, f"{sanitized_base_name}{os.path.splitext(file_name)[1]}")
response = requests.get(url, stream=True)
if response.status_code == 200:
with open(output_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
if not file_name.endswith('.wav'):
wav_output = os.path.splitext(output_path)[0] + '.wav'
os.system(f'ffmpeg -i "{output_path}" -acodec pcm_s16le -ar 44100 "{wav_output}"')
if os.path.exists(wav_output):
os.remove(output_path)
output_path = wav_output
if os.path.exists(output_path) and os.path.getsize(output_path) > 0:
wav_path = output_path
download_success = True
else:
raise Exception(i18n("file_size_zero_error"))
else:
raise Exception(i18n("direct_download_failed"))
except Exception as e:
error_msg = i18n("direct_download_error").format(str(e))
print(error_msg)
return None, error_msg, None, None, None, None
# 2. Google Drive links
elif 'drive.google.com' in url:
try:
file_id = re.search(r'/d/([^/]+)', url) or re.search(r'id=([^&]+)', url)
if not file_id:
raise ValueError(i18n("invalid_google_drive_url"))
file_id = file_id.group(1)
output_path = os.path.join(INPUT_DIR, "drive_download.wav")
gdown.download(f'https://drive.google.com/uc?id={file_id}', output_path, quiet=True)
if os.path.exists(output_path) and os.path.getsize(output_path) > 0:
sanitized_base_name = sanitize_filename("drive_download")
sanitized_output_path = os.path.join(INPUT_DIR, f"{sanitized_base_name}.wav")
os.rename(output_path, sanitized_output_path)
wav_path = sanitized_output_path
download_success = True
else:
raise Exception(i18n("file_size_zero_error"))
except Exception as e:
error_msg = i18n("google_drive_error").format(str(e))
print(error_msg)
return None, error_msg, None, None, None, None
# 3. YouTube and other media links
else:
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': os.path.join(INPUT_DIR, '%(title)s.%(ext)s'),
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'wav',
'preferredquality': '0'
}],
'cookiefile': COOKIE_PATH if os.path.exists(COOKIE_PATH) else None,
'nocheckcertificate': True,
'ignoreerrors': True,
'retries': 3
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info_dict = ydl.extract_info(url, download=True)
temp_path = ydl.prepare_filename(info_dict)
base_name = os.path.splitext(os.path.basename(temp_path))[0]
sanitized_base_name = sanitize_filename(base_name)
wav_path = os.path.join(INPUT_DIR, f"{sanitized_base_name}.wav")
temp_wav = os.path.splitext(temp_path)[0] + '.wav'
if os.path.exists(temp_wav):
os.rename(temp_wav, wav_path)
download_success = True
else:
raise Exception(i18n("wav_conversion_failed"))
except Exception as e:
error_msg = i18n("download_error").format(str(e))
print(error_msg)
return None, error_msg, None, None, None, None
# Post-download processing
if download_success and wav_path:
for f in os.listdir(INPUT_DIR):
if f != os.path.basename(wav_path):
os.remove(os.path.join(INPUT_DIR, f))
if drive_mounted:
try:
drive_path = os.path.join('/content/drive/My Drive', os.path.basename(wav_path))
shutil.copy(wav_path, drive_path)
print(i18n("file_copied_to_drive").format(drive_path))
except Exception as e:
print(i18n("copy_to_drive_error").format(str(e)))
else:
print(i18n("skipping_drive_copy_no_mount"))
return (
wav_path,
i18n("download_success"),
wav_path,
wav_path,
wav_path,
wav_path
)
return None, i18n("download_failed"), None, None, None, None
|