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