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

# 设置全局路径
BASE_PATH = ""

# 伪装请求头，模拟浏览器访问抖音
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}

def main():
    global BASE_PATH
    BASE_PATH = "./file/result/file_" + str(int(round(time.time() * 1000)))

    print("------------- 请选择 -------------")
    print("------ 1:抖音视频无水印下载 -----")
    print("------ 2:抖音视频提取音频 ------")
    print("------ 3:抖音视频提取文字 ------")
    print("------ 4:mp4视频提取音频 --------")
    print("------ 5:mp4视频提取文字 --------")
    print("------ 6:mp3音频提取文字 --------")
    print("------ 0:退出 -------------------")

    while True:
        sel = input("\n ==> 请选择:")
        if sel == "1":
            get_dy_video()
        elif sel == "2":
            get_dy_video()
            get_audio()
        elif sel == "3":
            get_dy_video()
            get_audio()
            audio_recognise()
        elif sel == "4":
            v_path = input("请输入MP4视频本地路径：")
            get_audio(v_path)
        elif sel == "5":
            v_path = input("请输入MP4视频本地路径：")
            get_audio(v_path)
            audio_recognise()
        elif sel == "6":
            a_path = input("请输入MP3音频本地路径：")
            audio_recognise(a_path)
        elif sel == "0":
            break
        else:
            print("无效选项，请重新输入！")

# 下载抖音视频
def get_dy_video():
    print("\n------ 下载视频 ------")
    url = input("请输入视频链接地址：").strip()

    # 获取视频真实链接
    real_url = get_real_url(url)
    if not real_url:
        print("❌ 无法解析视频链接，请检查输入的URL！")
        return

    print(f"🎯 解析到视频地址：{real_url}")

    # 下载视频
    response = requests.get(real_url, headers=HEADERS, stream=True)
    if response.status_code == 200:
        file_path = BASE_PATH + ".mp4"
        with open(file_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=1024):
                f.write(chunk)
        print(f"✅ 视频下载成功：{file_path}\n")
    else:
        print("❌ 视频下载失败，请检查链接或稍后重试！")

# 获取抖音视频的真实链接
def get_real_url(share_url):
    try:
        # 处理短链接跳转
        res = requests.get(share_url, headers=HEADERS, allow_redirects=True)
        real_url = res.url

        # 提取视频ID
        video_id = re.search(r'video/(\d+)', real_url)
        if not video_id:
            print("❌ 无法提取视频ID！")
            return None
        
        video_id = video_id.group(1)
        print(f"📌 视频ID: {video_id}")

        # 请求抖音接口获取无水印视频链接
        api_url = f"https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids={video_id}"
        response = requests.get(api_url, headers=HEADERS)

        # 解析JSON
        try:
            data = response.json()
            video_url = data["item_list"][0]["video"]["play_addr"]["url_list"][0].replace("playwm", "play")
            return video_url
        except (KeyError, IndexError, json.JSONDecodeError):
            print("❌ 无法解析视频地址！")
            return None

    except requests.RequestException as e:
        print(f"❌ 网络请求失败：{e}")
        return None

# 从视频中提取音频
def get_audio(video_path=""):
    if not video_path:
        video_path = BASE_PATH + ".mp4"
    
    try:
        my_audio = AudioFileClip(video_path)
        audio_path = BASE_PATH + ".mp3"
        my_audio.write_audiofile(audio_path)
        print(f"✅ 音频提取成功：{audio_path}\n")
    except Exception as e:
        print(f"❌ 提取音频失败：{e}")

# 语音识别
def audio_recognise(audio_path=""):
    if not audio_path:
        audio_path = BASE_PATH + ".mp3"

    print("🚀 语音识别开始……")
    try:
        with open(audio_path, 'rb') as f:
            data = f.read()
        
        # 这里应该接入腾讯云语音识别接口
        # 由于腾讯云 API 需要密钥，这里仅作示例
        # 实际使用请调用腾讯云 SDK
        result_text = "模拟语音识别结果：你好，这是抖音视频的语音转文字内容！"
        
        txt_path = BASE_PATH + ".txt"
        with open(txt_path, "w") as file:
            file.write(result_text)
        
        print(f"✅ 语音识别成功，结果保存在 {txt_path}\n")
    except Exception as e:
        print(f"❌ 语音识别失败：{e}")

if __name__ == "__main__":
    main()
