Initial commit

This commit is contained in:
admin1
2026-07-14 11:11:36 +08:00
commit 656499cf94
604 changed files with 119518 additions and 0 deletions
@@ -0,0 +1,69 @@
import '../../../core/contracts/library.dart';
import 'cross_server_playlist.dart';
import 'playlist.dart';
import 'series_episode_playlist.dart';
import 'single_item_playlist.dart';
typedef LoadDetailFn = Future<MediaDetailRes> Function(String itemId);
Future<Playlist> playlistFromLaunch({
required String itemId,
String? mediaSourceId,
int? startPositionTicks,
int? preferredAudioStreamIndex,
int? preferredSubtitleStreamIndex,
bool playFromStart = false,
List<CrossServerPlaylistEntry>? crossServerSequence,
required LoadDetailFn loadDetail,
required LoadEpisodesFn loadEpisodes,
required LoadSeasonsFn loadSeasons,
}) async {
if (crossServerSequence != null && crossServerSequence.isNotEmpty) {
var initialIndex = crossServerSequence.indexWhere(
(e) => e.itemId == itemId,
);
if (initialIndex < 0) initialIndex = 0;
return CrossServerPlaylist(
sequence: crossServerSequence,
initialIndex: initialIndex,
initialPlayFromStart: playFromStart,
);
}
final detail = await loadDetail(itemId);
final base = detail.base;
if (base.Type == 'Episode' &&
base.SeriesId != null &&
base.SeasonId != null) {
final seriesPlaylist = SeriesEpisodePlaylist(
seriesId: base.SeriesId!,
loadEpisodes: loadEpisodes,
loadSeasons: loadSeasons,
);
await seriesPlaylist.initialize(
seasonId: base.SeasonId!,
episodeId: itemId,
initialIndexNumber: base.IndexNumber,
initialMediaSourceId: mediaSourceId,
initialStartPositionTicks: startPositionTicks,
initialPreferredAudioStreamIndex: preferredAudioStreamIndex,
initialPreferredSubtitleStreamIndex: preferredSubtitleStreamIndex,
initialPlayFromStart: playFromStart,
preloadedItem: base,
);
return seriesPlaylist;
}
return SingleItemPlaylist(
item: PlaylistItem(
itemId: itemId,
mediaSourceId: mediaSourceId,
startPositionTicks: startPositionTicks,
preferredAudioStreamIndex: preferredAudioStreamIndex,
preferredSubtitleStreamIndex: preferredSubtitleStreamIndex,
playFromStart: playFromStart,
preloadedItem: base,
),
);
}