2019-11-28 12:46:57 -07:00
|
|
|
define(["loading", "appRouter", "layoutManager", "userSettings", "connectionManager", "cardBuilder", "datetime", "mediaInfo", "backdrop", "listView", "itemContextMenu", "itemHelper", "dom", "indicators", "apphost", "imageLoader", "libraryMenu", "globalize", "browser", "events", "scrollHelper", "playbackManager", "libraryBrowser", "scrollStyles", "emby-itemscontainer", "emby-checkbox", "emby-button", "emby-playstatebutton", "emby-ratingbutton", "emby-scroller", "emby-select"], function (loading, appRouter, layoutManager, userSettings, connectionManager, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, appHost, imageLoader, libraryMenu, globalize, browser, events, scrollHelper, playbackManager, libraryBrowser) {
|
2018-10-22 15:05:09 -07:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
function getPromise(apiClient, params) {
|
|
|
|
var id = params.id;
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (id) {
|
|
|
|
return apiClient.getItem(apiClient.getCurrentUserId(), id);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (params.seriesTimerId) {
|
|
|
|
return apiClient.getLiveTvSeriesTimer(params.seriesTimerId);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (params.genre) {
|
|
|
|
return apiClient.getGenre(params.genre, apiClient.getCurrentUserId());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (params.musicgenre) {
|
|
|
|
return apiClient.getMusicGenre(params.musicgenre, apiClient.getCurrentUserId());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (params.musicartist) {
|
|
|
|
return apiClient.getArtist(params.musicartist, apiClient.getCurrentUserId());
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new Error("Invalid request");
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function hideAll(page, className, show) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var i;
|
|
|
|
var length;
|
|
|
|
var elems = page.querySelectorAll("." + className);
|
|
|
|
|
|
|
|
for (i = 0, length = elems.length; i < length; i++) {
|
|
|
|
if (show) {
|
|
|
|
elems[i].classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
elems[i].classList.add("hide");
|
|
|
|
}
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function getContextMenuOptions(item, user, button) {
|
|
|
|
var options = {
|
|
|
|
item: item,
|
2019-11-06 03:43:39 -07:00
|
|
|
open: false,
|
|
|
|
play: false,
|
|
|
|
playAllFromHere: false,
|
|
|
|
queueAllFromHere: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
positionTo: button,
|
2019-11-06 03:43:39 -07:00
|
|
|
cancelTimer: false,
|
|
|
|
record: false,
|
|
|
|
deleteItem: true === item.IsFolder,
|
|
|
|
shuffle: false,
|
|
|
|
instantMix: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
user: user,
|
2019-11-06 03:43:39 -07:00
|
|
|
share: true
|
2018-10-22 15:05:09 -07:00
|
|
|
};
|
2019-03-18 22:22:48 -07:00
|
|
|
return options;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function getProgramScheduleHtml(items, options) {
|
|
|
|
options = options || {};
|
|
|
|
var html = "";
|
2019-11-06 03:43:39 -07:00
|
|
|
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-list" data-contextmenu="false">';
|
|
|
|
html += listView.getListViewHtml({
|
2018-10-22 15:05:09 -07:00
|
|
|
items: items,
|
2019-11-06 03:43:39 -07:00
|
|
|
enableUserDataButtons: false,
|
|
|
|
image: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
imageSource: "channel",
|
2019-11-06 03:43:39 -07:00
|
|
|
showProgramDateTime: true,
|
|
|
|
showChannel: false,
|
|
|
|
mediaInfo: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
action: "none",
|
2019-11-06 03:43:39 -07:00
|
|
|
moreButton: false,
|
|
|
|
recordButton: false
|
|
|
|
});
|
|
|
|
return html += "</div>";
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderSeriesTimerSchedule(page, apiClient, seriesTimerId) {
|
|
|
|
apiClient.getLiveTvTimers({
|
|
|
|
UserId: apiClient.getCurrentUserId(),
|
|
|
|
ImageTypeLimit: 1,
|
|
|
|
EnableImageTypes: "Primary,Backdrop,Thumb",
|
|
|
|
SortBy: "StartDate",
|
2019-11-06 03:43:39 -07:00
|
|
|
EnableTotalRecordCount: false,
|
|
|
|
EnableUserData: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
SeriesTimerId: seriesTimerId,
|
|
|
|
Fields: "ChannelInfo,ChannelImage"
|
2019-11-06 03:43:39 -07:00
|
|
|
}).then(function (result) {
|
|
|
|
if (result.Items.length && result.Items[0].SeriesTimerId != seriesTimerId) {
|
|
|
|
result.Items = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
var html = getProgramScheduleHtml(result.Items);
|
|
|
|
var scheduleTab = page.querySelector(".seriesTimerSchedule");
|
|
|
|
scheduleTab.innerHTML = html;
|
|
|
|
imageLoader.lazyChildren(scheduleTab);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderTimerEditor(page, item, apiClient, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("Recording" !== item.Type || !user.Policy.EnableLiveTvManagement || !item.TimerId || "InProgress" !== item.Status) {
|
|
|
|
return void hideAll(page, "btnCancelTimer");
|
|
|
|
}
|
|
|
|
|
|
|
|
hideAll(page, "btnCancelTimer", true);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderSeriesTimerEditor(page, item, apiClient, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("SeriesTimer" !== item.Type) {
|
|
|
|
return void hideAll(page, "btnCancelSeriesTimer");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (user.Policy.EnableLiveTvManagement) {
|
|
|
|
require(["seriesRecordingEditor"], function (seriesRecordingEditor) {
|
|
|
|
seriesRecordingEditor.embed(item, apiClient.serverId(), {
|
|
|
|
context: page.querySelector(".seriesRecordingEditor")
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
page.querySelector(".seriesTimerScheduleSection").classList.remove("hide");
|
|
|
|
hideAll(page, "btnCancelSeriesTimer", true);
|
|
|
|
return void renderSeriesTimerSchedule(page, apiClient, item.Id);
|
|
|
|
}
|
|
|
|
|
|
|
|
page.querySelector(".seriesTimerScheduleSection").classList.add("hide");
|
|
|
|
return void hideAll(page, "btnCancelSeriesTimer");
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderTrackSelections(page, instance, item, forceReload) {
|
|
|
|
var select = page.querySelector(".selectSource");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || -1 === playbackManager.getSupportedCommands().indexOf("PlayMediaSource") || !playbackManager.canPlay(item)) {
|
|
|
|
page.querySelector(".trackSelections").classList.add("hide");
|
|
|
|
select.innerHTML = "";
|
|
|
|
page.querySelector(".selectVideo").innerHTML = "";
|
|
|
|
page.querySelector(".selectAudio").innerHTML = "";
|
|
|
|
page.querySelector(".selectSubtitles").innerHTML = "";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
playbackManager.getPlaybackMediaSources(item).then(function (mediaSources) {
|
|
|
|
instance._currentPlaybackMediaSources = mediaSources;
|
|
|
|
page.querySelector(".trackSelections").classList.remove("hide");
|
|
|
|
select.setLabel(globalize.translate("LabelVersion"));
|
|
|
|
var currentValue = select.value;
|
|
|
|
var selectedId = mediaSources[0].Id;
|
|
|
|
select.innerHTML = mediaSources.map(function (v) {
|
2018-10-22 15:05:09 -07:00
|
|
|
var selected = v.Id === selectedId ? " selected" : "";
|
2019-11-06 03:43:39 -07:00
|
|
|
return '<option value="' + v.Id + '"' + selected + ">" + v.Name + "</option>";
|
|
|
|
}).join("");
|
|
|
|
|
|
|
|
if (mediaSources.length > 1) {
|
|
|
|
page.querySelector(".selectSourceContainer").classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
page.querySelector(".selectSourceContainer").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (select.value !== currentValue || forceReload) {
|
|
|
|
renderVideoSelections(page, mediaSources);
|
|
|
|
renderAudioSelections(page, mediaSources);
|
|
|
|
renderSubtitleSelections(page, mediaSources);
|
|
|
|
}
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderVideoSelections(page, mediaSources) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var mediaSourceId = page.querySelector(".selectSource").value;
|
|
|
|
var mediaSource = mediaSources.filter(function (m) {
|
|
|
|
return m.Id === mediaSourceId;
|
|
|
|
})[0];
|
|
|
|
var tracks = mediaSource.MediaStreams.filter(function (m) {
|
|
|
|
return "Video" === m.Type;
|
|
|
|
});
|
|
|
|
var select = page.querySelector(".selectVideo");
|
2019-02-02 10:41:16 -07:00
|
|
|
select.setLabel(globalize.translate("LabelVideo"));
|
2018-10-22 15:05:09 -07:00
|
|
|
var selectedId = tracks.length ? tracks[0].Index : -1;
|
2019-11-06 03:43:39 -07:00
|
|
|
select.innerHTML = tracks.map(function (v) {
|
|
|
|
var selected = v.Index === selectedId ? " selected" : "";
|
|
|
|
var titleParts = [];
|
|
|
|
var resolutionText = mediaInfo.getResolutionText(v);
|
|
|
|
|
|
|
|
if (resolutionText) {
|
|
|
|
titleParts.push(resolutionText);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (v.Codec) {
|
|
|
|
titleParts.push(v.Codec.toUpperCase());
|
|
|
|
}
|
|
|
|
|
|
|
|
return '<option value="' + v.Index + '" ' + selected + ">" + (v.DisplayTitle || titleParts.join(" ")) + "</option>";
|
|
|
|
}).join("");
|
|
|
|
select.setAttribute("disabled", "disabled");
|
|
|
|
|
|
|
|
if (tracks.length) {
|
|
|
|
page.querySelector(".selectVideoContainer").classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
page.querySelector(".selectVideoContainer").classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderAudioSelections(page, mediaSources) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var mediaSourceId = page.querySelector(".selectSource").value;
|
|
|
|
var mediaSource = mediaSources.filter(function (m) {
|
|
|
|
return m.Id === mediaSourceId;
|
|
|
|
})[0];
|
|
|
|
var tracks = mediaSource.MediaStreams.filter(function (m) {
|
|
|
|
return "Audio" === m.Type;
|
|
|
|
});
|
|
|
|
var select = page.querySelector(".selectAudio");
|
2019-02-02 10:41:16 -07:00
|
|
|
select.setLabel(globalize.translate("LabelAudio"));
|
2018-10-22 15:05:09 -07:00
|
|
|
var selectedId = mediaSource.DefaultAudioStreamIndex;
|
2019-11-06 03:43:39 -07:00
|
|
|
select.innerHTML = tracks.map(function (v) {
|
2018-10-22 15:05:09 -07:00
|
|
|
var selected = v.Index === selectedId ? " selected" : "";
|
2019-11-06 03:43:39 -07:00
|
|
|
return '<option value="' + v.Index + '" ' + selected + ">" + v.DisplayTitle + "</option>";
|
|
|
|
}).join("");
|
|
|
|
|
|
|
|
if (tracks.length > 1) {
|
|
|
|
select.removeAttribute("disabled");
|
|
|
|
} else {
|
|
|
|
select.setAttribute("disabled", "disabled");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tracks.length) {
|
|
|
|
page.querySelector(".selectAudioContainer").classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
page.querySelector(".selectAudioContainer").classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderSubtitleSelections(page, mediaSources) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var mediaSourceId = page.querySelector(".selectSource").value;
|
|
|
|
var mediaSource = mediaSources.filter(function (m) {
|
|
|
|
return m.Id === mediaSourceId;
|
|
|
|
})[0];
|
|
|
|
var tracks = mediaSource.MediaStreams.filter(function (m) {
|
|
|
|
return "Subtitle" === m.Type;
|
|
|
|
});
|
|
|
|
var select = page.querySelector(".selectSubtitles");
|
2019-02-02 10:41:16 -07:00
|
|
|
select.setLabel(globalize.translate("LabelSubtitles"));
|
2018-10-22 15:05:09 -07:00
|
|
|
var selectedId = null == mediaSource.DefaultSubtitleStreamIndex ? -1 : mediaSource.DefaultSubtitleStreamIndex;
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (tracks.length) {
|
|
|
|
var selected = -1 === selectedId ? " selected" : "";
|
2019-11-06 03:43:39 -07:00
|
|
|
select.innerHTML = '<option value="-1">' + globalize.translate("Off") + "</option>" + tracks.map(function (v) {
|
|
|
|
selected = v.Index === selectedId ? " selected" : "";
|
|
|
|
return '<option value="' + v.Index + '" ' + selected + ">" + v.DisplayTitle + "</option>";
|
|
|
|
}).join("");
|
|
|
|
page.querySelector(".selectSubtitlesContainer").classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
select.innerHTML = "";
|
|
|
|
page.querySelector(".selectSubtitlesContainer").classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function reloadPlayButtons(page, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var canPlay = false;
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if ("Program" == item.Type) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var now = new Date();
|
|
|
|
|
|
|
|
if (now >= datetime.parseISO8601Date(item.StartDate, true) && now < datetime.parseISO8601Date(item.EndDate, true)) {
|
|
|
|
hideAll(page, "btnPlay", true);
|
|
|
|
canPlay = true;
|
|
|
|
} else {
|
|
|
|
hideAll(page, "btnPlay");
|
|
|
|
}
|
|
|
|
|
|
|
|
hideAll(page, "btnResume");
|
|
|
|
hideAll(page, "btnInstantMix");
|
|
|
|
hideAll(page, "btnShuffle");
|
2018-10-22 15:05:09 -07:00
|
|
|
} else if (playbackManager.canPlay(item)) {
|
2019-11-06 03:43:39 -07:00
|
|
|
hideAll(page, "btnPlay", true);
|
2018-10-22 15:05:09 -07:00
|
|
|
var enableInstantMix = -1 !== ["Audio", "MusicAlbum", "MusicGenre", "MusicArtist"].indexOf(item.Type);
|
|
|
|
hideAll(page, "btnInstantMix", enableInstantMix);
|
|
|
|
var enableShuffle = item.IsFolder || -1 !== ["MusicAlbum", "MusicGenre", "MusicArtist"].indexOf(item.Type);
|
2019-11-06 03:43:39 -07:00
|
|
|
hideAll(page, "btnShuffle", enableShuffle);
|
|
|
|
canPlay = true;
|
|
|
|
hideAll(page, "btnResume", item.UserData && item.UserData.PlaybackPositionTicks > 0);
|
|
|
|
} else {
|
|
|
|
hideAll(page, "btnPlay");
|
|
|
|
hideAll(page, "btnResume");
|
|
|
|
hideAll(page, "btnInstantMix");
|
|
|
|
hideAll(page, "btnShuffle");
|
|
|
|
}
|
|
|
|
|
|
|
|
return canPlay;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function reloadUserDataButtons(page, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var i;
|
|
|
|
var length;
|
|
|
|
var btnPlaystates = page.querySelectorAll(".btnPlaystate");
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
for (i = 0, length = btnPlaystates.length; i < length; i++) {
|
|
|
|
var btnPlaystate = btnPlaystates[i];
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (itemHelper.canMarkPlayed(item)) {
|
|
|
|
btnPlaystate.classList.remove("hide");
|
|
|
|
btnPlaystate.setItem(item);
|
|
|
|
} else {
|
|
|
|
btnPlaystate.classList.add("hide");
|
|
|
|
btnPlaystate.setItem(null);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var btnUserRatings = page.querySelectorAll(".btnUserRating");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
for (i = 0, length = btnUserRatings.length; i < length; i++) {
|
|
|
|
var btnUserRating = btnUserRatings[i];
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (itemHelper.canRate(item)) {
|
|
|
|
btnUserRating.classList.remove("hide");
|
|
|
|
btnUserRating.setItem(item);
|
|
|
|
} else {
|
|
|
|
btnUserRating.classList.add("hide");
|
|
|
|
btnUserRating.setItem(null);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getArtistLinksHtml(artists, serverId, context) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var html = [];
|
|
|
|
|
|
|
|
for (var i = 0, length = artists.length; i < length; i++) {
|
|
|
|
var artist = artists[i];
|
|
|
|
var href = appRouter.getRouteUrl(artist, {
|
|
|
|
context: context,
|
|
|
|
itemType: "MusicArtist",
|
|
|
|
serverId: serverId
|
|
|
|
});
|
|
|
|
html.push('<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + href + '">' + artist.Name + "</a>");
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
return html = html.join(" / ");
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderName(item, container, isStatic, context) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var parentRoute;
|
|
|
|
var parentNameHtml = [];
|
|
|
|
var parentNameLast = false;
|
|
|
|
|
|
|
|
if (item.AlbumArtists) {
|
|
|
|
parentNameHtml.push(getArtistLinksHtml(item.AlbumArtists, item.ServerId, context));
|
|
|
|
parentNameLast = true;
|
|
|
|
} else if (item.ArtistItems && item.ArtistItems.length && "MusicVideo" === item.Type) {
|
|
|
|
parentNameHtml.push(getArtistLinksHtml(item.ArtistItems, item.ServerId, context));
|
|
|
|
parentNameLast = true;
|
|
|
|
} else if (item.SeriesName && "Episode" === item.Type) {
|
|
|
|
parentRoute = appRouter.getRouteUrl({
|
|
|
|
Id: item.SeriesId,
|
|
|
|
Name: item.SeriesName,
|
|
|
|
Type: "Series",
|
|
|
|
IsFolder: true,
|
|
|
|
ServerId: item.ServerId
|
|
|
|
}, {
|
|
|
|
context: context
|
|
|
|
});
|
|
|
|
parentNameHtml.push('<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + parentRoute + '">' + item.SeriesName + "</a>");
|
|
|
|
} else if (item.IsSeries || item.EpisodeTitle) {
|
|
|
|
parentNameHtml.push(item.Name);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item.SeriesName && "Season" === item.Type) {
|
|
|
|
parentRoute = appRouter.getRouteUrl({
|
|
|
|
Id: item.SeriesId,
|
|
|
|
Name: item.SeriesName,
|
|
|
|
Type: "Series",
|
|
|
|
IsFolder: true,
|
|
|
|
ServerId: item.ServerId
|
|
|
|
}, {
|
|
|
|
context: context
|
|
|
|
});
|
|
|
|
parentNameHtml.push('<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + parentRoute + '">' + item.SeriesName + "</a>");
|
|
|
|
} else if (null != item.ParentIndexNumber && "Episode" === item.Type) {
|
|
|
|
parentRoute = appRouter.getRouteUrl({
|
|
|
|
Id: item.SeasonId,
|
|
|
|
Name: item.SeasonName,
|
|
|
|
Type: "Season",
|
|
|
|
IsFolder: true,
|
|
|
|
ServerId: item.ServerId
|
|
|
|
}, {
|
|
|
|
context: context
|
|
|
|
});
|
|
|
|
parentNameHtml.push('<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + parentRoute + '">' + item.SeasonName + "</a>");
|
|
|
|
} else if (null != item.ParentIndexNumber && item.IsSeries) {
|
|
|
|
parentNameHtml.push(item.SeasonName || "S" + item.ParentIndexNumber);
|
|
|
|
} else if (item.Album && item.AlbumId && ("MusicVideo" === item.Type || "Audio" === item.Type)) {
|
|
|
|
parentRoute = appRouter.getRouteUrl({
|
|
|
|
Id: item.AlbumId,
|
|
|
|
Name: item.Album,
|
|
|
|
Type: "MusicAlbum",
|
|
|
|
IsFolder: true,
|
|
|
|
ServerId: item.ServerId
|
|
|
|
}, {
|
|
|
|
context: context
|
|
|
|
});
|
|
|
|
parentNameHtml.push('<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + parentRoute + '">' + item.Album + "</a>");
|
|
|
|
} else if (item.Album) {
|
|
|
|
parentNameHtml.push(item.Album);
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var html = "";
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (parentNameHtml.length) {
|
|
|
|
if (parentNameLast) {
|
|
|
|
html = '<h3 class="parentName" style="margin: .25em 0;">' + parentNameHtml.join(" - ") + "</h3>";
|
|
|
|
} else {
|
|
|
|
html = '<h1 class="parentName" style="margin: .1em 0 .25em;">' + parentNameHtml.join(" - ") + "</h1>";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var name = itemHelper.getDisplayName(item, {
|
2019-11-06 03:43:39 -07:00
|
|
|
includeParentInfo: false
|
2018-10-22 15:05:09 -07:00
|
|
|
});
|
2019-09-11 09:29:52 -07:00
|
|
|
var offset = parentNameLast ? ".25em" : ".5em";
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-09-11 08:59:00 -07:00
|
|
|
if (html && !parentNameLast) {
|
2020-01-05 13:55:28 -07:00
|
|
|
html += '<h3 class="itemName infoText" style="margin: .25em 0 .5em;">' + name + '</h3>';
|
2019-09-11 08:59:00 -07:00
|
|
|
} else {
|
2020-01-05 13:55:28 -07:00
|
|
|
html = '<h1 class="itemName infoText" style="margin: .1em 0 ' + offset + ';">' + name + "</h1>" + html;
|
2019-09-11 08:59:00 -07:00
|
|
|
}
|
|
|
|
|
2019-09-11 09:19:17 -07:00
|
|
|
if (item.OriginalTitle && item.OriginalTitle != item.Name) {
|
2020-01-05 13:55:28 -07:00
|
|
|
html += '<h4 class="itemName infoText" style="margin: -' + offset + ' 0 0">' + item.OriginalTitle + '</h4>';
|
2019-09-11 08:59:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
container.innerHTML = html;
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (html.length) {
|
|
|
|
container.classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
container.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function setTrailerButtonVisibility(page, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf("PlayTrailers")) {
|
|
|
|
hideAll(page, "btnPlayTrailer", true);
|
|
|
|
} else {
|
|
|
|
hideAll(page, "btnPlayTrailer");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
2019-11-28 12:46:57 -07:00
|
|
|
function enabled() {
|
|
|
|
return userSettings.enableBackdrops();
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderBackdrop(page, item, apiClient) {
|
|
|
|
if (enabled()) {
|
|
|
|
if (dom.getWindowSize().innerWidth >= 1000) {
|
|
|
|
backdrop.setBackdrops([item]);
|
|
|
|
} else {
|
|
|
|
backdrop.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
function renderDetailPageBackdrop(page, item, apiClient) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var imgUrl;
|
|
|
|
var screenWidth = screen.availWidth;
|
|
|
|
var hasbackdrop = false;
|
|
|
|
var itemBackdropElement = page.querySelector("#itemBackdrop");
|
|
|
|
var usePrimaryImage = item.MediaType === "Video" && item.Type !== "Movie" && item.Type !== "Trailer" ||
|
|
|
|
item.MediaType && item.MediaType !== "Video" ||
|
|
|
|
item.Type === "MusicAlbum" ||
|
2020-01-13 12:20:06 -07:00
|
|
|
item.Type === "MusicArtist" ||
|
|
|
|
item.Type === "Person";
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if ("Program" === item.Type && item.ImageTags && item.ImageTags.Thumb) {
|
|
|
|
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Thumb",
|
|
|
|
index: 0,
|
|
|
|
tag: item.ImageTags.Thumb
|
|
|
|
});
|
|
|
|
itemBackdropElement.classList.remove("noBackdrop");
|
|
|
|
imageLoader.lazyImage(itemBackdropElement, imgUrl, false);
|
|
|
|
hasbackdrop = true;
|
|
|
|
} else if (usePrimaryImage && item.ImageTags && item.ImageTags.Primary) {
|
|
|
|
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Primary",
|
|
|
|
index: 0,
|
|
|
|
tag: item.ImageTags.Primary
|
|
|
|
});
|
|
|
|
itemBackdropElement.classList.remove("noBackdrop");
|
|
|
|
imageLoader.lazyImage(itemBackdropElement, imgUrl, false);
|
|
|
|
hasbackdrop = true;
|
|
|
|
} else if (item.BackdropImageTags && item.BackdropImageTags.length) {
|
|
|
|
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Backdrop",
|
|
|
|
index: 0,
|
|
|
|
tag: item.BackdropImageTags[0]
|
|
|
|
});
|
|
|
|
itemBackdropElement.classList.remove("noBackdrop");
|
|
|
|
imageLoader.lazyImage(itemBackdropElement, imgUrl, false);
|
|
|
|
hasbackdrop = true;
|
|
|
|
} else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
|
|
|
|
imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, {
|
|
|
|
type: "Backdrop",
|
|
|
|
index: 0,
|
2019-11-24 05:34:30 -07:00
|
|
|
tag: item.ParentBackdropImageTags[0]
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
itemBackdropElement.classList.remove("noBackdrop");
|
|
|
|
imageLoader.lazyImage(itemBackdropElement, imgUrl, false);
|
|
|
|
hasbackdrop = true;
|
|
|
|
} else if (item.ImageTags && item.ImageTags.Thumb) {
|
|
|
|
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Thumb",
|
|
|
|
index: 0,
|
|
|
|
tag: item.ImageTags.Thumb
|
|
|
|
});
|
|
|
|
itemBackdropElement.classList.remove("noBackdrop");
|
|
|
|
imageLoader.lazyImage(itemBackdropElement, imgUrl, false);
|
|
|
|
hasbackdrop = true;
|
|
|
|
} else {
|
|
|
|
itemBackdropElement.classList.add("noBackdrop");
|
|
|
|
itemBackdropElement.style.backgroundImage = "";
|
|
|
|
}
|
|
|
|
|
|
|
|
return hasbackdrop;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function reloadFromItem(instance, page, params, item, user) {
|
|
|
|
var context = params.context;
|
2020-01-13 11:15:59 -07:00
|
|
|
page.querySelector(".detailPagePrimaryContainer").classList.add("detailSticky");
|
2019-11-06 03:43:39 -07:00
|
|
|
renderName(item, page.querySelector(".nameContainer"), false, context);
|
2018-10-22 15:05:09 -07:00
|
|
|
var apiClient = connectionManager.getApiClient(item.ServerId);
|
2019-11-06 03:43:39 -07:00
|
|
|
renderSeriesTimerEditor(page, item, apiClient, user);
|
|
|
|
renderTimerEditor(page, item, apiClient, user);
|
|
|
|
renderImage(page, item, apiClient, user);
|
|
|
|
renderLogo(page, item, apiClient);
|
|
|
|
setTitle(item, apiClient);
|
|
|
|
setInitialCollapsibleState(page, item, apiClient, context, user);
|
|
|
|
renderDetails(page, item, apiClient, context);
|
|
|
|
renderTrackSelections(page, instance, item);
|
2019-11-28 12:46:57 -07:00
|
|
|
renderBackdrop(page, item, apiClient);
|
2019-11-06 03:43:39 -07:00
|
|
|
renderDetailPageBackdrop(page, item, apiClient);
|
2018-10-22 15:05:09 -07:00
|
|
|
var canPlay = reloadPlayButtons(page, item);
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-03-20 14:48:59 -07:00
|
|
|
if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf("PlayTrailers")) {
|
|
|
|
hideAll(page, "btnPlayTrailer", true);
|
|
|
|
} else {
|
|
|
|
hideAll(page, "btnPlayTrailer");
|
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-03-18 22:22:48 -07:00
|
|
|
setTrailerButtonVisibility(page, item);
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-03-20 14:48:59 -07:00
|
|
|
if (item.CanDelete && !item.IsFolder) {
|
|
|
|
hideAll(page, "btnDeleteItem", true);
|
|
|
|
} else {
|
|
|
|
hideAll(page, "btnDeleteItem");
|
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-03-20 14:48:59 -07:00
|
|
|
if ("Program" !== item.Type || canPlay) {
|
|
|
|
hideAll(page, "mainDetailButtons", true);
|
|
|
|
} else {
|
|
|
|
hideAll(page, "mainDetailButtons");
|
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-03-18 22:22:48 -07:00
|
|
|
showRecordingFields(instance, page, item, user);
|
2019-11-06 03:43:39 -07:00
|
|
|
var groupedVersions = (item.MediaSources || []).filter(function (g) {
|
|
|
|
return "Grouping" == g.Type;
|
2018-10-22 15:05:09 -07:00
|
|
|
});
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (user.Policy.IsAdministrator && groupedVersions.length) {
|
|
|
|
page.querySelector(".btnSplitVersions").classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
page.querySelector(".btnSplitVersions").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (itemContextMenu.getCommands(getContextMenuOptions(item, user)).length) {
|
|
|
|
hideAll(page, "btnMoreCommands", true);
|
|
|
|
} else {
|
|
|
|
hideAll(page, "btnMoreCommands");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var itemBirthday = page.querySelector("#itemBirthday");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if ("Person" == item.Type && item.PremiereDate) {
|
|
|
|
try {
|
|
|
|
var birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString();
|
|
|
|
itemBirthday.classList.remove("hide");
|
|
|
|
itemBirthday.innerHTML = globalize.translate("BirthDateValue").replace("{0}", birthday);
|
|
|
|
} catch (err) {
|
|
|
|
itemBirthday.classList.add("hide");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
itemBirthday.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var itemDeathDate = page.querySelector("#itemDeathDate");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if ("Person" == item.Type && item.EndDate) {
|
|
|
|
try {
|
|
|
|
var deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString();
|
|
|
|
itemDeathDate.classList.remove("hide");
|
|
|
|
itemDeathDate.innerHTML = globalize.translate("DeathDateValue").replace("{0}", deathday);
|
|
|
|
} catch (err) {
|
|
|
|
itemDeathDate.classList.add("hide");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
itemDeathDate.classList.add("hide");
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var itemBirthLocation = page.querySelector("#itemBirthLocation");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if ("Person" == item.Type && item.ProductionLocations && item.ProductionLocations.length) {
|
|
|
|
var gmap = '<a is="emby-linkbutton" class="button-link textlink" target="_blank" href="https://maps.google.com/maps?q=' + item.ProductionLocations[0] + '">' + item.ProductionLocations[0] + "</a>";
|
2019-11-06 03:43:39 -07:00
|
|
|
itemBirthLocation.classList.remove("hide");
|
|
|
|
itemBirthLocation.innerHTML = globalize.translate("BirthPlaceValue").replace("{0}", gmap);
|
|
|
|
} else {
|
|
|
|
itemBirthLocation.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
setPeopleHeader(page, item);
|
|
|
|
loading.hide();
|
2019-05-07 22:03:59 -07:00
|
|
|
|
2019-07-28 06:51:02 -07:00
|
|
|
if (item.Type === "Book") {
|
|
|
|
hideAll(page, "btnDownload", true);
|
|
|
|
}
|
|
|
|
|
2019-11-02 10:38:58 -07:00
|
|
|
require(["autoFocuser"], function (autoFocuser) {
|
|
|
|
autoFocuser.autoFocus(page);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function logoImageUrl(item, apiClient, options) {
|
2019-11-06 03:43:39 -07:00
|
|
|
options = options || {};
|
|
|
|
options.type = "Logo";
|
|
|
|
|
|
|
|
if (item.ImageTags && item.ImageTags.Logo) {
|
|
|
|
options.tag = item.ImageTags.Logo;
|
|
|
|
return apiClient.getScaledImageUrl(item.Id, options);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item.ParentLogoImageTag) {
|
|
|
|
options.tag = item.ParentLogoImageTag;
|
|
|
|
return apiClient.getScaledImageUrl(item.ParentLogoItemId, options);
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function setTitle(item, apiClient) {
|
|
|
|
var url = logoImageUrl(item, apiClient, {});
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (url = null) {
|
|
|
|
var pageTitle = document.querySelector(".pageTitle");
|
2019-11-06 03:43:39 -07:00
|
|
|
pageTitle.style.backgroundImage = "url('" + url + "')";
|
|
|
|
pageTitle.classList.add("pageTitleWithLogo");
|
|
|
|
pageTitle.innerHTML = "";
|
|
|
|
} else {
|
|
|
|
Emby.Page.setTitle("");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderLogo(page, item, apiClient) {
|
|
|
|
var url = logoImageUrl(item, apiClient, {
|
2019-11-06 03:43:39 -07:00
|
|
|
maxWidth: 400
|
|
|
|
});
|
|
|
|
var detailLogo = page.querySelector(".detailLogo");
|
|
|
|
|
|
|
|
if (url) {
|
|
|
|
detailLogo.classList.remove("hide");
|
|
|
|
detailLogo.classList.add("lazy");
|
|
|
|
detailLogo.setAttribute("data-src", url);
|
|
|
|
imageLoader.lazyImage(detailLogo);
|
|
|
|
} else {
|
|
|
|
detailLogo.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function showRecordingFields(instance, page, item, user) {
|
|
|
|
if (!instance.currentRecordingFields) {
|
|
|
|
var recordingFieldsElement = page.querySelector(".recordingFields");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if ("Program" == item.Type && user.Policy.EnableLiveTvManagement) {
|
|
|
|
require(["recordingFields"], function (recordingFields) {
|
|
|
|
instance.currentRecordingFields = new recordingFields({
|
|
|
|
parent: recordingFieldsElement,
|
|
|
|
programId: item.Id,
|
|
|
|
serverId: item.ServerId
|
|
|
|
});
|
|
|
|
recordingFieldsElement.classList.remove("hide");
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
recordingFieldsElement.classList.add("hide");
|
|
|
|
recordingFieldsElement.innerHTML = "";
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-11 10:58:31 -07:00
|
|
|
function renderUserInfo(page, item) {
|
|
|
|
var lastPlayedElement = page.querySelector(".itemLastPlayed");
|
|
|
|
|
|
|
|
if (item.UserData && item.UserData.LastPlayedDate) {
|
|
|
|
lastPlayedElement.classList.remove("hide");
|
|
|
|
var datePlayed = datetime.parseISO8601Date(item.UserData.LastPlayedDate);
|
2019-10-26 17:45:14 -07:00
|
|
|
lastPlayedElement.innerHTML = globalize.translate("DatePlayed") + ": " + datetime.toLocaleDateString(datePlayed) + " " + datetime.getDisplayTime(datePlayed);
|
2019-09-11 10:58:31 -07:00
|
|
|
} else {
|
|
|
|
lastPlayedElement.classList.add("hide");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
function renderLinks(linksElem, item) {
|
|
|
|
var html = [];
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (item.DateCreated && itemHelper.enableDateAddedDisplay(item)) {
|
|
|
|
var dateCreated = datetime.parseISO8601Date(item.DateCreated);
|
2019-11-06 03:43:39 -07:00
|
|
|
html.push(globalize.translate("AddedOnValue", datetime.toLocaleDateString(dateCreated) + " " + datetime.getDisplayTime(dateCreated)));
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var links = [];
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (!layoutManager.tv && item.HomePageUrl) {
|
|
|
|
links.push('<a style="color:inherit;" is="emby-linkbutton" class="button-link" href="' + item.HomePageUrl + '" target="_blank">' + globalize.translate("ButtonWebsite") + "</a>");
|
|
|
|
}
|
|
|
|
if (item.ExternalUrls) {
|
2018-10-22 15:05:09 -07:00
|
|
|
for (var i = 0, length = item.ExternalUrls.length; i < length; i++) {
|
|
|
|
var url = item.ExternalUrls[i];
|
2019-11-06 03:43:39 -07:00
|
|
|
links.push('<a style="color:inherit;" is="emby-linkbutton" class="button-link" href="' + url.Url + '" target="_blank">' + url.Name + "</a>");
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (links.length) {
|
|
|
|
html.push(globalize.translate("LinksValue", links.join(", ")));
|
|
|
|
}
|
|
|
|
|
|
|
|
linksElem.innerHTML = html.join(", ");
|
|
|
|
|
|
|
|
if (html.length) {
|
|
|
|
linksElem.classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
linksElem.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderDetailImage(page, elem, item, apiClient, editable, imageLoader, indicators) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("SeriesTimer" === item.Type || "Program" === item.Type) {
|
|
|
|
editable = false;
|
|
|
|
}
|
|
|
|
|
2020-01-13 12:18:43 -07:00
|
|
|
elem.classList.add("detailimg-hidemobile");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var imageTags = item.ImageTags || {};
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (item.PrimaryImageTag) {
|
|
|
|
imageTags.Primary = item.PrimaryImageTag;
|
|
|
|
}
|
|
|
|
|
|
|
|
var url;
|
|
|
|
var html = "";
|
|
|
|
var shape = "portrait";
|
|
|
|
var detectRatio = false;
|
|
|
|
|
|
|
|
if (imageTags.Primary) {
|
|
|
|
url = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Primary",
|
|
|
|
tag: item.ImageTags.Primary
|
|
|
|
});
|
|
|
|
detectRatio = true;
|
|
|
|
} else if (item.BackdropImageTags && item.BackdropImageTags.length) {
|
|
|
|
url = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Backdrop",
|
|
|
|
tag: item.BackdropImageTags[0]
|
|
|
|
});
|
|
|
|
shape = "thumb";
|
|
|
|
} else if (imageTags.Thumb) {
|
|
|
|
url = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Thumb",
|
|
|
|
tag: item.ImageTags.Thumb
|
|
|
|
});
|
|
|
|
shape = "thumb";
|
|
|
|
} else if (imageTags.Disc) {
|
|
|
|
url = apiClient.getScaledImageUrl(item.Id, {
|
|
|
|
type: "Disc",
|
|
|
|
tag: item.ImageTags.Disc
|
|
|
|
});
|
|
|
|
shape = "square";
|
|
|
|
} else if (item.AlbumId && item.AlbumPrimaryImageTag) {
|
|
|
|
url = apiClient.getScaledImageUrl(item.AlbumId, {
|
|
|
|
type: "Primary",
|
|
|
|
tag: item.AlbumPrimaryImageTag
|
|
|
|
});
|
|
|
|
shape = "square";
|
|
|
|
} else if (item.SeriesId && item.SeriesPrimaryImageTag) {
|
|
|
|
url = apiClient.getScaledImageUrl(item.SeriesId, {
|
|
|
|
type: "Primary",
|
|
|
|
tag: item.SeriesPrimaryImageTag
|
|
|
|
});
|
|
|
|
} else if (item.ParentPrimaryImageItemId && item.ParentPrimaryImageTag) {
|
|
|
|
url = apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, {
|
|
|
|
type: "Primary",
|
|
|
|
tag: item.ParentPrimaryImageTag
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (editable) {
|
2020-01-08 07:18:00 -07:00
|
|
|
html += "<a class='itemDetailGalleryLink' is='emby-linkbutton' style='display:block;margin:0;padding:0;' href='#'>";
|
2019-11-06 03:43:39 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
if (detectRatio && item.PrimaryImageAspectRatio) {
|
|
|
|
if (item.PrimaryImageAspectRatio >= 1.48) {
|
|
|
|
shape = "thumb";
|
2019-11-22 08:29:38 -07:00
|
|
|
} else if (item.PrimaryImageAspectRatio >= 0.85 && item.PrimaryImageAspectRatio <= 1.34) {
|
2019-11-06 03:43:39 -07:00
|
|
|
shape = "square";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
html += "<img class='itemDetailImage lazy' src='data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' />";
|
|
|
|
|
|
|
|
if (editable) {
|
|
|
|
html += "</a>";
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var progressHtml = item.IsFolder || !item.UserData ? "" : indicators.getProgressBarHtml(item);
|
2019-11-06 03:43:39 -07:00
|
|
|
html += '<div class="detailImageProgressContainer">';
|
|
|
|
|
|
|
|
if (progressHtml) {
|
|
|
|
html += progressHtml;
|
|
|
|
}
|
|
|
|
|
|
|
|
html += "</div>";
|
|
|
|
elem.innerHTML = html;
|
|
|
|
|
|
|
|
if ("thumb" == shape) {
|
|
|
|
elem.classList.add("thumbDetailImageContainer");
|
|
|
|
elem.classList.remove("portraitDetailImageContainer");
|
|
|
|
elem.classList.remove("squareDetailImageContainer");
|
|
|
|
} else if ("square" == shape) {
|
|
|
|
elem.classList.remove("thumbDetailImageContainer");
|
|
|
|
elem.classList.remove("portraitDetailImageContainer");
|
|
|
|
elem.classList.add("squareDetailImageContainer");
|
|
|
|
} else {
|
|
|
|
elem.classList.remove("thumbDetailImageContainer");
|
|
|
|
elem.classList.add("portraitDetailImageContainer");
|
|
|
|
elem.classList.remove("squareDetailImageContainer");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (url) {
|
|
|
|
imageLoader.lazyImage(elem.querySelector("img"), url);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderImage(page, item, apiClient, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
renderDetailImage(
|
|
|
|
page,
|
|
|
|
page.querySelector(".detailImageContainer"),
|
|
|
|
item,
|
|
|
|
apiClient,
|
|
|
|
user.Policy.IsAdministrator && "Photo" != item.MediaType,
|
|
|
|
imageLoader,
|
|
|
|
indicators
|
|
|
|
);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function refreshDetailImageUserData(elem, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
elem.querySelector(".detailImageProgressContainer").innerHTML = indicators.getProgressBarHtml(item);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function refreshImage(page, item, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
refreshDetailImageUserData(page.querySelector(".detailImageContainer"), item);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function setPeopleHeader(page, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("Audio" == item.MediaType || "MusicAlbum" == item.Type || "Book" == item.MediaType || "Photo" == item.MediaType) {
|
|
|
|
page.querySelector("#peopleHeader").innerHTML = globalize.translate("HeaderPeople");
|
|
|
|
} else {
|
|
|
|
page.querySelector("#peopleHeader").innerHTML = globalize.translate("HeaderCastAndCrew");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderNextUp(page, item, user) {
|
|
|
|
var section = page.querySelector(".nextUpSection");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if ("Series" != item.Type) {
|
|
|
|
return void section.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
connectionManager.getApiClient(item.ServerId).getNextUpEpisodes({
|
|
|
|
SeriesId: item.Id,
|
|
|
|
UserId: user.Id
|
2019-11-06 03:43:39 -07:00
|
|
|
}).then(function (result) {
|
|
|
|
if (result.Items.length) {
|
|
|
|
section.classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
section.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var html = cardBuilder.getCardsHtml({
|
2019-11-06 03:43:39 -07:00
|
|
|
items: result.Items,
|
2020-01-03 11:10:42 -07:00
|
|
|
shape: "overflowBackdrop",
|
2019-11-06 03:43:39 -07:00
|
|
|
showTitle: true,
|
|
|
|
displayAsSpecial: "Season" == item.Type && item.IndexNumber,
|
|
|
|
overlayText: false,
|
|
|
|
centerText: true,
|
|
|
|
overlayPlayButton: true
|
|
|
|
});
|
|
|
|
var itemsContainer = section.querySelector(".nextUpItems");
|
|
|
|
itemsContainer.innerHTML = html;
|
|
|
|
imageLoader.lazyChildren(itemsContainer);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function setInitialCollapsibleState(page, item, apiClient, context, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
page.querySelector(".collectionItems").innerHTML = "";
|
|
|
|
|
|
|
|
if ("Playlist" == item.Type) {
|
|
|
|
page.querySelector("#childrenCollapsible").classList.remove("hide");
|
|
|
|
renderPlaylistItems(page, item, user);
|
|
|
|
} else if ("Studio" == item.Type || "Person" == item.Type || "Genre" == item.Type || "MusicGenre" == item.Type || "MusicArtist" == item.Type) {
|
|
|
|
page.querySelector("#childrenCollapsible").classList.remove("hide");
|
|
|
|
renderItemsByName(page, item, user);
|
|
|
|
} else if (item.IsFolder) {
|
|
|
|
if ("BoxSet" == item.Type) {
|
|
|
|
page.querySelector("#childrenCollapsible").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
renderChildren(page, item);
|
|
|
|
} else {
|
|
|
|
page.querySelector("#childrenCollapsible").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("Series" == item.Type) {
|
|
|
|
renderSeriesSchedule(page, item, user);
|
|
|
|
renderNextUp(page, item, user);
|
|
|
|
} else {
|
|
|
|
page.querySelector(".nextUpSection").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
renderScenes(page, item);
|
|
|
|
|
|
|
|
if (item.SpecialFeatureCount && 0 != item.SpecialFeatureCount && "Series" != item.Type) {
|
|
|
|
page.querySelector("#specialsCollapsible").classList.remove("hide");
|
|
|
|
renderSpecials(page, item, user, 6);
|
|
|
|
} else {
|
|
|
|
page.querySelector("#specialsCollapsible").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
renderCast(page, item, context, enableScrollX() ? null : 12);
|
|
|
|
|
|
|
|
if (item.PartCount && item.PartCount > 1) {
|
|
|
|
page.querySelector("#additionalPartsCollapsible").classList.remove("hide");
|
|
|
|
renderAdditionalParts(page, item, user);
|
|
|
|
} else {
|
|
|
|
page.querySelector("#additionalPartsCollapsible").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("MusicAlbum" == item.Type) {
|
|
|
|
renderMusicVideos(page, item, user);
|
|
|
|
} else {
|
|
|
|
page.querySelector("#musicVideosCollapsible").classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderOverview(elems, item) {
|
|
|
|
for (var i = 0, length = elems.length; i < length; i++) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var elem = elems[i];
|
|
|
|
var overview = item.Overview || "";
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (overview) {
|
2019-11-06 03:43:39 -07:00
|
|
|
elem.innerHTML = overview;
|
|
|
|
elem.classList.remove("hide");
|
|
|
|
var anchors = elem.querySelectorAll("a");
|
|
|
|
|
|
|
|
for (var j = 0, length2 = anchors.length; j < length2; j++) {
|
|
|
|
anchors[j].setAttribute("target", "_blank");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
elem.innerHTML = "";
|
|
|
|
elem.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderGenres(page, item, apiClient, context, isStatic) {
|
|
|
|
context = context || inferContext(item);
|
2019-11-06 03:43:39 -07:00
|
|
|
var type;
|
|
|
|
var genres = item.GenreItems || [];
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
switch (context) {
|
|
|
|
case "music":
|
|
|
|
type = "MusicGenre";
|
|
|
|
break;
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
default:
|
2019-11-06 03:43:39 -07:00
|
|
|
type = "Genre";
|
|
|
|
}
|
|
|
|
|
|
|
|
var html = genres.map(function (p) {
|
|
|
|
return '<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + appRouter.getRouteUrl({
|
|
|
|
Name: p.Name,
|
|
|
|
Type: type,
|
|
|
|
ServerId: item.ServerId,
|
|
|
|
Id: p.Id
|
|
|
|
}, {
|
|
|
|
context: context
|
|
|
|
}) + '">' + p.Name + "</a>";
|
|
|
|
}).join(", ");
|
|
|
|
var elem = page.querySelector(".genres");
|
|
|
|
elem.innerHTML = globalize.translate(genres.length > 1 ? "GenresValue" : "GenreValue", html);
|
|
|
|
|
|
|
|
if (genres.length) {
|
|
|
|
elem.classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
elem.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderDirector(page, item, apiClient, context, isStatic) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var directors = (item.People || []).filter(function (p) {
|
|
|
|
return "Director" === p.Type;
|
|
|
|
});
|
|
|
|
var html = directors.map(function (p) {
|
|
|
|
return '<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + appRouter.getRouteUrl({
|
|
|
|
Name: p.Name,
|
|
|
|
Type: "Person",
|
|
|
|
ServerId: item.ServerId,
|
|
|
|
Id: p.Id
|
|
|
|
}, {
|
|
|
|
context: context
|
|
|
|
}) + '">' + p.Name + "</a>";
|
|
|
|
}).join(", ");
|
|
|
|
var elem = page.querySelector(".directors");
|
|
|
|
elem.innerHTML = globalize.translate(directors.length > 1 ? "DirectorsValue" : "DirectorValue", html);
|
|
|
|
|
|
|
|
if (directors.length) {
|
|
|
|
elem.classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
elem.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderDetails(page, item, apiClient, context, isStatic) {
|
2019-09-11 09:47:39 -07:00
|
|
|
renderSimilarItems(page, item, context);
|
|
|
|
renderMoreFromSeason(page, item, apiClient);
|
|
|
|
renderMoreFromArtist(page, item, apiClient);
|
|
|
|
renderDirector(page, item, apiClient, context, isStatic);
|
|
|
|
renderGenres(page, item, apiClient, context, isStatic);
|
|
|
|
renderChannelGuide(page, apiClient, item);
|
2018-10-22 15:05:09 -07:00
|
|
|
var taglineElement = page.querySelector(".tagline");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-09-11 09:47:39 -07:00
|
|
|
if (item.Taglines && item.Taglines.length) {
|
|
|
|
taglineElement.classList.remove("hide");
|
|
|
|
taglineElement.innerHTML = item.Taglines[0];
|
|
|
|
} else {
|
|
|
|
taglineElement.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
var overview = page.querySelector(".overview");
|
|
|
|
var externalLinksElem = page.querySelector(".itemExternalLinks");
|
|
|
|
|
|
|
|
if ("Season" !== item.Type && "MusicAlbum" !== item.Type && "MusicArtist" !== item.Type) {
|
|
|
|
overview.classList.add("detailsHiddenOnMobile");
|
|
|
|
externalLinksElem.classList.add("detailsHiddenOnMobile");
|
|
|
|
}
|
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
renderOverview([overview], item);
|
|
|
|
var i;
|
|
|
|
var itemMiscInfo;
|
2019-09-11 09:47:39 -07:00
|
|
|
itemMiscInfo = page.querySelectorAll(".itemMiscInfo-primary");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-09-11 09:47:39 -07:00
|
|
|
for (i = 0; i < itemMiscInfo.length; i++) {
|
|
|
|
mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
|
2019-11-06 03:43:39 -07:00
|
|
|
interactive: true,
|
|
|
|
episodeTitle: false,
|
|
|
|
subtitles: false
|
2019-09-11 09:47:39 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
if (itemMiscInfo[i].innerHTML && "SeriesTimer" !== item.Type) {
|
|
|
|
itemMiscInfo[i].classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
itemMiscInfo[i].classList.add("hide");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
itemMiscInfo = page.querySelectorAll(".itemMiscInfo-secondary");
|
|
|
|
|
2019-09-11 09:47:39 -07:00
|
|
|
for (i = 0; i < itemMiscInfo.length; i++) {
|
|
|
|
mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, {
|
2019-11-06 03:43:39 -07:00
|
|
|
interactive: true
|
|
|
|
});
|
2019-09-11 09:47:39 -07:00
|
|
|
|
|
|
|
if (itemMiscInfo[i].innerHTML && "SeriesTimer" !== item.Type) {
|
|
|
|
itemMiscInfo[i].classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
itemMiscInfo[i].classList.add("hide");
|
|
|
|
}
|
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-09-11 09:47:39 -07:00
|
|
|
reloadUserDataButtons(page, item);
|
|
|
|
renderLinks(externalLinksElem, item);
|
2019-09-11 10:58:31 -07:00
|
|
|
renderUserInfo(page, item);
|
2019-09-11 09:47:39 -07:00
|
|
|
renderTags(page, item);
|
2019-11-06 03:43:39 -07:00
|
|
|
renderSeriesAirTime(page, item, isStatic);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function enableScrollX() {
|
2019-11-06 03:43:39 -07:00
|
|
|
return browser.mobile && screen.availWidth <= 1000;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function getPortraitShape(scrollX) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if (null == scrollX) {
|
|
|
|
scrollX = enableScrollX();
|
|
|
|
}
|
|
|
|
|
|
|
|
return scrollX ? "overflowPortrait" : "portrait";
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function getSquareShape(scrollX) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if (null == scrollX) {
|
|
|
|
scrollX = enableScrollX();
|
|
|
|
}
|
|
|
|
|
|
|
|
return scrollX ? "overflowSquare" : "square";
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function getThumbShape(scrollX) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if (null == scrollX) {
|
|
|
|
scrollX = enableScrollX();
|
|
|
|
}
|
|
|
|
|
|
|
|
return scrollX ? "overflowBackdrop" : "backdrop";
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderMoreFromSeason(view, item, apiClient) {
|
|
|
|
var section = view.querySelector(".moreFromSeasonSection");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (section) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("Episode" !== item.Type || !item.SeasonId || !item.SeriesId) {
|
|
|
|
return void section.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var userId = apiClient.getCurrentUserId();
|
|
|
|
apiClient.getEpisodes(item.SeriesId, {
|
|
|
|
SeasonId: item.SeasonId,
|
|
|
|
UserId: userId,
|
|
|
|
Fields: "ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount"
|
2019-11-06 03:43:39 -07:00
|
|
|
}).then(function (result) {
|
|
|
|
if (result.Items.length < 2) {
|
|
|
|
return void section.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
section.classList.remove("hide");
|
|
|
|
section.querySelector("h2").innerHTML = globalize.translate("MoreFromValue", item.SeasonName);
|
2018-10-22 15:05:09 -07:00
|
|
|
var itemsContainer = section.querySelector(".itemsContainer");
|
|
|
|
cardBuilder.buildCards(result.Items, {
|
|
|
|
parentContainer: section,
|
|
|
|
itemsContainer: itemsContainer,
|
|
|
|
shape: "autooverflow",
|
|
|
|
sectionTitleTagName: "h2",
|
2019-11-06 03:43:39 -07:00
|
|
|
scalable: true,
|
|
|
|
showTitle: true,
|
|
|
|
overlayText: false,
|
|
|
|
centerText: true,
|
|
|
|
includeParentInfoInTitle: false,
|
|
|
|
allowBottomPadding: false
|
2018-10-22 15:05:09 -07:00
|
|
|
});
|
|
|
|
var card = itemsContainer.querySelector('.card[data-id="' + item.Id + '"]');
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (card) {
|
|
|
|
setTimeout(function () {
|
|
|
|
section.querySelector(".emby-scroller").toStart(card.previousSibling || card, true);
|
|
|
|
}, 100);
|
|
|
|
}
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderMoreFromArtist(view, item, apiClient) {
|
|
|
|
var section = view.querySelector(".moreFromArtistSection");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (section) {
|
|
|
|
if ("MusicArtist" === item.Type) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if (!apiClient.isMinServerVersion("3.4.1.19")) {
|
|
|
|
return void section.classList.add("hide");
|
|
|
|
}
|
|
|
|
} else if ("MusicAlbum" !== item.Type || !item.AlbumArtists || !item.AlbumArtists.length) {
|
|
|
|
return void section.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var query = {
|
|
|
|
IncludeItemTypes: "MusicAlbum",
|
2019-11-06 03:43:39 -07:00
|
|
|
Recursive: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
ExcludeItemIds: item.Id,
|
|
|
|
SortBy: "ProductionYear,SortName",
|
|
|
|
SortOrder: "Descending"
|
|
|
|
};
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if ("MusicArtist" === item.Type) {
|
|
|
|
query.ContributingArtistIds = item.Id;
|
|
|
|
} else if (apiClient.isMinServerVersion("3.4.1.18")) {
|
|
|
|
query.AlbumArtistIds = item.AlbumArtists[0].Id;
|
|
|
|
} else {
|
|
|
|
query.ArtistIds = item.AlbumArtists[0].Id;
|
|
|
|
}
|
|
|
|
|
|
|
|
apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (result) {
|
|
|
|
if (!result.Items.length) {
|
|
|
|
return void section.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
section.classList.remove("hide");
|
|
|
|
|
|
|
|
if ("MusicArtist" === item.Type) {
|
|
|
|
section.querySelector("h2").innerHTML = globalize.translate("HeaderAppearsOn");
|
|
|
|
} else {
|
|
|
|
section.querySelector("h2").innerHTML = globalize.translate("MoreFromValue", item.AlbumArtists[0].Name);
|
|
|
|
}
|
|
|
|
|
|
|
|
cardBuilder.buildCards(result.Items, {
|
2018-10-22 15:05:09 -07:00
|
|
|
parentContainer: section,
|
|
|
|
itemsContainer: section.querySelector(".itemsContainer"),
|
|
|
|
shape: "autooverflow",
|
|
|
|
sectionTitleTagName: "h2",
|
2019-11-06 03:43:39 -07:00
|
|
|
scalable: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
coverImage: "MusicArtist" === item.Type || "MusicAlbum" === item.Type,
|
2019-11-06 03:43:39 -07:00
|
|
|
showTitle: true,
|
|
|
|
showParentTitle: false,
|
|
|
|
centerText: true,
|
|
|
|
overlayText: false,
|
|
|
|
overlayPlayButton: true,
|
|
|
|
showYear: true
|
|
|
|
});
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderSimilarItems(page, item, context) {
|
|
|
|
var similarCollapsible = page.querySelector("#similarCollapsible");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (similarCollapsible) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("Movie" != item.Type && "Trailer" != item.Type && "Series" != item.Type && "Program" != item.Type && "Recording" != item.Type && "MusicAlbum" != item.Type && "MusicArtist" != item.Type && "Playlist" != item.Type) {
|
|
|
|
return void similarCollapsible.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
similarCollapsible.classList.remove("hide");
|
2019-11-06 03:43:39 -07:00
|
|
|
var apiClient = connectionManager.getApiClient(item.ServerId);
|
|
|
|
var options = {
|
|
|
|
userId: apiClient.getCurrentUserId(),
|
|
|
|
limit: 12,
|
|
|
|
fields: "PrimaryImageAspectRatio,UserData,CanDelete"
|
|
|
|
};
|
|
|
|
|
|
|
|
if ("MusicAlbum" == item.Type && item.AlbumArtists && item.AlbumArtists.length) {
|
|
|
|
options.ExcludeArtistIds = item.AlbumArtists[0].Id;
|
|
|
|
}
|
|
|
|
|
|
|
|
apiClient.getSimilarItems(item.Id, options).then(function (result) {
|
|
|
|
if (!result.Items.length) {
|
|
|
|
return void similarCollapsible.classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
similarCollapsible.classList.remove("hide");
|
|
|
|
var html = "";
|
|
|
|
html += cardBuilder.getCardsHtml({
|
|
|
|
items: result.Items,
|
|
|
|
shape: "autooverflow",
|
|
|
|
showParentTitle: "MusicAlbum" == item.Type,
|
2019-11-06 03:43:39 -07:00
|
|
|
centerText: true,
|
|
|
|
showTitle: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
context: context,
|
2019-11-06 03:43:39 -07:00
|
|
|
lazy: true,
|
|
|
|
showDetailsMenu: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
coverImage: "MusicAlbum" == item.Type || "MusicArtist" == item.Type,
|
2019-11-06 03:43:39 -07:00
|
|
|
overlayPlayButton: true,
|
|
|
|
overlayText: false,
|
2020-01-02 04:29:41 -07:00
|
|
|
showYear: "Movie" === item.Type || "Trailer" === item.Type || "Series" === item.Type
|
2018-10-22 15:05:09 -07:00
|
|
|
});
|
|
|
|
var similarContent = similarCollapsible.querySelector(".similarContent");
|
2019-11-06 03:43:39 -07:00
|
|
|
similarContent.innerHTML = html;
|
|
|
|
imageLoader.lazyChildren(similarContent);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderSeriesAirTime(page, item, isStatic) {
|
|
|
|
var seriesAirTime = page.querySelector("#seriesAirTime");
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("Series" != item.Type) {
|
|
|
|
seriesAirTime.classList.add("hide");
|
|
|
|
return;
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
var html = "";
|
2019-11-06 03:43:39 -07:00
|
|
|
if (item.AirDays && item.AirDays.length) {
|
|
|
|
if (7 == item.AirDays.length) {
|
|
|
|
html += "daily";
|
|
|
|
} else {
|
|
|
|
html += item.AirDays.map(function (a) {
|
|
|
|
return a + "s";
|
|
|
|
}).join(",");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (item.AirTime) {
|
|
|
|
html += " at " + item.AirTime;
|
|
|
|
}
|
|
|
|
if (item.Studios.length) {
|
|
|
|
if (isStatic) {
|
|
|
|
html += " on " + item.Studios[0].Name;
|
|
|
|
} else {
|
|
|
|
var context = inferContext(item);
|
|
|
|
var href = appRouter.getRouteUrl(item.Studios[0], {
|
|
|
|
context: context,
|
|
|
|
itemType: "Studio",
|
|
|
|
serverId: item.ServerId
|
|
|
|
});
|
|
|
|
html += ' on <a class="textlink button-link" is="emby-linkbutton" href="' + href + '">' + item.Studios[0].Name + "</a>";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (html) {
|
|
|
|
html = ("Ended" == item.Status ? "Aired " : "Airs ") + html;
|
|
|
|
seriesAirTime.innerHTML = html;
|
|
|
|
seriesAirTime.classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
seriesAirTime.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderTags(page, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var itemTags = page.querySelector(".itemTags");
|
|
|
|
var tagElements = [];
|
|
|
|
var tags = item.Tags || [];
|
|
|
|
|
|
|
|
if ("Program" === item.Type) {
|
|
|
|
tags = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var i = 0, length = tags.length; i < length; i++) {
|
|
|
|
tagElements.push(tags[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tagElements.length) {
|
|
|
|
itemTags.innerHTML = globalize.translate("TagsValue", tagElements.join(", "));
|
|
|
|
itemTags.classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
itemTags.innerHTML = "";
|
|
|
|
itemTags.classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderChildren(page, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var fields = "ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount";
|
|
|
|
var query = {
|
|
|
|
ParentId: item.Id,
|
2018-10-22 15:05:09 -07:00
|
|
|
Fields: fields
|
2019-11-06 03:43:39 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
if ("BoxSet" !== item.Type) {
|
|
|
|
query.SortBy = "SortName";
|
|
|
|
}
|
|
|
|
|
|
|
|
var promise;
|
|
|
|
var apiClient = connectionManager.getApiClient(item.ServerId);
|
|
|
|
var userId = apiClient.getCurrentUserId();
|
|
|
|
|
|
|
|
if ("Series" == item.Type) {
|
|
|
|
promise = apiClient.getSeasons(item.Id, {
|
|
|
|
userId: userId,
|
|
|
|
Fields: fields
|
|
|
|
});
|
|
|
|
} else if ("Season" == item.Type) {
|
|
|
|
fields += ",Overview";
|
|
|
|
promise = apiClient.getEpisodes(item.SeriesId, {
|
|
|
|
seasonId: item.Id,
|
|
|
|
userId: userId,
|
|
|
|
Fields: fields
|
2018-10-22 15:05:09 -07:00
|
|
|
});
|
2019-11-06 03:43:39 -07:00
|
|
|
} else if ("MusicArtist" == item.Type) {
|
|
|
|
query.SortBy = "ProductionYear,SortName";
|
|
|
|
}
|
|
|
|
|
|
|
|
promise = promise || apiClient.getItems(apiClient.getCurrentUserId(), query);
|
|
|
|
promise.then(function (result) {
|
|
|
|
var html = "";
|
|
|
|
var scrollX = false;
|
|
|
|
var isList = false;
|
|
|
|
var childrenItemsContainer = page.querySelector(".childrenItemsContainer");
|
|
|
|
|
|
|
|
if ("MusicAlbum" == item.Type) {
|
|
|
|
html = listView.getListViewHtml({
|
2018-10-22 15:05:09 -07:00
|
|
|
items: result.Items,
|
2019-11-06 03:43:39 -07:00
|
|
|
smallIcon: true,
|
|
|
|
showIndex: true,
|
|
|
|
index: "disc",
|
|
|
|
showIndexNumberLeft: true,
|
|
|
|
playFromHere: true,
|
|
|
|
action: "playallfromhere",
|
|
|
|
image: false,
|
|
|
|
artist: "auto",
|
|
|
|
containerAlbumArtists: item.AlbumArtists,
|
|
|
|
addToListButton: true
|
|
|
|
});
|
|
|
|
isList = true;
|
|
|
|
} else if ("Series" == item.Type) {
|
|
|
|
scrollX = enableScrollX();
|
|
|
|
html = cardBuilder.getCardsHtml({
|
2018-10-22 15:05:09 -07:00
|
|
|
items: result.Items,
|
2020-01-03 11:10:42 -07:00
|
|
|
shape: "overflowPortrait",
|
2019-11-06 03:43:39 -07:00
|
|
|
showTitle: true,
|
|
|
|
centerText: true,
|
|
|
|
lazy: true,
|
|
|
|
overlayPlayButton: true,
|
|
|
|
allowBottomPadding: !scrollX
|
|
|
|
});
|
|
|
|
} else if ("Season" == item.Type || "Episode" == item.Type) {
|
|
|
|
if ("Episode" !== item.Type) {
|
|
|
|
isList = true;
|
|
|
|
}
|
|
|
|
scrollX = "Episode" == item.Type;
|
|
|
|
if (result.Items.length < 2 && "Episode" === item.Type) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("Episode" === item.Type) {
|
|
|
|
html = cardBuilder.getCardsHtml({
|
|
|
|
items: result.Items,
|
2020-01-03 11:10:42 -07:00
|
|
|
shape: "overflowBackdrop",
|
2019-11-06 03:43:39 -07:00
|
|
|
showTitle: true,
|
|
|
|
displayAsSpecial: "Season" == item.Type && item.IndexNumber,
|
|
|
|
playFromHere: true,
|
|
|
|
overlayText: true,
|
|
|
|
lazy: true,
|
|
|
|
showDetailsMenu: true,
|
|
|
|
overlayPlayButton: true,
|
|
|
|
allowBottomPadding: !scrollX,
|
|
|
|
includeParentInfoInTitle: false
|
|
|
|
});
|
|
|
|
} else if ("Season" === item.Type) {
|
|
|
|
html = listView.getListViewHtml({
|
|
|
|
items: result.Items,
|
|
|
|
showIndexNumber: false,
|
|
|
|
enableOverview: true,
|
|
|
|
imageSize: "large",
|
|
|
|
enableSideMediaInfo: false,
|
|
|
|
highlight: false,
|
|
|
|
action: layoutManager.tv ? "resume" : "none",
|
|
|
|
infoButton: true,
|
|
|
|
imagePlayButton: true,
|
|
|
|
includeParentInfoInTitle: false
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("BoxSet" !== item.Type) {
|
|
|
|
page.querySelector("#childrenCollapsible").classList.remove("hide");
|
2019-01-27 14:10:07 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
if (scrollX) {
|
|
|
|
childrenItemsContainer.classList.add("scrollX");
|
|
|
|
childrenItemsContainer.classList.add("hiddenScrollX");
|
|
|
|
childrenItemsContainer.classList.remove("vertical-wrap");
|
|
|
|
childrenItemsContainer.classList.remove("vertical-list");
|
|
|
|
} else {
|
|
|
|
childrenItemsContainer.classList.remove("scrollX");
|
|
|
|
childrenItemsContainer.classList.remove("hiddenScrollX");
|
|
|
|
childrenItemsContainer.classList.remove("smoothScrollX");
|
|
|
|
if (isList) {
|
|
|
|
childrenItemsContainer.classList.add("vertical-list");
|
|
|
|
childrenItemsContainer.classList.remove("vertical-wrap");
|
|
|
|
} else {
|
|
|
|
childrenItemsContainer.classList.add("vertical-wrap");
|
|
|
|
childrenItemsContainer.classList.remove("vertical-list");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
childrenItemsContainer.innerHTML = html;
|
|
|
|
imageLoader.lazyChildren(childrenItemsContainer);
|
|
|
|
if ("BoxSet" == item.Type) {
|
2018-10-22 15:05:09 -07:00
|
|
|
var collectionItemTypes = [{
|
|
|
|
name: globalize.translate("HeaderVideos"),
|
|
|
|
mediaType: "Video"
|
|
|
|
}, {
|
|
|
|
name: globalize.translate("HeaderSeries"),
|
|
|
|
type: "Series"
|
|
|
|
}, {
|
|
|
|
name: globalize.translate("HeaderAlbums"),
|
|
|
|
type: "MusicAlbum"
|
|
|
|
}, {
|
|
|
|
name: globalize.translate("HeaderBooks"),
|
|
|
|
type: "Book"
|
|
|
|
}];
|
2019-11-06 03:43:39 -07:00
|
|
|
renderCollectionItems(page, item, collectionItemTypes, result.Items);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
if ("Season" == item.Type) {
|
|
|
|
page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderEpisodes");
|
|
|
|
} else if ("Series" == item.Type) {
|
|
|
|
page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderSeasons");
|
|
|
|
} else if ("MusicAlbum" == item.Type) {
|
|
|
|
page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderTracks");
|
|
|
|
} else {
|
|
|
|
page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderItems");
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("MusicAlbum" == item.Type || "Season" == item.Type) {
|
|
|
|
page.querySelector(".childrenSectionHeader").classList.add("hide");
|
|
|
|
page.querySelector("#childrenCollapsible").classList.add("verticalSection-extrabottompadding");
|
|
|
|
} else {
|
|
|
|
page.querySelector(".childrenSectionHeader").classList.remove("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderItemsByName(page, item, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
require("scripts/itembynamedetailpage".split(","), function () {
|
|
|
|
window.ItemsByName.renderItems(page, item);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderPlaylistItems(page, item, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
require("scripts/playlistedit".split(","), function () {
|
|
|
|
PlaylistViewer.render(page, item);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderProgramsForChannel(page, result) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var html = "";
|
|
|
|
var currentItems = [];
|
|
|
|
var currentStartDate = null;
|
|
|
|
|
|
|
|
for (var i = 0, length = result.Items.length; i < length; i++) {
|
|
|
|
var item = result.Items[i];
|
|
|
|
var itemStartDate = datetime.parseISO8601Date(item.StartDate);
|
|
|
|
|
|
|
|
if (!(currentStartDate && currentStartDate.toDateString() === itemStartDate.toDateString())) {
|
|
|
|
if (currentItems.length) {
|
|
|
|
html += '<div class="verticalSection verticalDetailSection">';
|
2019-12-09 16:32:22 -07:00
|
|
|
html += '<h2 class="sectionTitle padded-left">' + datetime.toLocaleDateString(currentStartDate, {
|
2019-11-06 03:43:39 -07:00
|
|
|
weekday: "long",
|
|
|
|
month: "long",
|
|
|
|
day: "numeric"
|
|
|
|
}) + "</h2>";
|
2019-12-09 16:32:22 -07:00
|
|
|
html += '<div is="emby-itemscontainer" class="vertical-list padded-left padded-right">' + listView.getListViewHtml({
|
2019-11-06 03:43:39 -07:00
|
|
|
items: currentItems,
|
|
|
|
enableUserDataButtons: false,
|
|
|
|
showParentTitle: true,
|
|
|
|
image: false,
|
|
|
|
showProgramTime: true,
|
|
|
|
mediaInfo: false,
|
|
|
|
parentTitleWithTitle: true
|
|
|
|
}) + "</div></div>";
|
|
|
|
}
|
|
|
|
|
|
|
|
currentStartDate = itemStartDate;
|
|
|
|
currentItems = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
currentItems.push(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (currentItems.length) {
|
|
|
|
html += '<div class="verticalSection verticalDetailSection">';
|
2019-12-09 16:32:22 -07:00
|
|
|
html += '<h2 class="sectionTitle padded-left">' + datetime.toLocaleDateString(currentStartDate, {
|
2018-10-22 15:05:09 -07:00
|
|
|
weekday: "long",
|
|
|
|
month: "long",
|
|
|
|
day: "numeric"
|
2019-11-06 03:43:39 -07:00
|
|
|
}) + "</h2>";
|
2019-12-09 16:32:22 -07:00
|
|
|
html += '<div is="emby-itemscontainer" class="vertical-list padded-left padded-right">' + listView.getListViewHtml({
|
2018-10-22 15:05:09 -07:00
|
|
|
items: currentItems,
|
2019-11-06 03:43:39 -07:00
|
|
|
enableUserDataButtons: false,
|
|
|
|
showParentTitle: true,
|
|
|
|
image: false,
|
|
|
|
showProgramTime: true,
|
|
|
|
mediaInfo: false,
|
|
|
|
parentTitleWithTitle: true
|
|
|
|
}) + "</div></div>";
|
|
|
|
}
|
|
|
|
|
|
|
|
page.querySelector(".programGuide").innerHTML = html;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderChannelGuide(page, apiClient, item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("TvChannel" === item.Type) {
|
|
|
|
page.querySelector(".programGuideSection").classList.remove("hide");
|
|
|
|
apiClient.getLiveTvPrograms({
|
|
|
|
ChannelIds: item.Id,
|
|
|
|
UserId: apiClient.getCurrentUserId(),
|
|
|
|
HasAired: false,
|
|
|
|
SortBy: "StartDate",
|
|
|
|
EnableTotalRecordCount: false,
|
|
|
|
EnableImages: false,
|
|
|
|
ImageTypeLimit: 0,
|
|
|
|
EnableUserData: false
|
|
|
|
}).then(function (result) {
|
|
|
|
renderProgramsForChannel(page, result);
|
|
|
|
});
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderSeriesSchedule(page, item, user) {
|
|
|
|
var apiClient = connectionManager.getApiClient(item.ServerId);
|
|
|
|
apiClient.getLiveTvPrograms({
|
|
|
|
UserId: apiClient.getCurrentUserId(),
|
2019-11-06 03:43:39 -07:00
|
|
|
HasAired: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
SortBy: "StartDate",
|
2019-11-06 03:43:39 -07:00
|
|
|
EnableTotalRecordCount: false,
|
|
|
|
EnableImages: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
ImageTypeLimit: 0,
|
|
|
|
Limit: 50,
|
2019-11-06 03:43:39 -07:00
|
|
|
EnableUserData: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
LibrarySeriesId: item.Id
|
2019-11-06 03:43:39 -07:00
|
|
|
}).then(function (result) {
|
|
|
|
if (result.Items.length) {
|
|
|
|
page.querySelector("#seriesScheduleSection").classList.remove("hide");
|
|
|
|
} else {
|
|
|
|
page.querySelector("#seriesScheduleSection").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
|
|
|
page.querySelector("#seriesScheduleList").innerHTML = listView.getListViewHtml({
|
2018-10-22 15:05:09 -07:00
|
|
|
items: result.Items,
|
2019-11-06 03:43:39 -07:00
|
|
|
enableUserDataButtons: false,
|
|
|
|
showParentTitle: false,
|
|
|
|
image: false,
|
|
|
|
showProgramDateTime: true,
|
|
|
|
mediaInfo: false,
|
|
|
|
showTitle: true,
|
|
|
|
moreButton: false,
|
2018-10-22 15:05:09 -07:00
|
|
|
action: "programdialog"
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
loading.hide();
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function inferContext(item) {
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("Movie" === item.Type || "BoxSet" === item.Type) {
|
|
|
|
return "movies";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("Series" === item.Type || "Season" === item.Type || "Episode" === item.Type) {
|
|
|
|
return "tvshows";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("MusicArtist" === item.Type || "MusicAlbum" === item.Type || "Audio" === item.Type || "AudioBook" === item.Type) {
|
|
|
|
return "music";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ("Program" === item.Type) {
|
|
|
|
return "livetv";
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function filterItemsByCollectionItemType(items, typeInfo) {
|
2019-11-06 03:43:39 -07:00
|
|
|
return items.filter(function (item) {
|
|
|
|
if (typeInfo.mediaType) {
|
|
|
|
return item.MediaType == typeInfo.mediaType;
|
|
|
|
}
|
|
|
|
|
|
|
|
return item.Type == typeInfo.type;
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
2019-08-22 05:08:55 -07:00
|
|
|
function canPlaySomeItemInCollection(items) {
|
|
|
|
var i = 0;
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-08-22 05:08:55 -07:00
|
|
|
for (length = items.length; i < length; i++) {
|
|
|
|
if (playbackManager.canPlay(items[i])) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2019-08-22 05:08:55 -07:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
function renderCollectionItems(page, parentItem, types, items) {
|
|
|
|
page.querySelector(".collectionItems").innerHTML = "";
|
2019-11-06 03:43:39 -07:00
|
|
|
var i;
|
|
|
|
var length;
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
for (i = 0, length = types.length; i < length; i++) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var type = types[i];
|
|
|
|
var typeItems = filterItemsByCollectionItemType(items, type);
|
|
|
|
|
|
|
|
if (typeItems.length) {
|
|
|
|
renderCollectionItemType(page, parentItem, type, typeItems);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
var otherType = {
|
2019-11-06 03:43:39 -07:00
|
|
|
name: globalize.translate("HeaderOtherItems")
|
|
|
|
};
|
|
|
|
var otherTypeItems = items.filter(function (curr) {
|
|
|
|
return !types.filter(function (t) {
|
|
|
|
return filterItemsByCollectionItemType([curr], t).length > 0;
|
|
|
|
}).length;
|
|
|
|
});
|
|
|
|
|
|
|
|
if (otherTypeItems.length) {
|
|
|
|
renderCollectionItemType(page, parentItem, otherType, otherTypeItems);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!items.length) {
|
|
|
|
renderCollectionItemType(page, parentItem, {
|
|
|
|
name: globalize.translate("HeaderItems")
|
|
|
|
}, items);
|
|
|
|
}
|
|
|
|
|
|
|
|
var containers = page.querySelectorAll(".collectionItemsContainer");
|
|
|
|
|
|
|
|
var notifyRefreshNeeded = function () {
|
|
|
|
renderChildren(page, parentItem);
|
|
|
|
};
|
|
|
|
|
|
|
|
for (i = 0, length = containers.length; i < length; i++) {
|
|
|
|
containers[i].notifyRefreshNeeded = notifyRefreshNeeded;
|
|
|
|
}
|
2019-08-22 05:08:55 -07:00
|
|
|
|
|
|
|
// if nothing in the collection can be played hide play and shuffle buttons
|
|
|
|
if (!canPlaySomeItemInCollection(items)) {
|
|
|
|
hideAll(page, "btnPlay", false);
|
|
|
|
hideAll(page, "btnShuffle", false);
|
2019-11-06 03:43:39 -07:00
|
|
|
}
|
2019-11-14 10:30:59 -07:00
|
|
|
|
|
|
|
// HACK: Call autoFocuser again because btnPlay may be hidden, but focused by reloadFromItem
|
|
|
|
// FIXME: Sometimes focus does not move until all (?) sections are loaded
|
|
|
|
require(["autoFocuser"], function (autoFocuser) {
|
|
|
|
autoFocuser.autoFocus(page);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderCollectionItemType(page, parentItem, type, items) {
|
|
|
|
var html = "";
|
2019-11-06 03:43:39 -07:00
|
|
|
html += '<div class="verticalSection">';
|
2019-12-09 16:32:22 -07:00
|
|
|
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
|
2019-11-06 03:43:39 -07:00
|
|
|
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
|
|
|
html += "<span>" + type.name + "</span>";
|
|
|
|
html += "</h2>";
|
2019-11-19 14:24:54 -07:00
|
|
|
html += '<button class="btnAddToCollection sectionTitleButton" type="button" is="paper-icon-button-light" style="margin-left:1em;"><i class="md-icon" icon="add">add</i></button>';
|
2019-11-06 03:43:39 -07:00
|
|
|
html += "</div>";
|
2019-12-09 16:32:22 -07:00
|
|
|
html += '<div is="emby-itemscontainer" class="itemsContainer collectionItemsContainer vertical-wrap padded-left padded-right">';
|
2019-11-06 03:43:39 -07:00
|
|
|
var shape = "MusicAlbum" == type.type ? getSquareShape(false) : getPortraitShape(false);
|
2018-10-22 15:05:09 -07:00
|
|
|
html += cardBuilder.getCardsHtml({
|
|
|
|
items: items,
|
|
|
|
shape: shape,
|
2019-11-06 03:43:39 -07:00
|
|
|
showTitle: true,
|
2020-01-02 04:29:41 -07:00
|
|
|
showYear: "Video" === type.mediaType || "Series" === type.type,
|
2019-11-06 03:43:39 -07:00
|
|
|
centerText: true,
|
|
|
|
lazy: true,
|
|
|
|
showDetailsMenu: true,
|
|
|
|
overlayMoreButton: true,
|
|
|
|
showAddToCollection: false,
|
|
|
|
showRemoveFromCollection: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
collectionId: parentItem.Id
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
html += "</div>";
|
|
|
|
html += "</div>";
|
2018-10-22 15:05:09 -07:00
|
|
|
var collectionItems = page.querySelector(".collectionItems");
|
2019-11-06 03:43:39 -07:00
|
|
|
collectionItems.insertAdjacentHTML("beforeend", html);
|
|
|
|
imageLoader.lazyChildren(collectionItems);
|
|
|
|
collectionItems.querySelector(".btnAddToCollection").addEventListener("click", function () {
|
|
|
|
require(["alert"], function (alert) {
|
2018-10-22 15:05:09 -07:00
|
|
|
alert({
|
|
|
|
text: globalize.translate("AddItemToCollectionHelp"),
|
2018-12-29 14:29:09 -07:00
|
|
|
html: globalize.translate("AddItemToCollectionHelp") + '<br/><br/><a is="emby-linkbutton" class="button-link" target="_blank" href="https://web.archive.org/web/20181216120305/https://github.com/MediaBrowser/Wiki/wiki/Collections">' + globalize.translate("ButtonLearnMore") + "</a>"
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderMusicVideos(page, item, user) {
|
|
|
|
connectionManager.getApiClient(item.ServerId).getItems(user.Id, {
|
|
|
|
SortBy: "SortName",
|
|
|
|
SortOrder: "Ascending",
|
|
|
|
IncludeItemTypes: "MusicVideo",
|
2019-11-06 03:43:39 -07:00
|
|
|
Recursive: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
Fields: "PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount",
|
|
|
|
AlbumIds: item.Id
|
2019-11-06 03:43:39 -07:00
|
|
|
}).then(function (result) {
|
2018-10-22 15:05:09 -07:00
|
|
|
if (result.Items.length) {
|
|
|
|
page.querySelector("#musicVideosCollapsible").classList.remove("hide");
|
|
|
|
var musicVideosContent = page.querySelector(".musicVideosContent");
|
2019-11-06 03:43:39 -07:00
|
|
|
musicVideosContent.innerHTML = getVideosHtml(result.Items, user);
|
|
|
|
imageLoader.lazyChildren(musicVideosContent);
|
|
|
|
} else {
|
|
|
|
page.querySelector("#musicVideosCollapsible").classList.add("hide");
|
|
|
|
}
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderAdditionalParts(page, item, user) {
|
2019-11-06 03:43:39 -07:00
|
|
|
connectionManager.getApiClient(item.ServerId).getAdditionalVideoParts(user.Id, item.Id).then(function (result) {
|
2018-10-22 15:05:09 -07:00
|
|
|
if (result.Items.length) {
|
|
|
|
page.querySelector("#additionalPartsCollapsible").classList.remove("hide");
|
|
|
|
var additionalPartsContent = page.querySelector("#additionalPartsContent");
|
2019-11-06 03:43:39 -07:00
|
|
|
additionalPartsContent.innerHTML = getVideosHtml(result.Items, user);
|
|
|
|
imageLoader.lazyChildren(additionalPartsContent);
|
|
|
|
} else {
|
|
|
|
page.querySelector("#additionalPartsCollapsible").classList.add("hide");
|
|
|
|
}
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderScenes(page, item) {
|
|
|
|
var chapters = item.Chapters || [];
|
2019-11-06 03:43:39 -07:00
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
if (chapters.length && !chapters[0].ImageTag && (chapters = []), chapters.length) {
|
|
|
|
page.querySelector("#scenesCollapsible").classList.remove("hide");
|
|
|
|
var scenesContent = page.querySelector("#scenesContent");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
require(["chaptercardbuilder"], function (chaptercardbuilder) {
|
2018-10-22 15:05:09 -07:00
|
|
|
chaptercardbuilder.buildChapterCards(item, chapters, {
|
|
|
|
itemsContainer: scenesContent,
|
|
|
|
width: 400,
|
|
|
|
backdropShape: "overflowBackdrop",
|
|
|
|
squareShape: "overflowSquare"
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
page.querySelector("#scenesCollapsible").classList.add("hide");
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function getVideosHtml(items, user, limit, moreButtonClass) {
|
|
|
|
var html = cardBuilder.getCardsHtml({
|
|
|
|
items: items,
|
|
|
|
shape: "auto",
|
2019-11-06 03:43:39 -07:00
|
|
|
showTitle: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
action: "play",
|
2019-11-06 03:43:39 -07:00
|
|
|
overlayText: false,
|
|
|
|
centerText: true,
|
|
|
|
showRuntime: true
|
2018-10-22 15:05:09 -07:00
|
|
|
});
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (limit && items.length > limit) {
|
|
|
|
html += '<p style="margin: 0;padding-left:5px;"><button is="emby-button" type="button" class="raised more ' + moreButtonClass + '">' + globalize.translate("ButtonMore") + "</button></p>";
|
|
|
|
}
|
|
|
|
|
|
|
|
return html;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderSpecials(page, item, user, limit) {
|
2019-11-06 03:43:39 -07:00
|
|
|
connectionManager.getApiClient(item.ServerId).getSpecialFeatures(user.Id, item.Id).then(function (specials) {
|
2018-10-22 15:05:09 -07:00
|
|
|
var specialsContent = page.querySelector("#specialsContent");
|
2019-11-06 03:43:39 -07:00
|
|
|
specialsContent.innerHTML = getVideosHtml(specials, user, limit, "moreSpecials");
|
|
|
|
imageLoader.lazyChildren(specialsContent);
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function renderCast(page, item, context, limit, isStatic) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var people = (item.People || []).filter(function (p) {
|
|
|
|
return "Director" !== p.Type;
|
2018-10-22 15:05:09 -07:00
|
|
|
});
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
if (!people.length) {
|
|
|
|
return void page.querySelector("#castCollapsible").classList.add("hide");
|
|
|
|
}
|
|
|
|
|
2018-10-22 15:05:09 -07:00
|
|
|
page.querySelector("#castCollapsible").classList.remove("hide");
|
|
|
|
var castContent = page.querySelector("#castContent");
|
2019-11-06 03:43:39 -07:00
|
|
|
|
|
|
|
require(["peoplecardbuilder"], function (peoplecardbuilder) {
|
2018-10-22 15:05:09 -07:00
|
|
|
peoplecardbuilder.buildPeopleCards(people, {
|
|
|
|
itemsContainer: castContent,
|
2019-11-06 03:43:39 -07:00
|
|
|
coverImage: true,
|
2018-10-22 15:05:09 -07:00
|
|
|
serverId: item.ServerId,
|
|
|
|
width: 160,
|
2020-01-03 11:10:42 -07:00
|
|
|
shape: "overflowPortrait"
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function itemDetailPage() {
|
|
|
|
var self = this;
|
2019-11-06 03:43:39 -07:00
|
|
|
self.setInitialCollapsibleState = setInitialCollapsibleState;
|
|
|
|
self.renderDetails = renderDetails;
|
|
|
|
self.renderCast = renderCast;
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function bindAll(view, selector, eventName, fn) {
|
2019-11-06 03:43:39 -07:00
|
|
|
var i;
|
|
|
|
var length;
|
|
|
|
var elems = view.querySelectorAll(selector);
|
|
|
|
|
|
|
|
for (i = 0, length = elems.length; i < length; i++) {
|
|
|
|
elems[i].addEventListener(eventName, fn);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function onTrackSelectionsSubmit(e) {
|
2019-11-06 03:43:39 -07:00
|
|
|
e.preventDefault();
|
|
|
|
return false;
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
window.ItemDetailPage = new itemDetailPage();
|
|
|
|
return function (view, params) {
|
|
|
|
function reload(instance, page, params) {
|
|
|
|
loading.show();
|
|
|
|
var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
|
|
|
|
var promises = [getPromise(apiClient, params), apiClient.getCurrentUser()];
|
|
|
|
Promise.all(promises).then(function (responses) {
|
|
|
|
var item = responses[0];
|
|
|
|
var user = responses[1];
|
|
|
|
currentItem = item;
|
|
|
|
reloadFromItem(instance, page, params, item, user);
|
|
|
|
});
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function splitVersions(instance, page, apiClient, params) {
|
|
|
|
require(["confirm"], function (confirm) {
|
|
|
|
confirm("Are you sure you wish to split the media sources into separate items?", "Split Media Apart").then(function () {
|
|
|
|
loading.show();
|
|
|
|
apiClient.ajax({
|
|
|
|
type: "DELETE",
|
|
|
|
url: apiClient.getUrl("Videos/" + params.id + "/AlternateSources")
|
|
|
|
}).then(function () {
|
|
|
|
loading.hide();
|
|
|
|
reload(instance, page, params);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function getPlayOptions(startPosition) {
|
|
|
|
var audioStreamIndex = view.querySelector(".selectAudio").value || null;
|
|
|
|
return {
|
|
|
|
startPositionTicks: startPosition,
|
|
|
|
mediaSourceId: view.querySelector(".selectSource").value,
|
|
|
|
audioStreamIndex: audioStreamIndex,
|
|
|
|
subtitleStreamIndex: view.querySelector(".selectSubtitles").value
|
|
|
|
};
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function playItem(item, startPosition) {
|
|
|
|
var playOptions = getPlayOptions(startPosition);
|
|
|
|
playOptions.items = [item];
|
|
|
|
playbackManager.play(playOptions);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function playTrailer(page) {
|
|
|
|
playbackManager.playTrailers(currentItem);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function playCurrentItem(button, mode) {
|
|
|
|
var item = currentItem;
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("Program" === item.Type) {
|
|
|
|
var apiClient = connectionManager.getApiClient(item.ServerId);
|
|
|
|
return void apiClient.getLiveTvChannel(item.ChannelId, apiClient.getCurrentUserId()).then(function (channel) {
|
|
|
|
playbackManager.play({
|
|
|
|
items: [channel]
|
|
|
|
});
|
|
|
|
});
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
playItem(item, item.UserData && "resume" === mode ? item.UserData.PlaybackPositionTicks : 0);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function onPlayClick() {
|
|
|
|
playCurrentItem(this, this.getAttribute("data-mode"));
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function onInstantMixClick() {
|
|
|
|
playbackManager.instantMix(currentItem);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function onShuffleClick() {
|
|
|
|
playbackManager.shuffle(currentItem);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function onDeleteClick() {
|
|
|
|
require(["deleteHelper"], function (deleteHelper) {
|
|
|
|
deleteHelper.deleteItem({
|
|
|
|
item: currentItem,
|
|
|
|
navigate: true
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function onCancelSeriesTimerClick() {
|
|
|
|
require(["recordingHelper"], function (recordingHelper) {
|
|
|
|
recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () {
|
|
|
|
Dashboard.navigate("livetv.html");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function onCancelTimerClick() {
|
|
|
|
require(["recordingHelper"], function (recordingHelper) {
|
|
|
|
recordingHelper.cancelTimer(connectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () {
|
|
|
|
reload(self, view, params);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function onPlayTrailerClick() {
|
|
|
|
playTrailer(view);
|
|
|
|
}
|
|
|
|
|
|
|
|
function onDownloadChange() {
|
|
|
|
reload(self, view, params);
|
|
|
|
}
|
|
|
|
|
|
|
|
function onDownloadClick() {
|
|
|
|
require(['fileDownloader'], function (fileDownloader) {
|
|
|
|
var downloadHref = apiClient.getItemDownloadUrl(currentItem.Id);
|
|
|
|
fileDownloader.download([{
|
|
|
|
url: downloadHref,
|
|
|
|
itemId: currentItem.Id,
|
|
|
|
serverId: currentItem.serverId
|
|
|
|
}]);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function onMoreCommandsClick() {
|
|
|
|
var button = this;
|
|
|
|
apiClient.getCurrentUser().then(function (user) {
|
|
|
|
itemContextMenu.show(getContextMenuOptions(currentItem, user, button)).then(function (result) {
|
|
|
|
if (result.deleted) {
|
|
|
|
appRouter.goHome();
|
|
|
|
} else if (result.updated) {
|
|
|
|
reload(self, view, params);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function onPlayerChange() {
|
|
|
|
renderTrackSelections(view, self, currentItem);
|
|
|
|
setTrailerButtonVisibility(view, currentItem);
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function editImages() {
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
require(["imageEditor"], function (imageEditor) {
|
|
|
|
imageEditor.show({
|
2019-07-28 06:51:02 -07:00
|
|
|
itemId: currentItem.Id,
|
2019-11-06 03:43:39 -07:00
|
|
|
serverId: currentItem.ServerId
|
|
|
|
}).then(resolve, reject);
|
2019-07-28 06:51:02 -07:00
|
|
|
});
|
2019-11-06 03:43:39 -07:00
|
|
|
});
|
|
|
|
}
|
2019-07-28 06:51:02 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
function onWebSocketMessage(e, data) {
|
|
|
|
var msg = data;
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
if ("UserDataChanged" === msg.MessageType && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) {
|
|
|
|
var key = currentItem.UserData.Key;
|
|
|
|
var userData = msg.Data.UserDataList.filter(function (u) {
|
|
|
|
return u.Key == key;
|
|
|
|
})[0];
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
if (userData) {
|
|
|
|
currentItem.UserData = userData;
|
|
|
|
reloadPlayButtons(view, currentItem);
|
|
|
|
apiClient.getCurrentUser().then(function (user) {
|
|
|
|
refreshImage(view, currentItem, user);
|
|
|
|
});
|
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
}
|
2018-10-22 15:05:09 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
var currentItem;
|
|
|
|
var self = this;
|
|
|
|
var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
|
|
|
|
view.querySelectorAll(".btnPlay");
|
|
|
|
bindAll(view, ".btnPlay", "click", onPlayClick);
|
|
|
|
bindAll(view, ".btnResume", "click", onPlayClick);
|
|
|
|
bindAll(view, ".btnInstantMix", "click", onInstantMixClick);
|
|
|
|
bindAll(view, ".btnShuffle", "click", onShuffleClick);
|
|
|
|
bindAll(view, ".btnPlayTrailer", "click", onPlayTrailerClick);
|
|
|
|
bindAll(view, ".btnCancelSeriesTimer", "click", onCancelSeriesTimerClick);
|
|
|
|
bindAll(view, ".btnCancelTimer", "click", onCancelTimerClick);
|
|
|
|
bindAll(view, ".btnDeleteItem", "click", onDeleteClick);
|
|
|
|
bindAll(view, ".btnDownload", "click", onDownloadClick);
|
2019-11-19 14:24:54 -07:00
|
|
|
view.querySelector(".btnMoreCommands i").innerHTML = "more_horiz";
|
2019-11-06 03:43:39 -07:00
|
|
|
view.querySelector(".trackSelections").addEventListener("submit", onTrackSelectionsSubmit);
|
|
|
|
view.querySelector(".btnSplitVersions").addEventListener("click", function () {
|
|
|
|
splitVersions(self, view, apiClient, params);
|
|
|
|
});
|
|
|
|
bindAll(view, ".btnMoreCommands", "click", onMoreCommandsClick);
|
|
|
|
view.querySelector(".selectSource").addEventListener("change", function () {
|
|
|
|
renderVideoSelections(view, self._currentPlaybackMediaSources);
|
|
|
|
renderAudioSelections(view, self._currentPlaybackMediaSources);
|
|
|
|
renderSubtitleSelections(view, self._currentPlaybackMediaSources);
|
|
|
|
});
|
|
|
|
view.addEventListener("click", function (e) {
|
|
|
|
if (dom.parentWithClass(e.target, "moreScenes")) {
|
|
|
|
apiClient.getCurrentUser().then(function (user) {
|
|
|
|
renderScenes(view, currentItem);
|
|
|
|
});
|
|
|
|
} else if (dom.parentWithClass(e.target, "morePeople")) {
|
|
|
|
renderCast(view, currentItem, params.context);
|
|
|
|
} else if (dom.parentWithClass(e.target, "moreSpecials")) {
|
|
|
|
apiClient.getCurrentUser().then(function (user) {
|
|
|
|
renderSpecials(view, currentItem, user);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
view.querySelector(".detailImageContainer").addEventListener("click", function (e) {
|
|
|
|
if (dom.parentWithClass(e.target, "itemDetailGalleryLink")) {
|
|
|
|
editImages().then(function () {
|
|
|
|
reload(self, view, params);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
view.addEventListener("viewshow", function (e) {
|
|
|
|
var page = this;
|
|
|
|
libraryMenu.setTransparentMenu(true);
|
|
|
|
|
|
|
|
if (e.detail.isRestored) {
|
|
|
|
if (currentItem) {
|
|
|
|
setTitle(currentItem, connectionManager.getApiClient(currentItem.ServerId));
|
|
|
|
renderTrackSelections(page, self, currentItem, true);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-11-06 03:43:39 -07:00
|
|
|
} else {
|
|
|
|
reload(self, page, params);
|
2018-10-22 15:05:09 -07:00
|
|
|
}
|
2019-03-18 22:22:48 -07:00
|
|
|
|
2019-11-06 03:43:39 -07:00
|
|
|
events.on(apiClient, "message", onWebSocketMessage);
|
|
|
|
events.on(playbackManager, "playerchange", onPlayerChange);
|
|
|
|
});
|
|
|
|
view.addEventListener("viewbeforehide", function () {
|
|
|
|
events.off(apiClient, "message", onWebSocketMessage);
|
|
|
|
events.off(playbackManager, "playerchange", onPlayerChange);
|
|
|
|
libraryMenu.setTransparentMenu(false);
|
|
|
|
});
|
|
|
|
view.addEventListener("viewdestroy", function () {
|
|
|
|
currentItem = null;
|
|
|
|
self._currentPlaybackMediaSources = null;
|
|
|
|
self.currentRecordingFields = null;
|
|
|
|
});
|
|
|
|
};
|
2019-01-11 10:16:10 -07:00
|
|
|
});
|