mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
add recording post processing option
This commit is contained in:
parent
6763740078
commit
75280f26ca
11 changed files with 99 additions and 42 deletions
|
@ -1,4 +1,4 @@
|
|||
<div id="liveTvSeriesTimerPage" data-role="page" class="page libraryPage liveTvPage noSecondaryNavPage" data-title="${HeaderLiveTv}" data-menubutton="false">
|
||||
<div id="liveTvSeriesTimerPage" data-role="page" class="page libraryPage liveTvPage noSecondaryNavPage" data-title="${HeaderLiveTv}" data-backbutton="true">
|
||||
|
||||
<style>
|
||||
@media all and (min-width: 800px) {
|
||||
|
|
|
@ -22,14 +22,10 @@
|
|||
</select>
|
||||
<div class="fieldDescription">${LabelNumberOfGuideDaysHelp}</div>
|
||||
</div>
|
||||
<h3 class="checkboxListLabel">${LabelEnableInternetMetadataForTvPrograms}</h3>
|
||||
<div class="checkboxList">
|
||||
<label>
|
||||
<input type="checkbox" is="emby-checkbox" id="chkMovies" />
|
||||
<span>${OptionTVMovies}</span>
|
||||
</label>
|
||||
</div>
|
||||
<br />
|
||||
<label class="checkboxContainer">
|
||||
<input type="checkbox" is="emby-checkbox" id="chkMovies" />
|
||||
<span>${OptionDownloadInternetMetadataTvPrograms}</span>
|
||||
</label>
|
||||
<div class="inputContainer">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<div style="flex-grow:1;">
|
||||
|
@ -39,10 +35,6 @@
|
|||
</div>
|
||||
<div class="fieldDescription">${LabelRecordingPathHelp}</div>
|
||||
</div>
|
||||
<label class="checkboxContainer">
|
||||
<input type="checkbox" is="emby-checkbox" id="chkEnableRecordingSubfolders" />
|
||||
<span>${OptionEnableRecordingSubfolders}</span>
|
||||
</label>
|
||||
<div class="inputContainer">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<div style="flex-grow:1;">
|
||||
|
@ -92,12 +84,41 @@
|
|||
<div class="fieldDescription checkboxFieldDescription">${OptionConvertRecordingPreserveAudioHelp}</div>
|
||||
</div>
|
||||
<div>
|
||||
<h1>${HeaderDefaultPadding}</h1>
|
||||
<h1>${HeaderRecordingPostProcessing}</h1>
|
||||
<div class="inputContainer">
|
||||
<input is="emby-input" type="number" id="txtPrePaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelPrePaddingMinutes}" />
|
||||
<div style="display: flex; align-items: center;">
|
||||
<div style="flex-grow:1;">
|
||||
<input is="emby-input" type="text" id="txtPostProcessor" label="${LabelPostProcessor}" />
|
||||
</div>
|
||||
<button type="button" is="paper-icon-button-light" id="btnSelectPostProcessorPath" class="autoSize"><i class="md-icon">search</i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inputContainer">
|
||||
<input is="emby-input" type="number" id="txtPostPaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelPostPaddingMinutes}" />
|
||||
<input is="emby-input" type="text" id="txtPostProcessorArguments" label="${LabelPostProcessorArguments}" />
|
||||
<div class="fieldDescription">${LabelPostProcessorArgumentsHelp}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h1>${HeaderDefaultRecordingSettings}</h1>
|
||||
<div class="inputContainer">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<div style="flex-grow: 1;">
|
||||
<input is="emby-input" type="number" id="txtPrePaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelStartWhenPossible}" />
|
||||
</div>
|
||||
<div class="fieldDescription" style="margin-left:.5em;font-size:90%;margin-top:1.3em;">
|
||||
${MinutesBefore}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="inputContainer">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<div style="flex-grow: 1;">
|
||||
<input is="emby-input" type="number" id="txtPostPaddingMinutes" pattern="[0-9]*" required="required" min="0" step="1" label="${LabelStopWhenPossible}" />
|
||||
</div>
|
||||
<div class="fieldDescription" style="margin-left:.5em;font-size:90%;margin-top:1.3em;">
|
||||
${MinutesAfter}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
</div>
|
||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||
<label>
|
||||
<input type="checkbox" is="emby-checkbox" id="chkThemeSong"/>
|
||||
<input type="checkbox" is="emby-checkbox" id="chkThemeSong" />
|
||||
<span>${LabelEnableThemeSongs}</span>
|
||||
</label>
|
||||
<div class="fieldDescription checkboxFieldDescription">${LabelEnableThemeSongsHelp}</div>
|
||||
|
@ -76,16 +76,17 @@
|
|||
${HeaderDisplay}
|
||||
</h1>
|
||||
<br />
|
||||
<div class="checkboxList">
|
||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||
<label>
|
||||
<input type="checkbox" is="emby-checkbox" class="chkDisplayMissingEpisodes" />
|
||||
<span>${LabelDisplayMissingEpisodesWithinSeasons}</span>
|
||||
</label>
|
||||
<label>
|
||||
<input type="checkbox" is="emby-checkbox" class="chkDisplayUnairedEpisodes" />
|
||||
<span>${LabelUnairedMissingEpisodesWithinSeasons}</span>
|
||||
</label>
|
||||
<div class="fieldDescription checkboxFieldDescription">${LabelDisplayMissingEpisodesWithinSeasonsHelp}</div>
|
||||
</div>
|
||||
<label class="checkboxContainer">
|
||||
<input type="checkbox" is="emby-checkbox" class="chkDisplayUnairedEpisodes" />
|
||||
<span>${LabelUnairedMissingEpisodesWithinSeasons}</span>
|
||||
</label>
|
||||
</div>
|
||||
<button is="emby-button" type="submit" class="raised button-submit block btnSave hide">
|
||||
<span>${ButtonSave}</span>
|
||||
|
|
|
@ -22,7 +22,8 @@
|
|||
page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || '';
|
||||
page.querySelector('#selectConversionFormat').value = config.RecordingEncodingFormat || '';
|
||||
|
||||
page.querySelector('#chkEnableRecordingSubfolders').checked = config.EnableRecordingSubfolders || false;
|
||||
page.querySelector('#txtPostProcessor').value = config.RecordingPostProcessor || '';
|
||||
page.querySelector('#txtPostProcessorArguments').value = config.RecordingPostProcessorArguments || '';
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
}
|
||||
|
@ -57,7 +58,9 @@
|
|||
config.RecordingEncodingFormat = form.querySelector('#selectConversionFormat').value;
|
||||
config.PrePaddingSeconds = $('#txtPrePaddingMinutes', form).val() * 60;
|
||||
config.PostPaddingSeconds = $('#txtPostPaddingMinutes', form).val() * 60;
|
||||
config.EnableRecordingSubfolders = form.querySelector('#chkEnableRecordingSubfolders').checked;
|
||||
|
||||
config.RecordingPostProcessor = $('#txtPostProcessor', form).val();
|
||||
config.RecordingPostProcessorArguments = $('#txtPostProcessorArguments', form).val();
|
||||
|
||||
ApiClient.updateNamedConfiguration("livetv", config).then(function () {
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
|
@ -164,6 +167,26 @@
|
|||
});
|
||||
});
|
||||
|
||||
$('#btnSelectPostProcessorPath', page).on("click.selectDirectory", function () {
|
||||
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
|
||||
var picker = new directoryBrowser();
|
||||
|
||||
picker.show({
|
||||
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
|
||||
if (path) {
|
||||
$('#txtPostProcessor', page).val(path);
|
||||
}
|
||||
picker.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}).on('pageshow', "#liveTvSettingsPage", function () {
|
||||
|
||||
LibraryMenu.setTabs('livetvadmin', 1, getTabs);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, cardBuilder) {
|
||||
define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) {
|
||||
'use strict';
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
@ -25,7 +25,7 @@
|
|||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || 'Poster'
|
||||
view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
|
||||
};
|
||||
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || 'Poster'
|
||||
view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
|
||||
};
|
||||
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder) {
|
||||
define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
'use strict';
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
@ -25,7 +25,7 @@
|
|||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || 'Poster'
|
||||
view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
|
||||
};
|
||||
|
||||
libraryBrowser.loadSavedQueryValues(key, pageData.query);
|
||||
|
@ -92,7 +92,8 @@
|
|||
context: 'movies',
|
||||
cardLayout: true,
|
||||
showTitle: true,
|
||||
showYear: true
|
||||
showYear: true,
|
||||
vibrant: true
|
||||
});
|
||||
}
|
||||
else if (viewStyle == "Banner") {
|
||||
|
@ -120,7 +121,8 @@
|
|||
context: 'movies',
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
cardLayout: true
|
||||
cardLayout: true,
|
||||
vibrant: true
|
||||
});
|
||||
}
|
||||
else {
|
||||
|
@ -131,7 +133,9 @@
|
|||
shape: "portrait",
|
||||
context: 'movies',
|
||||
centerText: true,
|
||||
overlayPlayButton: true
|
||||
overlayPlayButton: true,
|
||||
showTitle: true,
|
||||
showYear: true
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder) {
|
||||
define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
'use strict';
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
@ -25,7 +25,7 @@
|
|||
StartIndex: 0,
|
||||
Limit: pageSize
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || 'PosterCard'
|
||||
view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
|
||||
};
|
||||
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder) {
|
||||
define(['events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
|
||||
'use strict';
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
@ -23,7 +23,7 @@
|
|||
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
|
||||
Limit: LibraryBrowser.getDefaultPageSize()
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || 'PosterCard'
|
||||
view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
|
||||
};
|
||||
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
define(['libraryBrowser', 'cardBuilder'], function (libraryBrowser, cardBuilder) {
|
||||
define(['libraryBrowser', 'cardBuilder', 'apphost'], function (libraryBrowser, cardBuilder, appHost) {
|
||||
'use strict';
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
@ -20,7 +20,7 @@
|
|||
Fields: "DateCreated,ItemCounts",
|
||||
StartIndex: 0
|
||||
},
|
||||
view: libraryBrowser.getSavedView(key) || 'PosterCard'
|
||||
view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
|
||||
};
|
||||
|
||||
pageData.query.ParentId = params.topParentId;
|
||||
|
|
|
@ -94,9 +94,11 @@
|
|||
"OptionEnableAccessToAllLibraries": "Enable access to all libraries",
|
||||
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
|
||||
"LabelDisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
|
||||
"LabelDisplayMissingEpisodesWithinSeasonsHelp": "This must also be enabled for TV libraries in Emby Server setup.",
|
||||
"LabelUnairedMissingEpisodesWithinSeasons": "Display unaired episodes within seasons",
|
||||
"ImportMissingEpisodesHelp": "If enabled, information about missing episodes will be imported into your Emby database and displayed within seasons and series. This may cause significantly longer library scans.",
|
||||
"HeaderVideoPlaybackSettings": "Video Playback Settings",
|
||||
"OptionDownloadInternetMetadataTvPrograms": "Download internet metadata for programs listed in the guide",
|
||||
"HeaderPlaybackSettings": "Playback Settings",
|
||||
"LabelAudioLanguagePreference": "Audio language preference:",
|
||||
"LabelSubtitleLanguagePreference": "Subtitle language preference:",
|
||||
|
@ -339,8 +341,10 @@
|
|||
"TabFavorites": "Favorites",
|
||||
"TabMyLibrary": "My Library",
|
||||
"ButtonCancelRecording": "Cancel Recording",
|
||||
"LabelPrePaddingMinutes": "Pre-padding minutes:",
|
||||
"LabelPostPaddingMinutes": "Post-padding minutes:",
|
||||
"LabelStartWhenPossible": "Start when possible:",
|
||||
"LabelStopWhenPossible": "Stop when possible:",
|
||||
"MinutesBefore": "minutes before",
|
||||
"MinutesAfter": "minutes after",
|
||||
"HeaderWhatsOnTV": "What's On",
|
||||
"TabStatus": "Status",
|
||||
"TabSettings": "Settings",
|
||||
|
@ -1248,7 +1252,7 @@
|
|||
"HeaderSetupTVGuide": "Setup TV Guide",
|
||||
"LabelDataProvider": "Data provider:",
|
||||
"OptionSendRecordingsToAutoOrganize": "Automatically organize recordings into existing series folders in other libraries",
|
||||
"HeaderDefaultPadding": "Default Padding",
|
||||
"HeaderDefaultRecordingSettings": "Default Recording Settings",
|
||||
"OptionEnableRecordingSubfolders": "Create sub-folders for categories such as Sports, Kids, etc.",
|
||||
"HeaderSubtitles": "Subtitles",
|
||||
"HeaderVideos": "Videos",
|
||||
|
@ -2024,5 +2028,9 @@
|
|||
"SynologyUpdateInstructions": "Please login to DSM and go to Package Center to update.",
|
||||
"LatestFromLibrary": "Latest {0}",
|
||||
"LabelMoviePrefix": "Movie prefix:",
|
||||
"LabelMoviePrefixHelp": "If a prefix is applied to movie titles, enter it here so that Emby can handle it properly."
|
||||
"LabelMoviePrefixHelp": "If a prefix is applied to movie titles, enter it here so that Emby can handle it properly.",
|
||||
"HeaderRecordingPostProcessing": "Recording Post Processing",
|
||||
"LabelPostProcessorArguments": "Post-processor command line arguments:",
|
||||
"LabelPostProcessorArgumentsHelp": "Use {path} as the path to the recording file.",
|
||||
"LabelPostProcessor": "Post-processing application:"
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue