import os
import re
import time
import json
import requests
from urllib.parse import urlparse, parse_qs

BASE_PATH = "./file/result/"
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

def get_redirect_url(url):
    """获取重定向后的真实URL"""
    try:
        response = requests.head(url, headers=HEADERS, allow_redirects=True)
        return response.url
    except requests.RequestException as e:
        print(f"获取重定向URL失败: {e}")
        return None

def get_video_info(url):
    """获取抖音视频信息"""
    redirect_url = get_redirect_url(url)
    if not redirect_url:
        return None
    
    match = re.search(r"video/(\d+)", redirect_url)
    if not match:
        print("无法解析视频ID")
        return None
    
    video_id = match.group(1)
    api_url = f"https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={video_id}"
    
    try:
        response = requests.get(api_url, headers=HEADERS)
        response.raise_for_status()
        data = response.json()
        return data["item_list"][0]
    except (requests.RequestException, KeyError, IndexError) as e:
        print(f"获取视频信息失败: {e}")
        return None

def download_video(video_url, save_path):
    """下载视频"""
    try:
        response = requests.get(video_url, headers=HEADERS, stream=True)
        response.raise_for_status()
        
        with open(save_path, "wb") as file:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:
                    file.write(chunk)
        print(f"视频下载成功: {save_path}")
    except requests.RequestException as e:
        print(f"下载视频失败: {e}")

def main():
    os.makedirs(BASE_PATH, exist_ok=True)
    while True:
        url = input("请输入抖音视频链接(输入0退出): ")
        if url.strip() == "0":
            break
        
        video_info = get_video_info(url)
        if not video_info:
            print("获取视频信息失败，请检查链接")
            continue
        
        video_id = video_info["video"]["play_addr"]["uri"]
        video_url = f"https://aweme.snssdk.com/aweme/v1/play/?video_id={video_id}&line=0&ratio=720p"
        save_path = os.path.join(BASE_PATH, f"video_{int(time.time())}.mp4")
        
        print("正在下载...")
        download_video(video_url, save_path)

if __name__ == "__main__":
    main()