From 76003d4bcd71998239f712b373ca72a2f7dca345 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B2=E6=82=A6?= Date: Thu, 8 Jan 2026 14:50:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E6=AD=8C=E6=9B=B2=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=8A=9F=E8=83=BD=E6=B7=BB=E5=8A=A0=E5=85=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=AE=B0=E5=BD=95=E5=92=8C=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在前后端添加日志记录和元数据传递,包括歌曲名称、艺术家和专辑信息 --- backend/src/handler/songs.js | 1 + backend/src/handler/sync_jobs.js | 3 +++ frontend/src/api/index.js | 9 ++++++--- .../src/components/SearchResultListForMobile.vue | 14 +++++++++++--- frontend/src/components/SearchResultTable.vue | 9 ++++++++- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/backend/src/handler/songs.js b/backend/src/handler/songs.js index 2015b33..8f29d12 100644 --- a/backend/src/handler/songs.js +++ b/backend/src/handler/songs.js @@ -114,6 +114,7 @@ async function search(req, res) { .map(mapTunehubResult) .filter(song => song.songName.length > 0); + logger.info(`[search] Final songs array = ${JSON.stringify(songs, null, 2)}`); res.send({ status: 0, data: { diff --git a/backend/src/handler/sync_jobs.js b/backend/src/handler/sync_jobs.js index 11dcc10..e4c3b3d 100644 --- a/backend/src/handler/sync_jobs.js +++ b/backend/src/handler/sync_jobs.js @@ -52,7 +52,9 @@ async function createJob(req, res) { jobId = await unblockMusicWithSongId(uid, source, songId) } else if (jobType === JobType.SyncSongFromUrl || jobType === JobType.DownloadSongFromUrl) { const request = req.body; + logger.info(`[createJob] Received jobType=${jobType}, request.body.urlJob=${JSON.stringify(request.urlJob, null, 2)}`); const url = request.urlJob && matchUrlFromStr(request.urlJob.url); + logger.info(`[createJob] Extracted url=${url} from request.urlJob.url=${request.urlJob.url}`); if (!url) { res.status(412).send({ @@ -64,6 +66,7 @@ async function createJob(req, res) { let meta = {}; const songId = request.urlJob && request.urlJob.meta.songId ? request.urlJob.meta.songId : ""; + logger.info(`[createJob] songId=${songId}`); // 先从 TuneHub 获取歌曲信息,避免显示原始 URL if (request.urlJob.meta && (request.urlJob.meta.songName !== "" && request.urlJob.meta.artist !== "")) { diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 2d16d41..b364b8c 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -12,18 +12,21 @@ export const qrLoginCheck = qrKey => get("/account/qrlogin-check", {qrKey}); export const getAllPlaylist = data => get("/playlists", data); export const getPlaylistDetail = playlistId => get(`/playlists/netease/${playlistId}/songs`); export const getJobDetail = jobId => get(`/sync-jobs/${jobId}`); -export const createSyncSongFromUrlJob = (url, songId = "") => { +export const createSyncSongFromUrlJob = (url, songId = "", meta = {}) => { return post("/sync-jobs", { "jobType": "SyncSongFromUrl", "urlJob": { "url": url, "meta": { - "songId": songId + "songId": songId, + "songName": meta.songName || "", + "artist": meta.artist || "", + "album": meta.album || "" } } }); }; -export const createDownloadSongFromUrlJob = (url, songId = "") => { +export const createDownloadSongFromUrlJob = (url, songId = "", meta = {}) => { return post("/sync-jobs", { "jobType": "DownloadSongFromUrl", "urlJob": { diff --git a/frontend/src/components/SearchResultListForMobile.vue b/frontend/src/components/SearchResultListForMobile.vue index 2317443..e36d4f0 100644 --- a/frontend/src/components/SearchResultListForMobile.vue +++ b/frontend/src/components/SearchResultListForMobile.vue @@ -184,10 +184,18 @@ export default { } return ""; }, - async uploadToCloud(pageUrl) { + async uploadToCloud(item) { + const pageUrl = this.getSourceUrl(item); + const meta = { + songName: item.songName || "", + artist: item.artist || "", + album: item.album || "" + }; + console.log(`[SearchResultListForMobile] uploadToCloud: pageUrl=${pageUrl}, meta=${JSON.stringify(meta)}`); const ret = await createSyncSongFromUrlJob( pageUrl, - this.suggestMatchSongId + this.suggestMatchSongId, + meta ); console.log(ret); @@ -232,7 +240,7 @@ export default { console.log(currentSong); switch (actionItem.action) { case ActionUpload: - this.uploadToCloud(pageUrl); + this.uploadToCloud(currentSong); break; case ActionDownloadToLocalService: this.downloadToLocalService(pageUrl); diff --git a/frontend/src/components/SearchResultTable.vue b/frontend/src/components/SearchResultTable.vue index 23fa98a..04b9bc9 100644 --- a/frontend/src/components/SearchResultTable.vue +++ b/frontend/src/components/SearchResultTable.vue @@ -295,9 +295,16 @@ export default { }, async uploadToCloud(row) { const pageUrl = this.getSourceUrl(row); + const meta = { + songName: row.songName || "", + artist: row.artist || "", + album: row.album || "" + }; + logger.info(`[SearchResultTable] uploadToCloud: pageUrl=${pageUrl}, meta=${JSON.stringify(meta)}`); const ret = await createSyncSongFromUrlJob( pageUrl, - this.suggestMatchSongId + this.suggestMatchSongId, + meta ); console.log(ret);