Merge branch 'localPlay' of Karl/SpotifyDisk-node into master

This commit is contained in:
Karl 2020-06-08 02:39:35 -05:00 committed by Gogs
commit a0443cf292
8 changed files with 220 additions and 54 deletions

37
bin/local.js Normal file
View File

@ -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
}

14
bin/radio.js Normal file
View File

@ -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
}

View File

@ -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?'
}
];

85
package-lock.json generated
View File

@ -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",

View File

@ -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",

127
player.js
View File

@ -2,6 +2,8 @@ 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 radioPlayFunctions = require('./bin/radio')
var myArgs = process.argv.slice(2);
@ -99,41 +101,51 @@ async function playFile() {
const album = fs.readFileSync(`${userDetails.path}/diskplayer.contents`, 'utf8');
await writePlayerData(album)
let response;
let body;
try {
if (lastPlayer.includes(album)) {
body = {}
} else {
body = {
"context_uri": album,
"offset": {
"position": 0
},
"position_ms": 0
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
}
}
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
}
async function playURL() {
@ -221,30 +233,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
}

View File

@ -25,6 +25,10 @@ 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 {
console.log('failed')
}

View File

@ -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) {