From 1a54f10ea2b0e155ba311eb0144f786ce7f1d62b Mon Sep 17 00:00:00 2001 From: vrubelroman Date: Tue, 16 Dec 2025 10:15:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=BA=D1=83=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=8E?= =?UTF-8?q?=D1=82=D1=83=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- youtube-downloader/app.py | 22 ++++++-- youtube-downloader/docker-compose.yml | 3 ++ youtube-downloader/get_youtube_cookies.sh | 64 +++++++++++++++++++++++ youtube-downloader/youtube_cookies.txt | 60 +++++++++++++++++++++ 4 files changed, 146 insertions(+), 3 deletions(-) create mode 100755 youtube-downloader/get_youtube_cookies.sh create mode 100644 youtube-downloader/youtube_cookies.txt diff --git a/youtube-downloader/app.py b/youtube-downloader/app.py index 1ad1a37..d8136fe 100644 --- a/youtube-downloader/app.py +++ b/youtube-downloader/app.py @@ -33,13 +33,20 @@ def _safe_filename(title: str) -> str: def download_youtube_video(url: str, max_retries: int = 3) -> Path: - """Скачивает видео с YouTube""" + """Скачивает видео с YouTube - используем cookies для обхода блокировок""" + cookies_file = os.getenv('YOUTUBE_COOKIES_FILE', 'youtube_cookies.txt') + cookies_file_path = Path(cookies_file) + + if not cookies_file_path.exists(): + logger.info(f"YouTube: файл cookies не найден ({cookies_file_path}). Работаем без cookies. " + f"Для лучшей работы рекомендуется добавить cookies через скрипт get_youtube_cookies_local.sh") + 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' last_error = None for attempt in range(max_retries): try: - # Получаем информацию о видео + # Базовые настройки для получения информации ydl_opts_info = { 'quiet': False, 'no_warnings': False, @@ -60,12 +67,17 @@ def download_youtube_video(url: str, max_retries: int = 3) -> Path: }, } + # Если есть файл с cookies, используем его + if cookies_file_path.exists(): + ydl_opts_info['cookiefile'] = str(cookies_file_path.absolute()) + logger.info(f"YouTube: используем cookies из {cookies_file_path}") + with yt_dlp.YoutubeDL(ydl_opts_info) as ydl: info = ydl.extract_info(url, download=False) video_title = info.get('title', 'video') logger.info(f"YouTube: получена информация о видео: {video_title}") - # Скачиваем видео + # Настройки для скачивания ydl_opts_download = { 'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best', 'outtmpl': _safe_filename(video_title), @@ -88,6 +100,10 @@ def download_youtube_video(url: str, max_retries: int = 3) -> Path: }, } + # Если есть файл с cookies, используем его для скачивания + if cookies_file_path.exists(): + ydl_opts_download['cookiefile'] = str(cookies_file_path.absolute()) + logger.info(f"YouTube: начинаем скачивание (попытка {attempt + 1}/{max_retries})") with yt_dlp.YoutubeDL(ydl_opts_download) as ydl: ydl.download([url]) diff --git a/youtube-downloader/docker-compose.yml b/youtube-downloader/docker-compose.yml index 11cdb8a..8136df6 100644 --- a/youtube-downloader/docker-compose.yml +++ b/youtube-downloader/docker-compose.yml @@ -7,6 +7,9 @@ services: - "5557:5000" volumes: - ./downloads:/app/downloads + - ./youtube_cookies.txt:/app/youtube_cookies.txt:ro + environment: + - YOUTUBE_COOKIES_FILE=/app/youtube_cookies.txt networks: - downloader_network diff --git a/youtube-downloader/get_youtube_cookies.sh b/youtube-downloader/get_youtube_cookies.sh new file mode 100755 index 0000000..7dab895 --- /dev/null +++ b/youtube-downloader/get_youtube_cookies.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# Скрипт для получения cookies YouTube через yt-dlp + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +COOKIES_FILE="$SCRIPT_DIR/youtube_cookies.txt" + +echo "Получение cookies YouTube из браузера..." +echo "" +echo "Выберите браузер:" +echo "1) Chrome" +echo "2) Firefox" +echo "3) Edge" +echo "4) Opera" +read -p "Введите номер (1-4): " browser + +case "$browser" in + 1) BROWSER="chrome" ;; + 2) BROWSER="firefox" ;; + 3) BROWSER="edge" ;; + 4) BROWSER="opera" ;; + *) + echo "Неверный выбор" + exit 1 + ;; +esac + +echo "Получаю cookies из $BROWSER..." +echo "Файл cookies будет сохранен в: $COOKIES_FILE" + +# Проверяем наличие yt-dlp +if ! command -v yt-dlp &> /dev/null; then + echo "" + echo "❌ yt-dlp не найден в системе" + echo "" + echo "Установите yt-dlp одним из способов:" + echo "" + echo "1. Через pacman (Arch Linux):" + echo " sudo pacman -S yt-dlp" + echo "" + echo "2. Через pip:" + echo " pip install yt-dlp" + echo " или" + echo " pip3 install yt-dlp" + echo "" + echo "3. Через pipx (рекомендуется):" + echo " pipx install yt-dlp" + echo "" + exit 1 +fi + +yt-dlp --cookies-from-browser "$BROWSER" --cookies "$COOKIES_FILE" --no-download https://www.youtube.com 2>&1 | head -10 + +if [ -f "$COOKIES_FILE" ]; then + echo "" + echo "✅ Cookies успешно сохранены в $COOKIES_FILE" + echo "" + echo "Теперь перезапустите youtube-downloader:" + echo " docker compose -f youtube-downloader/docker-compose.yml restart" +else + echo "" + echo "❌ Ошибка: файл cookies не был создан" + exit 1 +fi + diff --git a/youtube-downloader/youtube_cookies.txt b/youtube-downloader/youtube_cookies.txt new file mode 100644 index 0000000..a17063c --- /dev/null +++ b/youtube-downloader/youtube_cookies.txt @@ -0,0 +1,60 @@ +# Netscape HTTP Cookie File +# This file is generated by yt-dlp. Do not edit. + +.mozilla.org TRUE / FALSE 1800428098 _ga GA1.2.1059148659.1765868099 +.mozilla.org TRUE / FALSE 1765954498 _gid GA1.2.11181365.1765868099 +.mozilla.org TRUE / FALSE 1800428141 _ga_B9CY1C9VBC GS2.1.s1765868098$o1$g1$t1765868141$j17$l0$h0 +accounts.google.com FALSE / TRUE 1800428289 __Host-GAPS 1:GX0qJvjoq2VkhwLgwUwQRh8K_9lJb9X9xS3Q2X9TEwsVcJKsZcCGnc09WOwhkTEL5bQ_YHHHKRENpHmhJGtp2DXRlvrPMw:NAkI88McEhpj3Om9 +accounts.google.com FALSE / TRUE 1768460204 OTZ 8392737_44_44_123780_40_436260 +accounts.google.com FALSE / TRUE 1800428289 SMSV ADHTe-BOGIHUbWLb1xV5SpJkrD0OCZc9SUg1l1NlpSwrkbzF00NI0BoL76tO03_6oJfLajEH9Adz6GZIx3rk7QoYj-JkjDpU22O1L0NeNgK3h8QsvJuvUQU +accounts.google.com FALSE / TRUE 1800428290 LSID s.LT|s.youtube:g.a0004ghwIKs78n_bzjNLimJc5UnPtzUZAErv7oCTp8eMNt6AMHT-IdnwRSfLnmWJck4e1A-6rAACgYKARYSARISFQHGX2Mi7db2XkoUfWS8om91k9BO1hoVAUF8yKojQvIzUVhwYlMvTnjfVVEH0076 +accounts.google.com FALSE / TRUE 1800428290 __Host-1PLSID s.LT|s.youtube:g.a0004ghwIKs78n_bzjNLimJc5UnPtzUZAErv7oCTp8eMNt6AMHT-bXgp_W22J-vPmt6T3lC1-QACgYKAeMSARISFQHGX2Miw_L35bRMCXD_HRN9fwjaCxoVAUF8yKqg07rxnDQ-2lp9SYn2U2Lp0076 +accounts.google.com FALSE / TRUE 1800428290 __Host-3PLSID s.LT|s.youtube:g.a0004ghwIKs78n_bzjNLimJc5UnPtzUZAErv7oCTp8eMNt6AMHT-b33hWDK6ysBTIcKEVLaauAACgYKAWgSARISFQHGX2Miy9lM1s2rgeyuCPBaGjM2DRoVAUF8yKq29xDX-ZE8pK94lqiTDrCz0076 +accounts.google.com FALSE / TRUE 1800428290 ACCOUNT_CHOOSER AFx_qI6WkAmGmm4dPb-ykKfNUDjVwjTrq5YnImstK6Fk403UQDFdTCY657rWXrkF8DHKhc0C4x6pCZMks_iTKDeOp1toPo8995bCmo4lhTqrW_TGbsO4yrUy1HpHnzN1O7SqltBG1Evx0YyL91gDZezVKZrT9A4kRA +.youtube.com TRUE / TRUE 1799996174 SOCS CAISEwgDEgk4NDQ0OTQ3NTUaAmVuIAEaBgiAwoLKBg +.youtube.com TRUE / TRUE 1781420173 __Secure-YNID 14.YT=e1-nN08hCOTsPq2pxw3tysfAavEyLrarb18Z0HTcRJG0dLSXSyNc4kkr7KXdnzWgUM5b0KUXkYr_kkgR_XcL7t4MD2DNIszNyKkvwyphMz44mQyir5tQegoENcDb0GV75KE2lQ0kbZjdA8_NVI9T8Q4Hy4m1PCF1woGqNmSY21TOsnAS8fZjwEiX9use4ySPY3xlCvEl_cjCO9cJwtAM01XGws7rn1hQcODU2-VhEod4w5KdGTbgJrKC8cDRr7WEFw-C_yoeKoQEE4pCzCC-CGq7M0AfZvihjLRZIlLZmJka8c5XYaJXzv9LlN5bmBvPr7KxXXXjD8Tdq0l_2jmzBA +.youtube.com TRUE / TRUE 1765869974 GPS 1 +.youtube.com TRUE / TRUE 1781420174 __Secure-ROLLOUT_TOKEN CPaYy5K_jL2M2wEQ2tfiycPBkQMYiLH4ycPBkQM%3D +.youtube.com TRUE / TRUE 1797404290 __Secure-1PSIDTS sidts-CjQBflaCdY9P2hx09guHFh9JeFinZ8q9ziOhCHTS0Cv5t0JxOzfSyLDmlEiOl8mQgnEEtHg2EAA +.youtube.com TRUE / TRUE 1797404290 __Secure-3PSIDTS sidts-CjQBflaCdY9P2hx09guHFh9JeFinZ8q9ziOhCHTS0Cv5t0JxOzfSyLDmlEiOl8mQgnEEtHg2EAA +.youtube.com TRUE / FALSE 1800428290 HSID AViy3sAm-kAkV5yxA +.youtube.com TRUE / TRUE 1800428290 SSID A48-JbqJWpI4sRMiJ +.youtube.com TRUE / FALSE 1800428290 APISID nD084UIvXV9qxJ5h/AQKqwx0KTQ-WWNXhx +.youtube.com TRUE / TRUE 1800428290 SAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.youtube.com TRUE / TRUE 1800428290 __Secure-1PAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.youtube.com TRUE / TRUE 1800428290 __Secure-3PAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.youtube.com TRUE / FALSE 1800428290 SID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKoSUnso2-Jei4kXyw3vkPVTAACgYKAagSARISFQHGX2MiJHYUPmXWdwkZK2XDf_GwXBoVAUF8yKp3C62xZbir_l9l1iGemSh10076 +.youtube.com TRUE / TRUE 1800428290 __Secure-1PSID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKoIHNh95eTgwe5PCvjXO7RiwACgYKAXgSARISFQHGX2MiUCLxKGvQdCaO3RIMX3pL8xoVAUF8yKp99ruUBspbJcI5Nlbxmkms0076 +.youtube.com TRUE / TRUE 1800428290 __Secure-3PSID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKo0L0_94050qSrrWclMZiQ2QACgYKAekSARISFQHGX2MiSux17infkXbLeh2VgtHwcBoVAUF8yKru_5zpEhsffYGdv6LoQIzD0076 +.youtube.com TRUE / TRUE 1800428291 LOGIN_INFO AFmmF2swRQIhANY-zMnxTQqYQsr13UQJWwcj2NDujqhai0vRZFDdm_iwAiAOwWbA3U56uTwfdIt9nN1ebor_-BLoFmvYuNH5scnVkA:QUQ3MjNmeVJYWkFuMUFkNmFvdzlON1RRb2NCWmpyZk1BUTNMV0xmSEhnQW11S3c4Z0JxQzI0U3BvYm1NUGo2aURCSDFFb2gyZFdoelBTSG1GRjY4VGI2bklTYUxfd2l4T280UERrQmgzQ2ZVMHJjeHl6cTJwYWlfMFFlZjJ3SWIydGpPclZMblZHS1prVW1iYUZScUhreTlIb3dYemJacGxR +.youtube.com TRUE / TRUE 1781420460 VISITOR_INFO1_LIVE DU93dBmqi5k +.youtube.com TRUE / TRUE 1781420460 VISITOR_PRIVACY_METADATA CgJMVBIhEh0SGwsMDg8QERITFBUWFxgZGhscHR4fICEiIyQlJiAU +.youtube.com TRUE / TRUE 1765868898 CONSISTENCY APeVyi8Rp-CMt_vID2CrrZ5KU1CfOUeLDDMIUGGggmHQ8xVFB5rTAjaYgrYU8gE67cbUx7ywnrEftaAbqpAT91rbJxgKveFRh6RvRmtRsTVj7J1qqK0W1O2gkqw +.youtube.com TRUE / FALSE 0 PREF f4=4000000&f6=40000000&tz=UTC&f7=100&hl=en +.youtube.com TRUE / TRUE 1797404460 __Secure-3PSIDCC AKEyXzVmmxSc1uWl8DacYBMKoZhlGACKY7dP3FxnRUlKTH9pJHTEgE9f4ji35jyfJ8UlnrT0 +.youtube.com TRUE / FALSE 1797404460 SIDCC AKEyXzVoynnHCnUrqsY5HF8hVVuB_poBN3scczpj3nrv6hlsJG9MHhOK9Ey1mpjmFiT14sYsEw +.youtube.com TRUE / TRUE 0 YSC MuPoXaDSjP8 +.youtube.com TRUE / TRUE 1797404460 __Secure-1PSIDCC AKEyXzUA4AckPBzAog0OgLkPC-JvGdZ_00BNWHmCEGpFozFwQ0jKnCDRwoK9wPYR86txxL-Y +.google.com TRUE / TRUE 1800054911 __Secure-ENID 30.SE=BnxuDLi-inu4Gzy1Q-BkRVPbU34if3B1m5F4iG4QTAR0QMHcvZanZn3EaUvwpf39pcQxypJXNwUSYd69ukPZ3E05Sndobkz9uB5hn2GpwgR4n9UHnnIZbsBl3lDPHgOrJMXKXkXEzvqTqRnqmFqGUpGJPdFvMr_CTJjsfJSsJM7X3SRMtLYQr-QkFYRPyf6HCaafVaMV4lm4LxHo0ifDoOV9yG58_-sys2NDd5_VQyadNkCwwGEdTA +.google.com TRUE / FALSE 1800428289 SID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKoSUnso2-Jei4kXyw3vkPVTAACgYKAagSARISFQHGX2MiJHYUPmXWdwkZK2XDf_GwXBoVAUF8yKp3C62xZbir_l9l1iGemSh10076 +.google.com TRUE / TRUE 1800428289 __Secure-1PSID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKoIHNh95eTgwe5PCvjXO7RiwACgYKAXgSARISFQHGX2MiUCLxKGvQdCaO3RIMX3pL8xoVAUF8yKp99ruUBspbJcI5Nlbxmkms0076 +.google.com TRUE / TRUE 1800428289 __Secure-3PSID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKo0L0_94050qSrrWclMZiQ2QACgYKAekSARISFQHGX2MiSux17infkXbLeh2VgtHwcBoVAUF8yKru_5zpEhsffYGdv6LoQIzD0076 +.google.com TRUE / FALSE 1800428289 HSID AGq0xGqG60Tt9F_ou +.google.com TRUE / TRUE 1800428289 SSID AJk48knMOGJvmVvT2 +.google.com TRUE / FALSE 1800428289 APISID nD084UIvXV9qxJ5h/AQKqwx0KTQ-WWNXhx +.google.com TRUE / TRUE 1800428289 SAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.google.com TRUE / TRUE 1800428289 __Secure-1PAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.google.com TRUE / TRUE 1800428289 __Secure-3PAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.google.com TRUE / FALSE 1797404291 SIDCC AKEyXzX0IimESXDfX7AChToljvV0GXJZCtiiZP6Uv1VAfqB7_LaFd2QPBuwU2YGBV775HQcU2Q +.google.com TRUE / TRUE 1797404291 __Secure-1PSIDCC AKEyXzUwELfBY2KLxMsTaq9nyWZ1FQR_UowkU88BOI1LsXPuDDOZZfcXavvulpZGRXChSjuo +.google.com TRUE / TRUE 1797404291 __Secure-3PSIDCC AKEyXzVLriwJp89DOj0C9lhqB35criD-Y1D8OkuApHuAmuBJrH9ktI4GWAUNp3R3WfBmq6PjtA +.google.lt TRUE / FALSE 1800428290 HSID AViy3sAm-kAkV5yxA +.google.lt TRUE / TRUE 1800428290 SSID A48-JbqJWpI4sRMiJ +.google.lt TRUE / FALSE 1800428290 APISID nD084UIvXV9qxJ5h/AQKqwx0KTQ-WWNXhx +.google.lt TRUE / TRUE 1800428290 SAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.google.lt TRUE / TRUE 1800428290 __Secure-1PAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.google.lt TRUE / TRUE 1800428290 __Secure-3PAPISID P9syumcmR8_Kjwte/ArSm-AS2Ua1iKJFXk +.google.lt TRUE / TRUE 1781679490 NID 527=WBELqflYlK2IZwz9JufJ6NunKA9itkSzHo3efHbWzUxeBPRptGY08vzZ_EO6saP-hUvjJFQB2bS9rgiYuEVgOT0pCdY1Kb-iuxS63R9jWbrlwy4pvSOi7vpuh2aKhFYHRFUPZ8SfzFlBseCqTIRaoam6s9mdskPDxJCn2pwO4f0zC3pUYmFlMMLzCeztKNeqcxyC3U2yKbgP5ACeuCc-wgNcS660V_Td9lUzI1nTfpWbouE8aN3XrhBF5Zq5eKoK +.google.lt TRUE / FALSE 1800428290 SID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKoSUnso2-Jei4kXyw3vkPVTAACgYKAagSARISFQHGX2MiJHYUPmXWdwkZK2XDf_GwXBoVAUF8yKp3C62xZbir_l9l1iGemSh10076 +.google.lt TRUE / TRUE 1800428290 __Secure-1PSID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKoIHNh95eTgwe5PCvjXO7RiwACgYKAXgSARISFQHGX2MiUCLxKGvQdCaO3RIMX3pL8xoVAUF8yKp99ruUBspbJcI5Nlbxmkms0076 +.google.lt TRUE / TRUE 1800428290 __Secure-3PSID g.a0004ghwIKh1vp4oRjv6kAff63ifG-fPNqXRf9eCxufzgqRuPuKo0L0_94050qSrrWclMZiQ2QACgYKAekSARISFQHGX2MiSux17infkXbLeh2VgtHwcBoVAUF8yKru_5zpEhsffYGdv6LoQIzD0076