Files
Harvey 0f25ebc26d Plex Integration + Music Source Integration Improvements (#37)
* plex integration

* The big one - Full Music Source page rework + Playlist importing + Full Plex Integration + Discovery Options + More Like This/Surprise Me/Instant Mix + More...

* Music source track page - Play all / shuffle fixes

* lint

* format

* fix type checks

* format
2026-04-13 23:39:01 +01:00

190 lines
5.1 KiB
Python

from typing import Any, Protocol
from repositories.jellyfin_models import JellyfinItem, JellyfinLyrics, JellyfinSession, JellyfinUser, PlaybackUrlResult
from repositories.navidrome_models import StreamProxyResult
class JellyfinRepositoryProtocol(Protocol):
def is_configured(self) -> bool:
...
def configure(self, base_url: str, api_key: str, user_id: str = "") -> None:
...
async def validate_connection(self) -> tuple[bool, str]:
...
async def get_users(self) -> list[JellyfinUser]:
...
async def fetch_users_direct(self) -> list[JellyfinUser]:
...
async def get_current_user(self) -> JellyfinUser | None:
...
async def get_recently_played(
self, user_id: str | None = None, limit: int = 20, ttl_seconds: int = 300
) -> list[JellyfinItem]:
...
async def get_favorite_artists(
self, user_id: str | None = None, limit: int = 20
) -> list[JellyfinItem]:
...
async def get_favorite_albums(
self, user_id: str | None = None, limit: int = 20, ttl_seconds: int = 300
) -> list[JellyfinItem]:
...
async def get_most_played_artists(
self, user_id: str | None = None, limit: int = 20
) -> list[JellyfinItem]:
...
async def get_most_played_albums(
self, user_id: str | None = None, limit: int = 20
) -> list[JellyfinItem]:
...
async def get_recently_added(
self, user_id: str | None = None, limit: int = 20
) -> list[JellyfinItem]:
...
async def get_genres(self, user_id: str | None = None, ttl_seconds: int = 3600) -> list[str]:
...
async def get_filter_facets(self, user_id: str | None = None, ttl_seconds: int = 3600) -> dict[str, Any]:
...
async def get_artists_by_genre(
self, genre: str, user_id: str | None = None, limit: int = 50
) -> list[JellyfinItem]:
...
def get_image_url(self, item_id: str, image_tag: str | None = None) -> str | None:
...
def get_auth_headers(self) -> dict[str, str]:
...
async def get_albums(
self,
limit: int = 50,
offset: int = 0,
sort_by: str = "SortName",
sort_order: str = "Ascending",
genre: str | None = None,
year: int | None = None,
tags: str | None = None,
studios: str | None = None,
) -> tuple[list[JellyfinItem], int]:
...
async def get_album_tracks(self, album_id: str) -> list[JellyfinItem]:
...
async def get_album_detail(self, album_id: str) -> JellyfinItem | None:
...
async def get_album_by_mbid(self, musicbrainz_id: str) -> JellyfinItem | None:
...
async def get_artist_by_mbid(self, musicbrainz_id: str) -> JellyfinItem | None:
...
async def get_artists(
self, limit: int = 50, offset: int = 0
) -> list[JellyfinItem]:
...
async def build_mbid_index(self) -> dict[str, str]:
...
async def search_items(
self,
query: str,
item_types: str = "MusicAlbum,Audio,MusicArtist",
) -> list[JellyfinItem]:
...
async def get_library_stats(self, ttl_seconds: int = 600) -> dict[str, Any]:
...
async def get_playback_url(self, item_id: str) -> PlaybackUrlResult:
...
async def get_playback_info(self, item_id: str) -> dict[str, Any]:
...
async def report_playback_start(
self, item_id: str, play_session_id: str, play_method: str = "Transcode"
) -> None:
...
async def report_playback_progress(
self,
item_id: str,
play_session_id: str,
position_ticks: int,
is_paused: bool,
) -> None:
...
async def report_playback_stopped(
self, item_id: str, play_session_id: str, position_ticks: int
) -> None:
...
async def proxy_head_stream(self, item_id: str) -> StreamProxyResult:
...
async def proxy_get_stream(
self, item_id: str, range_header: str | None = None
) -> StreamProxyResult:
...
async def get_instant_mix(
self, item_id: str, limit: int = 50
) -> list[JellyfinItem]:
...
async def get_instant_mix_by_artist(
self, artist_id: str, limit: int = 50
) -> list[JellyfinItem]:
...
async def get_instant_mix_by_genre(
self, genre_name: str, limit: int = 50
) -> list[JellyfinItem]:
...
async def get_sessions(self) -> list[JellyfinSession]:
...
async def get_similar_items(
self, item_id: str, limit: int = 10
) -> list[JellyfinItem]:
...
async def get_lyrics(self, item_id: str) -> JellyfinLyrics | None:
...
async def get_playlists(
self, user_id: str | None = None, limit: int = 50
) -> list[JellyfinItem]:
...
async def get_playlist(
self, playlist_id: str, user_id: str | None = None
) -> JellyfinItem | None:
...
async def get_playlist_items(
self, playlist_id: str, user_id: str | None = None, limit: int = 1000
) -> list[JellyfinItem]:
...