Browser = function ( options ) { events.EventEmitter.call( this ); this.init( options ); }
...
npm install chromecast-js
## Usage
``` javascript
chromecastjs = require('chromecast-js')
var browser = new chromecastjs.Browser()
browser.on('deviceOn', function(device){
device.connect()
device.on('connected', function(){
device.play('http://commondatastorage.googleapis.com/gtv-videos-bucket/big_buck_bunny_1080p.mp4', 60, function(){
console.log('Playing in your chromecast!')
...
Device = function (options) { events.EventEmitter.call(this); var self = this; self.config = options; this.init(); }
n/a
Browser = function ( options ) { events.EventEmitter.call( this ); this.init( options ); }
...
npm install chromecast-js
## Usage
``` javascript
chromecastjs = require('chromecast-js')
var browser = new chromecastjs.Browser()
browser.on('deviceOn', function(device){
device.connect()
device.on('connected', function(){
device.play('http://commondatastorage.googleapis.com/gtv-videos-bucket/big_buck_bunny_1080p.mp4', 60, function(){
console.log('Playing in your chromecast!')
...
function EventEmitter() { EventEmitter.init.call(this); }
n/a
init = function ( options ) { var self = this; var ssdpBrowser = new ssdp(); ssdpBrowser.on('response', function (headers, statusCode, rinfo) { if (statusCode != 200) return; if (!headers['LOCATION']) return; var request = http.get(headers['LOCATION'], function(res) { var body = ''; res.on('data', function(chunk) { body += chunk; }); res.on('end', function() { if (body.search('<manufacturer>Google Inc.</manufacturer>') == -1) return; var match = body.match(/<friendlyName>(.+?)<\/friendlyName>/); if (!match || match.length != 2) return; self.update({addresses: [rinfo.address], name: match[1]}); }); }); }); ssdpBrowser.search('urn:dial-multiscreen-org:service:dial:1'); }
...
var util = require('util');
var debug = require('debug')('Device');
var Device = function(options) {
events.EventEmitter.call(this);
var self = this;
self.config = options;
this.init();
};
exports.Device = Device;
util.inherits(Device, events.EventEmitter);
Device.prototype.connect = function(callback) {
var self = this;
...
update = function ( device ) { var dev_config = {addresses: device.addresses, name: device.name}; this.device = new Device(dev_config); this.emit('deviceOn', this.device); }
...
});
res.on('end', function() {
if (body.search('<manufacturer>Google Inc.</manufacturer>') == -1)
return;
var match = body.match(/<friendlyName>(.+?)<\/friendlyName>/);
if (!match || match.length != 2)
return;
self.update({addresses: [rinfo.address], name: match[1]});
});
});
});
ssdpBrowser.search('urn:dial-multiscreen-org:service:dial:1');
};
...
Device = function (options) { events.EventEmitter.call(this); var self = this; self.config = options; this.init(); }
n/a
function EventEmitter() { EventEmitter.init.call(this); }
n/a
changeSubtitles = function (num, callback) { var self = this; self.player.media.sessionRequest({ type: 'EDIT_TRACKS_INFO', activeTrackIds: [num] // turn off subtitles. }, function(err, status){ if (err) callback(err); callback(null, status); }); }
...
if(err) console.log("error setting subtitles off...")
console.log("subtitles removed.")
});
}, 20000);
setTimeout(function(){
console.log('subtitles on!')
device.changeSubtitles(1, function(err, status){
if(err) console.log("error restoring subtitles...")
console.log("subtitles restored.")
});
}, 25000);
setTimeout(function(){
console.log('subtitles on!')
...
changeSubtitlesSize = function (num, callback) { var self = this; var newStyle = self.subtitles_style; newStyle.fontScale = num; self.player.media.sessionRequest({ type: 'EDIT_TRACKS_INFO', textTrackStyle: newStyle }, function(err, status){ if (err) callback(err); callback(null, status); }); }
...
if(err) console.log("error restoring subtitles...")
console.log("English subtitles restored.")
});
}, 45000);
setTimeout(function(){
console.log('Increasing subtitles size...')
device.changeSubtitlesSize(10, function(err, status){
if(err) console.log("error increasing subtitles size...")
console.log("subtitles size increased.")
});
}, 46000);
setTimeout(function(){
device.seek(30,function(){
...
close = function (callback) { if ( this.client ) { this.client.close(); this.client = null; } if (callback) callback(); }
...
exports.Device = Device;
util.inherits(Device, events.EventEmitter);
Device.prototype.connect = function(callback) {
var self = this;
// Always use a fresh client when connecting
if (self.client) self.client.close();
self.client = new Client();
self.client.connect(self.host, function() {
debug('connected, launching app ...');
self.client.launch(DefaultMediaReceiver, function(err, player) {
if (err) {
debug(err);
} else {
...
connect = function (callback) { var self = this; // Always use a fresh client when connecting if (self.client) self.client.close(); self.client = new Client(); self.client.connect(self.host, function() { debug('connected, launching app ...'); self.client.launch(DefaultMediaReceiver, function(err, player) { if (err) { debug(err); } else { self.player = player; self.emit('connected'); if (callback) callback(); } player.on('status', function(status) { if (status){ debug('status broadcast playerState=%s',status.playerState); } else { debug('-'); } }); }); }); self.client.on('error', function(err) { console.log('Error: %s', err.message); self.connect(self.host); self.client.close(); }); }
...
Device.prototype.connect = function(callback) {
var self = this;
// Always use a fresh client when connecting
if (self.client) self.client.close();
self.client = new Client();
self.client.connect(self.host, function() {
debug('connected, launching app ...');
self.client.launch(DefaultMediaReceiver, function(err, player) {
if (err) {
debug(err);
} else {
self.player = player;
self.emit('connected');
...
getStatus = function (callback) { var self = this; self.player.getStatus(function(err, status) { if (err) { console.log("getStatus error: %s", err.message); } else { callback(status); } }); }
...
}
});
};
Device.prototype.getStatus = function(callback) {
var self = this;
self.player.getStatus(function(err, status) {
if (err) {
console.log("getStatus error: %s", err.message);
} else {
callback(status);
}
});
};
...
init = function () { var self = this; self.host = self.config.addresses[0]; self.playing = false; }
...
var util = require('util');
var debug = require('debug')('Device');
var Device = function(options) {
events.EventEmitter.call(this);
var self = this;
self.config = options;
this.init();
};
exports.Device = Device;
util.inherits(Device, events.EventEmitter);
Device.prototype.connect = function(callback) {
var self = this;
...
pause = function (callback) { var self = this; self.playing = false; self.player.pause(callback); }
...
});
};
Device.prototype.pause = function(callback) {
var self = this;
self.playing = false;
self.player.pause(callback);
};
Device.prototype.setVolume = function(volume, callback) {
var self = this;
self.client.setVolume({ level: volume }, callback);
};
...
play = function (resource, n, callback) { var self = this; options = { autoplay: true }; if (typeof(resource) === 'string'){ var media = { contentId: resource, contentType: 'video/mp4' }; } else { var media = { contentId: resource.url, contentType: 'video/mp4' }; if (resource.subtitles){ var tracks = []; var i = 0; for (var each in resource.subtitles ) { var track = { trackId: i, type: 'TEXT', trackContentId: resource.subtitles[i].url, trackContentType: 'text/vtt', name: resource.subtitles[i].name, language: resource.subtitles[i].language, subtype: 'SUBTITLES' }; tracks.push(track); i++; } media.tracks = tracks; options['activeTrackIds'] = [0]; } if (resource.subtitles_style){ media.textTrackStyle = resource.subtitles_style; self.subtitles_style = resource.subtitles_style; } if (resource.cover) { media.metadata = { type: 0, metadataType: 0, title: resource.cover.title, images: [ { url: resource.cover.url } ] }; } } options['currentTime'] = n || 0; self.player.load(media, options, function(err, status) { self.playing = true; if (callback){ callback(err,status); } }); }
...
self.client.setVolume({ 'muted': muted }, callback);
};
Device.prototype.unpause = function(callback) {
var self = this;
self.playing = true;
self.player.play(callback);
};
Device.prototype.stop = function(callback) {
var self = this;
self.playing = false;
self.player.stop(callback);
...
seek = function (seconds, callback) { var self = this; // Retrieve updated status just before seek self.getStatus(function(newStatus) { newCurrentTime = newStatus.currentTime + seconds; self.seekTo(newCurrentTime, callback); }); }
...
callback(status);
}
});
};
// Seeks to specific offset in seconds into the media
Device.prototype.seekTo = function(newCurrentTime, callback) {
this.player.seek(newCurrentTime, callback);
};
// Seeks in seconds relative to currentTime
Device.prototype.seek = function(seconds, callback) {
var self = this;
// Retrieve updated status just before seek
...
seekTo = function (newCurrentTime, callback) { this.player.seek(newCurrentTime, callback); }
...
// Seeks in seconds relative to currentTime
Device.prototype.seek = function(seconds, callback) {
var self = this;
// Retrieve updated status just before seek
self.getStatus(function(newStatus) {
newCurrentTime = newStatus.currentTime + seconds;
self.seekTo(newCurrentTime, callback);
});
};
Device.prototype.pause = function(callback) {
var self = this;
self.playing = false;
...
setVolume = function (volume, callback) { var self = this; self.client.setVolume({ level: volume }, callback); }
...
self.playing = false;
self.player.pause(callback);
};
Device.prototype.setVolume = function(volume, callback) {
var self = this;
self.client.setVolume({ level: volume }, callback);
};
Device.prototype.setVolumeMuted = function(muted, callback){
var self = this;
self.client.setVolume({ 'muted': muted }, callback);
};
...
setVolumeMuted = function (muted, callback){ var self = this; self.client.setVolume({ 'muted': muted }, callback); }
...
if(err) console.log("there was an error changing the volume.");
else console.log('Volume Changed to: '+newVol.level);
});
}, 15000);
setTimeout(function() {
console.log('muting audio');
device.setVolumeMuted(true, function(err, newVol) {
if(err) console.log("there was an error muting the volume.");
else console.log('newVol', newVol);
});
}, 18000);
setTimeout(function() {
console.log('unmuting audio');
...
stop = function (callback) { var self = this; self.playing = false; self.player.stop(callback); }
...
self.player.play(callback);
};
Device.prototype.stop = function(callback) {
var self = this;
self.playing = false;
self.player.stop(callback);
};
Device.prototype.subtitlesOff = function(callback) {
var self = this;
self.player.media.sessionRequest({
type: 'EDIT_TRACKS_INFO',
...
subtitlesOff = function (callback) { var self = this; self.player.media.sessionRequest({ type: 'EDIT_TRACKS_INFO', activeTrackIds: [] // turn off subtitles. }, function(err, status){ if (err) callback(err); callback(null, status); }); }
...
// Starting to play Big Buck Bunny (made in Blender) exactly in the first minute with example subtitles and cover.
device.play(media, 0, function(){
console.log('Playing in your chromecast!')
setTimeout(function(){
console.log('subtitles off!')
device.subtitlesOff(function(err,status){
if(err) console.log("error setting subtitles off...")
console.log("subtitles removed.")
});
}, 20000);
setTimeout(function(){
console.log('subtitles on!')
...
unpause = function (callback) { var self = this; self.playing = true; self.player.play(callback); }
...
setTimeout(function(){
device.pause(function(){
console.log('Paused!')
});
}, 30000);
setTimeout(function(){
device.unpause(function(){
console.log('unpaused!')
});
}, 40000);
setTimeout(function(){
console.log('I ment English subtitles!')
device.changeSubtitles(0, function(err, status){
...
Device = function (options) { events.EventEmitter.call(this); var self = this; self.config = options; this.init(); }
n/a