chromecast-js
Version:
Chromecast/Googlecast streaming module all in JS
226 lines (188 loc) • 5.94 kB
JavaScript
var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
var events = require('events');
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;
// 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.init = function() {
var self = this;
self.host = self.config.addresses[0];
self.playing = false;
};
Device.prototype.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);
}
});
};
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);
}
});
};
// 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
self.getStatus(function(newStatus) {
newCurrentTime = newStatus.currentTime + seconds;
self.seekTo(newCurrentTime, 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);
};
Device.prototype.setVolumeMuted = function(muted, callback){
var self = this;
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);
};
Device.prototype.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);
});
};
Device.prototype.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);
});
};
Device.prototype.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);
});
};
Device.prototype.close = function(callback) {
if ( this.client ) {
this.client.close();
this.client = null;
}
if (callback) callback();
}