import os
import re
import sys
import datetime
import win32file
import win32con
import pywintypes

def extract_timestamp(filename):
    """从文件名中提取时间戳并转换为datetime对象"""
    # 移除文件扩展名
    basename = os.path.splitext(filename)[0]
    
    # 提取所有数字
    digits = re.sub(r'\D', '', basename)
    if not digits:
        return None
    
    # 确保至少12位数字（YYYYMMDDHHMM）
    if len(digits) < 12:
        return None
        
    # 取最后12-14位数字
    if len(digits) > 14:
        digits = digits[-14:]
    elif len(digits) < 14:
        # 不足14位时补零（秒数设为00）
        digits = digits.ljust(14, '0')
    
    # 解析为datetime对象
    try:
        dt = datetime.datetime.strptime(digits, "%Y%m%d%H%M%S")
        return dt
    except ValueError:
        return None

def set_file_times(filepath, dt):
    """使用win32api设置文件时间（创建/修改/访问时间）"""
    # 转换为pywintypes时间格式
    ft_time = pywintypes.Time(dt)
    
    # 打开文件句柄
    handle = win32file.CreateFile(
        filepath,
        win32file.GENERIC_WRITE,
        0,
        None,
        win32file.OPEN_EXISTING,
        0,
        None
    )
    
    # 设置文件时间
    try:
        win32file.SetFileTime(handle, ft_time, ft_time, ft_time)
    finally:
        win32file.CloseHandle(handle)

def process_directory(root_dir):
    """递归处理目录中的所有文件"""
    allowed_exts = {'.mp3', '.m4a', '.amr', '.wav', '.aac'}  # 可扩展其他音频格式
    
    for root, _, files in os.walk(root_dir):
        for filename in files:
            ext = os.path.splitext(filename)[1].lower()
            if ext not in allowed_exts:
                continue
                
            filepath = os.path.join(root, filename)
            timestamp = extract_timestamp(filename)
            
            if not timestamp:
                print(f"⚠ 跳过 [无法解析时间]: {filename}")
                continue
            
            try:
                set_file_times(filepath, timestamp)
                print(f"✓ 成功修改: {filename} -> {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
            except Exception as e:
                print(f"✗ 修改失败 [{e}]: {filename}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法: python set_file_time.py <目录路径>")
        sys.exit(1)
    
    target_dir = sys.argv[1]
    if not os.path.isdir(target_dir):
        print(f"错误: 目录不存在 - {target_dir}")
        sys.exit(1)
    
    process_directory(target_dir)