diff --git a/dashboard-ui/livetvsettings.html b/dashboard-ui/livetvsettings.html index 22cd639db4..e60ac64857 100644 --- a/dashboard-ui/livetvsettings.html +++ b/dashboard-ui/livetvsettings.html @@ -39,6 +39,23 @@
${LabelRecordingPathHelp}

+
+ ${OptionEnableRecordingSubfolders} +
+
+
+ + +
+
+ + +
+
+
+ ${OptionSendRecordingsToAutoOrganize} +
+

${OptionConvertRecordingsToStreamingFormat} @@ -52,12 +69,6 @@


-
- ${OptionSendRecordingsToAutoOrganize} -
${OptionSendRecordingsToAutoOrganizeHelp}
-
-
-

${HeaderDefaultPadding}

diff --git a/dashboard-ui/scripts/livetvsettings.js b/dashboard-ui/scripts/livetvsettings.js index 43be4ad7bb..a15ddc03e0 100644 --- a/dashboard-ui/scripts/livetvsettings.js +++ b/dashboard-ui/scripts/livetvsettings.js @@ -12,11 +12,15 @@ $('#chkConvertRecordings', page).checked(config.EnableRecordingEncoding); $('#chkPreserveAudio', page).checked(config.EnableOriginalAudioWithEncodedRecordings || false); - $('#txtRecordingPath', page).val(config.RecordingPath || ''); - $('#txtPrePaddingMinutes', page).val(config.PrePaddingSeconds / 60); $('#txtPostPaddingMinutes', page).val(config.PostPaddingSeconds / 60); + page.querySelector('#txtRecordingPath').value = config.RecordingPath || ''; + page.querySelector('#txtMovieRecordingPath').value = config.MovieRecordingPath || ''; + page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || ''; + + page.querySelector('#chkEnableRecordingSubfolders').checked = config.EnableRecordingSubfolders || false; + Dashboard.hideLoadingMsg(); } @@ -33,10 +37,13 @@ config.EnableAutoOrganize = $('#chkOrganize', form).checked(); config.EnableRecordingEncoding = $('#chkConvertRecordings', form).checked(); config.EnableOriginalAudioWithEncodedRecordings = $('#chkPreserveAudio', form).checked(); - config.RecordingPath = $('#txtRecordingPath', form).val() || null; + config.RecordingPath = form.querySelector('#txtRecordingPath').value || null; + config.MovieRecordingPath = form.querySelector('#txtMovieRecordingPath').value || null; + config.SeriesRecordingPath = form.querySelector('#txtSeriesRecordingPath').value || null; config.PrePaddingSeconds = $('#txtPrePaddingMinutes', form).val() * 60; config.PostPaddingSeconds = $('#txtPostPaddingMinutes', form).val() * 60; + config.EnableRecordingSubfolders = form.querySelector('#chkEnableRecordingSubfolders').checked; ApiClient.updateNamedConfiguration("livetv", config).then(Dashboard.processServerConfigurationUpdateResult); }); @@ -86,6 +93,44 @@ }); }); + $('#btnSelectMovieRecordingPath', page).on("click.selectDirectory", function () { + + require(['directorybrowser'], function (directoryBrowser) { + + var picker = new directoryBrowser(); + + picker.show({ + + callback: function (path) { + + if (path) { + $('#txtMovieRecordingPath', page).val(path); + } + picker.close(); + } + }); + }); + }); + + $('#btnSelectSeriesRecordingPath', page).on("click.selectDirectory", function () { + + require(['directorybrowser'], function (directoryBrowser) { + + var picker = new directoryBrowser(); + + picker.show({ + + callback: function (path) { + + if (path) { + $('#txtSeriesRecordingPath', page).val(path); + } + picker.close(); + } + }); + }); + }); + }).on('pageshow', "#liveTvSettingsPage", function () { LibraryMenu.setTabs('livetvadmin', 1, getTabs); diff --git a/dashboard-ui/scripts/sections.js b/dashboard-ui/scripts/sections.js index 68654e64db..d828a65c9f 100644 --- a/dashboard-ui/scripts/sections.js +++ b/dashboard-ui/scripts/sections.js @@ -163,12 +163,14 @@ function getAppInfo() { - if (AppInfo.nativeApp) { - return Promise.resolve(''); + var frequency = 86400000; + + if (AppInfo.isNativeApp) { + frequency = 604800000; } var cacheKey = 'lastappinfopresent5'; - if ((new Date().getTime() - parseInt(appSettings.get(cacheKey) || '0')) < 86400000) { + if ((new Date().getTime() - parseInt(appSettings.get(cacheKey) || '0')) < frequency) { return Promise.resolve(''); } @@ -180,7 +182,11 @@ return ''; } - var infos = [getTheaterInfo, getPremiereInfo]; + var infos = [getPremiereInfo]; + + if (!browserInfo.safari || !AppInfo.isNativeApp) { + infos.push(getTheaterInfo); + } appSettings.set(cacheKey, new Date().getTime()); @@ -198,7 +204,9 @@ var html = ''; html += '
'; html += '

Try Emby Theater

'; - html += '

A beautiful app for your TV and large screen tablet. Emby Theater runs on Windows, Xbox One, Google Chrome, FireFox, Microsoft Edge and Opera.

'; + + var nameText = AppInfo.isNativeApp ? 'Emby Theater' : 'Emby Theater'; + html += '

A beautiful app for your TV and large screen tablet. ' + nameText + ' runs on Windows, Xbox One, Google Chrome, FireFox, Microsoft Edge and Opera.

'; html += '
'; html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png', 'https://emby.media/download'); html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png', 'https://emby.media/download'); @@ -214,7 +222,10 @@ var html = ''; html += '
'; html += '

Try Emby Premiere

'; - html += '

Design beautiful Cover Art, enjoy free access to Emby apps, and more. Learn more

'; + + var learnMoreText = AppInfo.isNativeApp ? '' : 'Learn more'; + + html += '

Design beautiful Cover Art, enjoy free access to Emby apps, and more. ' + learnMoreText + '

'; html += '
'; html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater1.png', 'https://emby.media/premiere'); html += getCard('https://raw.githubusercontent.com/MediaBrowser/Emby.Resources/master/apps/theater2.png', 'https://emby.media/premiere'); diff --git a/dashboard-ui/strings/en-US.json b/dashboard-ui/strings/en-US.json index 85e3101f70..0cdfc90eb8 100644 --- a/dashboard-ui/strings/en-US.json +++ b/dashboard-ui/strings/en-US.json @@ -347,8 +347,10 @@ "LabelCustomPaths": "Specify custom paths where desired. Leave fields empty to use the defaults.", "LabelCachePath": "Cache path:", "LabelCachePathHelp": "Specify a custom location for server cache files, such as images. Leave blank to use the server default.", - "LabelRecordingPath": "Recording path:", - "LabelRecordingPathHelp": "Specify a custom location to save recordings. Leave blank to use the server default.", + "LabelRecordingPath": "Default recording path:", + "LabelMovieRecordingPath": "Movie recording path (optional):", + "LabelSeriesRecordingPath": "Series recording path (optional):", + "LabelRecordingPathHelp": "Specify the default location to save recordings. If left empty, the server's program data folder will be used.", "LabelImagesByNamePath": "Images by name path:", "LabelImagesByNamePathHelp": "Specify a custom location for downloaded actor, genre and studio images.", "LabelMetadataPath": "Metadata path:", @@ -1486,14 +1488,11 @@ "MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.", "HeaderSetupTVGuide": "Setup TV Guide", "LabelDataProvider": "Data provider:", - "OptionSendRecordingsToAutoOrganize": "Enable Auto-Organize for new recordings", - "OptionSendRecordingsToAutoOrganizeHelp": "New recordings will be sent to the Auto-Organize feature and imported into your media library.", + "OptionSendRecordingsToAutoOrganize": "Automatically organize recordings into existing series folders in other libraries", "HeaderDefaultPadding": "Default Padding", + "OptionEnableRecordingSubfolders": "Create sub-folders for categories such as Sports, Kids, etc.", "HeaderSubtitles": "Subtitles", "HeaderVideos": "Videos", - "OptionEnableVideoFrameAnalysis": "Enable frame by frame video analysis", - "OptionEnableVideoFrameAnalysisHelp": "Extract detailed information about videos that can be used to make transcoding as efficient as possible. This will cause library scans to take longer.", - "LabelVideoFrameAnalysisLimit": "Limit frame by frame analysis to videos less than:", "LabelHardwareAccelerationType": "Hardware acceleration:", "LabelHardwareAccelerationTypeHelp": "Available on supported systems only.", "ButtonServerDashboard": "Server Dashboard",