From 6f064c1399e3145045284991ec8f3f9ab2086786 Mon Sep 17 00:00:00 2001 From: nullptr-0 <959220793@qq.com> Date: Tue, 29 Aug 2023 13:38:09 +0800 Subject: [PATCH] always use multiple artists in meta --- src/component/PreviewTable.vue | 2 +- src/decrypt/__test__/joox.test.ts | 2 +- src/decrypt/entity.ts | 2 +- src/decrypt/kgm.ts | 2 +- src/decrypt/kwm.ts | 2 +- src/decrypt/ncm.ts | 3 +-- src/decrypt/ncmcache.ts | 2 +- src/decrypt/qmccache.ts | 2 +- src/decrypt/raw.ts | 2 +- src/decrypt/utils.ts | 6 +++--- src/decrypt/ximalaya.ts | 2 +- src/decrypt/xm.ts | 2 +- src/utils/qm_meta.ts | 15 ++++++++------- src/view/Home.vue | 9 ++++++--- 14 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/component/PreviewTable.vue b/src/component/PreviewTable.vue index 64cdf1f..a7d8f3c 100644 --- a/src/component/PreviewTable.vue +++ b/src/component/PreviewTable.vue @@ -14,7 +14,7 @@ diff --git a/src/decrypt/__test__/joox.test.ts b/src/decrypt/__test__/joox.test.ts index 3960549..b7d176f 100644 --- a/src/decrypt/__test__/joox.test.ts +++ b/src/decrypt/__test__/joox.test.ts @@ -21,7 +21,7 @@ describe('decrypt/joox', () => { title: 'unused', album: 'unused', blob: blob, - artist: 'unused', + artist: ['unused'], imgUrl: 'https://example.unlock-music.dev/', }; }); diff --git a/src/decrypt/entity.ts b/src/decrypt/entity.ts index f2f6831..d53790d 100644 --- a/src/decrypt/entity.ts +++ b/src/decrypt/entity.ts @@ -1,7 +1,7 @@ export interface DecryptResult { title: string; album?: string; - artist?: string; + artist?: string[]; mime: string; ext: string; diff --git a/src/decrypt/kgm.ts b/src/decrypt/kgm.ts index b6553c9..34edb92 100644 --- a/src/decrypt/kgm.ts +++ b/src/decrypt/kgm.ts @@ -43,7 +43,7 @@ export async function Decrypt(file: File, raw_filename: string, raw_ext: string) const mime = AudioMimeType[ext]; let musicBlob = new Blob([musicDecoded], { type: mime }); const musicMeta = await metaParseBlob(musicBlob); - const { title, artist } = GetMetaFromFile(raw_filename, musicMeta.common.title, String(musicMeta.common.artists || musicMeta.common.artist || "")); + const { title, artist } = GetMetaFromFile(raw_filename, musicMeta.common.title, musicMeta.common.artists || [musicMeta.common.artist || ""]); return { album: musicMeta.common.album, picture: GetCoverFromFile(musicMeta), diff --git a/src/decrypt/kwm.ts b/src/decrypt/kwm.ts index 32d4936..587fd2f 100644 --- a/src/decrypt/kwm.ts +++ b/src/decrypt/kwm.ts @@ -42,7 +42,7 @@ export async function Decrypt(file: File, raw_filename: string, _: string): Prom let musicBlob = new Blob([audioData], { type: mime }); const musicMeta = await metaParseBlob(musicBlob); - const { title, artist } = GetMetaFromFile(raw_filename, musicMeta.common.title, String(musicMeta.common.artists || musicMeta.common.artist || "")); + const { title, artist } = GetMetaFromFile(raw_filename, musicMeta.common.title, musicMeta.common.artists || [musicMeta.common.artist || ""]); return { album: musicMeta.common.album, picture: GetCoverFromFile(musicMeta), diff --git a/src/decrypt/ncm.ts b/src/decrypt/ncm.ts index e075cf1..dfc8fd3 100644 --- a/src/decrypt/ncm.ts +++ b/src/decrypt/ncm.ts @@ -175,7 +175,6 @@ class NcmDecrypt { if (artists.length === 0 && info.artist) { artists = info.artist - .split(',') .map((val) => val.trim()) .filter((val) => val != ''); } @@ -219,7 +218,7 @@ class NcmDecrypt { if (!this.newMeta || !this.blob) throw Error('bad sequence'); return { title: this.newMeta.title, - artist: this.newMeta.artists?.join('; '), + artist: this.newMeta.artists, ext: this.format, album: this.newMeta.album, picture: this.image?.url, diff --git a/src/decrypt/ncmcache.ts b/src/decrypt/ncmcache.ts index f6ef63f..c56c43c 100644 --- a/src/decrypt/ncmcache.ts +++ b/src/decrypt/ncmcache.ts @@ -13,7 +13,7 @@ export async function Decrypt(file: Blob, raw_filename: string, raw_ext: string) const ext = SniffAudioExt(buffer, raw_ext); if (ext !== raw_ext) file = new Blob([buffer], { type: AudioMimeType[ext] }); const tag = await metaParseBlob(file); - const { title, artist } = GetMetaFromFile(raw_filename, tag.common.title, String(tag.common.artists || tag.common.artist || "")); + const { title, artist } = GetMetaFromFile(raw_filename, tag.common.title, tag.common.artists || [tag.common.artist || ""]); return { title, diff --git a/src/decrypt/qmccache.ts b/src/decrypt/qmccache.ts index 0b6582b..1191b39 100644 --- a/src/decrypt/qmccache.ts +++ b/src/decrypt/qmccache.ts @@ -43,7 +43,7 @@ export async function Decrypt(file: Blob, raw_filename: string, raw_ext: string) throw '不支持的QQ音乐缓存格式'; } const tag = await metaParseBlob(audioBlob); - const { title, artist } = GetMetaFromFile(raw_filename, tag.common.title, String(tag.common.artists || tag.common.artist || "")); + const { title, artist } = GetMetaFromFile(raw_filename, tag.common.title, tag.common.artists || [tag.common.artist || ""]); return { title, diff --git a/src/decrypt/raw.ts b/src/decrypt/raw.ts index 4d2427d..41536c9 100644 --- a/src/decrypt/raw.ts +++ b/src/decrypt/raw.ts @@ -17,7 +17,7 @@ export async function Decrypt( if (ext !== raw_ext) file = new Blob([buffer], { type: AudioMimeType[ext] }); } const tag = await metaParseBlob(file); - const { title, artist } = GetMetaFromFile(raw_filename, tag.common.title, String(tag.common.artists || tag.common.artist || '')); + const { title, artist } = GetMetaFromFile(raw_filename, tag.common.title, tag.common.artists || [tag.common.artist || '']); return { title, diff --git a/src/decrypt/utils.ts b/src/decrypt/utils.ts index 94b7593..ce0032d 100644 --- a/src/decrypt/utils.ts +++ b/src/decrypt/utils.ts @@ -80,13 +80,13 @@ export function GetCoverFromFile(metadata: IAudioMetadata): string { export interface IMusicMetaBasic { title: string; - artist?: string; + artist?: string[]; } export function GetMetaFromFile( filename: string, exist_title?: string, - exist_artist?: string, + exist_artist?: string[], separator = '-', ): IMusicMetaBasic { const meta: IMusicMetaBasic = { title: exist_title ?? '', artist: exist_artist }; @@ -94,7 +94,7 @@ export function GetMetaFromFile( const items = filename.split(separator); if (items.length > 1) { //由文件名和原metadata共同决定歌手tag(有时从文件名看有多个歌手,而metadata只有一个) - if (!meta.artist || meta.artist.split(split_regex).length < items[0].trim().split(split_regex).length) meta.artist = items[0].trim(); + if (!meta.artist || meta.artist.length < items[0].trim().split(split_regex).length) meta.artist = items[0].trim().split(split_regex); if (!meta.title) meta.title = items[1].trim(); } else if (items.length === 1) { if (!meta.title) meta.title = items[0].trim(); diff --git a/src/decrypt/ximalaya.ts b/src/decrypt/ximalaya.ts index e8aedad..e20214a 100644 --- a/src/decrypt/ximalaya.ts +++ b/src/decrypt/ximalaya.ts @@ -20,7 +20,7 @@ export async function Decrypt(file: File, raw_filename: string, raw_ext: string) const musicMeta = await metaParseBlob(musicBlob); - const info = GetMetaFromFile(raw_filename, musicMeta.common.title, musicMeta.common.artist); + const info = GetMetaFromFile(raw_filename, musicMeta.common.title, musicMeta.common.artists || [musicMeta.common.artist || '']); return { picture: '', diff --git a/src/decrypt/xm.ts b/src/decrypt/xm.ts index afa9841..d33dd98 100644 --- a/src/decrypt/xm.ts +++ b/src/decrypt/xm.ts @@ -49,7 +49,7 @@ export async function Decrypt(file: File, raw_filename: string, raw_ext: string) const { title, artist } = GetMetaFromFile( raw_filename, musicMeta.common.title, - String(musicMeta.common.artists || musicMeta.common.artist || ""), + musicMeta.common.artists || [musicMeta.common.artist || ""], raw_filename.indexOf('_') === -1 ? '-' : '_', ); diff --git a/src/utils/qm_meta.ts b/src/utils/qm_meta.ts index d93d44f..a9bf1f9 100644 --- a/src/utils/qm_meta.ts +++ b/src/utils/qm_meta.ts @@ -14,7 +14,7 @@ import { getQMImageURLFromPMID, queryAlbumCover, querySongInfoById } from '@/uti interface MetaResult { title: string; - artist: string; + artist: string[]; album: string; imgUrl: string; blob: Blob; @@ -44,6 +44,7 @@ export async function extractQQMusicMeta( musicMeta.common.artist = ''; if (!musicMeta.common.artists) { musicMeta.common.artist = fromGBK(musicMeta.common.artist); + musicMeta.common.artists = [musicMeta.common.artist]; } else { musicMeta.common.artist = musicMeta.common.artists.map(fromGBK).join(); @@ -61,8 +62,8 @@ export async function extractQQMusicMeta( } } - const info = GetMetaFromFile(name, musicMeta.common.title, musicMeta.common.artist); - info.artist = info.artist || ''; + const info = GetMetaFromFile(name, musicMeta.common.title, musicMeta.common.artists); + info.artist = info.artist || ['']; let imageURL = GetCoverFromFile(musicMeta); if (!imageURL) { @@ -76,7 +77,7 @@ export async function extractQQMusicMeta( imgUrl: imageURL, blob: await writeMetaToAudioFile({ title: info.title, - artists: info.artist.split(split_regex), + artists: info.artist, ext, imageURL, musicMeta, @@ -97,7 +98,7 @@ async function fetchMetadataFromSongId( return { title: info.track_info.title, - artist: artists.join(','), + artist: artists, album: info.track_info.album.name, imgUrl: imageURL, @@ -112,9 +113,9 @@ async function fetchMetadataFromSongId( }; } -async function getCoverImage(title: string, artist?: string, album?: string): Promise { +async function getCoverImage(title: string, artist?: string[], album?: string): Promise { try { - const data = await queryAlbumCover(title, artist, album); + const data = await queryAlbumCover(title, artist?.join(), album); return getQMImageURLFromPMID(data.Id, data.Type); } catch (e) { console.warn(e); diff --git a/src/view/Home.vue b/src/view/Home.vue index 579e574..eb4c6ea 100644 --- a/src/view/Home.vue +++ b/src/view/Home.vue @@ -217,10 +217,13 @@ export default { }, async editFile(data) { - this.editing_data = data; - const musicMeta = await metaParseBlob(this.editing_data.blob); + this.editing_data.picture = data.picture; + this.editing_data.title = data.title + this.editing_data.artist = data.artist.join() + this.editing_data.album = data.album + const musicMeta = await metaParseBlob(data.blob); this.editing_data.albumartist = musicMeta.common.albumartist || ''; - this.editing_data.genre = musicMeta.common.genre?.toString() || ''; + this.editing_data.genre = musicMeta.common.genre?.join() || ''; this.showEditDialog = true; }, async saveFile(data) {