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,82 @@
import 'package:flutter/material.dart';
import '../../../core/contracts/playback.dart';
import '../../../core/infra/player_engine/player_engine.dart';
import 'panel_toggle_affordance.dart';
class SubtitleTracksButton extends StatelessWidget {
final PlayerEngine player;
final List<EmbySubtitleTrack> embySubtitles;
final bool isPanelOpen;
final VoidCallback onTogglePanel;
const SubtitleTracksButton({
super.key,
required this.player,
required this.embySubtitles,
required this.isPanelOpen,
required this.onTogglePanel,
});
@override
Widget build(BuildContext context) {
return StreamBuilder<PlayerTracks>(
key: ObjectKey(player),
stream: player.stream.tracks,
initialData: player.state.tracks,
builder: (_, snapshot) {
final hasSubtitles =
(snapshot.data?.embeddedSubtitles.isNotEmpty ?? false) ||
embySubtitles.isNotEmpty;
if (!hasSubtitles) return const SizedBox.shrink();
return PanelToggleAffordance(
isOpen: isPanelOpen,
onTap: onTogglePanel,
tooltip: '字幕',
child: const Icon(
Icons.subtitles_outlined,
color: Color(0xFFFFFFFF),
size: 28,
),
);
},
);
}
}
class AudioTracksButton extends StatelessWidget {
final PlayerEngine player;
final bool isPanelOpen;
final VoidCallback onTogglePanel;
const AudioTracksButton({
super.key,
required this.player,
required this.isPanelOpen,
required this.onTogglePanel,
});
@override
Widget build(BuildContext context) {
return StreamBuilder<PlayerTracks>(
key: ObjectKey(player),
stream: player.stream.tracks,
initialData: player.state.tracks,
builder: (_, snapshot) {
if ((snapshot.data?.embeddedAudio.length ?? 0) <= 1) {
return const SizedBox.shrink();
}
return PanelToggleAffordance(
isOpen: isPanelOpen,
onTap: onTogglePanel,
tooltip: '音轨',
child: const Icon(
Icons.multitrack_audio,
color: Color(0xFFFFFFFF),
size: 28,
),
);
},
);
}
}