2025-06-20 22:29:24 +08:00

146 lines
5.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
from loguru import logger
from ReadOpt import parse_music_xml, level_name
from config import streaming_assets
# 根目录
def search_music_by_id(search_id):
for asset_dir in os.listdir(streaming_assets):
root_dir = os.path.join(streaming_assets, asset_dir)
rd = os.path.join(streaming_assets, "A000")
music_dir = os.path.join(root_dir, "music")
if not os.path.isdir(music_dir):
continue
for music_subdir in os.listdir(music_dir):
sub_path = os.path.join(music_dir, music_subdir)
music_xml_path = os.path.join(sub_path, "Music.xml")
if not os.path.isfile(music_xml_path):
continue
music_id, name, artist, notes,version_name = parse_music_xml(music_xml_path)
if music_id == search_id:
logger.info(f"\n【找到曲目:{name}")
logger.info(f" ID{music_id}")
logger.info(f" 艺术家:{artist}")
logger.info(f" 所在分区:{asset_dir}")
logger.info(" 谱面信息:")
for i, note in enumerate(notes):
level_str = level_name[i] if i < len(level_name) else f"Diff{i}"
logger.info(f" - {level_str}: 定数 {note['level']} / 显示 {note['levelshow']} / 谱师 {note['designer']}")
# ma2 文件
ma2_files = [f for f in os.listdir(sub_path) if f.endswith(".ma2")]
ma2_paths = [os.path.join(sub_path, f) for f in ma2_files]
ma2_paths.sort()
if ma2_files:
logger.info(" MA2 文件:")
for f in ma2_files:
logger.info(f" - {os.path.join(sub_path, f)}")
else:
logger.warning(" MA2 文件:未找到")
# 曲绘(查 jacket 文件夹)
jacket_dir = os.path.join(rd, "AssetBundleImages", "jacket")
music_num = int(music_id)
if music_num >= 100000:
jacket_ab = f"ui_jacket_{(music_num-100000) - 10000:06d}.ab"
elif music_num >= 10000:
jacket_ab = f"ui_jacket_{music_num - 10000:06d}.ab"
else:
jacket_ab = f"ui_jacket_{music_num:06d}.ab"
alt_exts = [".png", ".jpg", ".jpeg"]
alt_jacket = next((f for f in os.listdir(jacket_dir)
if f.startswith(f"ui_jacket_{music_id}")
and os.path.splitext(f)[1].lower() in alt_exts), None)
logger.info(" 曲绘文件:")
if os.path.exists(os.path.join(jacket_dir, jacket_ab)):
logger.info(f" - {os.path.join(jacket_dir, jacket_ab)}")
elif alt_jacket:
logger.info(f" - {os.path.join(jacket_dir, alt_jacket)}")
else:
logger.warning(" - 未找到")
# 音频文件SoundData
sound_dir = os.path.join(rd, "SoundData")
music_num = int(music_id)
if music_num >= 100000:
audio_prefix = f"music{(music_num-100000) - 10000:06d}"
elif music_num >= 10000:
audio_prefix = f"music{music_num - 10000:06d}"
else:
audio_prefix = f"music{music_num:06d}"
audio_files = [f for f in os.listdir(sound_dir) if f.lower().startswith(audio_prefix)]
logger.info(" 音频文件:")
if audio_files:
for f in audio_files:
logger.info(f" - {os.path.join(sound_dir, f)}")
else:
logger.warning(" - 未找到")
audio_lists = []
for f in audio_files:
audio_lists.append(os.path.join(sound_dir, f))
# 视频 dat 文件MovieData
movie_dir = os.path.join(rd, "MovieData")
music_num = int(music_id)
if music_num >= 100000:
dat_name = f"{(music_num-100000) - 10000:06d}.dat"
elif music_num >= 10000:
dat_name = f"{music_num - 10000:06d}.dat"
else:
dat_name = f"{music_num:06d}.dat"
dat_path = os.path.join(movie_dir, dat_name)
logger.info(" 视频 DAT 文件:")
logger.info(f" - {dat_path}" if os.path.exists(dat_path) else " - 未找到")
return [[music_id, name, artist,notes],ma2_paths,os.path.join(jacket_dir, jacket_ab),audio_lists,dat_path,version_name]
logger.error(f"\n未找到 ID 为 {search_id} 的曲目信息。")
return None
def list_all_music():
music_list = []
for asset_dir in os.listdir(streaming_assets):
root_dir = os.path.join(streaming_assets, asset_dir)
music_dir = os.path.join(root_dir, "music")
if not os.path.isdir(music_dir):
continue
for music_subdir in os.listdir(music_dir):
sub_path = os.path.join(music_dir, music_subdir)
music_xml_path = os.path.join(sub_path, "Music.xml")
if not os.path.isfile(music_xml_path):
continue
music_id, name, artist, notes, version_name = parse_music_xml(music_xml_path)
music_list.append({
"id": music_id,
"name": name,
"artist": artist,
"version": version_name
})
return music_list
if __name__ == "__main__":
target_id = input("请输入要搜索的曲目 ID").strip()
result = search_music_by_id(target_id)
logger.info(result)