Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import yt_dlp | |
| import os | |
| # Streamlit μ λͺ© | |
| st.title('μ νλΈ μμ λ€μ΄λ‘λ') | |
| st.write("<br>", unsafe_allow_html=True) # 1μ€ λμ΄μ°κΈ° | |
| st.write("μ¬μ©λ°©λ²") | |
| st.write("<br>", unsafe_allow_html=True) # 1μ€ λμ΄μ°κΈ° | |
| st.write("1. λ€μ΄λ°μΌλ €λ μ νλΈ μμμ λ§ν¬λ₯Ό μ λ ₯ν΄μ£ΌμΈμ") | |
| st.write("2. λ§ν¬λ₯Ό μ λ ₯νκ³ νμΈλ²νΌμ λλ₯΄λ©΄ ν΄λΉ μμμ μΈλ€μΌμ΄ λ±μ₯ν©λλ€") | |
| st.write("3. μΈλ€μΌ λ°μ μ νλμ ν΅ν΄ ν΄μλμ μμ μ©λμ νμΈν ν μνλ ν΄μλλ₯Ό μ ννκ³ μΆμΆ λ²νΌμ λλ¬μ£ΌμΈμ") | |
| st.write("4. μ μ ν λ€μ΄λ°μΌλ €λ μμμ΄ λ°μ λ±μ₯νκ³ μ¬μνκ±°λ λ€μ΄λ‘λ λ°μ μ μμ΅λλ€ (μμμ μ©λμ΄ ν΄μλ‘ μΆμΆνλλ° μκ°μ΄ λ 걸립λλ€. 20λΆ μμ μΆμΆνλλ° 1λΆλ΄λ‘ μμ)") | |
| # μ μ λ‘λΆν° μ νλΈ λ§ν¬ μ λ ₯λ°κΈ° | |
| col1, col2 = st.columns([4, 1]) | |
| with col1: | |
| youtube_url = st.text_input('Enter YouTube video URL') | |
| def fetch_video_info(youtube_url): | |
| ydl_opts = { | |
| 'nocheckcertificate': True, | |
| 'cookiefile': 'cookies.txt' # μΏ ν€ νμΌ κ²½λ‘ | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| info_dict = ydl.extract_info(youtube_url, download=False) | |
| return info_dict | |
| def get_available_formats(info_dict): | |
| formats = {} | |
| for fmt in info_dict['formats']: | |
| if fmt.get('height') and fmt.get('ext') == 'mp4': | |
| filesize = fmt.get('filesize', 0) | |
| if filesize: | |
| filesize_mb = round(filesize / (1024 * 1024), 2) | |
| resolution = f"{fmt['height']}p" | |
| formats[resolution] = { | |
| 'id': fmt['format_id'], | |
| 'info': f"{resolution} - {filesize_mb} MB" | |
| } | |
| return formats | |
| def reset_session_state(): | |
| st.session_state.pop('info_dict', None) | |
| st.session_state.pop('thumbnail_url', None) | |
| st.session_state.pop('formats', None) | |
| st.session_state.pop('youtube_url', None) | |
| st.session_state.pop('confirmed', None) | |
| st.session_state.pop('selected_format_id', None) | |
| def delete_downloaded_video(): | |
| if os.path.exists('downloaded_video.mp4'): | |
| os.remove('downloaded_video.mp4') | |
| # "νμΈ" λ²νΌμ λλ₯΄λ©΄ μ²λ¦¬ν λ‘μ§ | |
| if st.button('νμΈ'): | |
| if youtube_url: | |
| try: | |
| # κΈ°μ‘΄ λ€μ΄λ‘λλ μμ μμ | |
| delete_downloaded_video() | |
| # μΈμ μν μ΄κΈ°ν λ° URL λ³κ²½ νμΈ | |
| if 'youtube_url' in st.session_state and st.session_state.youtube_url != youtube_url: | |
| reset_session_state() | |
| st.session_state.youtube_url = youtube_url | |
| info_dict = fetch_video_info(youtube_url) | |
| st.session_state.info_dict = info_dict | |
| st.session_state.thumbnail_url = info_dict.get('thumbnail') | |
| st.session_state.formats = get_available_formats(info_dict) | |
| st.session_state.confirmed = True | |
| except Exception as e: | |
| st.error(f"An error occurred: {e}") | |
| else: | |
| st.warning('Please enter a valid YouTube video URL') | |
| if 'confirmed' in st.session_state and st.session_state.confirmed: | |
| st.image(st.session_state.thumbnail_url, caption='Video Thumbnail', use_column_width=True) | |
| # ν΄μλ μ ν | |
| format_options = [value['info'] for value in st.session_state.formats.values()] | |
| format_selection = st.selectbox('Select resolution', format_options) | |
| # μ νλ ν΄μλμ format_id μ μ₯ | |
| st.session_state.selected_format_id = next( | |
| (value['id'] for key, value in st.session_state.formats.items() if value['info'] == format_selection), None | |
| ) | |
| def download_video(youtube_url, format_id): | |
| ydl_opts = { | |
| 'format': f"{format_id}+bestaudio/best", | |
| 'merge_output_format': 'mp4', | |
| 'outtmpl': 'downloaded_video.%(ext)s', | |
| 'nocache': True, # μΊμ λΉνμ±ν | |
| 'cookiefile': 'cookies.txt' # μΏ ν€ νμΌ κ²½λ‘ | |
| } | |
| with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
| ydl.download([youtube_url]) | |
| # "μΆμΆ" λ²νΌ μΆκ° | |
| if st.button('μΆμΆ'): | |
| format_id = st.session_state.selected_format_id | |
| if format_id is None: | |
| st.error('Selected format not found.') | |
| else: | |
| try: | |
| # μΈμ μνμ youtube_url μ¬μ© | |
| download_video(st.session_state.youtube_url, format_id) | |
| st.success('Video downloaded successfully!') | |
| st.video('downloaded_video.mp4') | |
| # λ€μ΄λ‘λλ νμΌ μ 곡 (optional) | |
| with open('downloaded_video.mp4', 'rb') as file: | |
| st.download_button( | |
| label="Download Video File", | |
| data=file, | |
| file_name='downloaded_video.mp4', | |
| mime='video/mp4' | |
| ) | |
| # μΆμΆλ μμ μ 보 μΆλ ₯ | |
| st.write(f"**μ λͺ©:** {st.session_state.info_dict['title']}") | |
| st.write(f"**μ±λλͺ :** {st.session_state.info_dict['uploader']}") | |
| st.write(f"**μ λ‘λ λ μ§:** {st.session_state.info_dict['upload_date']}") | |
| # λ€μ΄λ‘λ ν μΈμ μν 리μ | |
| reset_session_state() | |
| except Exception as e: | |
| st.error(f"An error occurred during download: {e}") |