commit 4996ea240907726ff5c1fb9b1a980ab771b22cd4 Author: Sven Slootweg Date: Wed Apr 5 14:30:15 2017 +0200 Initial commit: diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/app.js b/app.js new file mode 100644 index 0000000..ec985b0 --- /dev/null +++ b/app.js @@ -0,0 +1,30 @@ +'use strict'; + +const Promise = require("bluebird"); +const childProcess = Promise.promisifyAll(require("child_process")); +const playlist = require("./playlist"); + +Promise.try(() => { + return playlist("https://media.pixelbar.nl/getjson.php"); +}).then((playlist) => { + playlist.on("track", (track) => { + Promise.try(() => { + console.log("NOW PLAYING:", track.media_title); + + return new Promise((resolve, reject) => { + let player = childProcess.spawn("mpv", ["--no-video", track.media_url]); + + player.stdout.pipe(process.stdout); + player.stderr.pipe(process.stderr); + + player.on("exit", () => { + resolve(); + }); + }); + }).then(() => { + playlist.reportFinished(); + }); + }); + + playlist.reportFinished(); +}) diff --git a/package.json b/package.json new file mode 100644 index 0000000..0f78ef3 --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "pixelbar-mediaplayer", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Sven Slootweg", + "license": "WTFPL", + "dependencies": { + "bhttp": "^1.2.4", + "bluebird": "^3.4.7", + "cheerio": "^0.22.0" + } +} diff --git a/playlist.js b/playlist.js new file mode 100644 index 0000000..0443d47 --- /dev/null +++ b/playlist.js @@ -0,0 +1,57 @@ +'use strict'; + +const Promise = require("bluebird"); +const bhttp = require("bhttp"); +const events = require("events"); + +function getHighestMediaID(items) { + return Math.max.apply(null, items.map(item => item.media_id)); +} + +module.exports = function createPlaylist(url) { + let queuedTracks = []; + let lastKnownID = 0; + + function getNewTracks() { + return Promise.try(() => { + console.log("CHECKING for new tracks..."); + return bhttp.get(url); + }).then((response) => { + let newTracks = response.body.filter((track) => { + return track.media_id > lastKnownID; + }); + + if (newTracks.length > 0) { + console.log(`FOUND ${newTracks.length} new tracks!`); + queuedTracks = queuedTracks.concat(newTracks); + lastKnownID = getHighestMediaID(response.body); + } else { + console.log("NO new tracks found.") + } + }); + } + + return Promise.try(() => { + return bhttp.get(url); + }).then((response) => { + lastKnownID = getHighestMediaID(response.body) - 2; + + return Object.assign(new events.EventEmitter(), { + reportFinished: function() { + return Promise.try(() => { + return getNewTracks(); + }).then(() => { + if (queuedTracks.length > 0) { + this.emit("track", queuedTracks.shift()); + } else { + return Promise.try(() => { + return Promise.delay(5000); + }).then(() => { + return this.reportFinished(); + }) + } + }); + } + }); + }) +};