23c9125ad8
Backend CI / Lint (push) Waiting to run
Backend CI / Tests (push) Waiting to run
Squashes 26 incremental fork commits (Apr–May 2026) onto upstream main as a single
diff for cleaner cross-fork comparison. Original history preserved on the
pre-squash-backup tag locally.
Feature additions
─────────────────
• Inline single-track download via yt-dlp-worker proxy
New routes: POST /api/v1/track-download/search (source: youtube | spotify),
POST /api/v1/track-download, GET /api/v1/track-download/{id}. Frontend
TrackDownloadButton in album track list AND popular-songs row, with a per-button
source picker. Per-user rate limits live in the worker's SQLite store. On
completion the backend fires Lidarr RefreshArtist + Plex library refresh +
cache invalidation, and the popular-songs list auto-refreshes.
• Per-instance library pinning via MUSICSEERR_LIBRARY env
Backend stamps the library label server-side (music / music-personal /
music-shared); clients cannot override. Drives an instance-segregated
deployment of three musicseerr containers sharing one source tree.
• Lidarr-request flow (single-track requests via Lidarr indexers)
New routes: POST /api/v1/lidarr-request, GET /api/v1/lidarr-request/status.
Per-album asyncio.Lock keyed on album_mbid so rapid-clicks on the same album
serialize correctly. Cross-release track matcher with foreignTrackId →
foreignRecordingId → position+disc → exact-title → substring fallback chain,
evaluated per release (recording UUIDs frequently differ between album,
single, and deluxe edition releases of the same song). Flips
artist.monitored = True on request so Lidarr's WantedAlbums query reaches
the track. Full Lidarr-chain gate (artist AND album AND track) for the
status endpoint to avoid false-positive REQUESTED display. Persistent UI
state so button icons survive refresh and cross-album navigation.
• Privacy: show_now_playing toggle in Settings → Home
Default off. Plex /status/sessions returns active audio sessions across the
whole server with no library-section filter, so a shared instance leaks
every household member's listening activity. The merged store still emits
the user's local MusicSeerr playback bar; only server-derived sessions
(Plex / Jellyfin / Navidrome) are gated.
• Per-button visibility prefs for the track-row action cluster
Settings → Preferences → Download Options / Playback Buttons. Per-context
(popular_songs / album_page) force-off flags layered on top of the existing
source-availability gate.
• UX: wrap action cluster on mobile, hide LidarrRequestButton in tight
layouts, cross-album status-leak fix in AlbumTrackList ($effect keyed on
album.musicbrainz_id to rebuild lookup; map keyed by
"{albumMbid}:{position}:{disc}").
Test coverage
─────────────
Backend pytest: full suite green (2031/2031 as of squash). New: schema-default
tests for HomeSettings, lidarr_request_service cross-release matcher
regression test, singleton-registry expected-count bump to 59. Frontend
vitest: SettingsHome.svelte.spec covers new toggle, nowPlayingSessions
.svelte.spec covers the privacy gate (no fetch when off; fetches when on).
136 lines
3.5 KiB
Python
136 lines
3.5 KiB
Python
"""Dependency injection providers for the MusicSeerr backend.
|
|
|
|
This package replaces the former monolithic ``core/dependencies.py``.
|
|
All public names are re-exported here so that existing imports like
|
|
``from core.dependencies import get_home_service`` continue to work.
|
|
"""
|
|
|
|
from .cache_providers import ( # noqa: F401
|
|
get_cache,
|
|
get_disk_cache,
|
|
get_library_db,
|
|
get_genre_index,
|
|
get_youtube_store,
|
|
get_mbid_store,
|
|
get_sync_state_store,
|
|
get_persistence_write_lock,
|
|
get_preferences_service,
|
|
get_cache_service,
|
|
get_cache_status_service,
|
|
)
|
|
|
|
from .repo_providers import ( # noqa: F401
|
|
get_lidarr_repository,
|
|
get_musicbrainz_repository,
|
|
get_wikidata_repository,
|
|
get_listenbrainz_repository,
|
|
get_jellyfin_repository,
|
|
get_navidrome_repository,
|
|
get_plex_repository,
|
|
get_coverart_repository,
|
|
get_youtube_repo,
|
|
get_audiodb_repository,
|
|
get_audiodb_image_service,
|
|
get_audiodb_browse_queue,
|
|
get_lastfm_repository,
|
|
get_playlist_repository,
|
|
get_request_history_store,
|
|
get_github_repository,
|
|
)
|
|
|
|
from .service_providers import ( # noqa: F401
|
|
get_search_service,
|
|
get_search_enrichment_service,
|
|
get_artist_service,
|
|
get_album_service,
|
|
get_request_queue,
|
|
get_request_service,
|
|
get_requests_page_service,
|
|
get_playlist_service,
|
|
get_library_service,
|
|
get_status_service,
|
|
get_home_service,
|
|
get_genre_cover_prewarm_service,
|
|
get_home_charts_service,
|
|
get_settings_service,
|
|
get_artist_discovery_service,
|
|
get_artist_enrichment_service,
|
|
get_album_enrichment_service,
|
|
get_album_discovery_service,
|
|
get_youtube_service,
|
|
get_lastfm_auth_service,
|
|
get_scrobble_service,
|
|
get_discover_service,
|
|
get_discover_queue_manager,
|
|
get_jellyfin_playback_service,
|
|
get_local_files_service,
|
|
get_jellyfin_library_service,
|
|
get_navidrome_library_service,
|
|
get_navidrome_playback_service,
|
|
get_plex_library_service,
|
|
get_plex_playback_service,
|
|
get_version_service,
|
|
get_track_download_service,
|
|
get_lidarr_request_service,
|
|
)
|
|
|
|
from .type_aliases import ( # noqa: F401
|
|
SettingsDep,
|
|
CacheDep,
|
|
DiskCacheDep,
|
|
PreferencesServiceDep,
|
|
LidarrRepositoryDep,
|
|
MusicBrainzRepositoryDep,
|
|
WikidataRepositoryDep,
|
|
ListenBrainzRepositoryDep,
|
|
JellyfinRepositoryDep,
|
|
CoverArtRepositoryDep,
|
|
SearchServiceDep,
|
|
SearchEnrichmentServiceDep,
|
|
ArtistServiceDep,
|
|
AlbumServiceDep,
|
|
RequestQueueDep,
|
|
RequestServiceDep,
|
|
LibraryServiceDep,
|
|
StatusServiceDep,
|
|
CacheServiceDep,
|
|
HomeServiceDep,
|
|
HomeChartsServiceDep,
|
|
SettingsServiceDep,
|
|
ArtistDiscoveryServiceDep,
|
|
AlbumDiscoveryServiceDep,
|
|
DiscoverServiceDep,
|
|
DiscoverQueueManagerDep,
|
|
YouTubeRepositoryDep,
|
|
YouTubeServiceDep,
|
|
RequestHistoryStoreDep,
|
|
RequestsPageServiceDep,
|
|
JellyfinPlaybackServiceDep,
|
|
LocalFilesServiceDep,
|
|
JellyfinLibraryServiceDep,
|
|
LastFmRepositoryDep,
|
|
LastFmAuthServiceDep,
|
|
ScrobbleServiceDep,
|
|
PlaylistRepositoryDep,
|
|
PlaylistServiceDep,
|
|
NavidromeRepositoryDep,
|
|
NavidromeLibraryServiceDep,
|
|
NavidromePlaybackServiceDep,
|
|
PlexRepositoryDep,
|
|
PlexLibraryServiceDep,
|
|
PlexPlaybackServiceDep,
|
|
CacheStatusServiceDep,
|
|
GitHubRepositoryDep,
|
|
VersionServiceDep,
|
|
TrackDownloadServiceDep,
|
|
)
|
|
|
|
from .cleanup import ( # noqa: F401
|
|
init_app_state,
|
|
cleanup_app_state,
|
|
clear_lastfm_dependent_caches,
|
|
clear_listenbrainz_dependent_caches,
|
|
)
|
|
|
|
from ._registry import clear_all_singletons, _singleton_registry # noqa: F401
|