import streamlit as st import yt_dlp import os from pathlib import Path # Set page config st.set_page_config(page_title="YouTube Video Downloader", page_icon="đŸ“ē") # Set the title of the app st.title("YouTube Video Downloader đŸ“ē") # Create output directory if it doesn't exist output_dir = Path("downloads") output_dir.mkdir(exist_ok=True) # Input field for YouTube video URL video_url = st.text_input("Enter YouTube Video URL:", placeholder="https://www.youtube.com/watch?v=...") # Function to download video def download_video(url): try: ydl_opts = { 'format': 'bestvideo+bestaudio/best', 'outtmpl': str(output_dir / '%(title)s.%(ext)s'), 'merge_output_format': 'webm', # Add these options to mimic browser behavior 'quiet': True, 'no_warnings': True, 'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'referer': 'https://www.youtube.com/', 'cookiefile': 'youtube.com_cookies.txt', # ėŋ í‚¤ 파ėŧ ė‚ŦėšŠ 'socket_timeout': 30, 'http_chunk_size': 10485760, # 10MB } # Progress placeholder progress_bar = st.progress(0) status_text = st.empty() def progress_hook(d): if d['status'] == 'downloading': try: progress = d['downloaded_bytes'] / d['total_bytes'] progress_bar.progress(progress) status_text.text(f"Downloading: {progress:.1%}") except: status_text.text("Downloading... (size unknown)") elif d['status'] == 'finished': progress_bar.progress(1.0) status_text.text("Processing...") ydl_opts['progress_hooks'] = [progress_hook] with yt_dlp.YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(url, download=True) filename = ydl.prepare_filename(info) return filename except Exception as e: st.error(f"An error occurred: {str(e)}") return None # Download button if st.button("Download"): if video_url: try: with st.spinner("Preparing download..."): downloaded_file_path = download_video(video_url) if downloaded_file_path and os.path.exists(downloaded_file_path): with open(downloaded_file_path, 'rb') as file: st.download_button( label="Click here to download", data=file, file_name=os.path.basename(downloaded_file_path), mime="application/octet-stream" ) st.success("✅ Download ready!") else: st.error("❌ Download failed. Please try again.") except Exception as e: st.error(f"❌ An error occurred: {str(e)}") else: st.warning("⚠ī¸ Please enter a valid YouTube URL.") # Help section with st.expander("ℹī¸ Help & Troubleshooting"): st.markdown(""" **If you're experiencing download issues:** 1. Cookie Authentication Method: - Install a browser extension like "Get cookies.txt" - Visit YouTube and ensure you're logged in - Export cookies to 'youtube.com_cookies.txt' - Place the file in the same directory as this app 2. Alternative Solutions: - Try different videos - Check if the video is public/not age-restricted - Try again later if YouTube is blocking requests """) # import streamlit as st # import yt_dlp # import os # from pathlib import Path # # Set page config # st.set_page_config(page_title="YouTube Video Downloader", page_icon="đŸ“ē") # # Set the title of the app # st.title("YouTube Video Downloader đŸ“ē") # # Create output directory if it doesn't exist # output_dir = Path("downloads") # output_dir.mkdir(exist_ok=True) # # Check if cookies file exists # COOKIES_FILE = 'youtube.com_cookies.txt' # has_cookies = os.path.exists(COOKIES_FILE) # if has_cookies: # st.success("✅ Cookie file detected") # else: # st.warning("⚠ī¸ No cookie file found - Some videos might be restricted") # # Input field for YouTube video URL # video_url = st.text_input("Enter YouTube Video URL:", placeholder="https://www.youtube.com/watch?v=...") # def download_video(url): # try: # ydl_opts = { # 'format': 'bestvideo+bestaudio/best', # 'outtmpl': str(output_dir / '%(title)s.%(ext)s'), # 'merge_output_format': 'webm', # 'quiet': True, # 'no_warnings': True, # 'user_agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', # 'referer': 'https://www.youtube.com/', # 'http_chunk_size': 10485760 # } # # Add cookies file if available # if has_cookies: # ydl_opts['cookiefile'] = COOKIES_FILE # # Progress placeholder # progress_bar = st.progress(0) # status_text = st.empty() # def progress_hook(d): # if d['status'] == 'downloading': # try: # progress = d['downloaded_bytes'] / d['total_bytes'] # progress_bar.progress(progress) # status_text.text(f"Downloading: {progress:.1%}") # except: # status_text.text("Downloading... (size unknown)") # elif d['status'] == 'finished': # progress_bar.progress(1.0) # status_text.text("Processing...") # ydl_opts['progress_hooks'] = [progress_hook] # with yt_dlp.YoutubeDL(ydl_opts) as ydl: # info = ydl.extract_info(url, download=True) # filename = ydl.prepare_filename(info) # return filename # except Exception as e: # st.error(f"An error occurred: {str(e)}") # return None # # Download button # if st.button("Download"): # if video_url: # try: # with st.spinner("Preparing download..."): # downloaded_file_path = download_video(video_url) # if downloaded_file_path and os.path.exists(downloaded_file_path): # with open(downloaded_file_path, 'rb') as file: # st.download_button( # label="Click here to download", # data=file, # file_name=os.path.basename(downloaded_file_path), # mime="application/octet-stream" # ) # st.success("✅ Download ready!") # else: # st.error("❌ Download failed. Please try again.") # except Exception as e: # st.error(f"❌ An error occurred: {str(e)}") # else: # st.warning("⚠ī¸ Please enter a valid YouTube URL.") # # Help section # with st.expander("ℹī¸ Help & Information"): # st.markdown(""" # **About Cookie Authentication:** # - This app uses cookie authentication to bypass YouTube's bot detection # - Cookies help the app behave like a logged-in browser # - No personal data is stored or transmitted # **If downloads fail:** # 1. Check if the video is public # 2. Verify the URL is correct # 3. Try a different video # 4. Try again later if YouTube is blocking requests # """)