Spaces:
Build error
Build error
| import gradio as gr | |
| import yt_dlp | |
| import os | |
| import tempfile | |
| import base64 | |
| def download_and_merge(youtube_url): | |
| with tempfile.TemporaryDirectory() as temp_dir: | |
| ydl_opts = { | |
| 'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best', | |
| 'outtmpl': os.path.join(temp_dir, '%(title)s.%(ext)s'), | |
| 'merge_output_format': 'mp4', | |
| } | |
| try: | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| info = ydl.extract_info(youtube_url, download=True) | |
| filename = ydl.prepare_filename(info) | |
| final_filename = os.path.splitext(filename)[0] + '.mp4' | |
| if os.path.exists(final_filename): | |
| with open(final_filename, 'rb') as f: | |
| video_data = f.read() | |
| b64 = base64.b64encode(video_data).decode() | |
| return info['title'], b64 | |
| else: | |
| return info['title'], None | |
| except Exception as e: | |
| return str(e), None | |
| def extract_info(youtube_url): | |
| title, video_data = download_and_merge(youtube_url) | |
| if video_data: | |
| download_link = f'data:video/mp4;base64,{video_data}' | |
| return (f"제목: {title}\n\n다운로드가 준비되었습니다. '다운로드' 버튼을 클릭하세요.", | |
| download_link, | |
| gr.update(visible=True)) | |
| else: | |
| return f"오류 발생: {title}", None, gr.update(visible=False) | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## YouTube 다운로더") | |
| gr.Markdown("주의: 이 도구를 사용하여 저작권이 있는 콘텐츠를 무단으로 다운로드하는 것은 불법입니다.") | |
| youtube_url_input = gr.Textbox(label="YouTube URL 입력") | |
| extract_button = gr.Button("다운로드 준비") | |
| output = gr.Textbox(label="상태", lines=5) | |
| download_button = gr.Button("다운로드", visible=False) | |
| def on_download_click(url): | |
| return f'<script>var link = document.createElement("a"); link.href = "{url}"; link.download = "video.mp4"; document.body.appendChild(link); link.click(); document.body.removeChild(link);</script>' | |
| extract_button.click( | |
| fn=extract_info, | |
| inputs=youtube_url_input, | |
| outputs=[output, download_button, download_button] | |
| ) | |
| download_button.click( | |
| fn=on_download_click, | |
| inputs=download_button, | |
| outputs=gr.HTML() | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |