Skip to content

Commit

Permalink
feat: Media player: Conrol playback speed
Browse files Browse the repository at this point in the history
fix  #1845
  • Loading branch information
Romain de Laage committed Mar 16, 2024
1 parent e299e82 commit 67741f0
Show file tree
Hide file tree
Showing 30 changed files with 174 additions and 74 deletions.
46 changes: 24 additions & 22 deletions client/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ type User struct {
DefaultHomePage string `json:"default_home_page"`
CategoriesSortingOrder string `json:"categories_sorting_order"`
MarkReadOnView bool `json:"mark_read_on_view"`
MediaPlaybackRate float64 `json:"media_playback_rate"`
}

func (u User) String() string {
Expand All @@ -58,28 +59,29 @@ type UserCreationRequest struct {

// UserModificationRequest represents the request to update a user.
type UserModificationRequest struct {
Username *string `json:"username"`
Password *string `json:"password"`
IsAdmin *bool `json:"is_admin"`
Theme *string `json:"theme"`
Language *string `json:"language"`
Timezone *string `json:"timezone"`
EntryDirection *string `json:"entry_sorting_direction"`
EntryOrder *string `json:"entry_sorting_order"`
Stylesheet *string `json:"stylesheet"`
GoogleID *string `json:"google_id"`
OpenIDConnectID *string `json:"openid_connect_id"`
EntriesPerPage *int `json:"entries_per_page"`
KeyboardShortcuts *bool `json:"keyboard_shortcuts"`
ShowReadingTime *bool `json:"show_reading_time"`
EntrySwipe *bool `json:"entry_swipe"`
GestureNav *string `json:"gesture_nav"`
DisplayMode *string `json:"display_mode"`
DefaultReadingSpeed *int `json:"default_reading_speed"`
CJKReadingSpeed *int `json:"cjk_reading_speed"`
DefaultHomePage *string `json:"default_home_page"`
CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"`
Username *string `json:"username"`
Password *string `json:"password"`
IsAdmin *bool `json:"is_admin"`
Theme *string `json:"theme"`
Language *string `json:"language"`
Timezone *string `json:"timezone"`
EntryDirection *string `json:"entry_sorting_direction"`
EntryOrder *string `json:"entry_sorting_order"`
Stylesheet *string `json:"stylesheet"`
GoogleID *string `json:"google_id"`
OpenIDConnectID *string `json:"openid_connect_id"`
EntriesPerPage *int `json:"entries_per_page"`
KeyboardShortcuts *bool `json:"keyboard_shortcuts"`
ShowReadingTime *bool `json:"show_reading_time"`
EntrySwipe *bool `json:"entry_swipe"`
GestureNav *string `json:"gesture_nav"`
DisplayMode *string `json:"display_mode"`
DefaultReadingSpeed *int `json:"default_reading_speed"`
CJKReadingSpeed *int `json:"cjk_reading_speed"`
DefaultHomePage *string `json:"default_home_page"`
CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"`
MediaPlaybackRate *float64 `json:"media_playback_rate"`
}

// Users represents a list of users.
Expand Down
5 changes: 5 additions & 0 deletions internal/database/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -871,4 +871,9 @@ var migrations = []func(tx *sql.Tx) error{
_, err = tx.Exec(sql)
return err
},
func(tx *sql.Tx) (err error) {
sql := `ALTER TABLE users ADD COLUMN media_playback_rate numeric default 1;`
_, err = tx.Exec(sql)
return err
},
}
4 changes: 3 additions & 1 deletion internal/locale/translations/de_DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Dieses Abonnement kann nicht gelesen werden: %v.",
"error.feed_not_found": "Dieses Abonnement existiert nicht oder gehört nicht zu diesem Benutzer.",
"error.unable_to_detect_rssbridge": "Abonnement kann nicht durch RSS-Bridge erkannt werden: %v.",
"error.feed_format_not_detected": "Das Format des Abonnements kann nicht erkannt werden: %v."
"error.feed_format_not_detected": "Das Format des Abonnements kann nicht erkannt werden: %v.",
"error.settings_media_playback_rate_range": "Wiedergabegeschwindigkeit von Audio/Video",
"form.prefs.label.media_playback_rate": "Die Wiedergabegeschwindigkeit liegt außerhalb des Bereichs"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/el_EL.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Ταχύτητα αναπαραγωγής του ήχου/βίντεο",
"form.prefs.label.media_playback_rate": "Η ταχύτητα αναπαραγωγής είναι εκτός εύρους"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Playback speed of the audio/video",
"form.prefs.label.media_playback_rate": "Playback speed is out of range"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/es_ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Velocidad de reproducción del audio/vídeo",
"form.prefs.label.media_playback_rate": "La velocidad de reproducción está fuera de rango"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/fi_FI.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Äänen/videon toistonopeus",
"form.prefs.label.media_playback_rate": "Toistonopeus on alueen ulkopuolella"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/fr_FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Impossible d'analyser ce flux : %v.",
"error.feed_not_found": "Impossible de trouver ce flux.",
"error.unable_to_detect_rssbridge": "Impossible de détecter un flux RSS en utilisant RSS-Bridge: %v.",
"error.feed_format_not_detected": "Impossible de détecter le format du flux : %v."
"error.feed_format_not_detected": "Impossible de détecter le format du flux : %v.",
"error.settings_media_playback_rate_range": "Vitesse de lecture de l'audio/vidéo",
"form.prefs.label.media_playback_rate": "La vitesse de lecture est hors limites"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/hi_IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "ऑडियो/वीडियो की प्लेबैक गति",
"form.prefs.label.media_playback_rate": "प्लेबैक गति सीमा से बाहर है"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/id_ID.json
Original file line number Diff line number Diff line change
Expand Up @@ -507,5 +507,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Kecepatan pemutaran audio/video",
"form.prefs.label.media_playback_rate": "Kecepatan pemutaran di luar jangkauan"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/it_IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Velocità di riproduzione dell'audio/video",
"form.prefs.label.media_playback_rate": "La velocità di riproduzione non rientra nell'intervallo"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/ja_JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -507,5 +507,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "オーディオ/ビデオの再生速度",
"form.prefs.label.media_playback_rate": "再生速度が範囲外"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/nl_NL.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Afspeelsnelheid van de audio/video",
"form.prefs.label.media_playback_rate": "Afspeelsnelheid is buiten bereik"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/pl_PL.json
Original file line number Diff line number Diff line change
Expand Up @@ -541,5 +541,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Prędkość odtwarzania audio/wideo",
"form.prefs.label.media_playback_rate": "Prędkość odtwarzania jest poza zakresem"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/pt_BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Velocidade de reprodução do áudio/vídeo",
"form.prefs.label.media_playback_rate": "A velocidade de reprodução está fora do intervalo"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/ru_RU.json
Original file line number Diff line number Diff line change
Expand Up @@ -541,5 +541,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Скорость воспроизведения аудио/видео",
"form.prefs.label.media_playback_rate": "Скорость воспроизведения выходит за пределы диапазона"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/tr_TR.json
Original file line number Diff line number Diff line change
Expand Up @@ -524,5 +524,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Ses/video oynatma hızı",
"form.prefs.label.media_playback_rate": "Oynatma hızı aralık dışında"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/uk_UA.json
Original file line number Diff line number Diff line change
Expand Up @@ -541,5 +541,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "Швидкість відтворення аудіо/відео",
"form.prefs.label.media_playback_rate": "Швидкість відтворення виходить за межі діапазону"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/zh_CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -507,5 +507,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "音频/视频的播放速度",
"form.prefs.label.media_playback_rate": "播放速度超出范围"
}
4 changes: 3 additions & 1 deletion internal/locale/translations/zh_TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -507,5 +507,7 @@
"error.unable_to_parse_feed": "Unable to parse this feed: %v.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.unable_to_detect_rssbridge": "Unable to detect feed using RSS-Bridge: %v.",
"error.feed_format_not_detected": "Unable to detect feed format: %v."
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.settings_media_playback_rate_range": "音訊/視訊的播放速度",
"form.prefs.label.media_playback_rate": "播放速度超出範圍"
}
8 changes: 8 additions & 0 deletions internal/model/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@ func OptionalInt64(value int64) *int64 {
}
return nil
}

// OptionalFloat populates an optional float64 field.
func OptionalFloat(value float64) *float64 {
if value > 0 {
return &value
}
return nil
}
50 changes: 28 additions & 22 deletions internal/model/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ type User struct {
DefaultHomePage string `json:"default_home_page"`
CategoriesSortingOrder string `json:"categories_sorting_order"`
MarkReadOnView bool `json:"mark_read_on_view"`
MediaPlaybackRate float64 `json:"media_playback_rate"`
}

// UserCreationRequest represents the request to create a user.
Expand All @@ -48,28 +49,29 @@ type UserCreationRequest struct {

// UserModificationRequest represents the request to update a user.
type UserModificationRequest struct {
Username *string `json:"username"`
Password *string `json:"password"`
Theme *string `json:"theme"`
Language *string `json:"language"`
Timezone *string `json:"timezone"`
EntryDirection *string `json:"entry_sorting_direction"`
EntryOrder *string `json:"entry_sorting_order"`
Stylesheet *string `json:"stylesheet"`
GoogleID *string `json:"google_id"`
OpenIDConnectID *string `json:"openid_connect_id"`
EntriesPerPage *int `json:"entries_per_page"`
IsAdmin *bool `json:"is_admin"`
KeyboardShortcuts *bool `json:"keyboard_shortcuts"`
ShowReadingTime *bool `json:"show_reading_time"`
EntrySwipe *bool `json:"entry_swipe"`
GestureNav *string `json:"gesture_nav"`
DisplayMode *string `json:"display_mode"`
DefaultReadingSpeed *int `json:"default_reading_speed"`
CJKReadingSpeed *int `json:"cjk_reading_speed"`
DefaultHomePage *string `json:"default_home_page"`
CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"`
Username *string `json:"username"`
Password *string `json:"password"`
Theme *string `json:"theme"`
Language *string `json:"language"`
Timezone *string `json:"timezone"`
EntryDirection *string `json:"entry_sorting_direction"`
EntryOrder *string `json:"entry_sorting_order"`
Stylesheet *string `json:"stylesheet"`
GoogleID *string `json:"google_id"`
OpenIDConnectID *string `json:"openid_connect_id"`
EntriesPerPage *int `json:"entries_per_page"`
IsAdmin *bool `json:"is_admin"`
KeyboardShortcuts *bool `json:"keyboard_shortcuts"`
ShowReadingTime *bool `json:"show_reading_time"`
EntrySwipe *bool `json:"entry_swipe"`
GestureNav *string `json:"gesture_nav"`
DisplayMode *string `json:"display_mode"`
DefaultReadingSpeed *int `json:"default_reading_speed"`
CJKReadingSpeed *int `json:"cjk_reading_speed"`
DefaultHomePage *string `json:"default_home_page"`
CategoriesSortingOrder *string `json:"categories_sorting_order"`
MarkReadOnView *bool `json:"mark_read_on_view"`
MediaPlaybackRate *float64 `json:"media_playback_rate"`
}

// Patch updates the User object with the modification request.
Expand Down Expand Up @@ -161,6 +163,10 @@ func (u *UserModificationRequest) Patch(user *User) {
if u.MarkReadOnView != nil {
user.MarkReadOnView = *u.MarkReadOnView
}

if u.MediaPlaybackRate != nil {
user.MediaPlaybackRate = *u.MediaPlaybackRate
}
}

// UseTimezone converts last login date to the given timezone.
Expand Down
Loading

0 comments on commit 67741f0

Please sign in to comment.