Spaces:
Runtime error
Runtime error
File size: 7,669 Bytes
5657d70 561e61e 194ba2e 561e61e 194ba2e 561e61e 194ba2e 864798c 74a7283 194ba2e 561e61e 74a7283 194ba2e 74a7283 864798c 194ba2e 74a7283 864798c 561e61e 74a7283 194ba2e 74a7283 194ba2e 74a7283 194ba2e 561e61e 74a7283 194ba2e 74a7283 194ba2e 561e61e 194ba2e 561e61e 194ba2e 74a7283 194ba2e 50c9fe4 74a7283 50c9fe4 194ba2e 74a7283 194ba2e 50c9fe4 561e61e 194ba2e 50c9fe4 864798c 194ba2e 864798c 50c9fe4 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c 74a7283 864798c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
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
# """)
|