# -*- coding: utf-8 -*-
import sys
import requests
import re
import os
import time
import json
from datetime import datetime
from bs4 import BeautifulSoup

BASE_PATH = ""

# 下载抖音无水印视频
def main():
    global BASE_PATH
    BASE_PATH = "./file/result/file_" + str(int(round(time.time() * 1000)))
    
    while True:
        r = get_dy_video()
        if r == 0:
            break

# 下载抖音视频
def get_dy_video():
    url = input("请输入抖音视频链接(输入0退出): ")
    if url == "0":
        return 0
    
    print(f"输入的URL: {url}")
    
    v_info = get_dy_video_info(url)
    if not v_info:
        print("获取视频信息失败，请检查链接")
        return 1
    
    v_id = v_info["video"]["play_addr"]["uri"]
    video_url = f'https://aweme.snssdk.com/aweme/v1/play/?video_id={v_id}&line=0&ratio=720p'
    
    res_url = get_redirect_url(video_url)
    if not res_url:
        print("无法获取视频下载地址")
        return 1
    
    print(f"解析后视频下载地址: {res_url}")
    print("开始下载...")
    
    download_media(res_url, BASE_PATH + ".mp4")
    print("------ 🍺 下载视频成功 ------\n")
    return 1

# 获取抖音视频信息
def get_dy_video_info(url):
    redirect_url = get_redirect_url(url)
    print(f"解析后重定向 URL: {redirect_url}")
    
    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}"
    print(f"请求视频信息 API: {api_url}")
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }
    
    response = requests.get(api_url, headers=headers)
    if response.status_code != 200:
        print(f"请求错误: {response.status_code}")
        return None
    
    try:
        resp_json = response.json()
        print(f"视频信息 JSON: {json.dumps(resp_json, indent=4, ensure_ascii=False)}")
        return resp_json["item_list"][0] if "item_list" in resp_json and resp_json["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:
        headers = {"User-Agent": "Mozilla/5.0"}
        response = requests.get(url, stream=True, headers=headers)
        
        if response.status_code != 200:
            print(f"下载失败，状态码: {response.status_code}")
            return
        
        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 Exception as e:
        print(f"下载出错: {e}")

# 获取重定向的链接
def get_redirect_url(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0"}
        response = requests.get(url, headers=headers, allow_redirects=True, timeout=5)
        return response.url
    except Exception as e:
        print(f"获取重定向 URL 失败: {e}")
        return None

if __name__ == "__main__":
    main()