Commit Graph

151 Commits

Author SHA1 Message Date
Claudio Ortolina a59dd22a18 ML-168: broadcast index_changed event after background import
Import workers now broadcast :records_index_changed on
"records:index_changed" after successful import via
Records.broadcast_index_changed/0.

CollectionLive.Index and WishlistLive.Index subscribe to the
topic in mount/3 and reload their record streams on receipt,
with a live_action guard to skip reloads when the grid is
hidden behind a modal (:import, :barcode_scan).

IndexActions.handle_index_changed/1 refreshes total_entries
before reloading to keep the pagination bar accurate.
2026-05-14 17:15:06 +01:00
Claudio Ortolina 5f240fe573 Fix stale PubSub subscriptions on record navigation
Subscription management was only done in mount/3, meaning
navigating to a different record via handle_params/3 left the
old subscription active. A background update for the old record
would then overwrite the currently displayed record.

Fix: manage subscriptions in handle_params/3 (unsubscribe old,
subscribe new) via shared RecordActions.manage_subscription/2,
and guard handle_info({:update,...}) against mismatched IDs.
2026-05-07 10:14:10 +01:00
Claudio Ortolina 3b558044b4 refactor: extract Records sub-contexts (Search, Import, Enrichment)
Split the 450+ line Records context into focused modules:

- Records.Search — FTS5 search, SearchParser integration, genre listing
- Records.Import — MusicBrainz release/group import, release status
- Records.Enrichment — genre population, cover refresh, color extraction,
  MusicBrainz data refresh
- Records.Query — shared helpers (essential_fields, order_alphabetically macro)

Records module is now a facade with defdelegate for compile-time safety.
CRUD and PubSub stay directly in Records. Tests moved alongside each
sub-module. Zero callers changed, 886 tests pass.
2026-04-30 17:20:37 +01:00
Claudio Ortolina 30c0a961e9 Stringify format atom in get_release_status query 2026-04-21 12:57:09 +01:00
Claudio Ortolina 2124c982f7 Handle possible non-existent record id in search filter 2026-04-15 15:10:28 +01:00
Claudio Ortolina 3da0865725 Drop Records embedding wrappers 2026-04-11 21:43:00 +01:00
Claudio Ortolina 789ce04b87 Use MusicBrainz.get_all_releases in Records 2026-04-11 21:40:32 +01:00
Claudio Ortolina 6fcca38e27 Make sure to pull artists info when record is updated
Catches the scenario when a new artist is added
2026-04-01 07:11:47 +01:00
Claudio Ortolina 7d65a7d4ab Make sure create record returns updated record 2026-04-01 07:06:33 +01:00
Claudio Ortolina c913dab692 Return controlled errors from genre population
Closes #142
2026-03-30 15:01:42 +01:00
Claudio Ortolina b0018db89d Improve error handling for color extraction
Includes a around embedding generation, which was happening twice (the
first call was redundant as record embeddings are always regenerated
after their parent artist embeddings are regenerated).

Closes #144.
2026-03-30 14:29:44 +01:00
Claudio Ortolina e575f2af9e Stub color extractor in tests
Makes the test suite much faster
2026-03-26 22:58:39 +00:00
Claudio Ortolina 0ccaf46ebd Standardize fetch_* to refresh_* in Artists context
Closes #132
2026-03-25 11:52:43 +00:00
Claudio Ortolina e4eccf4606 Move embedding regeneration to Records context
Closes #131
2026-03-25 11:48:46 +00:00
Claudio Ortolina 59ce580b99 Can filter records by release year 2026-03-21 09:21:21 +00:00
Claudio Ortolina ee4d2555ee Move scrobble queries from Records to ListeningStats
Closes #110
2026-03-12 16:32:10 +00:00
Claudio Ortolina 6a89d31d4c Don't extract dominant colors if provided in params
This as the side effect of massively speeding up the test suite: on M1,
it goes from 24 seconds to 14.
2026-03-07 09:05:44 +00:00
Claudio Ortolina 7cf9b4e7f8 First pass at uniformed types, specs and docs
- spec public functions (skipping controllers, views, live views and
components)
- use types instead of explanations in docs
- remove redundant docs
- fix typos
2026-03-06 08:33:11 +00:00
Claudio Ortolina 6d451481b7 Remove obsolete color extraction strategies 2026-03-03 16:01:25 +00:00
Claudio Ortolina 1d3361c425 BETA: accurate color extractor 2026-03-03 15:41:24 +00:00
Claudio Ortolina 6bf13486a3 Do not crash on & search 2026-02-27 07:56:44 +00:00
Claudio Ortolina 561cd02ec7 Fixes error in matching multiple colums during search 2026-02-25 07:54:59 +00:00
Claudio Ortolina 3e1da2cb19 Uniform repo usage for Oban jobs 2026-02-17 09:01:46 +00:00
Claudio Ortolina 9da995bce8 Extract helpers to handle async jobs 2026-02-09 11:07:33 +00:00
Claudio Ortolina e418395b23 Edit record genres 2026-02-09 08:53:16 +00:00
Claudio Ortolina 57f138e597 Fix search filter precedence bug
Previous version would do:

purchase status + normal filter OR normalized filter

New version does:

purchase status AND (normal filter OR normalized filter)
2026-01-21 16:09:35 +00:00
Claudio Ortolina 1193eda4ca Escape "." in searches 2026-01-19 21:04:03 +00:00
Claudio Ortolina 80763b8192 Sort collection records by release 2025-11-25 22:24:23 +00:00
Claudio Ortolina cc7d00c750 Display number of scrobbles when viewing a record 2025-11-19 13:51:22 +00:00
Claudio Ortolina fcd558066e Can filter collection records by purchase year 2025-10-31 12:25:10 +00:00
Claudio Ortolina 901a6b1c93 Update dependencies
credo 1.7.12 => 1.7.13
usage_rules 0.1.24 => 0.1.25
2025-10-15 09:57:13 +01:00
Claudio Ortolina 9cae972bc5 Add similar records
Initial stab by Claude
2025-10-11 21:39:59 +02:00
Claudio Ortolina ac750d8a91 Refactor essential_fields via search index 2025-10-06 13:48:01 +03:00
Claudio Ortolina 4e24bfe966 Populate genres via Oban with generous retries
This is due to OpenAI erroring or timing out incredibly frequently.
2025-09-22 08:22:36 +03:00
Claudio Ortolina 90b3fa1fdc Refactor Records.Cover to Assets.Image 2025-09-20 07:42:38 +03:00
Claudio Ortolina d865a61ef9 Make sure escaping works consistently everywhere (including with ?)
Remove duplication
2025-09-13 10:25:21 +03:00
Claudio Ortolina 1e211ce32a Simplify by removing search parser escape 2025-09-13 08:28:57 +03:00
Claudio Ortolina 62578de950 Pass one from Tidewave 2025-09-13 08:25:08 +03:00
Claudio Ortolina 16740cec5e Remove obsolete backfill function 2025-09-01 23:08:16 +03:00
Claudio Ortolina dc77d337c0 Migrate from embedded covers to assets 2025-09-01 16:20:41 +03:00
Claudio Ortolina cb7f3c23b0 Add backfill function 2025-09-01 13:39:00 +03:00
Claudio Ortolina a9d27059c4 Update dependencies
circular_buffer 0.4.1 => 0.4.2
ecto 3.12.6 => 3.13.1
ecto_sql 3.12.1 => 3.13.1
ecto_sqlite3 0.19.0 => 0.20.0 (minor)
exqlite 0.31.0 => 0.32.0 (minor)

Includes handling of deprecation for literal/1 to identifier/1
2025-06-21 09:10:57 +03:00
Claudio Ortolina 2df5e7ee1d Show wishlisted date for wishlisted records 2025-06-14 12:58:47 +03:00
Claudio Ortolina 2cc1d7ca8f Pick color extraction strategy from dropdown 2025-06-08 20:06:54 +01:00
Claudio Ortolina 2bbb91769d Generate better dominant colors async after record import 2025-06-08 07:50:07 +01:00
Claudio Ortolina 569f8b5340 Distinguish between color extraction strategies
By default, use fast color sampling. Run heavy edge weighted extraction
only on demand.
2025-06-08 07:43:07 +01:00
Claudio Ortolina 378992e632 Add functions to generate dominant colors 2025-06-07 20:13:19 +01:00
Claudio Ortolina a63f2de60b Use ->> instead of json_extract in queries
Improves readability of queries.
2025-06-06 21:05:44 +01:00
Claudio Ortolina 669b144c55 Find last listened track based on title and artist as well 2025-06-03 18:05:23 +01:00
Claudio Ortolina c23260d03d Show last listen at for each collected record 2025-06-03 15:57:12 +01:00