diff --git a/lib/components/Player/PlayerControls.dart b/lib/components/Player/PlayerControls.dart index bc4892f2..3d30ce69 100644 --- a/lib/components/Player/PlayerControls.dart +++ b/lib/components/Player/PlayerControls.dart @@ -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( diff --git a/lib/helpers/search-youtube.dart b/lib/helpers/search-youtube.dart index 71a0daf8..a6ae0144 100644 --- a/lib/helpers/search-youtube.dart +++ b/lib/helpers/search-youtube.dart @@ -107,8 +107,16 @@ Future 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() diff --git a/lib/provider/DBus.dart b/lib/provider/DBus.dart index a0b0e942..dd20edd2 100644 --- a/lib/provider/DBus.dart +++ b/lib/provider/DBus.dart @@ -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 dbusClientProvider = Provider((ref) { + if (Platform.isLinux) { + return DBusClient.session(); + } }); diff --git a/lib/provider/Playback.dart b/lib/provider/Playback.dart index 6fdd9b59..31930fa1 100644 --- a/lib/provider/Playback.dart +++ b/lib/provider/Playback.dart @@ -43,9 +43,9 @@ class Playback extends PersistedChangeNotifier { LazyBox? 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("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(); }