import os from loguru import logger from ReadOpt import parse_music_xml, level_name # 根目录 streaming_assets = "/Users/bennett/Downloads/SDEZ/Package/Sinmai_Data/StreamingAssets" 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)