From f294246019942291e7bd8078031d86f5df04f91a Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 27 Oct 2023 11:22:38 +0200 Subject: [PATCH 01/34] Minor changes in user-settings, still some errors in removing parts --- web/template/user-settings.gohtml | 29 ++++++++++++++++++++++++++--- web/ts/user-settings.ts | 14 ++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/web/template/user-settings.gohtml b/web/template/user-settings.gohtml index 06e1e40d1..6e0faf6ca 100644 --- a/web/template/user-settings.gohtml +++ b/web/template/user-settings.gohtml @@ -68,9 +68,10 @@ @change="global.updatePreference(global.UserSetting.Greeting, currentGreeting).then((r) => {err=r;})"> -
+

Playback Speeds

- + + +
+ + +
+
+

Privacy & Data Protection

diff --git a/web/ts/user-settings.ts b/web/ts/user-settings.ts index de13f43fb..2588a88e2 100644 --- a/web/ts/user-settings.ts +++ b/web/ts/user-settings.ts @@ -23,3 +23,17 @@ export function updatePreference(t: UserSetting, value: string | boolean | numbe } }); } + +export function removePlaybackSpeed(playbackSpeeds : [{speed: number, enabled: boolean}], toRemove: number) : [{speed: number, enabled: boolean}] { + let index = -1; + for(let i = 0; i < playbackSpeeds.length; i++) { + if(playbackSpeeds[i].speed == toRemove) { + index = i; + break; + } + } + if(index >= 0 && index < playbackSpeeds.length) { + delete playbackSpeeds[index]; + } + return playbackSpeeds; +} From 1be70967764d833434c30033612a1b723ae5e38a Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 27 Oct 2023 18:50:11 +0200 Subject: [PATCH 02/34] Added custom setting to add custom speeds for playback and implemented these into video player --- api/users.go | 41 ++++++++++++++++++++++++-- model/user.go | 36 +++++++++++++++++++++++ web/template/user-settings.gohtml | 48 +++++++++++++++++-------------- web/template/video_only.gohtml | 2 +- web/template/watch.gohtml | 12 ++++---- web/ts/user-settings.ts | 26 ++++++++++------- 6 files changed, 124 insertions(+), 41 deletions(-) diff --git a/api/users.go b/api/users.go index e96921e63..2105f2d02 100644 --- a/api/users.go +++ b/api/users.go @@ -11,11 +11,11 @@ import ( "strings" "time" - "github.com/getsentry/sentry-go" - "github.com/gin-gonic/gin" "github.com/TUM-Dev/gocast/dao" "github.com/TUM-Dev/gocast/model" "github.com/TUM-Dev/gocast/tools" + "github.com/getsentry/sentry-go" + "github.com/gin-gonic/gin" log "github.com/sirupsen/logrus" "gorm.io/gorm" ) @@ -26,6 +26,7 @@ func configGinUsersRouter(router *gin.Engine, daoWrapper dao.DaoWrapper) { router.POST("/api/users/settings/name", routes.updatePreferredName) router.POST("/api/users/settings/greeting", routes.updatePreferredGreeting) router.POST("/api/users/settings/playbackSpeeds", routes.updatePlaybackSpeeds) + router.POST("/api/users/settings/customSpeeds", routes.updateCustomSpeeds) router.POST("/api/users/resetPassword", routes.resetPassword) @@ -619,6 +620,42 @@ func (r usersRoutes) updatePreferredGreeting(c *gin.Context) { } } +func (r usersRoutes) updateCustomSpeeds(c *gin.Context) { + u := c.MustGet("TUMLiveContext").(tools.TUMLiveContext).User + if u == nil { + _ = c.Error(tools.RequestError{ + Status: http.StatusUnauthorized, + CustomMessage: "login required", + }) + return + } + + var req struct{ Value []float32 } + if err := c.BindJSON(&req); err != nil { + _ = c.Error(tools.RequestError{ + Status: http.StatusBadRequest, + CustomMessage: "can not bind body", + Err: err, + }) + return + } + settingsString := "[]" + if len(req.Value) != 0 { + settingBytes, _ := json.Marshal(req.Value) + settingsString = string(settingBytes) + } + err := r.DaoWrapper.AddUserSetting(&model.UserSetting{UserID: u.ID, Type: model.UserDefinedSpeeds, Value: settingsString}) + if err != nil { + _ = c.Error(tools.RequestError{ + Status: http.StatusInternalServerError, + CustomMessage: "can not add user setting", + Err: err, + }) + return + } + +} + func (r usersRoutes) updatePlaybackSpeeds(c *gin.Context) { u := c.MustGet("TUMLiveContext").(tools.TUMLiveContext).User if u == nil { diff --git a/model/user.go b/model/user.go index 5856e127f..b16c956e9 100755 --- a/model/user.go +++ b/model/user.go @@ -9,6 +9,7 @@ import ( "encoding/json" "errors" "fmt" + "sort" "strings" "time" @@ -54,6 +55,7 @@ const ( PreferredName UserSettingType = iota + 1 Greeting CustomPlaybackSpeeds + UserDefinedSpeeds ) type UserSetting struct { @@ -79,6 +81,8 @@ type PlaybackSpeedSetting struct { Enabled bool `json:"enabled"` } +type CustomSpeeds []float32 + type PlaybackSpeedSettings []PlaybackSpeedSetting func (s PlaybackSpeedSettings) GetEnabled() (res []float32) { @@ -90,6 +94,22 @@ func (s PlaybackSpeedSettings) GetEnabled() (res []float32) { return res } +func (u *User) GetEnabledPlaybackSpeeds() (res []float32) { + if u == nil { + return []float32{1} + } + for _, setting := range u.GetPlaybackSpeeds().GetEnabled() { + res = append(res, setting) + } + for _, setting := range u.GetCustomSpeeds() { + res = append(res, setting) + } + sort.SliceStable(res, func(i, j int) bool { + return res[i] < res[j] + }) + return res +} + var defaultPlaybackSpeeds = PlaybackSpeedSettings{ {0.25, false}, {0.5, true}, @@ -120,6 +140,22 @@ func (u *User) GetPlaybackSpeeds() (speeds PlaybackSpeedSettings) { return defaultPlaybackSpeeds } +func (u *User) GetCustomSpeeds() (speeds CustomSpeeds) { + if u == nil { + return []float32{} + } + for _, setting := range u.Settings { + if setting.Type == UserDefinedSpeeds { + err := json.Unmarshal([]byte(setting.Value), &speeds) + if err != nil { + break + } + return speeds + } + } + return []float32{} +} + // GetPreferredGreeting returns the preferred greeting of the user if set, otherwise Moin func (u User) GetPreferredGreeting() string { for _, setting := range u.Settings { diff --git a/web/template/user-settings.gohtml b/web/template/user-settings.gohtml index 6e0faf6ca..146c475c5 100644 --- a/web/template/user-settings.gohtml +++ b/web/template/user-settings.gohtml @@ -32,7 +32,7 @@ -
+

Settings

@@ -68,7 +68,7 @@ @change="global.updatePreference(global.UserSetting.Greeting, currentGreeting).then((r) => {err=r;})">
-
+

Playback Speeds

-
-
- -