geostorm-ost
Version:
Play Geostorm OST from terminal.
61 lines (50 loc) • 1.52 kB
JavaScript
const stream = require('youtube-audio-stream');
const Decoder = require('lame').Decoder;
const Speaker = require('speaker');
const animation = require('chalk-animation');
const chalk = require('chalk');
const fs = require('fs');
function Tracker(str) {
// 1. some data
var i = 0, anm = null;
var trk = null;
function parse() {
// a. format is "bla bla bla <min>:<sec>"
const z = [];
for(var ln of str.split(/\r?\n/g)) {
if(!ln) continue;
var tim = ln.match(/\d+:\d+/)[0].split(':');
var min = parseInt(tim[0], 10), sec = parseInt(tim[1], 10);
z.push({'time': min*60+sec, 'text': ln});
}
return z;
};
function log() {
// a. display a track
if(anm) anm.stop();
anm = animation.rainbow(trk[i++].text);
};
function stop() {
// a. stop track display
if(anm) anm.stop();
};
// 2. setup track display
trk = parse(str);
for(var t=0, T=trk.length; t<T; t++)
setTimeout(log, trk[t].time*1000);
return {parse, log, stop};
};
// I. setup
const url = 'https://www.youtube.com/watch?v=NzaJUTUxzrk';
const head = fs.readFileSync(__dirname+'/head.txt', 'utf8');
const body = fs.readFileSync(__dirname+'/body.txt', 'utf8');
const foot = fs.readFileSync(__dirname+'/foot.txt', 'utf8');
const tracker = Tracker(body);
const speaker = new Speaker();
console.log(chalk.cyan(head));
// II. start playing
var ost = stream(url).pipe(Decoder()).pipe(speaker);
ost.on('finish', () => {
tracker.stop();
console.log(chalk.blue(foot));
});