Spaces:
Runtime error
Runtime error
import gradio as gr | |
import os | |
import yt_dlp | |
def downloader(video_url, audio_format, audio_name=None): | |
# Ensure the directory exists | |
os.makedirs('audios', exist_ok=True) | |
# Use a temporary placeholder for the output file | |
if audio_name: | |
temp_output_path = f"audios/{audio_name}.%(ext)s" | |
else: | |
temp_output_path = f"audios/%(title)s.%(ext)s" | |
ydl_opts = { | |
'format': 'bestaudio/best', | |
'postprocessors': [{ | |
'key': 'FFmpegExtractAudio', | |
'preferredcodec': audio_format, | |
}], | |
'outtmpl': temp_output_path, | |
} | |
with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
ydl.download([video_url]) | |
# Find the downloaded file and rename it if audio_name is provided | |
if audio_name: | |
temp_file = temp_output_path.replace('%(ext)s', audio_format) | |
final_output_path = f"audios/{audio_name}.{audio_format}" | |
os.rename(temp_file, final_output_path) | |
else: | |
final_output_path = None | |
# Since the file is already named by title, find it by the pattern | |
for file in os.listdir('audios'): | |
if file.endswith(f".{audio_format}"): | |
final_output_path = os.path.join('audios', file) | |
break | |
return final_output_path | |
# Example usage: | |
# downloader('https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'mp3', 'my_audio') | |
# downloader('https://www.youtube.com/watch?v=dQw4w9WgXcQ', 'mp3') | |
logschart = """ | |
### Changelog: | |
#### 2.0 - 2024-05-16 | |
##### Added | |
- **change webui**: change the old webui to new version! | |
- **Directory Check**: Added a check to ensure the `audios` directory exists before attempting to save files to it. | |
- `os.makedirs('audios', exist_ok=True)` | |
##### Changed | |
- **Output Template Placeholder**: Updated `outtmpl` to use a temporary placeholder for the file extension. | |
- `outtmpl: f"audios/{audio_name}.%(ext)s"` | |
- **File Renaming**: Added logic to rename the temporary output file to the final desired name and extension. | |
- `temp_file = temp_output_path.replace('%(ext)s', audio_format)` | |
- `final_output_path = f"audios/{audio_name}.{audio_format}` | |
- `os.rename(temp_file, final_output_path)` | |
- **Return Correct Path**: The `downloader` function now returns the final output path to ensure Gradio can find and load the audio file correctly. | |
- `return final_output_path` | |
##### Fixed | |
- **File Not Found Error**: Resolved the issue where the file could not be found due to incorrect output path handling. | |
### Summary of Changes | |
1. **Ensured Directory Exists**: Added code to create the `audios` directory if it doesn't exist to prevent file saving errors. | |
2. **Output Path Handling**: Modified the output template to use a placeholder for the file extension, which yt-dlp will replace with the actual extension upon downloading. | |
3. **File Renaming Logic**: After downloading the audio, the code now renames the file to match the desired audio name and format. | |
4. **Correct File Path Return**: The correct file path is now returned from the `downloader` function, ensuring that the Gradio `gr.Audio` component can properly display and play the downloaded audio file. | |
These changes collectively ensure that the audio file is downloaded correctly, renamed appropriately, and made accessible to the Gradio interface for playback. | |
""" | |
with gr.Blocks() as demo: | |
gr.Markdown("# YouTube Downloader 2.0") | |
with gr.Row(): | |
video_url = gr.Textbox(label="YouTube video link") | |
with gr.Row(): | |
audio_name = gr.Textbox(label="Audio name of YouTube audio", info="this is optional") | |
audio_format = gr.Radio(["wav", "flac", "mp3"], label="Select the output format", value=" wav") | |
with gr.Row(): | |
output = gr.Audio(label="Output") | |
with gr.Row(): | |
download_button = gr.Button("Download") | |
download_button.click(downloader, inputs=[video_url, audio_format, audio_name], outputs=output) | |
with gr.Group(): | |
with gr.Row(): | |
gr.Markdown("Welcome :)") | |
gr.Markdown(logschart) | |
demo.launch() | |