Skip to content

Commit 9b075ce

Browse files
siakinnikclansty
andauthored
feat: add option to export Maidata using MusicID naming (#43) (#56)
* feat: add option to export Maidata using MusicID naming (#43) - Added ConvertToMaidataById to OPTIONS enum. - Implemented naming logic in remoteExport to support numeric IDs. - Added a new Radio button in BatchAction UI. This resolves #43 by providing a safe naming alternative that avoids filesystem issues with special characters in song titles. * fix: address AI code review feedback * chore: remove accidental .sln file * fix: add i18n key for ConvertToMaidataById option * refactor: move ID naming check before title computation in getMaidataExportDir --------- Co-authored-by: Clansty <i@gao4.pw>
1 parent f7a3a88 commit 9b075ce

5 files changed

Lines changed: 20 additions & 3 deletions

File tree

MaiChartManager/Front/src/locales/en.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ music:
153153
exportPreserveFormat: Export as Opt (Preserve Format, Remove Events)
154154
exportMa2Format: Export as Opt (Ma2 103 Format, Remove Events)
155155
convertToMaidata: Convert to Maidata
156+
convertToMaidataById: Convert to Maidata (MusicID Naming)
156157
convertToMaidataNoVideo: Convert to Maidata (No BGA)
157158
subdirOption:
158159
none: Flat

MaiChartManager/Front/src/locales/zh-TW.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ music:
146146
exportPreserveFormat: 匯出為 Opt(保持譜面格式,移除 Event 等)
147147
exportMa2Format: 匯出為 Opt(Ma2 103 格式,移除 Event 等)
148148
convertToMaidata: 轉換為 Maidata
149+
convertToMaidataById: 轉換為 Maidata(以 MusicID 命名)
149150
convertToMaidataNoVideo: 轉換為 Maidata(無 BGA)
150151
subdirOption:
151152
none: 平鋪資料夾

MaiChartManager/Front/src/locales/zh.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ music:
146146
exportPreserveFormat: 导出为 Opt(保持谱面格式,移除 Event 等)
147147
exportMa2Format: 导出为 Opt(Ma2 103 格式,移除 Event 等)
148148
convertToMaidata: 转换为 Maidata
149+
convertToMaidataById: 转换为 Maidata(以 MusicID 命名)
149150
convertToMaidataNoVideo: 转换为 Maidata(无 BGA)
150151
subdirOption:
151152
none: 平铺文件夹

MaiChartManager/Front/src/views/BatchAction/ChooseAction.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export enum OPTIONS {
1818
ConvertToMaidata,
1919
ConvertToMaidataIgnoreVideo,
2020
CreateNewOptMa2_103,
21+
ConvertToMaidataById,
2122
}
2223

2324
export enum MAIDATA_SUBDIR {
@@ -65,6 +66,7 @@ export default defineComponent({
6566
addToast({message: t('music.batch.exportSuccess'), type: 'success'});
6667
break;
6768
}
69+
case OPTIONS.ConvertToMaidataById:
6870
case OPTIONS.ConvertToMaidata:
6971
case OPTIONS.ConvertToMaidataIgnoreVideo:
7072
if (version.value?.license !== 'Active') {
@@ -120,12 +122,15 @@ export default defineComponent({
120122
<Radio k={OPTIONS.ConvertToMaidata} v-model:value={selectedOption.value}>
121123
{t('music.batch.convertToMaidata')}
122124
</Radio>
125+
<Radio k={OPTIONS.ConvertToMaidataById} v-model:value={selectedOption.value}>
126+
{t('music.batch.convertToMaidataById')}
127+
</Radio>
123128
<Radio k={OPTIONS.ConvertToMaidataIgnoreVideo} v-model:value={selectedOption.value}>
124129
{t('music.batch.convertToMaidataNoVideo')}
125130
</Radio>
126131

127132
<TransitionVertical>
128-
{(selectedOption.value === OPTIONS.ConvertToMaidata || selectedOption.value === OPTIONS.ConvertToMaidataIgnoreVideo) &&
133+
{(selectedOption.value === OPTIONS.ConvertToMaidata || selectedOption.value === OPTIONS.ConvertToMaidataIgnoreVideo || selectedOption.value === OPTIONS.ConvertToMaidataById) &&
129134
<Select v-model:value={selectedMaidataSubdir.value} options={[{label: t('music.batch.subdirOption.none'), value: MAIDATA_SUBDIR.None}, {label: t('music.batch.subdirOption.genre'), value: MAIDATA_SUBDIR.Genre}, {label: t('music.batch.subdirOption.version'), value: MAIDATA_SUBDIR.Version}]}/>}
130135
</TransitionVertical>
131136
</div>

MaiChartManager/Front/src/views/BatchAction/remoteExport.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ export default async (
5454
parentDir = sanitizeFsSegment(parentDir, t("music.list.unknown"));
5555
}
5656

57+
if (action === OPTIONS.ConvertToMaidataById) {
58+
return parentDir ? `${parentDir}/${music.id}` : `${music.id}`;
59+
}
60+
5761
const suffix = music.id! > 1e4 && music.id! < 2e4 ? " [DX]" : "";
5862
const safeTitle = sanitizeFsSegment(
5963
music.name || t("music.list.unknown"),
@@ -81,6 +85,8 @@ export default async (
8185
return `ExportAsMaidataApi/${music.assetDir}/${music.id}`;
8286
case OPTIONS.ConvertToMaidataIgnoreVideo:
8387
return `ExportAsMaidataApi/${music.assetDir}/${music.id}?ignoreVideo=true`;
88+
case OPTIONS.ConvertToMaidataById:
89+
return `ExportAsMaidataApi/${music.assetDir}/${music.id}`;
8490
default:
8591
throw new Error(`Unsupported export action: ${action}`);
8692
}
@@ -94,6 +100,8 @@ export default async (
94100
return Math.max(1, Math.floor(cpuThreads / 4));
95101
case OPTIONS.ConvertToMaidataIgnoreVideo:
96102
return Math.max(1, Math.floor(cpuThreads / 3));
103+
case OPTIONS.ConvertToMaidataById:
104+
return Math.max(1, Math.floor(cpuThreads / 4));
97105
default:
98106
return Math.max(1, Math.floor(cpuThreads / 2));
99107
}
@@ -105,7 +113,8 @@ export default async (
105113

106114
const maidataRootDir =
107115
action === OPTIONS.ConvertToMaidata ||
108-
action === OPTIONS.ConvertToMaidataIgnoreVideo
116+
action === OPTIONS.ConvertToMaidataIgnoreVideo ||
117+
action === OPTIONS.ConvertToMaidataById
109118
? getMaidataExportDir(music)
110119
: "";
111120

@@ -189,7 +198,7 @@ export default async (
189198

190199
try {
191200
await Promise.all(Array.from({ length: workerCount }, () => worker()));
192-
addToast({message: t('music.batch.exportSuccess'), type: 'success'});
201+
addToast({ message: t('music.batch.exportSuccess'), type: 'success' });
193202
}
194203
catch (e) {
195204
console.error(e);

0 commit comments

Comments
 (0)