使用Nodejs写的一个在命令行下调用Jing.fm接口智能搜索播放歌曲的小玩意(Nodejs版)

使用Nodejs写的一个在命令行下调用Jing.fm接口智能搜索播放歌曲的小玩意(Nodejs版)

Github地址: https://github.com/fraserxu/jingfm-cli

依赖模块:

  • commander.js (命令行工具)
  • Q (nodejs promise处理多个异步请求)
  • equest (后端发送多次异步请求)

jingfm-cli

主要调用Jing.fm API,非官方,貌似他们没有开放平台。之后通过后台多次请求获取歌曲地址,最后使用nodejs child_process 模块调用浏览器。

这里主要使用Q完成多次异步请求处理。

欢迎提交pull request,各种star.


4 回复

使用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);

解释:

  1. commander.js: 用于解析命令行参数。-s, --search [query] 选项允许用户指定搜索关键词。
  2. Q: 用于处理异步请求。Q.nfcall 将回调函数式的请求转换为Promise形式,使代码更简洁。
  3. request: 发起HTTP GET请求到Jing.fm API。
  4. 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请求。

实现步骤

  1. 安装依赖 首先需要安装所需的依赖模块。可以通过以下命令进行安装:

    npm install commander q request
    
  2. 核心逻辑 主要逻辑包括以下几个步骤:

    • 接收用户输入的搜索关键字。
    • 通过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上的歌曲。你可以根据实际需求进一步完善和扩展功能,比如添加更多的搜索结果处理逻辑或者支持不同的操作系统。希望这个小玩意能够满足你的需求,也欢迎贡献代码或提出建议!

回到顶部