1
0
Fork 0
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:
Luke Pulverenti 2016-11-22 14:45:55 -05:00
parent 6763740078
commit 75280f26ca
11 changed files with 99 additions and 42 deletions

View file

@ -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> <style>
@media all and (min-width: 800px) { @media all and (min-width: 800px) {

View file

@ -22,14 +22,10 @@
</select> </select>
<div class="fieldDescription">${LabelNumberOfGuideDaysHelp}</div> <div class="fieldDescription">${LabelNumberOfGuideDaysHelp}</div>
</div> </div>
<h3 class="checkboxListLabel">${LabelEnableInternetMetadataForTvPrograms}</h3> <label class="checkboxContainer">
<div class="checkboxList"> <input type="checkbox" is="emby-checkbox" id="chkMovies" />
<label> <span>${OptionDownloadInternetMetadataTvPrograms}</span>
<input type="checkbox" is="emby-checkbox" id="chkMovies" /> </label>
<span>${OptionTVMovies}</span>
</label>
</div>
<br />
<div class="inputContainer"> <div class="inputContainer">
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<div style="flex-grow:1;"> <div style="flex-grow:1;">
@ -39,10 +35,6 @@
</div> </div>
<div class="fieldDescription">${LabelRecordingPathHelp}</div> <div class="fieldDescription">${LabelRecordingPathHelp}</div>
</div> </div>
<label class="checkboxContainer">
<input type="checkbox" is="emby-checkbox" id="chkEnableRecordingSubfolders" />
<span>${OptionEnableRecordingSubfolders}</span>
</label>
<div class="inputContainer"> <div class="inputContainer">
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<div style="flex-grow:1;"> <div style="flex-grow:1;">
@ -92,12 +84,41 @@
<div class="fieldDescription checkboxFieldDescription">${OptionConvertRecordingPreserveAudioHelp}</div> <div class="fieldDescription checkboxFieldDescription">${OptionConvertRecordingPreserveAudioHelp}</div>
</div> </div>
<div> <div>
<h1>${HeaderDefaultPadding}</h1> <h1>${HeaderRecordingPostProcessing}</h1>
<div class="inputContainer"> <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>
<div class="inputContainer"> <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>
</div> </div>
<br /> <br />

View file

@ -65,7 +65,7 @@
</div> </div>
<div class="checkboxContainer checkboxContainer-withDescription"> <div class="checkboxContainer checkboxContainer-withDescription">
<label> <label>
<input type="checkbox" is="emby-checkbox" id="chkThemeSong"/> <input type="checkbox" is="emby-checkbox" id="chkThemeSong" />
<span>${LabelEnableThemeSongs}</span> <span>${LabelEnableThemeSongs}</span>
</label> </label>
<div class="fieldDescription checkboxFieldDescription">${LabelEnableThemeSongsHelp}</div> <div class="fieldDescription checkboxFieldDescription">${LabelEnableThemeSongsHelp}</div>
@ -76,16 +76,17 @@
${HeaderDisplay} ${HeaderDisplay}
</h1> </h1>
<br /> <br />
<div class="checkboxList"> <div class="checkboxContainer checkboxContainer-withDescription">
<label> <label>
<input type="checkbox" is="emby-checkbox" class="chkDisplayMissingEpisodes" /> <input type="checkbox" is="emby-checkbox" class="chkDisplayMissingEpisodes" />
<span>${LabelDisplayMissingEpisodesWithinSeasons}</span> <span>${LabelDisplayMissingEpisodesWithinSeasons}</span>
</label> </label>
<label> <div class="fieldDescription checkboxFieldDescription">${LabelDisplayMissingEpisodesWithinSeasonsHelp}</div>
<input type="checkbox" is="emby-checkbox" class="chkDisplayUnairedEpisodes" />
<span>${LabelUnairedMissingEpisodesWithinSeasons}</span>
</label>
</div> </div>
<label class="checkboxContainer">
<input type="checkbox" is="emby-checkbox" class="chkDisplayUnairedEpisodes" />
<span>${LabelUnairedMissingEpisodesWithinSeasons}</span>
</label>
</div> </div>
<button is="emby-button" type="submit" class="raised button-submit block btnSave hide"> <button is="emby-button" type="submit" class="raised button-submit block btnSave hide">
<span>${ButtonSave}</span> <span>${ButtonSave}</span>

View file

@ -22,7 +22,8 @@
page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || ''; page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || '';
page.querySelector('#selectConversionFormat').value = config.RecordingEncodingFormat || ''; 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(); Dashboard.hideLoadingMsg();
} }
@ -57,7 +58,9 @@
config.RecordingEncodingFormat = form.querySelector('#selectConversionFormat').value; config.RecordingEncodingFormat = form.querySelector('#selectConversionFormat').value;
config.PrePaddingSeconds = $('#txtPrePaddingMinutes', form).val() * 60; config.PrePaddingSeconds = $('#txtPrePaddingMinutes', form).val() * 60;
config.PostPaddingSeconds = $('#txtPostPaddingMinutes', 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 () { ApiClient.updateNamedConfiguration("livetv", config).then(function () {
Dashboard.processServerConfigurationUpdateResult(); 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 () { }).on('pageshow', "#liveTvSettingsPage", function () {
LibraryMenu.setTabs('livetvadmin', 1, getTabs); LibraryMenu.setTabs('livetvadmin', 1, getTabs);

View file

@ -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'; 'use strict';
return function (view, params, tabContent) { return function (view, params, tabContent) {
@ -25,7 +25,7 @@
StartIndex: 0, StartIndex: 0,
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || 'Poster' view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
}; };
libraryBrowser.loadSavedQueryValues(key, pageData.query); libraryBrowser.loadSavedQueryValues(key, pageData.query);

View file

@ -25,7 +25,7 @@
StartIndex: 0, StartIndex: 0,
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || 'Poster' view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
}; };
pageData.query.ParentId = params.topParentId; pageData.query.ParentId = params.topParentId;

View file

@ -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'; 'use strict';
return function (view, params, tabContent) { return function (view, params, tabContent) {
@ -25,7 +25,7 @@
StartIndex: 0, StartIndex: 0,
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || 'Poster' view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
}; };
libraryBrowser.loadSavedQueryValues(key, pageData.query); libraryBrowser.loadSavedQueryValues(key, pageData.query);
@ -92,7 +92,8 @@
context: 'movies', context: 'movies',
cardLayout: true, cardLayout: true,
showTitle: true, showTitle: true,
showYear: true showYear: true,
vibrant: true
}); });
} }
else if (viewStyle == "Banner") { else if (viewStyle == "Banner") {
@ -120,7 +121,8 @@
context: 'movies', context: 'movies',
showTitle: true, showTitle: true,
showYear: true, showYear: true,
cardLayout: true cardLayout: true,
vibrant: true
}); });
} }
else { else {
@ -131,7 +133,9 @@
shape: "portrait", shape: "portrait",
context: 'movies', context: 'movies',
centerText: true, centerText: true,
overlayPlayButton: true overlayPlayButton: true,
showTitle: true,
showYear: true
}); });
} }

View file

@ -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'; 'use strict';
return function (view, params, tabContent) { return function (view, params, tabContent) {
@ -25,7 +25,7 @@
StartIndex: 0, StartIndex: 0,
Limit: pageSize Limit: pageSize
}, },
view: libraryBrowser.getSavedView(key) || 'PosterCard' view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
}; };
pageData.query.ParentId = params.topParentId; pageData.query.ParentId = params.topParentId;

View file

@ -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'; 'use strict';
return function (view, params, tabContent) { return function (view, params, tabContent) {
@ -23,7 +23,7 @@
EnableImageTypes: "Primary,Backdrop,Banner,Thumb", EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
Limit: LibraryBrowser.getDefaultPageSize() Limit: LibraryBrowser.getDefaultPageSize()
}, },
view: libraryBrowser.getSavedView(key) || 'PosterCard' view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
}; };
pageData.query.ParentId = params.topParentId; pageData.query.ParentId = params.topParentId;

View file

@ -1,4 +1,4 @@
define(['libraryBrowser', 'cardBuilder'], function (libraryBrowser, cardBuilder) { define(['libraryBrowser', 'cardBuilder', 'apphost'], function (libraryBrowser, cardBuilder, appHost) {
'use strict'; 'use strict';
return function (view, params, tabContent) { return function (view, params, tabContent) {
@ -20,7 +20,7 @@
Fields: "DateCreated,ItemCounts", Fields: "DateCreated,ItemCounts",
StartIndex: 0 StartIndex: 0
}, },
view: libraryBrowser.getSavedView(key) || 'PosterCard' view: libraryBrowser.getSavedView(key) || (appHost.preferVisualCards ? 'PosterCard' : 'Poster')
}; };
pageData.query.ParentId = params.topParentId; pageData.query.ParentId = params.topParentId;

View file

@ -94,9 +94,11 @@
"OptionEnableAccessToAllLibraries": "Enable access to all libraries", "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.", "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", "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", "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.", "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", "HeaderVideoPlaybackSettings": "Video Playback Settings",
"OptionDownloadInternetMetadataTvPrograms": "Download internet metadata for programs listed in the guide",
"HeaderPlaybackSettings": "Playback Settings", "HeaderPlaybackSettings": "Playback Settings",
"LabelAudioLanguagePreference": "Audio language preference:", "LabelAudioLanguagePreference": "Audio language preference:",
"LabelSubtitleLanguagePreference": "Subtitle language preference:", "LabelSubtitleLanguagePreference": "Subtitle language preference:",
@ -339,8 +341,10 @@
"TabFavorites": "Favorites", "TabFavorites": "Favorites",
"TabMyLibrary": "My Library", "TabMyLibrary": "My Library",
"ButtonCancelRecording": "Cancel Recording", "ButtonCancelRecording": "Cancel Recording",
"LabelPrePaddingMinutes": "Pre-padding minutes:", "LabelStartWhenPossible": "Start when possible:",
"LabelPostPaddingMinutes": "Post-padding minutes:", "LabelStopWhenPossible": "Stop when possible:",
"MinutesBefore": "minutes before",
"MinutesAfter": "minutes after",
"HeaderWhatsOnTV": "What's On", "HeaderWhatsOnTV": "What's On",
"TabStatus": "Status", "TabStatus": "Status",
"TabSettings": "Settings", "TabSettings": "Settings",
@ -1248,7 +1252,7 @@
"HeaderSetupTVGuide": "Setup TV Guide", "HeaderSetupTVGuide": "Setup TV Guide",
"LabelDataProvider": "Data provider:", "LabelDataProvider": "Data provider:",
"OptionSendRecordingsToAutoOrganize": "Automatically organize recordings into existing series folders in other libraries", "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.", "OptionEnableRecordingSubfolders": "Create sub-folders for categories such as Sports, Kids, etc.",
"HeaderSubtitles": "Subtitles", "HeaderSubtitles": "Subtitles",
"HeaderVideos": "Videos", "HeaderVideos": "Videos",
@ -2024,5 +2028,9 @@
"SynologyUpdateInstructions": "Please login to DSM and go to Package Center to update.", "SynologyUpdateInstructions": "Please login to DSM and go to Package Center to update.",
"LatestFromLibrary": "Latest {0}", "LatestFromLibrary": "Latest {0}",
"LabelMoviePrefix": "Movie prefix:", "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:"
} }