mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
rework media versions to be based on original item id
This commit is contained in:
parent
fd0c1ec8ae
commit
7a9d65a367
10 changed files with 95 additions and 104 deletions
59
ApiClient.js
59
ApiClient.js
|
@ -2191,20 +2191,6 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Gets a list of all available conrete BaseItem types from the server
|
||||
*/
|
||||
self.getItemTypes = function (options) {
|
||||
|
||||
var url = self.getUrl("Library/ItemTypes", options);
|
||||
|
||||
return self.ajax({
|
||||
type: "GET",
|
||||
url: url,
|
||||
dataType: "json"
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Constructs a url for a user image
|
||||
* @param {String} userId
|
||||
|
@ -3805,7 +3791,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
* @param {String} userId
|
||||
* @param {String} itemId
|
||||
*/
|
||||
self.reportPlaybackStart = function (userId, itemId, canSeek, queueableMediaTypes) {
|
||||
self.reportPlaybackStart = function (userId, itemId, mediaVersionId, canSeek, queueableMediaTypes) {
|
||||
|
||||
if (!userId) {
|
||||
throw new Error("null userId");
|
||||
|
@ -3824,16 +3810,26 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
|
||||
var msg = [itemId, canSeek, queueableMediaTypes];
|
||||
|
||||
if (mediaVersionId) {
|
||||
msg.push(mediaVersionId);
|
||||
}
|
||||
|
||||
self.sendWebSocketMessage("PlaybackStart", msg.join('|'));
|
||||
|
||||
deferred.resolveWith(null, []);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, {
|
||||
var params = {
|
||||
CanSeek: canSeek,
|
||||
QueueableMediaTypes: queueableMediaTypes
|
||||
});
|
||||
};
|
||||
|
||||
if (mediaVersionId) {
|
||||
params.mediaVersionId = mediaVersionId;
|
||||
}
|
||||
|
||||
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, params);
|
||||
|
||||
return self.ajax({
|
||||
type: "POST",
|
||||
|
@ -3846,7 +3842,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
* @param {String} userId
|
||||
* @param {String} itemId
|
||||
*/
|
||||
self.reportPlaybackProgress = function (userId, itemId, positionTicks, isPaused, isMuted) {
|
||||
self.reportPlaybackProgress = function (userId, itemId, mediaVersionId, positionTicks, isPaused, isMuted) {
|
||||
|
||||
if (!userId) {
|
||||
throw new Error("null userId");
|
||||
|
@ -3860,7 +3856,12 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
|
||||
var deferred = $.Deferred();
|
||||
|
||||
var msgData = itemId + "|" + (positionTicks == null ? "" : positionTicks) + "|" + (isPaused == null ? "" : isPaused) + "|" + (isMuted == null ? "" : isMuted);
|
||||
var msgData = itemId;
|
||||
|
||||
msgData += "|" + (positionTicks == null ? "" : positionTicks);
|
||||
msgData += "|" + (isPaused == null ? "" : isPaused);
|
||||
msgData += "|" + (isMuted == null ? "" : isMuted);
|
||||
msgData += "|" + (mediaVersionId == null ? "" : mediaVersionId);
|
||||
|
||||
self.sendWebSocketMessage("PlaybackProgress", msgData);
|
||||
|
||||
|
@ -3877,6 +3878,10 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
params.positionTicks = positionTicks;
|
||||
}
|
||||
|
||||
if (mediaVersionId) {
|
||||
params.mediaVersionId = mediaVersionId;
|
||||
}
|
||||
|
||||
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId + "/Progress", params);
|
||||
|
||||
return self.ajax({
|
||||
|
@ -3890,7 +3895,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
* @param {String} userId
|
||||
* @param {String} itemId
|
||||
*/
|
||||
self.reportPlaybackStopped = function (userId, itemId, positionTicks) {
|
||||
self.reportPlaybackStopped = function (userId, itemId, mediaVersionId, positionTicks) {
|
||||
|
||||
if (!userId) {
|
||||
throw new Error("null userId");
|
||||
|
@ -3904,20 +3909,26 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
|||
|
||||
var deferred = $.Deferred();
|
||||
|
||||
self.sendWebSocketMessage("PlaybackStopped", itemId + "|" + (positionTicks == null ? "" : positionTicks));
|
||||
var msg = itemId;
|
||||
msg += "|" + (positionTicks == null ? "" : positionTicks);
|
||||
msg += "|" + (mediaVersionId == null ? "" : mediaVersionId);
|
||||
|
||||
self.sendWebSocketMessage("PlaybackStopped", msg);
|
||||
|
||||
deferred.resolveWith(null, []);
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
var params = {
|
||||
|
||||
};
|
||||
var params = {};
|
||||
|
||||
if (positionTicks) {
|
||||
params.positionTicks = positionTicks;
|
||||
}
|
||||
|
||||
if (mediaVersionId) {
|
||||
params.mediaVersionId = mediaVersionId;
|
||||
}
|
||||
|
||||
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, params);
|
||||
|
||||
return self.ajax({
|
||||
|
|
|
@ -866,7 +866,6 @@ a.itemTag:hover {
|
|||
}
|
||||
|
||||
.mediaInfoStreamType {
|
||||
font-size: 16px;
|
||||
display: block;
|
||||
color: #fff;
|
||||
}
|
||||
|
@ -874,14 +873,12 @@ a.itemTag:hover {
|
|||
.mediaInfoAttribute {
|
||||
color: #fff;
|
||||
display: inline-block;
|
||||
width: 110px;
|
||||
}
|
||||
|
||||
.mediaInfoLabel {
|
||||
color: #aaa;
|
||||
margin-right: 1em;
|
||||
display: inline-block;
|
||||
width: 90px;
|
||||
}
|
||||
|
||||
.posterRibbon {
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
#videoControls {
|
||||
z-index: 99999;
|
||||
padding: 0 20px 10px;
|
||||
padding: 0 20px 5px;
|
||||
height: 80px;
|
||||
position: absolute;
|
||||
top: auto;
|
||||
|
|
|
@ -398,7 +398,8 @@
|
|||
Recursive: true,
|
||||
Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio",
|
||||
Limit: LibraryBrowser.getDefaultPageSize(),
|
||||
StartIndex: 0
|
||||
StartIndex: 0,
|
||||
CollapseBoxSetItems: false
|
||||
};
|
||||
|
||||
query = $.extend(query, options || {});
|
||||
|
|
|
@ -214,11 +214,7 @@
|
|||
renderMediaVersions(page, item);
|
||||
}
|
||||
|
||||
var primaryVersion = (item.MediaVersions || []).filter(function (v) {
|
||||
return v.IsPrimaryVersion;
|
||||
|
||||
})[0];
|
||||
var chapters = primaryVersion ? (primaryVersion.Chapters || []) : [];
|
||||
var chapters = item.Chapters || [];
|
||||
|
||||
if (!chapters.length) {
|
||||
$('#scenesCollapsible', page).hide();
|
||||
|
@ -350,7 +346,7 @@
|
|||
tabsHtml += '<label for="radioDetails" class="lblDetailTab">Details</label>';
|
||||
}
|
||||
|
||||
if (item.MediaType == "Audio" || item.MediaType == "Video") {
|
||||
if (item.MediaVersions && item.MediaVersions.length) {
|
||||
tabsHtml += '<input type="radio" name="radioDetailTab" class="radioDetailTab" id="radioMediaInfo" value="tabMediaInfo">';
|
||||
tabsHtml += '<label for="radioMediaInfo" class="lblDetailTab">Media Info</label>';
|
||||
}
|
||||
|
@ -1023,11 +1019,7 @@
|
|||
function renderScenes(page, item, user, limit) {
|
||||
var html = '';
|
||||
|
||||
var primaryVersion = (item.MediaVersions || []).filter(function (v) {
|
||||
return v.IsPrimaryVersion;
|
||||
|
||||
})[0];
|
||||
var chapters = primaryVersion ? (primaryVersion.Chapters || []) : [];
|
||||
var chapters = item.Chapters || [];
|
||||
|
||||
for (var i = 0, length = chapters.length; i < length; i++) {
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
getDefaultPageSize: function () {
|
||||
|
||||
var saved = localStorage.getItem('pagesize');
|
||||
var saved = localStorage.getItem('pagesize_');
|
||||
|
||||
if (saved) {
|
||||
return parseInt(saved);
|
||||
|
|
|
@ -207,19 +207,29 @@
|
|||
|
||||
function getItemCellsHtml(item, headercells) {
|
||||
|
||||
return headercells.map(function (cell) {
|
||||
|
||||
var html = '';
|
||||
html += '<td>';
|
||||
|
||||
var stream;
|
||||
|
||||
var primaryVersion = (item.MediaVersions || []).filter(function(v) {
|
||||
var primaryVersion = (item.MediaVersions || []).filter(function (v) {
|
||||
return v.IsPrimaryVersion;
|
||||
})[0] || {};
|
||||
|
||||
var mediaStreams = primaryVersion.MediaStreams || [];
|
||||
|
||||
var videoStream = mediaStreams.filter(function (s) {
|
||||
|
||||
return s.Type == 'Video';
|
||||
|
||||
})[0];
|
||||
|
||||
var audioStream = mediaStreams.filter(function (s) {
|
||||
|
||||
return s.Type == 'Audio';
|
||||
|
||||
})[0];
|
||||
|
||||
return headercells.map(function (cell) {
|
||||
|
||||
var html = '';
|
||||
html += '<td>';
|
||||
|
||||
switch (cell.type || cell.name) {
|
||||
|
||||
case 'Album Artist':
|
||||
|
@ -264,52 +274,30 @@
|
|||
}
|
||||
case 'Audio':
|
||||
{
|
||||
stream = mediaStreams.filter(function (s) {
|
||||
if (audioStream) {
|
||||
|
||||
return s.Type == 'Audio';
|
||||
|
||||
})[0];
|
||||
|
||||
if (stream) {
|
||||
|
||||
var name = (stream.Codec || '').toUpperCase();
|
||||
html += name == 'DCA' ? (stream.Profile || '').toUpperCase() : name;
|
||||
var name = (audioStream.Codec || '').toUpperCase();
|
||||
html += name == 'DCA' ? (audioStream.Profile || '').toUpperCase() : name;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'Video':
|
||||
{
|
||||
stream = mediaStreams.filter(function (s) {
|
||||
|
||||
return s.Type == 'Video';
|
||||
|
||||
})[0];
|
||||
|
||||
if (stream) {
|
||||
html += (stream.Codec || '').toUpperCase();
|
||||
if (videoStream) {
|
||||
html += (videoStream.Codec || '').toUpperCase();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'Resolution':
|
||||
{
|
||||
stream = mediaStreams.filter(function (s) {
|
||||
|
||||
return s.Type == 'Video';
|
||||
|
||||
})[0];
|
||||
|
||||
if (stream && stream.Width) {
|
||||
html += stream.Width + "*" + (stream.Height || "-");
|
||||
if (videoStream && videoStream.Width) {
|
||||
html += videoStream.Width + "*" + (videoStream.Height || "-");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'Embedded Image':
|
||||
{
|
||||
if (mediaStreams.filter(function (s) {
|
||||
|
||||
return s.Type == 'Video';
|
||||
|
||||
}).length) {
|
||||
if (videoStream) {
|
||||
html += '<div class="libraryReportIndicator clearLibraryReportIndicator"><div class="ui-icon-check ui-btn-icon-notext"></div></div>';
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -319,7 +319,7 @@
|
|||
|
||||
var currentTicks = self.getCurrentTicks();
|
||||
|
||||
var chapters = currentMediaVersion.Chapters || [];
|
||||
var chapters = currentItem.Chapters || [];
|
||||
|
||||
for (var i = 0, length = chapters.length; i < length; i++) {
|
||||
|
||||
|
@ -344,7 +344,7 @@
|
|||
|
||||
if (chapter.ImageTag) {
|
||||
|
||||
imgUrl = ApiClient.getImageUrl(currentMediaVersion.ItemId, {
|
||||
imgUrl = ApiClient.getImageUrl(currentItem.Id, {
|
||||
maxwidth: 200,
|
||||
tag: chapter.ImageTag,
|
||||
type: "Chapter",
|
||||
|
@ -706,7 +706,8 @@
|
|||
SubtitleStreamIndex: getInitialSubtitleStreamIndex(mediaStreams, user),
|
||||
AudioStreamIndex: getInitialAudioStreamIndex(mediaStreams, user),
|
||||
deviceId: ApiClient.deviceId(),
|
||||
Static: false
|
||||
Static: false,
|
||||
mediaVersionId: mediaVersion.Id
|
||||
};
|
||||
|
||||
var mp4Quality = getVideoQualityOptions(mediaStreams).filter(function (opt) {
|
||||
|
@ -733,7 +734,7 @@
|
|||
|
||||
var seekParam = isStatic && startPosition ? '#t=' + (startPosition / 10000000) : '';
|
||||
|
||||
var mp4VideoUrl = ApiClient.getUrl('Videos/' + mediaVersion.ItemId + '/stream.mp4', $.extend({}, baseParams, {
|
||||
var mp4VideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.mp4', $.extend({}, baseParams, {
|
||||
profile: 'baseline',
|
||||
level: 3,
|
||||
Static: isStatic,
|
||||
|
@ -745,7 +746,7 @@
|
|||
|
||||
})) + seekParam;
|
||||
|
||||
var webmVideoUrl = ApiClient.getUrl('Videos/' + mediaVersion.ItemId + '/stream.webm', $.extend({}, baseParams, {
|
||||
var webmVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
|
||||
|
||||
VideoCodec: 'vpx',
|
||||
AudioCodec: 'Vorbis',
|
||||
|
@ -755,7 +756,7 @@
|
|||
|
||||
})) + seekParam;
|
||||
|
||||
var hlsVideoUrl = ApiClient.getUrl('Videos/' + mediaVersion.ItemId + '/stream.m3u8', $.extend({}, baseParams, {
|
||||
var hlsVideoUrl = ApiClient.getUrl('Videos/' + item.Id + '/stream.m3u8', $.extend({}, baseParams, {
|
||||
profile: 'baseline',
|
||||
level: 3,
|
||||
timeStampOffsetMs: 0,
|
||||
|
@ -835,7 +836,7 @@
|
|||
$('#video-subtitleButton', videoControls).hide();
|
||||
}
|
||||
|
||||
if (mediaVersion.Chapters && mediaVersion.Chapters.length) {
|
||||
if (item.Chapters && item.Chapters.length) {
|
||||
$('#video-chaptersButton', videoControls).show();
|
||||
} else {
|
||||
$('#video-chaptersButton', videoControls).hide();
|
||||
|
@ -882,9 +883,9 @@
|
|||
|
||||
videoElement.off("playing.once");
|
||||
|
||||
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), mediaVersion.ItemId, true, item.MediaType);
|
||||
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id, mediaVersion.Id, true, item.MediaType);
|
||||
|
||||
self.startProgressInterval(mediaVersion.ItemId);
|
||||
self.startProgressInterval(item.Id, mediaVersion.Id);
|
||||
|
||||
}).on("pause", function (e) {
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
|
||||
var position = Math.floor(10000000 * endTime) + self.startTimeTicksOffset;
|
||||
|
||||
ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentMediaVersion.ItemId, position);
|
||||
ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentItem.Id, currentMediaVersion.Id, position);
|
||||
|
||||
if (currentItem.MediaType == "Video") {
|
||||
ApiClient.stopActiveEncodings();
|
||||
|
@ -72,7 +72,7 @@
|
|||
self.nextTrack();
|
||||
};
|
||||
|
||||
self.startProgressInterval = function (itemId) {
|
||||
self.startProgressInterval = function (itemId, mediaVersionId) {
|
||||
|
||||
clearProgressInterval();
|
||||
|
||||
|
@ -81,7 +81,7 @@
|
|||
currentProgressInterval = setInterval(function () {
|
||||
|
||||
if (currentMediaElement) {
|
||||
sendProgressUpdate(itemId);
|
||||
sendProgressUpdate(itemId, mediaVersionId);
|
||||
}
|
||||
|
||||
}, intervalTime);
|
||||
|
@ -156,8 +156,8 @@
|
|||
|
||||
$(this).off('play.onceafterseek').on('ended.playbackstopped', self.onPlaybackStopped).on('ended.playnext', self.playNextAfterEnded);
|
||||
|
||||
self.startProgressInterval(currentMediaVersion.ItemId);
|
||||
sendProgressUpdate(currentMediaVersion.ItemId);
|
||||
self.startProgressInterval(currentItem.Id, currentMediaVersion.Id);
|
||||
sendProgressUpdate(currentItem.Id, currentMediaVersion.Id);
|
||||
|
||||
});
|
||||
|
||||
|
@ -957,7 +957,7 @@
|
|||
|
||||
var position = Math.floor(10000000 * endTime) + self.startTimeTicksOffset;
|
||||
|
||||
ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentMediaVersion.ItemId, position);
|
||||
ApiClient.reportPlaybackStopped(Dashboard.getCurrentUserId(), currentItem.Id, currentMediaVersion.Id, position);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -984,9 +984,9 @@
|
|||
return url + '&' + param + "=" + value;
|
||||
};
|
||||
|
||||
function sendProgressUpdate(itemId) {
|
||||
function sendProgressUpdate(itemId, mediaVersionId) {
|
||||
|
||||
ApiClient.reportPlaybackProgress(Dashboard.getCurrentUserId(), itemId, self.getCurrentTicks(), currentMediaElement.paused, currentMediaElement.volume == 0);
|
||||
ApiClient.reportPlaybackProgress(Dashboard.getCurrentUserId(), itemId, mediaVersionId, self.getCurrentTicks(), currentMediaElement.paused, currentMediaElement.volume == 0);
|
||||
};
|
||||
|
||||
function clearProgressInterval() {
|
||||
|
@ -1029,18 +1029,19 @@
|
|||
var baseParams = {
|
||||
audioChannels: 2,
|
||||
audioBitrate: 128000,
|
||||
StartTimeTicks: startPositionTicks
|
||||
StartTimeTicks: startPositionTicks,
|
||||
mediaVersionId: mediaVersion.Id
|
||||
};
|
||||
|
||||
var mp3Url = ApiClient.getUrl('Audio/' + mediaVersion.ItemId + '/stream.mp3', $.extend({}, baseParams, {
|
||||
var mp3Url = ApiClient.getUrl('Audio/' + item.Id + '/stream.mp3', $.extend({}, baseParams, {
|
||||
audioCodec: 'mp3'
|
||||
}));
|
||||
|
||||
var aacUrl = ApiClient.getUrl('Audio/' + mediaVersion.ItemId + '/stream.aac', $.extend({}, baseParams, {
|
||||
var aacUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.aac', $.extend({}, baseParams, {
|
||||
audioCodec: 'aac'
|
||||
}));
|
||||
|
||||
var webmUrl = ApiClient.getUrl('Audio/' + mediaVersion.ItemId + '/stream.webm', $.extend({}, baseParams, {
|
||||
var webmUrl = ApiClient.getUrl('Audio/' + item.Id + '/stream.webm', $.extend({}, baseParams, {
|
||||
audioCodec: 'Vorbis'
|
||||
}));
|
||||
|
||||
|
@ -1131,9 +1132,9 @@
|
|||
|
||||
audioElement.off("play.once");
|
||||
|
||||
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), mediaVersion.ItemId, true, item.MediaType);
|
||||
ApiClient.reportPlaybackStart(Dashboard.getCurrentUserId(), item.Id, mediaVersion.Id, true, item.MediaType);
|
||||
|
||||
self.startProgressInterval(mediaVersion.ItemId);
|
||||
self.startProgressInterval(item.Id, mediaVersion.Id);
|
||||
|
||||
}).on("pause", function () {
|
||||
|
||||
|
@ -1200,7 +1201,7 @@
|
|||
return (trunc(titles[0], 30) + "<br />" + trunc(titles[1], 30)).replace("---", " ");
|
||||
};
|
||||
|
||||
var getItemFields = "MediaVersions";
|
||||
var getItemFields = "MediaVersions,Chapters";
|
||||
}
|
||||
|
||||
window.MediaPlayer = new mediaPlayer();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.245" targetFramework="net45" />
|
||||
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.246" targetFramework="net45" />
|
||||
</packages>
|
Loading…
Add table
Add a link
Reference in a new issue