diff --git a/Emby/Emby.Plugins.Moonfin/Pages/configPage.html b/Emby/Emby.Plugins.Moonfin/Pages/configPage.html index 2207e66..c1c04a5 100644 --- a/Emby/Emby.Plugins.Moonfin/Pages/configPage.html +++ b/Emby/Emby.Plugins.Moonfin/Pages/configPage.html @@ -910,6 +910,7 @@

Default User Settings

+ @@ -1385,7 +1386,143 @@

Library Vi - + +
+

Video Playback

+
+ + +
Automatically rewinds slightly when resuming an in-progress video.
+
+
+ + +
Rewinds slightly when unpausing 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

+
+ + +
Automatically rewinds slightly when resuming an in-progress video.
+
+
+ + +
Rewinds slightly when unpausing 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++) {