(
- ['themoviedb', 'douban', 'bangumi', 'anilist'].includes(globalSettings.RECOGNIZE_SOURCE)
- ? globalSettings.RECOGNIZE_SOURCE
- : 'themoviedb',
-)
-
-// 输入参数
const props = defineProps({
title: String,
media: Object as PropType,
torrent: Object as PropType,
})
+// 可选的媒体数据源
+const SUPPORTED_MEDIA_SOURCES: MediaDataSource[] = ['themoviedb', 'douban', 'bangumi', 'anilist', 'musicbrainz']
+
+// 当前识别类型:优先使用媒体自身的数据源,否则使用全局识别来源
+const mediaSource = computed(() => {
+ const source = props.media?.source as MediaDataSource | undefined
+ if (source && SUPPORTED_MEDIA_SOURCES.includes(source)) return source
+ if (SUPPORTED_MEDIA_SOURCES.includes(globalSettings.RECOGNIZE_SOURCE as MediaDataSource)) {
+ return globalSettings.RECOGNIZE_SOURCE as MediaDataSource
+ }
+ return 'themoviedb'
+})
+
// 定义成功和失败事件
const emit = defineEmits(['done', 'error', 'close'])
@@ -65,6 +71,17 @@ const showAdvancedOptions = ref(false)
// 当前数据源的原生媒体ID
const mediaId = ref(undefined)
+// 音乐媒体自带 MusicBrainz ID,打开对话框时预填到高级选项中辅助识别
+watch(
+ () => props.media,
+ media => {
+ if (media && media.source === 'musicbrainz' && media.media_id) {
+ mediaId.value = media.media_id
+ }
+ },
+ { immediate: true },
+)
+
// 当前数据源对应的原生ID标签。
const mediaIdLabel = computed(() => {
const labels: Record = {
@@ -302,7 +319,7 @@ onMounted(() => {
v-model="mediaId"
:label="mediaIdLabel"
:placeholder="t('dialog.reorganize.mediaIdPlaceholder')"
- :rules="[numberValidator]"
+ :rules="[(value: any) => isValidMediaSourceId(value, mediaSource.value) || t('dialog.reorganize.mediaIdInvalid')]"
append-inner-icon="mdi-magnify"
:hint="t('dialog.reorganize.mediaIdHint')"
persistent-hint
diff --git a/src/views/discover/MusicDetailLayout.vue b/src/views/discover/MusicDetailLayout.vue
index bcb59eb5..d322988d 100644
--- a/src/views/discover/MusicDetailLayout.vue
+++ b/src/views/discover/MusicDetailLayout.vue
@@ -98,18 +98,17 @@ watch(