feat(音乐链接): 统一使用 TuneHub 格式的音乐页面链接
将网易云和QQ音乐的原始链接替换为 TuneHub 格式的统一链接 在同步任务中优先获取歌曲元数据,避免显示原始URL 增加日志输出以帮助调试链接解析过程
This commit is contained in:
@@ -30,7 +30,7 @@ function normalizeTunehubPlaylist(playlistId, detail) {
|
||||
duration: 0,
|
||||
album: item.album || '',
|
||||
cover,
|
||||
pageUrl: `https://music.163.com/song?id=${item.id}`,
|
||||
pageUrl: `https://music-dl.sayqz.com/?source=netease&id=${item.id}`,
|
||||
playUrl: item.url || '',
|
||||
isBlocked,
|
||||
isCloud: false,
|
||||
|
||||
@@ -7,11 +7,12 @@ function buildPageUrl(source, songId) {
|
||||
if (!source || !songId) {
|
||||
return '';
|
||||
}
|
||||
// 使用 TuneHub 格式的页面 URL
|
||||
if (source === 'netease') {
|
||||
return `https://music.163.com/song?id=${songId}`;
|
||||
return `https://music-dl.sayqz.com/?source=${source}&id=${songId}`;
|
||||
}
|
||||
if (source === 'qq') {
|
||||
return `https://y.qq.com/n/ryqq/songDetail/${songId}`;
|
||||
return `https://music-dl.sayqz.com/?source=${source}&id=${songId}`;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -64,15 +64,31 @@ async function createJob(req, res) {
|
||||
|
||||
let meta = {};
|
||||
const songId = request.urlJob && request.urlJob.meta.songId ? request.urlJob.meta.songId : "";
|
||||
|
||||
|
||||
// 先从 TuneHub 获取歌曲信息,避免显示原始 URL
|
||||
if (request.urlJob.meta && (request.urlJob.meta.songName !== "" && request.urlJob.meta.artist !== "")) {
|
||||
meta = {
|
||||
songName: request.urlJob.meta.songName,
|
||||
artist: request.urlJob.meta.artist,
|
||||
album : request.urlJob.meta.album ? request.urlJob.meta.album : "",
|
||||
};
|
||||
} else {
|
||||
// 没有前端元数据,先获取歌曲信息
|
||||
logger.info(`[sync_jobs] No meta provided, fetching song info from URL: ${url}`);
|
||||
const songInfo = await require('../service/media_fetcher').getMetaWithUrl(url);
|
||||
if (songInfo && songInfo.songName) {
|
||||
meta = {
|
||||
songName: songInfo.songName,
|
||||
artist: songInfo.artist || "",
|
||||
album: songInfo.album || "",
|
||||
};
|
||||
logger.info(`[sync_jobs] Fetched song info: ${meta.songName} - ${meta.artist}`);
|
||||
} else {
|
||||
logger.warn(`[sync_jobs] Failed to fetch song info from URL, will use URL as fallback`);
|
||||
meta.songName = url; // 备用方案
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (songId) {
|
||||
const songFromWyCloud = await findTheBestMatchFromWyCloud(req.account.uid, {
|
||||
songName: meta.songName,
|
||||
@@ -90,7 +106,7 @@ async function createJob(req, res) {
|
||||
}
|
||||
meta.songFromWyCloud = songFromWyCloud;
|
||||
}
|
||||
|
||||
|
||||
// create job
|
||||
const args = `${jobType}: {"url":${url}}`;
|
||||
if (await JobManager.findActiveJobByArgs(uid, args)) {
|
||||
@@ -108,7 +124,7 @@ async function createJob(req, res) {
|
||||
tip: `等待${operation}`,
|
||||
createdAt: Date.now()
|
||||
});
|
||||
|
||||
|
||||
// async job
|
||||
syncSingleSongWithUrl(req.account.uid, url, meta, jobId, jobType).then(async ret => {
|
||||
await JobManager.updateJob(uid, jobId, {
|
||||
|
||||
Reference in New Issue
Block a user