Copilot e11894c095 Batch scrobble rule application by type to reduce N queries to 2 (#61)
* Implement optimized batch rule application

- Add apply_all_album_rules/1 to batch apply all album rules in single query
- Add apply_all_artist_rules/1 to batch apply all artist rules in single query
- Update apply_all_rules/0 to use new batch functions
- Add comprehensive tests for batch application
- Use CASE statement in SQL to apply multiple rules efficiently

Co-authored-by: cloud8421 <537608+cloud8421@users.noreply.github.com>

* Add batch application support for track-filtered rules

- Extend apply_all_album_rules/2 to support filtering by tracks
- Extend apply_all_artist_rules/2 to support filtering by tracks
- Update apply_all_rules/1 to use batch functions for track-filtered application
- Remove duplicate function definitions
- Ensures both main use cases (all tracks and specific tracks) are optimized

Co-authored-by: cloud8421 <537608+cloud8421@users.noreply.github.com>

* Add comprehensive documentation for optimization

- Document the problem and solution approach
- Explain SQL generation and performance impact
- Detail trade-offs and backward compatibility
- Include future considerations and scalability notes

Co-authored-by: cloud8421 <537608+cloud8421@users.noreply.github.com>

* Apply credo suggestions and format

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: cloud8421 <537608+cloud8421@users.noreply.github.com>
Co-authored-by: Claudio Ortolina <cloud8421@gmail.com>
2025-11-10 20:04:34 +00:00
2025-11-09 19:22:53 +00:00
2024-10-07 08:12:05 +01:00
2025-11-09 21:22:21 +00:00
2025-11-06 15:11:00 +00:00
2025-02-18 12:56:29 +00:00
2025-10-25 21:12:37 +01:00
2025-07-14 08:45:21 +01:00
2025-02-17 18:05:41 +00:00
2025-10-16 20:46:22 +01:00
2025-10-07 17:21:39 +03:00
2025-09-15 14:49:59 +03:00
2025-11-03 09:16:54 +00:00
2025-10-07 17:29:11 +03:00
2025-11-08 20:56:27 +00:00
2025-11-10 12:08:50 +00:00

Music Library

Features

  • Add records from MusicBrainz, with optional override of specific pieces of data
  • Manage a collection and a wishlist of records, with ways to quickly search and filter based on records' metadata
  • Integration with Last.fm:
    • display latest scrobbles, and where possible connect them with records in the collection or wishlist
    • scrobble a record
    • store a local copy of the complete scrobble history, and setup rules to fix its data as needed
  • Some basic stats
  • All data stored in a single SQLite database for portability and ease of backup/restore

Screenshots

Stats

Stats

Collection

Collection

Searching for a record to add

Searching for a Record to add

Edit a record in the collection

Edit a record in the collection

View a record's details in the collection

View a record's details in the collection

View a record's tracklist

View a record's tracklist

Adding a record in the wishlist

Adding a record in the wishlist

View an artist's details

View an artist's details

View the scrobble activity

View the scrobble activity

Setup

The project is managed and configured via mise-en-place:

  • mise install will pull the correct Erlang, Elixir and Node.js versions
  • mise run dev:setup will setup dependencies and database structure

Important

The project uses Fluxon UI, so it requires a valid set of credentials. See the env section in mise.toml for the required environment variables.

It's recommended to use the git hooks included in the project. Install with:

mise generate git-pre-commit --write --task=dev:precommit

Environment configuration

The application requires the following environment variables:

  • LAST_FM_USER: the Last.fm username used to populate the Scrobble Activity
  • LAST_FM_API_KEY (secret): the Last.fm API key used to fetch the Scrobble Activity
  • OPENAI_KEY (secret): the OpenAI API key used to populating genres

In production, the application also requires:

  • LOGIN_PASSWORD (secret): the password used for accessing the application.

You can create a mise.local.toml with the required variables (sample values are included at the top of mise.toml).

Running the application

Start the Phoenix endpoint with mise run console (along with an attached IEx session).

Now you can visit localhost:4000 from your browser. The default password for development is change me.

Deployment

The application is deployed via Coolify, using a Docker Compose strategy.

CI

See the .github folder.

Architecture

See the docs folder.

Favicons

This favicon was generated using the following graphics from Twitter Twemoji:

S
Description
No description provided
Readme 63 MiB
Languages
Elixir 77.4%
Python 10%
TypeScript 6.6%
HTML 3.7%
Shell 1.4%
Other 0.8%