From d3cf53c609f4faed449c09ee7efc6f87396aa31f Mon Sep 17 00:00:00 2001 From: marcobaobao Date: Thu, 5 Sep 2024 15:23:38 +0200 Subject: [PATCH] added livestream endpoints to REST API --- server/rest/container.go | 2 ++ server/rest/handlers.go | 45 ++++++++++++++++++++++++++++++++++++++++ server/rest/service.go | 12 ++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/server/rest/container.go b/server/rest/container.go index c61ecc6..1ced07f 100644 --- a/server/rest/container.go +++ b/server/rest/container.go @@ -26,6 +26,8 @@ func ApplyRouter(args *ContainerArgs) func(chi.Router) { r.Use(openid.Middleware) } r.Post("/exec", h.Exec()) + r.Post("/execPlaylist", h.ExecPlaylist()) + r.Post("/execLivestream", h.ExecLivestream()) r.Get("/running", h.Running()) r.Get("/version", h.GetVersion()) r.Get("/cookies", h.GetCookies()) diff --git a/server/rest/handlers.go b/server/rest/handlers.go index deeeecb..c78e40a 100644 --- a/server/rest/handlers.go +++ b/server/rest/handlers.go @@ -41,6 +41,51 @@ func (h *Handler) Exec() http.HandlerFunc { } } +func (h *Handler) ExecPlaylist() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + + w.Header().Set("Content-Type", "application/json") + + var req internal.DownloadRequest + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + + err := h.service.ExecPlaylist(req) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if err := json.NewEncoder(w).Encode("ok"); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + } +} + +func (h *Handler) ExecLivestream() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + + w.Header().Set("Content-Type", "application/json") + + var req internal.DownloadRequest + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + + h.service.ExecLivestream(req) + + err := json.NewEncoder(w).Encode("ok") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + } +} + func (h *Handler) Running() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() diff --git a/server/rest/service.go b/server/rest/service.go index b8b3cc8..0c1e5fa 100644 --- a/server/rest/service.go +++ b/server/rest/service.go @@ -12,12 +12,14 @@ import ( "github.com/google/uuid" "github.com/marcopeocchi/yt-dlp-web-ui/server/config" "github.com/marcopeocchi/yt-dlp-web-ui/server/internal" + "github.com/marcopeocchi/yt-dlp-web-ui/server/internal/livestream" ) type Service struct { mdb *internal.MemoryDB db *sql.DB mq *internal.MessageQueue + lm *livestream.Monitor } func (s *Service) Exec(req internal.DownloadRequest) (string, error) { @@ -36,10 +38,18 @@ func (s *Service) Exec(req internal.DownloadRequest) (string, error) { return id, nil } +func (s *Service) ExecPlaylist(req internal.DownloadRequest) error { + return internal.PlaylistDetect(req, s.mq, s.mdb) +} + +func (s *Service) ExecLivestream(req internal.DownloadRequest) { + s.lm.Add(req.URL) +} + func (s *Service) Running(ctx context.Context) (*[]internal.ProcessResponse, error) { select { case <-ctx.Done(): - return nil, errors.New("context cancelled") + return nil, context.Canceled default: return s.mdb.All(), nil }