mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-09 15:38:13 -07:00
feature: Add support for mediaSegments (#138)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
parent
36758bd508
commit
5c560e54b5
28 changed files with 6823 additions and 8312 deletions
|
|
@ -5,7 +5,7 @@ import 'package:media_kit/media_kit.dart';
|
|||
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
||||
import 'package:fladder/models/item_base_model.dart';
|
||||
import 'package:fladder/models/items/chapters_model.dart';
|
||||
import 'package:fladder/models/items/intro_skip_model.dart';
|
||||
import 'package:fladder/models/items/media_segments_model.dart';
|
||||
import 'package:fladder/models/items/media_streams_model.dart';
|
||||
import 'package:fladder/models/items/trick_play_model.dart';
|
||||
import 'package:fladder/models/playback/playback_model.dart';
|
||||
|
|
@ -23,7 +23,7 @@ class DirectPlaybackModel implements PlaybackModel {
|
|||
required this.media,
|
||||
required this.playbackInfo,
|
||||
this.mediaStreams,
|
||||
this.introSkipModel,
|
||||
this.mediaSegments,
|
||||
this.chapters,
|
||||
this.trickPlay,
|
||||
this.queue = const [],
|
||||
|
|
@ -42,7 +42,7 @@ class DirectPlaybackModel implements PlaybackModel {
|
|||
final MediaStreamsModel? mediaStreams;
|
||||
|
||||
@override
|
||||
final IntroOutSkipModel? introSkipModel;
|
||||
final MediaSegmentsModel? mediaSegments;
|
||||
|
||||
@override
|
||||
final List<Chapter>? chapters;
|
||||
|
|
@ -180,7 +180,7 @@ class DirectPlaybackModel implements PlaybackModel {
|
|||
ValueGetter<Duration>? lastPosition,
|
||||
PlaybackInfoResponse? playbackInfo,
|
||||
ValueGetter<MediaStreamsModel?>? mediaStreams,
|
||||
ValueGetter<IntroOutSkipModel?>? introSkipModel,
|
||||
ValueGetter<MediaSegmentsModel?>? mediaSegments,
|
||||
ValueGetter<List<Chapter>?>? chapters,
|
||||
ValueGetter<TrickPlayModel?>? trickPlay,
|
||||
List<ItemBaseModel>? queue,
|
||||
|
|
@ -190,7 +190,7 @@ class DirectPlaybackModel implements PlaybackModel {
|
|||
media: media != null ? media() : this.media,
|
||||
playbackInfo: playbackInfo ?? this.playbackInfo,
|
||||
mediaStreams: mediaStreams != null ? mediaStreams() : this.mediaStreams,
|
||||
introSkipModel: introSkipModel != null ? introSkipModel() : this.introSkipModel,
|
||||
mediaSegments: mediaSegments != null ? mediaSegments() : this.mediaSegments,
|
||||
chapters: chapters != null ? chapters() : this.chapters,
|
||||
trickPlay: trickPlay != null ? trickPlay() : this.trickPlay,
|
||||
queue: queue ?? this.queue,
|
||||
|
|
|
|||
|
|
@ -1,21 +1,21 @@
|
|||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
|
||||
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
||||
import 'package:fladder/models/item_base_model.dart';
|
||||
import 'package:fladder/models/items/chapters_model.dart';
|
||||
import 'package:fladder/models/items/media_segments_model.dart';
|
||||
import 'package:fladder/models/items/media_streams_model.dart';
|
||||
import 'package:fladder/models/items/trick_play_model.dart';
|
||||
import 'package:fladder/models/playback/playback_model.dart';
|
||||
import 'package:fladder/models/syncing/sync_item.dart';
|
||||
import 'package:fladder/providers/sync_provider.dart';
|
||||
import 'package:fladder/util/duration_extensions.dart';
|
||||
import 'package:fladder/util/list_extensions.dart';
|
||||
import 'package:fladder/wrappers/media_control_wrapper.dart'
|
||||
if (dart.library.html) 'package:fladder/wrappers/media_control_wrapper_web.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
|
||||
import 'package:fladder/models/item_base_model.dart';
|
||||
import 'package:fladder/models/items/chapters_model.dart';
|
||||
import 'package:fladder/models/items/intro_skip_model.dart';
|
||||
import 'package:fladder/models/items/media_streams_model.dart';
|
||||
import 'package:fladder/models/playback/playback_model.dart';
|
||||
import 'package:fladder/providers/sync_provider.dart';
|
||||
import 'package:fladder/util/duration_extensions.dart';
|
||||
|
||||
class OfflinePlaybackModel implements PlaybackModel {
|
||||
OfflinePlaybackModel({
|
||||
|
|
@ -24,7 +24,7 @@ class OfflinePlaybackModel implements PlaybackModel {
|
|||
required this.syncedItem,
|
||||
this.mediaStreams,
|
||||
this.playbackInfo,
|
||||
this.introSkipModel,
|
||||
this.mediaSegments,
|
||||
this.trickPlay,
|
||||
this.queue = const [],
|
||||
this.syncedQueue = const [],
|
||||
|
|
@ -45,7 +45,7 @@ class OfflinePlaybackModel implements PlaybackModel {
|
|||
final MediaStreamsModel? mediaStreams;
|
||||
|
||||
@override
|
||||
final IntroOutSkipModel? introSkipModel;
|
||||
final MediaSegmentsModel? mediaSegments;
|
||||
|
||||
@override
|
||||
List<Chapter>? get chapters => syncedItem.chapters;
|
||||
|
|
@ -156,7 +156,7 @@ class OfflinePlaybackModel implements PlaybackModel {
|
|||
ValueGetter<Media?>? media,
|
||||
SyncedItem? syncedItem,
|
||||
ValueGetter<MediaStreamsModel?>? mediaStreams,
|
||||
ValueGetter<IntroOutSkipModel?>? introSkipModel,
|
||||
ValueGetter<MediaSegmentsModel?>? mediaSegments,
|
||||
ValueGetter<TrickPlayModel?>? trickPlay,
|
||||
List<ItemBaseModel>? queue,
|
||||
List<SyncedItem>? syncedQueue,
|
||||
|
|
@ -166,7 +166,7 @@ class OfflinePlaybackModel implements PlaybackModel {
|
|||
media: media != null ? media() : this.media,
|
||||
syncedItem: syncedItem ?? this.syncedItem,
|
||||
mediaStreams: mediaStreams != null ? mediaStreams() : this.mediaStreams,
|
||||
introSkipModel: introSkipModel != null ? introSkipModel() : this.introSkipModel,
|
||||
mediaSegments: mediaSegments != null ? mediaSegments() : this.mediaSegments,
|
||||
trickPlay: trickPlay != null ? trickPlay() : this.trickPlay,
|
||||
queue: queue ?? this.queue,
|
||||
syncedQueue: syncedQueue ?? this.syncedQueue,
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
|||
import 'package:fladder/models/item_base_model.dart';
|
||||
import 'package:fladder/models/items/chapters_model.dart';
|
||||
import 'package:fladder/models/items/episode_model.dart';
|
||||
import 'package:fladder/models/items/intro_skip_model.dart';
|
||||
import 'package:fladder/models/items/media_segments_model.dart';
|
||||
import 'package:fladder/models/items/media_streams_model.dart';
|
||||
import 'package:fladder/models/items/season_model.dart';
|
||||
import 'package:fladder/models/items/series_model.dart';
|
||||
|
|
@ -43,7 +43,7 @@ abstract class PlaybackModel {
|
|||
final ItemBaseModel item = throw UnimplementedError();
|
||||
final Media? media = throw UnimplementedError();
|
||||
final List<ItemBaseModel> queue = const [];
|
||||
final IntroOutSkipModel? introSkipModel = null;
|
||||
final MediaSegmentsModel? mediaSegments = null;
|
||||
final PlaybackInfoResponse? playbackInfo = throw UnimplementedError();
|
||||
|
||||
List<Chapter>? get chapters;
|
||||
|
|
@ -118,7 +118,7 @@ class PlaybackModelHelper {
|
|||
item: syncedItemModel,
|
||||
syncedItem: syncedItem,
|
||||
trickPlay: syncedItem.trickPlayModel,
|
||||
introSkipModel: syncedItem.introOutSkipModel,
|
||||
mediaSegments: syncedItem.mediaSegments,
|
||||
media: Media(syncedItem.videoFile.path),
|
||||
queue: itemQueue.whereNotNull().toList(),
|
||||
syncedQueue: children,
|
||||
|
|
@ -188,7 +188,7 @@ class PlaybackModelHelper {
|
|||
defaultSubStreamIndex: streamModel?.defaultSubStreamIndex,
|
||||
);
|
||||
|
||||
final intro = await api.introSkipGet(id: item.id);
|
||||
final mediaSegments = await api.mediaSegmentsGet(id: item.id);
|
||||
final trickPlay = (await api.getTrickPlay(item: fullItem.body, ref: ref))?.body;
|
||||
final chapters = fullItem.body?.overview.chapters ?? [];
|
||||
|
||||
|
|
@ -214,7 +214,7 @@ class PlaybackModelHelper {
|
|||
return DirectPlaybackModel(
|
||||
item: fullItem.body ?? item,
|
||||
queue: queue,
|
||||
introSkipModel: intro?.body,
|
||||
mediaSegments: mediaSegments?.body,
|
||||
chapters: chapters,
|
||||
playbackInfo: playbackInfo,
|
||||
trickPlay: trickPlay,
|
||||
|
|
@ -225,7 +225,7 @@ class PlaybackModelHelper {
|
|||
return TranscodePlaybackModel(
|
||||
item: fullItem.body ?? item,
|
||||
queue: queue,
|
||||
introSkipModel: intro?.body,
|
||||
mediaSegments: mediaSegments?.body,
|
||||
chapters: chapters,
|
||||
trickPlay: trickPlay,
|
||||
playbackInfo: playbackInfo,
|
||||
|
|
@ -343,7 +343,7 @@ class PlaybackModelHelper {
|
|||
newModel = DirectPlaybackModel(
|
||||
item: playbackModel.item,
|
||||
queue: playbackModel.queue,
|
||||
introSkipModel: playbackModel.introSkipModel,
|
||||
mediaSegments: playbackModel.mediaSegments,
|
||||
chapters: playbackModel.chapters,
|
||||
playbackInfo: playbackInfo,
|
||||
trickPlay: playbackModel.trickPlay,
|
||||
|
|
@ -354,7 +354,7 @@ class PlaybackModelHelper {
|
|||
newModel = TranscodePlaybackModel(
|
||||
item: playbackModel.item,
|
||||
queue: playbackModel.queue,
|
||||
introSkipModel: playbackModel.introSkipModel,
|
||||
mediaSegments: playbackModel.mediaSegments,
|
||||
chapters: playbackModel.chapters,
|
||||
playbackInfo: playbackInfo,
|
||||
trickPlay: playbackModel.trickPlay,
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'package:media_kit/media_kit.dart';
|
|||
import 'package:fladder/jellyfin/jellyfin_open_api.swagger.dart';
|
||||
import 'package:fladder/models/item_base_model.dart';
|
||||
import 'package:fladder/models/items/chapters_model.dart';
|
||||
import 'package:fladder/models/items/intro_skip_model.dart';
|
||||
import 'package:fladder/models/items/media_segments_model.dart';
|
||||
import 'package:fladder/models/items/media_streams_model.dart';
|
||||
import 'package:fladder/models/items/trick_play_model.dart';
|
||||
import 'package:fladder/models/playback/playback_model.dart';
|
||||
|
|
@ -23,7 +23,7 @@ class TranscodePlaybackModel implements PlaybackModel {
|
|||
required this.media,
|
||||
required this.playbackInfo,
|
||||
this.mediaStreams,
|
||||
this.introSkipModel,
|
||||
this.mediaSegments,
|
||||
this.chapters,
|
||||
this.trickPlay,
|
||||
this.queue = const [],
|
||||
|
|
@ -42,7 +42,7 @@ class TranscodePlaybackModel implements PlaybackModel {
|
|||
final MediaStreamsModel? mediaStreams;
|
||||
|
||||
@override
|
||||
final IntroOutSkipModel? introSkipModel;
|
||||
final MediaSegmentsModel? mediaSegments;
|
||||
|
||||
@override
|
||||
final List<Chapter>? chapters;
|
||||
|
|
@ -181,7 +181,7 @@ class TranscodePlaybackModel implements PlaybackModel {
|
|||
ValueGetter<Duration>? lastPosition,
|
||||
PlaybackInfoResponse? playbackInfo,
|
||||
ValueGetter<MediaStreamsModel?>? mediaStreams,
|
||||
ValueGetter<IntroOutSkipModel?>? introSkipModel,
|
||||
ValueGetter<MediaSegmentsModel?>? mediaSegments,
|
||||
ValueGetter<List<Chapter>?>? chapters,
|
||||
ValueGetter<TrickPlayModel?>? trickPlay,
|
||||
List<ItemBaseModel>? queue,
|
||||
|
|
@ -191,7 +191,7 @@ class TranscodePlaybackModel implements PlaybackModel {
|
|||
media: media != null ? media() : this.media,
|
||||
playbackInfo: playbackInfo ?? this.playbackInfo,
|
||||
mediaStreams: mediaStreams != null ? mediaStreams() : this.mediaStreams,
|
||||
introSkipModel: introSkipModel != null ? introSkipModel() : this.introSkipModel,
|
||||
mediaSegments: mediaSegments != null ? mediaSegments() : this.mediaSegments,
|
||||
chapters: chapters != null ? chapters() : this.chapters,
|
||||
trickPlay: trickPlay != null ? trickPlay() : this.trickPlay,
|
||||
queue: queue ?? this.queue,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue