import '../../../core/contracts/danmaku.dart'; import '../../../core/contracts/library.dart'; import '../../../core/contracts/playback.dart'; import '../../../providers/audio_settings_provider.dart'; import '../../../providers/danmaku_settings_provider.dart'; import '../../../providers/player_settings_provider.dart'; import '../../../providers/subtitle_settings_provider.dart'; import 'playback_target.dart'; String playbackMemoryKey({ required String serverId, required String userId, required String itemId, String? seriesId, }) => '$serverId:$userId:${seriesId ?? itemId}'; class PlaybackRequest { final String itemId; final String? mediaSourceId; final int? startPositionTicks; final int? preferredSubtitleStreamIndex; final int? preferredAudioStreamIndex; final SubtitleStyleSettings subtitleSettings; final PlayerSettingsState playerSettings; final DanmakuSettingsState danmakuSettings; final AudioSettingsState audioSettings; final bool playFromStart; final PlaybackServerIdentity? targetServer; final EmbyRawItem? preloadedItem; final String? directStreamUrl; final Map directStreamHeaders; const PlaybackRequest({ required this.itemId, this.mediaSourceId, this.startPositionTicks, this.preferredSubtitleStreamIndex, this.preferredAudioStreamIndex, required this.subtitleSettings, required this.playerSettings, required this.danmakuSettings, this.audioSettings = const AudioSettingsState(), this.playFromStart = false, this.targetServer, this.preloadedItem, this.directStreamUrl, this.directStreamHeaders = const {}, }); factory PlaybackRequest.fromEpisode({ required EmbyRawItem episode, required SubtitleStyleSettings subtitleSettings, required PlayerSettingsState playerSettings, required DanmakuSettingsState danmakuSettings, AudioSettingsState audioSettings = const AudioSettingsState(), }) { return PlaybackRequest( itemId: episode.Id, startPositionTicks: episode.UserData?.PlaybackPositionTicks, subtitleSettings: subtitleSettings, playerSettings: playerSettings, danmakuSettings: danmakuSettings, audioSettings: audioSettings, preloadedItem: episode, ); } PlaybackRequest copyWith({ String? itemId, String? mediaSourceId, int? startPositionTicks, int? preferredSubtitleStreamIndex, int? preferredAudioStreamIndex, SubtitleStyleSettings? subtitleSettings, PlayerSettingsState? playerSettings, DanmakuSettingsState? danmakuSettings, AudioSettingsState? audioSettings, bool? playFromStart, PlaybackServerIdentity? targetServer, Object? preloadedItem = _noChange, }) { return PlaybackRequest( itemId: itemId ?? this.itemId, mediaSourceId: mediaSourceId ?? this.mediaSourceId, startPositionTicks: startPositionTicks ?? this.startPositionTicks, preferredSubtitleStreamIndex: preferredSubtitleStreamIndex ?? this.preferredSubtitleStreamIndex, preferredAudioStreamIndex: preferredAudioStreamIndex ?? this.preferredAudioStreamIndex, subtitleSettings: subtitleSettings ?? this.subtitleSettings, playerSettings: playerSettings ?? this.playerSettings, danmakuSettings: danmakuSettings ?? this.danmakuSettings, audioSettings: audioSettings ?? this.audioSettings, playFromStart: playFromStart ?? this.playFromStart, targetServer: targetServer ?? this.targetServer, preloadedItem: identical(preloadedItem, _noChange) ? this.preloadedItem : preloadedItem as EmbyRawItem?, directStreamUrl: directStreamUrl, directStreamHeaders: directStreamHeaders, ); } } const Object _noChange = Object(); class PlaybackContext { final String itemId; final String itemName; final String? itemType; final int? itemIndexNumber; final String? seriesName; final String? seriesId; final String? seasonId; final String? mediaSourceId; final String? playSessionId; final int? runTimeTicks; final String playMethod; final bool isDolbyVision; final List embySubtitles; final List embyAudioTracks; final List allMediaSources; final Map providerIds; final Map seriesProviderIds; final int? parentIndexNumber; final DanmakuMatchContext danmakuMatchContext; final String serverId; final String userId; final String baseUrl; final String token; final String? logoUrl; const PlaybackContext({ required this.itemId, required this.itemName, required this.itemType, required this.itemIndexNumber, required this.seriesName, required this.seriesId, required this.seasonId, required this.mediaSourceId, required this.playSessionId, required this.runTimeTicks, required this.playMethod, this.isDolbyVision = false, required this.danmakuMatchContext, required this.serverId, required this.userId, required this.baseUrl, required this.token, this.embySubtitles = const [], this.embyAudioTracks = const [], this.allMediaSources = const [], this.providerIds = const {}, this.seriesProviderIds = const {}, this.parentIndexNumber, this.logoUrl, }); String get memoryKey => playbackMemoryKey( serverId: serverId, userId: userId, itemId: itemId, seriesId: seriesId, ); }