improve discord rpc

This commit is contained in:
nexpid 2024-08-10 11:06:33 +02:00
parent 123eb168a3
commit 9db1bfd891
No known key found for this signature in database
GPG Key ID: 51CB6F26638B5CA5

View File

@ -6,6 +6,7 @@ import 'package:spotify/spotify.dart';
import 'package:spotube/extensions/artist_simple.dart'; import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/audio_player.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
class DiscordNotifier extends AsyncNotifier<void> { class DiscordNotifier extends AsyncNotifier<void> {
@ -13,17 +14,39 @@ class DiscordNotifier extends AsyncNotifier<void> {
FutureOr<void> build() async { FutureOr<void> build() async {
final enabled = ref.watch( final enabled = ref.watch(
userPreferencesProvider.select((s) => s.discordPresence && kIsDesktop)); userPreferencesProvider.select((s) => s.discordPresence && kIsDesktop));
final playback = ref.read(audioPlayerProvider);
final subscription = var lastPosition = audioPlayer.position;
final subscriptions =
[
FlutterDiscordRPC.instance.isConnectedStream.listen((connected) async { FlutterDiscordRPC.instance.isConnectedStream.listen((connected) async {
final playback = ref.read(audioPlayerProvider);
if (connected && playback.activeTrack != null) { if (connected && playback.activeTrack != null) {
await updatePresence(playback.activeTrack!); await updatePresence(playback.activeTrack!);
} }
}); }),
audioPlayer.playerStateStream.listen((state) async {
final playback = ref.read(audioPlayerProvider);
if (playback.activeTrack == null) return;
await updatePresence(ref.read(audioPlayerProvider).activeTrack!);
}),
audioPlayer.positionStream.listen((position) async {
final playback = ref.read(audioPlayerProvider);
if (playback.activeTrack != null) {
final diff = position.inMilliseconds - lastPosition.inMilliseconds;
if (diff > 500 || diff < -500) {
await updatePresence(ref.read(audioPlayerProvider).activeTrack!);
}
}
lastPosition = position;
})
];
ref.onDispose(() async { ref.onDispose(() async {
for (final subscription in subscriptions) {
subscription.cancel(); subscription.cancel();
}
await close(); await close();
await FlutterDiscordRPC.instance.dispose(); await FlutterDiscordRPC.instance.dispose();
}); });
@ -37,15 +60,18 @@ class DiscordNotifier extends AsyncNotifier<void> {
} }
Future<void> updatePresence(Track track) async { Future<void> updatePresence(Track track) async {
await clear(); final artistNames = track.artists?.asString();
final artistNames = track.artists?.asString() ?? ""; final isPlaying = audioPlayer.isPlaying;
final position = audioPlayer.position;
await FlutterDiscordRPC.instance.setActivity( await FlutterDiscordRPC.instance.setActivity(
activity: RPCActivity( activity: RPCActivity(
details: "${track.name} by $artistNames", details: track.name,
state: "Vibing in Music", state: artistNames != null ? "by $artistNames" : null,
assets: const RPCAssets( assets: RPCAssets(
largeImage: "spotube-logo-foreground", largeImage:
largeText: "Spotube", track.album?.images?.first.url ?? "spotube-logo-foreground",
largeText: track.album?.name ?? "Unknown album",
smallImage: "spotube-logo-foreground", smallImage: "spotube-logo-foreground",
smallText: "Spotube", smallText: "Spotube",
), ),
@ -57,7 +83,7 @@ class DiscordNotifier extends AsyncNotifier<void> {
), ),
], ],
timestamps: RPCTimestamps( timestamps: RPCTimestamps(
start: DateTime.now().millisecondsSinceEpoch, start: isPlaying ? DateTime.now().millisecondsSinceEpoch - position.inMilliseconds : null,
), ),
), ),
); );