#!/usr/bin/env python3
import hashlib
import pathlib
import re
import sys

import requests


def parse_url(url: str):
    m = re.search(r'x\.com/([^/]+)/status/(\d+)', url)
    if not m:
        raise ValueError('链接格式不对，需包含 x.com/<user>/status/<id>')
    return m.group(1), m.group(2)


def clean_name(text: str) -> str:
    text = (text or 'x_video').split('\n')[0].strip()
    text = re.sub(r'[\\/:*?"<>|\n\r\t]+', '_', text)
    text = re.sub(r'\s+', ' ', text).strip(' ._')
    return (text or 'x_video')[:24]


def main():
    if len(sys.argv) != 2:
        print('用法: python3 download_x_video.py <x链接>')
        sys.exit(1)

    input_url = sys.argv[1].strip()
    user, status_id = parse_url(input_url)
    api = f'https://api.fxtwitter.com/{user}/status/{status_id}'
    headers = {'user-agent': 'Mozilla/5.0'}

    resp = requests.get(api, headers=headers, timeout=30)
    resp.raise_for_status()
    data = resp.json()

    tweet = data.get('tweet') or {}
    media = tweet.get('media') or {}
    videos = media.get('videos') or media.get('all') or []
    if not videos:
        raise RuntimeError('没有找到可下载的视频')

    video = videos[0]
    video_url = video['url']
    title = clean_name(tweet.get('text') or tweet.get('raw_text') or 'x_video')
    out = pathlib.Path.home() / 'Downloads' / f'{title} [{status_id}].mp4'

    with requests.get(video_url, headers=headers, stream=True, timeout=90) as r:
        r.raise_for_status()
        with open(out, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024 * 1024):
                if chunk:
                    f.write(chunk)

    out.chmod(0o644)
    sha256 = hashlib.sha256(out.read_bytes()).hexdigest()
    print(f'已保存: {out}')
    print(f'大小: {out.stat().st_size} bytes')
    print(f'SHA256: {sha256}')


if __name__ == '__main__':
    main()
