feat(media_fetcher): 添加 TuneHub 作为主要音乐源并优化搜索逻辑

优先使用 TuneHub 进行音乐搜索,仅在失败时回退到 media-get
移除对 media-get 的强制依赖检查
添加更完善的错误处理逻辑
This commit is contained in:
史悦
2026-01-08 13:13:40 +08:00
parent b2f6448fad
commit e1ac2ba55f
2 changed files with 67 additions and 43 deletions

View File

@@ -5,8 +5,6 @@ const process = require('process');
initDir();
initAccountFileIfNotExisted();
const mediaGet = require('./service/media_fetcher/media_get');
function initDir() {
// make sure all dir has been created
const dirList = [
@@ -33,16 +31,7 @@ function initAccountFileIfNotExisted() {
}
module.exports = async function() {
// check if media-get is installed
const mediaGetInfo = await mediaGet.getMediaGetInfo();
if (mediaGetInfo === false) {
process.exit(-1);
}
if (!mediaGetInfo.hasInstallFFmpeg) {
logger.error('please install FFmpeg and FFprobe first');
process.exit(-1);
}
logger.info(`[media-get] Version: ${mediaGetInfo.versionInfo}`);
logger.info('Melody 服务启动成功,使用 TuneHub 作为主要音乐源');
// TODO check media-get latest version
// TODO: 可以在这里添加对 TuneHub 连接性的检查
}

View File

@@ -242,6 +242,36 @@ async function searchSongFromAllPlatform({
const globalConfig = await configManager.getGlobalConfig();
// Try TuneHub first
const searchKeyword = keyword || `${songName} ${artist}`.trim();
if (searchKeyword) {
logger.info(`[searchSongFromAllPlatform] Using TuneHub to search: ${searchKeyword}`);
const tunehubResult = await require('../music_platform/tunehub').searchSongs(searchKeyword, {
aggregate: true,
});
if (tunehubResult && tunehubResult.result && tunehubResult.result.songs) {
logger.info(`[searchSongFromAllPlatform] TuneHub search success, found ${tunehubResult.result.songs.length} songs`);
return tunehubResult.result.songs.map(song => {
return {
songName: song.name || '',
artist: song.artist || '',
album: song.album || '',
duration: song.duration || 0,
url: song.url || '',
resourceForbidden: song.resourceForbidden || false,
source: song.source || '',
fromMusicPlatform: true,
score: song.score || 0,
}
});
}
logger.warn(`[searchSongFromAllPlatform] TuneHub search failed or no results, will try media-get as fallback`);
} else {
logger.info(`[searchSongFromAllPlatform] No search keyword provided, using media-get`);
}
// Fallback to media-get only if TuneHub fails
logger.warn(`[searchSongFromAllPlatform] Falling back to media-get (may be unstable)`);
let searchParams = keyword
? ['-k', `"${keyword}"`]
: ['--searchSongName', `"${songName}"`, '--searchArtist', `"${artist}"`, '--searchAlbum', `"${album}"`];
@@ -255,6 +285,7 @@ async function searchSongFromAllPlatform({
logger.info(`cmdStr: ${getBinPath()} ${searchParams.join(' ')}`);
try {
const {code, message} = await cmd(getBinPath(), searchParams);
logger.info('-------')
logger.info(code);
@@ -269,7 +300,7 @@ async function searchSongFromAllPlatform({
try {
jsonResponse = JSON.parse(message);
} catch (e) {
logger.error(e, message)
logger.error(`[searchSongFromAllPlatform] Failed to parse media-get response: ${e}`, message)
return false;
}
@@ -286,6 +317,10 @@ async function searchSongFromAllPlatform({
score: searchItem.Score,
}
})
} catch (error) {
logger.error(`[searchSongFromAllPlatform] media-get crashed or timed out`, error);
return false;
}
}
module.exports = {