#!/usr/bin/env python3
import os
import sys
from pathlib import Path
import mutagen
from mutagen.id3 import ID3
from mutagen.flac import FLAC
from mutagen.mp4 import MP4
from mutagen.wave import WAVE

def extract_raw_lyrics(file_path):
    """从音乐文件中直接提取原始歌词，不做任何修改"""
    try:
        file_ext = Path(file_path).suffix.lower()
        
        if file_ext in ['.mp3']:
            return extract_id3_lyrics_raw(file_path)
        elif file_ext in ['.flac']:
            return extract_flac_lyrics_raw(file_path)
        elif file_ext in ['.m4a', '.mp4']:
            return extract_mp4_lyrics_raw(file_path)
        elif file_ext in ['.wav', '.wave']:
            return extract_wav_lyrics_raw(file_path)
        else:
            return None
    except Exception as e:
        print(f"  警告: 提取歌词时出错 - {e}")
        return None

def extract_id3_lyrics_raw(file_path):
    """从 MP3 文件提取原始 ID3 歌词"""
    try:
        audio = ID3(file_path)
        # 查找 USLT 帧（歌词）
        for key in audio.keys():
            if key.startswith('USLT'):
                lyrics_text = str(audio[key])
                # 检查是否是有效的歌词（不是空字符串或只有空格）
                if lyrics_text and lyrics_text.strip():
                    return lyrics_text
        return None
    except Exception as e:
        return None

def extract_flac_lyrics_raw(file_path):
    """从 FLAC 文件提取原始歌词"""
    try:
        audio = FLAC(file_path)
        # 查找 lyrics 标签
        if 'lyrics' in audio:
            lyrics_text = '\n'.join(audio['lyrics'])
            if lyrics_text and lyrics_text.strip():
                return lyrics_text
        return None
    except:
        return None

def extract_mp4_lyrics_raw(file_path):
    """从 MP4/M4A 文件提取原始歌词"""
    try:
        audio = MP4(file_path)
        if '©lyr' in audio:
            lyrics_text = audio['©lyr'][0]
            if lyrics_text and lyrics_text.strip():
                return lyrics_text
        return None
    except:
        return None

def extract_wav_lyrics_raw(file_path):
    """从 WAV 文件提取原始歌词"""
    try:
        audio = WAVE(file_path)
        
        # 检查是否有标签
        if not audio.tags:
            return None
        
        # WAV 文件可能使用 ID3v2 标签存储歌词
        # 查找 USLT（非同步歌词文本）帧
        for tag in audio.tags.keys():
            if tag.startswith('USLT'):
                lyrics_text = str(audio.tags[tag])
                if lyrics_text and lyrics_text.strip():
                    return lyrics_text
        
        # 如果没有找到 USLT，尝试查找其他可能的歌词标签
        lyrics_keys = ['lyrics', 'LYRICS', 'Lyrics', 'UNSYNCED LYRICS']
        for key in lyrics_keys:
            if key in audio.tags:
                lyrics_text = audio.tags[key][0]
                if lyrics_text and lyrics_text.strip():
                    return lyrics_text
        
        return None
        
    except Exception as e:
        # WAV 文件可能没有标签或标签格式不支持
        return None

def format_file_size(size_bytes):
    """格式化文件大小显示"""
    if size_bytes >= 1024 * 1024:
        return f"{size_bytes / (1024 * 1024):.1f} MB"
    elif size_bytes >= 1024:
        return f"{size_bytes / 1024:.1f} KB"
    else:
        return f"{size_bytes} B"

def main():
    music_dir = Path.home() / 'Music'
    lyrics_base_dir = Path.home() / '.lyrics'
    
    # 创建基础歌词目录
    lyrics_base_dir.mkdir(exist_ok=True)
    
    # 支持的文件格式
    supported_formats = [
        '.mp3', '.MP3', 
        '.flac', '.FLAC', 
        '.m4a', '.M4A', 
        '.mp4', '.MP4',
        '.wav', '.WAV', 
        '.wave', '.WAVE'
    ]
    
    total_files = 0
    extracted_lyrics = 0
    skipped_files = 0
    format_stats = {}
    
    print(f"🎵 原始歌词提取工具")
    print(f"📁 扫描目录: {music_dir}")
    print(f"💾 保存格式: .lrc (与源文件同名同目录，内容完全一致)")
    print("=" * 60)
    
    # 遍历音乐文件
    for format in supported_formats:
        format_count = 0
        format_lyrics = 0
        
        for file_path in music_dir.rglob(f'*{format}'):
            total_files += 1
            format_count += 1
            
            file_size = file_path.stat().st_size
            print(f"\n🎼 处理: {file_path.relative_to(music_dir)} ({format_file_size(file_size)})")
            print(f"  📊 格式: {format.upper()}")
            
            # 直接提取原始歌词，不做任何修改
            raw_lyrics = extract_raw_lyrics(file_path)
            
            if raw_lyrics and raw_lyrics.strip():
                # 创建与源文件相同的目录结构和文件名（仅后缀改为 .lrc）
                relative_path = file_path.relative_to(music_dir)
                lrc_filename = file_path.with_suffix('.lrc').name
                lrc_output_path = lyrics_base_dir / relative_path.parent / lrc_filename
                
                # 确保目标目录存在
                lrc_output_path.parent.mkdir(parents=True, exist_ok=True)
                
                try:
                    # 直接写入原始歌词内容，不做任何修改
                    with open(lrc_output_path, 'w', encoding='utf-8') as f:
                        f.write(raw_lyrics)
                    extracted_lyrics += 1
                    format_lyrics += 1
                    print(f"  ✅ 保存原始歌词: {lrc_output_path.relative_to(lyrics_base_dir)}")
                    print(f"  📖 原始内容长度: {len(raw_lyrics)} 字符")
                    print(f"  📍 保存位置: {lrc_output_path}")
                    
                    # 显示前几行内容预览
                    lines = raw_lyrics.split('\n')
                    preview_lines = [line for line in lines if line.strip()][:3]
                    if preview_lines:
                        print(f"  👀 内容预览: {preview_lines[0][:50]}{'...' if len(preview_lines[0]) > 50 else ''}")
                        if len(preview_lines) > 1:
                            for line in preview_lines[1:]:
                                print(f"               {line[:50]}{'...' if len(line) > 50 else ''}")
                    
                except Exception as e:
                    print(f"  ❌ 保存失败: {e}")
                    skipped_files += 1
            else:
                print("  ❌ 未找到歌词")
                skipped_files += 1
            
            print("  " + "-" * 50)
        
        # 记录格式统计
        if format_count > 0:
            format_stats[format] = {'total': format_count, 'lyrics': format_lyrics}
    
    print("=" * 60)
    print("🎉 扫描完成!")
    print(f"📈 总体统计:")
    print(f"  • 总共处理文件: {total_files}")
    print(f"  • 成功提取歌词: {extracted_lyrics}")
    print(f"  • 跳过/失败: {skipped_files}")
    print(f"  • 保存位置: {lyrics_base_dir} (镜像 Music 目录结构)")
    
    # 显示格式统计
    if format_stats:
        print(f"\n📊 格式统计:")
        for format, stats in format_stats.items():
            success_rate = (stats['lyrics'] / stats['total']) * 100 if stats['total'] > 0 else 0
            print(f"  • {format.upper():6} : {stats['total']:3} 文件, {stats['lyrics']:2} 歌词 ({success_rate:.1f}%)")
    
    # 显示提取的文件结构
    if extracted_lyrics > 0:
        print(f"\n📁 歌词文件结构:")
        lrc_files = list(lyrics_base_dir.rglob('*.lrc'))
        for lrc_file in sorted(lrc_files, key=os.path.getmtime, reverse=True)[:6]:
            file_size = lrc_file.stat().st_size
            relative_path = lrc_file.relative_to(lyrics_base_dir)
            print(f"  • {relative_path} ({format_file_size(file_size)})")
        
        # 显示文件大小统计
        total_size = sum(f.stat().st_size for f in lrc_files)
        print(f"\n💾 LRC 文件总大小: {format_file_size(total_size)}")
        
        # 显示目录统计
        unique_dirs = len(set(f.parent for f in lrc_files))
        print(f"📂 涉及目录: {unique_dirs} 个")
    
    # 提示信息
    if total_files == 0:
        print(f"\n⚠️  警告: 在 {music_dir} 中没有找到支持的音乐文件")
        print(f"   支持格式: {', '.join([f.upper() for f in supported_formats])}")

if __name__ == "__main__":
    main()
