From df1e75caa5ecc7b5d11aa4bf29a78a03efa6954c Mon Sep 17 00:00:00 2001 From: Megghy Date: Fri, 19 Apr 2024 00:56:33 +0800 Subject: [PATCH] allow custom song language --- src/api/api-models.ts | 2 +- src/components/SongList.vue | 40 +++++++++++++++++---- src/views/manage/SettingsManageView.vue | 10 +++--- src/views/manage/SongListManageView.vue | 48 ++++++++++++------------- 4 files changed, 62 insertions(+), 38 deletions(-) diff --git a/src/api/api-models.ts b/src/api/api-models.ts index e0fb3b7..954b8b6 100644 --- a/src/api/api-models.ts +++ b/src/api/api-models.ts @@ -276,7 +276,7 @@ export interface SongsInfo { author: string[] url: string from: SongFrom - language: SongLanguage[] + language: string[] description?: string tags?: string[] createTime: number diff --git a/src/components/SongList.vue b/src/components/SongList.vue index 7c74004..8359e45 100644 --- a/src/components/SongList.vue +++ b/src/components/SongList.vue @@ -80,7 +80,7 @@ const debouncedInput = refDebounced(searchMusicKeyword, 500) const batchUpdate_Author = ref([]) const batchUpdate_Tag = ref([]) -const batchUpdate_Language = ref([]) +const batchUpdate_Language = ref([]) const batchUpdate_Option = ref() const playingSong = ref() @@ -127,6 +127,18 @@ const songSelectOption = [ value: SongLanguage.Other, }, ] +const languageSelectOption = computed(() => { + const languages = new Set(songSelectOption.map((s) => s.label)) + songsInternal.value.forEach((s) => { + if (s.language) { + s.language.forEach((l) => languages.add(l)) + } + }) + return [...languages].map((t) => ({ + label: t, + value: t, + })) +}) const tagsSelectOption = computed(() => { return new List(songsInternal.value) .SelectMany((s) => new List(s?.tags)) @@ -204,14 +216,12 @@ function createColumns(): DataTableColumns { resizable: true, filterOptions: songSelectOption, filter(value, row) { - return (row.language?.findIndex((t) => t == (value.toString() as unknown as SongLanguage)) ?? -1) > -1 + return (row.language?.findIndex((t) => t == value) ?? -1) > -1 }, render(data) { return (data.language?.length ?? 0) > 0 ? h(NSpace, { size: 5 }, () => - data.language?.map((a) => - h(NTag, { bordered: false, size: 'small' }, () => songSelectOption.find((s) => s.value == a)?.label), - ), + data.language?.map((a) => h(NTag, { bordered: false, size: 'small' }, () => a)), ) : null }, @@ -705,7 +715,15 @@ onMounted(() => { /> - + { 更新 - + 更新 diff --git a/src/views/manage/SettingsManageView.vue b/src/views/manage/SettingsManageView.vue index cc4bf7b..6e4c170 100644 --- a/src/views/manage/SettingsManageView.vue +++ b/src/views/manage/SettingsManageView.vue @@ -155,7 +155,7 @@ const templates = ref({ description: '这是一段描述', url: 'https://example.com/song1.mp3', from: SongFrom.Custom, - language: [SongLanguage.Chinese], + language: ['中文'], createTime: Date.now(), updateTime: Date.now(), }, @@ -167,7 +167,7 @@ const templates = ref({ tags: ['标签1', '标签2'], url: 'https://example.com/song2.mp3', from: SongFrom.Custom, - language: [SongLanguage.Chinese], + language: ['中文'], createTime: Date.now(), updateTime: Date.now(), description: '这还是一段描述', @@ -186,7 +186,7 @@ const templates = ref({ url: 'https://example.com/song3.mp3', from: SongFrom.Custom, description: '这是一段很长很长很长很长很长很长很长很长很长很长的描述', - language: [SongLanguage.Chinese], + language: ['中文'], createTime: Date.now(), updateTime: Date.now(), }, @@ -197,7 +197,7 @@ const templates = ref({ author: ['作者4'], url: 'https://example.com/song4.mp3', from: SongFrom.Custom, - language: [SongLanguage.Chinese], + language: ['中文'], createTime: Date.now(), updateTime: Date.now(), }, @@ -209,7 +209,7 @@ const templates = ref({ tags: ['标签1', '标签5', '标签6', '标签7', '标签8', '标签9', '标签10'], url: 'https://example.com/song5.mp3', from: SongFrom.Custom, - language: [SongLanguage.Chinese], + language: ['中文'], createTime: Date.now(), updateTime: Date.now(), }, diff --git a/src/views/manage/SongListManageView.vue b/src/views/manage/SongListManageView.vue index 9aa148a..a184eee 100644 --- a/src/views/manage/SongListManageView.vue +++ b/src/views/manage/SongListManageView.vue @@ -152,7 +152,18 @@ const songSelectOption = [ value: SongLanguage.Other, }, ] - +const languageSelectOption = computed(() => { + const languages = new Set(songSelectOption.map((s) => s.label)) + songs.value.forEach((s) => { + if (s.language) { + s.language.forEach((l) => languages.add(l)) + } + }) + return [...languages].map((t) => ({ + label: t, + value: t, + })) +}) const uploadFiles = ref([]) const uploadSongsFromFile = ref([]) const uploadSongsOptions = computed(() => { @@ -424,7 +435,7 @@ function exportData() { 更新于: format(s.updateTime, 'yyyy-MM-dd HH:mm:ss'), 描述: s.description, 来自: from(s.from), - 语言: s.language.map((l) => songSelectOption.find((o) => o.value == l)?.label).join(','), + 语言: s.language.join(','), 标签: s.tags?.join(',') ?? '', 链接: s.url, })), @@ -500,28 +511,12 @@ function parseExcelFile() { break case 'language': case '语言': - switch (value) { - case '中文': - case '汉语': - song.language = [SongLanguage.Chinese] - break - case '英文': - case '英语': - song.language = [SongLanguage.English] - break - case '日文': - case '日语': - song.language = [SongLanguage.Japanese] - break - case '法语': - song.language = [SongLanguage.French] - break - case '西语': - song.language = [SongLanguage.Spanish] - break - default: - song.language = [SongLanguage.Other] - } + song.language = value + ?.replace('/', '/') + .replace(',', ',') + .split(/\/|,/) + .map((a: string) => a.trim()) + .filter((value: string, index: number, self: string[]) => self.indexOf(value) === index) break case 'tags': case 'tag': @@ -643,9 +638,12 @@ onMounted(async () => {