re-enable chromecast, not functional yet

This commit is contained in:
Luke Pulverenti 2014-06-18 01:15:51 -04:00
parent 5412ab129e
commit dd1f6487b0
2 changed files with 57 additions and 237 deletions

View File

@ -216,7 +216,7 @@
CastPlayer.prototype.onLaunchError = function () {
console.log("chromecast launch error");
this.deviceState = DEVICE_STATE.ERROR;
Dashboard.alert({
title: Globalize.translate("Error"),
@ -251,41 +251,41 @@
* Loads media into a running receiver application
* @param {Number} mediaIndex An index number to indicate current media content
*/
CastPlayer.prototype.loadMedia = function (user, item, startTimeTicks, mediaSourceId, audioStreamIndex, subtitleStreamIndex) {
CastPlayer.prototype.loadMedia = function (userId, options, command) {
if (!this.session) {
console.log("no session");
return;
}
this.currentMediaOffset = startTimeTicks || 0;
//this.currentMediaOffset = startTimeTicks || 0;
var maxBitrate = 12000000;
var mediaInfo = getMediaSourceInfo(user, item, maxBitrate, mediaSourceId, audioStreamIndex, subtitleStreamIndex);
//var maxBitrate = 12000000;
//var mediaInfo = getMediaSourceInfo(user, item, maxBitrate, mediaSourceId, audioStreamIndex, subtitleStreamIndex);
var streamUrl = getStreamUrl(item, mediaInfo, startTimeTicks, maxBitrate);
//var streamUrl = getStreamUrl(item, mediaInfo, startTimeTicks, maxBitrate);
var castMediaInfo = new chrome.cast.media.MediaInfo(streamUrl);
//var castMediaInfo = new chrome.cast.media.MediaInfo(streamUrl);
castMediaInfo.customData = getCustomData(item, mediaInfo.mediaSource.Id, startTimeTicks);
castMediaInfo.metadata = getMetadata(item);
//castMediaInfo.customData = getCustomData(item, mediaInfo.mediaSource.Id, startTimeTicks);
//castMediaInfo.metadata = getMetadata(item);
if (mediaInfo.streamContainer == 'm3u8') {
castMediaInfo.contentType = 'application/x-mpegURL';
} else {
castMediaInfo.contentType = item.MediaType.toLowerCase() + '/' + mediaInfo.streamContainer.toLowerCase();
}
//if (mediaInfo.streamContainer == 'm3u8') {
// castMediaInfo.contentType = 'application/x-mpegURL';
//} else {
// castMediaInfo.contentType = item.MediaType.toLowerCase() + '/' + mediaInfo.streamContainer.toLowerCase();
//}
castMediaInfo.streamType = mediaInfo.isStatic ? chrome.cast.media.StreamType.BUFFERED : chrome.cast.media.StreamType.LIVE;
//castMediaInfo.streamType = mediaInfo.isStatic ? chrome.cast.media.StreamType.BUFFERED : chrome.cast.media.StreamType.LIVE;
var request = new chrome.cast.media.LoadRequest(castMediaInfo);
request.autoplay = true;
request.currentTime = startTimeTicks ? startTimeTicks / 10000000 : 0;
//var request = new chrome.cast.media.LoadRequest(castMediaInfo);
//request.autoplay = true;
//request.currentTime = startTimeTicks ? startTimeTicks / 10000000 : 0;
this.castPlayerState = PLAYER_STATE.LOADING;
this.session.loadMedia(request,
this.onMediaDiscovered.bind(this, 'loadMedia'),
this.onLoadMediaError.bind(this));
//this.castPlayerState = PLAYER_STATE.LOADING;
//this.session.loadMedia(request,
// this.onMediaDiscovered.bind(this, 'loadMedia'),
// this.onLoadMediaError.bind(this));
};
/**
@ -379,7 +379,7 @@
case PLAYER_STATE.IDLE:
case PLAYER_STATE.LOADING:
case PLAYER_STATE.STOPPED:
this.loadMedia(this.currentMediaIndex);
this.loadMedia();
this.currentMediaSession.addUpdateListener(this.mediaStatusUpdateHandler);
this.castPlayerState = PLAYER_STATE.PLAYING;
break;
@ -578,8 +578,8 @@
/**
* @param {function} A callback function for the fucntion to start timer
*/
CastPlayer.prototype.startProgressTimer = function() {
if(this.timer) {
CastPlayer.prototype.startProgressTimer = function () {
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
@ -588,7 +588,7 @@
this.timer = setInterval(this.incrementMediaTimeHandler, this.timerStep);
};
//var castPlayer = new CastPlayer();
var castPlayer = new CastPlayer();
function getCodecLimits() {
@ -973,8 +973,6 @@
var self = this;
var currentPlaylistIndex;
var getItemFields = "MediaSources,Chapters";
self.name = PlayerName;
@ -983,20 +981,16 @@
self.isMuted = false;
self.playlist = [];
self.playlistIndex = 0;
self.positionTicks = 0;
self.runtimeTicks = 0;
$(castPlayer).on("/playback/complete", function (e) {
if (self.playlistIndex < (self.playlist.items || []).length) {
self.play(self.playlist);
} else {
$(self).trigger("playbackstop.nowplayingbar");
}
var state = self.getPlayerStateInternal();
$(self).trigger("playbackstop", [state]);
});
$(castPlayer).on("/playback/update", function (e, data) {
@ -1006,98 +1000,11 @@
var state = self.getPlayerStateInternal();
$(self).trigger("positionchange.nowplayingbar", [ state ]);
$(self).trigger("positionchange", [state]);
});
function getItemsForPlayback(query) {
var userId = Dashboard.getCurrentUserId();
query.Limit = query.Limit || 100;
query.Fields = getItemFields;
query.ExcludeLocationTypes = "Virtual";
return ApiClient.getItems(userId, query);
}
function queueItems (items) {
for (var i = 0, length = items.length; i < length; i++) {
self.playlist.push(items[i]);
}
}
function queueItemsNext(items) {
var insertIndex = 1;
for (var i = 0, length = items.length; i < length; i++) {
self.playlist.splice(insertIndex, 0, items[i]);
insertIndex++;
}
}
function translateItemsForPlayback(items) {
var deferred = $.Deferred();
var firstItem = items[0];
var promise;
if (firstItem.IsFolder) {
promise = self.getItemsForPlayback({
ParentId: firstItem.Id,
Filters: "IsNotFolder",
Recursive: true,
SortBy: "SortName",
MediaTypes: "Audio,Video"
});
}
else if (firstItem.Type == "MusicArtist") {
promise = self.getItemsForPlayback({
Artists: firstItem.Name,
Filters: "IsNotFolder",
Recursive: true,
SortBy: "SortName",
MediaTypes: "Audio"
});
}
else if (firstItem.Type == "MusicGenre") {
promise = self.getItemsForPlayback({
Genres: firstItem.Name,
Filters: "IsNotFolder",
Recursive: true,
SortBy: "SortName",
MediaTypes: "Audio"
});
}
if (promise) {
promise.done(function (result) {
deferred.resolveWith(null, [result.Items]);
});
} else {
deferred.resolveWith(null, [items]);
}
return deferred.promise();
}
self.play = function (options) {
if (self.isPaused) {
self.isPaused = !self.isPaused;
castPlayer.playMedia();
} else if (options.items) {
Dashboard.getCurrentUser().done(function (user) {
castPlayer.loadMedia(user, options.items[self.playlistIndex++], options.startPositionTicks);
});
} else {
var userId = Dashboard.getCurrentUserId();
var query = {};
query.Limit = query.Limit || 100;
query.Fields = getItemFields;
query.ExcludeLocationTypes = "Virtual";
query.Ids = options.ids.join(',');
ApiClient.getItems(userId, query).done(function (result) {
options.items = result.Items;
self.play(options);
});
}
castPlayer.loadMedia(Dashboard.getCurrentUserId(), options, 'PlayNow');
};
self.unpause = function () {
@ -1137,8 +1044,7 @@
}
self.getItemsForPlayback(query).done(function (result) {
self.playlist = { items: result.Items };
self.play(self.playlist);
self.play({ items: result.Items });
});
});
};
@ -1182,8 +1088,7 @@
}
promise.done(function (result) {
self.playlist = { items: result.Items };
self.play(self.playlist);
self.play({ items: result.Items });
});
});
};
@ -1193,41 +1098,14 @@
};
self.queue = function (options) {
Dashboard.getCurrentUser().done(function (user) {
if (options.items) {
translateItemsForPlayback(options.items).done(function (items) {
queueItems(items);
});
} else {
getItemsForPlayback({
Ids: options.ids.join(',')
}).done(function (result) {
translateItemsForPlayback(result.Items).done(function (items) {
queueItems(items);
});
});
}
});
castPlayer.loadMedia(Dashboard.getCurrentUserId(), options, 'PlayLast');
};
self.queueNext = function (options) {
Dashboard.getCurrentUser().done(function (user) {
if (options.items) {
queueItemsNext(options.items);
} else {
self.getItemsForPlayback({
Ids: options.ids.join(',')
}).done(function (result) {
options.items = result.Items;
queueItemsNext(options.items);
});
}
});
castPlayer.loadMedia(Dashboard.getCurrentUserId(), options, 'PlayNext');
};
self.stop = function () {
self.playlist = [];
self.playlistIndex = 0;
castPlayer.stopMedia();
};
@ -1250,19 +1128,19 @@
};
self.getTargets = function () {
var targets = [];
if (castPlayer.hasReceivers) {
targets.push(self.getCurrentTargetInfo());
}
return targets;
};
self.getCurrentTargetInfo = function () {
var appName = null;
if (castPlayer.session && castPlayer.session.receiver && castPlayer.session.receiver.friendlyName) {
appName = castPlayer.session.receiver.friendlyName;
@ -1285,72 +1163,14 @@
};
};
self.setCurrentTime = function (ticks, item, updateSlider) {
// Convert to ticks
ticks = Math.floor(ticks);
var timeText = Dashboard.getDisplayTime(ticks);
if (self.currentDurationTicks) {
timeText += " / " + Dashboard.getDisplayTime(self.currentDurationTicks);
if (updateSlider) {
var percent = ticks / self.currentDurationTicks;
percent *= 100;
self.positionSlider.val(percent).slider('enable').slider('refresh');
}
} else {
self.positionSlider.slider('disable').slider('refresh');
}
self.currentTimeElement.html(timeText);
};
self.changeStream = function (position) {
castPlayer.seekMedia(position);
};
self.seek = function (position) {
castPlayer.seekMedia(position);
};
self.removeFromPlaylist = function (i) {
self.playlist.remove(i);
};
self.currentPlaylistIndex = function (i) {
if (i == null) {
return currentPlaylistIndex;
}
var newItem = self.playlist[i];
Dashboard.getCurrentUser().done(function (user) {
self.playInternal(newItem, 0, user);
currentPlaylistIndex = i;
});
};
self.nextTrack = function () {
var newIndex = currentPlaylistIndex + 1;
var newItem = self.playlist[newIndex];
if (newItem) {
Dashboard.getCurrentUser().done(function (user) {
self.playInternal(newItem, 0, user);
currentPlaylistIndex = newIndex;
});
}
};
self.previousTrack = function () {
var newIndex = currentPlaylistIndex - 1;
if (newIndex >= 0) {
var newItem = self.playlist[newIndex];
if (newItem) {
Dashboard.getCurrentUser().done(function (user) {
self.playInternal(newItem, 0, user);
currentPlaylistIndex = newIndex;
});
}
}
};
self.beginPlayerUpdates = function () {
@ -1390,13 +1210,13 @@
var state = {
PlayState: {
CanSeek: self.positionTicks < self.runtimeTicks,
CanSeek: self.runtimeTicks && self.positionTicks > 0,
PositionTicks: self.positionTicks,
VolumeLevel: castPlayer.currentVolume * 100,
IsPaused: self.isPaused,
IsMuted: self.isMuted
// TODO: Implement
// AudioStreamIndex: null,
// SubtitleStreamIndex: null,
@ -1406,19 +1226,19 @@
// TODO: Implement
var isPlaying = false;
if (isPlaying) {
//state.PlayState.MediaSourceId = 'xxx';
state.NowPlayingItem = {
state.NowPlayingItem = {
RunTimeTicks: self.runtimeTicks,
Name: 'Chromecast'
};
var nowPlayingItem = state.NowPlayingItem;
// TODO: Fill in these properties using chromecast mediainfo and/or custom data
//nowPlayingItem.Id = item.Id;
//nowPlayingItem.MediaType = item.MediaType;
@ -1440,16 +1260,16 @@
};
}
//MediaController.registerPlayer(new chromecastPlayer());
MediaController.registerPlayer(new chromecastPlayer());
//$(MediaController).on('playerchange', function () {
$(MediaController).on('playerchange', function () {
// if (MediaController.getPlayerInfo().name == PlayerName) {
if (MediaController.getPlayerInfo().name == PlayerName) {
// if (castPlayer.deviceState != DEVICE_STATE.ACTIVE && castPlayer.isInitialized) {
// castPlayer.launchApp();
// }
// }
//});
if (CastPlayer.deviceState != DEVICE_STATE.ACTIVE && CastPlayer.isInitialized) {
CastPlayer.launchApp();
}
}
});
})(window, window.chrome, console);

View File

@ -365,7 +365,7 @@
var time = self.currentDurationTicks * (Number(pct) * .01);
var tooltext = Dashboard.getDisplayTime(time)
var tooltext = Dashboard.getDisplayTime(time);
tooltip.text(tooltext);