+
Video Playback
+
+
+
+
+
+
+
+
+
+
+
+
Audio Playback
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Subtitle Preferences
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Automation & Queue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Media Bar
diff --git a/Emby/Emby.Plugins.Moonfin/Pages/moonfin.js b/Emby/Emby.Plugins.Moonfin/Pages/moonfin.js
index d2ec179..1f785ee 100644
--- a/Emby/Emby.Plugins.Moonfin/Pages/moonfin.js
+++ b/Emby/Emby.Plugins.Moonfin/Pages/moonfin.js
@@ -643,6 +643,35 @@ define(['baseView', 'loading', 'emby-input', 'emby-button', 'emby-checkbox', 'em
return result.length > 0 ? result : null;
}
+ // ISO 639-2 codes, matching the table Core resolves track languages against.
+ // The audio and subtitle pickers share the list so the two stay in sync.
+ var LANGUAGE_OPTIONS = [
+ ['auto', 'Server Default'], ['eng', 'English'], ['spa', 'Spanish'],
+ ['fra', 'French'], ['deu', 'German'], ['ita', 'Italian'],
+ ['jpn', 'Japanese'], ['kor', 'Korean'], ['zho', 'Chinese'],
+ ['rus', 'Russian'], ['por', 'Portuguese'], ['ara', 'Arabic'],
+ ['hin', 'Hindi'], ['nld', 'Dutch'], ['pol', 'Polish'],
+ ['swe', 'Swedish'], ['nor', 'Norwegian'], ['dan', 'Danish'],
+ ['fin', 'Finnish'], ['tha', 'Thai'], ['tur', 'Turkish'],
+ ['heb', 'Hebrew'], ['ces', 'Czech'], ['ell', 'Greek'],
+ ['ron', 'Romanian'], ['hun', 'Hungarian'], ['ukr', 'Ukrainian'],
+ ['ind', 'Indonesian'], ['vie', 'Vietnamese']
+ ];
+
+ function fillLanguageSelect(view, selector) {
+ var select = view.querySelector(selector);
+ if (!select || select.dataset.filled) return;
+ select.dataset.filled = 'true';
+ var html = '';
+ for (var i = 0; i < LANGUAGE_OPTIONS.length; i++) {
+ var code = LANGUAGE_OPTIONS[i][0];
+ var label = LANGUAGE_OPTIONS[i][1];
+ html += '';
+ }
+ select.innerHTML = html;
+ }
+
// Same ids and declaration order as DetailButton in Core, so an untouched
// arrangement here matches what a fresh client shows.
var DETAIL_BUTTONS = [
@@ -1744,6 +1773,26 @@ define(['baseView', 'loading', 'emby-input', 'emby-button', 'emby-checkbox', 'em
setNullableBoolSelect(view, '#DefaultPreviewAudioEnabled', defaults.previewAudioEnabled);
setSelectValue(view, '#DefaultSeasonalSurprise', defaults.seasonalSurprise, 'Configured surprise');
+ setSelectValue(view, '#DefaultResumeSubtractDuration', defaults.resumeSubtractDuration != null ? String(defaults.resumeSubtractDuration) : '', 'Configured rewind');
+ setSelectValue(view, '#DefaultUnpauseRewindDuration', defaults.unpauseRewindDuration != null ? String(defaults.unpauseRewindDuration) : '', 'Configured rewind');
+ setSelectValue(view, '#DefaultSkipBackLength', defaults.skipBackLength != null ? String(defaults.skipBackLength) : '', 'Configured skip');
+ setSelectValue(view, '#DefaultSkipForwardLength', defaults.skipForwardLength != null ? String(defaults.skipForwardLength) : '', 'Configured skip');
+
+ fillLanguageSelect(view, '#DefaultDefaultAudioLanguage');
+ fillLanguageSelect(view, '#DefaultDefaultSubtitleLanguage');
+ setSelectValue(view, '#DefaultDefaultAudioLanguage', defaults.defaultAudioLanguage, 'Configured language');
+ setNullableBoolSelect(view, '#DefaultPreferDefaultAudioTrack', defaults.preferDefaultAudioTrack);
+ setNullableBoolSelect(view, '#DefaultPreferAudioDescription', defaults.preferAudioDescription);
+
+ setSelectValue(view, '#DefaultSubtitleMode', defaults.subtitleMode, 'Configured mode');
+ setSelectValue(view, '#DefaultDefaultSubtitleLanguage', defaults.defaultSubtitleLanguage, 'Configured language');
+ setNullableBoolSelect(view, '#DefaultPreferSdhSubtitles', defaults.preferSdhSubtitles);
+
+ setNullableBoolSelect(view, '#DefaultCinemaModeEnabled', defaults.cinemaModeEnabled);
+ setNullableBoolSelect(view, '#DefaultAutoplayNextEpisode', defaults.autoplayNextEpisode);
+ setSelectValue(view, '#DefaultNextUpTimeout', defaults.nextUpTimeout != null ? String(defaults.nextUpTimeout) : '', 'Configured timeout');
+ setSelectValue(view, '#DefaultStillWatchingBehavior', defaults.stillWatchingBehavior, 'Configured behavior');
+
setSelectValue(view, '#DefaultHomeRowsStyle', defaults.homeRowsStyle, 'Configured style');
setNullableBoolSelect(view, '#DefaultFullScreenRows', defaults.fullScreenRows);
setNullableBoolSelect(view, '#DefaultHomeRowInfoOverlay', defaults.homeRowInfoOverlay);
@@ -1887,6 +1936,25 @@ define(['baseView', 'loading', 'emby-input', 'emby-button', 'emby-checkbox', 'em
d.previewAudioEnabled = getNullableBoolSelect(view, '#DefaultPreviewAudioEnabled');
d.seasonalSurprise = view.querySelector('#DefaultSeasonalSurprise').value || null;
+ // Clients store this one as text, unlike the millisecond fields below.
+ d.resumeSubtractDuration = view.querySelector('#DefaultResumeSubtractDuration').value || null;
+ d.unpauseRewindDuration = getNullableIntInput(view, '#DefaultUnpauseRewindDuration');
+ d.skipBackLength = getNullableIntInput(view, '#DefaultSkipBackLength');
+ d.skipForwardLength = getNullableIntInput(view, '#DefaultSkipForwardLength');
+
+ d.defaultAudioLanguage = view.querySelector('#DefaultDefaultAudioLanguage').value.trim() || null;
+ d.preferDefaultAudioTrack = getNullableBoolSelect(view, '#DefaultPreferDefaultAudioTrack');
+ d.preferAudioDescription = getNullableBoolSelect(view, '#DefaultPreferAudioDescription');
+
+ d.subtitleMode = view.querySelector('#DefaultSubtitleMode').value || null;
+ d.defaultSubtitleLanguage = view.querySelector('#DefaultDefaultSubtitleLanguage').value.trim() || null;
+ d.preferSdhSubtitles = getNullableBoolSelect(view, '#DefaultPreferSdhSubtitles');
+
+ d.cinemaModeEnabled = getNullableBoolSelect(view, '#DefaultCinemaModeEnabled');
+ d.autoplayNextEpisode = getNullableBoolSelect(view, '#DefaultAutoplayNextEpisode');
+ d.nextUpTimeout = getNullableIntInput(view, '#DefaultNextUpTimeout');
+ d.stillWatchingBehavior = view.querySelector('#DefaultStillWatchingBehavior').value || null;
+
var collectionIds = Array.prototype.slice.call(view.querySelectorAll('.adminCollectionCb:checked')).map(function (cb) { return cb.dataset.id; });
d.mediaBarCollectionIds = collectionIds.length > 0 ? collectionIds : null;
var libraryIds = Array.prototype.slice.call(view.querySelectorAll('.adminLibraryCb:checked')).map(function (cb) { return cb.dataset.id; });
diff --git a/Jellyfin/backend/Pages/configPage.html b/Jellyfin/backend/Pages/configPage.html
index 10d11e5..846e946 100644
--- a/Jellyfin/backend/Pages/configPage.html
+++ b/Jellyfin/backend/Pages/configPage.html
@@ -717,6 +717,7 @@
Default User Settings
+
@@ -1170,7 +1171,143 @@
Library Vi
-
+
+
+
Video Playback
+
+
+
+
+
+
+
+
+
+
+
+
Audio Playback
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Subtitle Preferences
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Automation & Queue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Media Bar
@@ -2201,6 +2338,35 @@
Active Downloads
return result.length > 0 ? result : null;
}
+ // ISO 639-2 codes, matching the table Core resolves track languages against.
+ // The audio and subtitle pickers share the list so the two stay in sync.
+ var LANGUAGE_OPTIONS = [
+ ['auto', 'Server Default'], ['eng', 'English'], ['spa', 'Spanish'],
+ ['fra', 'French'], ['deu', 'German'], ['ita', 'Italian'],
+ ['jpn', 'Japanese'], ['kor', 'Korean'], ['zho', 'Chinese'],
+ ['rus', 'Russian'], ['por', 'Portuguese'], ['ara', 'Arabic'],
+ ['hin', 'Hindi'], ['nld', 'Dutch'], ['pol', 'Polish'],
+ ['swe', 'Swedish'], ['nor', 'Norwegian'], ['dan', 'Danish'],
+ ['fin', 'Finnish'], ['tha', 'Thai'], ['tur', 'Turkish'],
+ ['heb', 'Hebrew'], ['ces', 'Czech'], ['ell', 'Greek'],
+ ['ron', 'Romanian'], ['hun', 'Hungarian'], ['ukr', 'Ukrainian'],
+ ['ind', 'Indonesian'], ['vie', 'Vietnamese']
+ ];
+
+ function fillLanguageSelect(selector) {
+ var select = document.querySelector(selector);
+ if (!select || select.dataset.filled) return;
+ select.dataset.filled = 'true';
+ var html = '';
+ for (var i = 0; i < LANGUAGE_OPTIONS.length; i++) {
+ var code = LANGUAGE_OPTIONS[i][0];
+ var label = LANGUAGE_OPTIONS[i][1];
+ html += '';
+ }
+ select.innerHTML = html;
+ }
+
// Same ids and declaration order as DetailButton in Core, so an untouched
// arrangement here matches what a fresh client shows.
var DETAIL_BUTTONS = [
@@ -3532,6 +3698,26 @@ Active Downloads
setNullableBoolSelect('#DefaultEpisodePreviewEnabled', defaults.episodePreviewEnabled);
setNullableBoolSelect('#DefaultPreviewAudioEnabled', defaults.previewAudioEnabled);
+ setSelectValue('#DefaultResumeSubtractDuration', defaults.resumeSubtractDuration != null ? String(defaults.resumeSubtractDuration) : '', 'Configured rewind');
+ setSelectValue('#DefaultUnpauseRewindDuration', defaults.unpauseRewindDuration != null ? String(defaults.unpauseRewindDuration) : '', 'Configured rewind');
+ setSelectValue('#DefaultSkipBackLength', defaults.skipBackLength != null ? String(defaults.skipBackLength) : '', 'Configured skip');
+ setSelectValue('#DefaultSkipForwardLength', defaults.skipForwardLength != null ? String(defaults.skipForwardLength) : '', 'Configured skip');
+
+ fillLanguageSelect('#DefaultDefaultAudioLanguage');
+ fillLanguageSelect('#DefaultDefaultSubtitleLanguage');
+ setSelectValue('#DefaultDefaultAudioLanguage', defaults.defaultAudioLanguage, 'Configured language');
+ setNullableBoolSelect('#DefaultPreferDefaultAudioTrack', defaults.preferDefaultAudioTrack);
+ setNullableBoolSelect('#DefaultPreferAudioDescription', defaults.preferAudioDescription);
+
+ setSelectValue('#DefaultSubtitleMode', defaults.subtitleMode, 'Configured mode');
+ setSelectValue('#DefaultDefaultSubtitleLanguage', defaults.defaultSubtitleLanguage, 'Configured language');
+ setNullableBoolSelect('#DefaultPreferSdhSubtitles', defaults.preferSdhSubtitles);
+
+ setNullableBoolSelect('#DefaultCinemaModeEnabled', defaults.cinemaModeEnabled);
+ setNullableBoolSelect('#DefaultAutoplayNextEpisode', defaults.autoplayNextEpisode);
+ setSelectValue('#DefaultNextUpTimeout', defaults.nextUpTimeout != null ? String(defaults.nextUpTimeout) : '', 'Configured timeout');
+ setSelectValue('#DefaultStillWatchingBehavior', defaults.stillWatchingBehavior, 'Configured behavior');
+
setCheckbox('#DefaultMdblistEnabled', defaults.mdblistEnabled);
setCheckbox('#DefaultTmdbEpisodeRatingsEnabled', defaults.tmdbEpisodeRatingsEnabled);
setNullableBoolSelect('#DefaultMdblistShowRatingBadges', defaults.mdblistShowRatingBadges);
@@ -3848,6 +4034,25 @@ Active Downloads
config.DefaultUserSettings.previewAudioEnabled = getNullableBoolSelect('#DefaultPreviewAudioEnabled');
config.DefaultUserSettings.seasonalSurprise = document.querySelector('#DefaultSeasonalSurprise').value || null;
+ // Clients store this one as text, unlike the millisecond fields below.
+ config.DefaultUserSettings.resumeSubtractDuration = document.querySelector('#DefaultResumeSubtractDuration').value || null;
+ config.DefaultUserSettings.unpauseRewindDuration = getNullableIntInput('#DefaultUnpauseRewindDuration');
+ config.DefaultUserSettings.skipBackLength = getNullableIntInput('#DefaultSkipBackLength');
+ config.DefaultUserSettings.skipForwardLength = getNullableIntInput('#DefaultSkipForwardLength');
+
+ config.DefaultUserSettings.defaultAudioLanguage = document.querySelector('#DefaultDefaultAudioLanguage').value.trim() || null;
+ config.DefaultUserSettings.preferDefaultAudioTrack = getNullableBoolSelect('#DefaultPreferDefaultAudioTrack');
+ config.DefaultUserSettings.preferAudioDescription = getNullableBoolSelect('#DefaultPreferAudioDescription');
+
+ config.DefaultUserSettings.subtitleMode = document.querySelector('#DefaultSubtitleMode').value || null;
+ config.DefaultUserSettings.defaultSubtitleLanguage = document.querySelector('#DefaultDefaultSubtitleLanguage').value.trim() || null;
+ config.DefaultUserSettings.preferSdhSubtitles = getNullableBoolSelect('#DefaultPreferSdhSubtitles');
+
+ config.DefaultUserSettings.cinemaModeEnabled = getNullableBoolSelect('#DefaultCinemaModeEnabled');
+ config.DefaultUserSettings.autoplayNextEpisode = getNullableBoolSelect('#DefaultAutoplayNextEpisode');
+ config.DefaultUserSettings.nextUpTimeout = getNullableIntInput('#DefaultNextUpTimeout');
+ config.DefaultUserSettings.stillWatchingBehavior = document.querySelector('#DefaultStillWatchingBehavior').value || null;
+
var collectionCbs = document.querySelectorAll('.adminCollectionCb:checked');
var collectionIds = [];
for (var ci = 0; ci < collectionCbs.length; ci++) {