Update .env.example with new admin bot token, modify Docker configuration for Instagram downloader to use host network mode, and enhance YouTube downloader with improved cookie validation and error handling for video downloads.

This commit is contained in:
vrubel 2026-01-08 19:05:41 +03:00
parent e6c6734768
commit 5c8456de96
4 changed files with 138 additions and 11 deletions

View file

@ -182,8 +182,16 @@ def download_youtube_video(url: str, max_retries: int = 3) -> Path:
logger.info(f"YouTube: попытка {attempt + 1}/{max_retries}, стратегия: {strategy['name']}")
# Получаем информацию о видео
with yt_dlp.YoutubeDL(strategy['opts'].copy()) as ydl:
info = ydl.extract_info(url, download=False)
try:
with yt_dlp.YoutubeDL(strategy['opts'].copy()) as ydl:
info = ydl.extract_info(url, download=False)
except Exception as info_error:
error_str = str(info_error).lower()
logger.warning(f"YouTube: ошибка при получении информации о видео: {str(info_error)[:200]}")
# Если ошибка связана с куками - пробуем следующую стратегию
if any(keyword in error_str for keyword in ['bot', 'sign in', 'cookies', 'private', 'unavailable']):
continue
raise
video_title = info.get('title', 'video') if info else 'video'
logger.info(f"YouTube: получена информация о видео: {video_title}")
@ -260,7 +268,28 @@ def download_youtube_video(url: str, max_retries: int = 3) -> Path:
@app.route('/health', methods=['GET'])
def health():
"""Health check endpoint"""
return jsonify({'status': 'ok', 'service': 'youtube-downloader'}), 200
cookies_file = os.getenv('YOUTUBE_COOKIES_FILE', 'youtube_cookies.txt')
cookies_file_path = Path(cookies_file)
cookies_status = 'not_found'
cookies_valid = False
if cookies_file_path.exists():
cookies_status = 'found'
cookies_valid = _is_valid_cookies_file(cookies_file_path)
if cookies_valid:
cookies_status = 'valid'
else:
cookies_status = 'invalid'
return jsonify({
'status': 'ok',
'service': 'youtube-downloader',
'cookies': {
'file': str(cookies_file_path),
'status': cookies_status,
'valid': cookies_valid
}
}), 200
@app.route('/download/stream', methods=['POST'])
@ -308,7 +337,10 @@ def download_stream():
except Exception as e:
error_str = str(e)
import traceback
error_traceback = traceback.format_exc()
logger.error(f"Ошибка при скачивании: {error_str}")
logger.error(f"Traceback: {error_traceback}")
# Улучшаем сообщение об ошибке
error_msg = error_str
@ -318,6 +350,14 @@ def download_stream():
"💡 Совет: YouTube требует авторизацию для этого видео (18+, приватное и т.д.). "
"Попробуйте открыть видео в браузере, авторизоваться, затем повторить запрос."
)
elif 'unable to download' in error_str.lower() or 'http error' in error_str.lower():
error_msg = (
f"{error_str}\n\n"
"💡 Возможные причины:\n"
"1. Видео недоступно или удалено\n"
"2. Проблемы с сетью или доступом к YouTube\n"
"3. Куки устарели - обновите файл youtube_cookies.txt"
)
return jsonify({'error': error_msg}), 500
@ -325,6 +365,21 @@ def download_stream():
if __name__ == '__main__':
port = int(os.getenv('PORT', 5000)) # Внутренний порт контейнера
host = os.getenv('HOST', '0.0.0.0')
# Проверяем куки при старте
cookies_file = os.getenv('YOUTUBE_COOKIES_FILE', 'youtube_cookies.txt')
cookies_file_path = Path(cookies_file)
if cookies_file_path.exists():
cookies_valid = _is_valid_cookies_file(cookies_file_path)
if cookies_valid:
logger.info(f"YouTube: файл куков найден и валиден: {cookies_file_path}")
else:
logger.warning(f"YouTube: файл куков найден, но не валиден: {cookies_file_path}")
logger.warning("YouTube: сервис будет работать, но может потребоваться обновление куков")
else:
logger.warning(f"YouTube: файл куков не найден: {cookies_file_path}")
logger.warning("YouTube: сервис будет работать без куков (может не работать для 18+ и приватных видео)")
logger.info(f"Запуск YouTube Downloader сервиса на {host}:{port}")
app.run(host=host, port=port, debug=False)