From 329c6b26bd8b866278637d43bdba6030a094a738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Mon, 23 Sep 2024 02:18:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E6=AD=8C=E6=9B=B2?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_music_tags.py | 6 +++++- xiaomusic/utils.py | 42 ++++++++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/test/test_music_tags.py b/test/test_music_tags.py index 7ce4edf..97016de 100644 --- a/test/test_music_tags.py +++ b/test/test_music_tags.py @@ -21,8 +21,9 @@ async def test_one_music(filename): # 获取播放时长 try: metadata = get_audio_metadata(filename) + print(metadata.title, metadata.album) if metadata: - lyrics = metadata.get("lyrics") + lyrics = metadata.lyrics if lyrics: print(f"歌曲 : {filename} 的 {lyrics}") except Exception as e: @@ -37,6 +38,9 @@ async def main(directory): for _, files in local_musics.items(): for file in files: await test_one_music(file) + pass + + await test_one_music("./music/一生何求.mp3") if __name__ == "__main__": diff --git a/xiaomusic/utils.py b/xiaomusic/utils.py index ab563cf..942951f 100644 --- a/xiaomusic/utils.py +++ b/xiaomusic/utils.py @@ -491,20 +491,20 @@ def chinese_to_number(chinese): def get_audio_metadata(file_path): + ret = Metadata() if file_path.endswith(".mp3"): - return get_mp3_metadata(file_path) + ret = get_mp3_metadata(file_path) elif file_path.endswith(".flac"): - return get_flac_metadata(file_path) + ret = get_flac_metadata(file_path) elif file_path.endswith(".wav"): - return get_wav_metadata(file_path) + ret = get_wav_metadata(file_path) elif file_path.endswith(".ape"): - return get_ape_metadata(file_path) + ret = get_ape_metadata(file_path) elif file_path.endswith(".ogg"): - return get_ogg_metadata(file_path) + ret = get_ogg_metadata(file_path) elif file_path.endswith(".m4a"): - return get_m4a_metadata(file_path) - else: - raise ValueError("Unsupported file type") + ret = get_m4a_metadata(file_path) + return ret @dataclass @@ -524,12 +524,28 @@ def get_mp3_metadata(file_path): if tags is None: return Metadata() + # 处理编码 + def get_tag_value(tags, k): + if k not in tags: + return "" + v = tags[k] + if isinstance(v, mutagen.id3.TextFrame) and not isinstance( + v, mutagen.id3.TimeStampTextFrame + ): + old_ts = "".join(v.text) + if v.encoding == mutagen.id3.Encoding.LATIN1: + bs = old_ts.encode("latin1") + ts = bs.decode("GBK", errors="ignore") + return ts + return old_ts + return v + metadata = Metadata( - title=tags.get("TIT2", [""])[0] if "TIT2" in tags else "", - artist=tags.get("TPE1", [""])[0] if "TPE1" in tags else "", - album=tags.get("TALB", [""])[0] if "TALB" in tags else "", - year=tags.get("TDRC", [""])[0] if "TDRC" in tags else "", - genre=tags.get("TCON", [""])[0] if "TCON" in tags else "", + title=get_tag_value(tags, "TIT2"), + artist=get_tag_value(tags, "TPE1"), + album=get_tag_value(tags, "TALB"), + year=get_tag_value(tags, "TDRC"), + genre=get_tag_value(tags, "TCON"), ) for tag in tags.values():