import requests
import re
import json
import os

# 下载文件存放路径
BASE_PATH = "downloaded_video"

def get_redirect_url(url):
    """ 获取抖音短链接的真实地址 """
    try:
        response = requests.get(url, headers={
            "User-Agent": "Mozilla/5.0"
        }, timeout=5, allow_redirects=True)
        
        print(f"解析后重定向 URL: {response.url}")  # 调试输出
        return response.url
    except requests.RequestException as e:
        print(f"获取重定向 URL 失败: {e}")
        return url  # 返回原始 URL，避免程序崩溃

def get_dy_video_info(url):
    """ 解析视频信息 """
    redirect_url = get_redirect_url(url)
    
    # 提取视频 ID
    pattern = re.compile(r'douyin.com/video/(\d+)')
    match = pattern.search(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}"

    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
    }

    try:
        response = requests.get(api_url, headers=headers, timeout=10)

        if response.status_code != 200:
            print(f"API 请求失败，状态码: {response.status_code}")
            return None

        data = response.json()
        print(f"API 返回数据: {json.dumps(data, indent=2, ensure_ascii=False)}")  # 调试输出
        
        return data["item_list"][0] if "item_list" in data and data["item_list"] else None
    except json.JSONDecodeError as e:
        print(f"解析 JSON 失败: {e}")
        print(f"原始返回数据: {response.text}")
        return None

def download_media(url, save_path):
    """ 下载媒体文件 """
    try:
        response = requests.get(url, stream=True)
        response.raise_for_status()

        with open(save_path, "wb") as file:
            for chunk in response.iter_content(1024):
                file.write(chunk)

        print(f"文件已下载: {save_path}")
    except requests.RequestException as e:
        print(f"下载失败: {e}")

def get_dy_video():
    """ 主入口，获取并下载抖音视频 """
    while True:
        url = input("请输入抖音视频链接(输入0退出): ")
        if url == "0":
            return 0

        v_info = get_dy_video_info(url)
        if not v_info:
            print("获取视频信息失败，请检查链接")
            continue  # 让用户重新输入

        try:
            video_id = v_info["video"]["play_addr"]["uri"]
            video_url = f"https://aweme.snssdk.com/aweme/v1/play/?video_id={video_id}&line=0&ratio=720p"
            res_url = get_redirect_url(video_url)

            print(f"下载中: {res_url} ...")
            download_media(res_url, BASE_PATH + ".mp4")
            print("------ 🍺 下载视频成功 ------\n")
            return 1
        except KeyError as e:
            print(f"解析视频数据失败: {e}")
            continue

if __name__ == "__main__":
    get_dy_video()
