使用Nodejs写的一个在命令行下调用Jing.fm接口智能搜索播放歌曲的小玩意(Nodejs版)
使用Nodejs写的一个在命令行下调用Jing.fm接口智能搜索播放歌曲的小玩意(Nodejs版)
Github地址: https://github.com/fraserxu/jingfm-cli
依赖模块:
- commander.js (命令行工具)
- Q (nodejs promise处理多个异步请求)
- equest (后端发送多次异步请求)
主要调用Jing.fm API,非官方,貌似他们没有开放平台。之后通过后台多次请求获取歌曲地址,最后使用nodejs child_process 模块调用浏览器。
这里主要使用Q
完成多次异步请求处理。
欢迎提交pull request,各种star.
使用Nodejs写的一个在命令行下调用Jing.fm接口智能搜索播放歌曲的小玩意(Nodejs版)
Github地址:
https://github.com/fraserxu/jingfm-cli
依赖模块:
- commander.js: 用于处理命令行参数。
- Q: 一个Promise库,用于处理异步请求。
- request: 用于发起HTTP请求。
主要功能:
该小玩意允许用户在命令行中输入关键词,通过调用Jing.fm的API来搜索歌曲,并最终在浏览器中播放选定的歌曲。
示例代码:
const program = require('commander');
const Q = require('q');
const request = require('request');
const { exec } = require('child_process');
program
.version('0.1.0')
.option('-s, --search [query]', 'Search for a song')
.parse(process.argv);
if (!program.search) {
console.error('Please provide a search query.');
process.exit(1);
}
const searchSong = async (query) => {
try {
const response = await Q.nfcall(request.get, `http://api.jing.fm/search?query=${encodeURIComponent(query)}`);
if (response.statusCode !== 200) throw new Error('Failed to fetch data.');
const body = JSON.parse(response.body);
if (!body.results || !body.results.length) {
console.log('No results found.');
return;
}
// Assume the first result is the most relevant
const songUrl = body.results[0].url;
// Open the song URL in the default browser
exec(`start ${songUrl}`); // Windows
// exec(`open ${songUrl}`); // MacOS
} catch (error) {
console.error('Error:', error.message);
}
};
searchSong(program.search);
解释:
- commander.js: 用于解析命令行参数。
-s, --search [query]
选项允许用户指定搜索关键词。 - Q: 用于处理异步请求。
Q.nfcall
将回调函数式的请求转换为Promise形式,使代码更简洁。 - request: 发起HTTP GET请求到Jing.fm API。
- child_process.exec: 打开浏览器并播放选定的歌曲。
注意事项:
- Jing.fm API是非官方的,可能随时发生变化或被禁用。
- 需要确保安装了所有依赖项 (
npm install commander q request
)。 - 代码假设API返回结果的第一条是最相关的歌曲。
欢迎提交Pull Request,并给项目加星(Star)以支持这个小项目。
windows下面不能跑啊,报很多属性不存在 TypeError: Cannot read property ‘total’ of undefined TypeError: Cannot read property ‘items’ of undefined ??
。。。没在windows下跑过。。。 如果你想更加快乐的写代码请切换到linux或者mac吧。
使用Nodejs写的一个在命令行下调用Jing.fm接口智能搜索播放歌曲的小玩意(Nodejs版)
项目简介
这个项目实现了一个简单的命令行应用,可以在命令行中搜索并播放Jing.fm上的歌曲。该项目依赖于几个Node.js模块来处理命令行输入、异步请求和播放音乐。
依赖模块
- commander.js: 用于解析命令行参数。
- Q: 用于处理异步请求,使得多个异步操作可以顺序执行。
- request: 用于发送HTTP请求。
实现步骤
-
安装依赖 首先需要安装所需的依赖模块。可以通过以下命令进行安装:
npm install commander q request
-
核心逻辑 主要逻辑包括以下几个步骤:
- 接收用户输入的搜索关键字。
- 通过Jing.fm的API搜索歌曲。
- 获取搜索结果中的歌曲地址。
- 使用
child_process
模块调用系统默认的音乐播放器播放歌曲。
示例代码
const program = require('commander');
const Q = require('q');
const request = require('request');
program
.version('0.1.0')
.option('-s, --search <keyword>', 'Search keyword for songs')
.parse(process.argv);
async function searchSongs(keyword) {
const url = `http://api.jing.fm/search?q=${encodeURIComponent(keyword)}`;
return new Promise((resolve, reject) => {
request(url, (error, response, body) => {
if (!error && response.statusCode === 200) {
resolve(JSON.parse(body));
} else {
reject(error);
}
});
});
}
async function playSong(songUrl) {
const { exec } = require('child_process');
exec(`open ${songUrl}`, (error, stdout, stderr) => {
if (error) {
console.error(`Error: ${stderr}`);
return;
}
console.log(`stdout: ${stdout}`);
});
}
(async () => {
try {
const songs = await searchSongs(program.search);
const songUrl = songs[0].url; // 假设第一个搜索结果是用户想要播放的歌曲
playSong(songUrl);
} catch (error) {
console.error('Failed to fetch or play the song:', error);
}
})();
说明
- searchSongs 函数通过Jing.fm的API搜索歌曲,并返回搜索结果。
- playSong 函数使用系统默认的音乐播放器(如macOS的
open
命令)来播放歌曲。 - 程序入口 处理命令行参数,调用搜索和播放函数。
结论
该示例展示了如何使用Node.js在命令行中搜索并播放Jing.fm上的歌曲。你可以根据实际需求进一步完善和扩展功能,比如添加更多的搜索结果处理逻辑或者支持不同的操作系统。希望这个小玩意能够满足你的需求,也欢迎贡献代码或提出建议!