diff options
Diffstat (limited to 'internal/ui')
-rw-r--r-- | internal/ui/form/settings.go | 11 | ||||
-rw-r--r-- | internal/ui/form/settings_test.go | 3 | ||||
-rw-r--r-- | internal/ui/settings_show.go | 1 | ||||
-rw-r--r-- | internal/ui/settings_update.go | 1 | ||||
-rw-r--r-- | internal/ui/static/js/bootstrap.js | 12 |
5 files changed, 26 insertions, 2 deletions
diff --git a/internal/ui/form/settings.go b/internal/ui/form/settings.go index d5442218..a46d9714 100644 --- a/internal/ui/form/settings.go +++ b/internal/ui/form/settings.go @@ -33,6 +33,7 @@ type SettingsForm struct { DefaultHomePage string CategoriesSortingOrder string MarkReadOnView bool + MediaPlaybackRate float64 } // Merge updates the fields of the given user. @@ -55,6 +56,7 @@ func (s *SettingsForm) Merge(user *model.User) *model.User { user.DefaultHomePage = s.DefaultHomePage user.CategoriesSortingOrder = s.CategoriesSortingOrder user.MarkReadOnView = s.MarkReadOnView + user.MediaPlaybackRate = s.MediaPlaybackRate if s.Password != "" { user.Password = s.Password @@ -84,6 +86,10 @@ func (s *SettingsForm) Validate() *locale.LocalizedError { } } + if s.MediaPlaybackRate < 0.25 || s.MediaPlaybackRate > 4 { + return locale.NewLocalizedError("error.settings_media_playback_rate_range") + } + return nil } @@ -101,6 +107,10 @@ func NewSettingsForm(r *http.Request) *SettingsForm { if err != nil { cjkReadingSpeed = 0 } + mediaPlaybackRate, err := strconv.ParseFloat(r.FormValue("media_playback_rate"), 64) + if err != nil { + mediaPlaybackRate = 1 + } return &SettingsForm{ Username: r.FormValue("username"), Password: r.FormValue("password"), @@ -122,5 +132,6 @@ func NewSettingsForm(r *http.Request) *SettingsForm { DefaultHomePage: r.FormValue("default_home_page"), CategoriesSortingOrder: r.FormValue("categories_sorting_order"), MarkReadOnView: r.FormValue("mark_read_on_view") == "1", + MediaPlaybackRate: mediaPlaybackRate, } } diff --git a/internal/ui/form/settings_test.go b/internal/ui/form/settings_test.go index a8afdfb7..84bbd9b7 100644 --- a/internal/ui/form/settings_test.go +++ b/internal/ui/form/settings_test.go @@ -22,6 +22,7 @@ func TestValid(t *testing.T) { DefaultReadingSpeed: 35, CJKReadingSpeed: 25, DefaultHomePage: "unread", + MediaPlaybackRate: 1.25, } err := settings.Validate() @@ -45,6 +46,7 @@ func TestConfirmationEmpty(t *testing.T) { DefaultReadingSpeed: 35, CJKReadingSpeed: 25, DefaultHomePage: "unread", + MediaPlaybackRate: 1.25, } err := settings.Validate() @@ -72,6 +74,7 @@ func TestConfirmationIncorrect(t *testing.T) { DefaultReadingSpeed: 35, CJKReadingSpeed: 25, DefaultHomePage: "unread", + MediaPlaybackRate: 1.25, } err := settings.Validate() diff --git a/internal/ui/settings_show.go b/internal/ui/settings_show.go index 23e6d401..3a96b29c 100644 --- a/internal/ui/settings_show.go +++ b/internal/ui/settings_show.go @@ -41,6 +41,7 @@ func (h *handler) showSettingsPage(w http.ResponseWriter, r *http.Request) { DefaultHomePage: user.DefaultHomePage, CategoriesSortingOrder: user.CategoriesSortingOrder, MarkReadOnView: user.MarkReadOnView, + MediaPlaybackRate: user.MediaPlaybackRate, } timezones, err := h.store.Timezones() diff --git a/internal/ui/settings_update.go b/internal/ui/settings_update.go index 122ad441..e0e3c0af 100644 --- a/internal/ui/settings_update.go +++ b/internal/ui/settings_update.go @@ -62,6 +62,7 @@ func (h *handler) updateSettings(w http.ResponseWriter, r *http.Request) { DefaultReadingSpeed: model.OptionalInt(settingsForm.DefaultReadingSpeed), CJKReadingSpeed: model.OptionalInt(settingsForm.CJKReadingSpeed), DefaultHomePage: model.OptionalString(settingsForm.DefaultHomePage), + MediaPlaybackRate: model.OptionalFloat(settingsForm.MediaPlaybackRate), } if validationErr := validator.ValidateUserModification(h.store, loggedUser.ID, userModificationRequest); validationErr != nil { diff --git a/internal/ui/static/js/bootstrap.js b/internal/ui/static/js/bootstrap.js index 0acef71c..0a9c2b78 100644 --- a/internal/ui/static/js/bootstrap.js +++ b/internal/ui/static/js/bootstrap.js @@ -152,11 +152,19 @@ document.addEventListener("DOMContentLoaded", () => { }); // Save and resume media position - const elements = document.querySelectorAll("audio[data-last-position],video[data-last-position]"); - elements.forEach((element) => { + const lastPositionElements = document.querySelectorAll("audio[data-last-position],video[data-last-position]"); + lastPositionElements.forEach((element) => { if (element.dataset.lastPosition) { element.currentTime = element.dataset.lastPosition; } element.ontimeupdate = () => handlePlayerProgressionSave(element); }); + + // Set media playback rate + const playbackRateElements = document.querySelectorAll("audio[data-playback-rate],video[data-playback-rate]"); + playbackRateElements.forEach((element) => { + if (element.dataset.playbackRate) { + element.playbackRate = element.dataset.playbackRate; + } + }); }); |