Spaces:
Running
Running
import requests | |
import gradio as gr | |
from utils import download_file, extract_fst_url, API_TIKTOK, TIMEOUT, EN_US, TMP_DIR | |
ZH2EN = { | |
"状态栏": "Status", | |
"请输入抖音视频分享短链接": "Please enter TikTok video sharing short link", | |
"视频下载": "Video download", | |
"视频描述": "Video description", | |
"解析耗时": "Parsing time", | |
"作者头像": "Author avatar", | |
"作者昵称": "Author nickname", | |
"作者签名": "Author signature", | |
"抖音无水印视频解析": "Parse TikTok video without watermark", | |
"直链输出": "Direct link output", | |
} | |
def _L(zh_txt: str): | |
return ZH2EN[zh_txt] if EN_US else zh_txt | |
# outer func | |
def infer(video_url: str, direct_lnk_out: bool, cache=f"{TMP_DIR}/tiktok"): | |
status = "Success" | |
video = parse_time = desc = avatar = author = sign = None | |
try: | |
if not video_url: | |
raise ValueError("视频分享链接为空!") | |
video_url = extract_fst_url(video_url) | |
if not video_url: | |
raise ValueError("请输入有效的视频分享链接!") | |
response = requests.get(API_TIKTOK, params={"url": video_url}, timeout=TIMEOUT) | |
response_json = response.json() | |
retcode = response_json["code"] | |
if retcode == 200: | |
response_data = response_json["data"] | |
parse_time = response_data["parse_time"] | |
additional_data = response_data["additional_data"][0] | |
desc = additional_data["desc"] | |
avatar = additional_data["url"].split("?from=")[0] | |
author = additional_data["nickname"] | |
sign = additional_data["signature"] | |
if direct_lnk_out: | |
video = response_data["video_url"] | |
else: | |
video_id = response_data["play_url"].split("video_id=")[1].split("&")[0] | |
video = download_file(response_data["video_url"], video_id, cache) | |
else: | |
raise ConnectionError(f"接口调用失败, 错误码: HTTP {retcode}") | |
except Exception as e: | |
status = f"视频解析失败: {e}" | |
return status, video, desc, parse_time, avatar, author, sign | |
def tiktok_parser(): | |
return gr.Interface( | |
fn=infer, | |
inputs=[ | |
gr.Textbox( | |
label=_L("请输入抖音视频分享短链接"), | |
placeholder="https://v.douyin.com/*", | |
), | |
gr.Checkbox(label=_L("直链输出"), value=False), | |
], | |
outputs=[ | |
gr.Textbox(label=_L("状态栏"), show_copy_button=True), | |
gr.Video( | |
label=_L("视频下载"), | |
show_download_button=True, | |
show_share_button=False, | |
), | |
gr.Textbox(label=_L("视频描述"), show_copy_button=True), | |
gr.Textbox(label=_L("解析耗时"), show_copy_button=True), | |
gr.Image(label=_L("作者头像"), show_share_button=False), | |
gr.Textbox(label=_L("作者昵称"), show_copy_button=True), | |
gr.TextArea(label=_L("作者签名"), show_copy_button=True), | |
], | |
title=_L("抖音无水印视频解析"), | |
flagging_mode="never", | |
examples=[ | |
["https://v.douyin.com/8FVe5DzarE0", False], | |
[ | |
"8.20 Njc:/ [email protected] 11/03 黑塔女士举世无双!# 大黑塔 # 黑塔 # 崩坏星穹铁道 # 再创世的凯歌 # 天才俱乐部 https://v.douyin.com/8FVe5DzarE0/ 复制此链接,打开Dou音搜索,直接观看视频!", | |
True, | |
], | |
], | |
cache_examples=False, | |
) | |