| import os |
| import tempfile |
| import socket |
| from yt_dlp import YoutubeDL |
| import gradio as gr |
|
|
| def is_internet_available(): |
| try: |
| socket.gethostbyname('www.youtube.com') |
| return True |
| except socket.error: |
| return False |
|
|
| def download_media(url, format_choice): |
| if not url.strip(): |
| raise gr.Error("β οΈ Please enter a valid YouTube or TikTok URL.") |
| if not is_internet_available(): |
| raise gr.Error("β No internet access detected. Please enable internet in your deployment environment.") |
|
|
| temp_dir = tempfile.mkdtemp() |
| |
| output_path = os.path.join(temp_dir, "%(title)s.%(ext)s") |
|
|
| |
| if format_choice == "Audio (MP3)": |
| ydl_opts = { |
| 'format': 'bestaudio/best', |
| 'outtmpl': output_path, |
| 'quiet': True, |
| 'no_warnings': True, |
| 'noplaylist': True, |
| 'postprocessors': [{ |
| 'key': 'FFmpegExtractAudio', |
| 'preferredcodec': 'mp3', |
| 'preferredquality': '192', |
| }], |
| 'socket_timeout': 15, |
| } |
| else: |
| ydl_opts = { |
| 'format': 'bestvideo+bestaudio/best', |
| 'outtmpl': output_path, |
| 'quiet': True, |
| 'no_warnings': True, |
| 'noplaylist': True, |
| 'merge_output_format': 'mp4', |
| 'socket_timeout': 15, |
| } |
|
|
| try: |
| with YoutubeDL(ydl_opts) as ydl: |
| info = ydl.extract_info(url, download=True) |
| downloaded_file = ydl.prepare_filename(info) |
|
|
| |
| if format_choice == "Audio (MP3)": |
| downloaded_file = os.path.splitext(downloaded_file)[0] + ".mp3" |
|
|
| if not os.path.exists(downloaded_file): |
| raise gr.Error("β Download failed. File not found.") |
|
|
| return downloaded_file |
|
|
| except Exception as e: |
| err = str(e) |
| if "Failed to extract" in err or "player response" in err: |
| raise gr.Error( |
| "β Extraction error β YouTube/TikTok may have changed.\n" |
| "Try updating yt-dlp using:\n\n`pip install -U yt-dlp`" |
| ) |
| else: |
| raise gr.Error(f"β Error: {err}") |
|
|
| demo = gr.Interface( |
| fn=download_media, |
| inputs=[ |
| gr.Textbox(label="π₯ Enter YouTube or TikTok URL"), |
| gr.Radio(["Audio (MP3)", "Video (MP4)"], label="Select format", value="Audio (MP3)") |
| ], |
| outputs=gr.File(label="π Downloaded File"), |
| title="π¬ Audio/Video Downloader", |
| description="Download audio (MP3) or video (MP4) from YouTube or TikTok by pasting a valid URL.", |
| theme="default" |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|