#!/usr/bin/env python3
"""
通用视频下载工具 - 从任何网页下载视频
支持：直接URL、YouTube、Bilibili、抖音、Dailymotion、Vimeo、Facebook等
"""
import subprocess
import sys
import os
import json
import re
import urllib.request
import ssl

# 禁用SSL验证
ssl._create_default_https_context = ssl._create_unverified_context

def download_with_yt_dlp(url, output_dir="/root/videos/news"):
    """用yt-dlp下载（支持1000+网站）"""
    os.makedirs(output_dir, exist_ok=True)
    output = os.path.join(output_dir, "%(title)s.%(ext)s")
    
    cmd = [
        "yt-dlp",
        "-f", "best[height<=720]",
        "-o", output,
        "--no-playlist",
        "--max-filesize", "100M",
        "--retries", "3",
        "--fragment-retries", "3",
        url
    ]
    
    print(f"[yt-dlp] Downloading: {url}")
    result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
    
    if result.returncode == 0:
        print(f"[yt-dlp] SUCCESS")
        return True
    else:
        print(f"[yt-dlp] FAILED: {result.stderr[-200:]}")
        return False

def download_with_youget(url, output_dir="/root/videos/news"):
    """用you-get下载"""
    os.makedirs(output_dir, exist_ok=True)
    
    cmd = [
        "you-get",
        "-o", output_dir,
        "--no-caption",
        url
    ]
    
    print(f"[you-get] Downloading: {url}")
    result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
    
    if result.returncode == 0:
        print(f"[you-get] SUCCESS")
        return True
    else:
        print(f"[you-get] FAILED: {result.stderr[-200:]}")
        return False

def download_direct(url, output_file):
    """直接下载视频URL"""
    print(f"[direct] Downloading: {url}")
    req = urllib.request.Request(url, headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Referer': 'https://www.google.com/'
    })
    try:
        resp = urllib.request.urlopen(req, timeout=60)
        with open(output_file, 'wb') as f:
            while True:
                chunk = resp.read(8192)
                if not chunk:
                    break
                f.write(chunk)
        size = os.path.getsize(output_file)
        print(f"[direct] SUCCESS: {size//1024}KB")
        return True
    except Exception as e:
        print(f"[direct] FAILED: {e}")
        return False

def smart_download(url, output_dir="/root/videos/news"):
    """智能下载 - 自动选择最佳工具"""
    os.makedirs(output_dir, exist_ok=True)
    
    # 1. 先试yt-dlp（支持最多网站）
    print(f"\n=== Trying yt-dlp ===")
    if download_with_yt_dlp(url, output_dir):
        return True
    
    # 2. 再试you-get
    print(f"\n=== Trying you-get ===")
    if download_with_youget(url, output_dir):
        return True
    
    # 3. 如果是直接视频URL
    if url.endswith(('.mp4', '.webm', '.avi', '.mov', '.mkv', '.flv')):
        print(f"\n=== Trying direct download ===")
        filename = url.split('/')[-1].split('?')[0]
        output_file = os.path.join(output_dir, filename)
        if download_direct(url, output_file):
            return True
    
    print(f"\nFAILED: Could not download {url}")
    return False

def search_and_download_news():
    """搜索并下载新闻视频"""
    output_dir = "/root/videos/news"
    os.makedirs(output_dir, exist_ok=True)
    
    # 从Coverr下载免费新闻视频
    coverr_videos = [
        ("https://cdn.coverr.co/videos/coverr-local-dutch-newspapers-8257/360p.mp4", "coverr_newspapers.mp4"),
        ("https://cdn.coverr.co/videos/coverr-painted-newsstand-door-1446/360p.mp4", "coverr_newsstand.mp4"),
        ("https://cdn.coverr.co/videos/coverr-times-square-billboards-8783/360p.mp4", "coverr_times_square.mp4"),
        ("https://cdn.coverr.co/videos/coverr-man-puts-away-his-laptop-and-reads-a-newspaper-3710/360p.mp4", "coverr_reading_news.mp4"),
        ("https://cdn.coverr.co/videos/coverr-woman-reading-a-newspaper-on-a-bench-5617/360p.mp4", "coverr_woman_news.mp4"),
    ]
    
    downloaded = []
    for url, filename in coverr_videos:
        output = os.path.join(output_dir, filename)
        if os.path.exists(output) and os.path.getsize(output) > 100000:
            print(f"SKIP (exists): {filename}")
            downloaded.append(output)
            continue
        print(f"\nDownloading: {filename}")
        if download_direct(url, output):
            downloaded.append(output)
    
    return downloaded

def search_world_cup_highlights():
    """搜索世界杯精彩片段"""
    output_dir = "/root/videos/news"
    
    # 用yt-dlp搜索世界杯视频
    search_urls = [
        "https://www.youtube.com/results?search_query=World+Cup+2026+highlights+Mexico+South+Africa",
        "https://www.youtube.com/results?search_query=2026+World+Cup+goals+highlights",
    ]
    
    for search_url in search_urls:
        try:
            cmd = [
                "yt-dlp",
                "--flat-playlist",
                "--print", "%(id)s %(title)s",
                "--playlist-items", "1-10",
                search_url
            ]
            result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
            if result.returncode == 0 and result.stdout.strip():
                print(f"\n[Search] Found videos:")
                for line in result.stdout.strip().split('\n')[:10]:
                    print(f"  {line}")
        except Exception as e:
            print(f"[Search] Error: {e}")

if __name__ == "__main__":
    if len(sys.argv) > 1:
        url = sys.argv[1]
        smart_download(url)
    else:
        print("通用视频下载工具")
        print("用法: python3 video_downloader.py <URL>")
        print()
        print("先下载免费新闻视频素材...")
        files = search_and_download_news()
        print(f"\n下载完成: {len(files)} 个文件")
        for f in files:
            size = os.path.getsize(f)
            print(f"  {os.path.basename(f)}: {size//1024}KB")
