mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
start a dashboard folder
This commit is contained in:
parent
bcd2bd0f52
commit
c043164de5
26 changed files with 182 additions and 95 deletions
|
@ -1,14 +0,0 @@
|
|||
define([], function () {
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
var self = this;
|
||||
|
||||
view.addEventListener('viewbeforeshow', function (e) {
|
||||
|
||||
var elem = view.querySelector('#appVersionNumber');
|
||||
|
||||
elem.innerHTML = elem.innerHTML.replace('{0}', ConnectionManager.appVersion());
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,400 +0,0 @@
|
|||
define(['serverNotifications', 'events', 'scripts/taskbutton', 'datetime', 'paper-icon-button-light'], function (serverNotifications, events, taskButton, datetime) {
|
||||
|
||||
var query = {
|
||||
|
||||
StartIndex: 0,
|
||||
Limit: 50
|
||||
};
|
||||
|
||||
var currentResult;
|
||||
var page;
|
||||
|
||||
function parentWithClass(elem, className) {
|
||||
|
||||
while (!elem.classList || !elem.classList.contains(className)) {
|
||||
elem = elem.parentNode;
|
||||
|
||||
if (!elem) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return elem;
|
||||
}
|
||||
|
||||
function showStatusMessage(id) {
|
||||
|
||||
var item = currentResult.Items.filter(function (i) {
|
||||
|
||||
return i.Id == id;
|
||||
})[0];
|
||||
|
||||
Dashboard.alert({
|
||||
|
||||
title: getStatusText(item, false),
|
||||
message: item.StatusMessage
|
||||
});
|
||||
}
|
||||
|
||||
function deleteOriginalFile(page, id) {
|
||||
|
||||
var item = currentResult.Items.filter(function (i) {
|
||||
|
||||
return i.Id == id;
|
||||
})[0];
|
||||
|
||||
var message = Globalize.translate('MessageFileWillBeDeleted') + '<br/><br/>' + item.OriginalPath + '<br/><br/>' + Globalize.translate('MessageSureYouWishToProceed');
|
||||
|
||||
require(['confirm'], function (confirm) {
|
||||
|
||||
confirm(message, Globalize.translate('HeaderDeleteFile')).then(function () {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
ApiClient.deleteOriginalFileFromOrganizationResult(id).then(function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
reloadItems(page, true);
|
||||
|
||||
}, Dashboard.processErrorResponse);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function organizeFileWithCorrections(page, item) {
|
||||
|
||||
showCorrectionPopup(page, item);
|
||||
}
|
||||
|
||||
function showCorrectionPopup(page, item) {
|
||||
|
||||
require(['components/fileorganizer/fileorganizer'], function (fileorganizer) {
|
||||
|
||||
fileorganizer.show(item).then(function () {
|
||||
reloadItems(page, false);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function organizeFile(page, id) {
|
||||
|
||||
var item = currentResult.Items.filter(function (i) {
|
||||
|
||||
return i.Id == id;
|
||||
})[0];
|
||||
|
||||
if (!item.TargetPath) {
|
||||
|
||||
if (item.Type == "Episode") {
|
||||
organizeFileWithCorrections(page, item);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var message = Globalize.translate('MessageFollowingFileWillBeMovedFrom') + '<br/><br/>' + item.OriginalPath + '<br/><br/>' + Globalize.translate('MessageDestinationTo') + '<br/><br/>' + item.TargetPath;
|
||||
|
||||
if (item.DuplicatePaths.length) {
|
||||
message += '<br/><br/>' + Globalize.translate('MessageDuplicatesWillBeDeleted');
|
||||
|
||||
message += '<br/><br/>' + item.DuplicatePaths.join('<br/>');
|
||||
}
|
||||
|
||||
message += '<br/><br/>' + Globalize.translate('MessageSureYouWishToProceed');
|
||||
|
||||
require(['confirm'], function (confirm) {
|
||||
|
||||
confirm(message, Globalize.translate('HeaderOrganizeFile')).then(function () {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
ApiClient.performOrganization(id).then(function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
reloadItems(page, true);
|
||||
|
||||
}, Dashboard.processErrorResponse);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function reloadItems(page, showSpinner) {
|
||||
|
||||
if (showSpinner) {
|
||||
Dashboard.showLoadingMsg();
|
||||
}
|
||||
|
||||
ApiClient.getFileOrganizationResults(query).then(function (result) {
|
||||
|
||||
currentResult = result;
|
||||
renderResults(page, result);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}, Dashboard.processErrorResponse);
|
||||
}
|
||||
|
||||
function getStatusText(item, enhance) {
|
||||
|
||||
var status = item.Status;
|
||||
|
||||
var color = null;
|
||||
|
||||
if (status == 'SkippedExisting') {
|
||||
status = Globalize.translate('StatusSkipped');
|
||||
}
|
||||
else if (status == 'Failure') {
|
||||
color = '#cc0000';
|
||||
status = Globalize.translate('StatusFailed');
|
||||
}
|
||||
if (status == 'Success') {
|
||||
color = 'green';
|
||||
status = Globalize.translate('StatusSuccess');
|
||||
}
|
||||
|
||||
if (enhance) {
|
||||
|
||||
if (item.StatusMessage) {
|
||||
|
||||
return '<a style="color:' + color + ';" data-resultid="' + item.Id + '" href="#" class="btnShowStatusMessage">' + status + '</a>';
|
||||
} else {
|
||||
return '<span data-resultid="' + item.Id + '" style="color:' + color + ';">' + status + '</span>';
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
function renderResults(page, result) {
|
||||
|
||||
var rows = result.Items.map(function (item) {
|
||||
|
||||
var html = '';
|
||||
|
||||
html += '<tr id="row' + item.Id + '">';
|
||||
|
||||
html += renderItemRow(item);
|
||||
|
||||
html += '</tr>';
|
||||
|
||||
return html;
|
||||
}).join('');
|
||||
|
||||
var resultBody = page.querySelector('.resultBody');
|
||||
resultBody.innerHTML = rows;
|
||||
|
||||
resultBody.addEventListener('click', handleItemClick);
|
||||
|
||||
var pagingHtml = LibraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
limit: query.Limit,
|
||||
totalRecordCount: result.TotalRecordCount,
|
||||
showLimit: false,
|
||||
updatePageSizeSetting: false
|
||||
});
|
||||
|
||||
var topPaging = page.querySelector('.listTopPaging');
|
||||
topPaging.innerHTML = pagingHtml;
|
||||
|
||||
var bottomPaging = page.querySelector('.listBottomPaging');
|
||||
bottomPaging.innerHTML = pagingHtml;
|
||||
|
||||
var btnNextTop = topPaging.querySelector(".btnNextPage");
|
||||
var btnNextBottom = bottomPaging.querySelector(".btnNextPage");
|
||||
var btnPrevTop = topPaging.querySelector(".btnPreviousPage");
|
||||
var btnPrevBottom = bottomPaging.querySelector(".btnPreviousPage");
|
||||
|
||||
btnNextTop.addEventListener('click', function () {
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(page, true);
|
||||
});
|
||||
|
||||
btnNextBottom.addEventListener('click', function () {
|
||||
query.StartIndex += query.Limit;
|
||||
reloadItems(page, true);
|
||||
});
|
||||
|
||||
btnPrevTop.addEventListener('click', function () {
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(page, true);
|
||||
});
|
||||
|
||||
btnPrevBottom.addEventListener('click', function () {
|
||||
query.StartIndex -= query.Limit;
|
||||
reloadItems(page, true);
|
||||
});
|
||||
|
||||
var btnClearLog = page.querySelector('.btnClearLog');
|
||||
|
||||
if (result.TotalRecordCount) {
|
||||
btnClearLog.classList.remove('hide');
|
||||
} else {
|
||||
btnClearLog.classList.add('hide');
|
||||
}
|
||||
}
|
||||
|
||||
function renderItemRow(item) {
|
||||
|
||||
var html = '';
|
||||
|
||||
html += '<td>';
|
||||
var hide = item.IsInProgress ? '' : ' hide';
|
||||
html += '<img src="css/images/throbber.gif" alt="" class="syncSpinner' + hide + '" style="vertical-align: middle;" />';
|
||||
html += '</td>';
|
||||
|
||||
html += '<td data-title="Date">';
|
||||
var date = datetime.parseISO8601Date(item.Date, true);
|
||||
html += date.toLocaleDateString();
|
||||
html += '</td>';
|
||||
|
||||
html += '<td data-title="Source" class="fileCell">';
|
||||
var status = item.Status;
|
||||
|
||||
if (item.IsInProgress) {
|
||||
html += '<span style="color:darkorange;">';
|
||||
html += item.OriginalFileName;
|
||||
html += '</span>';
|
||||
}
|
||||
else if (status == 'SkippedExisting') {
|
||||
html += '<a data-resultid="' + item.Id + '" style="color:blue;" href="#" class="btnShowStatusMessage">';
|
||||
html += item.OriginalFileName;
|
||||
html += '</a>';
|
||||
}
|
||||
else if (status == 'Failure') {
|
||||
html += '<a data-resultid="' + item.Id + '" style="color:red;" href="#" class="btnShowStatusMessage">';
|
||||
html += item.OriginalFileName;
|
||||
html += '</a>';
|
||||
} else {
|
||||
html += '<span style="color:green;">';
|
||||
html += item.OriginalFileName;
|
||||
html += '</span>';
|
||||
}
|
||||
html += '</td>';
|
||||
|
||||
html += '<td data-title="Destination" class="fileCell">';
|
||||
html += item.TargetPath || '';
|
||||
html += '</td>';
|
||||
|
||||
html += '<td class="organizerButtonCell">';
|
||||
|
||||
if (item.Status != 'Success') {
|
||||
|
||||
html += '<button type="button" is="paper-icon-button-light" data-resultid="' + item.Id + '" class="btnProcessResult organizerButton autoSize" title="' + Globalize.translate('ButtonOrganizeFile') + '"><i class="md-icon">folder</i></button>';
|
||||
html += '<button type="button" is="paper-icon-button-light" data-resultid="' + item.Id + '" class="btnDeleteResult organizerButton autoSize" title="' + Globalize.translate('ButtonDeleteFile') + '"><i class="md-icon">delete</i></button>';
|
||||
}
|
||||
|
||||
html += '</td>';
|
||||
|
||||
return html;
|
||||
}
|
||||
|
||||
function handleItemClick(e) {
|
||||
|
||||
var id;
|
||||
|
||||
var buttonStatus = parentWithClass(e.target, 'btnShowStatusMessage');
|
||||
if (buttonStatus) {
|
||||
|
||||
id = buttonStatus.getAttribute('data-resultid');
|
||||
showStatusMessage(id);
|
||||
}
|
||||
|
||||
var buttonOrganize = parentWithClass(e.target, 'btnProcessResult');
|
||||
if (buttonOrganize) {
|
||||
|
||||
id = buttonOrganize.getAttribute('data-resultid');
|
||||
organizeFile(e.view, id);
|
||||
}
|
||||
|
||||
var buttonDelete = parentWithClass(e.target, 'btnDeleteResult');
|
||||
if (buttonDelete) {
|
||||
|
||||
id = buttonDelete.getAttribute('data-resultid');
|
||||
deleteOriginalFile(e.view, id);
|
||||
}
|
||||
}
|
||||
|
||||
function onServerEvent(e, apiClient, data) {
|
||||
|
||||
if (data) {
|
||||
|
||||
updateItemStatus(page, data);
|
||||
} else {
|
||||
|
||||
reloadItems(page, false);
|
||||
}
|
||||
}
|
||||
|
||||
function updateItemStatus(page, item) {
|
||||
|
||||
var rowId = '#row' + item.Id;
|
||||
var row = page.querySelector(rowId);
|
||||
|
||||
if (row) {
|
||||
|
||||
row.innerHTML = renderItemRow(item);
|
||||
}
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'autoorganizelog.html',
|
||||
name: Globalize.translate('TabActivityLog')
|
||||
},
|
||||
{
|
||||
href: 'autoorganizetv.html',
|
||||
name: Globalize.translate('TabTV')
|
||||
},
|
||||
{
|
||||
href: 'autoorganizesmart.html',
|
||||
name: Globalize.translate('TabSmartMatches')
|
||||
}];
|
||||
}
|
||||
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
page = view;
|
||||
|
||||
var clearButton = view.querySelector('.btnClearLog');
|
||||
clearButton.addEventListener('click', function () {
|
||||
|
||||
ApiClient.clearOrganizationLog().then(function () {
|
||||
reloadItems(view, true);
|
||||
}, Dashboard.processErrorResponse);
|
||||
});
|
||||
|
||||
view.addEventListener('viewshow', function (e) {
|
||||
|
||||
LibraryMenu.setTabs('autoorganize', 0, getTabs);
|
||||
|
||||
reloadItems(view, true);
|
||||
|
||||
events.on(serverNotifications, 'AutoOrganizeUpdate', onServerEvent);
|
||||
|
||||
// on here
|
||||
taskButton({
|
||||
mode: 'on',
|
||||
progressElem: view.querySelector('.organizeProgress'),
|
||||
panel: view.querySelector('.organizeTaskPanel'),
|
||||
taskKey: 'AutoOrganize',
|
||||
button: view.querySelector('.btnOrganize')
|
||||
});
|
||||
});
|
||||
|
||||
view.addEventListener('viewhide', function (e) {
|
||||
|
||||
currentResult = null;
|
||||
|
||||
events.off(serverNotifications, 'AutoOrganizeUpdate', onServerEvent);
|
||||
|
||||
// off here
|
||||
taskButton({
|
||||
mode: 'off',
|
||||
button: view.querySelector('.btnOrganize')
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,177 +0,0 @@
|
|||
define(['listViewStyle'], function () {
|
||||
|
||||
var query = {
|
||||
|
||||
StartIndex: 0,
|
||||
Limit: 100000
|
||||
};
|
||||
|
||||
var currentResult;
|
||||
|
||||
function parentWithClass(elem, className) {
|
||||
|
||||
while (!elem.classList || !elem.classList.contains(className)) {
|
||||
elem = elem.parentNode;
|
||||
|
||||
if (!elem) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return elem;
|
||||
}
|
||||
|
||||
function reloadList(page) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
ApiClient.getSmartMatchInfos(query).then(function (infos) {
|
||||
|
||||
currentResult = infos;
|
||||
|
||||
populateList(page, infos);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
}, function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
});
|
||||
}
|
||||
|
||||
function populateList(page, result) {
|
||||
|
||||
var infos = result.Items;
|
||||
|
||||
if (infos.length > 0) {
|
||||
infos = infos.sort(function (a, b) {
|
||||
|
||||
a = a.OrganizerType + " " + (a.DisplayName || a.ItemName);
|
||||
b = b.OrganizerType + " " + (b.DisplayName || b.ItemName);
|
||||
|
||||
if (a == b) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (a < b) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
});
|
||||
}
|
||||
|
||||
var html = "";
|
||||
|
||||
if (infos.length) {
|
||||
html += '<div class="paperList">';
|
||||
}
|
||||
|
||||
for (var i = 0, length = infos.length; i < length; i++) {
|
||||
|
||||
var info = infos[i];
|
||||
|
||||
html += '<div class="listItem">';
|
||||
|
||||
html += '<div class="listItemIconContainer">';
|
||||
html += '<i class="listItemIcon md-icon">folder</i>';
|
||||
html += '</div>';
|
||||
|
||||
html += '<div class="listItemBody">';
|
||||
html += "<h2 class='listItemBodyText'>" + (info.DisplayName || info.ItemName) + "</h2>";
|
||||
html += '</div>';
|
||||
|
||||
html += '</div>';
|
||||
|
||||
var matchStringIndex = 0;
|
||||
|
||||
html += info.MatchStrings.map(function (m) {
|
||||
|
||||
var matchStringHtml = '';
|
||||
|
||||
matchStringHtml += '<div class="listItem">';
|
||||
|
||||
matchStringHtml += '<div class="listItemBody" style="padding: .1em 1em .4em 5.5em; min-height: 1.5em;">';
|
||||
|
||||
matchStringHtml += "<div class='listItemBodyText secondary'>" + m + "</div>";
|
||||
|
||||
matchStringHtml += '</div>';
|
||||
|
||||
matchStringHtml += '<button type="button" is="emby-button" class="btnDeleteMatchEntry" style="padding: 0;" data-index="' + i + '" data-matchindex="' + matchStringIndex + '" title="' + Globalize.translate('ButtonDelete') + '"><i class="md-icon">delete</i></button>';
|
||||
|
||||
matchStringHtml += '</div>';
|
||||
matchStringIndex++;
|
||||
|
||||
return matchStringHtml;
|
||||
|
||||
}).join('');
|
||||
}
|
||||
|
||||
if (infos.length) {
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
var matchInfos = page.querySelector('.divMatchInfos');
|
||||
matchInfos.innerHTML = html;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'autoorganizelog.html',
|
||||
name: Globalize.translate('TabActivityLog')
|
||||
},
|
||||
{
|
||||
href: 'autoorganizetv.html',
|
||||
name: Globalize.translate('TabTV')
|
||||
},
|
||||
{
|
||||
href: 'autoorganizesmart.html',
|
||||
name: Globalize.translate('TabSmartMatches')
|
||||
}];
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
var self = this;
|
||||
|
||||
var divInfos = view.querySelector('.divMatchInfos');
|
||||
|
||||
divInfos.addEventListener('click', function (e) {
|
||||
|
||||
var button = parentWithClass(e.target, 'btnDeleteMatchEntry');
|
||||
|
||||
if (button) {
|
||||
|
||||
var index = parseInt(button.getAttribute('data-index'));
|
||||
var matchIndex = parseInt(button.getAttribute('data-matchindex'));
|
||||
|
||||
var info = currentResult.Items[index];
|
||||
var entries = [
|
||||
{
|
||||
Name: info.ItemName,
|
||||
Value: info.MatchStrings[matchIndex]
|
||||
}];
|
||||
|
||||
ApiClient.deleteSmartMatchEntries(entries).then(function () {
|
||||
|
||||
reloadList(view);
|
||||
|
||||
}, Dashboard.processErrorResponse);
|
||||
}
|
||||
});
|
||||
|
||||
view.addEventListener('viewshow', function (e) {
|
||||
|
||||
LibraryMenu.setTabs('autoorganize', 2, getTabs);
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
reloadList(view);
|
||||
});
|
||||
|
||||
view.addEventListener('viewhide', function (e) {
|
||||
|
||||
currentResult = null;
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,181 +0,0 @@
|
|||
define([], function () {
|
||||
|
||||
function getEpisodeFileName(value, enableMultiEpisode) {
|
||||
|
||||
var seriesName = "Series Name";
|
||||
var episodeTitle = "Episode Four";
|
||||
|
||||
var result = value.replace('%sn', seriesName)
|
||||
.replace('%s.n', seriesName.replace(' ', '.'))
|
||||
.replace('%s_n', seriesName.replace(' ', '_'))
|
||||
.replace('%s', '1')
|
||||
.replace('%0s', '01')
|
||||
.replace('%00s', '001')
|
||||
.replace('%ext', 'mkv')
|
||||
.replace('%en', episodeTitle)
|
||||
.replace('%e.n', episodeTitle.replace(' ', '.'))
|
||||
.replace('%e_n', episodeTitle.replace(' ', '_'));
|
||||
|
||||
if (enableMultiEpisode) {
|
||||
result = result
|
||||
.replace('%ed', '5')
|
||||
.replace('%0ed', '05')
|
||||
.replace('%00ed', '005');
|
||||
}
|
||||
|
||||
return result
|
||||
.replace('%e', '4')
|
||||
.replace('%0e', '04')
|
||||
.replace('%00e', '004');
|
||||
}
|
||||
|
||||
function loadPage(view, config) {
|
||||
|
||||
var tvOptions = config.TvOptions;
|
||||
|
||||
view.querySelector('#chkEnableTvSorting').checked = tvOptions.IsEnabled;
|
||||
view.querySelector('#chkOverwriteExistingEpisodes').checked = tvOptions.OverwriteExistingEpisodes;
|
||||
view.querySelector('#chkDeleteEmptyFolders').checked = tvOptions.DeleteEmptyFolders;
|
||||
|
||||
view.querySelector('#txtMinFileSize').value = tvOptions.MinFileSizeMb;
|
||||
view.querySelector('#txtSeasonFolderPattern').value = tvOptions.SeasonFolderPattern;
|
||||
view.querySelector('#txtSeasonZeroName').value = tvOptions.SeasonZeroFolderName;
|
||||
view.querySelector('#txtWatchFolder').value = tvOptions.WatchLocations[0] || '';
|
||||
|
||||
view.querySelector('#txtEpisodePattern').value = tvOptions.EpisodeNamePattern;
|
||||
view.querySelector('#txtMultiEpisodePattern').value = tvOptions.MultiEpisodeNamePattern;
|
||||
|
||||
view.querySelector('#txtDeleteLeftOverFiles').value = tvOptions.LeftOverFileExtensionsToDelete.join(';');
|
||||
|
||||
view.querySelector('#copyOrMoveFile').value = tvOptions.CopyOriginalFile.toString();
|
||||
}
|
||||
|
||||
function onSubmit(view) {
|
||||
|
||||
ApiClient.getNamedConfiguration('autoorganize').then(function (config) {
|
||||
|
||||
var tvOptions = config.TvOptions;
|
||||
|
||||
tvOptions.IsEnabled = view.querySelector('#chkEnableTvSorting').checked;
|
||||
tvOptions.OverwriteExistingEpisodes = view.querySelector('#chkOverwriteExistingEpisodes').checked;
|
||||
tvOptions.DeleteEmptyFolders = view.querySelector('#chkDeleteEmptyFolders').checked;
|
||||
|
||||
tvOptions.MinFileSizeMb = view.querySelector('#txtMinFileSize').value;
|
||||
tvOptions.SeasonFolderPattern = view.querySelector('#txtSeasonFolderPattern').value;
|
||||
tvOptions.SeasonZeroFolderName = view.querySelector('#txtSeasonZeroName').value;
|
||||
|
||||
tvOptions.EpisodeNamePattern = view.querySelector('#txtEpisodePattern').value;
|
||||
tvOptions.MultiEpisodeNamePattern = view.querySelector('#txtMultiEpisodePattern').value;
|
||||
|
||||
tvOptions.LeftOverFileExtensionsToDelete = view.querySelector('#txtDeleteLeftOverFiles').value.split(';');
|
||||
|
||||
var watchLocation = view.querySelector('#txtWatchFolder').value;
|
||||
tvOptions.WatchLocations = watchLocation ? [watchLocation] : [];
|
||||
|
||||
tvOptions.CopyOriginalFile = view.querySelector('#copyOrMoveFile').value;
|
||||
|
||||
ApiClient.updateNamedConfiguration('autoorganize', config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse);
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'autoorganizelog.html',
|
||||
name: Globalize.translate('TabActivityLog')
|
||||
},
|
||||
{
|
||||
href: 'autoorganizetv.html',
|
||||
name: Globalize.translate('TabTV')
|
||||
},
|
||||
{
|
||||
href: 'autoorganizesmart.html',
|
||||
name: Globalize.translate('TabSmartMatches')
|
||||
}];
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
|
||||
function updateSeasonPatternHelp() {
|
||||
|
||||
var value = view.querySelector('#txtSeasonFolderPattern').value;
|
||||
value = value.replace('%s', '1').replace('%0s', '01').replace('%00s', '001');
|
||||
|
||||
var replacementHtmlResult = Globalize.translate('OrganizePatternResult').replace('{0}', value);
|
||||
|
||||
view.querySelector('.seasonFolderFieldDescription').innerHTML = replacementHtmlResult;
|
||||
}
|
||||
|
||||
function updateEpisodePatternHelp() {
|
||||
|
||||
var value = view.querySelector('#txtEpisodePattern').value;
|
||||
var fileName = getEpisodeFileName(value, false);
|
||||
|
||||
var replacementHtmlResult = Globalize.translate('OrganizePatternResult').replace('{0}', fileName);
|
||||
|
||||
view.querySelector('.episodePatternDescription').innerHTML = replacementHtmlResult;
|
||||
}
|
||||
|
||||
function updateMultiEpisodePatternHelp() {
|
||||
|
||||
var value = view.querySelector('#txtMultiEpisodePattern').value;
|
||||
var fileName = getEpisodeFileName(value, false);
|
||||
|
||||
var replacementHtmlResult = Globalize.translate('OrganizePatternResult').replace('{0}', fileName);
|
||||
|
||||
view.querySelector('.multiEpisodePatternDescription').innerHTML = replacementHtmlResult;
|
||||
}
|
||||
|
||||
function selectWatchFolder(e) {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
|
||||
view.querySelector('#txtWatchFolder').value = path;
|
||||
}
|
||||
picker.close();
|
||||
},
|
||||
header: Globalize.translate('HeaderSelectWatchFolder'),
|
||||
instruction: Globalize.translate('HeaderSelectWatchFolderHelp')
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
view.querySelector('#txtSeasonFolderPattern').addEventListener('change', updateSeasonPatternHelp);
|
||||
view.querySelector('#txtSeasonFolderPattern').addEventListener('keyup', updateSeasonPatternHelp);
|
||||
view.querySelector('#txtEpisodePattern').addEventListener('change', updateEpisodePatternHelp);
|
||||
view.querySelector('#txtEpisodePattern').addEventListener('keyup', updateEpisodePatternHelp);
|
||||
view.querySelector('#txtMultiEpisodePattern').addEventListener('change', updateMultiEpisodePatternHelp);
|
||||
view.querySelector('#txtMultiEpisodePattern').addEventListener('keyup', updateMultiEpisodePatternHelp);
|
||||
view.querySelector('#btnSelectWatchFolder').addEventListener('click', selectWatchFolder);
|
||||
|
||||
view.querySelector('.libraryFileOrganizerForm').addEventListener('submit', function (e) {
|
||||
|
||||
e.preventDefault();
|
||||
onSubmit(view);
|
||||
return false;
|
||||
});
|
||||
|
||||
view.addEventListener('viewshow', function (e) {
|
||||
|
||||
LibraryMenu.setTabs('autoorganize', 1, getTabs);
|
||||
|
||||
ApiClient.getNamedConfiguration('autoorganize').then(function (config) {
|
||||
loadPage(view, config);
|
||||
updateSeasonPatternHelp();
|
||||
updateEpisodePatternHelp();
|
||||
updateMultiEpisodePatternHelp();
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
95
dashboard-ui/scripts/camerauploadsettings.js
Normal file
95
dashboard-ui/scripts/camerauploadsettings.js
Normal file
|
@ -0,0 +1,95 @@
|
|||
define(['appSettings'], function (appSettings) {
|
||||
|
||||
function loadForm(page, user) {
|
||||
|
||||
var uploadServers = appSettings.cameraUploadServers();
|
||||
|
||||
page.querySelector('.uploadServerList').innerHTML = ConnectionManager.getSavedServers().map(function (s) {
|
||||
|
||||
var checkedHtml = uploadServers.indexOf(s.Id) == -1 ? '' : ' checked';
|
||||
var html = '<label><input type="checkbox" is="emby-checkbox"' + checkedHtml + ' class="chkUploadServer" data-id="' + s.Id + '"/><span>' + s.Name + '</span></label>';
|
||||
|
||||
return html;
|
||||
|
||||
}).join('');
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
function saveUser(page, user) {
|
||||
|
||||
var chkUploadServer = page.querySelectorAll('.chkUploadServer');
|
||||
var cameraUploadServers = [];
|
||||
|
||||
for (var i = 0, length = chkUploadServer.length; i < length; i++) {
|
||||
if (chkUploadServer[i].checked) {
|
||||
cameraUploadServers.push(chkUploadServer[i].getAttribute('data-id'));
|
||||
}
|
||||
}
|
||||
|
||||
appSettings.cameraUploadServers(cameraUploadServers);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
require(['toast'], function (toast) {
|
||||
toast(Globalize.translate('SettingsSaved'));
|
||||
});
|
||||
|
||||
if (cameraUploadServers.length || syncPath) {
|
||||
if (window.MainActivity) {
|
||||
MainActivity.authorizeStorage();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
view.querySelector('form').addEventListener('submit', function (e) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var userId = getParameterByName('userId') || Dashboard.getCurrentUserId();
|
||||
|
||||
ApiClient.getUser(userId).then(function (user) {
|
||||
|
||||
saveUser(view, user);
|
||||
|
||||
});
|
||||
|
||||
// Disable default form submission
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
view.querySelector('#btnSelectSyncPath').addEventListener('click', function () {
|
||||
|
||||
require(['nativedirectorychooser'], function () {
|
||||
NativeDirectoryChooser.chooseDirectory().then(function (path) {
|
||||
|
||||
if (path) {
|
||||
view.querySelector('#txtSyncPath').value = path;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
view.addEventListener('viewshow', function () {
|
||||
var page = this;
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var userId = getParameterByName('userId') || Dashboard.getCurrentUserId();
|
||||
|
||||
ApiClient.getUser(userId).then(function (user) {
|
||||
|
||||
loadForm(page, user);
|
||||
});
|
||||
|
||||
if (AppInfo.supportsSyncPathSetting) {
|
||||
page.querySelector('.fldSyncPath').classList.remove('hide');
|
||||
} else {
|
||||
page.querySelector('.fldSyncPath').classList.add('hide');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
});
|
|
@ -1,147 +0,0 @@
|
|||
define(['jQuery'], function ($) {
|
||||
|
||||
function loadPage(page, config) {
|
||||
|
||||
$('.chkMovies', page).checked(config.EnableIntrosForMovies);
|
||||
$('.chkEpisodes', page).checked(config.EnableIntrosForEpisodes);
|
||||
|
||||
$('.chkMyMovieTrailers', page).checked(config.EnableIntrosFromMoviesInLibrary);
|
||||
|
||||
$('.chkUpcomingTheaterTrailers', page).checked(config.EnableIntrosFromUpcomingTrailers);
|
||||
$('.chkUpcomingDvdTrailers', page).checked(config.EnableIntrosFromUpcomingDvdMovies);
|
||||
$('.chkUpcomingStreamingTrailers', page).checked(config.EnableIntrosFromUpcomingStreamingMovies);
|
||||
$('.chkOtherTrailers', page).checked(config.EnableIntrosFromSimilarMovies);
|
||||
|
||||
$('.chkUnwatchedOnly', page).checked(!config.EnableIntrosForWatchedContent);
|
||||
$('.chkEnableParentalControl', page).checked(config.EnableIntrosParentalControl);
|
||||
|
||||
$('#txtCustomIntrosPath', page).val(config.CustomIntroPath || '');
|
||||
$('#txtCodecIntrosPath', page).val(config.MediaInfoIntroPath || '');
|
||||
$('#txtNumTrailers', page).val(config.TrailerLimit);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var form = this;
|
||||
|
||||
var page = $(form).parents('.page');
|
||||
|
||||
ApiClient.getNamedConfiguration("cinemamode").then(function (config) {
|
||||
|
||||
config.CustomIntroPath = $('#txtCustomIntrosPath', page).val();
|
||||
config.MediaInfoIntroPath = $('#txtCodecIntrosPath', page).val();
|
||||
config.TrailerLimit = $('#txtNumTrailers', page).val();
|
||||
|
||||
config.EnableIntrosForMovies = $('.chkMovies', page).checked();
|
||||
config.EnableIntrosForEpisodes = $('.chkEpisodes', page).checked();
|
||||
config.EnableIntrosFromMoviesInLibrary = $('.chkMyMovieTrailers', page).checked();
|
||||
config.EnableIntrosForWatchedContent = !$('.chkUnwatchedOnly', page).checked();
|
||||
config.EnableIntrosParentalControl = $('.chkEnableParentalControl', page).checked();
|
||||
|
||||
config.EnableIntrosFromUpcomingTrailers = $('.chkUpcomingTheaterTrailers', page).checked();
|
||||
config.EnableIntrosFromUpcomingDvdMovies = $('.chkUpcomingDvdTrailers', page).checked();
|
||||
config.EnableIntrosFromUpcomingStreamingMovies = $('.chkUpcomingStreamingTrailers', page).checked();
|
||||
config.EnableIntrosFromSimilarMovies = $('.chkOtherTrailers', page).checked();
|
||||
|
||||
ApiClient.updateNamedConfiguration("cinemamode", config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
|
||||
// Disable default form submission
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'cinemamodeconfiguration.html',
|
||||
name: Globalize.translate('TabCinemaMode')
|
||||
},
|
||||
{
|
||||
href: 'playbackconfiguration.html',
|
||||
name: Globalize.translate('TabResumeSettings')
|
||||
},
|
||||
{
|
||||
href: 'streamingsettings.html',
|
||||
name: Globalize.translate('TabStreaming')
|
||||
},
|
||||
{
|
||||
href: 'encodingsettings.html',
|
||||
name: Globalize.translate('TabTranscoding')
|
||||
}];
|
||||
}
|
||||
|
||||
$(document).on('pageinit', "#cinemaModeConfigurationPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
$('#btnSelectCustomIntrosPath', page).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
$('#txtCustomIntrosPath', page).val(path);
|
||||
}
|
||||
picker.close();
|
||||
},
|
||||
|
||||
header: Globalize.translate('HeaderSelectCustomIntrosPath')
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('#btnSelectCodecIntrosPath', page).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
$('#txtCodecIntrosPath', page).val(path);
|
||||
}
|
||||
picker.close();
|
||||
},
|
||||
|
||||
header: Globalize.translate('HeaderSelectCodecIntrosPath')
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('.cinemaModeConfigurationForm').off('submit', onSubmit).on('submit', onSubmit);
|
||||
|
||||
if (!AppInfo.enableSupporterMembership) {
|
||||
page.querySelector('.lnkSupporterLearnMore').href = '#';
|
||||
page.querySelector('.lnkSupporterLearnMore').addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
}).on('pageshow', "#cinemaModeConfigurationPage", function () {
|
||||
|
||||
LibraryMenu.setTabs('playback', 0, getTabs);
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var page = this;
|
||||
|
||||
ApiClient.getNamedConfiguration("cinemamode").then(function (config) {
|
||||
|
||||
loadPage(page, config);
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
});
|
|
@ -1,195 +0,0 @@
|
|||
define(['jQuery'], function ($) {
|
||||
|
||||
var brandingConfigKey = "branding";
|
||||
var currentBrandingOptions;
|
||||
|
||||
var currentLanguage;
|
||||
|
||||
function loadPage(page, config, languageOptions, systemInfo) {
|
||||
|
||||
var os = systemInfo.OperatingSystem.toLowerCase();
|
||||
|
||||
if (os.indexOf('windows') != -1) {
|
||||
$('#windowsStartupDescription', page).show();
|
||||
} else {
|
||||
$('#windowsStartupDescription', page).hide();
|
||||
}
|
||||
|
||||
if (systemInfo.SupportsAutoRunAtStartup) {
|
||||
$('#fldRunAtStartup', page).show();
|
||||
} else {
|
||||
$('#fldRunAtStartup', page).hide();
|
||||
}
|
||||
|
||||
page.querySelector('#txtServerName').value = config.ServerName || '';
|
||||
page.querySelector('#txtCachePath').value = config.CachePath || '';
|
||||
|
||||
$('#selectLocalizationLanguage', page).html(languageOptions.map(function (l) {
|
||||
|
||||
return '<option value="' + l.Value + '">' + l.Name + '</option>';
|
||||
|
||||
})).val(config.UICulture);
|
||||
|
||||
currentLanguage = config.UICulture;
|
||||
$('#chkUsageData', page).checked(config.EnableAnonymousUsageReporting);
|
||||
$('#chkRunAtStartup', page).checked(config.RunAtStartup);
|
||||
|
||||
if (systemInfo.CanSelfUpdate) {
|
||||
$('.fldAutomaticUpdates', page).show();
|
||||
$('.lnlAutomaticUpdateLevel', page).html(Globalize.translate('LabelAutomaticUpdateLevel'));
|
||||
} else {
|
||||
$('.fldAutomaticUpdates', page).hide();
|
||||
$('.lnlAutomaticUpdateLevel', page).html(Globalize.translate('LabelAutomaticUpdateLevelForPlugins'));
|
||||
}
|
||||
|
||||
$('#chkEnableAutomaticServerUpdates', page).checked(config.EnableAutoUpdate);
|
||||
$('#chkEnableAutomaticRestart', page).checked(config.EnableAutomaticRestart);
|
||||
|
||||
if (systemInfo.CanSelfRestart) {
|
||||
$('#fldEnableAutomaticRestart', page).show();
|
||||
} else {
|
||||
$('#fldEnableAutomaticRestart', page).hide();
|
||||
}
|
||||
|
||||
$('#selectAutomaticUpdateLevel', page).val(config.SystemUpdateLevel).trigger('change');
|
||||
|
||||
$('#chkEnableDashboardResponseCache', page).checked(config.EnableDashboardResponseCaching);
|
||||
$('#chkEnableMinification', page).checked(config.EnableDashboardResourceMinification);
|
||||
$('#txtDashboardSourcePath', page).val(config.DashboardSourcePath).trigger('change');
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var form = this;
|
||||
var page = $(form).parents('.page');
|
||||
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
config.ServerName = form.querySelector('#txtServerName').value;
|
||||
config.UICulture = $('#selectLocalizationLanguage', form).val();
|
||||
|
||||
config.CachePath = form.querySelector('#txtCachePath').value;
|
||||
|
||||
var requiresReload = false;
|
||||
|
||||
if (config.UICulture != currentLanguage) {
|
||||
requiresReload = true;
|
||||
}
|
||||
|
||||
config.EnableAnonymousUsageReporting = $('#chkUsageData', form).checked();
|
||||
config.RunAtStartup = $('#chkRunAtStartup', form).checked();
|
||||
|
||||
config.SystemUpdateLevel = $('#selectAutomaticUpdateLevel', form).val();
|
||||
config.EnableAutomaticRestart = $('#chkEnableAutomaticRestart', form).checked();
|
||||
config.EnableAutoUpdate = $('#chkEnableAutomaticServerUpdates', form).checked();
|
||||
|
||||
config.EnableDashboardResourceMinification = $('#chkEnableMinification', form).checked();
|
||||
config.EnableDashboardResponseCaching = $('#chkEnableDashboardResponseCache', form).checked();
|
||||
config.DashboardSourcePath = $('#txtDashboardSourcePath', form).val();
|
||||
|
||||
ApiClient.updateServerConfiguration(config).then(function () {
|
||||
|
||||
ApiClient.getNamedConfiguration(brandingConfigKey).then(function (brandingConfig) {
|
||||
|
||||
brandingConfig.LoginDisclaimer = form.querySelector('#txtLoginDisclaimer').value;
|
||||
brandingConfig.CustomCss = form.querySelector('#txtCustomCss').value;
|
||||
|
||||
if (currentBrandingOptions && brandingConfig.CustomCss != currentBrandingOptions.CustomCss) {
|
||||
requiresReload = true;
|
||||
}
|
||||
|
||||
ApiClient.updateNamedConfiguration(brandingConfigKey, brandingConfig).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
|
||||
if (requiresReload && !AppInfo.isNativeApp) {
|
||||
window.location.reload(true);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
// Disable default form submission
|
||||
return false;
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
$('#selectAutomaticUpdateLevel', view).on('change', function () {
|
||||
|
||||
if (this.value == "Dev") {
|
||||
$('#devBuildWarning', view).show();
|
||||
} else {
|
||||
$('#devBuildWarning', view).hide();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
$('#btnSelectCachePath', view).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
view.querySelector('#txtCachePath').value = path;
|
||||
}
|
||||
picker.close();
|
||||
},
|
||||
|
||||
header: Globalize.translate('HeaderSelectServerCachePath'),
|
||||
|
||||
instruction: Globalize.translate('HeaderSelectServerCachePathHelp')
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('#btnSelectDashboardSourcePath', view).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
view.querySelector('#txtDashboardSourcePath').value = path;
|
||||
}
|
||||
picker.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('.dashboardGeneralForm', view).off('submit', onSubmit).on('submit', onSubmit);
|
||||
|
||||
view.addEventListener('viewshow', function () {
|
||||
|
||||
var promise1 = ApiClient.getServerConfiguration();
|
||||
var promise2 = ApiClient.getJSON(ApiClient.getUrl("Localization/Options"));
|
||||
var promise3 = ApiClient.getSystemInfo();
|
||||
|
||||
Promise.all([promise1, promise2, promise3]).then(function (responses) {
|
||||
|
||||
loadPage(view, responses[0], responses[1], responses[2]);
|
||||
|
||||
});
|
||||
|
||||
ApiClient.getNamedConfiguration(brandingConfigKey).then(function (config) {
|
||||
|
||||
currentBrandingOptions = config;
|
||||
|
||||
view.querySelector('#txtLoginDisclaimer').value = config.LoginDisclaimer || '';
|
||||
view.querySelector('#txtCustomCss').value = config.CustomCss || '';
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,138 +0,0 @@
|
|||
define(['jQuery'], function ($) {
|
||||
|
||||
function onSubmit() {
|
||||
var form = this;
|
||||
var localAddress = form.querySelector('#txtLocalAddress').value;
|
||||
var enableUpnp = $('#chkEnableUpnp', form).checked();
|
||||
|
||||
confirmSelections(localAddress, enableUpnp, function () {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
config.HttpServerPortNumber = $('#txtPortNumber', form).val();
|
||||
config.PublicPort = $('#txtPublicPort', form).val();
|
||||
config.PublicHttpsPort = $('#txtPublicHttpsPort', form).val();
|
||||
config.EnableHttps = $('#chkEnableHttps', form).checked();
|
||||
config.HttpsPortNumber = $('#txtHttpsPort', form).val();
|
||||
config.EnableUPnP = enableUpnp;
|
||||
config.WanDdns = $('#txtDdns', form).val();
|
||||
config.CertificatePath = $('#txtCertificatePath', form).val();
|
||||
|
||||
config.LocalNetworkAddresses = localAddress ? [localAddress] : [];
|
||||
|
||||
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse);
|
||||
});
|
||||
});
|
||||
|
||||
// Disable default form submission
|
||||
return false;
|
||||
}
|
||||
|
||||
function confirmSelections(localAddress, enableUpnp, callback) {
|
||||
|
||||
if (localAddress || !enableUpnp) {
|
||||
|
||||
require(['alert'], function (alert) {
|
||||
alert({
|
||||
title: Globalize.translate('TitleHostingSettings'),
|
||||
text: Globalize.translate('SettingsWarning')
|
||||
}).then(callback);
|
||||
});
|
||||
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'dashboardhosting.html',
|
||||
name: Globalize.translate('TabHosting')
|
||||
},
|
||||
{
|
||||
href: 'serversecurity.html',
|
||||
name: Globalize.translate('TabSecurity')
|
||||
}];
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
var self = this;
|
||||
|
||||
function loadPage(page, config) {
|
||||
|
||||
$('#txtPortNumber', page).val(config.HttpServerPortNumber);
|
||||
$('#txtPublicPort', page).val(config.PublicPort);
|
||||
$('#txtPublicHttpsPort', page).val(config.PublicHttpsPort);
|
||||
|
||||
page.querySelector('#txtLocalAddress').value = config.LocalNetworkAddresses[0] || '';
|
||||
|
||||
var chkEnableHttps = page.querySelector('#chkEnableHttps');
|
||||
chkEnableHttps.checked = config.EnableHttps;
|
||||
|
||||
$('#txtHttpsPort', page).val(config.HttpsPortNumber);
|
||||
|
||||
$('#txtDdns', page).val(config.WanDdns || '');
|
||||
|
||||
var txtCertificatePath = page.querySelector('#txtCertificatePath');
|
||||
txtCertificatePath.value = config.CertificatePath || '';
|
||||
|
||||
$('#chkEnableUpnp', page).checked(config.EnableUPnP);
|
||||
|
||||
onCertPathChange.call(txtCertificatePath);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
function onCertPathChange() {
|
||||
|
||||
if (this.value) {
|
||||
view.querySelector('#txtDdns').setAttribute('required', 'required');
|
||||
} else {
|
||||
view.querySelector('#txtDdns').removeAttribute('required');
|
||||
}
|
||||
}
|
||||
|
||||
$('#btnSelectCertPath', view).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
includeFiles: true,
|
||||
includeDirectories: true,
|
||||
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
$('#txtCertificatePath', view).val(path);
|
||||
}
|
||||
picker.close();
|
||||
},
|
||||
|
||||
header: Globalize.translate('HeaderSelectCertificatePath')
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('.dashboardHostingForm').off('submit', onSubmit).on('submit', onSubmit);
|
||||
|
||||
view.querySelector('#txtCertificatePath').addEventListener('change', onCertPathChange);
|
||||
|
||||
view.addEventListener('viewshow', function (e) {
|
||||
LibraryMenu.setTabs('adminadvanced', 0, getTabs);
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
loadPage(view, config);
|
||||
|
||||
});
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,100 +0,0 @@
|
|||
define(['jQuery'], function ($) {
|
||||
|
||||
function load(page, config) {
|
||||
|
||||
$('#txtUploadPath', page).val(config.CameraUploadPath || '');
|
||||
|
||||
$('#chkSubfolder', page).checked(config.EnableCameraUploadSubfolders);
|
||||
}
|
||||
|
||||
function loadData(page) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
ApiClient.getNamedConfiguration("devices").then(function (config) {
|
||||
load(page, config);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
});
|
||||
}
|
||||
|
||||
function save(page) {
|
||||
|
||||
ApiClient.getNamedConfiguration("devices").then(function (config) {
|
||||
|
||||
config.CameraUploadPath = $('#txtUploadPath', page).val();
|
||||
|
||||
config.EnableCameraUploadSubfolders = $('#chkSubfolder', page).checked();
|
||||
|
||||
ApiClient.updateNamedConfiguration("devices", config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
var form = this;
|
||||
var page = $(form).parents('.page');
|
||||
|
||||
save(page);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'syncactivity.html',
|
||||
name: Globalize.translate('TabSyncJobs')
|
||||
},
|
||||
{
|
||||
href: 'devicesupload.html',
|
||||
name: Globalize.translate('TabCameraUpload')
|
||||
},
|
||||
{
|
||||
href: 'appservices.html?context=sync',
|
||||
name: Globalize.translate('TabServices')
|
||||
},
|
||||
{
|
||||
href: 'syncsettings.html',
|
||||
name: Globalize.translate('TabSettings')
|
||||
}];
|
||||
}
|
||||
|
||||
$(document).on('pageinit', "#devicesUploadPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
$('#btnSelectUploadPath', page).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
$('#txtUploadPath', page).val(path);
|
||||
}
|
||||
picker.close();
|
||||
},
|
||||
|
||||
header: Globalize.translate('HeaderSelectUploadPath')
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('.devicesUploadForm').off('submit', onSubmit).on('submit', onSubmit);
|
||||
|
||||
|
||||
}).on('pageshow', "#devicesUploadPage", function () {
|
||||
|
||||
LibraryMenu.setTabs('syncadmin', 1, getTabs);
|
||||
var page = this;
|
||||
|
||||
loadData(page);
|
||||
|
||||
});
|
||||
|
||||
});
|
|
@ -1,61 +0,0 @@
|
|||
define(['globalize'], function (globalize) {
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'library.html',
|
||||
name: globalize.translate('TabFolders')
|
||||
},
|
||||
{
|
||||
href: 'librarydisplay.html',
|
||||
name: globalize.translate('TabDisplay')
|
||||
},
|
||||
{
|
||||
href: 'librarypathmapping.html',
|
||||
name: globalize.translate('TabPathSubstitution')
|
||||
},
|
||||
{
|
||||
href: 'librarysettings.html',
|
||||
name: globalize.translate('TabAdvanced')
|
||||
}];
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
var self = this;
|
||||
|
||||
view.querySelector('form').addEventListener('submit', function (e) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var form = this;
|
||||
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
config.EnableFolderView = form.querySelector('.chkFolderView').checked;
|
||||
config.EnableGroupingIntoCollections = form.querySelector('.chkGroupMoviesIntoCollections').checked;
|
||||
config.DisplaySpecialsWithinSeasons = form.querySelector('.chkDisplaySpecialsWithinSeasons').checked;
|
||||
config.DisplayCollectionsView = form.querySelector('.chkDisplayCollectionView').checked;
|
||||
|
||||
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
function loadData() {
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
view.querySelector('.chkFolderView').checked = config.EnableFolderView;
|
||||
view.querySelector('.chkGroupMoviesIntoCollections').checked = config.EnableGroupingIntoCollections;
|
||||
view.querySelector('.chkDisplaySpecialsWithinSeasons').checked = config.DisplaySpecialsWithinSeasons;
|
||||
view.querySelector('.chkDisplayCollectionView').checked = config.DisplayCollectionsView;
|
||||
});
|
||||
}
|
||||
|
||||
view.addEventListener('viewshow', function () {
|
||||
LibraryMenu.setTabs('librarysetup', 1, getTabs);
|
||||
loadData();
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,212 +0,0 @@
|
|||
define(['jQuery'], function ($) {
|
||||
|
||||
function loadPage(page, config) {
|
||||
|
||||
if (config.MergeMetadataAndImagesByName) {
|
||||
$('.fldImagesByName', page).hide();
|
||||
} else {
|
||||
$('.fldImagesByName', page).show();
|
||||
}
|
||||
|
||||
$('#txtSeasonZeroName', page).val(config.SeasonZeroDisplayName);
|
||||
|
||||
$('#selectEnableRealtimeMonitor', page).val(config.EnableLibraryMonitor);
|
||||
|
||||
$('#chkSaveMetadataHidden', page).checked(config.SaveMetadataHidden);
|
||||
|
||||
$('#txtMetadataPath', page).val(config.MetadataPath || '');
|
||||
|
||||
$('#chkPeopleActors', page).checked(config.PeopleMetadataOptions.DownloadActorMetadata);
|
||||
$('#chkPeopleComposers', page).checked(config.PeopleMetadataOptions.DownloadComposerMetadata);
|
||||
$('#chkPeopleDirectors', page).checked(config.PeopleMetadataOptions.DownloadDirectorMetadata);
|
||||
$('#chkPeopleProducers', page).checked(config.PeopleMetadataOptions.DownloadProducerMetadata);
|
||||
$('#chkPeopleWriters', page).checked(config.PeopleMetadataOptions.DownloadWriterMetadata);
|
||||
$('#chkPeopleOthers', page).checked(config.PeopleMetadataOptions.DownloadOtherPeopleMetadata);
|
||||
$('#chkPeopleGuestStars', page).checked(config.PeopleMetadataOptions.DownloadGuestStarMetadata);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
function loadMetadataConfig(page, config) {
|
||||
|
||||
$('#selectDateAdded', page).val((config.UseFileCreationTimeForDateAdded ? '1' : '0'));
|
||||
}
|
||||
|
||||
function loadFanartConfig(page, config) {
|
||||
|
||||
$('#txtFanartApiKey', page).val(config.UserApiKey || '');
|
||||
}
|
||||
|
||||
function loadChapters(page, config, providers) {
|
||||
|
||||
$('#chkChaptersMovies', page).checked(config.EnableMovieChapterImageExtraction);
|
||||
$('#chkChaptersEpisodes', page).checked(config.EnableEpisodeChapterImageExtraction);
|
||||
$('#chkChaptersOtherVideos', page).checked(config.EnableOtherVideoChapterImageExtraction);
|
||||
|
||||
$('#chkExtractChaptersDuringLibraryScan', page).checked(config.ExtractDuringLibraryScan);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
function saveFanart(form) {
|
||||
|
||||
ApiClient.getNamedConfiguration("fanart").then(function (config) {
|
||||
|
||||
config.UserApiKey = $('#txtFanartApiKey', form).val();
|
||||
|
||||
ApiClient.updateNamedConfiguration("fanart", config);
|
||||
});
|
||||
}
|
||||
|
||||
function saveMetadata(form) {
|
||||
|
||||
ApiClient.getNamedConfiguration("metadata").then(function (config) {
|
||||
|
||||
config.UseFileCreationTimeForDateAdded = $('#selectDateAdded', form).val() == '1';
|
||||
|
||||
ApiClient.updateNamedConfiguration("metadata", config);
|
||||
});
|
||||
}
|
||||
|
||||
function saveChapters(form) {
|
||||
|
||||
ApiClient.getNamedConfiguration("chapters").then(function (config) {
|
||||
|
||||
config.EnableMovieChapterImageExtraction = $('#chkChaptersMovies', form).checked();
|
||||
config.EnableEpisodeChapterImageExtraction = $('#chkChaptersEpisodes', form).checked();
|
||||
config.EnableOtherVideoChapterImageExtraction = $('#chkChaptersOtherVideos', form).checked();
|
||||
|
||||
config.ExtractDuringLibraryScan = $('#chkExtractChaptersDuringLibraryScan', form).checked();
|
||||
|
||||
ApiClient.updateNamedConfiguration("chapters", config);
|
||||
});
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var form = this;
|
||||
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
config.SeasonZeroDisplayName = $('#txtSeasonZeroName', form).val();
|
||||
|
||||
config.EnableLibraryMonitor = $('#selectEnableRealtimeMonitor', form).val();
|
||||
|
||||
config.SaveMetadataHidden = $('#chkSaveMetadataHidden', form).checked();
|
||||
|
||||
config.EnableTvDbUpdates = $('#chkEnableTvdbUpdates', form).checked();
|
||||
config.EnableTmdbUpdates = $('#chkEnableTmdbUpdates', form).checked();
|
||||
config.EnableFanArtUpdates = $('#chkEnableFanartUpdates', form).checked();
|
||||
config.MetadataPath = $('#txtMetadataPath', form).val();
|
||||
config.FanartApiKey = $('#txtFanartApiKey', form).val();
|
||||
|
||||
config.PeopleMetadataOptions.DownloadActorMetadata = $('#chkPeopleActors', form).checked();
|
||||
config.PeopleMetadataOptions.DownloadComposerMetadata = $('#chkPeopleComposers', form).checked();
|
||||
config.PeopleMetadataOptions.DownloadDirectorMetadata = $('#chkPeopleDirectors', form).checked();
|
||||
config.PeopleMetadataOptions.DownloadGuestStarMetadata = $('#chkPeopleGuestStars', form).checked();
|
||||
config.PeopleMetadataOptions.DownloadProducerMetadata = $('#chkPeopleProducers', form).checked();
|
||||
config.PeopleMetadataOptions.DownloadWriterMetadata = $('#chkPeopleWriters', form).checked();
|
||||
config.PeopleMetadataOptions.DownloadOtherPeopleMetadata = $('#chkPeopleOthers', form).checked();
|
||||
|
||||
ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult);
|
||||
});
|
||||
|
||||
saveChapters(form);
|
||||
saveMetadata(form);
|
||||
saveFanart(form);
|
||||
|
||||
// Disable default form submission
|
||||
return false;
|
||||
}
|
||||
|
||||
function getTabs() {
|
||||
return [
|
||||
{
|
||||
href: 'library.html',
|
||||
name: Globalize.translate('TabFolders')
|
||||
},
|
||||
{
|
||||
href: 'librarydisplay.html',
|
||||
name: Globalize.translate('TabDisplay')
|
||||
},
|
||||
{
|
||||
href: 'librarypathmapping.html',
|
||||
name: Globalize.translate('TabPathSubstitution')
|
||||
},
|
||||
{
|
||||
href: 'librarysettings.html',
|
||||
name: Globalize.translate('TabAdvanced')
|
||||
}];
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
var self = this;
|
||||
|
||||
$('#btnSelectMetadataPath', view).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
$('#txtMetadataPath', view).val(path);
|
||||
}
|
||||
picker.close();
|
||||
},
|
||||
|
||||
header: Globalize.translate('HeaderSelectMetadataPath'),
|
||||
|
||||
instruction: Globalize.translate('HeaderSelectMetadataPathHelp')
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
$('.librarySettingsForm').off('submit', onSubmit).on('submit', onSubmit);
|
||||
|
||||
ApiClient.getSystemInfo().then(function (systemInfo) {
|
||||
|
||||
if (systemInfo.SupportsLibraryMonitor) {
|
||||
view.querySelector('.fldLibraryMonitor').classList.remove('hide');
|
||||
} else {
|
||||
view.querySelector('.fldLibraryMonitor').classList.add('hide');
|
||||
}
|
||||
});
|
||||
|
||||
view.addEventListener('viewshow', function () {
|
||||
LibraryMenu.setTabs('librarysetup', 3, getTabs);
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var page = this;
|
||||
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
loadPage(page, config);
|
||||
});
|
||||
|
||||
ApiClient.getNamedConfiguration("metadata").then(function (metadata) {
|
||||
|
||||
loadMetadataConfig(page, metadata);
|
||||
});
|
||||
|
||||
ApiClient.getNamedConfiguration("fanart").then(function (metadata) {
|
||||
|
||||
loadFanartConfig(page, metadata);
|
||||
});
|
||||
|
||||
var promise1 = ApiClient.getNamedConfiguration("chapters");
|
||||
var promise2 = ApiClient.getJSON(ApiClient.getUrl("Providers/Chapters"));
|
||||
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
|
||||
loadChapters(page, responses[0], responses[1]);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
});
|
|
@ -1,135 +0,0 @@
|
|||
define([], function () {
|
||||
|
||||
function reload(page, providerId) {
|
||||
|
||||
page.querySelector('.txtDevicePath').value = '';
|
||||
|
||||
if (providerId) {
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
|
||||
var info = config.TunerHosts.filter(function (i) {
|
||||
return i.Id == providerId;
|
||||
})[0];
|
||||
|
||||
page.querySelector('.txtDevicePath').value = info.Url || '';
|
||||
page.querySelector('.txtM3uUrl').value = info.M3UUrl || '';
|
||||
page.querySelector('.chkEnabled').checked = info.IsEnabled;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function fillInfoFromPage(page, info) {
|
||||
info.Url = page.querySelector('.txtDevicePath').value;
|
||||
info.M3UUrl = page.querySelector('.txtM3uUrl').value;
|
||||
info.IsEnabled = page.querySelector('.chkEnabled').checked;
|
||||
info.DiseqC = page.querySelector('.selectDiseqC').value;
|
||||
info.SourceA = page.querySelector('.selectSourceA').value;
|
||||
info.SourceB = page.querySelector('.selectSourceB').value;
|
||||
info.SourceC = page.querySelector('.selectSourceC').value;
|
||||
info.SourceD = page.querySelector('.selectSourceD').value;
|
||||
}
|
||||
|
||||
function submitTunerInfo(page, info) {
|
||||
ApiClient.ajax({
|
||||
type: "POST",
|
||||
url: ApiClient.getUrl('LiveTv/TunerHosts'),
|
||||
data: JSON.stringify(info),
|
||||
contentType: "application/json"
|
||||
|
||||
}).then(function () {
|
||||
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
Dashboard.navigate('livetvstatus.html');
|
||||
|
||||
}, function () {
|
||||
Dashboard.hideLoadingMsg();
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate('ErrorSavingTvProvider')
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function populateMappings(view) {
|
||||
|
||||
ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Satip/IniMappings')).then(function (mappings) {
|
||||
|
||||
var optionsHtml = mappings.map(function (m) {
|
||||
return '<option value="' + m.Value + '">' + m.Name + '</option>';
|
||||
}).join('');
|
||||
|
||||
optionsHtml = '<option value="">' + Globalize.translate('OptionNone') + '</option>' + optionsHtml;
|
||||
|
||||
view.querySelector('.selectSourceA').innerHTML = optionsHtml;
|
||||
view.querySelector('.selectSourceB').innerHTML = optionsHtml;
|
||||
view.querySelector('.selectSourceC').innerHTML = optionsHtml;
|
||||
view.querySelector('.selectSourceD').innerHTML = optionsHtml;
|
||||
});
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
function submitForm() {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var id = params.id;
|
||||
|
||||
if (id) {
|
||||
|
||||
ApiClient.getNamedConfiguration("livetv").then(function (config) {
|
||||
|
||||
var info = config.TunerHosts.filter(function (i) {
|
||||
return i.Id == id;
|
||||
})[0];
|
||||
|
||||
fillInfoFromPage(view, info);
|
||||
submitTunerInfo(view, info);
|
||||
});
|
||||
|
||||
} else {
|
||||
var info = {
|
||||
Type: 'satip'
|
||||
};
|
||||
|
||||
fillInfoFromPage(view, info);
|
||||
submitTunerInfo(view, info);
|
||||
}
|
||||
}
|
||||
|
||||
function onSelectDiseqCChange(e) {
|
||||
|
||||
var select = e.target;
|
||||
var value = select.value;
|
||||
|
||||
if (value) {
|
||||
view.querySelector('.fldSourceB').classList.remove('hide');
|
||||
} else {
|
||||
view.querySelector('.fldSourceB').classList.add('hide');
|
||||
}
|
||||
|
||||
if (value == 'diseqc1') {
|
||||
|
||||
view.querySelector('.fldSourceC').classList.remove('hide');
|
||||
view.querySelector('.fldSourceD').classList.remove('hide');
|
||||
} else {
|
||||
view.querySelector('.fldSourceC').classList.add('hide');
|
||||
view.querySelector('.fldSourceD').classList.add('hide');
|
||||
}
|
||||
}
|
||||
|
||||
view.querySelector('form').addEventListener('submit', function (e) {
|
||||
submitForm();
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
view.querySelector('.selectDiseqC').addEventListener('change', onSelectDiseqCChange);
|
||||
|
||||
populateMappings(view);
|
||||
|
||||
view.addEventListener('viewshow', function (e) {
|
||||
var providerId = params.id;
|
||||
reload(view, providerId);
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,78 +0,0 @@
|
|||
define(['datetime', 'listViewStyle'], function (datetime) {
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
view.querySelector('#chkDebugLog').addEventListener('change', function () {
|
||||
|
||||
ApiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
config.EnableDebugLevelLogging = view.querySelector('#chkDebugLog').checked;
|
||||
|
||||
ApiClient.updateServerConfiguration(config);
|
||||
});
|
||||
});
|
||||
|
||||
view.addEventListener('viewbeforeshow', function () {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
var apiClient = ApiClient;
|
||||
|
||||
apiClient.getJSON(apiClient.getUrl('System/Logs')).then(function (logs) {
|
||||
|
||||
var html = '';
|
||||
|
||||
html += '<div class="paperList">';
|
||||
|
||||
html += logs.map(function (log) {
|
||||
|
||||
var logUrl = apiClient.getUrl('System/Logs/Log', {
|
||||
name: log.Name
|
||||
});
|
||||
|
||||
logUrl += "&api_key=" + apiClient.accessToken();
|
||||
|
||||
var logHtml = '';
|
||||
logHtml += '<div class="listItem">';
|
||||
|
||||
logHtml += '<a item-icon class="clearLink" href="' + logUrl + '" target="_blank">';
|
||||
logHtml += '<i class="md-icon listItemIcon">schedule</i>';
|
||||
logHtml += "</a>";
|
||||
|
||||
logHtml += '<div class="listItemBody two-line">';
|
||||
logHtml += '<a class="clearLink" href="' + logUrl + '" target="_blank">';
|
||||
|
||||
logHtml += "<h3 class='listItemBodyText'>" + log.Name + "</h3>";
|
||||
|
||||
var date = datetime.parseISO8601Date(log.DateModified, true);
|
||||
|
||||
var text = date.toLocaleDateString();
|
||||
|
||||
text += ' ' + datetime.getDisplayTime(date);
|
||||
|
||||
logHtml += '<div class="listItemBodyText secondary">' + text + '</div>';
|
||||
|
||||
logHtml += "</a>";
|
||||
logHtml += '</div>';
|
||||
|
||||
logHtml += '</div>';
|
||||
|
||||
return logHtml;
|
||||
|
||||
})
|
||||
.join('');
|
||||
|
||||
html += '</div>';
|
||||
|
||||
view.querySelector('.serverLogs').innerHTML = html;
|
||||
Dashboard.hideLoadingMsg();
|
||||
});
|
||||
|
||||
apiClient.getServerConfiguration().then(function (config) {
|
||||
|
||||
view.querySelector('#chkDebugLog').checked = config.EnableDebugLevelLogging;
|
||||
});
|
||||
});
|
||||
|
||||
};
|
||||
});
|
|
@ -5,17 +5,6 @@
|
|||
page.querySelector('#txtSyncPath').value = appSettings.syncPath() || '';
|
||||
page.querySelector('#chkWifi').checked = appSettings.syncOnlyOnWifi();
|
||||
|
||||
var uploadServers = appSettings.cameraUploadServers();
|
||||
|
||||
page.querySelector('.uploadServerList').innerHTML = ConnectionManager.getSavedServers().map(function (s) {
|
||||
|
||||
var checkedHtml = uploadServers.indexOf(s.Id) == -1 ? '' : ' checked';
|
||||
var html = '<label><input type="checkbox" is="emby-checkbox"' + checkedHtml + ' class="chkUploadServer" data-id="' + s.Id + '"/><span>' + s.Name + '</span></label>';
|
||||
|
||||
return html;
|
||||
|
||||
}).join('');
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
||||
|
@ -26,17 +15,6 @@
|
|||
appSettings.syncPath(syncPath);
|
||||
appSettings.syncOnlyOnWifi(page.querySelector('#chkWifi').checked);
|
||||
|
||||
var chkUploadServer = page.querySelectorAll('.chkUploadServer');
|
||||
var cameraUploadServers = [];
|
||||
|
||||
for (var i = 0, length = chkUploadServer.length; i < length; i++) {
|
||||
if (chkUploadServer[i].checked) {
|
||||
cameraUploadServers.push(chkUploadServer[i].getAttribute('data-id'));
|
||||
}
|
||||
}
|
||||
|
||||
appSettings.cameraUploadServers(cameraUploadServers);
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
require(['toast'], function (toast) {
|
||||
toast(Globalize.translate('SettingsSaved'));
|
||||
|
|
|
@ -692,7 +692,7 @@ var Dashboard = {
|
|||
// The native app can handle a little bit more than safari
|
||||
if (AppInfo.isNativeApp) {
|
||||
|
||||
quality -= 5;
|
||||
quality -= 10;
|
||||
} else {
|
||||
quality -= 20;
|
||||
}
|
||||
|
@ -1127,10 +1127,6 @@ var AppInfo = {};
|
|||
elem.classList.add('supporterMembershipDisabled');
|
||||
}
|
||||
|
||||
if (AppInfo.isNativeApp) {
|
||||
elem.classList.add('nativeApp');
|
||||
}
|
||||
|
||||
if (!AppInfo.enableHomeFavorites) {
|
||||
elem.classList.add('homeFavoritesDisabled');
|
||||
}
|
||||
|
@ -1255,15 +1251,6 @@ var AppInfo = {};
|
|||
webAnimations: bowerPath + '/web-animations-js/web-animations-next-lite.min'
|
||||
};
|
||||
|
||||
if (navigator.webkitPersistentStorage) {
|
||||
paths.imageFetcher = embyWebComponentsBowerPath + "/images/persistentimagefetcher";
|
||||
paths.imageFetcher = embyWebComponentsBowerPath + "/images/basicimagefetcher";
|
||||
} else if (Dashboard.isRunningInCordova()) {
|
||||
paths.imageFetcher = 'cordova/imagestore';
|
||||
} else {
|
||||
paths.imageFetcher = embyWebComponentsBowerPath + "/images/basicimagefetcher";
|
||||
}
|
||||
|
||||
paths.hlsjs = bowerPath + "/hls.js/dist/hls.min";
|
||||
|
||||
if ((window.chrome && window.chrome.sockets) || Dashboard.isRunningInCordova()) {
|
||||
|
@ -1690,6 +1677,12 @@ var AppInfo = {};
|
|||
|
||||
var embyWebComponentsBowerPath = bowerPath + '/emby-webcomponents';
|
||||
|
||||
if (Dashboard.isRunningInCordova() && browser.safari) {
|
||||
define("imageFetcher", ['cordova/ios/imagestore'], returnFirstDependency);
|
||||
} else {
|
||||
define("imageFetcher", [embyWebComponentsBowerPath + "/images/basicimagefetcher"], returnFirstDependency);
|
||||
}
|
||||
|
||||
var preferNativeAlerts = browser.mobile || browser.tv || browser.xboxOne;
|
||||
// use native alerts if preferred and supported (not supported in opera tv)
|
||||
if (preferNativeAlerts && window.alert) {
|
||||
|
@ -1737,9 +1730,9 @@ var AppInfo = {};
|
|||
if (Dashboard.isRunningInCordova() && browserInfo.android) {
|
||||
|
||||
if (MainActivity.getChromeVersion() >= 48) {
|
||||
define("audiorenderer", ["scripts/htmlmediarenderer"]);
|
||||
//window.VlcAudio = true;
|
||||
//define("audiorenderer", ["cordova/android/vlcplayer"]);
|
||||
//define("audiorenderer", ["scripts/htmlmediarenderer"]);
|
||||
window.VlcAudio = true;
|
||||
define("audiorenderer", ["cordova/android/vlcplayer"]);
|
||||
} else {
|
||||
window.VlcAudio = true;
|
||||
define("audiorenderer", ["cordova/android/vlcplayer"]);
|
||||
|
@ -1892,7 +1885,7 @@ var AppInfo = {};
|
|||
path: '/about.html',
|
||||
dependencies: [],
|
||||
autoFocus: false,
|
||||
controller: 'scripts/aboutpage',
|
||||
controller: 'dashboard/aboutpage',
|
||||
roles: 'admin'
|
||||
});
|
||||
|
||||
|
@ -1913,14 +1906,14 @@ var AppInfo = {};
|
|||
defineRoute({
|
||||
path: '/autoorganizelog.html',
|
||||
dependencies: ['scripts/taskbutton', 'autoorganizetablecss'],
|
||||
controller: 'scripts/autoorganizelog',
|
||||
controller: 'dashboard/autoorganizelog',
|
||||
roles: 'admin'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/autoorganizesmart.html',
|
||||
dependencies: ['emby-button'],
|
||||
controller: 'scripts/autoorganizesmart',
|
||||
controller: 'dashboard/autoorganizesmart',
|
||||
autoFocus: false,
|
||||
roles: 'admin'
|
||||
});
|
||||
|
@ -1928,7 +1921,7 @@ var AppInfo = {};
|
|||
defineRoute({
|
||||
path: '/autoorganizetv.html',
|
||||
dependencies: ['emby-checkbox', 'emby-input', 'emby-button', 'emby-select', 'emby-collapse'],
|
||||
controller: 'scripts/autoorganizetv',
|
||||
controller: 'dashboard/autoorganizetv',
|
||||
autoFocus: false,
|
||||
roles: 'admin'
|
||||
});
|
||||
|
@ -1980,7 +1973,7 @@ var AppInfo = {};
|
|||
defineRoute({
|
||||
path: '/dashboardgeneral.html',
|
||||
dependencies: ['emby-collapse', 'emby-textarea', 'emby-input', 'paper-checkbox'],
|
||||
controller: 'scripts/dashboardgeneral',
|
||||
controller: 'dashboard/dashboardgeneral',
|
||||
autoFocus: false,
|
||||
roles: 'admin'
|
||||
});
|
||||
|
@ -1990,7 +1983,7 @@ var AppInfo = {};
|
|||
dependencies: ['paper-checkbox', 'emby-input', 'emby-button'],
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'scripts/dashboardhosting'
|
||||
controller: 'dashboard/dashboardhosting'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
|
@ -2156,7 +2149,7 @@ var AppInfo = {};
|
|||
dependencies: ['emby-button', 'paper-checkbox'],
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'scripts/librarydisplay'
|
||||
controller: 'dashboard/librarydisplay'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
|
@ -2171,7 +2164,7 @@ var AppInfo = {};
|
|||
dependencies: ['emby-collapse', 'emby-input', 'paper-checkbox', 'emby-button', 'emby-select'],
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'scripts/librarysettings'
|
||||
controller: 'dashboard/librarysettings'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
|
@ -2240,14 +2233,14 @@ var AppInfo = {};
|
|||
dependencies: ['emby-input', 'paper-checkbox'],
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'scripts/livetvtunerprovider-satip'
|
||||
controller: 'dashboard/livetvtunerprovider-satip'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/log.html',
|
||||
dependencies: ['emby-checkbox'],
|
||||
roles: 'admin',
|
||||
controller: 'scripts/logpage'
|
||||
controller: 'dashboard/logpage'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
|
@ -2356,6 +2349,14 @@ var AppInfo = {};
|
|||
controller: 'scripts/mysync'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/camerauploadsettings.html',
|
||||
dependencies: [],
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
controller: 'scripts/camerauploadsettings'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/mysyncjob.html',
|
||||
dependencies: [],
|
||||
|
@ -2596,7 +2597,7 @@ var AppInfo = {};
|
|||
dependencies: ['dashboardcss', 'emby-button', 'emby-input', 'emby-select'],
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
controller: 'scripts/wizardcomponents'
|
||||
controller: 'dashboard/wizardcomponents'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
|
@ -2604,7 +2605,7 @@ var AppInfo = {};
|
|||
dependencies: ['emby-button', 'dashboardcss'],
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
controller: 'scripts/wizardfinishpage'
|
||||
controller: 'dashboard/wizardfinishpage'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
|
@ -2707,7 +2708,6 @@ var AppInfo = {};
|
|||
|
||||
if (browserInfo.android) {
|
||||
deps.push('cordova/android/androidcredentials');
|
||||
deps.push('cordova/android/links');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2781,14 +2781,8 @@ var AppInfo = {};
|
|||
postInitDependencies.push('bower_components/emby-webcomponents/input/api');
|
||||
|
||||
if (!browserInfo.tv) {
|
||||
if (navigator.serviceWorker) {
|
||||
try {
|
||||
navigator.serviceWorker.register('serviceworker.js');
|
||||
} catch (err) {
|
||||
console.log('Error registering serviceWorker: ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
registerServiceWorker();
|
||||
if (window.Notification) {
|
||||
postInitDependencies.push('bower_components/emby-webcomponents/notifications/notifications');
|
||||
}
|
||||
|
@ -2800,6 +2794,24 @@ var AppInfo = {};
|
|||
});
|
||||
}
|
||||
|
||||
function registerServiceWorker() {
|
||||
|
||||
if (navigator.serviceWorker) {
|
||||
try {
|
||||
navigator.serviceWorker.register('serviceworker.js').then(function () {
|
||||
return navigator.serviceWorker.ready;
|
||||
}).then(function (reg) {
|
||||
|
||||
// https://github.com/WICG/BackgroundSync/blob/master/explainer.md
|
||||
return reg.sync.register('emby-sync');
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
console.log('Error registering serviceWorker: ' + err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function upgradeLayouts() {
|
||||
if (!AppInfo.enableAppLayouts) {
|
||||
Dashboard.getPluginSecurityInfo().then(function (info) {
|
||||
|
|
|
@ -1,142 +0,0 @@
|
|||
define([], function () {
|
||||
|
||||
function goNext() {
|
||||
require(['scripts/wizardcontroller'], function (wizardcontroller) {
|
||||
wizardcontroller.navigateToService();
|
||||
});
|
||||
}
|
||||
|
||||
function loadDownloadInfo(view) {
|
||||
|
||||
var instructions = '';
|
||||
|
||||
ApiClient.getSystemInfo().then(function (systemInfo) {
|
||||
|
||||
if (systemInfo.OperatingSystem == 'Windows') {
|
||||
view.querySelector('.fldSelectEncoderPathType').classList.add('hide');
|
||||
} else {
|
||||
view.querySelector('.fldSelectEncoderPathType').classList.remove('hide');
|
||||
}
|
||||
|
||||
if (systemInfo.OperatingSystem == 'Windows' && systemInfo.SystemArchitecture != 'Arm') {
|
||||
|
||||
view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', '<a target="_blank" href="https://ffmpeg.zeranoe.com/builds">https://ffmpeg.zeranoe.com</a>');
|
||||
|
||||
if (systemInfo.SystemArchitecture == 'X86') {
|
||||
instructions = 'Download FFmpeg 32-Bit Static';
|
||||
}
|
||||
else if (systemInfo.SystemArchitecture == 'X64') {
|
||||
instructions = 'Download FFmpeg 64-Bit Static';
|
||||
}
|
||||
|
||||
} else if (systemInfo.OperatingSystem == 'Linux' && systemInfo.SystemArchitecture != 'Arm') {
|
||||
|
||||
view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', '<a target="_blank" href="http://johnvansickle.com/ffmpeg">http://johnvansickle.com/ffmpeg</a>');
|
||||
|
||||
if (systemInfo.SystemArchitecture == 'X86') {
|
||||
instructions = 'Download x86 build';
|
||||
}
|
||||
else if (systemInfo.SystemArchitecture == 'X64') {
|
||||
instructions = 'Download x86_64 build';
|
||||
}
|
||||
|
||||
} else if (systemInfo.OperatingSystem == 'Osx' && systemInfo.SystemArchitecture == 'X64') {
|
||||
|
||||
view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', '<a target="_blank" href="http://evermeet.cx/ffmpeg">http://evermeet.cx/ffmpeg</a>');
|
||||
instructions = 'Download both ffmpeg and ffprobe, and extract them to the same folder.';
|
||||
|
||||
} else {
|
||||
view.querySelector('.suggestedLocation').innerHTML = Globalize.translate('FFmpegSuggestedDownload', '<a target="_blank" href="http://ffmpeg.org">https://ffmpeg.org/download.html</a>');
|
||||
}
|
||||
|
||||
view.querySelector('.downloadInstructions').innerHTML = instructions;
|
||||
|
||||
var selectEncoderPath = view.querySelector('#selectEncoderPath');
|
||||
selectEncoderPath.value = 'Custom';
|
||||
onSelectEncoderPathChange.call(selectEncoderPath);
|
||||
});
|
||||
}
|
||||
|
||||
function onSaveEncodingPathFailure(response) {
|
||||
|
||||
var msg = '';
|
||||
|
||||
// This is a fallback that handles both 404 and 400 (no path entered)
|
||||
msg = Globalize.translate('FFmpegSavePathNotFound');
|
||||
|
||||
require(['alert'], function (alert) {
|
||||
alert(msg);
|
||||
});
|
||||
}
|
||||
|
||||
function parentWithClass(elem, className) {
|
||||
|
||||
while (!elem.classList || !elem.classList.contains(className)) {
|
||||
elem = elem.parentNode;
|
||||
|
||||
if (!elem) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return elem;
|
||||
}
|
||||
|
||||
function onSelectEncoderPathChange(e) {
|
||||
|
||||
var page = parentWithClass(this, 'page');
|
||||
|
||||
if (this.value == 'Custom') {
|
||||
page.querySelector('.fldEncoderPath').classList.remove('hide');
|
||||
} else {
|
||||
page.querySelector('.fldEncoderPath').classList.add('hide');
|
||||
}
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
view.querySelector('#btnSelectEncoderPath').addEventListener("click", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
view.querySelector('.txtEncoderPath').value = path;
|
||||
}
|
||||
picker.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
view.querySelector('form').addEventListener('submit', function (e) {
|
||||
|
||||
var form = this;
|
||||
|
||||
ApiClient.ajax({
|
||||
url: ApiClient.getUrl('System/MediaEncoder/Path'),
|
||||
type: 'POST',
|
||||
data: {
|
||||
Path: form.querySelector('.txtEncoderPath').value,
|
||||
PathType: 'Custom'
|
||||
}
|
||||
}).then(goNext, onSaveEncodingPathFailure);
|
||||
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
view.querySelector('#selectEncoderPath').addEventListener('change', onSelectEncoderPathChange);
|
||||
|
||||
view.addEventListener('viewbeforeshow', function (e) {
|
||||
|
||||
loadDownloadInfo(view);
|
||||
});
|
||||
};
|
||||
});
|
|
@ -1,26 +0,0 @@
|
|||
define(['loading'], function (loading) {
|
||||
|
||||
function onFinish() {
|
||||
|
||||
loading.show();
|
||||
|
||||
ApiClient.ajax({
|
||||
|
||||
url: ApiClient.getUrl('Startup/Complete'),
|
||||
type: 'POST'
|
||||
|
||||
}).then(function () {
|
||||
|
||||
Dashboard.navigate('dashboard.html');
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
|
||||
var self = this;
|
||||
|
||||
view.querySelector('.btnWizardNext').addEventListener('click', onFinish);
|
||||
};
|
||||
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue