Compare commits
2 Commits
master
...
ChromeCast
Author | SHA1 | Date | |
---|---|---|---|
5012f3df7d | |||
986102cf9b |
10
.vscode/launch.json
vendored
10
.vscode/launch.json
vendored
@ -10,7 +10,15 @@
|
||||
"name": "Record",
|
||||
"skipFiles": [
|
||||
],
|
||||
"program": "${workspaceFolder}/bin/www"
|
||||
"program": "${workspaceFolder}/bin/record.js"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Chromecast",
|
||||
"skipFiles": [
|
||||
],
|
||||
"program": "${workspaceFolder}/bin/chromecast.js"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
|
36
bin/chromecast.js
Normal file
36
bin/chromecast.js
Normal file
@ -0,0 +1,36 @@
|
||||
const ChromecastAPI = require('chromecast-api')
|
||||
|
||||
async function getDevice() {
|
||||
const client = new ChromecastAPI()
|
||||
return new Promise(function (resolve, reject) {
|
||||
client.on('device', function (device) {
|
||||
// console.log(device)
|
||||
if (device.friendlyName === 'Downstairs') {
|
||||
resolve(device);
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
async function test() {
|
||||
var mediaURL = 'https://www.youtube.com/watch?v=pb05OXz7-Ko&list=PLATQ8iWXs4GzKzUhHyImBCvVVQWkTnmeM';
|
||||
test = await getDevice()
|
||||
console.log(test)
|
||||
test.play(mediaURL, function (err) {
|
||||
if (!err) console.log('Playing in your chromecast')
|
||||
})
|
||||
}
|
||||
|
||||
test()
|
||||
|
||||
// console.log(device)
|
||||
// if (device.friendlyName === 'Downstairs') {
|
||||
// test.friendlyName = device.friendlyName,
|
||||
// test.name = device.name,
|
||||
// test.host = device.host
|
||||
// }
|
||||
|
||||
// // device.play(mediaURL, function (err) {
|
||||
// // if (!err) console.log('Playing in your chromecast')
|
||||
// // })
|
||||
// })
|
224
bin/newCast.js
Normal file
224
bin/newCast.js
Normal file
@ -0,0 +1,224 @@
|
||||
const express = require('express');
|
||||
const bodyParser = require('body-parser');
|
||||
const mdns = require('mdns');
|
||||
const Client = require('castv2-client').Client;
|
||||
const DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
|
||||
const request = require('request');
|
||||
const os = require('os');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const querystring = require('querystring');
|
||||
|
||||
const PORT = process.env.PORT || 3002;
|
||||
const app = express();
|
||||
const devices = new Map();
|
||||
let playlist = [];
|
||||
|
||||
const browser = mdns.createBrowser(mdns.tcp('googlecast'));
|
||||
|
||||
function deviceRegister(name, address, port) {
|
||||
let id = devices.size;
|
||||
let client = new Client();
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
client.connect(address, () => {
|
||||
client.launch(DefaultMediaReceiver, (err, player) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
return;
|
||||
}
|
||||
|
||||
devices.set(id, { name, address, port, client, player });
|
||||
resolve(player);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function createEventListeners(player) {
|
||||
player.on('status', function(status) {
|
||||
console.log('status broadcast playerState=%s', status.playerState);
|
||||
if (status.playerState === 'IDLE') {
|
||||
playlist.splice(0, 1);
|
||||
writePlaylist();
|
||||
if (playlist.length > 0) {
|
||||
player.load(playlist[0], { autoplay: true}, (err, status) => {
|
||||
console.log('Play!');
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function writePlaylist() {
|
||||
let songs = playlist.map(p => p.metadata.title).join('\n');
|
||||
let content = `http://dk.ngrok.io/api
|
||||
${songs}`
|
||||
fs.writeFileSync(path.join(os.homedir(), 'playlist.txt'), content, 'utf8');
|
||||
}
|
||||
|
||||
function getMediaObject(name, artist, songUrl, picture) {
|
||||
return {
|
||||
contentId: songUrl,
|
||||
contentType: 'audio/mpeg3',
|
||||
streamType: 'LIVE', // or LIVE
|
||||
|
||||
// Title and cover displayed while buffering
|
||||
metadata: {
|
||||
type: 0,
|
||||
metadataType: 0,
|
||||
title: `${name} - ${artist}`,
|
||||
images: [
|
||||
{ url: picture }
|
||||
]
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
let idx = 0;
|
||||
browser.on('serviceUp', (service) => {
|
||||
if (idx !== 0) {
|
||||
return;
|
||||
}
|
||||
idx = 1;
|
||||
console.log('found device "%s" at %s:%d', service.name, service.addresses[0], service.port);
|
||||
// ondeviceup(service.addresses[0]);
|
||||
deviceRegister(service.name, service.addresses[0], service.port).then(player => {
|
||||
console.log('Player registered');
|
||||
return player;
|
||||
}).then(createEventListeners).catch((err) => {
|
||||
console.error(err.message);
|
||||
});
|
||||
browser.stop();
|
||||
});
|
||||
|
||||
browser.start();
|
||||
|
||||
app.use(bodyParser.urlencoded({ extended: false }));
|
||||
app.use(bodyParser.json());
|
||||
|
||||
app.get('/api', (req, res, next) => {
|
||||
let stack = app._router.stack;
|
||||
let methodList = [];
|
||||
Object.keys(stack).forEach(key => {
|
||||
let route = stack[key].route;
|
||||
if (route) {
|
||||
methodList.push(`${route.stack[0].method.toUpperCase()} ${route.path}`);
|
||||
}
|
||||
});
|
||||
res.type('text/plain').send(`Available routes:
|
||||
|
||||
${methodList.join('\n')}
|
||||
`);
|
||||
});
|
||||
|
||||
app.get('/api/devices', (req, res, next) => {
|
||||
let result = [];
|
||||
|
||||
for (let [id, { name, address }] of devices) {
|
||||
result.push({id, name, address});
|
||||
}
|
||||
|
||||
res.send({result});
|
||||
});
|
||||
|
||||
app.get('/api/devices/:id', (req, res, next) => {
|
||||
let device = devices.get(parseInt(req.params.id, 10));
|
||||
let result = {}
|
||||
if (device) {
|
||||
result.name = device.name;
|
||||
result.address = device.address;
|
||||
result.port = device.port;
|
||||
}
|
||||
|
||||
res.send(result);
|
||||
});
|
||||
|
||||
app.patch('/api/devices/:id', (req, res, next) => {
|
||||
let state = req.body.state.toLowerCase();
|
||||
let device = devices.get(parseInt(req.params.id, 10));
|
||||
|
||||
if (!device) {
|
||||
res.send(500, 'FAIL');
|
||||
return;
|
||||
}
|
||||
|
||||
if (state === 'pause') {
|
||||
playlist = [playlist[0], ...playlist];
|
||||
device.player.pause((err, state) => {
|
||||
console.log('Pause');
|
||||
});
|
||||
return res.send('PAUSED');
|
||||
} else if (state === 'play') {
|
||||
device.player.play((err, state) => {
|
||||
console.log('Play');
|
||||
});
|
||||
return res.send('PLAY');
|
||||
} else if (state === 'skip') {
|
||||
playlist.splice(0, 1);
|
||||
if (playlist.length > 0) {
|
||||
device.player.load(playlist[0], { autoplay: true }, (err, state) => {
|
||||
});
|
||||
}
|
||||
res.send('SKIP');
|
||||
writePlaylist();
|
||||
}
|
||||
});
|
||||
|
||||
app.post('/api/devices/:id/songs', (req, res, next) => {
|
||||
let song = req.body.song;
|
||||
let { player } = devices.get(parseInt(req.params.id, 10));
|
||||
|
||||
if (!song) {
|
||||
res.send(400, 'Please submit a "song" post paramater');
|
||||
return;
|
||||
}
|
||||
|
||||
request.get(`https://api.spotify.com/v1/search?q=${querystring.escape(song)}&type=track&market=DE`, (err, data, body) => {
|
||||
if (err || data.statusCode !== 200) {
|
||||
// console.error(err, data);
|
||||
res.send(500, 'FAIL');
|
||||
return;
|
||||
}
|
||||
|
||||
body = JSON.parse(body);
|
||||
let track = body.tracks.items[0];
|
||||
if (track) {
|
||||
let id = track.id;
|
||||
|
||||
request.get(`https://api.spotify.com/v1/tracks/${id}`, (err, data, body) => {
|
||||
if (err || data.statusCode !== 200) {
|
||||
// console.error(err, data);
|
||||
res.send(500, 'FAIL');
|
||||
return;
|
||||
}
|
||||
body = JSON.parse(body);
|
||||
|
||||
if (body) {
|
||||
let albumImage = body.album.images[0].url;
|
||||
let title = body.name;
|
||||
let artist = body.artists[0].name;
|
||||
let url = body.preview_url;
|
||||
|
||||
let media = getMediaObject(title, artist, url, albumImage);
|
||||
|
||||
playlist.push(media);
|
||||
console.log(playlist);
|
||||
writePlaylist();
|
||||
|
||||
if (playlist.length === 1) {
|
||||
player.load(media, { autoplay: true }, (err, status) => {
|
||||
console.log('PLAY');
|
||||
});
|
||||
}
|
||||
|
||||
res.send({albumImage, artist, title, url});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Listening on port ${PORT}`);
|
||||
});
|
360
package-lock.json
generated
360
package-lock.json
generated
@ -47,6 +47,60 @@
|
||||
"fastq": "^1.6.0"
|
||||
}
|
||||
},
|
||||
"@protobufjs/aspromise": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
|
||||
"integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
|
||||
},
|
||||
"@protobufjs/base64": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
|
||||
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
|
||||
},
|
||||
"@protobufjs/codegen": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
|
||||
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
|
||||
},
|
||||
"@protobufjs/eventemitter": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
|
||||
"integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
|
||||
},
|
||||
"@protobufjs/fetch": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
|
||||
"integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
|
||||
"requires": {
|
||||
"@protobufjs/aspromise": "^1.1.1",
|
||||
"@protobufjs/inquire": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"@protobufjs/float": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
|
||||
"integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
|
||||
},
|
||||
"@protobufjs/inquire": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
|
||||
"integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
|
||||
},
|
||||
"@protobufjs/path": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
|
||||
"integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
|
||||
},
|
||||
"@protobufjs/pool": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
|
||||
"integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
|
||||
},
|
||||
"@protobufjs/utf8": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
|
||||
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
|
||||
},
|
||||
"@types/babel-types": {
|
||||
"version": "7.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz",
|
||||
@ -65,6 +119,16 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
|
||||
"integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
|
||||
},
|
||||
"@types/long": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
|
||||
"integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "10.17.17",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz",
|
||||
"integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q=="
|
||||
},
|
||||
"abbrev": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
|
||||
@ -194,6 +258,14 @@
|
||||
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
|
||||
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
|
||||
},
|
||||
"async": {
|
||||
"version": "2.6.3",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
|
||||
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
|
||||
"requires": {
|
||||
"lodash": "^4.17.14"
|
||||
}
|
||||
},
|
||||
"asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
@ -283,6 +355,11 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"bluebird": {
|
||||
"version": "3.7.2",
|
||||
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
|
||||
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.19.0",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
|
||||
@ -338,6 +415,24 @@
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"buffer-indexof": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
|
||||
"integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
|
||||
},
|
||||
"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",
|
||||
@ -353,6 +448,39 @@
|
||||
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
|
||||
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
|
||||
},
|
||||
"castv2": {
|
||||
"version": "0.1.10",
|
||||
"resolved": "https://registry.npmjs.org/castv2/-/castv2-0.1.10.tgz",
|
||||
"integrity": "sha512-3QWevHrjT22KdF08Y2a217IYCDQDP7vEJaY4n0lPBeC5UBYbMFMadDfVTsaQwq7wqsEgYUHElPGm3EO1ey+TNw==",
|
||||
"requires": {
|
||||
"debug": "^4.1.1",
|
||||
"protobufjs": "^6.8.8"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
|
||||
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"castv2-client": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/castv2-client/-/castv2-client-1.2.0.tgz",
|
||||
"integrity": "sha1-qRk7GlRIuMuaBBW9AhyIEe17BUQ=",
|
||||
"requires": {
|
||||
"castv2": "~0.1.4",
|
||||
"debug": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"center-align": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
|
||||
@ -389,6 +517,41 @@
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
|
||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
|
||||
},
|
||||
"chromecast-api": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/chromecast-api/-/chromecast-api-0.3.1.tgz",
|
||||
"integrity": "sha512-g6XMgJSYBd3aFNEZL+dgsh7PXFtdJyzv7BDkjzBTW32TpZ+GyeJiDs4KtycH8W6m8M8UAn9OIvfuB2yH8ljYDw==",
|
||||
"requires": {
|
||||
"castv2-client": "1.2.0",
|
||||
"debug": "^4.1.1",
|
||||
"dns-txt": "^2.0.2",
|
||||
"mime": "^2.3.1",
|
||||
"multicast-dns": "^7.2.0",
|
||||
"node-ssdp": "^4.0.0",
|
||||
"xml2js": "^0.4.23",
|
||||
"youtube-remote": "^1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
|
||||
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"mime": {
|
||||
"version": "2.4.4",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
|
||||
"integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"clean-css": {
|
||||
"version": "3.4.28",
|
||||
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
|
||||
@ -597,6 +760,23 @@
|
||||
"path-type": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"dns-packet": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-4.2.0.tgz",
|
||||
"integrity": "sha512-bn1AKpfkFbm0MIioOMHZ5qJzl2uypdBwI4nYNsqvhjsegBhcKJUlCrMPWLx6JEezRjxZmxhtIz/FkBEur2l8Cw==",
|
||||
"requires": {
|
||||
"ip": "^1.1.5",
|
||||
"safe-buffer": "^5.1.1"
|
||||
}
|
||||
},
|
||||
"dns-txt": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
|
||||
"integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
|
||||
"requires": {
|
||||
"buffer-indexof": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"doctypes": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
|
||||
@ -941,6 +1121,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 +1190,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 +1282,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",
|
||||
@ -1152,6 +1373,11 @@
|
||||
"p-is-promise": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"ip": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
|
||||
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
||||
@ -1312,11 +1538,32 @@
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
||||
},
|
||||
"long": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
|
||||
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
|
||||
},
|
||||
"longest": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
|
||||
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
|
||||
},
|
||||
"mdns": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/mdns/-/mdns-2.5.1.tgz",
|
||||
"integrity": "sha512-JglS7Ed3Yf0BCpyC7LXA1MUrumMV8jj4g67nT3+m886SFYllz2HWBg8ObywFXWbBSv5gW0meMOOS4vVa2jZGCw==",
|
||||
"requires": {
|
||||
"bindings": "~1.2.1",
|
||||
"nan": "^2.14.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"bindings": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
|
||||
"integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE="
|
||||
}
|
||||
}
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
@ -1436,6 +1683,15 @@
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"multicast-dns": {
|
||||
"version": "7.2.1",
|
||||
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.1.tgz",
|
||||
"integrity": "sha512-qJaNecNV4wV5FqZ+aBHOgUcHaJXpEMZhiERmuu7CM0YrCyIsgevVLZJGXeyxMAiofN+jby8oAGr8BpQk6xmptw==",
|
||||
"requires": {
|
||||
"dns-packet": "^4.0.0",
|
||||
"thunky": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"multistream": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz",
|
||||
@ -1530,6 +1786,33 @@
|
||||
"tar": "^4"
|
||||
}
|
||||
},
|
||||
"node-ssdp": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/node-ssdp/-/node-ssdp-4.0.0.tgz",
|
||||
"integrity": "sha512-JQoNKfRYj/MvOFvE5de/SRJEhkLIHx2MVyiYi46rEGWkH+LuFZhSHvWP7JaFiVs+C+GOdl3c1qC9yDs8lSV4Fg==",
|
||||
"requires": {
|
||||
"async": "^2.6.0",
|
||||
"bluebird": "^3.5.1",
|
||||
"debug": "^3.1.0",
|
||||
"extend": "^3.0.1",
|
||||
"ip": "^1.1.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"noop-logger": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
|
||||
@ -1622,6 +1905,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 +1937,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",
|
||||
@ -1785,6 +2086,26 @@
|
||||
"asap": "~2.0.3"
|
||||
}
|
||||
},
|
||||
"protobufjs": {
|
||||
"version": "6.8.8",
|
||||
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz",
|
||||
"integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==",
|
||||
"requires": {
|
||||
"@protobufjs/aspromise": "^1.1.2",
|
||||
"@protobufjs/base64": "^1.1.2",
|
||||
"@protobufjs/codegen": "^2.0.4",
|
||||
"@protobufjs/eventemitter": "^1.1.0",
|
||||
"@protobufjs/fetch": "^1.1.0",
|
||||
"@protobufjs/float": "^1.0.2",
|
||||
"@protobufjs/inquire": "^1.1.0",
|
||||
"@protobufjs/path": "^1.1.2",
|
||||
"@protobufjs/pool": "^1.1.0",
|
||||
"@protobufjs/utf8": "^1.1.0",
|
||||
"@types/long": "^4.0.0",
|
||||
"@types/node": "^10.1.0",
|
||||
"long": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
|
||||
@ -2413,6 +2734,11 @@
|
||||
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
|
||||
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
|
||||
},
|
||||
"thunky": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
|
||||
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
|
||||
},
|
||||
"tmp": {
|
||||
"version": "0.0.33",
|
||||
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
|
||||
@ -2650,6 +2976,20 @@
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||
},
|
||||
"xml2js": {
|
||||
"version": "0.4.23",
|
||||
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
|
||||
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
|
||||
"requires": {
|
||||
"sax": ">=0.6.0",
|
||||
"xmlbuilder": "~11.0.0"
|
||||
}
|
||||
},
|
||||
"xmlbuilder": {
|
||||
"version": "11.0.1",
|
||||
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
|
||||
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
|
||||
@ -2665,6 +3005,26 @@
|
||||
"decamelize": "^1.0.0",
|
||||
"window-size": "0.1.0"
|
||||
}
|
||||
},
|
||||
"youtube-remote": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/youtube-remote/-/youtube-remote-1.0.1.tgz",
|
||||
"integrity": "sha512-VAJYtADZWMymqDEhdgOrd/yobxKNXIF0zJvHEXwbxGouUPPNHlceJzKVkyt6hHQH3lncTJSJLIUZi3G5DlhzCA==",
|
||||
"requires": {
|
||||
"lodash": "^4.17.4",
|
||||
"needle": "^1.6.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"needle": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/needle/-/needle-1.6.0.tgz",
|
||||
"integrity": "sha1-9SpYWJchIWGOAC+OY4TK2sItYk8=",
|
||||
"requires": {
|
||||
"debug": "^2.1.2",
|
||||
"iconv-lite": "^0.4.4"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,6 +9,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"body-parser": "^1.19.0",
|
||||
"castv2-client": "^1.2.0",
|
||||
"chromecast-api": "^0.3.1",
|
||||
"cookie-parser": "~1.4.4",
|
||||
"debug": "~2.6.9",
|
||||
"drivelist": "^8.0.10",
|
||||
@ -17,6 +19,7 @@
|
||||
"fs": "0.0.1-security",
|
||||
"http-errors": "~1.6.3",
|
||||
"inquirer": "^7.0.6",
|
||||
"mdns": "^2.5.1",
|
||||
"morgan": "~1.9.1",
|
||||
"net": "^1.0.2",
|
||||
"path": "^0.12.7",
|
||||
|
Loading…
x
Reference in New Issue
Block a user