mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
added a new encoding settings page under advanced
This commit is contained in:
parent
231ed3c315
commit
2704b52493
16 changed files with 267 additions and 136 deletions
11
ApiClient.js
11
ApiClient.js
|
@ -389,6 +389,17 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout, wi
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
self.getLiveTvGuideInfo = function (options) {
|
||||||
|
|
||||||
|
var url = self.getUrl("LiveTv/GuideInfo", options || {});
|
||||||
|
|
||||||
|
return self.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: url,
|
||||||
|
dataType: "json"
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
self.getLiveTvChannel = function (id, userId) {
|
self.getLiveTvChannel = function (id, userId) {
|
||||||
|
|
||||||
if (!id) {
|
if (!id) {
|
||||||
|
|
|
@ -4,14 +4,19 @@
|
||||||
<title>Advanced</title>
|
<title>Advanced</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="advancedConfigurationPage" data-role="page" class="page type-interior">
|
<div id="advancedConfigurationPage" data-role="page" class="page type-interior advancedConfigurationPage">
|
||||||
|
|
||||||
<div data-role="content">
|
<div data-role="content">
|
||||||
<div class="content-primary">
|
<div class="content-primary">
|
||||||
|
|
||||||
|
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
|
||||||
|
<a href="#" data-role="button" class="ui-btn-active">General</a>
|
||||||
|
<a href="encodingsettings.html" data-role="button">Encoding</a>
|
||||||
|
</div>
|
||||||
<form id="advancedConfigurationForm">
|
<form id="advancedConfigurationForm">
|
||||||
|
|
||||||
<ul data-role="listview" class="ulForm">
|
<ul data-role="listview" class="ulForm">
|
||||||
<li id="fldRunAtStartup" style="display:none;">
|
<li id="fldRunAtStartup" style="display: none;">
|
||||||
<input type="checkbox" id="chkRunAtStartup" name="chkRunAtStartup" data-mini="true" />
|
<input type="checkbox" id="chkRunAtStartup" name="chkRunAtStartup" data-mini="true" />
|
||||||
<label for="chkRunAtStartup">Run server at startup</label>
|
<label for="chkRunAtStartup">Run server at startup</label>
|
||||||
<div id="windowsStartupDescription" class="fieldDescription warningFieldDescription" style="display: none;">
|
<div id="windowsStartupDescription" class="fieldDescription warningFieldDescription" style="display: none;">
|
||||||
|
|
|
@ -42,6 +42,9 @@
|
||||||
margin-left: 80px;
|
margin-left: 80px;
|
||||||
border-left: 1px solid #444;
|
border-left: 1px solid #444;
|
||||||
}
|
}
|
||||||
|
.tvProgramCurrentTimeSlot {
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
|
|
||||||
.tvProgramName {
|
.tvProgramName {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
@ -171,11 +174,14 @@
|
||||||
width: 189px;
|
width: 189px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.channelTimeslotHeader {
|
||||||
|
border-right: 1px solid #4971A7;
|
||||||
|
}
|
||||||
|
|
||||||
.channelTimeslotHeader, .timeslotHeader {
|
.channelTimeslotHeader, .timeslotHeader {
|
||||||
background: #1d1d1d;
|
background: #4971A7;
|
||||||
border-bottom: 1px solid #333;
|
border-bottom: 1px solid #4971A7;
|
||||||
border-left: 1px solid #333;
|
border-left: 1px solid #4971A7;
|
||||||
border-top: 1px solid #333;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeslotHeader, .channelTimeslotHeader {
|
.timeslotHeader, .channelTimeslotHeader {
|
||||||
|
@ -212,7 +218,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeslotCell, .timeslotHeader {
|
.timeslotCell, .timeslotHeader {
|
||||||
width: 180px;
|
width: 190px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeslotCellInner {
|
.timeslotCellInner {
|
||||||
|
@ -228,7 +234,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeslotCellInnerWithProgram {
|
.timeslotCellInnerWithProgram {
|
||||||
z-index: 9999;
|
z-index: 99;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timeslotCellInnerWithProgram:hover {
|
.timeslotCellInnerWithProgram:hover {
|
||||||
|
@ -273,8 +279,8 @@
|
||||||
max-width: 60px;
|
max-width: 60px;
|
||||||
max-height: 35px;
|
max-height: 35px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 5px;
|
right: 7px;
|
||||||
top: 5px;
|
top: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 600px) {
|
@media (max-width: 600px) {
|
||||||
|
|
57
dashboard-ui/encodingsettings.html
Normal file
57
dashboard-ui/encodingsettings.html
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Advanced</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="encodingSettingsPage" data-role="page" class="page type-interior advancedConfigurationPage">
|
||||||
|
|
||||||
|
<div data-role="content">
|
||||||
|
<div class="content-primary">
|
||||||
|
|
||||||
|
<div data-role="controlgroup" data-type="horizontal" class="localnav" data-mini="true">
|
||||||
|
<a href="advanced.html" data-role="button">General</a>
|
||||||
|
<a href="#" data-role="button" class="ui-btn-active">Encoding</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form class="encodingSettingsForm">
|
||||||
|
|
||||||
|
<fieldset data-role="controlgroup">
|
||||||
|
<legend>Transcoder Quality:</legend>
|
||||||
|
<input type="radio" name="radioEncodingQuality" class="radioEncodingQuality" id="radioAuto" value="Auto">
|
||||||
|
<label for="radioAuto">Auto<br /><span style="font-weight:normal;">The transcoder will decide quality itself.</span></label>
|
||||||
|
<input type="radio" name="radioEncodingQuality" class="radioEncodingQuality" id="radioHighSpeed" value="HighSpeed">
|
||||||
|
<label for="radioHighSpeed">Perfer higher speed encoding<br /><span style="font-weight:normal;">Lower quality, but faster transcodes</span></label>
|
||||||
|
<input type="radio" name="radioEncodingQuality" class="radioEncodingQuality" id="radioHighQuality" value="HighQuality">
|
||||||
|
<label for="radioHighQuality">Prefer higher quality encoding<br /><span style="font-weight:normal;">Higher quality, but slower transcodes</span></label>
|
||||||
|
<input type="radio" name="radioEncodingQuality" class="radioEncodingQuality" id="radioMaxQuality" value="MaxQuality">
|
||||||
|
<label for="radioMaxQuality">Perfer max quality encoding<br /><span style="font-weight:normal;">Best quality with slower transcodes and high CPU usage</span></label>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<ul data-role="listview" class="ulForm">
|
||||||
|
<li>
|
||||||
|
<input type="checkbox" id="chkEnableDebugEncodingLogging" name="chkEnableDebugEncodingLogging" data-mini="true" />
|
||||||
|
<label for="chkEnableDebugEncodingLogging">Enable debug encoding logging</label>
|
||||||
|
<div class="fieldDescription">This will create very large log files and is only recommended as needed for troubleshooting purposes.</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<button type="submit" data-theme="b" data-icon="check" data-mini="true">
|
||||||
|
Save
|
||||||
|
</button>
|
||||||
|
<button type="button" onclick="Dashboard.navigate('dashboard.html');" data-icon="delete" data-mini="true">
|
||||||
|
Cancel
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$('.encodingSettingsForm').off('submit', EncodingSettingsPage.onSubmit).on('submit', EncodingSettingsPage.onSubmit);
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -23,7 +23,6 @@
|
||||||
<p style="margin: 1.5em 0;">
|
<p style="margin: 1.5em 0;">
|
||||||
<span class="userDataIcons"></span>
|
<span class="userDataIcons"></span>
|
||||||
</p>
|
</p>
|
||||||
<p class="currentProgram"></p>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<select id="selectDate" data-mini="true" data-icon="calendar">
|
<select id="selectDate" data-mini="true" data-icon="calendar" data-inline="true">
|
||||||
<option>Today</option>
|
<option>Today</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
50
dashboard-ui/scripts/encodingsettings.js
Normal file
50
dashboard-ui/scripts/encodingsettings.js
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
(function ($, document, window) {
|
||||||
|
|
||||||
|
function loadPage(page, config) {
|
||||||
|
|
||||||
|
$('#chkEnableDebugEncodingLogging', page).checked(config.EnableDebugEncodingLogging).checkboxradio('refresh');
|
||||||
|
|
||||||
|
$('.radioEncodingQuality', page).each(function() {
|
||||||
|
|
||||||
|
this.checked = config.MediaEncodingQuality == this.value;
|
||||||
|
|
||||||
|
}).checkboxradio('refresh');
|
||||||
|
|
||||||
|
Dashboard.hideLoadingMsg();
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).on('pageshow', "#encodingSettingsPage", function () {
|
||||||
|
|
||||||
|
Dashboard.showLoadingMsg();
|
||||||
|
|
||||||
|
var page = this;
|
||||||
|
|
||||||
|
ApiClient.getServerConfiguration().done(function(config) {
|
||||||
|
|
||||||
|
loadPage(page, config);
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
window.EncodingSettingsPage = {
|
||||||
|
|
||||||
|
onSubmit: function () {
|
||||||
|
|
||||||
|
Dashboard.showLoadingMsg();
|
||||||
|
|
||||||
|
var form = this;
|
||||||
|
|
||||||
|
ApiClient.getServerConfiguration().done(function (config) {
|
||||||
|
|
||||||
|
config.EnableDebugEncodingLogging = $('#chkEnableDebugEncodingLogging', form).checked();
|
||||||
|
config.MediaEncodingQuality = $('.radioEncodingQuality:checked', form).val();
|
||||||
|
|
||||||
|
ApiClient.updateServerConfiguration(config).done(Dashboard.processServerConfigurationUpdateResult);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Disable default form submission
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery, document, window);
|
|
@ -853,7 +853,7 @@
|
||||||
background = defaultBackground;
|
background = defaultBackground;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (item.Type == "Recording" || item.Type == "Program") {
|
else if (item.Type == "Recording" || item.Type == "Program" || item.Type == "Channel") {
|
||||||
|
|
||||||
if (item.Name && options.showTitle) {
|
if (item.Name && options.showTitle) {
|
||||||
imgUrl = 'css/images/items/list/collection.png';
|
imgUrl = 'css/images/items/list/collection.png';
|
||||||
|
@ -1098,6 +1098,9 @@
|
||||||
|
|
||||||
var name = item.EpisodeTitle || item.Name;
|
var name = item.EpisodeTitle || item.Name;
|
||||||
|
|
||||||
|
if (item.Type == "Channel") {
|
||||||
|
return item.Number + ' ' + name;
|
||||||
|
}
|
||||||
if (displayAsSpecial && item.Type == "Episode" && item.ParentIndexNumber == 0) {
|
if (displayAsSpecial && item.Type == "Episode" && item.ParentIndexNumber == 0) {
|
||||||
|
|
||||||
name = "Special - " + name;
|
name = "Special - " + name;
|
||||||
|
@ -1155,6 +1158,9 @@
|
||||||
|
|
||||||
getPlayedIndicatorHtml: function (item) {
|
getPlayedIndicatorHtml: function (item) {
|
||||||
|
|
||||||
|
if (item.Type == "Channel") {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
if (item.Type == "Series" || item.Type == "Season" || item.Type == "BoxSet" || item.MediaType == "Video") {
|
if (item.Type == "Series" || item.Type == "Season" || item.Type == "BoxSet" || item.MediaType == "Video") {
|
||||||
if (item.RecursiveUnplayedItemCount) {
|
if (item.RecursiveUnplayedItemCount) {
|
||||||
return '<div class="unplayedIndicator">' + item.RecursiveUnplayedItemCount + '</div>';
|
return '<div class="unplayedIndicator">' + item.RecursiveUnplayedItemCount + '</div>';
|
||||||
|
|
|
@ -9,21 +9,16 @@
|
||||||
|
|
||||||
var currentIndexValue;
|
var currentIndexValue;
|
||||||
|
|
||||||
|
var now = new Date();
|
||||||
|
|
||||||
for (var i = 0, length = result.Items.length; i < length; i++) {
|
for (var i = 0, length = result.Items.length; i < length; i++) {
|
||||||
|
|
||||||
var program = result.Items[i];
|
var program = result.Items[i];
|
||||||
|
|
||||||
var startDate = program.StartDate;
|
var startDate = parseISO8601Date(program.StartDate, { toLocal: true });
|
||||||
var startDateText = '';
|
var startDateText = LibraryBrowser.getFutureDateText(startDate);
|
||||||
|
|
||||||
try {
|
var endDate = parseISO8601Date(program.EndDate, { toLocal: true });
|
||||||
|
|
||||||
startDate = parseISO8601Date(startDate, { toLocal: true });
|
|
||||||
startDateText = LibraryBrowser.getFutureDateText(startDate);
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startDateText != currentIndexValue) {
|
if (startDateText != currentIndexValue) {
|
||||||
|
|
||||||
|
@ -33,11 +28,17 @@
|
||||||
|
|
||||||
html += '<a href="livetvprogram.html?id=' + program.Id + '" class="tvProgram">';
|
html += '<a href="livetvprogram.html?id=' + program.Id + '" class="tvProgram">';
|
||||||
|
|
||||||
html += '<div class="tvProgramTimeSlot">';
|
var cssClass = "tvProgramTimeSlot";
|
||||||
|
|
||||||
|
if (now >= startDate && now < endDate) {
|
||||||
|
cssClass += " tvProgramCurrentTimeSlot";
|
||||||
|
}
|
||||||
|
|
||||||
|
html += '<div class="' + cssClass + '">';
|
||||||
html += '<div class="tvProgramTimeSlotInner">' + LiveTvHelpers.getDisplayTime(startDate) + '</div>';
|
html += '<div class="tvProgramTimeSlotInner">' + LiveTvHelpers.getDisplayTime(startDate) + '</div>';
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
|
|
||||||
var cssClass = "tvProgramInfo";
|
cssClass = "tvProgramInfo";
|
||||||
|
|
||||||
if (program.IsKids) {
|
if (program.IsKids) {
|
||||||
cssClass += " childProgramInfo";
|
cssClass += " childProgramInfo";
|
||||||
|
@ -54,7 +55,12 @@
|
||||||
|
|
||||||
html += '<div class="' + cssClass + '">';
|
html += '<div class="' + cssClass + '">';
|
||||||
|
|
||||||
html += '<div class="tvProgramName">' + program.Name + '</div>';
|
var name = program.Name;
|
||||||
|
|
||||||
|
if (program.IsRepeat) {
|
||||||
|
name += " (R)";
|
||||||
|
}
|
||||||
|
html += '<div class="tvProgramName">' + name + '</div>';
|
||||||
|
|
||||||
html += '<div class="tvProgramTime">';
|
html += '<div class="tvProgramTime">';
|
||||||
|
|
||||||
|
@ -157,12 +163,6 @@
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (item.CurrentProgram) {
|
|
||||||
$('.currentProgram', page).html('Now playing: <a href="livetvprogram.html?id=' + item.CurrentProgram.Id + '">' + item.CurrentProgram.Name + '</a>').trigger('create');
|
|
||||||
} else {
|
|
||||||
$('.currentProgram', page).html('');
|
|
||||||
}
|
|
||||||
|
|
||||||
loadPrograms(page);
|
loadPrograms(page);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,59 +1,13 @@
|
||||||
(function ($, document, apiClient) {
|
(function ($, document, apiClient) {
|
||||||
|
|
||||||
function getChannelHtml(channel) {
|
|
||||||
|
|
||||||
var html = '';
|
|
||||||
|
|
||||||
html += '<a class="backdropTileItem tileItem" href="livetvchannel.html?id=' + channel.Id + '">';
|
|
||||||
|
|
||||||
var imgUrl;
|
|
||||||
var isDefault;
|
|
||||||
|
|
||||||
if (channel.ImageTags.Primary) {
|
|
||||||
|
|
||||||
|
|
||||||
imgUrl = apiClient.getUrl("LiveTV/Channels/" + channel.Id + "/Images/Primary", {
|
|
||||||
|
|
||||||
tag: channel.ImageTags.Primary,
|
|
||||||
height: 300
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
imgUrl = "css/images/items/list/collection.png";
|
|
||||||
isDefault = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cssClass = isDefault ? "tileImage defaultTileImage" : "tileImage";
|
|
||||||
|
|
||||||
html += '<div class="' + cssClass + '" style="background-image: url(\'' + imgUrl + '\');"></div>';
|
|
||||||
|
|
||||||
|
|
||||||
html += '<div class="tileContent">';
|
|
||||||
|
|
||||||
html += '<div class="tileName">' + channel.Number + ' ' + channel.Name + '</div>';
|
|
||||||
|
|
||||||
html += '<p class="userDataIcons">' + LibraryBrowser.getUserDataIconsHtml(channel) + '</p>';
|
|
||||||
|
|
||||||
html += '</div>';
|
|
||||||
|
|
||||||
html += "</a>";
|
|
||||||
|
|
||||||
return html;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getChannelsHtml(channels) {
|
function getChannelsHtml(channels) {
|
||||||
|
|
||||||
var html = [];
|
return LibraryBrowser.getPosterViewHtml({
|
||||||
|
items: channels,
|
||||||
for (var i = 0, length = channels.length; i < length; i++) {
|
useAverageAspectRatio: true,
|
||||||
|
shape: "backdrop",
|
||||||
html.push(getChannelHtml(channels[i]));
|
centerText: true
|
||||||
}
|
});
|
||||||
|
|
||||||
return html.join('');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderChannels(page, channels) {
|
function renderChannels(page, channels) {
|
||||||
|
|
|
@ -7,19 +7,10 @@
|
||||||
var gridLocalStartDateMs;
|
var gridLocalStartDateMs;
|
||||||
var gridLocalEndDateMs;
|
var gridLocalEndDateMs;
|
||||||
|
|
||||||
function formatDigit(i) {
|
var currentDate;
|
||||||
return i < 10 ? "0" + i : i;
|
var channelsPromise;
|
||||||
}
|
|
||||||
|
|
||||||
function getDateFormat(date) {
|
var guideInfoPromise;
|
||||||
|
|
||||||
// yyyyMMddHHmmss
|
|
||||||
// Convert to UTC
|
|
||||||
// http://stackoverflow.com/questions/948532/how-do-you-convert-a-javascript-date-to-utc/14610512#14610512
|
|
||||||
var d = new Date(date.getTime());
|
|
||||||
|
|
||||||
return "" + d.getFullYear() + formatDigit(d.getMonth() + 1) + formatDigit(d.getDate()) + formatDigit(d.getHours()) + formatDigit(d.getMinutes()) + formatDigit(d.getSeconds());
|
|
||||||
}
|
|
||||||
|
|
||||||
function normalizeDateToTimeslot(date) {
|
function normalizeDateToTimeslot(date) {
|
||||||
|
|
||||||
|
@ -37,11 +28,10 @@
|
||||||
return date;
|
return date;
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentDate;
|
|
||||||
var channelsPromise;
|
|
||||||
|
|
||||||
function reloadGuide(page) {
|
function reloadGuide(page) {
|
||||||
|
|
||||||
|
Dashboard.showLoadingMsg();
|
||||||
|
|
||||||
channelsPromise = channelsPromise || apiClient.getLiveTvChannels({
|
channelsPromise = channelsPromise || apiClient.getLiveTvChannels({
|
||||||
|
|
||||||
userId: Dashboard.getCurrentUserId()
|
userId: Dashboard.getCurrentUserId()
|
||||||
|
@ -51,14 +41,15 @@
|
||||||
var date = currentDate;
|
var date = currentDate;
|
||||||
|
|
||||||
var nextDay = new Date(date.getTime());
|
var nextDay = new Date(date.getTime());
|
||||||
nextDay.setDate(nextDay.getDate() + 2);
|
nextDay.setHours(0, 0, 0, 0);
|
||||||
nextDay.setHours(1, 0, 0, 0);
|
nextDay.setDate(nextDay.getDate() + 1);
|
||||||
|
|
||||||
var promise1 = channelsPromise;
|
var promise1 = channelsPromise;
|
||||||
var promise2 = apiClient.getLiveTvPrograms({
|
var promise2 = apiClient.getLiveTvPrograms({
|
||||||
|
|
||||||
UserId: Dashboard.getCurrentUserId(),
|
UserId: Dashboard.getCurrentUserId(),
|
||||||
MaxStartDate: getDateFormat(nextDay)
|
MaxStartDate: nextDay.toISOString(),
|
||||||
|
MinEndDate: date.toISOString()
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -68,6 +59,8 @@
|
||||||
var programs = response2[0].Items;
|
var programs = response2[0].Items;
|
||||||
|
|
||||||
renderGuide(page, date, channels, programs);
|
renderGuide(page, date, channels, programs);
|
||||||
|
|
||||||
|
Dashboard.hideLoadingMsg();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -231,6 +224,10 @@
|
||||||
|
|
||||||
html += '<div class="guideProgramName">';
|
html += '<div class="guideProgramName">';
|
||||||
html += program.Name;
|
html += program.Name;
|
||||||
|
|
||||||
|
if (program.IsRepeat) {
|
||||||
|
html += ' (R)';
|
||||||
|
}
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
|
|
||||||
html += '<div class="guideProgramTime">';
|
html += '<div class="guideProgramTime">';
|
||||||
|
@ -339,20 +336,9 @@
|
||||||
$('.timeslotHeaders', page).scrollLeft(grid.scrollLeft());
|
$('.timeslotHeaders', page).scrollLeft(grid.scrollLeft());
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).on('pageinit', "#liveTvGuidePage", function () {
|
function changeDate(page, date) {
|
||||||
|
|
||||||
var page = this;
|
currentDate = normalizeDateToTimeslot(date);
|
||||||
|
|
||||||
$('.programGrid', page).on('scroll', function () {
|
|
||||||
|
|
||||||
onProgramGridScroll(page, this);
|
|
||||||
});
|
|
||||||
|
|
||||||
}).on('pagebeforeshow', "#liveTvGuidePage", function () {
|
|
||||||
|
|
||||||
var page = this;
|
|
||||||
|
|
||||||
currentDate = normalizeDateToTimeslot(new Date());
|
|
||||||
|
|
||||||
gridLocalStartDateMs = currentDate.getTime();
|
gridLocalStartDateMs = currentDate.getTime();
|
||||||
|
|
||||||
|
@ -362,6 +348,71 @@
|
||||||
gridLocalEndDateMs = clone.getTime() - 1;
|
gridLocalEndDateMs = clone.getTime() - 1;
|
||||||
|
|
||||||
reloadGuide(page);
|
reloadGuide(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDateRange(page, guideInfo) {
|
||||||
|
|
||||||
|
var today = new Date();
|
||||||
|
today.setHours(today.getHours(), 0, 0, 0);
|
||||||
|
|
||||||
|
var start = parseISO8601Date(guideInfo.StartDate, { toLocal: true });
|
||||||
|
var end = parseISO8601Date(guideInfo.EndDate, { toLocal: true });
|
||||||
|
|
||||||
|
start.setHours(0, 0, 0, 0);
|
||||||
|
end.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
|
start = new Date(Math.max(today, start));
|
||||||
|
|
||||||
|
var html = '';
|
||||||
|
|
||||||
|
while (start <= end) {
|
||||||
|
|
||||||
|
|
||||||
|
html += '<option value="' + start.getTime() + '">' + LibraryBrowser.getFutureDateText(start) + '</option>';
|
||||||
|
|
||||||
|
start.setDate(start.getDate() + 1);
|
||||||
|
start.setHours(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
var elem = $('#selectDate', page).html(html).selectmenu('refresh');
|
||||||
|
|
||||||
|
if (currentDate) {
|
||||||
|
elem.val(currentDate.getTime()).selectmenu('refresh');
|
||||||
|
}
|
||||||
|
|
||||||
|
var val = elem.val();
|
||||||
|
var date = new Date();
|
||||||
|
date.setTime(parseInt(val));
|
||||||
|
|
||||||
|
changeDate(page, date);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).on('pageinit', "#liveTvGuidePage", function () {
|
||||||
|
|
||||||
|
var page = this;
|
||||||
|
|
||||||
|
$('.programGrid', page).on('scroll', function () {
|
||||||
|
|
||||||
|
onProgramGridScroll(page, this);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#selectDate', page).on('change', function() {
|
||||||
|
|
||||||
|
var date = new Date();
|
||||||
|
date.setTime(parseInt(this.value));
|
||||||
|
|
||||||
|
changeDate(page, date);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}).on('pagebeforeshow', "#liveTvGuidePage", function () {
|
||||||
|
|
||||||
|
var page = this;
|
||||||
|
|
||||||
|
apiClient.getLiveTvGuideInfo().done(function (guideInfo) {
|
||||||
|
|
||||||
|
setDateRange(page, guideInfo);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
})(jQuery, document, ApiClient);
|
})(jQuery, document, ApiClient);
|
|
@ -12,6 +12,10 @@
|
||||||
currentItem = item;
|
currentItem = item;
|
||||||
|
|
||||||
var name = item.Name;
|
var name = item.Name;
|
||||||
|
|
||||||
|
if (item.IsRepeat) {
|
||||||
|
name += ' (R)';
|
||||||
|
}
|
||||||
|
|
||||||
$('#itemImage', page).html(LibraryBrowser.getDetailImageHtml(item));
|
$('#itemImage', page).html(LibraryBrowser.getDetailImageHtml(item));
|
||||||
|
|
||||||
|
@ -44,7 +48,11 @@
|
||||||
ApiClient.sendWebSocketMessage("Context", vals.join('|'));
|
ApiClient.sendWebSocketMessage("Context", vals.join('|'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#recordButtonContainer', page).show();
|
if (!item.TimerId && !item.SeriesTimerId) {
|
||||||
|
$('#recordButtonContainer', page).show();
|
||||||
|
} else {
|
||||||
|
$('#recordButtonContainer', page).hide();
|
||||||
|
}
|
||||||
|
|
||||||
if (MediaPlayer.canPlay(item)) {
|
if (MediaPlayer.canPlay(item)) {
|
||||||
$('#playButtonContainer', page).show();
|
$('#playButtonContainer', page).show();
|
||||||
|
|
|
@ -90,9 +90,7 @@
|
||||||
LibraryBrowser.loadSavedQueryValues('episodes', query);
|
LibraryBrowser.loadSavedQueryValues('episodes', query);
|
||||||
|
|
||||||
var groupId = getParameterByName('groupid');
|
var groupId = getParameterByName('groupid');
|
||||||
if (groupId) {
|
query.GroupId = groupId;
|
||||||
query.GroupId = groupId;
|
|
||||||
}
|
|
||||||
|
|
||||||
reloadItems(page);
|
reloadItems(page);
|
||||||
|
|
||||||
|
|
|
@ -766,7 +766,7 @@ var Dashboard = {
|
||||||
name: "Advanced",
|
name: "Advanced",
|
||||||
divider: true,
|
divider: true,
|
||||||
href: "advanced.html",
|
href: "advanced.html",
|
||||||
selected: pageElem.id == "advancedConfigurationPage"
|
selected: page.hasClass("advancedConfigurationPage")
|
||||||
}, {
|
}, {
|
||||||
name: "Scheduled Tasks",
|
name: "Scheduled Tasks",
|
||||||
href: "scheduledtasks.html",
|
href: "scheduledtasks.html",
|
||||||
|
|
|
@ -1,19 +1,5 @@
|
||||||
(function ($, document) {
|
(function ($, document) {
|
||||||
|
|
||||||
function formatDigit(i) {
|
|
||||||
return i < 10 ? "0" + i : i;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDateFormat(date) {
|
|
||||||
|
|
||||||
// yyyyMMddHHmmss
|
|
||||||
// Convert to UTC
|
|
||||||
// http://stackoverflow.com/questions/948532/how-do-you-convert-a-javascript-date-to-utc/14610512#14610512
|
|
||||||
var d = new Date(date.getTime());
|
|
||||||
|
|
||||||
return "" + d.getFullYear() + formatDigit(d.getMonth() + 1) + formatDigit(d.getDate()) + formatDigit(d.getHours()) + formatDigit(d.getMinutes()) + formatDigit(d.getSeconds());
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document).on('pagebeforeshow', "#tvUpcomingPage", function () {
|
$(document).on('pagebeforeshow', "#tvUpcomingPage", function () {
|
||||||
|
|
||||||
var page = this;
|
var page = this;
|
||||||
|
@ -39,7 +25,7 @@
|
||||||
yesterday.setDate(yesterday.getDate() - 1);
|
yesterday.setDate(yesterday.getDate() - 1);
|
||||||
yesterday.setHours(0, 0, 0, 0);
|
yesterday.setHours(0, 0, 0, 0);
|
||||||
|
|
||||||
missedItemsQuery.MinPremiereDate = getDateFormat(yesterday);
|
missedItemsQuery.MinPremiereDate = yesterday.toISOString();
|
||||||
|
|
||||||
var unairedQuery = $.extend({
|
var unairedQuery = $.extend({
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.218" targetFramework="net45" />
|
<package id="MediaBrowser.ApiClient.Javascript" version="3.0.219" targetFramework="net45" />
|
||||||
</packages>
|
</packages>
|
Loading…
Add table
Add a link
Reference in a new issue