mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
add shuffle and instant mix commands
This commit is contained in:
parent
813826b03b
commit
92050a79b1
5 changed files with 74 additions and 63 deletions
|
@ -289,9 +289,7 @@
|
|||
|
||||
showPlayMenu: function (positionTo, itemId, itemType, isFolder, mediaType, resumePositionTicks) {
|
||||
|
||||
var isPlaying = MediaPlayer.isPlaying();
|
||||
|
||||
if (!isPlaying && !resumePositionTicks && mediaType != "Audio" && !isFolder) {
|
||||
if (!resumePositionTicks && mediaType != "Audio" && !isFolder) {
|
||||
MediaController.play(itemId);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -175,6 +175,20 @@
|
|||
showLibraryMenu: showLibraryMenu
|
||||
};
|
||||
|
||||
function updateCastIcon() {
|
||||
|
||||
var info = MediaController.getPlayerInfo();
|
||||
|
||||
if (info.isLocalPlayer) {
|
||||
|
||||
$('.btnCast').addClass('btnDefaultCast').removeClass('btnActiveCast');
|
||||
|
||||
} else {
|
||||
|
||||
$('.btnCast').removeClass('btnDefaultCast').addClass('btnActiveCast');
|
||||
}
|
||||
}
|
||||
|
||||
$(document).on('pageinit', ".libraryPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
@ -211,6 +225,8 @@
|
|||
});
|
||||
}
|
||||
|
||||
updateCastIcon();
|
||||
|
||||
}).on('pageshow', ".libraryPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
@ -228,17 +244,7 @@
|
|||
$(function() {
|
||||
|
||||
$(MediaController).on('playerchange', function () {
|
||||
|
||||
var info = MediaController.getPlayerInfo();
|
||||
|
||||
if (info.isLocalPlayer) {
|
||||
|
||||
$('.btnCast').addClass('btnDefaultCast').removeClass('btnActiveCast');
|
||||
|
||||
} else {
|
||||
|
||||
$('.btnCast').removeClass('btnDefaultCast').addClass('btnActiveCast');
|
||||
}
|
||||
updateCastIcon();
|
||||
});
|
||||
|
||||
});
|
||||
|
|
|
@ -19,7 +19,9 @@
|
|||
|
||||
name: currentPlayer.name,
|
||||
isLocalPlayer: currentPlayer.isLocalPlayer,
|
||||
targetInfo: currentTargetInfo
|
||||
id: currentTargetInfo.id,
|
||||
deviceName: currentTargetInfo.deviceName,
|
||||
playableMediaTypes: currentTargetInfo.playableMediaTypes
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -124,7 +126,7 @@
|
|||
return true;
|
||||
}
|
||||
|
||||
return currentPlayer.canPlayMediaType(item.MediaType);
|
||||
return self.getPlayerInfo().playableMediaTypes.indexOf(item.MediaType) != -1;
|
||||
};
|
||||
|
||||
self.canQueueMediaType = function (mediaType) {
|
||||
|
@ -132,11 +134,6 @@
|
|||
return currentPlayer.canQueueMediaType(mediaType);
|
||||
};
|
||||
|
||||
self.isPlaying = function () {
|
||||
|
||||
return currentPlayer.isPlaying();
|
||||
};
|
||||
|
||||
self.getLocalPlayer = function () {
|
||||
|
||||
return currentPlayer.isLocalPlayer ?
|
||||
|
@ -151,7 +148,7 @@
|
|||
|
||||
window.MediaController = new mediaController();
|
||||
|
||||
function onWebSocketMessageReceived(msg) {
|
||||
function onWebSocketMessageReceived(e, msg) {
|
||||
|
||||
var localPlayer = msg.MessageType === "Play" || msg.MessageType === "Play" ?
|
||||
MediaController.getLocalPlayer() :
|
||||
|
@ -212,11 +209,17 @@
|
|||
|
||||
var id = 'radioPlayerTarget' + i;
|
||||
|
||||
var isChecked = target.id == playerInfo.targetInfo.id;
|
||||
var isChecked = target.id == playerInfo.id;
|
||||
var checkedHtml = isChecked ? ' checked="checked"' : '';
|
||||
|
||||
html += '<input type="radio" class="radioSelectPlayerTarget" name="radioSelectPlayerTarget" data-playername="' + target.playerName + '" data-targetid="' + target.id + '" data-targetname="' + target.name + '" id="' + id + '" value="' + target.id + '"' + checkedHtml + '>';
|
||||
html += '<label for="' + id + '">' + target.name + '</label>';
|
||||
html += '<input type="radio" class="radioSelectPlayerTarget" name="radioSelectPlayerTarget" data-mediatypes="' + target.playableMediaTypes.join(',') + '" data-playername="' + target.playerName + '" data-targetid="' + target.id + '" data-targetname="' + target.name + '" id="' + id + '" value="' + target.id + '"' + checkedHtml + '>';
|
||||
html += '<label for="' + id + '" style="font-weight:normal;">' + target.name;
|
||||
|
||||
if (target.appName) {
|
||||
html += '<br/><span style="color:#bbb;">' + target.appName + '</span>';
|
||||
}
|
||||
|
||||
html += '</label>';
|
||||
}
|
||||
|
||||
html += '</fieldset>';
|
||||
|
@ -249,10 +252,12 @@
|
|||
var playerName = this.getAttribute('data-playername');
|
||||
var targetId = this.getAttribute('data-targetid');
|
||||
var targetName = this.getAttribute('data-targetname');
|
||||
var playableMediaTypes = this.getAttribute('data-mediatypes').split(',');
|
||||
|
||||
MediaController.setActivePlayer(playerName, {
|
||||
id: targetId,
|
||||
name: targetName
|
||||
name: targetName,
|
||||
playableMediaTypes: playableMediaTypes
|
||||
|
||||
});
|
||||
});
|
||||
|
|
|
@ -30,8 +30,9 @@
|
|||
|
||||
var targets = [{
|
||||
name: 'My Browser',
|
||||
id: self.name,
|
||||
playerName: self.name
|
||||
id: ApiClient.deviceId(),
|
||||
playerName: self.name,
|
||||
playableMediaTypes: ['Audio', 'Video']
|
||||
}];
|
||||
|
||||
return targets;
|
||||
|
@ -299,19 +300,6 @@
|
|||
return params;
|
||||
};
|
||||
|
||||
self.canPlayMediaType = function (mediaType) {
|
||||
|
||||
if (mediaType === "Video") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mediaType === "Audio") {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
self.canQueueMediaType = function (mediaType) {
|
||||
|
||||
return currentItem && currentItem.MediaType == mediaType;
|
||||
|
@ -1114,12 +1102,7 @@
|
|||
window.MediaPlayer = new mediaPlayer();
|
||||
|
||||
window.MediaController.registerPlayer(window.MediaPlayer);
|
||||
window.MediaController.setActivePlayer(window.MediaPlayer, {
|
||||
|
||||
id: window.MediaPlayer.name,
|
||||
name: window.MediaPlayer.name
|
||||
|
||||
});
|
||||
window.MediaController.setActivePlayer(window.MediaPlayer, window.MediaPlayer.getTargets()[0]);
|
||||
|
||||
|
||||
})(document, setTimeout, clearTimeout, screen, localStorage, $, setInterval, window);
|
|
@ -411,6 +411,27 @@
|
|||
|
||||
window.RemoteControl = new remoteControl();
|
||||
|
||||
function sendPlayCommand(options, playType) {
|
||||
|
||||
var sessionId = MediaController.getPlayerInfo().id;
|
||||
|
||||
var ids = options.ids || options.items.map(function (i) {
|
||||
return i.Id;
|
||||
});
|
||||
|
||||
var remoteOptions = {
|
||||
ItemIds: ids.join(','),
|
||||
|
||||
PlayCommand: playType
|
||||
};
|
||||
|
||||
if (options.startPositionTicks) {
|
||||
remoteOptions.startPositionTicks = options.startPositionTicks;
|
||||
}
|
||||
|
||||
ApiClient.sendPlayCommand(sessionId, remoteOptions);
|
||||
}
|
||||
|
||||
function remoteControlPlayer() {
|
||||
|
||||
var self = this;
|
||||
|
@ -419,36 +440,32 @@
|
|||
|
||||
self.play = function (options) {
|
||||
|
||||
sendPlayCommand(options, 'PlayNow');
|
||||
};
|
||||
|
||||
self.shuffle = function (id) {
|
||||
|
||||
sendPlayCommand({ ids: [id] }, 'PlayShuffle');
|
||||
};
|
||||
|
||||
self.instantMix = function (id) {
|
||||
|
||||
sendPlayCommand({ ids: [id] }, 'PlayInstantMix');
|
||||
};
|
||||
|
||||
self.queue = function (options) {
|
||||
|
||||
sendPlayCommand(options, 'PlayNext');
|
||||
};
|
||||
|
||||
self.queueNext = function (options) {
|
||||
|
||||
};
|
||||
|
||||
self.isPlaying = function () {
|
||||
|
||||
};
|
||||
|
||||
self.canPlayMediaType = function (mediaType) {
|
||||
|
||||
return false;
|
||||
sendPlayCommand(options, 'PlayLast');
|
||||
};
|
||||
|
||||
self.canQueueMediaType = function (mediaType) {
|
||||
|
||||
return false;
|
||||
return mediaType == 'Audio' || mediaType == 'Video';
|
||||
};
|
||||
|
||||
self.getTargets = function () {
|
||||
|
@ -461,21 +478,23 @@
|
|||
|
||||
}).done(function (sessions) {
|
||||
|
||||
var targets = sessions.filter(function(s) {
|
||||
var targets = sessions.filter(function (s) {
|
||||
|
||||
return s.DeviceId != ApiClient.deviceId();
|
||||
|
||||
}).map(function(s) {
|
||||
}).map(function (s) {
|
||||
return {
|
||||
name: s.DeviceName,
|
||||
id: s.Id,
|
||||
playerName: self.name
|
||||
playerName: self.name,
|
||||
appName: s.Client,
|
||||
playableMediaTypes: s.PlayableMediaTypes
|
||||
};
|
||||
});
|
||||
|
||||
deferred.resolveWith(null, [targets]);
|
||||
|
||||
}).fail(function() {
|
||||
}).fail(function () {
|
||||
|
||||
deferred.reject();
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue