Skip to content

Commit

Permalink
Merge pull request jellyfin#38 from YouKnowBlom/more-maincontroller-c…
Browse files Browse the repository at this point in the history
…leaning

Move play and stop related functions to new class
  • Loading branch information
YouKnowBlom authored Jun 13, 2020
2 parents 5d7017d + 4385835 commit cacccb2
Show file tree
Hide file tree
Showing 3 changed files with 231 additions and 200 deletions.
14 changes: 6 additions & 8 deletions src/components/commandHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,20 @@ import {
shuffle,
instantMix,
isPlaying,
playNextItem,
playPreviousItem,
setAudioStreamIndex,
setSubtitleStreamIndex,
seek,
stop
seek
} from "./maincontroller";

import { getReportingParams } from "../helpers";

import { factory as jellyfinActions } from "./jellyfinactions";

export class commandHandler {
constructor(castContext, playerManager) {
constructor(castContext, playerManager, playbackManager) {
this.castContext = castContext;
this.playerManager = playerManager;
this.playbackManager = playbackManager;

this.supportedCommands = {
PlayNext: this.playNextHandler,
Expand Down Expand Up @@ -70,13 +68,13 @@ export class commandHandler {

nextTrackHandler() {
if (window.playlist && window.currentPlaylistIndex < window.playlist.length - 1) {
playNextItem({}, true);
this.playbackManager.playNextItem({}, true);
}
}

previousTrackHandler() {
if (window.playlist && window.currentPlaylistIndex > 0) {
playPreviousItem({});
this.playbackManager.playPreviousItem({});
}
}

Expand Down Expand Up @@ -130,7 +128,7 @@ export class commandHandler {
}

StopHandler() {
stop();
this.playerManager.stop();
}

PlayPauseHandler() {
Expand Down
200 changes: 8 additions & 192 deletions src/components/maincontroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@ import {
getUrl,
getCurrentPositionTicks,
getReportingParams,
getNextPlaybackItemInfo,
resetPlaybackScope,
getMetadata,
createStreamInfo,
getStreamByIndex,
getSecurityHeaders,
getShuffleItems,
getInstantMixItems,
getIntros,
translateRequestedItems,
setAppStatus,
extend,
Expand All @@ -26,6 +24,7 @@ import {
} from "../helpers";

import { commandHandler } from "./commandHandler";
import { playbackManager } from "./playbackManager";

window.castReceiverContext = cast.framework.CastReceiverContext.getInstance();
window.mediaManager = window.castReceiverContext.getPlayerManager();
Expand All @@ -35,6 +34,8 @@ window.mediaManager.addEventListener(cast.framework.events.category.CORE,
console.log(event);
});

const playbackMgr = new playbackManager();

const playbackConfig = new cast.framework.PlaybackConfig();
// Set the player to start playback as soon as there are five seconds of
// media content buffered. Default is 10.
Expand Down Expand Up @@ -112,10 +113,6 @@ export function disableTimeUpdateListener() {

enableTimeUpdateListener();

export function isPlaying() {
return window.mediaManager.getPlayerState() === cast.framework.messages.PlayerState.PLAYING;
}

window.addEventListener('beforeunload', function () {
// Try to cleanup after ourselves before the page closes
disableTimeUpdateListener();
Expand All @@ -135,7 +132,7 @@ mgr.defaultOnPause = function (event) {
mgr.addEventListener('PAUSE', mgr.defaultOnPause);

mgr.defaultOnStop = function (event) {
stop();
playbackMgr.stop();
};
mgr.addEventListener('ABORT', mgr.defaultOnStop);

Expand All @@ -156,32 +153,6 @@ mgr.addEventListener('ENDED', function () {
}
});

export function stop(nextMode) {

$scope.playNextItem = nextMode ? true : false;
jellyfinActions.stop($scope);

var reportingParams = getReportingParams($scope);

var promise;

jellyfinActions.stopPingInterval();

if (reportingParams.ItemId) {
promise = jellyfinActions.reportPlaybackStopped($scope, reportingParams);
}

window.mediaManager.stop();

window.playlist = [];
window.currentPlaylistIndex = -1;
jellyfinActions.displayUserInfo($scope, $scope.serverAddress, $scope.accessToken, $scope.userId);

promise = promise || Promise.resolve();

return promise;
}

window.castReceiverContext.addEventListener(cast.framework.system.EventType.SYSTEM_VOLUME_CHANGED, function (event) {
console.log("### Cast Receiver Manager - System Volume Changed : " + JSON.stringify(event.data));

Expand Down Expand Up @@ -432,7 +403,7 @@ export function translateItems(data, options, items, method) {
if (method == 'PlayNext' || method == 'PlayLast') {
queue(options.items, method);
} else {
playFromOptions(data.options);
playbackMgr.playFromOptions(data.options);
}
};

Expand All @@ -445,15 +416,15 @@ export function instantMix(data, options, item) {

options.items = result.Items;
tagItems(options.items, data);
playFromOptions(data.options);
playbackMgr.playFromOptions(data.options);
});
}

export function shuffle(data, options, item) {
getShuffleItems(data.serverAddress, data.accessToken, data.userId, item).then(function (result) {
options.items = result.Items;
tagItems(options.items, data);
playFromOptions(data.options);
playbackMgr.playFromOptions(data.options);
});
}

Expand All @@ -463,82 +434,6 @@ export function queue(items) {
}
}

export function playFromOptions(options) {
var firstItem = options.items[0];

if (options.startPositionTicks || firstItem.MediaType !== 'Video') {
playFromOptionsInternal(options);
return;
}

getIntros(firstItem.serverAddress, firstItem.accessToken, firstItem.userId, firstItem).then(function (intros) {

tagItems(intros.Items, {
userId: firstItem.userId,
accessToken: firstItem.accessToken,
serverAddress: firstItem.serverAddress
});

options.items = intros.Items.concat(options.items);
playFromOptionsInternal(options);
});
}

export function playFromOptionsInternal(options) {

var stopPlayer = window.playlist && window.playlist.length > 0;

window.playlist = options.items;
window.currentPlaylistIndex = -1;
playNextItem(options, stopPlayer);
}

// Plays the next item in the list
export function playNextItem(options, stopPlayer) {

var nextItemInfo = getNextPlaybackItemInfo();

if (nextItemInfo) {
window.currentPlaylistIndex = nextItemInfo.index;

var item = nextItemInfo.item;

playItem(item, options || {}, stopPlayer);
return true;
}

return false;
}

export function playPreviousItem(options) {

var playlist = window.playlist;

if (playlist && window.currentPlaylistIndex > 0) {
window.currentPlaylistIndex--;

var item = playlist[window.currentPlaylistIndex];

playItem(item, options || {}, true);
return true;
}
return false;
}

export function playItem(item, options, stopPlayer) {

var callback = function () {
onStopPlayerBeforePlaybackDone(item, options);
};

if (stopPlayer) {

stop("none").then(callback);
} else {
callback();
}
}

export function onStopPlayerBeforePlaybackDone(item, options) {

var requestUrl = getUrl(item.serverAddress, 'Users/' + item.userId + '/Items/' + item.Id);
Expand All @@ -555,7 +450,7 @@ export function onStopPlayerBeforePlaybackDone(item, options) {
// Attach the custom properties we created like userId, serverAddress, itemId, etc
extend(data, item);

playItemInternal(data, options);
playbackMgr.playItemInternal(data, options);

}, broadcastConnectionErrorMessage);
}
Expand All @@ -573,43 +468,6 @@ export function getDeviceProfile(maxBitrate) {

}

export function playItemInternal(item, options) {

$scope.isChangingStream = false;
setAppStatus('loading');

getMaxBitrate(item.MediaType).then(function (maxBitrate) {

var deviceProfile = getDeviceProfile(maxBitrate);

jellyfinActions.getPlaybackInfo(item, maxBitrate, deviceProfile, options.startPositionTicks, options.mediaSourceId, options.audioStreamIndex, options.subtitleStreamIndex).then(function (result) {

if (validatePlaybackInfoResult(result)) {

var mediaSource = getOptimalMediaSource(result.MediaSources);

if (mediaSource) {

if (mediaSource.RequiresOpening) {

jellyfinActions.getLiveStream(item, result.PlaySessionId, maxBitrate, deviceProfile, options.startPositionTicks, mediaSource, null, null).then(function (openLiveStreamResult) {

openLiveStreamResult.MediaSource.enableDirectPlay = supportsDirectPlay(openLiveStreamResult.MediaSource);
playMediaSource(result.PlaySessionId, item, openLiveStreamResult.MediaSource, options);
});

} else {
playMediaSource(result.PlaySessionId, item, mediaSource, options);
}
} else {
showPlaybackInfoErrorMessage('NoCompatibleStream');
}
}

}, broadcastConnectionErrorMessage);
});
}

var lastBitrateDetect = 0;
var detectedBitrate = 0;
export function getMaxBitrate(mediaType) {
Expand Down Expand Up @@ -807,48 +665,6 @@ export function createMediaInformation(playSessionId, item, streamInfo) {
return mediaInfo;
}

export function playMediaSource(playSessionId, item, mediaSource, options) {

setAppStatus('loading');

var streamInfo = createStreamInfo(item, mediaSource, options.startPositionTicks);

var url = streamInfo.url;

var mediaInfo = createMediaInformation(playSessionId, item, streamInfo);
var loadRequestData = new cast.framework.messages.LoadRequestData();
loadRequestData.media = mediaInfo;
loadRequestData.autoplay = true;

jellyfinActions.load($scope, mediaInfo.customData, item);
window.mediaManager.load(loadRequestData);

$scope.PlaybackMediaSource = mediaSource;

console.log('setting src to ' + url);
$scope.mediaSource = mediaSource;

if (item.BackdropImageTags && item.BackdropImageTags.length) {
backdropUrl = $scope.serverAddress + '/emby/Items/' + item.Id + '/Images/Backdrop/0?tag=' + item.BackdropImageTags[0];
} else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
backdropUrl = $scope.serverAddress + '/emby/Items/' + item.ParentBackdropItemId + '/Images/Backdrop/0?tag=' + item.ParentBackdropImageTags[0];
}

if (backdropUrl) {
window.mediaElement.style.setProperty('--background-image', 'url("' + backdropUrl + '")');
} else {
//Replace with a placeholder?
window.mediaElement.style.removeProperty('--background-image');
}

jellyfinActions.reportPlaybackStart($scope, getReportingParams($scope));

// We use false as we do not want to broadcast the new status yet
// we will broadcast manually when the media has been loaded, this
// is to be sure the duration has been updated in the media element
window.mediaManager.setMediaInformation(mediaInfo, false);
}

playbackConfig.supportedCommands = cast.framework.messages.Command.ALL_BASIC_MEDIA;

// Set the available buttons in the UI controls.
Expand Down
Loading

0 comments on commit cacccb2

Please sign in to comment.