Backend-neutral fetchArtistAlbums/fetchAlbumTracks/fetchInstantMix/ fetchLyrics, lyrics model + LRC parser, audio quality presets, music transcode (plex /music universal, jellyfin audio PlaybackInfo profile), station/InstantMix radio, music search, playlist type derivation, and audio download resolution.
36 lines
1.2 KiB
Dart
36 lines
1.2 KiB
Dart
/// Music streaming quality presets.
|
|
///
|
|
/// When a non-[original] preset is selected, track playback asks the active
|
|
/// backend for a bitrate-capped audio transcode (Plex
|
|
/// `/music/:/transcode/universal` with `musicBitrate`, Jellyfin `PlaybackInfo`
|
|
/// with a capped `MaxStreamingBitrate`). [original] bypasses transcoding and
|
|
/// direct-plays the source file. Deliberately separate from
|
|
/// [TranscodeQualityPreset] — its members are video-shaped
|
|
/// (resolution/videoQuality).
|
|
enum AudioQualityPreset {
|
|
original(null),
|
|
high(320),
|
|
medium(192),
|
|
low(128);
|
|
|
|
const AudioQualityPreset(this.bitrateKbps);
|
|
|
|
final int? bitrateKbps;
|
|
|
|
bool get isOriginal => this == AudioQualityPreset.original;
|
|
|
|
String get storageKey => name;
|
|
|
|
static AudioQualityPreset fromStorage(String? stored) {
|
|
if (stored == null) return AudioQualityPreset.original;
|
|
for (final v in AudioQualityPreset.values) {
|
|
if (v.name == stored) return v;
|
|
}
|
|
return AudioQualityPreset.original;
|
|
}
|
|
|
|
/// Order shared by every picker surface: [original] first, then capped
|
|
/// presets highest-bitrate first.
|
|
static final List<AudioQualityPreset> displayOrder = List.unmodifiable(values);
|
|
}
|