Files
musicseerr/backend/core/dependencies/__init__.py
T
shaunrd0 23c9125ad8
Backend CI / Lint (push) Waiting to run
Backend CI / Tests (push) Waiting to run
Personal fork of habirabbu/musicseerr — multi-instance + inline downloads + lidarr-request
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).
2026-05-29 23:55:54 +00:00

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