粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • wheel

    • 个人作品
    • 时间管理CLI工具
      • 做一个CLI版的时间管理工具(一)
      • 做一个CLI版的时间管理工具(十)
      • 做一个CLI版的时间管理工具(11)
      • 做一个CLI版的时间管理工具(12)
      • 做一个CLI版的时间管理工具(13)
      • 做一个CLI版的时间管理工具(14)
      • 做一个CLI版的时间管理工具(15)
      • 做一个CLI版的时间管理工具(二)
      • 做一个CLI版的时间管理工具(三)
      • 做一个CLI版的时间管理工具(四)
      • 做一个CLI版的时间管理工具(五)
      • 做一个CLI版的时间管理工具(六)
      • 做一个CLI版的时间管理工具(七)
      • 做一个CLI版的时间管理工具(八)
      • 做一个CLI版的时间管理工具(九)
    • 组装个支持记笔记的CodePen
    • ESCheck工具原理解析及增强实现
    • 一款检测代码中TODO的eslint插件
    • 实现一个Web UI检测(视觉走查)工具ing
    • 从0-1实现文件下载CLI工具
    • 内联JS处理(ES语法降级&内容压缩)
    • Node CLI工具原理解析
    • 我打造的在线简历生成应用
    • 助你轻松编写与分享snippet的VsCode插件
    • SourceMap解析CLI工具实现
    • 一个通过NPM包共(分)享代码块的解决方案
    • 实践:给女朋友个性化定制应用-体重记录(一)
    • 实践:给女朋友个性化定制应用-体重记录(二)
    • 实践:给女朋友个性化定制应用-体重记录(三)

做一个CL版的时间管理工具(15)

vuePress-theme-reco 粥里有勺糖    2018 - 2023

做一个CL版的时间管理工具(15)

粥里有勺糖 2021-08-23 技术笔记个人作品CLI工具

# 做一个CLI版的时间管理工具(15)

# 前言

在前一期文章中完善了一个生成Web页面浏览事务进展的timec page指令

但在日`常使用工具中发现发现了两个痛点:

  1. 由于事务繁多,经常会忘记结束一个事情,就开始了下一个事情
  2. 在切换任务的时候需要完整的输入任务名才能进行任务的切换

当然还有一些其它的痛点,本期着重解决第1个痛点

# 定时提醒Feature开发

定时提醒,并自动执行timec thing -s保存,使用一个提示音进行提示

预期指令timec remind

  • -c,--cycle [time]:设置提醒的周期,单位分钟,默认40分钟提醒一次
timec remind [option]
1

# 注册指令

使用commander.command注册remind指令,使用.option方法设置一个可选参数cycle, 第二个参数传入默认值'40'

commander.command('remind')
  .description('Open auto remind music')
  .option('-c,--cycle [time]', 'Set the duration of the reminder cycle(minute)', '40')
  .action(remindCommand);
1
2
3
4

具体逻辑如下:

  1. 将cycle参数转为整数
  2. 然后使用定时器setTimeout,在cycle*oneMinute毫秒后,播放音频与自动记录
const spawn = require('cross-spawn');

// 提醒周期(minute)
  const time = +cmdObj.cycle;
  const oneMinute = 1000 * 60;
  const loop = () => {
    setTimeout(() => {
      playRemindAudio(loop);
      // 自动记录一下
      const cwd = getCWD();
      const { thing } = getConfig();
      spawn('timec', ['thing', thing.name], {
        cwd,
        stdio: 'inherit',
      });
    }, time * oneMinute);
  };
  loop();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

其中自动记录的方法比较简单,通过spawn执行timec thing [newthing]指令即可进行自动的事件记录

playRemindAudio中包含的就是播放预设音频的逻辑

# 播放声音

这个算是知识盲区,以前从来没有使用Node.js原生的API播放过音频

# 系统指令

首先想到的方案就是通过spawn调用系统的指令播放音频

spawn('mpg123', ['url.mp3');
1

这个是调用mpg123 (opens new window)系统指令

linux操作系统安装指令如下

sudo apt-get install mpg123
1

调用系统指令播放音乐,比较有局限性,常见操作系统有3种,不一定所有操作系统都支持一样的指令

如果使用此种方式就需要调研目标平台,装机就默认支持的指令

# 现存NPM包

这个问题肯定不是开发者第一次遇见,肯定是有前辈们遇到过,通过搜索引擎检索,pick了下述两个:

  • play (opens new window)
  • audio-play (opens new window)

首先是第一个,API 比较简单,通过查看源码 (opens new window),实际上他也是调用系统指令播放

const play = require('play/lib/play');

play.sound('filepath.wav');
1
2
3

图片

其次是audio-play,需要配合audio-loader使用

const audioPlay = require('audio-play');
const audioLoad = require('audio-loader');
audioLoad('filepath.wav').then((v) => {
  audioPlay(v);
});
1
2
3
4
5

在mac上测试播放正常,在linux上依旧无法正常播放

# 使用系统蜂鸣器

这个就比较简单,执行下面代码即可,但是在我的linux上测试仍然无效,emmmm裂开了

process.stdout.write('\x07')
1

# TODO

整理一篇Node.js播放音频的干货实践文章,目标3端通用一个API

# 最后

由于每天空闲时间有限,本文就先到这,下一期将继续完善timec page指令

如果读者还感觉意犹未尽,敬请期待后续更新,或持续关注一下仓库 (opens new window)的状态

欢迎评论区提需求,交流探讨

本系列会不断的更新迭代,直至产品初代完成

  • 仓库地址 (opens new window)
Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34