mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-09 07:28:14 -07:00
feature: Added LibMDK video player backend (#162)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
parent
6e32018183
commit
da354437e3
53 changed files with 1499 additions and 1006 deletions
75
lib/stubs/web/lib_mdk_web.dart
Normal file
75
lib/stubs/web/lib_mdk_web.dart
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import 'package:fladder/models/items/media_streams_model.dart';
|
||||
import 'package:fladder/models/playback/playback_model.dart';
|
||||
import 'package:fladder/wrappers/players/base_player.dart';
|
||||
import 'package:fladder/wrappers/players/player_states.dart';
|
||||
|
||||
// This is a stub class that provides the same method signatures as the original
|
||||
// implementation, ensuring web builds compile without requiring changes elsewhere.
|
||||
class LibMDK extends BasePlayer {
|
||||
final StreamController<PlayerState> _stateController = StreamController.broadcast();
|
||||
|
||||
@override
|
||||
Stream<PlayerState> get stateStream => _stateController.stream;
|
||||
|
||||
@override
|
||||
Future<void> init(Ref ref) async {}
|
||||
|
||||
@override
|
||||
Future<void> dispose() async {}
|
||||
|
||||
@override
|
||||
Future<void> open(String url, bool play) async {}
|
||||
|
||||
void setState(PlayerState state) {}
|
||||
|
||||
void updateState() {}
|
||||
|
||||
@override
|
||||
Future<void> pause() async {}
|
||||
|
||||
@override
|
||||
Future<void> play() async {}
|
||||
@override
|
||||
Future<void> playOrPause() async {}
|
||||
|
||||
@override
|
||||
Future<void> seek(Duration position) async {}
|
||||
|
||||
@override
|
||||
Future<int> setAudioTrack(AudioStreamModel? model, PlaybackModel playbackModel) async {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setSpeed(double speed) async {}
|
||||
|
||||
@override
|
||||
Future<int> setSubtitleTrack(SubStreamModel? model, PlaybackModel playbackModel) async {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> stop() async {}
|
||||
|
||||
@override
|
||||
Widget? videoWidget(
|
||||
Key key,
|
||||
BoxFit fit,
|
||||
) =>
|
||||
null;
|
||||
|
||||
@override
|
||||
Widget? subtitles(bool showOverlay) => null;
|
||||
|
||||
@override
|
||||
Future<void> setVolume(double volume) async {}
|
||||
|
||||
@override
|
||||
Future<void> loop(bool loop) async {}
|
||||
}
|
||||
195
lib/stubs/web/smtc_web.dart
Normal file
195
lib/stubs/web/smtc_web.dart
Normal file
|
|
@ -0,0 +1,195 @@
|
|||
// ignore_for_file: implementation_imports, constant_identifier_names
|
||||
import 'dart:async';
|
||||
|
||||
// This is a stub class that provides the same method signatures as the original
|
||||
// implementation, ensuring web builds compile without requiring changes elsewhere.
|
||||
class SMTCWindows {
|
||||
SMTCWindows({
|
||||
SMTCConfig? config,
|
||||
PlaybackTimeline? timeline,
|
||||
MusicMetadata? metadata,
|
||||
PlaybackStatus? status,
|
||||
bool? shuffleEnabled,
|
||||
RepeatMode? repeatMode,
|
||||
bool? enabled,
|
||||
});
|
||||
|
||||
get buttonPressStream => null;
|
||||
|
||||
Future<void> updateConfig(SMTCConfig config) async {}
|
||||
|
||||
Future<void> updateTimeline(PlaybackTimeline timeline) async {}
|
||||
|
||||
Future<void> updateMetadata(MusicMetadata metadata) async {}
|
||||
|
||||
Future<void> clearMetadata() async {}
|
||||
|
||||
Future<void> dispose() async {}
|
||||
|
||||
Future<void> disableSmtc() async {}
|
||||
|
||||
Future<void> enableSmtc() async {}
|
||||
|
||||
Future<void> setPlaybackStatus(PlaybackStatus status) async {}
|
||||
|
||||
Future<void> setIsPlayEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setIsPauseEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setIsStopEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setIsNextEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setIsPrevEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setIsFastForwardEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setIsRewindEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setTimeline(PlaybackTimeline timeline) async {}
|
||||
|
||||
Future<void> setTitle(String title) async {}
|
||||
|
||||
Future<void> setArtist(String artist) async {}
|
||||
|
||||
Future<void> setAlbum(String album) async {}
|
||||
|
||||
Future<void> setAlbumArtist(String albumArtist) async {}
|
||||
|
||||
Future<void> setThumbnail(String thumbnail) async {}
|
||||
|
||||
Future<void> setPosition(Duration position) async {}
|
||||
|
||||
Future<void> setStartTime(Duration startTime) async {}
|
||||
|
||||
Future<void> setEndTime(Duration endTime) async {}
|
||||
|
||||
Future<void> setMaxSeekTime(Duration maxSeekTime) async {}
|
||||
|
||||
Future<void> setMinSeekTime(Duration minSeekTime) async {}
|
||||
|
||||
Future<void> setShuffleEnabled(bool enabled) async {}
|
||||
|
||||
Future<void> setRepeatMode(RepeatMode repeatMode) async {}
|
||||
}
|
||||
|
||||
class MusicMetadata {
|
||||
final String? title;
|
||||
final String? artist;
|
||||
final String? album;
|
||||
final String? albumArtist;
|
||||
final String? thumbnail;
|
||||
|
||||
const MusicMetadata({
|
||||
this.title,
|
||||
this.artist,
|
||||
this.album,
|
||||
this.albumArtist,
|
||||
this.thumbnail,
|
||||
});
|
||||
}
|
||||
|
||||
enum PlaybackStatus {
|
||||
Closed,
|
||||
Changing,
|
||||
Stopped,
|
||||
Playing,
|
||||
Paused,
|
||||
}
|
||||
|
||||
enum PressedButton {
|
||||
play,
|
||||
pause,
|
||||
next,
|
||||
previous,
|
||||
fastForward,
|
||||
rewind,
|
||||
stop,
|
||||
record,
|
||||
channelUp,
|
||||
channelDown;
|
||||
|
||||
static PressedButton fromString(String button) {
|
||||
switch (button) {
|
||||
case 'play':
|
||||
return PressedButton.play;
|
||||
case 'pause':
|
||||
return PressedButton.pause;
|
||||
case 'next':
|
||||
return PressedButton.next;
|
||||
case 'previous':
|
||||
return PressedButton.previous;
|
||||
case 'fast_forward':
|
||||
return PressedButton.fastForward;
|
||||
case 'rewind':
|
||||
return PressedButton.rewind;
|
||||
case 'stop':
|
||||
return PressedButton.stop;
|
||||
case 'record':
|
||||
return PressedButton.record;
|
||||
case 'channel_up':
|
||||
return PressedButton.channelUp;
|
||||
case 'channel_down':
|
||||
return PressedButton.channelDown;
|
||||
default:
|
||||
throw Exception('Unknown button: $button');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class PlaybackTimeline {
|
||||
final int startTimeMs;
|
||||
final int endTimeMs;
|
||||
final int positionMs;
|
||||
final int? minSeekTimeMs;
|
||||
final int? maxSeekTimeMs;
|
||||
|
||||
const PlaybackTimeline({
|
||||
required this.startTimeMs,
|
||||
required this.endTimeMs,
|
||||
required this.positionMs,
|
||||
this.minSeekTimeMs,
|
||||
this.maxSeekTimeMs,
|
||||
});
|
||||
}
|
||||
|
||||
class SMTCConfig {
|
||||
final bool playEnabled;
|
||||
final bool pauseEnabled;
|
||||
final bool stopEnabled;
|
||||
final bool nextEnabled;
|
||||
final bool prevEnabled;
|
||||
final bool fastForwardEnabled;
|
||||
final bool rewindEnabled;
|
||||
|
||||
const SMTCConfig({
|
||||
required this.playEnabled,
|
||||
required this.pauseEnabled,
|
||||
required this.stopEnabled,
|
||||
required this.nextEnabled,
|
||||
required this.prevEnabled,
|
||||
required this.fastForwardEnabled,
|
||||
required this.rewindEnabled,
|
||||
});
|
||||
}
|
||||
|
||||
enum RepeatMode {
|
||||
none,
|
||||
track,
|
||||
list;
|
||||
|
||||
static RepeatMode fromString(String value) {
|
||||
switch (value) {
|
||||
case 'none':
|
||||
return none;
|
||||
case 'track':
|
||||
return track;
|
||||
case 'list':
|
||||
return list;
|
||||
default:
|
||||
throw Exception('Unknown repeat mode: $value');
|
||||
}
|
||||
}
|
||||
|
||||
String get asString => toString().split('.').last;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue