Add in-app debug log panel
build-push / docker (push) Successful in 4m17s

This commit is contained in:
AI Assistant
2026-03-13 16:50:51 +09:00
parent 823bf12b6f
commit 8ed1e84772
4 changed files with 191 additions and 1 deletions
+17
View File
@@ -88,6 +88,10 @@ func RegisterRoutes(router *gin.Engine, app *App) {
router.POST("/api/search", app.searchMedia)
}
func (a *App) debug(message string, data any) {
a.Hub.Broadcast("debug", gin.H{"message": message, "data": data})
}
func (a *App) handleWS(c *gin.Context) {
upgrader := websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
@@ -193,23 +197,28 @@ func (a *App) previewDownload(c *gin.Context) {
return
}
a.debug("download preview requested", gin.H{"url": req.URL})
cmd := exec.Command("python3", a.WorkerScript, "--mode", "probe", "--url", req.URL)
output, err := cmd.CombinedOutput()
if err != nil {
a.debug("download preview failed", gin.H{"url": req.URL, "output": string(output), "error": err.Error()})
c.JSON(http.StatusBadGateway, gin.H{"error": summarizeOutput("download preview probe failed", output, err)})
return
}
var preview PreviewResponse
if err := json.Unmarshal(output, &preview); err != nil {
a.debug("download preview invalid json", gin.H{"url": req.URL, "output": string(output)})
c.JSON(http.StatusBadGateway, gin.H{"error": summarizeOutput("download preview returned invalid JSON", output, err)})
return
}
a.debug("download preview succeeded", preview)
c.JSON(http.StatusOK, preview)
}
func (a *App) runDownload(recordID int64, url, start, end, quality, outputPath string) {
a.Hub.Broadcast("progress", gin.H{"type": "download", "status": "queued", "progress": 0, "url": url})
a.debug("download command started", gin.H{"url": url, "start": start, "end": end, "quality": quality, "outputPath": outputPath})
cmd := exec.Command("python3", a.WorkerScript, "--url", url, "--start", start, "--end", end, "--quality", quality, "--output", outputPath)
stdout, err := cmd.StdoutPipe()
if err != nil {
@@ -231,6 +240,7 @@ func (a *App) runDownload(recordID int64, url, start, end, quality, outputPath s
var msg map[string]any
if err := json.Unmarshal(line, &msg); err == nil {
msg["type"] = "download"
a.debug("download worker event", msg)
a.Hub.Broadcast("progress", msg)
}
}
@@ -242,7 +252,9 @@ func (a *App) runDownload(recordID int64, url, start, end, quality, outputPath s
if err := cmd.Wait(); err != nil {
status = "failed"
a.Hub.Broadcast("progress", gin.H{"type": "download", "status": "error", "progress": 100, "message": err.Error()})
a.debug("download command failed", gin.H{"url": url, "error": err.Error()})
}
a.debug("download command completed", gin.H{"url": url, "status": status, "outputPath": outputPath})
_ = models.MarkDownloadCompleted(a.DB, recordID, status)
}
@@ -265,15 +277,18 @@ func (a *App) searchMedia(c *gin.Context) {
if len(queryVariants) == 0 {
queryVariants = []string{req.Query}
}
a.debug("search query variants", gin.H{"query": req.Query, "variants": queryVariants, "platforms": req.Platforms})
enabledPlatforms := normalizePlatforms(req.Platforms)
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "searching " + selectedPlatformLabel(enabledPlatforms), "progress": 35})
results, err := a.SearchService.SearchMedia(queryVariants, enabledPlatforms)
if err != nil {
a.debug("search backend failed", gin.H{"error": err.Error(), "variants": queryVariants})
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "search failed", "progress": 100, "message": err.Error()})
c.JSON(http.StatusBadGateway, gin.H{"error": err.Error()})
return
}
a.debug("search backend results", gin.H{"count": len(results), "results": results})
if len(results) == 0 {
warning := "SearXNG returned no renderable results."
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "no renderable search results", "progress": 100, "message": warning})
@@ -287,8 +302,10 @@ func (a *App) searchMedia(c *gin.Context) {
rankQuery = strings.Join(queryVariants[:min(len(queryVariants), 3)], " ")
}
scored := rankSearchResults(rankQuery, results)
a.debug("search ranked results", gin.H{"count": len(scored), "results": scored})
a.Hub.Broadcast("progress", gin.H{"type": "search", "status": "analyzing all candidate visuals with Gemini Vision", "progress": 75})
recommended := evaluateAllCandidatesWithGemini(a.GeminiService, req.Query, scored)
a.debug("search gemini recommendations", gin.H{"count": len(recommended), "results": recommended})
err = nil
if len(recommended) == 0 {
err = fmt.Errorf("gemini vision returned no recommended items across all candidate batches")