const { API, buildApiUrl } = require('./config'); const { fetchJSON } = require('./network'); const { formatPersonNames } = require('./utils'); async function searchSongs(keyword, limit = 10) { const res = await fetchJSON(buildApiUrl(API.search, { keyword, limit })); if (res.code !== 200) { console.log(`❌ 搜索失败: ${res.msg || '无结果'}`); return []; } const songs = Array.isArray(res.data) ? res.data : (res.data?.songs || []); if (!songs.length) console.log('❌ 搜索无结果'); return songs.map(song => ({ ...song, artists: formatPersonNames(song.artists), })); } async function interactiveSearch(rl, ask) { const keyword = await ask('🔍 搜索关键词: '); if (!keyword.trim()) return null; const results = await searchSongs(keyword.trim(), 10); if (!results.length) return null; console.log('\n # 歌曲名 歌手 专辑'); console.log(' ' + '─'.repeat(70)); results.forEach((song, index) => { const num = String(index + 1).padStart(2); const name = song.name.slice(0, 20).padEnd(22); const artist = song.artists.slice(0, 16).padEnd(18); console.log(` ${num} ${name} ${artist} ${song.album}`); }); const pick = await ask('\n选择序号 (多个用逗号分隔, 0=取消): '); if (!pick.trim() || pick.trim() === '0') return null; return pick.split(/[,,\s]+/) .map(value => parseInt(value, 10)) .filter(value => value >= 1 && value <= results.length) .map(value => results[value - 1]); } async function fetchPlaylist(playlistId) { const res = await fetchJSON(buildApiUrl(API.playlist, { id: playlistId })); if (!res.data?.tracks?.length) { console.log(`❌ 歌单获取失败或为空${res.msg ? `: ${res.msg}` : ''}`); return null; } return res.data; } module.exports = { searchSongs, interactiveSearch, fetchPlaylist };