From a4d253e1038d84c96126a56517119f2e5423f890 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 18 Aug 2026 22:37:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(reorganize):=20=E5=88=87=E6=8D=A2=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E6=97=B6=E6=95=B0=E6=8D=AE=E6=BA=90=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=9B=9E=E9=80=80=E8=87=AA=E5=8A=A8=E5=B9=B6=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E5=AA=92=E4=BD=93ID=E8=BE=93=E5=85=A5=E6=A1=86=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85=20mediaId=20=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dialog/ReorganizeDialog.vue | 18 +++++++---- .../dialog/__tests__/ReorganizeDialog.spec.ts | 32 +++++++++++++++++++ src/locales/en-US.ts | 1 + src/locales/zh-CN.ts | 1 + src/locales/zh-TW.ts | 1 + 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/components/dialog/ReorganizeDialog.vue b/src/components/dialog/ReorganizeDialog.vue index 830a6535..617d578b 100644 --- a/src/components/dialog/ReorganizeDialog.vue +++ b/src/components/dialog/ReorganizeDialog.vue @@ -489,14 +489,17 @@ watch([() => transferForm.type_name, () => mediaSource.value], ([typeName, sourc episodeGroups.value = [] }) -// 音乐默认使用 MusicBrainz;已显式选择其它音乐源时保留用户选择。 +// 切换媒体类型时,若当前数据源与新类型不兼容则回退到自动, +// 避免音乐源在影视整理中残留;音乐类型未显式选择来源时由 mediaSource 兜底为 MusicBrainz。 watch( () => transferForm.type_name, typeName => { - if (typeName === '音乐' && !isMusicMediaSource(transferForm.media_source ?? undefined)) { - transferForm.media_source = 'musicbrainz' + const isMusicType = typeName === '音乐' + const sourceIsMusic = isMusicMediaSource(transferForm.media_source ?? undefined) + if (isMusicType !== sourceIsMusic) { + transferForm.media_source = null } - transferForm.music_type = typeName === '音乐' ? (transferForm.music_type ?? 'recording') : null + transferForm.music_type = isMusicType ? (transferForm.music_type ?? 'recording') : null }, ) @@ -1519,10 +1522,13 @@ onUnmounted(() => { prepend-inner-icon="mdi-music-box-multiple" /> - + { expect(screen.getByLabelText('数据源')).toHaveDisplayValue('自动') }) + it('resets the data source to auto and hides the media id input after switching media type', async () => { + await renderDialog() + + // 类型为自动时隐藏媒体ID输入框 + expect(screen.queryByLabelText('TheMovieDb编号')).not.toBeInTheDocument() + + // 切换到音乐:显示媒体ID输入框,数据源保持自动(音乐由媒体ID标签兜底为 MusicBrainz) + await selectOption('类型', 3) + await waitFor(() => expect(screen.getByLabelText('MusicBrainz ID')).toBeInTheDocument()) + expect(screen.getByLabelText('数据源')).toHaveDisplayValue('自动') + + // 切回电影:数据源自动回退为自动,媒体ID输入框随类型重新显示 + await selectOption('类型', 1) + await waitFor(() => expect(screen.getByLabelText('TheMovieDb编号')).toBeInTheDocument()) + expect(screen.getByLabelText('数据源')).toHaveDisplayValue('自动') + }) + + it('resets a stale music source back to auto when switching away from music type', async () => { + await renderDialog() + + // 先手动选择音乐源(触发类型联动为音乐) + await selectOption('数据源', 5) + await waitFor(() => expect(screen.getByLabelText('类型')).toHaveDisplayValue('音乐')) + + // 切回电影后,音乐源不应残留 + await selectOption('类型', 1) + await waitFor(() => expect(screen.getByLabelText('数据源')).toHaveDisplayValue('自动')) + expect(screen.getByLabelText('类型')).toHaveDisplayValue('电影') + }) + it('deduplicates selected files and submits nullable automatic target fields in one background request', async () => { const bodies: unknown[] = [] const backgrounds: string[] = [] @@ -702,6 +732,8 @@ describe('ReorganizeDialog payloads and lifecycle', () => { const user = userEvent.setup() await renderDialog() + // 类型为自动时媒体ID输入框隐藏,先选择类型再查询媒体编号 + await selectOption('类型', 2) await user.click(screen.getByRole('button', { name: '查询媒体编号' })) await user.click(screen.getByRole('button', { name: '选择电视剧' })) await waitFor(() => expect(screen.getByRole('option', { name: '播出顺序' })).toBeInTheDocument()) diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index 98b14cb4..24e98b53 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -3345,6 +3345,7 @@ export default { doubanId: 'Douban ID', bangumiId: 'Bangumi ID', anilistId: 'AniList ID', + mediaId: 'Media ID', mediaIdHint: 'Query media ID by name, leave empty for auto recognition', mediaIdPlaceholder: 'Leave empty for auto recognition', mediaIdInvalid: 'Invalid media ID format', diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 1901651e..acd31906 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -3289,6 +3289,7 @@ export default { doubanId: '豆瓣编号', bangumiId: 'Bangumi编号', anilistId: 'AniList编号', + mediaId: '媒体 ID', mediaIdHint: '按名称查询媒体编号,留空自动识别', mediaIdPlaceholder: '留空自动识别', mediaIdInvalid: '媒体ID格式无效', diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts index e3598c68..d14e754f 100644 --- a/src/locales/zh-TW.ts +++ b/src/locales/zh-TW.ts @@ -3287,6 +3287,7 @@ export default { doubanId: '豆瓣編號', bangumiId: 'Bangumi編號', anilistId: 'AniList編號', + mediaId: '媒體 ID', mediaIdHint: '按名稱查詢媒體編號,留空自動識別', mediaIdPlaceholder: '留空自動識別', mediaIdInvalid: '媒體ID格式無效',