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:
parent
67a90b61b9
commit
99f7d3e9f8
14 changed files with 241 additions and 157 deletions
|
@ -237,7 +237,7 @@
|
|||
}
|
||||
|
||||
.cardText {
|
||||
padding: .35em .5em;
|
||||
padding: .25em .5em;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
|
|
@ -167,6 +167,10 @@
|
|||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.tabScenes, .tabCast {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#videoPlayer .nowPlayingText {
|
||||
font-weight: normal;
|
||||
margin: 0 0 0 1em;
|
||||
|
@ -186,6 +190,7 @@
|
|||
|
||||
.videoNowPlayingOverview, .videoNowPlayingRating {
|
||||
margin: 1em 0;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.videoTopControlsLogo {
|
||||
|
|
|
@ -11,11 +11,6 @@
|
|||
max-width: 130px;
|
||||
}
|
||||
|
||||
.mediaButton.infoButton {
|
||||
width: 34px;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
.mediaButton.active {
|
||||
color: #52B54B;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,16 @@
|
|||
<div class="recordingEditor">
|
||||
|
||||
</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;"></i>
|
||||
<div style="margin-left:.25em;">${WillRecord}</div>
|
||||
<i class="md-icon" style="color:gray;font-size:1.5em;margin-left: 1.5em;"></i>
|
||||
<div style="margin-left:.25em;">${NotScheduledToRecord}</div>
|
||||
</div>
|
||||
<div class="scheduleTab seriesTimerSchedule">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -8,6 +8,101 @@
|
|||
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) {
|
||||
|
||||
options = options || {};
|
||||
|
@ -109,29 +204,8 @@
|
|||
|
||||
window.LiveTvHelpers = {
|
||||
|
||||
getDaysOfWeek: function () {
|
||||
|
||||
var days = [
|
||||
'Sunday',
|
||||
'Monday',
|
||||
'Tuesday',
|
||||
'Wednesday',
|
||||
'Thursday',
|
||||
'Friday',
|
||||
'Saturday'
|
||||
];
|
||||
|
||||
return days.map(function (d) {
|
||||
|
||||
return {
|
||||
name: d,
|
||||
value: d
|
||||
};
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
getTimersHtml: getTimersHtml
|
||||
getTimersHtml: getTimersHtml,
|
||||
getProgramScheduleHtml: getProgramScheduleHtml
|
||||
|
||||
};
|
||||
});
|
|
@ -9,17 +9,38 @@
|
|||
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) {
|
||||
|
||||
LiveTvHelpers.getProgramScheduleHtml(result.Items).then(function (html) {
|
||||
|
||||
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() {
|
||||
|
@ -33,15 +54,7 @@
|
|||
|
||||
});
|
||||
|
||||
ApiClient.getLiveTvTimers({
|
||||
|
||||
seriesTimerId: id
|
||||
|
||||
}).then(function (timerResult) {
|
||||
|
||||
renderSchedule(view, timerResult);
|
||||
|
||||
});
|
||||
renderSchedule(view);
|
||||
}
|
||||
|
||||
seriesRecordingEditor.embed(params.id, ApiClient.serverId(), {
|
||||
|
|
|
@ -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() {
|
||||
return browserInfo.mobile && AppInfo.enableAppLayouts;
|
||||
|
@ -29,6 +29,7 @@
|
|||
limit: limit,
|
||||
ImageTypeLimit: 1,
|
||||
EnableImageTypes: "Primary,Thumb,Backdrop",
|
||||
EnableTotalRecordCount: false,
|
||||
Fields: "ChannelInfo"
|
||||
|
||||
}).then(function (result) {
|
||||
|
|
|
@ -376,6 +376,8 @@
|
|||
|
||||
if (playerInfo.supportedCommands.indexOf('EndSession') != -1) {
|
||||
|
||||
require(['dialog'], function (dialog) {
|
||||
|
||||
var menuItems = [];
|
||||
|
||||
menuItems.push({
|
||||
|
@ -387,8 +389,6 @@
|
|||
id: 'no'
|
||||
});
|
||||
|
||||
require(['dialog'], function (dialog) {
|
||||
|
||||
dialog({
|
||||
buttons: menuItems,
|
||||
//positionTo: positionTo,
|
||||
|
|
|
@ -413,7 +413,24 @@
|
|||
|
||||
var elem = mediaControls.querySelector('.nowPlayingTabs');
|
||||
elem.innerHTML = getNowPlayingTabsHtml(item.CurrentProgram || item);
|
||||
|
||||
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() {
|
||||
if (!this.classList.contains('selectedNowPlayingTabButton')) {
|
||||
|
@ -540,55 +557,6 @@
|
|||
|
||||
if (item.People && item.People.length) {
|
||||
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>';
|
||||
}
|
||||
|
||||
|
|
|
@ -146,6 +146,25 @@ define(['appSettings', 'userSettings', 'appStorage', 'datetime'], function (appS
|
|||
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) {
|
||||
|
||||
var mediaRenderer = self.currentMediaRenderer;
|
||||
|
@ -163,19 +182,7 @@ define(['appSettings', 'userSettings', 'appStorage', 'datetime'], function (appS
|
|||
var playSessionId = getParameterByName('PlaySessionId', currentSrc);
|
||||
var liveStreamId = getParameterByName('LiveStreamId', currentSrc);
|
||||
|
||||
var disableVideoAudioCodecs = [];
|
||||
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) {
|
||||
Dashboard.getDeviceProfile(null, getProfileOptions(self.currentMediaSource)).then(function (deviceProfile) {
|
||||
|
||||
var audioStreamIndex = params.AudioStreamIndex == null ? (getParameterByName('AudioStreamIndex', currentSrc) || null) : params.AudioStreamIndex;
|
||||
if (typeof (audioStreamIndex) == 'string') {
|
||||
|
@ -683,19 +690,7 @@ define(['appSettings', 'userSettings', 'appStorage', 'datetime'], function (appS
|
|||
|
||||
var onBitrateDetected = function () {
|
||||
|
||||
var disableVideoAudioCodecs = [];
|
||||
|
||||
if (!AppInfo.isNativeApp && !item.RunTimeTicks) {
|
||||
disableVideoAudioCodecs.push('ac3');
|
||||
}
|
||||
|
||||
Dashboard.getDeviceProfile(null, {
|
||||
|
||||
enableMkvProgressive: item.RunTimeTicks != null,
|
||||
enableTsProgressive: item.RunTimeTicks != null,
|
||||
disableVideoAudioCodecs: disableVideoAudioCodecs
|
||||
|
||||
}).then(function (deviceProfile) {
|
||||
Dashboard.getDeviceProfile(null, getProfileOptions(item)).then(function (deviceProfile) {
|
||||
playOnDeviceProfileCreated(deviceProfile, item, startPosition, callback);
|
||||
});
|
||||
};
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
SortOrder: "Descending",
|
||||
IncludeItemTypes: "Movie",
|
||||
Filters: "IsResumable",
|
||||
Limit: screenWidth >= 1920 ? 5 : (screenWidth >= 1600 ? 4 : 3),
|
||||
Limit: screenWidth >= 1920 ? 5 : (screenWidth >= 1600 ? 5 : 3),
|
||||
Recursive: true,
|
||||
Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
|
||||
CollapseBoxSetItems: false,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(['appStorage', 'emby-button'], function (appStorage) {
|
||||
define(['userSettings', 'emby-button'], function (userSettings) {
|
||||
|
||||
return function (options) {
|
||||
|
||||
|
@ -77,32 +77,54 @@
|
|||
function onButtonClick() {
|
||||
|
||||
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 expectedValue = new Date().getMonth() + '6';
|
||||
|
||||
if (appStorage.getItem(key) == expectedValue) {
|
||||
onScheduledTaskMessageConfirmed(id);
|
||||
if (userSettings.get(key) == expectedValue) {
|
||||
onScheduledTaskMessageConfirmed(taskId);
|
||||
} else {
|
||||
|
||||
require(['dialog'], function (dialog) {
|
||||
|
||||
var msg = Globalize.translate('ConfirmMessageScheduledTaskButton');
|
||||
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 menuItems = [];
|
||||
|
||||
confirm({
|
||||
menuItems.push({
|
||||
name: text,
|
||||
id: 'task'
|
||||
});
|
||||
menuItems.push({
|
||||
name: Globalize.translate('ButtonScheduledTasks'),
|
||||
id: 'tasks'
|
||||
});
|
||||
menuItems.push({
|
||||
name: Globalize.translate('ButtonCancel'),
|
||||
id: 'cancel'
|
||||
});
|
||||
|
||||
title: Globalize.translate('HeaderConfirmation'),
|
||||
html: msg,
|
||||
text: Globalize.translate('ConfirmMessageScheduledTaskButton') + "\n\n" + Globalize.translate('ButtonScheduledTasks')
|
||||
dialog({
|
||||
buttons: menuItems,
|
||||
text: msg
|
||||
|
||||
}).then(function () {
|
||||
appStorage.setItem(key, expectedValue);
|
||||
onScheduledTaskMessageConfirmed(id);
|
||||
}).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;
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
|
|
@ -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) {
|
||||
|
||||
|
@ -62,7 +62,8 @@
|
|||
|
||||
var parentId = LibraryMenu.getTopParentId();
|
||||
|
||||
var limit = 6;
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
var limit = screenWidth >= 1600 ? 5 : 6;
|
||||
|
||||
var options = {
|
||||
|
||||
|
|
|
@ -57,7 +57,6 @@
|
|||
"HeaderAvailableServices": "Available Services",
|
||||
"MessageNoServicesInstalled": "No services are currently installed.",
|
||||
"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",
|
||||
"RegisterWithPayPal": "Register with PayPal",
|
||||
"HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial",
|
||||
|
@ -1431,7 +1430,7 @@
|
|||
"ButtonScheduledTasks": "Scheduled tasks",
|
||||
"MessageItemsAdded": "Items added",
|
||||
"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}.",
|
||||
"HeaderWelcomeToProjectServerDashboard": "Welcome to the Emby Server Dashboard",
|
||||
"HeaderWelcomeToProjectWebClient": "Welcome to Emby",
|
||||
|
@ -2141,5 +2140,7 @@
|
|||
"HeaderUpcomingOnTV": "Upcoming On TV",
|
||||
"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.",
|
||||
"ButtonPlayExternalPlayer": "Play with external player"
|
||||
"ButtonPlayExternalPlayer": "Play with external player",
|
||||
"WillRecord": "Will record",
|
||||
"NotScheduledToRecord": "Not scheduled to record"
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue