52 lines
1.8 KiB
JavaScript
Executable File
52 lines
1.8 KiB
JavaScript
Executable File
const { API } = require('./config');
|
||
const { fetchJSON } = require('./network');
|
||
const { formatPersonNames } = require('./utils');
|
||
|
||
async function searchSongs(keyword, limit = 10) {
|
||
const res = await fetchJSON(`${API.search}?keyword=${encodeURIComponent(keyword)}&limit=${limit}`);
|
||
if (res.code !== 200) {
|
||
console.log('❌ 搜索无结果');
|
||
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(`${API.playlist}?id=${playlistId}`);
|
||
if (!res.data?.tracks?.length) {
|
||
console.log('❌ 歌单获取失败或为空');
|
||
return null;
|
||
}
|
||
return res.data;
|
||
}
|
||
|
||
module.exports = { searchSongs, interactiveSearch, fetchPlaylist };
|