59 Commits

Author SHA1 Message Date
Alexander d52ce9508e Some more 2026-07-01 20:07:49 +02:00
Alexander b448e076bc Leftovers 2026-07-01 20:07:31 +02:00
Alexander b5b175a8e9 Publish download events from PollDownloadWorker to event stream
PollDownloadWorker now publishes status/result/error events to both the
EventBus (for live UI updates via SubscribeEvents) and AlbumEventRepository
(for DB persistence and replay on reconnect).

- Add AlbumID, Quality, WorkflowRunID to PollDownloadArgs
- Add EventBus and AlbumEvents fields to PollDownloadWorker
- Publish status events with progress % on each poll tick
- Publish result event on download completion
- Publish error events on torrent failure
- Thread workflowRunID through saveTorrentAndDownload for event correlation
- RecoverOrphanedDownloads populates AlbumID/Quality from download record

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-20 14:57:25 +02:00
Alexander b5849d6ad1 Wire shared EventBus from main into PollDownloadWorker and server
Create EventBus in serveGrpc() and pass to both setupRiver() and
NewMusicAgregatorServer() so PollDownloadWorker and the gRPC server
share the same event bus instance.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-20 14:57:02 +02:00
Alexander 76e426c5d3 feat: integrate musicfs for post-download metadata enrichment
- Add internal/musicfs package: gRPC client, TriggerRescan (stream consumer), EnrichFiles (BatchUpdateMetadata), DeriveSubdir helper
- Add MusicFS config section (enabled, endpoint, origin_id, origin_root, timeout)
- Wire MusicFSClient into PollDownloadWorker: on download completion, trigger scoped rescan then push enriched metadata
- Fix album auto-persist in monitor workflow: persist artist+album from metadata-agregator before saving torrent/download
- Add filterByActiveSeeders: skip torrents where magnet resolution found 0 real active seeders
- Add musicfs proto to buf.gen.yaml inputs
- Enricher only sends non-empty fields to avoid overwriting existing file tag data with empty values
2026-05-17 23:32:44 +02:00
Alexander 451fd97c95 Return NotFound error when no torrents or quality matches found instead of silent empty response
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 20:46:40 +02:00
Alexander 0fd51a1e03 Retry indexer search with stripped parenthetical suffixes when initial query returns no results
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 20:38:39 +02:00
Alexander 9aff4b0a29 Return all downloads per album grouped by quality, filter out failed/cancelled from listings
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 20:15:33 +02:00
Alexander ff6bc444d0 Prefer torrents with real seeders: resolve connected seeder count from swarm during magnet resolution
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 20:02:02 +02:00
Alexander be859e87c0 Add DeleteTorrent to torrent client interface for cancel cleanup
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 15:54:17 +02:00
Alexander 5a5660bf21 Refactor MonitorAlbumStream: EventPublisher interface, background workflows, DB-before-qBit save order
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 15:54:01 +02:00
Alexander 52e81faedd Add workflow registry for background goroutine lifecycle management
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 15:53:52 +02:00
Alexander 7582279077 Add in-process event bus with ring buffer for workflow event broadcasting
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 15:53:43 +02:00
Alexander f52e9abb0a Add WorkflowRun and AlbumEvent repositories with download cancel support
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 15:53:35 +02:00
Alexander eab92dd40b Add SearchArtists and GetArtistAlbums proxy RPCs to music-agregator service
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 10:30:18 +02:00
Alexander 24f355c5ae Add MonitorAlbumStream bidirectional streaming RPC with automatic and manual interaction modes
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/claude-agent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-11 10:26:37 +02:00
Alexander f5e2f764b5 Optimize GetArtists: parallel artist processing, batch album upserts, batch download lookups, retry on metadata calls 2026-05-10 00:06:58 +02:00
Alexander 6320f37240 Deduplicate GetAlbum response: merge release info into AlbumDetail, track release into TrackDetail 2026-05-09 23:23:34 +02:00
Alexander 2740585261 Add album/track releases with audio analysis, AnalyzeAlbumRelease RPC, Docker path auto-resolution, release parsing decision tree 2026-05-09 23:16:59 +02:00
Alexander 1e8506f146 Deduce bit depth, sample rate, and bitrate from file sizes; add comprehensive parser tests 2026-05-09 22:09:17 +02:00
Alexander 7fa859e815 Remove rutracker parser, replace with GenericParser for all indexer results 2026-05-09 21:50:55 +02:00
Alexander ef75b9bfba Share single torrent client across all services, eliminate triple qBittorrent login on startup 2026-05-09 21:42:53 +02:00
Alexander 31ec3f9826 Add MonitorAlbum component tests: 21 cases covering all flow diagrams (bufconn + testcontainers + hand-rolled mocks) 2026-05-09 21:31:09 +02:00
Alexander 6f31698006 Fix monitor state: never downgrade on upsert, explicitly set monitored on MonitorAlbum 2026-05-09 20:26:38 +02:00
Alexander 3ce6e23421 Fix duplicate download insert: handle NULL columns in download scan, check by torrent ID, enrich MonitorAlbum response, recover orphaned downloads on startup 2026-05-09 20:13:43 +02:00
Alexander cca404bcc0 Enrich MonitorAlbum response, prevent duplicate downloads, recover orphaned jobs on startup 2026-05-09 20:01:53 +02:00
Alexander 5257ed0f1b Fix album persistence by passing artist DB ID directly to PersistAlbum 2026-05-09 11:18:52 +02:00
Alexander 8c60fe5e35 Add GetAlbum RPC with track details and persist metadata on discovery 2026-05-09 10:47:06 +02:00
Alexander e61e58be72 Expand GetArtists with album details, download info, and generic MonitorState enum 2026-05-08 23:00:42 +02:00
Alexander e49cc25372 Add GetArtists RPC with artist monitor state (monitored/unmonitored/excluded) 2026-05-08 22:27:56 +02:00
Alexander 60c94935b2 Persist metadata to DB, poll download worker, metadata service layer 2026-05-08 11:00:04 +02:00
Alexander 66264e1314 Add database schema, ERD, and repository layer 2026-05-08 10:03:28 +02:00
Alexander 84a6fe8ec7 Refactor MonitorAlbum into focused methods 2026-05-07 23:28:35 +02:00
Alexander 8ad2734964 Implement MonitorAlbum: search, parse, filter by quality, add best to qbittorrent 2026-05-07 23:21:21 +02:00
Alexander 79f3f145de Add indexer cache with River queue for scheduled refresh 2026-05-07 21:41:17 +02:00
Alexander 2041c154cf Add the proxing to metadata-agregator 2026-05-07 12:00:37 +02:00
Alexander 97a57c10fd Added add endpoint 2026-05-07 10:27:20 +02:00
Alexander 6071bc7980 Implement the list endpoint for qbittorrent 2026-05-06 22:53:55 +02:00
Alexander 36416081c1 Create torrent proto stub 2026-05-06 22:26:40 +02:00
Alexander 3249bdc35c Add gRPC observability: logging, metrics, recovery interceptors 2026-05-06 21:58:24 +02:00
Alexander 67f46f740b Remove HTTP/REST server, keep gRPC only 2026-05-06 21:45:48 +02:00
Alexander 5fa46b2890 Add attr to differentiate trackers for future 2026-05-06 21:42:05 +02:00
Alexander b8fcbacb07 Update rutracker categories 2026-05-06 21:27:03 +02:00
Alexander 2400c6345a Refactor return type of the search 2026-05-05 14:41:45 +02:00
Alexander b41ea7d023 More parser tests + fixes 2026-05-04 23:17:38 +02:00
Alexander bfef1b6c79 Implement Jackett search entpoint 2026-05-04 22:48:14 +02:00
Alexander 8ffa92276e Add Jacket indexer with capabilities implemented 2026-05-04 18:40:31 +02:00
Alexander 32eb8c931e Create indexer proto 2026-05-04 16:45:22 +02:00
Alexander f8040ec088 Default values for config 2026-05-04 16:27:04 +02:00
Alexander 268ee57913 Grpc hello service implementation 2026-05-04 14:56:05 +02:00