aboutsummaryrefslogtreecommitdiff
path: root/internal/ui
diff options
context:
space:
mode:
Diffstat (limited to 'internal/ui')
-rw-r--r--internal/ui/form/settings.go11
-rw-r--r--internal/ui/form/settings_test.go3
-rw-r--r--internal/ui/settings_show.go1
-rw-r--r--internal/ui/settings_update.go1
-rw-r--r--internal/ui/static/js/bootstrap.js12
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;
+ }
+ });
});