update now playing screen
This commit is contained in:
parent
3ead8a75b4
commit
ad285bf734
20 changed files with 265 additions and 119 deletions
|
@ -30,6 +30,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
var repeatMode = 'RepeatNone';
|
||||
var playlist = [];
|
||||
var currentPlaylistIndex;
|
||||
var currentPlaylistItemId;
|
||||
var currentPlayOptions;
|
||||
var playNextAfterEnded = true;
|
||||
var playerStates = {};
|
||||
|
@ -454,8 +455,14 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
});
|
||||
};
|
||||
|
||||
self.playlist = function () {
|
||||
return playlist.slice(0);
|
||||
self.getPlaylist = function (player) {
|
||||
|
||||
player = player || currentPlayer;
|
||||
if (player && !enableLocalPlaylistManagement(player)) {
|
||||
return player.getPlaylist();
|
||||
}
|
||||
|
||||
return Promise.resolve(playlist.slice(0));
|
||||
};
|
||||
|
||||
self.getCurrentPlayer = function () {
|
||||
|
@ -916,9 +923,9 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
changeStream(player, ticks);
|
||||
};
|
||||
|
||||
self.nextChapter = function () {
|
||||
self.nextChapter = function (player) {
|
||||
|
||||
var player = currentPlayer;
|
||||
player = player || currentPlayer;
|
||||
var item = self.currentItem(player);
|
||||
|
||||
var ticks = getCurrentTicks(player);
|
||||
|
@ -930,15 +937,15 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
})[0];
|
||||
|
||||
if (nextChapter) {
|
||||
self.seek(nextChapter.StartPositionTicks);
|
||||
self.seek(nextChapter.StartPositionTicks, player);
|
||||
} else {
|
||||
self.nextTrack();
|
||||
self.nextTrack(player);
|
||||
}
|
||||
};
|
||||
|
||||
self.previousChapter = function () {
|
||||
self.previousChapter = function (player) {
|
||||
|
||||
var player = currentPlayer;
|
||||
player = player || currentPlayer;
|
||||
var item = self.currentItem(player);
|
||||
|
||||
var ticks = getCurrentTicks(player);
|
||||
|
@ -946,21 +953,26 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
// Go back 10 seconds
|
||||
ticks -= 100000000;
|
||||
|
||||
// If there's no previous track, then at least rewind to beginning
|
||||
if (self.getCurrentPlaylistIndex(player) === 0) {
|
||||
ticks = Math.max(ticks, 0);
|
||||
}
|
||||
|
||||
var previousChapters = (item.Chapters || []).filter(function (i) {
|
||||
|
||||
return i.StartPositionTicks <= ticks;
|
||||
});
|
||||
|
||||
if (previousChapters.length) {
|
||||
self.seek(previousChapters[previousChapters.length - 1].StartPositionTicks);
|
||||
self.seek(previousChapters[previousChapters.length - 1].StartPositionTicks, player);
|
||||
} else {
|
||||
self.previousTrack();
|
||||
self.previousTrack(player);
|
||||
}
|
||||
};
|
||||
|
||||
self.fastForward = function () {
|
||||
self.fastForward = function (player) {
|
||||
|
||||
var player = currentPlayer;
|
||||
player = player || currentPlayer;
|
||||
|
||||
if (player.fastForward != null) {
|
||||
player.fastForward(userSettings.skipForwardLength());
|
||||
|
@ -979,9 +991,9 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
}
|
||||
};
|
||||
|
||||
self.rewind = function () {
|
||||
self.rewind = function (player) {
|
||||
|
||||
var player = currentPlayer;
|
||||
player = player || currentPlayer;
|
||||
|
||||
if (player.rewind != null) {
|
||||
player.rewind(userSettings.skipBackLength());
|
||||
|
@ -1492,7 +1504,15 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
}
|
||||
|
||||
var afterPlayInternal = function () {
|
||||
setPlaylistState(0, items);
|
||||
|
||||
for (var i = 0, length = items.length; i < length; i++) {
|
||||
addUniquePlaylistItemId(items[i]);
|
||||
}
|
||||
playlist = items.slice(0);
|
||||
|
||||
var playIndex = 0;
|
||||
|
||||
setPlaylistState(items[playIndex].PlaylistItemId, playIndex);
|
||||
loading.hide();
|
||||
};
|
||||
|
||||
|
@ -1519,13 +1539,22 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
return true;
|
||||
}
|
||||
|
||||
// Set currentPlaylistIndex and playlist. Using a method allows for overloading in derived player implementations
|
||||
function setPlaylistState(i, items) {
|
||||
if (!isNaN(i)) {
|
||||
currentPlaylistIndex = i;
|
||||
var currentId = 0;
|
||||
function addUniquePlaylistItemId(item) {
|
||||
|
||||
if (!item.PlaylistItemId) {
|
||||
|
||||
item.PlaylistItemId = "playlistItem" + currentId;
|
||||
currentId++;
|
||||
}
|
||||
if (items) {
|
||||
playlist = items.slice(0);
|
||||
}
|
||||
|
||||
// Set playlist state. Using a method allows for overloading in derived player implementations
|
||||
function setPlaylistState(playlistItemId, index) {
|
||||
|
||||
if (!isNaN(index)) {
|
||||
currentPlaylistIndex = index;
|
||||
currentPlaylistItemId = playlistItemId;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2215,55 +2244,114 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
}
|
||||
}
|
||||
|
||||
self.setCurrentPlaylistIndex = function (i, player) {
|
||||
function findPlaylistIndex(playlistItemId, list) {
|
||||
|
||||
for (var i = 0, length = playlist.length; i < length; i++) {
|
||||
if (list[i].PlaylistItemId === playlistItemId) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
self.setCurrentPlaylistItem = function (playlistItemId, player) {
|
||||
|
||||
player = player || currentPlayer;
|
||||
if (player && !enableLocalPlaylistManagement(player)) {
|
||||
return player.setCurrentPlaylistIndex(i);
|
||||
return player.setCurrentPlaylistItem(playlistItemId);
|
||||
}
|
||||
|
||||
var newItem = playlist[i];
|
||||
var newItem;
|
||||
var newItemIndex;
|
||||
for (var i = 0, length = playlist.length; i < length; i++) {
|
||||
if (playlist[i].PlaylistItemId === playlistItemId) {
|
||||
newItem = playlist[i];
|
||||
newItemIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var playOptions = Object.assign({}, currentPlayOptions, {
|
||||
startPositionTicks: 0
|
||||
});
|
||||
if (newItem) {
|
||||
var playOptions = Object.assign({}, currentPlayOptions, {
|
||||
startPositionTicks: 0
|
||||
});
|
||||
|
||||
playInternal(newItem, playOptions, function () {
|
||||
currentPlaylistIndex = i;
|
||||
});
|
||||
playInternal(newItem, playOptions, function () {
|
||||
setPlaylistState(newItem.PlaylistItemId, newItemIndex);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
self.removeFromPlaylist = function (index, player) {
|
||||
self.removeFromPlaylist = function (playlistItemIds, player) {
|
||||
|
||||
if (index < 0) {
|
||||
throw new Error('Invalid playlist index');
|
||||
if (!playlistItemIds) {
|
||||
throw new Error('Invalid playlistItemIds');
|
||||
}
|
||||
|
||||
player = player || currentPlayer;
|
||||
if (player && !enableLocalPlaylistManagement(player)) {
|
||||
return player.removeFromPlaylist(i);
|
||||
return player.removeFromPlaylist(playlistItemIds);
|
||||
}
|
||||
|
||||
if (playlist.length <= 1) {
|
||||
if (playlist.length <= playlistItemIds.length) {
|
||||
return self.stop();
|
||||
}
|
||||
|
||||
var isCurrentIndex = self.getCurrentPlaylistIndex(player) === index;
|
||||
|
||||
playlist.splice(index, 1);
|
||||
var currentPlaylistItemId = self.currentItem(player).PlaylistItemId;
|
||||
var isCurrentIndex = playlistItemIds.indexOf(currentPlaylistItemId) !== -1;
|
||||
|
||||
playlist = playlist.filter(function (item) {
|
||||
return playlistItemIds.indexOf(item.PlaylistItemId) === -1;
|
||||
});
|
||||
events.trigger(player, 'playlistitemremove', [
|
||||
{
|
||||
index: index
|
||||
playlistItemIds: playlistItemIds
|
||||
}]);
|
||||
|
||||
if (isCurrentIndex) {
|
||||
return self.setCurrentPlaylistIndex(Math.min(index, playlist.length - 1), player);
|
||||
return self.setCurrentPlaylistItem(0, player);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
};
|
||||
|
||||
function moveInArray(array, from, to) {
|
||||
array.splice(to, 0, array.splice(from, 1)[0]);
|
||||
}
|
||||
|
||||
self.movePlaylistItem = function (playlistItemId, newIndex, player) {
|
||||
|
||||
player = player || currentPlayer;
|
||||
if (player && !enableLocalPlaylistManagement(player)) {
|
||||
return player.movePlaylistItem(playlistItemId, newIndex);
|
||||
}
|
||||
|
||||
var oldIndex;
|
||||
for (var i = 0, length = playlist.length; i < length; i++) {
|
||||
if (playlist[i].PlaylistItemId === playlistItemId) {
|
||||
oldIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (oldIndex === -1 || oldIndex === newIndex) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (newIndex >= playlist.length) {
|
||||
throw new Error('newIndex out of bounds');
|
||||
}
|
||||
|
||||
moveInArray(playlist, oldIndex, newIndex);
|
||||
|
||||
events.trigger(player, 'playlistitemmove', [
|
||||
{
|
||||
playlistItemId: playlistItemId,
|
||||
newIndex: newIndex
|
||||
}]);
|
||||
};
|
||||
|
||||
self.getCurrentPlaylistIndex = function (i, player) {
|
||||
|
||||
player = player || currentPlayer;
|
||||
|
@ -2271,7 +2359,17 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
return player.getCurrentPlaylistIndex();
|
||||
}
|
||||
|
||||
return currentPlaylistIndex;
|
||||
return findPlaylistIndex(currentPlaylistItemId, playlist);
|
||||
};
|
||||
|
||||
self.getCurrentPlaylistItemId = function (i, player) {
|
||||
|
||||
player = player || currentPlayer;
|
||||
if (player && !enableLocalPlaylistManagement(player)) {
|
||||
return player.getCurrentPlaylistItemId();
|
||||
}
|
||||
|
||||
return currentPlaylistItemId;
|
||||
};
|
||||
|
||||
self.setRepeatMode = function (value, player) {
|
||||
|
@ -2295,7 +2393,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
return repeatMode;
|
||||
};
|
||||
|
||||
function getNextItemInfo() {
|
||||
function getNextItemInfo(player) {
|
||||
|
||||
var newIndex;
|
||||
var playlistLength = playlist.length;
|
||||
|
@ -2303,16 +2401,16 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
switch (self.getRepeatMode()) {
|
||||
|
||||
case 'RepeatOne':
|
||||
newIndex = currentPlaylistIndex;
|
||||
newIndex = self.getCurrentPlaylistIndex(player);
|
||||
break;
|
||||
case 'RepeatAll':
|
||||
newIndex = currentPlaylistIndex + 1;
|
||||
newIndex = self.getCurrentPlaylistIndex(player) + 1;
|
||||
if (newIndex >= playlistLength) {
|
||||
newIndex = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
newIndex = currentPlaylistIndex + 1;
|
||||
newIndex = self.getCurrentPlaylistIndex(player) + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2339,7 +2437,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
return player.nextTrack();
|
||||
}
|
||||
|
||||
var newItemInfo = getNextItemInfo();
|
||||
var newItemInfo = getNextItemInfo(player);
|
||||
|
||||
if (newItemInfo) {
|
||||
|
||||
|
@ -2350,7 +2448,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
});
|
||||
|
||||
playInternal(newItemInfo.item, playOptions, function () {
|
||||
setPlaylistState(newItemInfo.index);
|
||||
setPlaylistState(newItemInfo.item.PlaylistItemId, newItemInfo.index);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -2362,7 +2460,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
return player.previousTrack();
|
||||
}
|
||||
|
||||
var newIndex = currentPlaylistIndex - 1;
|
||||
var newIndex = self.getCurrentPlaylistIndex(player) - 1;
|
||||
if (newIndex >= 0) {
|
||||
var newItem = playlist[newIndex];
|
||||
|
||||
|
@ -2373,7 +2471,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
});
|
||||
|
||||
playInternal(newItem, playOptions, function () {
|
||||
setPlaylistState(newIndex);
|
||||
setPlaylistState(newItem.PlaylistItemId, newIndex);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -2431,6 +2529,8 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
|
||||
function queueAll(items, mode) {
|
||||
for (var i = 0, length = items.length; i < length; i++) {
|
||||
|
||||
addUniquePlaylistItemId(items[i]);
|
||||
playlist.push(items[i]);
|
||||
}
|
||||
}
|
||||
|
@ -2531,7 +2631,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
|
||||
clearProgressInterval(player);
|
||||
|
||||
var nextItem = playNextAfterEnded ? getNextItemInfo() : null;
|
||||
var nextItem = playNextAfterEnded ? getNextItemInfo(player) : null;
|
||||
|
||||
var nextMediaType = (nextItem ? nextItem.item.MediaType : null);
|
||||
|
||||
|
@ -2548,6 +2648,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
|||
if (!nextItem) {
|
||||
playlist = [];
|
||||
currentPlaylistIndex = -1;
|
||||
currentPlaylistItemId = null;
|
||||
}
|
||||
|
||||
events.trigger(player, 'playbackstop', [state]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue