1
0
Fork 0
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:
Luke Pulverenti 2014-03-21 23:35:03 -04:00
parent fd0c1ec8ae
commit 7a9d65a367
10 changed files with 95 additions and 104 deletions

View file

@ -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 * Constructs a url for a user image
* @param {String} userId * @param {String} userId
@ -3805,7 +3791,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, canSeek, queueableMediaTypes) { self.reportPlaybackStart = function (userId, itemId, mediaVersionId, canSeek, queueableMediaTypes) {
if (!userId) { if (!userId) {
throw new Error("null userId"); throw new Error("null userId");
@ -3824,16 +3810,26 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
var msg = [itemId, canSeek, queueableMediaTypes]; var msg = [itemId, canSeek, queueableMediaTypes];
if (mediaVersionId) {
msg.push(mediaVersionId);
}
self.sendWebSocketMessage("PlaybackStart", msg.join('|')); 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 params = {
CanSeek: canSeek, CanSeek: canSeek,
QueueableMediaTypes: queueableMediaTypes QueueableMediaTypes: queueableMediaTypes
}); };
if (mediaVersionId) {
params.mediaVersionId = mediaVersionId;
}
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, params);
return self.ajax({ return self.ajax({
type: "POST", type: "POST",
@ -3846,7 +3842,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
* @param {String} userId * @param {String} userId
* @param {String} itemId * @param {String} itemId
*/ */
self.reportPlaybackProgress = function (userId, itemId, positionTicks, isPaused, isMuted) { self.reportPlaybackProgress = function (userId, itemId, mediaVersionId, positionTicks, isPaused, isMuted) {
if (!userId) { if (!userId) {
throw new Error("null userId"); throw new Error("null userId");
@ -3860,7 +3856,12 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
var deferred = $.Deferred(); 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); self.sendWebSocketMessage("PlaybackProgress", msgData);
@ -3877,6 +3878,10 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
params.positionTicks = positionTicks; params.positionTicks = positionTicks;
} }
if (mediaVersionId) {
params.mediaVersionId = mediaVersionId;
}
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId + "/Progress", params); var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId + "/Progress", params);
return self.ajax({ return self.ajax({
@ -3890,7 +3895,7 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
* @param {String} userId * @param {String} userId
* @param {String} itemId * @param {String} itemId
*/ */
self.reportPlaybackStopped = function (userId, itemId, positionTicks) { self.reportPlaybackStopped = function (userId, itemId, mediaVersionId, positionTicks) {
if (!userId) { if (!userId) {
throw new Error("null userId"); throw new Error("null userId");
@ -3904,20 +3909,26 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
var deferred = $.Deferred(); 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, []); deferred.resolveWith(null, []);
return deferred.promise(); return deferred.promise();
} }
var params = { var params = {};
};
if (positionTicks) { if (positionTicks) {
params.positionTicks = positionTicks; params.positionTicks = positionTicks;
} }
if (mediaVersionId) {
params.mediaVersionId = mediaVersionId;
}
var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, params); var url = self.getUrl("Users/" + userId + "/PlayingItems/" + itemId, params);
return self.ajax({ return self.ajax({

View file

@ -866,7 +866,6 @@ a.itemTag:hover {
} }
.mediaInfoStreamType { .mediaInfoStreamType {
font-size: 16px;
display: block; display: block;
color: #fff; color: #fff;
} }
@ -874,14 +873,12 @@ a.itemTag:hover {
.mediaInfoAttribute { .mediaInfoAttribute {
color: #fff; color: #fff;
display: inline-block; display: inline-block;
width: 110px;
} }
.mediaInfoLabel { .mediaInfoLabel {
color: #aaa; color: #aaa;
margin-right: 1em; margin-right: 1em;
display: inline-block; display: inline-block;
width: 90px;
} }
.posterRibbon { .posterRibbon {

View file

@ -33,7 +33,7 @@
#videoControls { #videoControls {
z-index: 99999; z-index: 99999;
padding: 0 20px 10px; padding: 0 20px 5px;
height: 80px; height: 80px;
position: absolute; position: absolute;
top: auto; top: auto;

View file

@ -398,7 +398,8 @@
Recursive: true, Recursive: true,
Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio", Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio",
Limit: LibraryBrowser.getDefaultPageSize(), Limit: LibraryBrowser.getDefaultPageSize(),
StartIndex: 0 StartIndex: 0,
CollapseBoxSetItems: false
}; };
query = $.extend(query, options || {}); query = $.extend(query, options || {});

View file

@ -214,11 +214,7 @@
renderMediaVersions(page, item); renderMediaVersions(page, item);
} }
var primaryVersion = (item.MediaVersions || []).filter(function (v) { var chapters = item.Chapters || [];
return v.IsPrimaryVersion;
})[0];
var chapters = primaryVersion ? (primaryVersion.Chapters || []) : [];
if (!chapters.length) { if (!chapters.length) {
$('#scenesCollapsible', page).hide(); $('#scenesCollapsible', page).hide();
@ -350,7 +346,7 @@
tabsHtml += '<label for="radioDetails" class="lblDetailTab">Details</label>'; 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 += '<input type="radio" name="radioDetailTab" class="radioDetailTab" id="radioMediaInfo" value="tabMediaInfo">';
tabsHtml += '<label for="radioMediaInfo" class="lblDetailTab">Media Info</label>'; tabsHtml += '<label for="radioMediaInfo" class="lblDetailTab">Media Info</label>';
} }
@ -1023,11 +1019,7 @@
function renderScenes(page, item, user, limit) { function renderScenes(page, item, user, limit) {
var html = ''; var html = '';
var primaryVersion = (item.MediaVersions || []).filter(function (v) { var chapters = item.Chapters || [];
return v.IsPrimaryVersion;
})[0];
var chapters = primaryVersion ? (primaryVersion.Chapters || []) : [];
for (var i = 0, length = chapters.length; i < length; i++) { for (var i = 0, length = chapters.length; i < length; i++) {

View file

@ -6,7 +6,7 @@
getDefaultPageSize: function () { getDefaultPageSize: function () {
var saved = localStorage.getItem('pagesize'); var saved = localStorage.getItem('pagesize_');
if (saved) { if (saved) {
return parseInt(saved); return parseInt(saved);

View file

@ -207,19 +207,29 @@
function getItemCellsHtml(item, headercells) { 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; return v.IsPrimaryVersion;
})[0] || {}; })[0] || {};
var mediaStreams = primaryVersion.MediaStreams || []; 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) { switch (cell.type || cell.name) {
case 'Album Artist': case 'Album Artist':
@ -264,52 +274,30 @@
} }
case 'Audio': case 'Audio':
{ {
stream = mediaStreams.filter(function (s) { if (audioStream) {
return s.Type == 'Audio'; var name = (audioStream.Codec || '').toUpperCase();
html += name == 'DCA' ? (audioStream.Profile || '').toUpperCase() : name;
})[0];
if (stream) {
var name = (stream.Codec || '').toUpperCase();
html += name == 'DCA' ? (stream.Profile || '').toUpperCase() : name;
} }
break; break;
} }
case 'Video': case 'Video':
{ {
stream = mediaStreams.filter(function (s) { if (videoStream) {
html += (videoStream.Codec || '').toUpperCase();
return s.Type == 'Video';
})[0];
if (stream) {
html += (stream.Codec || '').toUpperCase();
} }
break; break;
} }
case 'Resolution': case 'Resolution':
{ {
stream = mediaStreams.filter(function (s) { if (videoStream && videoStream.Width) {
html += videoStream.Width + "*" + (videoStream.Height || "-");
return s.Type == 'Video';
})[0];
if (stream && stream.Width) {
html += stream.Width + "*" + (stream.Height || "-");
} }
break; break;
} }
case 'Embedded Image': case 'Embedded Image':
{ {
if (mediaStreams.filter(function (s) { if (videoStream) {
return s.Type == 'Video';
}).length) {
html += '<div class="libraryReportIndicator clearLibraryReportIndicator"><div class="ui-icon-check ui-btn-icon-notext"></div></div>'; html += '<div class="libraryReportIndicator clearLibraryReportIndicator"><div class="ui-icon-check ui-btn-icon-notext"></div></div>';
} }
break; break;

View file

@ -319,7 +319,7 @@
var currentTicks = self.getCurrentTicks(); var currentTicks = self.getCurrentTicks();
var chapters = currentMediaVersion.Chapters || []; var chapters = currentItem.Chapters || [];
for (var i = 0, length = chapters.length; i < length; i++) { for (var i = 0, length = chapters.length; i < length; i++) {
@ -344,7 +344,7 @@
if (chapter.ImageTag) { if (chapter.ImageTag) {
imgUrl = ApiClient.getImageUrl(currentMediaVersion.ItemId, { imgUrl = ApiClient.getImageUrl(currentItem.Id, {
maxwidth: 200, maxwidth: 200,
tag: chapter.ImageTag, tag: chapter.ImageTag,
type: "Chapter", type: "Chapter",
@ -706,7 +706,8 @@
SubtitleStreamIndex: getInitialSubtitleStreamIndex(mediaStreams, user), SubtitleStreamIndex: getInitialSubtitleStreamIndex(mediaStreams, user),
AudioStreamIndex: getInitialAudioStreamIndex(mediaStreams, user), AudioStreamIndex: getInitialAudioStreamIndex(mediaStreams, user),
deviceId: ApiClient.deviceId(), deviceId: ApiClient.deviceId(),
Static: false Static: false,
mediaVersionId: mediaVersion.Id
}; };
var mp4Quality = getVideoQualityOptions(mediaStreams).filter(function (opt) { var mp4Quality = getVideoQualityOptions(mediaStreams).filter(function (opt) {
@ -733,7 +734,7 @@
var seekParam = isStatic && startPosition ? '#t=' + (startPosition / 10000000) : ''; 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', profile: 'baseline',
level: 3, level: 3,
Static: isStatic, Static: isStatic,
@ -745,7 +746,7 @@
})) + seekParam; })) + 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', VideoCodec: 'vpx',
AudioCodec: 'Vorbis', AudioCodec: 'Vorbis',
@ -755,7 +756,7 @@
})) + seekParam; })) + 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', profile: 'baseline',
level: 3, level: 3,
timeStampOffsetMs: 0, timeStampOffsetMs: 0,
@ -835,7 +836,7 @@
$('#video-subtitleButton', videoControls).hide(); $('#video-subtitleButton', videoControls).hide();
} }
if (mediaVersion.Chapters && mediaVersion.Chapters.length) { if (item.Chapters && item.Chapters.length) {
$('#video-chaptersButton', videoControls).show(); $('#video-chaptersButton', videoControls).show();
} else { } else {
$('#video-chaptersButton', videoControls).hide(); $('#video-chaptersButton', videoControls).hide();
@ -882,9 +883,9 @@
videoElement.off("playing.once"); 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) { }).on("pause", function (e) {

View file

@ -54,7 +54,7 @@
var position = Math.floor(10000000 * endTime) + self.startTimeTicksOffset; 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") { if (currentItem.MediaType == "Video") {
ApiClient.stopActiveEncodings(); ApiClient.stopActiveEncodings();
@ -72,7 +72,7 @@
self.nextTrack(); self.nextTrack();
}; };
self.startProgressInterval = function (itemId) { self.startProgressInterval = function (itemId, mediaVersionId) {
clearProgressInterval(); clearProgressInterval();
@ -81,7 +81,7 @@
currentProgressInterval = setInterval(function () { currentProgressInterval = setInterval(function () {
if (currentMediaElement) { if (currentMediaElement) {
sendProgressUpdate(itemId); sendProgressUpdate(itemId, mediaVersionId);
} }
}, intervalTime); }, intervalTime);
@ -156,8 +156,8 @@
$(this).off('play.onceafterseek').on('ended.playbackstopped', self.onPlaybackStopped).on('ended.playnext', self.playNextAfterEnded); $(this).off('play.onceafterseek').on('ended.playbackstopped', self.onPlaybackStopped).on('ended.playnext', self.playNextAfterEnded);
self.startProgressInterval(currentMediaVersion.ItemId); self.startProgressInterval(currentItem.Id, currentMediaVersion.Id);
sendProgressUpdate(currentMediaVersion.ItemId); sendProgressUpdate(currentItem.Id, currentMediaVersion.Id);
}); });
@ -957,7 +957,7 @@
var position = Math.floor(10000000 * endTime) + self.startTimeTicksOffset; 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; 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() { function clearProgressInterval() {
@ -1029,18 +1029,19 @@
var baseParams = { var baseParams = {
audioChannels: 2, audioChannels: 2,
audioBitrate: 128000, 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' 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' 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' audioCodec: 'Vorbis'
})); }));
@ -1131,9 +1132,9 @@
audioElement.off("play.once"); 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 () { }).on("pause", function () {
@ -1200,7 +1201,7 @@
return (trunc(titles[0], 30) + "<br />" + trunc(titles[1], 30)).replace("---", "&nbsp;"); return (trunc(titles[0], 30) + "<br />" + trunc(titles[1], 30)).replace("---", "&nbsp;");
}; };
var getItemFields = "MediaVersions"; var getItemFields = "MediaVersions,Chapters";
} }
window.MediaPlayer = new mediaPlayer(); window.MediaPlayer = new mediaPlayer();

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.245" targetFramework="net45" /> <package id="MediaBrowser.ApiClient.Javascript" version="3.0.246" targetFramework="net45" />
</packages> </packages>