6.9 KiB
6.9 KiB
AI Media Hub Handover
Project Summary
- Project:
ai-media-hub - Goal: AI-assisted media discovery + ingest dashboard for Unraid
- Backend: Go
- Worker: Python +
yt-dlp+ffmpeg - Frontend: HTML + Vanilla JS + Tailwind CDN
- Database: SQLite
- Current search backend:
SearXNG - Current vision/ranking backend:
Gemini 2.5 Flash - Deployment target: single Docker container on Unraid
- Git remote:
https://git.savethenurse.com/savethenurse/ai-media-hub.git
Current Architecture
backend/main.goApp bootstrap, env loading, static frontend serving, route registrationbackend/handlers/api.goUpload/download/search APIs, WebSocket progress broadcast, debug event broadcastbackend/services/cse.goActual search backend service Despite filename, this is no longer Google CSE logic It now wraps SearXNG search, source filtering, result enrichment, preview asset parsingbackend/services/gemini.goQuery translation, deterministic query expansion helper, Gemini vision scoring Also extracts first video frame withffmpegwhen no thumbnail existsbackend/models/db.goSQLite init + download historyworker/downloader.pyyt-dlpprobe/download + ffmpeg clip extractionfrontend/index.htmlMain dashboard UI, preview modal, debug log panelfrontend/app.jsAPI calls, WebSocket status bar, hover preview playback, debug logger panel, platform togglesfrontend/style.cssCustom styles, clamp helpers, slider thumb styles, debug panel scrollbar stylesunraid-template.xmlUnraid template for currentgit.savethenurse.comimage source
Search Flow: Current Implementation
- User enters a query in Zone A.
- Frontend sends
/api/searchwith:query- selected
platforms
- Backend translates the query to English in
GeminiService.TranslateQuery. Fallback order:- Gemini translation
- Google Translate HTTP fallback
- small Korean media-term dictionary replacement
- Backend builds deterministic English search variants in
GeminiService.ExpandQuery. - Backend calls
SearchService.SearchMedia(...). - Search service queries SearXNG for:
EnvatoArtgridGoogle Video
- Search service filters source URLs aggressively:
- Google Video: YouTube-only
- Envato:
elements.envato.comitem URLs only - Artgrid:
artgrid.io/clip/...only
- Search service enriches results:
- Envato: parses item page HTML for
og:imageand preview video URL - Artgrid: attempts clip API + HTML parsing for thumbnails and preview sources
- Envato: parses item page HTML for
- Backend ranks all results locally.
- Backend evaluates all ranked results with Gemini vision in batches.
- Backend merges Gemini recommendations + fallback ranked items and returns JSON to frontend.
- Frontend renders cards and hover previews.
Direct Downloader Flow: Current Implementation
- User enters URL in Zone C.
- Frontend checks duplicate history via
/api/history/check. - Frontend loads preview metadata via
/api/download/preview. - Preview modal opens with:
- media preview
- duration
- crop dual-thumb slider
- quality select
- User confirms download.
- Backend launches Python worker.
- Worker downloads source with
yt-dlp, clips withffmpeg, emits JSON progress lines. - Backend rebroadcasts progress over WebSocket.
Current Features Implemented
- Project folder structure
- Dockerfile
- Gitea workflow
- Unraid template
- SQLite download history
- File upload
- yt-dlp direct downloader
- Preview modal for direct download
- Crop selection slider
- Quality selection
- WebSocket realtime progress
- Search source toggles
- Search card hover preview support
- Debug log panel in frontend
.logdownload from debug panel
Important Current Constraints / Known Problems
- Search backend has been rewritten multiple times and is still the main unstable area.
- Envato previews are parsed mainly from page HTML metadata / structured data.
- Artgrid previews are partially inferred from:
- clip page HTML
- clip API attempts
- HLS preview handling in frontend
- Search relevance is still not considered stable enough.
- Gemini batch evaluation exists, but search quality can still degrade if upstream SearXNG results are noisy.
- Frontend JavaScript was not linted with Node tooling in this environment because
nodeis not installed here.
Frontend Debug Logger
- UI button: bottom-right
Logs - Files:
frontend/index.htmlfrontend/app.jsfrontend/style.css
- Logs currently capture:
- API request / response
- WebSocket progress messages
- ignored WS debug messages
- status updates
- platform toggle state
- preview source attach / detach
- hover start / hover end
- modal preview open / close
- browser errors
- promise rejections
- backend debug broadcasts
Current Environment Variables
APP_ROOTAPP_ADDRSQLITE_PATHDOWNLOADS_DIRFRONTEND_DIRWORKER_SCRIPTSEARXNG_BASE_URLSEARXNG_GOOGLE_VIDEO_ENGINESEARXNG_WEB_ENGINEGEMINI_API_KEY
Unraid Template Notes
- Current image repository in template:
git.savethenurse.com/savethenurse/ai-media-hub:latest - Current registry in template:
https://git.savethenurse.com
Docker / Build Notes
- Dockerfile uses:
- Go build stage
- static ffmpeg image stage
- Python runtime stage
- Heavy apt ffmpeg install path was removed earlier to reduce build time.
Git / Push Workflow Used So Far
- Branch:
main - Remote:
origin - All requested changes were committed and pushed incrementally to:
https://git.savethenurse.com/savethenurse/ai-media-hub.git
Recent Relevant Commits
8ed1e84Add in-app debug log panel823bf12Reflect selected platforms in search statuscceb040Update platform status and HLS previewsad8afd5Tighten source filters and add platform toggles27000dbHide overlays during hover previewb78865dRewrite search flow and enrich preview assetsde24886Filter non-English expansions and prefer stock sources0bd458dBoost translated search fallback and source priority
Next Priority Areas
- Search backend quality stabilization The search service is the main unresolved area.
- Envato / Artgrid preview extraction hardening
- Search result relevance validation against real user queries
- Better matching between rendered description and actual linked asset
- Add proper frontend build/lint step if Node becomes available
Verified Locally In This Environment
go build ./backend- Python syntax check for worker at various stages
- basic server boot /
/healthzat various stages - full browser-level validation was not fully reproducible in this environment
Short Handover Summary
- The codebase exists and runs.
- Upload/download features mostly exist.
- Search is implemented but is still the most fragile subsystem.
- A visible debug logging panel now exists in the web UI and should be used first when continuing work.