From 23038c99a2c8b18cc7b49cb2a51fdb3065182aca Mon Sep 17 00:00:00 2001 From: Karl Date: Sat, 21 Mar 2020 13:33:37 +0000 Subject: [PATCH 1/2] working localPlay --- bin/local.js | 37 +++++++++++++++++++++ bin/setup.js | 5 +++ package-lock.json | 85 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + player.js | 60 ++++++++++++++++++++------------- routes/record.js | 2 ++ switchServer.js | 1 + 7 files changed, 168 insertions(+), 23 deletions(-) create mode 100644 bin/local.js diff --git a/bin/local.js b/bin/local.js new file mode 100644 index 0000000..63ba94e --- /dev/null +++ b/bin/local.js @@ -0,0 +1,37 @@ +var player = require('play-sound')(opts = {}) +const { exec } = require("child_process"); +var fs = require('fs') + +var userDetails = JSON.parse(fs.readFileSync('./data/userDetails.json', 'utf8')); + + +async function playLocal(album) { + const localPlayList = album.split(":") + const audio = player.play(`${userDetails.musicPath}/${localPlayList[1]}-${localPlayList[2]}/${localPlayList[1]}-${localPlayList[2]}.m3u`, { mplayer: ['-playlist'] }, function (err) { + if (err && !err.killed) throw err + }) +} + +// async function stopLocal() { +// audio.kill() +// } + +async function stopLocal() { + return new Promise(function (resolve, reject) { + exec(`sudo killall mplayer`, (error, stdout, stderr) => { + if (error) { + resolve(false) + return; + } if (stderr) { + resolve(false) + return; + } + resolve(true) + }) + }) +} + +module.exports = { + playLocal, + stopLocal +} \ No newline at end of file diff --git a/bin/setup.js b/bin/setup.js index a00b114..0dc5951 100644 --- a/bin/setup.js +++ b/bin/setup.js @@ -26,6 +26,11 @@ var questions = [{ type: 'input', name: 'path', message: 'Where is your floppy drive mounted?' + }, + { + type: 'input', + name: 'musicPath', + message: 'What path is your music store?' } ]; diff --git a/package-lock.json b/package-lock.json index 08e4bee..0996bbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -338,6 +338,19 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -892,6 +905,11 @@ "unpipe": "~1.0.0" } }, + "find-exec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-exec/-/find-exec-1.0.1.tgz", + "integrity": "sha512-4o6QkGkpg3xK5s/47rdK9LDZRsE4JR1mrXnaAOXBngG6UKeIDJXfwtNCAkljgyy6VRh75D3FFaB0tii9vDEtIA==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -941,6 +959,16 @@ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", @@ -1000,6 +1028,32 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -1066,6 +1120,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" + }, "ignore-walk": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", @@ -1622,6 +1681,19 @@ "mimic-fn": "^2.1.0" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -1641,6 +1713,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1735,6 +1812,14 @@ } } }, + "play-sound": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/play-sound/-/play-sound-1.1.3.tgz", + "integrity": "sha512-lqEzgtNAdfg2VUXItOtu5bTyWcqeFmnJmgvc8iHEeEOBEJdurqiGYfmCOzIpSBcwrs7XeSpvHv+Rw9dzRPc4aw==", + "requires": { + "find-exec": "1.0.1" + } + }, "prebuild-install": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", diff --git a/package.json b/package.json index d12b214..026d70d 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "path": "^0.12.7", "path-exists": "^4.0.0", "pkg": "^4.4.4", + "play-sound": "^1.1.3", "pug": "2.0.0-beta11", "request": "^2.88.2", "request-promise-native": "^1.0.8", diff --git a/player.js b/player.js index 8b296f3..72b4898 100644 --- a/player.js +++ b/player.js @@ -2,6 +2,7 @@ var SpotifyWebApi = require('spotify-web-api-node'); var _ = require('lodash') var fs = require('fs') var rpn = require('request-promise-native') +var localPlayFunctions = require('./bin/local') var myArgs = process.argv.slice(2); @@ -99,6 +100,11 @@ async function playFile() { const album = fs.readFileSync(`${userDetails.path}/diskplayer.contents`, 'utf8'); await writePlayerData(album) + if (album.includes('local:')) { + console.log('local') + await localPlayFunctions.playLocal(album) + } else { + console.log('spotify') let response; let body; try { @@ -133,7 +139,8 @@ async function playFile() { throw Error(`Request error: ${e}`); } this.response = response; - this.response.body = response.body + this.response.body = response.body } + } async function playURL() { @@ -221,30 +228,37 @@ async function playPlaylist() { async function pausePlayer() { await initialize() await refreshToken() - const DiskPlayerId = await getDevice() + try { + const DiskPlayerId = await getDevice() + try { + response = await rpn({ + method: 'PUT', + url: ' https://api.spotify.com/v1/me/player/pause', + qs: { + device_id: DiskPlayerId + }, + simple: false, + resolveWithFullResponse: true, + json: true, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${spotify._credentials.accessToken}` + }, + }); + } catch (e) { + throw Error(`Request error: ${e}`); + } + this.response = response; + this.response.body = response.body + } catch (error) { + console.log('SpotifyNotRunning') + localPlayFunctions.stopLocal() + + } let response; - try { - response = await rpn({ - method: 'PUT', - url: ' https://api.spotify.com/v1/me/player/pause', - qs: { - device_id: DiskPlayerId - }, - simple: false, - resolveWithFullResponse: true, - json: true, - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${spotify._credentials.accessToken}` - }, - }); - } catch (e) { - throw Error(`Request error: ${e}`); - } - this.response = response; - this.response.body = response.body + } diff --git a/routes/record.js b/routes/record.js index 62bd409..2cf1dd7 100644 --- a/routes/record.js +++ b/routes/record.js @@ -25,6 +25,8 @@ async function buildPage() { sid = `spotify:album:${id}` } else if (i.includes("/playlist/")) { sid = `spotify:playlist:${id}` + } else if (i.includes("local:")) { + sid = `${id}` } else { console.log('failed') } diff --git a/switchServer.js b/switchServer.js index c061d22..0a02017 100644 --- a/switchServer.js +++ b/switchServer.js @@ -1,6 +1,7 @@ var net = require('net'); const { exec } = require("child_process"); var path = require('path'); +// var localPlayerFunctioins = require('./bin/local') async function playStuff() { return new Promise(function (resolve, reject) { From b976e330ca2cdfa50573a016b5965f200c1f79d0 Mon Sep 17 00:00:00 2001 From: Karl Date: Mon, 8 Jun 2020 08:38:24 +0100 Subject: [PATCH 2/2] local and radio --- bin/radio.js | 14 ++++++++++ player.js | 69 ++++++++++++++++++++++++++---------------------- routes/record.js | 2 ++ 3 files changed, 53 insertions(+), 32 deletions(-) create mode 100644 bin/radio.js diff --git a/bin/radio.js b/bin/radio.js new file mode 100644 index 0000000..1995a40 --- /dev/null +++ b/bin/radio.js @@ -0,0 +1,14 @@ +var player = require('play-sound')(opts = {}) +// const { exec } = require("child_process"); + +async function playRadio(album) { + const localPlayList = album.split(":") + const stream = localPlayList[1] + ':' + localPlayList[2] + const audio = player.play(stream, { mplayer: ['-playlist'] }, function (err) { + if (err && !err.killed) throw err + }) +} + +module.exports = { + playRadio +} \ No newline at end of file diff --git a/player.js b/player.js index 72b4898..099427a 100644 --- a/player.js +++ b/player.js @@ -3,6 +3,7 @@ var _ = require('lodash') var fs = require('fs') var rpn = require('request-promise-native') var localPlayFunctions = require('./bin/local') +var radioPlayFunctions = require('./bin/radio') var myArgs = process.argv.slice(2); @@ -103,43 +104,47 @@ async function playFile() { if (album.includes('local:')) { console.log('local') await localPlayFunctions.playLocal(album) + } else if (album.includes('radio:')) { + console.log('radio') + await radioPlayFunctions.playRadio(album) } else { console.log('spotify') - let response; - let body; - try { - if (lastPlayer.includes(album)) { - body = {} - } else { - body = { - "context_uri": album, - "offset": { - "position": 0 - }, - "position_ms": 0 + let response; + let body; + try { + if (lastPlayer.includes(album)) { + body = {} + } else { + body = { + "context_uri": album, + "offset": { + "position": 0 + }, + "position_ms": 0 + } } + response = await rpn({ + method: 'PUT', + url: ' https://api.spotify.com/v1/me/player/play', + qs: { + device_id: DiskPlayerId + }, + simple: false, + body, + resolveWithFullResponse: true, + json: true, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${spotify._credentials.accessToken}` + }, + }); + } catch (e) { + throw Error(`Request error: ${e}`); } - response = await rpn({ - method: 'PUT', - url: ' https://api.spotify.com/v1/me/player/play', - qs: { - device_id: DiskPlayerId - }, - simple: false, - body, - resolveWithFullResponse: true, - json: true, - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${spotify._credentials.accessToken}` - }, - }); - } catch (e) { - throw Error(`Request error: ${e}`); + this.response = response; + this.response.body = response.body } - this.response = response; - this.response.body = response.body } } diff --git a/routes/record.js b/routes/record.js index 2cf1dd7..41f9a23 100644 --- a/routes/record.js +++ b/routes/record.js @@ -25,6 +25,8 @@ async function buildPage() { sid = `spotify:album:${id}` } else if (i.includes("/playlist/")) { sid = `spotify:playlist:${id}` + } else if (i.includes(".m3u")) { + sid = `radio:${id}` } else if (i.includes("local:")) { sid = `${id}` } else {