Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions chromecast-play.html
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,4 @@ <h3>Use</h3>

});
</script>

195 changes: 146 additions & 49 deletions chromecast-play.js
Original file line number Diff line number Diff line change
@@ -1,60 +1,157 @@
var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;

function play(host, url, type) {
function play(host, url, type, volume, node, msg) {

var client = new Client();
try {

client.connect(host, function() {
console.log('connected, launching app on %s with url %s and type %s', host, url, type);
var client = new Client();

client.launch(DefaultMediaReceiver, function(err, player) {
var media = {
client.connect(host, function () {

// Here you can plug an URL to any mp4, webm, mp3 or jpg file with the proper contentType.
contentId: url,
contentType: type,
streamType: 'BUFFERED' // or LIVE
};
if (volume) {
console.log('connected, launching app on %s with url %s, type %s and volume %s', host, url, type, volume);
} else {
console.log('connected, launching app on %s with url %s and type %s', host, url, type);
}

player.load(media, { autoplay: true }, function(err, status) {
console.log('media loaded playerState=%s', status.playerState);
client.close();
});
client.launch(DefaultMediaReceiver, function (err, player) {
var media = {

});
// Here you can plug an URL to any mp4, webm, mp3 or jpg file with the proper contentType.
contentId: url,
contentType: type,
streamType: 'BUFFERED' // or LIVE
};

if (typeof volume !== 'undefined') {

if (volume > 0) {
var obj = {
level: volume / 100
};
} else {
var obj = {
muted: true
};
}

client.setVolume(obj, function (err, newvol) {
if (err) {
console.log("there was an error setting the volume")
node.error("Chromecast error: there was an error setting the volume");
msg.error = "there was an error setting the volume";
node.send(msg);
return node.status({
shape: "dot",
fill: "red",
text: "error: there was an error setting the volume"
});
}
console.log("volume changed to %s", Math.round(newvol.level * 100))
});

}

if (player) {

player.on('status', function (status) {
console.log('status broadcast playerState=%s', status.playerState);
});

player.load(media, {autoplay: true}, function (err, status) {
if (status) {
console.log('media loaded playerState=%s', status.playerState);
node.status({});
}
if (err) {
console.log('media loaded error= %s', err);
msg.error = " " + err;
node.send(msg);
node.error("Chromecast error: " + err);
return node.status({
shape: "dot",
fill: "red",
text: " " + err
});

}

client.close();

});

}

node.send(msg);

});

});

client.on('error', function (err) {
msg.error = " " + err;
node.send(msg);
node.error("Chromecast " + err);

client.close();

return node.status({
shape: "dot",
fill: "red",
text: " " + err
});
});

} catch (err) {
node.status({
shape: "dot",
fill: "red",
text: " " + err
});
node.error("Chromecast error: " + err);
}

});
}

module.exports = function(RED) {
'use strict';

function Node(n) {

RED.nodes.createNode(this,n);

var node = this;

this.on('input', function (msg) {

var creds = RED.nodes.getNode(n.creds),
payload = typeof msg.payload === 'object' ? msg.payload : {};

var attrs = ['ip', 'url', 'contentType'];
for (var attr of attrs) {
if (n[attr]) {
payload[attr] = n[attr];
}
}

if (payload.ip && payload.url && payload.contentType) {
play(payload.ip, payload.url, payload.contentType);
}

node.send(msg);
});
}

RED.nodes.registerType('chromecast-play', Node);
module.exports = function (RED) {
'use strict';

function Node(n) {

RED.nodes.createNode(this, n);

var node = this;

this.on('input', function (msg) {

var creds = RED.nodes.getNode(n.creds),
payload = typeof msg.payload === 'object' ? msg.payload : {};

var attrs = ['ip', 'url', 'contentType', 'volume'];
for (var attr of attrs) {
if (n[attr]) {
payload[attr] = n[attr];
}
}

if (payload.ip && payload.url && payload.contentType) {
try {
play(payload.ip, payload.url, payload.contentType, payload.volume, node, msg);
} catch (err) {
node.status({
shape: "dot",
fill: "red",
text: " " + err
});
node.error("Chromecast error: " + err);
}
}

//node.send(msg);

});
}

RED.nodes.registerType('chromecast-play', Node);
};