1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Add remote control chapter menu

This commit is contained in:
Luke Pulverenti 2014-05-12 14:04:25 -04:00
parent a5ab0b50c6
commit 20836ec2f6
26 changed files with 400 additions and 374 deletions

View file

@ -545,11 +545,6 @@
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.itemType == "libraryreport") {
Dashboard.navigate('libraryreport.html');
return;
}
if (data.itemType == "livetvservice") {
return;
}

View file

@ -1139,11 +1139,6 @@
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.itemType == "libraryreport") {
Dashboard.navigate('libraryreport.html');
return;
}
if (data.itemType == "livetvservice") {
return;
}

View file

@ -255,11 +255,6 @@
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.itemType == "libraryreport") {
Dashboard.navigate('libraryreport.html');
return;
}
if (data.itemType == "livetvservice") {
return;
}

View file

@ -111,16 +111,7 @@
nodes.push({ attr: { id: name, rel: 'folder', itemtype: 'livetvservice' }, data: htmlName, state: 'closed' });
}
nodes.push({ attr: { id: 'libraryreport', rel: 'default', itemtype: 'libraryreport' }, data: 'Reports' });
callback(nodes);
if (!selectedId) {
if (window.location.toString().toLowerCase().indexOf('report.html') != -1) {
selectedId = 'libraryreport';
}
}
if (selectedId && nodes.filter(function (f) {
@ -163,11 +154,6 @@
var itemtype = node.attr("itemtype");
if (itemtype == 'libraryreport') {
return;
}
if (itemtype == 'livetvservice') {
loadLiveTvChannels(id, openItems, callback);

View file

@ -98,8 +98,9 @@
if (user.Configuration.IsAdministrator) {
html += '<div class="libraryMenuDivider"></div>';
html += '<a class="viewMenuLink viewMenuTextLink lnkMediaFolder dashboardViewMenu" data-itemid="editor" href="dashboard.html">Dashboard</a>';
html += '<a class="viewMenuLink viewMenuTextLink lnkMediaFolder dashboardViewMenu" data-itemid="dashboard" href="dashboard.html">Dashboard</a>';
html += '<a class="viewMenuLink viewMenuTextLink lnkMediaFolder editorViewMenu" data-itemid="editor" href="edititemmetadata.html">Metadata Manager</a>';
html += '<a class="viewMenuLink viewMenuTextLink lnkMediaFolder reportsViewMenu" data-itemid="reports" href="reports.html">Reports</a>';
}
return html;
@ -128,7 +129,7 @@
function getLibraryMenu(page, user, counts, items, liveTvInfo) {
var panel = $('#libraryPanel', page);
var panel = $('#libraryPanel');
if (!panel.length) {
@ -144,9 +145,9 @@
html += '</div>';
$(page).append(html);
$(document.body).append(html);
panel = $('#libraryPanel', page).panel({}).trigger('create');
panel = $('#libraryPanel').panel({}).trigger('create');
}
updateLibraryNavLinks(page);
@ -179,14 +180,16 @@
}
}
function updateLibraryNavLinks(page, updateElements) {
function updateLibraryNavLinks(page) {
page = $(page);
var isLiveTvPage = page.hasClass('liveTvPage');
var isChannelsPage = page.hasClass('channelsPage');
var isEditorPage = page.hasClass('metadataEditorPage');
var isReportsPage = page.hasClass('reportsPage');
var id = isLiveTvPage || isChannelsPage || page.hasClass('allLibraryPage') ?
var id = isLiveTvPage || isChannelsPage || isEditorPage || isReportsPage || page.hasClass('allLibraryPage') ?
'' :
getTopParentId() || '';
@ -202,6 +205,12 @@
else if (isLiveTvPage && itemId == 'livetv') {
$(this).addClass('selectedMediaFolder');
}
else if (isEditorPage && itemId == 'editor') {
$(this).addClass('selectedMediaFolder');
}
else if (isReportsPage && itemId == 'reports') {
$(this).addClass('selectedMediaFolder');
}
else if (id && itemId == id) {
$(this).addClass('selectedMediaFolder');
}

View file

@ -123,7 +123,7 @@
versionHtml += '<img src="css/images/checkmarkgreen.png" style="height: 17px; margin-left: 10px; margin-right: 0; position: relative; top: 5px; border-radius:3px;" /> Up to date!';
}
$('#activeServiceVersion', page).html(versionHtml);
$('#activeServiceVersion', page).html(versionHtml).trigger('create');
var status = liveTvInfo.Status;

View file

@ -31,7 +31,7 @@
var currentTimeElement;
self.initVideoPlayer = function () {
video = playVideo(item, mediaSource, startPosition, user);
video = playVideo(item, mediaSource, startPosition);
return video;
};
@ -640,75 +640,6 @@
return html;
}
function getInitialSubtitleStreamIndex(mediaStreams, user) {
var i, length, mediaStream;
// Find the first forced subtitle stream
for (i = 0, length = mediaStreams.length; i < length; i++) {
mediaStream = mediaStreams[i];
if (mediaStream.Type == "Subtitle" && mediaStream.IsForced) {
return mediaStream.Index;
}
}
// If none then look at user configuration
if (user.Configuration.SubtitleLanguagePreference) {
for (i = 0, length = mediaStreams.length; i < length; i++) {
mediaStream = mediaStreams[i];
if (mediaStream.Type == "Subtitle" && mediaStream.Language == user.Configuration.SubtitleLanguagePreference) {
if (user.Configuration.UseForcedSubtitlesOnly) {
if (mediaStream.IsForced) {
return mediaStream.Index;
}
} else {
return mediaStream.Index;
}
}
}
}
return null;
}
function getInitialAudioStreamIndex(mediaStreams, user) {
// Find all audio streams
var audioStreams = mediaStreams.filter(function (stream) {
return stream.Type == "Audio";
}).sort(function (a, b) {
var av = a.IsDefault ? 0 : 1;
var bv = b.IsDefault ? 0 : 1;
return av - bv;
});
if (user.Configuration.AudioLanguagePreference) {
for (var i = 0, length = audioStreams.length; i < length; i++) {
var mediaStream = audioStreams[i];
if (mediaStream.Language == user.Configuration.AudioLanguagePreference) {
return mediaStream.Index;
}
}
}
// Just use the first audio stream
return audioStreams.length ? audioStreams[0].Index : null;
}
function getVideoQualityOptions(mediaStreams) {
var videoStream = mediaStreams.filter(function (stream) {
@ -787,15 +718,15 @@
return options;
}
function playVideo(item, mediaSource, startPosition, user) {
function playVideo(item, mediaSource, startPosition) {
var mediaStreams = mediaSource.MediaStreams || [];
var baseParams = {
audioChannels: 2,
StartTimeTicks: startPosition,
SubtitleStreamIndex: getInitialSubtitleStreamIndex(mediaStreams, user),
AudioStreamIndex: getInitialAudioStreamIndex(mediaStreams, user),
SubtitleStreamIndex: mediaSource.DefaultSubtitleStreamIndex,
AudioStreamIndex: mediaSource.DefaultAudioStreamIndex,
deviceId: ApiClient.deviceId(),
Static: false,
mediaSourceId: mediaSource.Id

View file

@ -6,32 +6,18 @@
var html = '';
html += '<div data-role="controlgroup" data-type="horizontal" data-mini="true">';
for (var i = 0, length = tabs.length; i < length; i++) {
var tab = tabs[i];
var isChecked = i == 0 ? ' checked="checked"' : '';
var isChecked = i == 0 ? ' selected="selected"' : '';
html += '<input type="radio" name="radioTypeTab" class="radioTypeTab" id="' + tab.type + '" value="' + tab.type + '"' + isChecked + '>';
html += '<label for="' + tab.type + '">' + tab.name + '</label>';
html += '<option value="' + tab.type + '"' + isChecked + '>' + tab.name + '</option>';
}
html += '</div>';
var elem = $('.tabs', page).html(html).trigger('create');
$('#selectItemType', page).html(html).selectmenu('refresh').trigger('change');
Dashboard.hideLoadingMsg();
$('.radioTypeTab', elem).on('change', function () {
if (this.checked) {
loadType(page, this.id);
}
}).trigger('change');
}
function loadType(page, type) {
@ -416,70 +402,29 @@
function loadPage(page) {
var type = getParameterByName('type');
loadTabs(page, [
$('.categoryTab', page).removeClass('ui-btn-active');
if (type == 'games') {
loadTabs(page, [
{ name: 'Games', type: 'Game' },
{ name: 'Game Systems', type: 'GameSystem' },
{ name: 'Game Genres', type: 'GameGenre' }
]);
$('.gamesTab', page).addClass('ui-btn-active');
}
else if (type == 'movies') {
loadTabs(page, [
{ name: 'Movies', type: 'Movie' },
{ name: 'Trailers', type: 'Trailer' },
{ name: 'Collections', type: 'BoxSet' }
]);
$('.moviesTab', page).addClass('ui-btn-active');
}
else if (type == 'tv') {
loadTabs(page, [
{ name: 'Series', type: 'Series' },
{ name: 'Seasons', type: 'Season' },
{ name: 'Episodes', type: 'Episode' }
]);
$('.tvTab', page).addClass('ui-btn-active');
}
else if (type == 'music') {
loadTabs(page, [
{ name: 'Artists', type: 'MusicArtist' },
{ name: 'Albums', type: 'MusicAlbum' },
{ name: 'Songs', type: 'Audio' },
{ name: 'Music Videos', type: 'MusicVideo' },
{ name: 'Music Genres', type: 'MusicGenre' }
]);
$('.musicTab', page).addClass('ui-btn-active');
}
else if (type == 'others') {
loadTabs(page, [
{ name: 'People', type: 'Person' },
{ name: 'Genres', type: 'Genre' },
{ name: 'Studios', type: 'Studio' },
{ name: 'Books', type: 'Book' },
{ name: 'Home Videos', type: 'Video' },
{ name: 'Adult Videos', type: 'AdultVideo' }
]);
$('.othersTab', page).addClass('ui-btn-active');
}
{ name: 'Movies', type: 'Movie' },
{ name: 'Trailers', type: 'Trailer' },
{ name: 'Collections', type: 'BoxSet' },
{ name: 'TV Series', type: 'Series' },
{ name: 'TV Seasons', type: 'Season' },
{ name: 'TV Episodes', type: 'Episode' },
{ name: 'Games', type: 'Game' },
{ name: 'Game Systems', type: 'GameSystem' },
{ name: 'Game Genres', type: 'GameGenre' },
{ name: 'Music Artists', type: 'MusicArtist' },
{ name: 'Music Albums', type: 'MusicAlbum' },
{ name: 'Music Videos', type: 'MusicVideo' },
{ name: 'Music Genres', type: 'MusicGenre' },
{ name: 'Songs', type: 'Audio' },
{ name: 'Home Videos', type: 'Video' },
{ name: 'Books', type: 'Book' },
{ name: 'Adult Videos', type: 'AdultVideo' },
{ name: 'People', type: 'Person' },
{ name: 'Genres', type: 'Genre' },
{ name: 'Studios', type: 'Studio' }
]);
}
function saveSettingsIntoConfig(form, config) {
@ -614,7 +559,12 @@
ul.listview('destroy').listview({});
});
$('#selectItemType', page).on('change', function () {
loadType(page, this.value);
});
}).on('pageshow', "#metadataImagesConfigurationPage", function () {
Dashboard.showLoadingMsg();

View file

@ -4,6 +4,106 @@
var lastPlayerState;
var isPositionSliderActive;
function populateChapters(elem, chapters, itemId, runtimeTicks) {
var html = '';
for (var i = 0, length = chapters.length; i < length; i++) {
var chapter = chapters[i];
html += '<div data-positionticks="' + chapter.StartPositionTicks + '" class="posterItem backdropPosterItem chapterPosterItem">';
var imgUrl;
if (chapter.ImageTag) {
imgUrl = ApiClient.getImageUrl(itemId, {
maxwidth: 600,
tag: chapter.ImageTag,
type: "Chapter",
index: i
});
} else {
imgUrl = "css/images/items/list/chapter.png";
}
var dataSrc = ' data-src="' + imgUrl + '"';
html += '<div class="posterItemImage lazy"' + dataSrc + '>';
html += '<div class="posterItemTextOverlay">';
if (chapter.Name) {
html += "<div class='posterItemText'>";
html += chapter.Name;
html += "</div>";
}
html += "<div class='posterItemProgress posterItemText'>";
var pct = 100 * (chapter.StartPositionTicks / runtimeTicks);
html += '<progress class="itemProgressBar" min="0" max="100" value="' + pct + '" style="opacity:.8;"></progress>';
html += "</div>";
html += "</div>";
html += "</div>";
html += "</div>";
}
elem.html(html).trigger('create');
}
function selectCurrentChapter(elem, positionTicks) {
var elems = $('.chapterPosterItem', elem).removeClass('currentChapter');
var matches = elems.get().filter(function (i) {
var ticks = i.getAttribute('data-positionticks');
return positionTicks >= ticks;
});
var chapterElem = matches[matches.length - 1];
$(chapterElem).addClass('currentChapter');
chapterElem.scrollIntoView();
elem[0].scrollLeft += 50;
}
function showChapterMenu(page, item, currentPositionTicks) {
$('.chapterMenuOverlay', page).show();
var elem = $('.chapterMenu', page).show();
if (item.Id == elem.attr('data-itemid')) {
selectCurrentChapter(elem, currentPositionTicks);
return;
}
var innerElem = $('.chapterMenuInner', elem);
populateChapters(innerElem, item.Chapters, item.Id, item.RunTimeTicks);
elem.attr('data-itemid', item.Id);
selectCurrentChapter(elem, currentPositionTicks);
}
function hideChapterMenu(page) {
$('.chapterMenuOverlay', page).hide();
$('.chapterMenu', page).hide();
}
function showAudioMenu(page, item, currentIndex) {
var streams = (item.MediaStreams || []).filter(function (i) {
@ -20,7 +120,7 @@
var streamHtml = '<li><a data-index="' + s.Index + '" href="#" class="lnkTrackOption">';
streamHtml += '<h3>';
if (s.Index == currentIndex) {
streamHtml += '<img src="css/images/checkmarkgreen.png" style="width:18px;border-radius:3px;margin-right:.5em;vertical-align:top;" />';
}
@ -67,7 +167,7 @@
function showSubtitleMenu(page, item, currentIndex) {
var currentStreamImage = '<img src="css/images/checkmarkgreen.png" style="width:18px;border-radius:3px;margin-right:.5em;vertical-align:top;" />';
var streams = (item.MediaStreams || []).filter(function (i) {
return i.Type == 'Subtitle';
@ -138,6 +238,22 @@
$(this).addClass('ui-btn-active');
});
$('.chapterMenuOverlay', page).on('click', function () {
hideChapterMenu(page);
});
$('.chapterMenu', page).on('click', '.chapterPosterItem', function () {
if (currentPlayer) {
var ticks = this.getAttribute('data-positionticks');
currentPlayer.seek(parseInt(ticks));
}
hideChapterMenu(page);
});
$('.btnCommand,.btnToggleFullscreen', page).on('click', function () {
if (currentPlayer) {
@ -192,6 +308,9 @@
$('.btnChapters', page).on('click', function () {
if (currentPlayer && lastPlayerState) {
var currentPositionTicks = lastPlayerState.PlayState.PositionTicks;
showChapterMenu(page, lastPlayerState.NowPlayingItem, currentPositionTicks);
}
});
@ -299,7 +418,14 @@
$('.btnAudioTracks', page).buttonEnabled(hasStreams(item, 'Audio') && supportedCommands.indexOf('SetAudioStreamIndex') != -1);
$('.btnSubtitles', page).buttonEnabled(hasStreams(item, 'Subtitle') && supportedCommands.indexOf('SetSubtitleStreamIndex') != -1);
$('.btnChapters', page).buttonEnabled(item && item.Chapters && item.Chapters.length);
if (item && item.Chapters && item.Chapters.length) {
$('.btnChapters', page).buttonEnabled(true);
} else {
$('.btnChapters', page).buttonEnabled(false);
hideChapterMenu(page);
}
$('.sendMessageElement', page).buttonEnabled(supportedCommands.indexOf('DisplayMessage') != -1);
$('.typeTextElement', page).buttonEnabled(supportedCommands.indexOf('SendString') != -1);
@ -520,9 +646,9 @@
return false;
},
onSendStringSubmit: function() {
onSendStringSubmit: function () {
var form = this;
MediaController.sendCommand({

View file

@ -484,9 +484,9 @@
if (c.sortField == currentSortField) {
if (currentSortDirection == "Descending") {
cellHtml += '<span style="font-weight:bold;margin-left:5px;vertical-align:top;font-size:12px;">&darr;</span>';
cellHtml += '<span style="font-weight:bold;margin-left:5px;vertical-align:top;font-size:14px">&darr;</span>';
} else {
cellHtml += '<span style="font-weight:bold;margin-left:5px;vertical-align:top;font-size:12px;">&uarr;</span>';
cellHtml += '<span style="font-weight:bold;margin-left:5px;vertical-align:top;font-size:14px;">&uarr;</span>';
}
}
}
@ -623,19 +623,6 @@
var page = this;
$('.libraryTree', page).on('itemclicked', function (event, data) {
if (data.itemType == "libraryreport") {
return;
}
if (data.itemType == "livetvservice") {
return;
}
Dashboard.navigate('edititemmetadata.html?id=' + data.id);
});
$('#radioBasicFilters', page).on('change', function () {
if (this.checked) {

View file

@ -29,12 +29,14 @@
$('#selectSubtitleLanguage', page).val(user.Configuration.SubtitleLanguagePreference || "").selectmenu("refresh");
});
$('#chkForcedSubtitlesOnly', page).checked(user.Configuration.UseForcedSubtitlesOnly || false).checkboxradio("refresh");
$('#chkDisplayMissingEpisodes', page).checked(user.Configuration.DisplayMissingEpisodes || false).checkboxradio("refresh");
$('#chkDisplayUnairedEpisodes', page).checked(user.Configuration.DisplayUnairedEpisodes || false).checkboxradio("refresh");
$('#chkGroupMoviesIntoCollections', page).checked(user.Configuration.GroupMoviesIntoBoxSets || false).checkboxradio("refresh");
$('#selectSubtitlePlaybackMode', page).val(user.Configuration.SubtitleMode || "").selectmenu("refresh");
$('#chkPlayDefaultAudioTrack', page).checked(user.Configuration.PlayDefaultAudioTrack || false).checkboxradio("refresh");
Dashboard.hideLoadingMsg();
}
@ -57,11 +59,13 @@
user.Configuration.AudioLanguagePreference = $('#selectAudioLanguage', page).val();
user.Configuration.SubtitleLanguagePreference = $('#selectSubtitleLanguage', page).val();
user.Configuration.UseForcedSubtitlesOnly = $('#chkForcedSubtitlesOnly', page).checked();
user.Configuration.DisplayMissingEpisodes = $('#chkDisplayMissingEpisodes', page).checked();
user.Configuration.DisplayUnairedEpisodes = $('#chkDisplayUnairedEpisodes', page).checked();
user.Configuration.GroupMoviesIntoBoxSets = $('#chkGroupMoviesIntoCollections', page).checked();
user.Configuration.SubtitleMode = $('#selectSubtitlePlaybackMode', page).val();
user.Configuration.PlayDefaultAudioTrack = $('#chkPlayDefaultAudioTrack', page).checked();
ApiClient.updateUser(user).done(function () {
onSaveComplete(page);
});