From 4c603a8efff05a2d3445dae3df9d2380d98604d1 Mon Sep 17 00:00:00 2001 From: Thomas Peetz Date: Mon, 12 Oct 2026 17:37:06 +0200 Subject: [PATCH] implement command update-title --- kontor-gin/internal/api/data.go | 62 +++++++++++--------- kontor-gin/internal/cmd/update-title.go | 15 ++++- kontor-gin/internal/handlers/media_lofi.go | 17 ++++++ kontor-gin/internal/helpers/url.go | 47 +++++++++++++++ kontor-gin/internal/models/media_lofi.go | 11 ++++ kontor-gin/internal/repository/media_lofi.go | 14 +++++ kontor-gin/internal/router/router.go | 5 +- kontor-gin/internal/service/media_lofi.go | 5 ++ 8 files changed, 145 insertions(+), 31 deletions(-) diff --git a/kontor-gin/internal/api/data.go b/kontor-gin/internal/api/data.go index 5384848..a960184 100644 --- a/kontor-gin/internal/api/data.go +++ b/kontor-gin/internal/api/data.go @@ -115,18 +115,20 @@ var Registry map[string]any func GetToken(client *resty.Client, server config.Server) (token string) { var login LoginResponse - - _, err := client.R(). - SetBody(Login{ - Email: server.Username, - Password: server.Password, - }). - SetHeader("Accept", "application/json"). - SetResult(&login). - Post(fmt.Sprintf("%s/api/login", server.Url)) - if err != nil { - slog.Info("Health", "error", err.Error()) + body := Login{ + Email: server.Username, + Password: server.Password, } + PostJSON(client, server, "", "api", "login", body, &login) + + // _, err := client.R(). + // SetBody(body). + // SetHeader("Accept", "application/json"). + // SetResult(&login). + // Post(fmt.Sprintf("%s/api/login", server.Url)) + // if err != nil { + // slog.Info("Health", "error", err.Error()) + // } if config.Verbose > 2 { slog.Info("login", "token", login.Token) } @@ -134,14 +136,12 @@ func GetToken(client *resty.Client, server config.Server) (token string) { } func GetData(server config.Server, apiVersion string) (data *ExportData, err error) { - var login LoginResponse - client := resty.New() client.SetLoggerWarnLevel(true) - PostJSON(client, server, "api/login", &login) + token := GetToken(client, server) for path, value := range Registry { - GetJSON(client, login.Token, server, path, value) + GetJSON(client, token, server, path, value) } export := ExportData{ Sport: Sports, @@ -205,11 +205,19 @@ func GetJSON(client *resty.Client, token string, server config.Server, path stri if config.Verbose > 2 { slog.Info("GetJSON", "url", url) } - _, err := client.R(). - SetAuthToken(token). - SetHeader("Accept", "application/json"). - SetResult(v). - Get(url) + var err error + if token == "" { + _, err = client.R(). + SetHeader("Accept", "application/json"). + SetResult(v). + Get(url) + } else { + _, err = client.R(). + SetAuthToken(token). + SetHeader("Accept", "application/json"). + SetResult(v). + Get(url) + } if err != nil { slog.Info(url, "error", err.Error()) } @@ -218,16 +226,14 @@ func GetJSON(client *resty.Client, token string, server config.Server, path stri } } -func PostJSON(client *resty.Client, server config.Server, path string, v any) { - url := fmt.Sprintf("%s/%s", server.Url, path) +func PostJSON(client *resty.Client, server config.Server, token string, apiVersion string, path string, body any, v any) { + url := fmt.Sprintf("%s/%s/%s", server.Url, apiVersion, path) if config.Verbose > 2 { slog.Info("PostJSON", "url", url) } - _, err := client.R(). - SetBody(Login{ - Email: server.Username, - Password: server.Password, - }). + response, err := client.R(). + SetAuthToken(token). + SetBody(body). SetHeader("Accept", "application/json"). SetResult(v). Post(url) @@ -235,7 +241,7 @@ func PostJSON(client *resty.Client, server config.Server, path string, v any) { slog.Info("PostJSON", "error", err.Error()) } if config.Verbose > 2 { - slog.Info(url, "token", v) + slog.Info("PostJSON", "response", response) } } diff --git a/kontor-gin/internal/cmd/update-title.go b/kontor-gin/internal/cmd/update-title.go index 21de6e3..df8a3fd 100644 --- a/kontor-gin/internal/cmd/update-title.go +++ b/kontor-gin/internal/cmd/update-title.go @@ -1,8 +1,11 @@ package cmd import ( + "fmt" "kontor-api-gin/internal/api" "kontor-api-gin/internal/config" + "kontor-api-gin/internal/helpers" + "kontor-api-gin/internal/models" "log/slog" "github.com/spf13/cobra" @@ -23,7 +26,17 @@ var updateTitleCmd = &cobra.Command{ api.GetJSON(client, token, localServer, "media/lofis", &api.Medialofis) for _, lofi := range api.Medialofis { if lofi.Review { - slog.Info("get title for Url", "url", lofi.WebLink) + title, err := helpers.GetVideoTitle(lofi.WebLink) + var updated models.MediaLoFiDTO + if err != nil { + slog.Info("get title for Url", "url", lofi.WebLink, "error", err.Error()) + } else { + slog.Info("get title for Url", "url", lofi.WebLink, "title", title) + lofi.Title = title + lofi.Review = false + api.PostJSON(client, localServer, token, config.Config.ApiVersion, fmt.Sprintf("media/lofis/%s", lofi.ID), lofi, &updated) + slog.Info("MediaLoi updated", "MediaLoFi", updated) + } } } }, diff --git a/kontor-gin/internal/handlers/media_lofi.go b/kontor-gin/internal/handlers/media_lofi.go index f3d8c3b..c772bb1 100644 --- a/kontor-gin/internal/handlers/media_lofi.go +++ b/kontor-gin/internal/handlers/media_lofi.go @@ -8,6 +8,7 @@ import ( "net/http" "github.com/gin-contrib/sessions" + "github.com/gin-contrib/slog" "github.com/gin-gonic/gin" "gorm.io/gorm" ) @@ -58,6 +59,22 @@ func (handler *MediaLoFiHandler) Add(c *gin.Context) { c.JSON(http.StatusOK, lofi) } +func (handler *MediaLoFiHandler) Update(c *gin.Context) { + var input models.MediaLoFiDTO + + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + lofi, err := handler.Service.Update(c.Request.Context(), input) + if err != nil { + logger := slog.Get(c) + logger.Info("MediaLoFiHandler#Update", "error", err.Error()) + c.JSON(http.StatusNotFound, gin.H{"error": "lofi not updated"}) + return + } + c.JSON(http.StatusOK, lofi) +} func (handler *MediaLoFiHandler) Delete(c *gin.Context) { id := c.Param("id") err := handler.Service.Delete(c.Request.Context(), id) diff --git a/kontor-gin/internal/helpers/url.go b/kontor-gin/internal/helpers/url.go index e77405f..4e94074 100644 --- a/kontor-gin/internal/helpers/url.go +++ b/kontor-gin/internal/helpers/url.go @@ -1,7 +1,11 @@ package helpers import ( + "encoding/json" + "fmt" + "io/ioutil" "log/slog" + "net/http" "net/url" ) @@ -20,3 +24,46 @@ func StripUrl(webLink string, keepParam string) string { u.RawQuery = values.Encode() return u.String() } + +func GetParam(webLink string, param string) string { + u, err := url.Parse(webLink) + if err != nil { + slog.Info("StripUrl", "error", err) + return webLink + } + values := u.Query() + for key := range values { + if key == param { + return values.Get(key) + } + } + return "" +} + +type OEmbedResponse struct { + Title string `json:"title"` +} + +func GetVideoTitle(videoUrl string) (string, error) { + videoID := GetParam(videoUrl, "v") + // Construct the oEmbed URL + url := fmt.Sprintf("https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=%s&format=json", videoID) + + resp, err := http.Get(url) + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + var data OEmbedResponse + if err := json.Unmarshal(body, &data); err != nil { + return "", err + } + + return data.Title, nil +} diff --git a/kontor-gin/internal/models/media_lofi.go b/kontor-gin/internal/models/media_lofi.go index 95b895e..c8ad2b4 100644 --- a/kontor-gin/internal/models/media_lofi.go +++ b/kontor-gin/internal/models/media_lofi.go @@ -20,6 +20,17 @@ type MediaLoFi struct { FileName string `gorm:"column:file_name" json:"file_name"` } +func (media_lofi *MediaLoFi) Update(update MediaLoFiDTO) { + media_lofi.CreatedAt = update.CreatedAt.Time + media_lofi.UpdatedAt = time.Now() + media_lofi.Version = media_lofi.Version + 1 + media_lofi.WebLink = update.WebLink + media_lofi.Review = update.Review + media_lofi.ShouldDownload = update.ShouldDownload + media_lofi.Title = update.Title + media_lofi.FileName = update.FileName +} + func (media_lofi *MediaLoFi) TableName() string { return "media_lofi" } diff --git a/kontor-gin/internal/repository/media_lofi.go b/kontor-gin/internal/repository/media_lofi.go index 8bef559..0993db7 100644 --- a/kontor-gin/internal/repository/media_lofi.go +++ b/kontor-gin/internal/repository/media_lofi.go @@ -78,6 +78,20 @@ func (repository *MediaLoFiRepository) Add(context context.Context, url string) return nil, fmt.Errorf("MediaLoFiRepository#Add unknown error") } +func (repository *MediaLoFiRepository) Update(context context.Context, update models.MediaLoFiDTO) (*models.MediaLoFi, error) { + slog.Info("MediaLoFiRepository#Update", "lofi", update) + var lofi = models.MediaLoFi{ID: update.ID} + slog.Info("MediaLoFiRepository#Update", "id", update.ID) + result := repository.db.First(&lofi) + if result.Error != nil { + slog.Info("MediaLoFiRepository#Update", "error", result.Error.Error()) + return nil, result.Error + } + lofi.Update(update) + repository.db.Save(&lofi) + return &lofi, nil +} + func (repository *MediaLoFiRepository) Delete(context context.Context, id string) error { var actor = models.MediaLoFi{ID: id} slog.Info("MediaLoFiRepository#Delete", "id", id) diff --git a/kontor-gin/internal/router/router.go b/kontor-gin/internal/router/router.go index 312e5d4..8d07fad 100644 --- a/kontor-gin/internal/router/router.go +++ b/kontor-gin/internal/router/router.go @@ -101,14 +101,15 @@ func New(admin *handlers.AdminHandler, bookshelf *handlers.BookshelfHandler, com secured.GET("comics/storyarcs", comics.StoryArcHandler.List) secured.GET("comics/comicworks", comics.ComicworkHandler.List) secured.GET("comics/issueworks", comics.IssueworkHandler.List) - mediaGroup := secured.Group("/media") + mediaGroup := secured.Group("media") mediaGroup.GET("/files", media.MediaFileHandler.List) mediaGroup.POST("/files", media.MediaFileHandler.Add) mediaGroup.GET("/videos", media.MediaVideoHandler.List) mediaGroup.GET("/lofis", media.MediaLoFiHandler.List) mediaGroup.POST("/lofis", media.MediaLoFiHandler.Add) mediaGroup.GET("/lofis/:id", media.MediaLoFiHandler.Get) - mediaGroup.DELETE("/lofis", media.MediaLoFiHandler.Delete) + mediaGroup.POST("/lofis/:id", media.MediaLoFiHandler.Update) + mediaGroup.DELETE("/lofis/:id", media.MediaLoFiHandler.Delete) mediaGroup.GET("/actors", media.MediaActorHandler.List) mediaGroup.POST("/actors", media.MediaActorHandler.Add) mediaGroup.GET("/actors/:id", media.MediaActorHandler.Get) diff --git a/kontor-gin/internal/service/media_lofi.go b/kontor-gin/internal/service/media_lofi.go index bc04367..b4bafb4 100644 --- a/kontor-gin/internal/service/media_lofi.go +++ b/kontor-gin/internal/service/media_lofi.go @@ -31,6 +31,11 @@ func (service *MediaLoFiService) Add(context context.Context, url string) (*mode return service.repository.Add(context, url) } +func (service *MediaLoFiService) Update(context context.Context, lofi models.MediaLoFiDTO) (*models.MediaLoFi, error) { + slog.Info("MediaLoFiService#Update") + return service.repository.Update(context, lofi) +} + func (service *MediaLoFiService) Delete(context context.Context, id string) error { slog.Info("MediaLoFiService#Delete") return service.repository.Delete(context, id)