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

update series timer editor

This commit is contained in:
Luke Pulverenti 2016-10-01 03:06:00 -04:00
parent 67a90b61b9
commit 99f7d3e9f8
14 changed files with 241 additions and 157 deletions

View file

@ -237,7 +237,7 @@
} }
.cardText { .cardText {
padding: .35em .5em; padding: .25em .5em;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;

View file

@ -167,6 +167,10 @@
overflow-x: auto; overflow-x: auto;
} }
.tabScenes, .tabCast {
display: flex;
}
#videoPlayer .nowPlayingText { #videoPlayer .nowPlayingText {
font-weight: normal; font-weight: normal;
margin: 0 0 0 1em; margin: 0 0 0 1em;
@ -186,6 +190,7 @@
.videoNowPlayingOverview, .videoNowPlayingRating { .videoNowPlayingOverview, .videoNowPlayingRating {
margin: 1em 0; margin: 1em 0;
display: flex;
} }
.videoTopControlsLogo { .videoTopControlsLogo {

View file

@ -11,11 +11,6 @@
max-width: 130px; max-width: 130px;
} }
.mediaButton.infoButton {
width: 34px;
height: 34px;
}
.mediaButton.active { .mediaButton.active {
color: #52B54B; color: #52B54B;
} }

View file

@ -18,7 +18,16 @@
<div class="recordingEditor"> <div class="recordingEditor">
</div> </div>
<div class="scheduleTab seriesTimerSchedule"></div>
<h1 style="margin-top:0;">${HeaderSchedule}</h1>
<div style="display:flex;align-items:center;">
<i class="md-icon" style="color:#cc3333;font-size:1.5em;">&#xE062;</i>
<div style="margin-left:.25em;">${WillRecord}</div>
<i class="md-icon" style="color:gray;font-size:1.5em;margin-left: 1.5em;">&#xE062;</i>
<div style="margin-left:.25em;">${NotScheduledToRecord}</div>
</div>
<div class="scheduleTab seriesTimerSchedule">
</div>
</div> </div>
</div> </div>

View file

@ -8,6 +8,101 @@
return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; return enableScrollX() ? 'overflowBackdrop' : 'backdrop';
} }
function getProgramScheduleHtml(items, options) {
options = options || {};
var groups = [];
var currentGroupName = '';
var currentGroup = [];
var i, length;
for (i = 0, length = items.length; i < length; i++) {
var item = items[i];
var dateText = '';
if (options.indexByDate !== false && item.StartDate) {
try {
var premiereDate = datetime.parseISO8601Date(item.StartDate, true);
dateText = LibraryBrowser.getFutureDateText(premiereDate, true);
} catch (err) {
}
}
if (dateText != currentGroupName) {
if (currentGroup.length) {
groups.push({
name: currentGroupName,
items: currentGroup
});
}
currentGroupName = dateText;
currentGroup = [item];
} else {
currentGroup.push(item);
}
}
if (currentGroup.length) {
groups.push({
name: currentGroupName,
items: currentGroup
});
}
var html = '';
for (i = 0, length = groups.length; i < length; i++) {
var group = groups[i];
if (group.name) {
html += '<div class="homePageSection">';
html += '<h1 class="listHeader">' + group.name + '</h1>';
}
if (enableScrollX()) {
html += '<div is="emby-itemscontainer" class="itemsContainer hiddenScrollX">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap">';
}
html += cardBuilder.getCardsHtml({
items: group.items,
shape: getBackdropShape(),
preferThumb: true,
showTitle: true,
showAirTime: true,
showAirEndTime: true,
showChannelName: true,
cardLayout: true,
action: 'programdialog',
cardFooterAside: 'none',
preferThumb: true,
coverImage: true,
overlayText: false
});
html += '</div>';
if (group.name) {
html += '</div>';
}
}
return Promise.resolve(html);
}
function getTimersHtml(timers, options) { function getTimersHtml(timers, options) {
options = options || {}; options = options || {};
@ -109,29 +204,8 @@
window.LiveTvHelpers = { window.LiveTvHelpers = {
getDaysOfWeek: function () { getTimersHtml: getTimersHtml,
getProgramScheduleHtml: getProgramScheduleHtml
var days = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
];
return days.map(function (d) {
return {
name: d,
value: d
};
});
},
getTimersHtml: getTimersHtml
}; };
}); });

View file

@ -9,17 +9,38 @@
Dashboard.hideLoadingMsg(); Dashboard.hideLoadingMsg();
} }
function renderSchedule(page, result) { function renderSchedule(page) {
var timers = result.Items; ApiClient.getLiveTvPrograms({
UserId: ApiClient.getCurrentUserId(),
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
SortBy: "StartDate",
EnableTotalRecordCount: false,
EnableUserData: false,
SeriesTimerId: params.id,
Fields: "ChannelInfo"
LiveTvHelpers.getTimersHtml(timers).then(function (html) { }).then(function (result) {
var scheduleTab = page.querySelector('.scheduleTab'); LiveTvHelpers.getProgramScheduleHtml(result.Items).then(function (html) {
scheduleTab.innerHTML = html;
ImageLoader.lazyChildren(scheduleTab); var scheduleTab = page.querySelector('.scheduleTab');
scheduleTab.innerHTML = html;
ImageLoader.lazyChildren(scheduleTab);
});
}); });
//var timers = result.Items;
//LiveTvHelpers.getTimersHtml(timers).then(function (html) {
// var scheduleTab = page.querySelector('.scheduleTab');
// scheduleTab.innerHTML = html;
// ImageLoader.lazyChildren(scheduleTab);
//});
} }
function reload() { function reload() {
@ -33,15 +54,7 @@
}); });
ApiClient.getLiveTvTimers({ renderSchedule(view);
seriesTimerId: id
}).then(function (timerResult) {
renderSchedule(view, timerResult);
});
} }
seriesRecordingEditor.embed(params.id, ApiClient.serverId(), { seriesRecordingEditor.embed(params.id, ApiClient.serverId(), {

View file

@ -1,4 +1,4 @@
define(['libraryBrowser', 'cardBuilder', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (libraryBrowser, cardBuilder) { define(['libraryBrowser', 'cardBuilder', 'dom', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (libraryBrowser, cardBuilder, dom) {
function enableScrollX() { function enableScrollX() {
return browserInfo.mobile && AppInfo.enableAppLayouts; return browserInfo.mobile && AppInfo.enableAppLayouts;
@ -29,6 +29,7 @@
limit: limit, limit: limit,
ImageTypeLimit: 1, ImageTypeLimit: 1,
EnableImageTypes: "Primary,Thumb,Backdrop", EnableImageTypes: "Primary,Thumb,Backdrop",
EnableTotalRecordCount: false,
Fields: "ChannelInfo" Fields: "ChannelInfo"
}).then(function (result) { }).then(function (result) {

View file

@ -376,19 +376,19 @@
if (playerInfo.supportedCommands.indexOf('EndSession') != -1) { if (playerInfo.supportedCommands.indexOf('EndSession') != -1) {
var menuItems = [];
menuItems.push({
name: Globalize.translate('ButtonYes'),
id: 'yes'
});
menuItems.push({
name: Globalize.translate('ButtonNo'),
id: 'no'
});
require(['dialog'], function (dialog) { require(['dialog'], function (dialog) {
var menuItems = [];
menuItems.push({
name: Globalize.translate('ButtonYes'),
id: 'yes'
});
menuItems.push({
name: Globalize.translate('ButtonNo'),
id: 'no'
});
dialog({ dialog({
buttons: menuItems, buttons: menuItems,
//positionTo: positionTo, //positionTo: positionTo,

View file

@ -413,7 +413,24 @@
var elem = mediaControls.querySelector('.nowPlayingTabs'); var elem = mediaControls.querySelector('.nowPlayingTabs');
elem.innerHTML = getNowPlayingTabsHtml(item.CurrentProgram || item); elem.innerHTML = getNowPlayingTabsHtml(item.CurrentProgram || item);
ImageLoader.lazyChildren(elem);
var tabCast = elem.querySelector('.tabCast');
if (tabCast) {
require(['peoplecardbuilder'], function (peoplecardbuilder) {
peoplecardbuilder.buildPeopleCards((item.CurrentProgram || item).People || [], {
itemsContainer: tabCast,
coverImage: true,
serverId: ApiClient.serverId(),
width: 160,
shape: 'portrait'
});
ImageLoader.lazyChildren(elem);
});
}
else {
ImageLoader.lazyChildren(elem);
}
function onTabButtonClick() { function onTabButtonClick() {
if (!this.classList.contains('selectedNowPlayingTabButton')) { if (!this.classList.contains('selectedNowPlayingTabButton')) {
@ -540,55 +557,6 @@
if (item.People && item.People.length) { if (item.People && item.People.length) {
html += '<div class="tabCast nowPlayingTab smoothScrollX hide" style="white-space:nowrap;">'; html += '<div class="tabCast nowPlayingTab smoothScrollX hide" style="white-space:nowrap;">';
html += item.People.map(function (cast) {
var personHtml = '<div class="tileItem smallPosterTileItem" style="width:300px;">';
var imgUrl;
var height = 150;
if (cast.PrimaryImageTag) {
imgUrl = ApiClient.getScaledImageUrl(cast.Id, {
height: height,
tag: cast.PrimaryImageTag,
type: "primary",
minScale: 2
});
personHtml += '<div class="tileImage lazy" data-src="' + imgUrl + '" style="height:' + height + 'px;"></div>';
} else {
imgUrl = "css/images/items/list/person.png";
personHtml += '<div class="tileImage" style="background-image:url(\'' + imgUrl + '\');height:' + height + 'px;"></div>';
}
personHtml += '<div class="tileContent">';
personHtml += '<p>' + cast.Name + '</p>';
var role = cast.Role ? Globalize.translate('ValueAsRole', cast.Role) : cast.Type;
if (role == "GuestStar") {
role = Globalize.translate('ValueGuestStar');
}
role = role || "";
var maxlength = 40;
if (role.length > maxlength) {
role = role.substring(0, maxlength - 3) + '...';
}
personHtml += '<p>' + role + '</p>';
personHtml += '</div>';
personHtml += '</div>';
return personHtml;
}).join('');
html += '</div>'; html += '</div>';
} }

View file

@ -146,6 +146,25 @@ define(['appSettings', 'userSettings', 'appStorage', 'datetime'], function (appS
return window.MediaSource != null; return window.MediaSource != null;
}; };
function getProfileOptions(item) {
var disableVideoAudioCodecs = [];
if (!AppInfo.isNativeApp && !item.RunTimeTicks) {
disableVideoAudioCodecs.push('ac3');
}
var options = {};
if (!AppInfo.isNativeApp) {
options.enableMkvProgressive = item.RunTimeTicks != null;
options.enableTsProgressive = item.RunTimeTicks != null;
options.enableHls = !browserInfo.firefox || item.RunTimeTicks == null;
options.disableVideoAudioCodecs = disableVideoAudioCodecs;
}
return options;
}
self.changeStream = function (ticks, params) { self.changeStream = function (ticks, params) {
var mediaRenderer = self.currentMediaRenderer; var mediaRenderer = self.currentMediaRenderer;
@ -163,19 +182,7 @@ define(['appSettings', 'userSettings', 'appStorage', 'datetime'], function (appS
var playSessionId = getParameterByName('PlaySessionId', currentSrc); var playSessionId = getParameterByName('PlaySessionId', currentSrc);
var liveStreamId = getParameterByName('LiveStreamId', currentSrc); var liveStreamId = getParameterByName('LiveStreamId', currentSrc);
var disableVideoAudioCodecs = []; Dashboard.getDeviceProfile(null, getProfileOptions(self.currentMediaSource)).then(function (deviceProfile) {
if (!AppInfo.isNativeApp && !self.currentMediaSource.RunTimeTicks) {
disableVideoAudioCodecs.push('ac3');
}
Dashboard.getDeviceProfile(null, {
enableMkvProgressive: self.currentMediaSource.RunTimeTicks != null,
enableTsProgressive: self.currentMediaSource.RunTimeTicks != null,
enableHls: !browserInfo.firefox || self.currentMediaSource.RunTimeTicks == null,
disableVideoAudioCodecs: disableVideoAudioCodecs
}).then(function (deviceProfile) {
var audioStreamIndex = params.AudioStreamIndex == null ? (getParameterByName('AudioStreamIndex', currentSrc) || null) : params.AudioStreamIndex; var audioStreamIndex = params.AudioStreamIndex == null ? (getParameterByName('AudioStreamIndex', currentSrc) || null) : params.AudioStreamIndex;
if (typeof (audioStreamIndex) == 'string') { if (typeof (audioStreamIndex) == 'string') {
@ -683,19 +690,7 @@ define(['appSettings', 'userSettings', 'appStorage', 'datetime'], function (appS
var onBitrateDetected = function () { var onBitrateDetected = function () {
var disableVideoAudioCodecs = []; Dashboard.getDeviceProfile(null, getProfileOptions(item)).then(function (deviceProfile) {
if (!AppInfo.isNativeApp && !item.RunTimeTicks) {
disableVideoAudioCodecs.push('ac3');
}
Dashboard.getDeviceProfile(null, {
enableMkvProgressive: item.RunTimeTicks != null,
enableTsProgressive: item.RunTimeTicks != null,
disableVideoAudioCodecs: disableVideoAudioCodecs
}).then(function (deviceProfile) {
playOnDeviceProfileCreated(deviceProfile, item, startPosition, callback); playOnDeviceProfileCreated(deviceProfile, item, startPosition, callback);
}); });
}; };

View file

@ -50,7 +50,7 @@
SortOrder: "Descending", SortOrder: "Descending",
IncludeItemTypes: "Movie", IncludeItemTypes: "Movie",
Filters: "IsResumable", Filters: "IsResumable",
Limit: screenWidth >= 1920 ? 5 : (screenWidth >= 1600 ? 4 : 3), Limit: screenWidth >= 1920 ? 5 : (screenWidth >= 1600 ? 5 : 3),
Recursive: true, Recursive: true,
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
CollapseBoxSetItems: false, CollapseBoxSetItems: false,

View file

@ -1,4 +1,4 @@
define(['appStorage', 'emby-button'], function (appStorage) { define(['userSettings', 'emby-button'], function (userSettings) {
return function (options) { return function (options) {
@ -77,32 +77,54 @@
function onButtonClick() { function onButtonClick() {
var button = this; var button = this;
var id = button.getAttribute('data-taskid'); var buttonTextElement = this.querySelector('span') || this;
var text = buttonTextElement.textContent || buttonTextElement.innerText;
var taskId = button.getAttribute('data-taskid');
var key = 'scheduledTaskButton' + options.taskKey; var key = 'scheduledTaskButton' + options.taskKey;
var expectedValue = new Date().getMonth() + '6'; var expectedValue = new Date().getMonth() + '6';
if (appStorage.getItem(key) == expectedValue) { if (userSettings.get(key) == expectedValue) {
onScheduledTaskMessageConfirmed(id); onScheduledTaskMessageConfirmed(taskId);
} else { } else {
var msg = Globalize.translate('ConfirmMessageScheduledTaskButton'); require(['dialog'], function (dialog) {
msg += '<br/>';
msg += '<div style="margin-top:1em;">';
msg += '<a class="clearLink" href="scheduledtasks.html"><button is="emby-button" type="button" style="color:#3f51b5!important;margin:0;">' + Globalize.translate('ButtonScheduledTasks') + '</button></a>';
msg += '</div>';
require(['confirm'], function (confirm) { var msg = Globalize.translate('ConfirmMessageScheduledTaskButton');
confirm({ var menuItems = [];
title: Globalize.translate('HeaderConfirmation'), menuItems.push({
html: msg, name: text,
text: Globalize.translate('ConfirmMessageScheduledTaskButton') + "\n\n" + Globalize.translate('ButtonScheduledTasks') id: 'task'
});
menuItems.push({
name: Globalize.translate('ButtonScheduledTasks'),
id: 'tasks'
});
menuItems.push({
name: Globalize.translate('ButtonCancel'),
id: 'cancel'
});
}).then(function () { dialog({
appStorage.setItem(key, expectedValue); buttons: menuItems,
onScheduledTaskMessageConfirmed(id); text: msg
}).then(function (id) {
switch (id) {
case 'task':
userSettings.set(key, expectedValue);
onScheduledTaskMessageConfirmed(taskId);
break;
case 'tasks':
userSettings.set(key, expectedValue);
Dashboard.navigate('scheduledtasks.html');
break;
default:
break;
}
}); });
}); });
@ -161,7 +183,7 @@
Events.off(ApiClient, 'websocketopen', onSocketOpen); Events.off(ApiClient, 'websocketopen', onSocketOpen);
stopInterval(); stopInterval();
} else { } else {
button.addEventListener('click', onButtonClick); button.addEventListener('click', onButtonClick);

View file

@ -1,4 +1,4 @@
define(['libraryBrowser', 'components/categorysyncbuttons', 'cardBuilder', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (libraryBrowser, categorysyncbuttons, cardBuilder) { define(['libraryBrowser', 'dom', 'components/categorysyncbuttons', 'cardBuilder', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (libraryBrowser, dom, categorysyncbuttons, cardBuilder) {
return function (view, params) { return function (view, params) {
@ -62,7 +62,8 @@
var parentId = LibraryMenu.getTopParentId(); var parentId = LibraryMenu.getTopParentId();
var limit = 6; var screenWidth = dom.getWindowSize().innerWidth;
var limit = screenWidth >= 1600 ? 5 : 6;
var options = { var options = {

View file

@ -57,7 +57,6 @@
"HeaderAvailableServices": "Available Services", "HeaderAvailableServices": "Available Services",
"MessageNoServicesInstalled": "No services are currently installed.", "MessageNoServicesInstalled": "No services are currently installed.",
"HeaderToAccessPleaseEnterEasyPinCode": "To access, please enter your easy pin code", "HeaderToAccessPleaseEnterEasyPinCode": "To access, please enter your easy pin code",
"KidsModeAdultInstruction": "Click the lock icon in the bottom right to configure or leave kids mode. Your pin code will be required.",
"ButtonConfigurePinCode": "Configure pin code", "ButtonConfigurePinCode": "Configure pin code",
"RegisterWithPayPal": "Register with PayPal", "RegisterWithPayPal": "Register with PayPal",
"HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial", "HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial",
@ -1431,7 +1430,7 @@
"ButtonScheduledTasks": "Scheduled tasks", "ButtonScheduledTasks": "Scheduled tasks",
"MessageItemsAdded": "Items added", "MessageItemsAdded": "Items added",
"HeaderSelectCertificatePath": "Select Certificate Path", "HeaderSelectCertificatePath": "Select Certificate Path",
"ConfirmMessageScheduledTaskButton": "This operation normally runs automatically as a scheduled task and does not require any manual effort. To configure the scheduled task, see:", "ConfirmMessageScheduledTaskButton": "This operation normally runs automatically as a scheduled task and does not require any manual effort. To configure the scheduled task, click Scheduled Tasks.",
"HeaderSupporterBenefit": "An active Emby Premiere subscription provides additional benefits such as access to sync, premium plugins, internet channel content, and more. {0}Learn more{1}.", "HeaderSupporterBenefit": "An active Emby Premiere subscription provides additional benefits such as access to sync, premium plugins, internet channel content, and more. {0}Learn more{1}.",
"HeaderWelcomeToProjectServerDashboard": "Welcome to the Emby Server Dashboard", "HeaderWelcomeToProjectServerDashboard": "Welcome to the Emby Server Dashboard",
"HeaderWelcomeToProjectWebClient": "Welcome to Emby", "HeaderWelcomeToProjectWebClient": "Welcome to Emby",
@ -2141,5 +2140,7 @@
"HeaderUpcomingOnTV": "Upcoming On TV", "HeaderUpcomingOnTV": "Upcoming On TV",
"LabelOptionalNetworkPath": "(Optional) Shared network folder:", "LabelOptionalNetworkPath": "(Optional) Shared network folder:",
"LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Emby apps on other devices to access media files directly.", "LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Emby apps on other devices to access media files directly.",
"ButtonPlayExternalPlayer": "Play with external player" "ButtonPlayExternalPlayer": "Play with external player",
"WillRecord": "Will record",
"NotScheduledToRecord": "Not scheduled to record"
} }