From 0f5d842a64415a5185c10c6bf716e76d4ecfdea9 Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Sat, 13 Jul 2024 01:45:43 +0200 Subject: [PATCH] Add stats page --- constants/constants.go | 1 + server/server.go | 1 + server/stats.go | 50 ++++++++++++++++++++++++++++++++++++++++++ tmpl/libraries.tmpl | 2 +- tmpl/navbar.tmpl | 3 ++- tmpl/stats.tmpl | 22 +++++++++++++++++++ 6 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 server/stats.go create mode 100644 tmpl/stats.tmpl diff --git a/constants/constants.go b/constants/constants.go index dfcb9ab..1ddd216 100644 --- a/constants/constants.go +++ b/constants/constants.go @@ -17,6 +17,7 @@ const MESSAGE_TEMPLATE_NAME = "message.tmpl" const TASKS_TEMPLATE_NAME = "tasks.tmpl" const TASK_TEMPLATE_NAME = "task.tmpl" const FFMPEG_COMMANDS_TEMPLATE_NAME = "ffmpeg_commands.tmpl" +const STATS_TEMPLATE_NAME = "stats.tmpl" const FORM_FILE_KEY = "file" diff --git a/server/server.go b/server/server.go index db9d130..97a1f1d 100644 --- a/server/server.go +++ b/server/server.go @@ -103,6 +103,7 @@ func Start(_conf config.Config, tmplFS embed.FS, staticFS embed.FS, migrationsFS mux.HandleFunc("/libraries", handleLibraries) mux.HandleFunc("/ffmpeg_commands", handleFfmpegCommands) mux.HandleFunc("/queue_enable", HandleSetQueueEnable) + mux.HandleFunc("/stats", handleStats) mux.HandleFunc("/", handleIndex) diff --git a/server/stats.go b/server/stats.go new file mode 100644 index 0000000..2f74d51 --- /dev/null +++ b/server/stats.go @@ -0,0 +1,50 @@ +package server + +import ( + "bytes" + "log/slog" + "net/http" + + "git.lastassault.de/speatzle/morffix/constants" + "github.com/jackc/pgx/v5" +) + +type StatsDisplay struct { + CodecCounts []CodecCount +} + +type CodecCount struct { + Codec string + Count int +} + +func handleStats(w http.ResponseWriter, r *http.Request) { + data := StatsDisplay{} + + rows, err := db.Query(r.Context(), `SELECT COALESCE(jsonb_path_query_first(ffprobe_data, '$.streams[*] ? (@.codec_type == "video") ? (@.disposition.attached_pic == 0).codec_name')::text, 'Unknown') AS codec, COUNT(*) AS count FROM files WHERE ffprobe_data IS NOT NULL GROUP BY jsonb_path_query_first(ffprobe_data, '$.streams[*] ? (@.codec_type == "video") ? (@.disposition.attached_pic == 0).codec_name');`) + if err != nil { + slog.ErrorContext(r.Context(), "Query Stats", "err", err) + http.Error(w, "Error Query Stats: "+err.Error(), http.StatusInternalServerError) + return + } + codecCounts, err := pgx.CollectRows[CodecCount](rows, pgx.RowToStructByName[CodecCount]) + if err != nil { + slog.ErrorContext(r.Context(), "Collect Rows", "err", err) + http.Error(w, "Error Query Libraries: "+err.Error(), http.StatusInternalServerError) + return + } + data.CodecCounts = codecCounts + + buf := bytes.Buffer{} + err = templates.ExecuteTemplate(&buf, constants.STATS_TEMPLATE_NAME, data) + if err != nil { + slog.ErrorContext(r.Context(), "Executing Stats Template", "err", err) + http.Error(w, "Error Executing Template: "+err.Error(), http.StatusInternalServerError) + return + } + + _, err = w.Write(buf.Bytes()) + if err != nil { + slog.ErrorContext(r.Context(), "Writing http Response", "err", err) + } +} diff --git a/tmpl/libraries.tmpl b/tmpl/libraries.tmpl index 74faf04..0024bee 100644 --- a/tmpl/libraries.tmpl +++ b/tmpl/libraries.tmpl @@ -77,4 +77,4 @@ -{{template "tail"}} \ No newline at end of file +{{template "tail"}} diff --git a/tmpl/navbar.tmpl b/tmpl/navbar.tmpl index f79475b..7615fb2 100644 --- a/tmpl/navbar.tmpl +++ b/tmpl/navbar.tmpl @@ -4,5 +4,6 @@ Libraries Tasks FFmpeg Commands + Stats -{{end}} \ No newline at end of file +{{end}} diff --git a/tmpl/stats.tmpl b/tmpl/stats.tmpl new file mode 100644 index 0000000..37480f3 --- /dev/null +++ b/tmpl/stats.tmpl @@ -0,0 +1,22 @@ +{{template "head"}} +

Stats

+

Codec Counts

+
+ + + + + + {{range $f := .CodecCounts}} + + + + + {{end}} +
CodecCount
+ {{ $f.Codec }} + + {{ $f.Count }} +
+
+{{template "tail"}}