mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-12 23:45:18 +00:00
Linux Seek not working fixed
This commit is contained in:
parent
a7082d572a
commit
6a05c57dcf
@ -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(
|
||||
|
@ -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()
|
||||
|
@ -1,6 +1,10 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:dbus/dbus.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
final dbusClientProvider = Provider((ref) {
|
||||
return DBusClient.session();
|
||||
final Provider<DBusClient?> dbusClientProvider = Provider<DBusClient?>((ref) {
|
||||
if (Platform.isLinux) {
|
||||
return DBusClient.session();
|
||||
}
|
||||
});
|
||||
|
@ -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,16 +75,21 @@ class Playback extends PersistedChangeNotifier {
|
||||
|
||||
void _init() async {
|
||||
// dbus m.p.r.i.s stuff
|
||||
try {
|
||||
final nameStatus =
|
||||
await dbus.requestName("org.mpris.MediaPlayer2.spotube");
|
||||
if (nameStatus == DBusRequestNameReply.exists) {
|
||||
await dbus.requestName("org.mpris.MediaPlayer2.spotube.instance$pid");
|
||||
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");
|
||||
if (nameStatus == DBusRequestNameReply.exists) {
|
||||
await dbus
|
||||
?.requestName("org.mpris.MediaPlayer2.spotube.instance$pid");
|
||||
}
|
||||
await dbus?.registerObject(_media_player!);
|
||||
await dbus?.registerObject(_mpris!);
|
||||
} catch (e) {
|
||||
logger.e("[MPRIS initialization error]", e);
|
||||
}
|
||||
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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user