mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update now playing playlist
This commit is contained in:
parent
bb816420e7
commit
6820da0e4f
5 changed files with 145 additions and 38 deletions
|
@ -142,6 +142,20 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getRightButtonsHtml(options) {
|
||||||
|
|
||||||
|
var html = '';
|
||||||
|
|
||||||
|
for (var i = 0, length = options.rightButtons.length; i < length; i++) {
|
||||||
|
|
||||||
|
var button = options.rightButtons[i];
|
||||||
|
|
||||||
|
html += '<button is="paper-icon-button-light" class="listItemButton itemAction autoSize" data-action="custom" data-customaction="' + button.id + '" title="' + button.title + '"><i class="md-icon">' + button.icon + '</i></button>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
function getListViewHtml(options) {
|
function getListViewHtml(options) {
|
||||||
|
|
||||||
var items = options.items;
|
var items = options.items;
|
||||||
|
@ -406,9 +420,8 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
||||||
html += '<button is="paper-icon-button-light" class="listItemButton itemAction autoSize" data-action="menu"><i class="md-icon">' + moreIcon + '</i></button>';
|
html += '<button is="paper-icon-button-light" class="listItemButton itemAction autoSize" data-action="menu"><i class="md-icon">' + moreIcon + '</i></button>';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.recordButton) {
|
if (options.rightButtons) {
|
||||||
|
html += getRightButtonsHtml(options);
|
||||||
html += '<button is="paper-icon-button-light" class="listItemButton itemAction autoSize" data-action="programdialog">' + indicators.getTimerIndicator(item) + '</button>';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.enableUserDataButtons !== false) {
|
if (options.enableUserDataButtons !== false) {
|
||||||
|
|
|
@ -2215,7 +2215,12 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.setCurrentPlaylistIndex = function (i) {
|
self.setCurrentPlaylistIndex = function (i, player) {
|
||||||
|
|
||||||
|
player = player || currentPlayer;
|
||||||
|
if (player && !enableLocalPlaylistManagement(player)) {
|
||||||
|
return player.setCurrentPlaylistIndex(i);
|
||||||
|
}
|
||||||
|
|
||||||
var newItem = playlist[i];
|
var newItem = playlist[i];
|
||||||
|
|
||||||
|
@ -2228,7 +2233,43 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
self.getCurrentPlaylistIndex = function (i) {
|
self.removeFromPlaylist = function (index, player) {
|
||||||
|
|
||||||
|
if (index < 0) {
|
||||||
|
throw new Error('Invalid playlist index');
|
||||||
|
}
|
||||||
|
|
||||||
|
player = player || currentPlayer;
|
||||||
|
if (player && !enableLocalPlaylistManagement(player)) {
|
||||||
|
return player.removeFromPlaylist(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playlist.length <= 1) {
|
||||||
|
return self.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
var isCurrentIndex = self.getCurrentPlaylistIndex(player) === index;
|
||||||
|
|
||||||
|
playlist.splice(index, 1);
|
||||||
|
|
||||||
|
events.trigger(player, 'playlistitemremove', [
|
||||||
|
{
|
||||||
|
index: index
|
||||||
|
}]);
|
||||||
|
|
||||||
|
if (isCurrentIndex) {
|
||||||
|
return self.setCurrentPlaylistIndex(Math.min(index, playlist.length - 1), player);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.resolve();
|
||||||
|
};
|
||||||
|
|
||||||
|
self.getCurrentPlaylistIndex = function (i, player) {
|
||||||
|
|
||||||
|
player = player || currentPlayer;
|
||||||
|
if (player && !enableLocalPlaylistManagement(player)) {
|
||||||
|
return player.getCurrentPlaylistIndex();
|
||||||
|
}
|
||||||
|
|
||||||
return currentPlaylistIndex;
|
return currentPlaylistIndex;
|
||||||
};
|
};
|
||||||
|
@ -2241,7 +2282,7 @@ define(['events', 'datetime', 'appSettings', 'pluginManager', 'userSettings', 'g
|
||||||
}
|
}
|
||||||
|
|
||||||
repeatMode = value;
|
repeatMode = value;
|
||||||
events.trigger(self, 'repeatmodechange');
|
events.trigger(player, 'repeatmodechange');
|
||||||
};
|
};
|
||||||
|
|
||||||
self.getRepeatMode = function (player) {
|
self.getRepeatMode = function (player) {
|
||||||
|
|
|
@ -330,6 +330,20 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter', 'g
|
||||||
else if (action === 'addtoplaylist') {
|
else if (action === 'addtoplaylist') {
|
||||||
getItem(target).then(addToPlaylist);
|
getItem(target).then(addToPlaylist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (action === 'custom') {
|
||||||
|
|
||||||
|
var customAction = target.getAttribute('data-customaction');
|
||||||
|
|
||||||
|
card.dispatchEvent(new CustomEvent('action-' + customAction, {
|
||||||
|
detail: {
|
||||||
|
item: getItem(target),
|
||||||
|
index: parseInt(card.getAttribute('data-index') || '-1')
|
||||||
|
},
|
||||||
|
cancelable: false,
|
||||||
|
bubbles: true
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addToPlaylist(item) {
|
function addToPlaylist(item) {
|
||||||
|
|
|
@ -262,13 +262,11 @@
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
var playlistNeedsRefresh = true;
|
var playlistNeedsRefresh = true;
|
||||||
var isEnabled;
|
|
||||||
|
|
||||||
function toggleRepeat(player) {
|
function toggleRepeat(player) {
|
||||||
|
|
||||||
if (player && lastPlayerState) {
|
if (player) {
|
||||||
var state = lastPlayerState;
|
switch (playbackManager.getRepeatMode(player)) {
|
||||||
switch ((state.PlayState || {}).RepeatMode) {
|
|
||||||
case 'RepeatNone':
|
case 'RepeatNone':
|
||||||
playbackManager.setRepeatMode('RepeatAll', player);
|
playbackManager.setRepeatMode('RepeatAll', player);
|
||||||
break;
|
break;
|
||||||
|
@ -329,21 +327,26 @@
|
||||||
context.classList.add('hideVideoButtons');
|
context.classList.add('hideVideoButtons');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateRepeatModeDisplay(playState.RepeatMode);
|
||||||
|
updateNowPlayingInfo(context, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateRepeatModeDisplay(repeatMode) {
|
||||||
|
|
||||||
|
var context = dlg;
|
||||||
var toggleRepeatButton = context.querySelector('.repeatToggleButton');
|
var toggleRepeatButton = context.querySelector('.repeatToggleButton');
|
||||||
|
|
||||||
if (playState.RepeatMode == 'RepeatAll') {
|
if (repeatMode == 'RepeatAll') {
|
||||||
toggleRepeatButton.innerHTML = "<i class='md-icon'>repeat</i>";
|
toggleRepeatButton.innerHTML = "<i class='md-icon'>repeat</i>";
|
||||||
toggleRepeatButton.classList.add('nowPlayingPageRepeatActive');
|
toggleRepeatButton.classList.add('nowPlayingPageRepeatActive');
|
||||||
}
|
}
|
||||||
else if (playState.RepeatMode == 'RepeatOne') {
|
else if (repeatMode == 'RepeatOne') {
|
||||||
toggleRepeatButton.innerHTML = "<i class='md-icon'>repeat_one</i>";
|
toggleRepeatButton.innerHTML = "<i class='md-icon'>repeat_one</i>";
|
||||||
toggleRepeatButton.classList.add('nowPlayingPageRepeatActive');
|
toggleRepeatButton.classList.add('nowPlayingPageRepeatActive');
|
||||||
} else {
|
} else {
|
||||||
toggleRepeatButton.innerHTML = "<i class='md-icon'>repeat</i>";
|
toggleRepeatButton.innerHTML = "<i class='md-icon'>repeat</i>";
|
||||||
toggleRepeatButton.classList.remove('nowPlayingPageRepeatActive');
|
toggleRepeatButton.classList.remove('nowPlayingPageRepeatActive');
|
||||||
}
|
}
|
||||||
|
|
||||||
updateNowPlayingInfo(context, state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updatePlayerVolumeState(context, isMuted, volumeLevel) {
|
function updatePlayerVolumeState(context, isMuted, volumeLevel) {
|
||||||
|
@ -478,7 +481,13 @@
|
||||||
items: items,
|
items: items,
|
||||||
smallIcon: true,
|
smallIcon: true,
|
||||||
action: 'setplaylistindex',
|
action: 'setplaylistindex',
|
||||||
enableUserDataButtons: false
|
enableUserDataButtons: false,
|
||||||
|
rightButtons: [
|
||||||
|
{
|
||||||
|
icon: '',
|
||||||
|
title: globalize.translate('ButtonRemove'),
|
||||||
|
id: 'remove'
|
||||||
|
}]
|
||||||
});
|
});
|
||||||
|
|
||||||
playlistNeedsRefresh = false;
|
playlistNeedsRefresh = false;
|
||||||
|
@ -514,6 +523,23 @@
|
||||||
loadPlaylist(dlg, player);
|
loadPlaylist(dlg, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onRepeatModeChange(e) {
|
||||||
|
|
||||||
|
var player = this;
|
||||||
|
|
||||||
|
updateRepeatModeDisplay(playbackManager.getRepeatMode(player));
|
||||||
|
}
|
||||||
|
|
||||||
|
function onPlaylistUpdate(e) {
|
||||||
|
|
||||||
|
var player = this;
|
||||||
|
|
||||||
|
playbackManager.getPlayerState(player).then(function (state) {
|
||||||
|
|
||||||
|
onStateChanged.call(player, { type: 'init' }, state);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function onPlaybackStopped(e, state) {
|
function onPlaybackStopped(e, state) {
|
||||||
|
|
||||||
console.log('remotecontrol event: ' + e.type);
|
console.log('remotecontrol event: ' + e.type);
|
||||||
|
@ -568,7 +594,8 @@
|
||||||
|
|
||||||
events.off(player, 'playbackstart', onPlaybackStart);
|
events.off(player, 'playbackstart', onPlaybackStart);
|
||||||
events.off(player, 'statechange', onPlaybackStart);
|
events.off(player, 'statechange', onPlaybackStart);
|
||||||
events.off(player, 'repeatmodechange', onPlaybackStart);
|
events.off(player, 'repeatmodechange', onRepeatModeChange);
|
||||||
|
events.off(player, 'playlistitemremove', onPlaylistUpdate);
|
||||||
events.off(player, 'playbackstop', onPlaybackStopped);
|
events.off(player, 'playbackstop', onPlaybackStopped);
|
||||||
events.off(player, 'volumechange', onVolumeChanged);
|
events.off(player, 'volumechange', onVolumeChanged);
|
||||||
events.off(player, 'pause', onPlayPauseStateChanged);
|
events.off(player, 'pause', onPlayPauseStateChanged);
|
||||||
|
@ -596,9 +623,8 @@
|
||||||
|
|
||||||
events.on(player, 'playbackstart', onPlaybackStart);
|
events.on(player, 'playbackstart', onPlaybackStart);
|
||||||
events.on(player, 'statechange', onPlaybackStart);
|
events.on(player, 'statechange', onPlaybackStart);
|
||||||
// TODO: Replace this with smaller changes on repeatmodechange.
|
events.on(player, 'repeatmodechange', onRepeatModeChange);
|
||||||
// For now go cheap and just refresh the entire component
|
events.on(player, 'playlistitemremove', onPlaylistUpdate);
|
||||||
events.on(player, 'repeatmodechange', onPlaybackStart);
|
|
||||||
events.on(player, 'playbackstop', onPlaybackStopped);
|
events.on(player, 'playbackstop', onPlaybackStopped);
|
||||||
events.on(player, 'volumechange', onVolumeChanged);
|
events.on(player, 'volumechange', onVolumeChanged);
|
||||||
events.on(player, 'pause', onPlayPauseStateChanged);
|
events.on(player, 'pause', onPlayPauseStateChanged);
|
||||||
|
@ -740,6 +766,10 @@
|
||||||
|
|
||||||
playbackManager.toggleMute(currentPlayer);
|
playbackManager.toggleMute(currentPlayer);
|
||||||
});
|
});
|
||||||
|
context.querySelector('.playlist').addEventListener('action-remove', function (e) {
|
||||||
|
|
||||||
|
playbackManager.removeFromPlaylist(e.detail.index, currentPlayer);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onPlayerChange() {
|
function onPlayerChange() {
|
||||||
|
|
|
@ -188,9 +188,8 @@
|
||||||
toggleRepeatButton.addEventListener('click', function () {
|
toggleRepeatButton.addEventListener('click', function () {
|
||||||
|
|
||||||
if (currentPlayer) {
|
if (currentPlayer) {
|
||||||
var state = lastPlayerState || {};
|
|
||||||
|
|
||||||
switch ((state.PlayState || {}).RepeatMode) {
|
switch (playbackManager.getRepeatMode(currentPlayer)) {
|
||||||
case 'RepeatAll':
|
case 'RepeatAll':
|
||||||
playbackManager.setRepeatMode('RepeatOne', currentPlayer);
|
playbackManager.setRepeatMode('RepeatOne', currentPlayer);
|
||||||
break;
|
break;
|
||||||
|
@ -344,17 +343,7 @@
|
||||||
toggleRepeatButton.classList.remove('hide');
|
toggleRepeatButton.classList.remove('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (playState.RepeatMode == 'RepeatAll') {
|
updateRepeatModeDisplay(playState.RepeatMode);
|
||||||
toggleRepeatButtonIcon.innerHTML = "repeat";
|
|
||||||
toggleRepeatButton.classList.add('repeatActive');
|
|
||||||
}
|
|
||||||
else if (playState.RepeatMode == 'RepeatOne') {
|
|
||||||
toggleRepeatButtonIcon.innerHTML = "repeat_one";
|
|
||||||
toggleRepeatButton.classList.add('repeatActive');
|
|
||||||
} else {
|
|
||||||
toggleRepeatButtonIcon.innerHTML = "repeat";
|
|
||||||
toggleRepeatButton.classList.remove('repeatActive');
|
|
||||||
}
|
|
||||||
|
|
||||||
updatePlayerVolumeState(playState.IsMuted, playState.VolumeLevel);
|
updatePlayerVolumeState(playState.IsMuted, playState.VolumeLevel);
|
||||||
|
|
||||||
|
@ -368,6 +357,21 @@
|
||||||
updateNowPlayingInfo(state);
|
updateNowPlayingInfo(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateRepeatModeDisplay(repeatMode) {
|
||||||
|
|
||||||
|
if (repeatMode == 'RepeatAll') {
|
||||||
|
toggleRepeatButtonIcon.innerHTML = "repeat";
|
||||||
|
toggleRepeatButton.classList.add('repeatActive');
|
||||||
|
}
|
||||||
|
else if (repeatMode == 'RepeatOne') {
|
||||||
|
toggleRepeatButtonIcon.innerHTML = "repeat_one";
|
||||||
|
toggleRepeatButton.classList.add('repeatActive');
|
||||||
|
} else {
|
||||||
|
toggleRepeatButtonIcon.innerHTML = "repeat";
|
||||||
|
toggleRepeatButton.classList.remove('repeatActive');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function updateTimeDisplay(positionTicks, runtimeTicks) {
|
function updateTimeDisplay(positionTicks, runtimeTicks) {
|
||||||
|
|
||||||
// See bindEvents for why this is necessary
|
// See bindEvents for why this is necessary
|
||||||
|
@ -576,6 +580,13 @@
|
||||||
onStateChanged.call(player, e, state);
|
onStateChanged.call(player, e, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onRepeatModeChange(e) {
|
||||||
|
|
||||||
|
var player = this;
|
||||||
|
|
||||||
|
updateRepeatModeDisplay(playbackManager.getRepeatMode(player));
|
||||||
|
}
|
||||||
|
|
||||||
function showNowPlayingBar() {
|
function showNowPlayingBar() {
|
||||||
|
|
||||||
getNowPlayingBar().then(slideUp);
|
getNowPlayingBar().then(slideUp);
|
||||||
|
@ -681,7 +692,7 @@
|
||||||
if (player) {
|
if (player) {
|
||||||
events.off(player, 'playbackstart', onPlaybackStart);
|
events.off(player, 'playbackstart', onPlaybackStart);
|
||||||
events.off(player, 'statechange', onPlaybackStart);
|
events.off(player, 'statechange', onPlaybackStart);
|
||||||
events.off(player, 'repeatmodechange', onPlaybackStart);
|
events.off(player, 'repeatmodechange', onRepeatModeChange);
|
||||||
events.off(player, 'playbackstop', onPlaybackStopped);
|
events.off(player, 'playbackstop', onPlaybackStopped);
|
||||||
events.off(player, 'volumechange', onVolumeChanged);
|
events.off(player, 'volumechange', onVolumeChanged);
|
||||||
events.off(player, 'pause', onPlayPauseStateChanged);
|
events.off(player, 'pause', onPlayPauseStateChanged);
|
||||||
|
@ -725,9 +736,7 @@
|
||||||
|
|
||||||
events.on(player, 'playbackstart', onPlaybackStart);
|
events.on(player, 'playbackstart', onPlaybackStart);
|
||||||
events.on(player, 'statechange', onPlaybackStart);
|
events.on(player, 'statechange', onPlaybackStart);
|
||||||
// TODO: Replace this with smaller changes on repeatmodechange.
|
events.on(player, 'repeatmodechange', onRepeatModeChange);
|
||||||
// For now go cheap and just refresh the entire component
|
|
||||||
events.on(player, 'repeatmodechange', onPlaybackStart);
|
|
||||||
events.on(player, 'playbackstop', onPlaybackStopped);
|
events.on(player, 'playbackstop', onPlaybackStopped);
|
||||||
events.on(player, 'volumechange', onVolumeChanged);
|
events.on(player, 'volumechange', onVolumeChanged);
|
||||||
events.on(player, 'pause', onPlayPauseStateChanged);
|
events.on(player, 'pause', onPlayPauseStateChanged);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue