|
import argparse |
|
import gc |
|
import hashlib |
|
import json |
|
import os |
|
import shlex |
|
import subprocess |
|
from contextlib import suppress |
|
from urllib.parse import urlparse, parse_qs |
|
|
|
import gradio as gr |
|
import librosa |
|
import numpy as np |
|
import soundfile as sf |
|
import sox |
|
import yt_dlp |
|
from pedalboard import Pedalboard, Reverb, Compressor, HighpassFilter |
|
from pedalboard.io import AudioFile |
|
from pydub import AudioSegment |
|
|
|
|
|
output_dir = os.path.join(BASE_DIR, 'song_output') |
|
|
|
|
|
def get_youtube_video_id(url, ignore_playlist=True): |
|
""" |
|
Examples: |
|
http://youtu.be/SA2iWivDJiE |
|
http://www.youtube.com/watch?v=_oPAwA_Udwc&feature=feedu |
|
http://www.youtube.com/embed/SA2iWivDJiE |
|
http://www.youtube.com/v/SA2iWivDJiE?version=3&hl=en_US |
|
""" |
|
query = urlparse(url) |
|
if query.hostname == 'youtu.be': |
|
if query.path[1:] == 'watch': |
|
return query.query[2:] |
|
return query.path[1:] |
|
|
|
if query.hostname in {'www.youtube.com', 'youtube.com', 'music.youtube.com'}: |
|
if not ignore_playlist: |
|
|
|
with suppress(KeyError): |
|
return parse_qs(query.query)['list'][0] |
|
if query.path == '/watch': |
|
return parse_qs(query.query)['v'][0] |
|
if query.path[:7] == '/watch/': |
|
return query.path.split('/')[1] |
|
if query.path[:7] == '/embed/': |
|
return query.path.split('/')[2] |
|
if query.path[:3] == '/v/': |
|
return query.path.split('/')[2] |
|
|
|
|
|
return None |
|
|
|
|
|
def yt_download(link): |
|
ydl_opts = { |
|
'format': 'bestaudio', |
|
'outtmpl': '%(title)s', |
|
'nocheckcertificate': True, |
|
'ignoreerrors': True, |
|
'no_warnings': True, |
|
'quiet': True, |
|
'extractaudio': True, |
|
'postprocessors': [{'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3'}], |
|
} |
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl: |
|
result = ydl.extract_info(link, download=True) |
|
download_path = ydl.prepare_filename(result, outtmpl='%(title)s.mp3') |
|
|
|
return download_path |
|
|
|
|
|
def raise_exception(error_msg, is_webui): |
|
if is_webui: |
|
raise gr.Error(error_msg) |
|
else: |
|
raise Exception(error_msg) |
|
|
|
|
|
|
|
with gr.Blocks(theme=gr.themes.Soft() as app: |
|
gr.HTML("<h1> youtube downloader </h1>") |
|
|
|
show_yt_link_button = gr.Button('Paste YouTube link/Path to local file instead') |
|
song_input_file.upload(process_file_upload, inputs=[song_input_file], outputs=[local_file, song_input]) |
|
|
|
|
|
download_path = gr.Audio(label='download_path', show_share_button=False) |
|
|
|
|