mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
fixes #555 - Have clients report seek and queuing capabilities
This commit is contained in:
parent
bc70b9ed6e
commit
086a032545
4 changed files with 35 additions and 20 deletions
15
ApiClient.js
15
ApiClient.js
|
@ -3200,7 +3200,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
||||||
* @param {String} userId
|
* @param {String} userId
|
||||||
* @param {String} itemId
|
* @param {String} itemId
|
||||||
*/
|
*/
|
||||||
self.reportPlaybackStart = function (userId, itemId) {
|
self.reportPlaybackStart = function (userId, itemId, canSeek, queueableMediaTypes) {
|
||||||
|
|
||||||
if (!userId) {
|
if (!userId) {
|
||||||
throw new Error("null userId");
|
throw new Error("null userId");
|
||||||
|
@ -3210,17 +3210,26 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
||||||
throw new Error("null itemId");
|
throw new Error("null itemId");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
canSeek = canSeek || false;
|
||||||
|
queueableMediaTypes = queueableMediaTypes || '';
|
||||||
|
|
||||||
if (self.isWebSocketOpen()) {
|
if (self.isWebSocketOpen()) {
|
||||||
|
|
||||||
var deferred = $.Deferred();
|
var deferred = $.Deferred();
|
||||||
|
|
||||||
self.sendWebSocketMessage("PlaybackStart", itemId);
|
var msg = [itemId, canSeek, queueableMediaTypes];
|
||||||
|
|
||||||
|
self.sendWebSocketMessage("PlaybackStart", msg.join('|'));
|
||||||
|
|
||||||
deferred.resolveWith(null, []);
|
deferred.resolveWith(null, []);
|
||||||
return deferred.promise();
|
return deferred.promise();
|
||||||
}
|
}
|
||||||
|
|
||||||
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId);
|
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, {
|
||||||
|
|
||||||
|
CanSeek: canSeek,
|
||||||
|
QueueableMediaTypes: queueableMediaTypes
|
||||||
|
});
|
||||||
|
|
||||||
return self.ajax({
|
return self.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
|
|
|
@ -438,7 +438,7 @@
|
||||||
|
|
||||||
audioElement.off("play.once");
|
audioElement.off("play.once");
|
||||||
|
|
||||||
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id);
|
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id, true, item.MediaType);
|
||||||
|
|
||||||
startProgressInterval(item.Id);
|
startProgressInterval(item.Id);
|
||||||
|
|
||||||
|
@ -635,7 +635,7 @@
|
||||||
|
|
||||||
videoElement.off("play.once");
|
videoElement.off("play.once");
|
||||||
|
|
||||||
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id);
|
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id, true, item.MediaType);
|
||||||
|
|
||||||
startProgressInterval(item.Id);
|
startProgressInterval(item.Id);
|
||||||
|
|
||||||
|
|
|
@ -183,7 +183,7 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (playCommand == "Browse") {
|
else if (playCommand == "Browse") {
|
||||||
|
|
||||||
promise = ApiClient.sendBrowseCommand(sessionIds[0], {
|
promise = ApiClient.sendBrowseCommand(sessionIds[0], {
|
||||||
|
|
||||||
ItemId: item.Id,
|
ItemId: item.Id,
|
||||||
|
@ -236,7 +236,7 @@
|
||||||
promise.done(function () {
|
promise.done(function () {
|
||||||
|
|
||||||
popup.popup("close");
|
popup.popup("close");
|
||||||
|
|
||||||
if (showRemoteControlMenuAfterCommand) {
|
if (showRemoteControlMenuAfterCommand) {
|
||||||
RemoteControl.showMenu();
|
RemoteControl.showMenu();
|
||||||
}
|
}
|
||||||
|
@ -256,7 +256,7 @@
|
||||||
return s.DeviceId != deviceId;
|
return s.DeviceId != deviceId;
|
||||||
});
|
});
|
||||||
|
|
||||||
renderSessionsInPlayMenu(sessions, options, elem);
|
renderSessionsInPlayMenu(sessions, options, elem, popup);
|
||||||
|
|
||||||
if (ApiClient.isWebSocketOpen()) {
|
if (ApiClient.isWebSocketOpen()) {
|
||||||
ApiClient.sendWebSocketMessage("SessionsStart", "1000,1000");
|
ApiClient.sendWebSocketMessage("SessionsStart", "1000,1000");
|
||||||
|
@ -287,7 +287,7 @@
|
||||||
if (value == "Play") {
|
if (value == "Play") {
|
||||||
|
|
||||||
browseButtonContainer.show();
|
browseButtonContainer.show();
|
||||||
|
|
||||||
if (item.Type != 'Person' && item.Type != 'Genre' && item.Type != 'Studio' && item.Type != 'GameGenre' && item.Type != 'MusicGenre') {
|
if (item.Type != 'Person' && item.Type != 'Genre' && item.Type != 'Studio' && item.Type != 'GameGenre' && item.Type != 'MusicGenre') {
|
||||||
playButtonContainer.show();
|
playButtonContainer.show();
|
||||||
queueButtonContainer.show();
|
queueButtonContainer.show();
|
||||||
|
@ -441,7 +441,7 @@
|
||||||
$('.chkSelectPlayTime:first', elem).checked(true);
|
$('.chkSelectPlayTime:first', elem).checked(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderSessionsInPlayMenu(sessions, options, elem) {
|
function renderSessionsInPlayMenu(sessions, options, elem, popup) {
|
||||||
|
|
||||||
if (!sessions.length) {
|
if (!sessions.length) {
|
||||||
elem.html('<p>There are currently no available media browser sessions to control.</p>');
|
elem.html('<p>There are currently no available media browser sessions to control.</p>');
|
||||||
|
@ -507,7 +507,7 @@
|
||||||
|
|
||||||
var session = sessions[i];
|
var session = sessions[i];
|
||||||
|
|
||||||
html += '<tr class="trSession" data-sessionid="' + session.Id + '">';
|
html += '<tr class="trSession" data-queue="' + session.QueueableMediaTypes.join(',') + '" data-sessionid="' + session.Id + '">';
|
||||||
|
|
||||||
html += '<td class="tdSelectSession"></td>';
|
html += '<td class="tdSelectSession"></td>';
|
||||||
html += '<td>' + session.Client + '</td>';
|
html += '<td>' + session.Client + '</td>';
|
||||||
|
@ -549,7 +549,7 @@
|
||||||
elem.html(html).trigger('create');
|
elem.html(html).trigger('create');
|
||||||
|
|
||||||
$('.tdSelectSession', elem).html('<input type="radio" class="chkClient" name="chkClient" />');
|
$('.tdSelectSession', elem).html('<input type="radio" class="chkClient" name="chkClient" />');
|
||||||
|
|
||||||
$('.chkClient:first', elem).checked(true);
|
$('.chkClient:first', elem).checked(true);
|
||||||
|
|
||||||
$('#remoteControlFlyout').popup("reposition", { tolerance: 0 });
|
$('#remoteControlFlyout').popup("reposition", { tolerance: 0 });
|
||||||
|
@ -689,13 +689,13 @@
|
||||||
html += '<div class="commandsCollapsible" data-role="collapsible" data-content-theme="c" data-collapsed="true" data-mini="true" style="margin-top: 1em;display:none;">';
|
html += '<div class="commandsCollapsible" data-role="collapsible" data-content-theme="c" data-collapsed="true" data-mini="true" style="margin-top: 1em;display:none;">';
|
||||||
html += '<h4>Send Message</h4>';
|
html += '<h4>Send Message</h4>';
|
||||||
html += '<div>';
|
html += '<div>';
|
||||||
|
|
||||||
html += '<p style="text-align:center;">';
|
html += '<p style="text-align:center;">';
|
||||||
|
|
||||||
html += '<div><label for="txtMessage">Message text</label></div>';
|
html += '<div><label for="txtMessage">Message text</label></div>';
|
||||||
|
|
||||||
html += '<div style="display:inline-block;width:80%;"><input id="txtMessage" name="txtMessage" type="text" /></div>';
|
html += '<div style="display:inline-block;width:80%;"><input id="txtMessage" name="txtMessage" type="text" /></div>';
|
||||||
|
|
||||||
html += '<button type="button" data-icon="envelope" class="btnSendMessage" data-theme="a" data-mini="true" data-inline="true">Send</button>';
|
html += '<button type="button" data-icon="envelope" class="btnSendMessage" data-theme="a" data-mini="true" data-inline="true">Send</button>';
|
||||||
|
|
||||||
html += '</p>';
|
html += '</p>';
|
||||||
|
@ -763,9 +763,9 @@
|
||||||
var id = $('#selectSession', popup).val();
|
var id = $('#selectSession', popup).val();
|
||||||
|
|
||||||
var messageText = $('#txtMessage', popup).val();
|
var messageText = $('#txtMessage', popup).val();
|
||||||
|
|
||||||
if (messageText) {
|
if (messageText) {
|
||||||
Dashboard.getCurrentUser().done(function(user) {
|
Dashboard.getCurrentUser().done(function (user) {
|
||||||
|
|
||||||
ApiClient.sendMessageCommand(id, {
|
ApiClient.sendMessageCommand(id, {
|
||||||
Header: "Message from " + user.Name,
|
Header: "Message from " + user.Name,
|
||||||
|
@ -872,7 +872,7 @@
|
||||||
html += '<span class="duration"></span>';
|
html += '<span class="duration"></span>';
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
|
|
||||||
html += '<input type="range" name="positionSlider" id="positionSlider" min="0" max="100" value="50" step=".1" style="display:none;" />';
|
html += '<div class="positionSliderContainer"><input type="range" name="positionSlider" id="positionSlider" min="0" max="100" value="50" step=".1" style="display:none;" /></div>';
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
|
|
||||||
html += '<div style="text-align:center; margin: 0 0 2em;">';
|
html += '<div style="text-align:center; margin: 0 0 2em;">';
|
||||||
|
@ -953,13 +953,19 @@
|
||||||
imageContainer.hide();
|
imageContainer.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (session.CanSeek) {
|
||||||
|
$('.positionSliderContainer', elem).show();
|
||||||
|
} else {
|
||||||
|
$('.positionSliderContainer', elem).hide();
|
||||||
|
}
|
||||||
|
|
||||||
var time = session.NowPlayingPositionTicks || 0;
|
var time = session.NowPlayingPositionTicks || 0;
|
||||||
var duration = item.RunTimeTicks || 0;
|
var duration = item.RunTimeTicks || 0;
|
||||||
|
|
||||||
var percent = duration ? 100 * time / duration : 0;
|
var percent = duration ? 100 * time / duration : 0;
|
||||||
|
|
||||||
var slider = $('#positionSlider', elem);
|
var slider = $('#positionSlider', elem);
|
||||||
|
|
||||||
if (!slider[0].isSliding) {
|
if (!slider[0].isSliding) {
|
||||||
slider.val(percent).slider('refresh');
|
slider.val(percent).slider('refresh');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.175" targetFramework="net45" />
|
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.176" targetFramework="net45" />
|
||||||
<package id="ServiceStack.Common" version="3.9.62" targetFramework="net45" />
|
<package id="ServiceStack.Common" version="3.9.62" targetFramework="net45" />
|
||||||
<package id="ServiceStack.Text" version="3.9.62" targetFramework="net45" />
|
<package id="ServiceStack.Text" version="3.9.62" targetFramework="net45" />
|
||||||
</packages>
|
</packages>
|
Loading…
Add table
Add a link
Reference in a new issue