mirror of
https://gitea.cookies.4d.ink/Cookies/CookiesChartConverter.git
synced 2025-10-26 03:02:39 +00:00
146 lines
5.8 KiB
Python
146 lines
5.8 KiB
Python
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)
|
||
|
||
|
||
|
||
|