dart_jellyfin 0.1.0
dart_jellyfin: ^0.1.0 copied to clipboard
Dart client for Jellyfin. Supports authentication, library browsing, playlists, streaming, search and more. Targets macOS, Windows, Linux, iOS and Android.
0.1.0 30-06-2026 #
Deprecated #
JellyfinClient.fetchBytesis deprecated. UserequestBytesinstead (it already handles full URLs, query parameters and relative paths).
Breaking #
JellyfinDeviceProfile.directPlayProfilesis now a list ofJellyfinDirectPlayProfileobjects instead of strings, and each one says whether it is for audio or video. This fixes audio direct-play, which used to be wrongly tagged as video.images.userImageUrl()andimages.splashscreenUrl()now taketagandformatonly; the oldwidth,heightandqualityarguments were dropped because those endpoints ignore them.mediaInfo.info()now takes onlyitemIdanduserId. The endpoint ignores everything else. UsepostedInfo()when you need full, bitrate-aware playback info.liveTv.recordings()droppedgroupId(it was ignored);liveTv.recordingsSeries()swapped its ignored filters for ones the server actually uses (channelId,status,isInProgress,seriesTimerId).liveTv.channels()no longer sorts by default. It keeps the server's own channel order instead of a value Jellyfin rejected.- The
notify…methods (added or updated movies and series) now pass the ids (tmdbId,imdbId,tvdbId) the way the server reads them, instead of a body it ignored. criticReviews()now returns a typed result list instead of raw maps.trailers.list()droppedincludeItemTypes. The endpoint never used it.- Removed the old Emby auth header and the legacy
X-Emby-AuthorizationandX-MediaBrowser-Tokenheaders; sign-in now uses the single header modern Jellyfin (10.12+) accepts. notifications.connect()now returns aFutureand waits for the connection to open before returning.isConnectedis onlytrue(and the keep-alive timer only starts) once the socket is really open, and a failed connection throws straight away.
Added #
JellyfinDirectPlayProfile, with.audioand.videoshortcuts for building device profiles.JellyfinPlayCommandconstants for the remote-control play modes (PlayNow, PlayNext, PlayLast, …).
Changed #
artists.list()andalbumArtists()can now sort;user.list()can filter hidden and disabled accounts.- Every
userData.*method now takes an optionaluserId, so an admin can change another user's favourites and play state;markPlayedcan also backfill a watch date. - Image URLs gained
fillWidth,fillHeightandformat(with ready-madeImageFormatconstants) and can draw watched-progress and unplayed-count overlays. audio.universalStreamUrl()gained audio-channel controls and dropped an argument the endpoint ignored.- Search hints now include the album info, and there are two new media-stream checks,
isEmbeddedImageandisData. clientLog.upload()now returns the filename the server saved.- You can pass a
CancelTokentorequest()andrequestBytes()to cancel a request that is still running; a cancelled request now reportsJellyfinErrorType.cancelledinstead of a genericunknown. JellyfinExceptionnow keeps the original stack trace, so crash reports point at where the failure actually happened.
Fixed #
- Sharing a playlist works now.
playlists.setUserAccess()sends the permission the way the server reads it, instead of in a spot it ignored. - Sending an on-screen message works now.
sessions.sendMessage()sends the text in the body the server expects. - Image uploads work now. The picture is encoded the way the server expects, so avatar, item and splash-screen uploads no longer fail.
items.latest()returns all recent items by default again; the "unplayed only" filter is now optional instead of always on.- "Has lyrics" is detected correctly now (the value was checked with the wrong spelling, so it was always false).
- Filtering artists by genre works now (the ids were joined with the wrong separator).
instantMix.fromMusicGenre()handles genre names with special characters (/,&, spaces,?) instead of failing.items.byId()no longer sends an argument the endpoint doesn't accept.- Sign-in header values are now escaped, so a version with a
+or a device or client name with quotes or commas no longer corrupts the header. sessions.postCapabilities()now advertises valid commands by default (the old defaults weren't real command names).syncPlay.queue()now uses a valid default mode (the old one wasn't accepted).user.updatePassword()can change another user's password again, using the right argument.hls.stopEncoding()now always sends the session id it needs.- The trickplay (scrubbing-thumbnail) playlist URL now points at the right route.
- A response body that can't be decoded is now reported as a
parseerror instead of a genericunknown(matching dart_plex).
0.0.1 25-05-2026 #
Added #
- Initial scaffold targeting Jellyfin
v10.11.9. - Authentication flows: AuthenticateByName and Quick Connect.
MediaBrowserAuthorizationheader builder with token + device fields.- Exception hierarchy with semantic error classification (
auth,notFound,serverError,parse,state,connection,timeout,badRequest,unknown). - Music endpoints: user views, items by type, playlists, image URLs, audio streaming (universal + direct + HLS), lyrics, playback reporting, search, favorites.
- Typed DTOs across the documented API surface, plus a
rawescape hatch on every model for fields not yet promoted.
