Linux Seek not working fixed

This commit is contained in:
Kingkor Roy Tirtho 2022-07-01 13:48:25 +06:00
parent a7082d572a
commit 6a05c57dcf
4 changed files with 48 additions and 47 deletions

View File

@ -48,41 +48,25 @@ class PlayerControls extends HookConsumerWidget {
final sliderMax = duration.inSeconds;
final sliderValue = snapshot.data?.inSeconds ?? 0;
// final value = (sliderMax == 0 || sliderValue > sliderMax)
// ? 0
// : sliderValue / sliderMax;
final value = (sliderMax == 0 || sliderValue > sliderMax)
? 0
: sliderValue / sliderMax;
final _duration = playback.duration;
final _position = snapshot.data;
final value = (_position != null &&
_duration != null &&
_position.inMilliseconds > 0 &&
_position.inMilliseconds < _duration.inMilliseconds)
? _position.inMilliseconds / _duration.inMilliseconds
: 0.0;
return Column(
children: [
Slider.adaptive(
// cannot divide by zero
// there's an edge case for value being bigger
// than total duration. Keeping it resolved
value: value,
onChanged: (v) async {
final duration = _duration;
if (duration == null) {
return;
}
final position = v * duration.inMilliseconds;
await player
.seek(Duration(milliseconds: position.round()));
value: value.toDouble(),
onChanged: (_) {},
onChangeEnd: (value) async {
await player.seek(
Duration(
seconds: (value * sliderMax).toInt(),
),
);
},
// onChangeEnd: (value) async {
// await player.seek(
// Duration(
// seconds: (value * sliderMax).toInt(),
// ),
// );
// },
activeColor: iconColor,
),
Padding(

View File

@ -107,8 +107,16 @@ Future<SpotubeTrack> toSpotubeTrack({
"[YouTube Matched Track] ${ytVideo.title} | ${ytVideo.author} - ${ytVideo.url}",
);
final audioManifest = trackManifest.audioOnly
.where((info) => info.codec.mimeType == "audio/mp4");
final audioManifest = trackManifest.audioOnly.where((info) {
final isMp4a = info.codec.mimeType == "audio/mp4";
if (Platform.isLinux) {
return !isMp4a;
} else if (Platform.isMacOS || Platform.isIOS) {
return isMp4a;
} else {
return true;
}
});
final ytUri = (audioQuality == AudioQuality.high
? audioManifest.withHighestBitrate()

View File

@ -1,6 +1,10 @@
import 'dart:io';
import 'package:dbus/dbus.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final dbusClientProvider = Provider((ref) {
final Provider<DBusClient?> dbusClientProvider = Provider<DBusClient?>((ref) {
if (Platform.isLinux) {
return DBusClient.session();
}
});

View File

@ -43,9 +43,9 @@ class Playback extends PersistedChangeNotifier {
LazyBox<CacheTrack>? cacheTrackBox;
@protected
final DBusClient dbus;
final Media_Player _media_player;
late final Player_Interface _mpris;
final DBusClient? dbus;
Media_Player? _media_player;
Player_Interface? _mpris;
double volume = 1;
@ -58,9 +58,7 @@ class Playback extends PersistedChangeNotifier {
Track? currentTrack,
}) : _currentPlaylist = currentPlaylist,
_currentTrack = currentTrack,
_media_player = Media_Player(),
super() {
_mpris = Player_Interface(player: player.core, playback: this);
player.onNextRequest = () {
movePlaylistPositionBy(1);
};
@ -77,17 +75,22 @@ class Playback extends PersistedChangeNotifier {
void _init() async {
// dbus m.p.r.i.s stuff
if (Platform.isLinux) {
try {
_media_player = Media_Player();
_mpris = Player_Interface(player: player.core, playback: this);
final nameStatus =
await dbus.requestName("org.mpris.MediaPlayer2.spotube");
await dbus?.requestName("org.mpris.MediaPlayer2.spotube");
if (nameStatus == DBusRequestNameReply.exists) {
await dbus.requestName("org.mpris.MediaPlayer2.spotube.instance$pid");
await dbus
?.requestName("org.mpris.MediaPlayer2.spotube.instance$pid");
}
await dbus.registerObject(_media_player);
await dbus.registerObject(_mpris);
await dbus?.registerObject(_media_player!);
await dbus?.registerObject(_mpris!);
} catch (e) {
logger.e("[MPRIS initialization error]", e);
}
}
cacheTrackBox = await Hive.openLazyBox<CacheTrack>("track-cache");
@ -126,8 +129,10 @@ class Playback extends PersistedChangeNotifier {
_durationStream?.cancel();
_positionStream?.cancel();
cacheTrackBox?.close();
dbus.unregisterObject(_media_player);
dbus.unregisterObject(_mpris);
if (Platform.isLinux && _media_player != null && _mpris != null) {
dbus?.unregisterObject(_media_player!);
dbus?.unregisterObject(_mpris!);
}
super.dispose();
}