mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-14 00:15:17 +00:00
feat: discord RPC integration #98
This commit is contained in:
parent
92deb0cc6a
commit
88b8785cb8
@ -27,4 +27,6 @@ abstract class Env {
|
||||
|
||||
static bool get enableUpdateChecker =>
|
||||
DesktopTools.platform.isFlatpak || _enableUpdateChecker == "1";
|
||||
|
||||
static String discordAppId = "1176718791388975124";
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'package:catcher_2/catcher_2.dart';
|
||||
import 'package:dart_discord_rpc/dart_discord_rpc.dart';
|
||||
import 'package:device_preview/device_preview.dart';
|
||||
import 'package:fl_query/fl_query.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
@ -63,6 +64,10 @@ Future<void> main(List<String> rawArgs) async {
|
||||
MetadataGod.initialize();
|
||||
}
|
||||
|
||||
if (DesktopTools.platform.isWindows || DesktopTools.platform.isLinux) {
|
||||
DiscordRPC.initialize();
|
||||
}
|
||||
|
||||
final hiveCacheDir =
|
||||
kIsWeb ? null : (await getApplicationSupportDirectory()).path;
|
||||
|
||||
|
@ -24,6 +24,7 @@ import 'package:spotube/provider/user_preferences/user_preferences_provider.dart
|
||||
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
|
||||
import 'package:spotube/services/audio_player/audio_player.dart';
|
||||
import 'package:spotube/services/audio_services/audio_services.dart';
|
||||
import 'package:spotube/services/discord/discord.dart';
|
||||
import 'package:spotube/services/sourced_track/exceptions.dart';
|
||||
import 'package:spotube/services/sourced_track/models/source_info.dart';
|
||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||
@ -92,6 +93,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
||||
}
|
||||
|
||||
notificationService.addTrack(newActiveTrack);
|
||||
discord.updatePresence(newActiveTrack);
|
||||
state = state.copyWith(
|
||||
active: state.tracks
|
||||
.toList()
|
||||
@ -321,6 +323,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
||||
collections: {},
|
||||
);
|
||||
await notificationService.addTrack(indexTrack);
|
||||
discord.updatePresence(indexTrack);
|
||||
} else {
|
||||
final addableTrack = await SourcedTrack.fetchFromTrack(
|
||||
ref: ref,
|
||||
@ -338,6 +341,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
||||
collections: {},
|
||||
);
|
||||
await notificationService.addTrack(addableTrack);
|
||||
discord.updatePresence(addableTrack);
|
||||
}
|
||||
|
||||
await audioPlayer.openPlaylist(
|
||||
@ -366,6 +370,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
||||
|
||||
if (oldTrack != null || track != null) {
|
||||
await notificationService.addTrack(track ?? oldTrack!);
|
||||
discord.updatePresence(track ?? oldTrack!);
|
||||
}
|
||||
}
|
||||
|
||||
@ -468,6 +473,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
||||
|
||||
if (oldTrack != null || track != null) {
|
||||
await notificationService.addTrack(track ?? oldTrack!);
|
||||
discord.updatePresence(track ?? oldTrack!);
|
||||
}
|
||||
}
|
||||
|
||||
@ -493,12 +499,14 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
||||
await audioPlayer.skipToPrevious();
|
||||
if (oldTrack != null || track != null) {
|
||||
await notificationService.addTrack(track ?? oldTrack!);
|
||||
discord.updatePresence(track ?? oldTrack!);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> stop() async {
|
||||
state = ProxyPlaylist({});
|
||||
await audioPlayer.stop();
|
||||
discord.clear();
|
||||
}
|
||||
|
||||
Future<void> updatePalette() async {
|
||||
|
44
lib/services/discord/discord.dart
Normal file
44
lib/services/discord/discord.dart
Normal file
@ -0,0 +1,44 @@
|
||||
import 'package:dart_discord_rpc/dart_discord_rpc.dart';
|
||||
import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
|
||||
import 'package:spotify/spotify.dart';
|
||||
import 'package:spotube/collections/env.dart';
|
||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
||||
|
||||
class Discord {
|
||||
final DiscordRPC? discordRPC;
|
||||
|
||||
Discord()
|
||||
: discordRPC =
|
||||
DesktopTools.platform.isWindows || DesktopTools.platform.isLinux
|
||||
? DiscordRPC(applicationId: Env.discordAppId)
|
||||
: null {
|
||||
discordRPC?.start(autoRegister: true);
|
||||
}
|
||||
|
||||
void updatePresence(Track track) {
|
||||
clear();
|
||||
final artistNames =
|
||||
TypeConversionUtils.artists_X_String(track.artists ?? <Artist>[]);
|
||||
discordRPC?.updatePresence(
|
||||
DiscordPresence(
|
||||
details: "Song: ${track.name} by $artistNames",
|
||||
state: "Vibing in Music",
|
||||
startTimeStamp: DateTime.now().millisecondsSinceEpoch,
|
||||
largeImageKey: "spotube-logo-foreground",
|
||||
largeImageText: "Spotube",
|
||||
smallImageKey: "spotube-logo-foreground",
|
||||
smallImageText: "Spotube",
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void clear() {
|
||||
discordRPC?.clearPresence();
|
||||
}
|
||||
|
||||
void shutdown() {
|
||||
discordRPC?.shutDown();
|
||||
}
|
||||
}
|
||||
|
||||
final discord = Discord();
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <dart_discord_rpc/dart_discord_rpc_plugin.h>
|
||||
#include <file_selector_linux/file_selector_plugin.h>
|
||||
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
|
||||
#include <local_notifier/local_notifier_plugin.h>
|
||||
@ -18,6 +19,9 @@
|
||||
#include <window_size/window_size_plugin.h>
|
||||
|
||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||
g_autoptr(FlPluginRegistrar) dart_discord_rpc_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "DartDiscordRpcPlugin");
|
||||
dart_discord_rpc_plugin_register_with_registrar(dart_discord_rpc_registrar);
|
||||
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
|
||||
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
|
||||
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
dart_discord_rpc
|
||||
file_selector_linux
|
||||
flutter_secure_storage_linux
|
||||
local_notifier
|
||||
|
@ -393,6 +393,15 @@ packages:
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
dart_discord_rpc:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "."
|
||||
ref: HEAD
|
||||
resolved-ref: "4d05017838ebeadcdb832e1893fabad1506fddba"
|
||||
url: "https://github.com/Tommypop2/dart_discord_rpc.git"
|
||||
source: git
|
||||
version: "0.0.3"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -115,6 +115,9 @@ dependencies:
|
||||
very_good_infinite_list: ^0.7.1
|
||||
gap: ^3.0.1
|
||||
sliver_tools: ^0.2.12
|
||||
dart_discord_rpc:
|
||||
git:
|
||||
url: https://github.com/Tommypop2/dart_discord_rpc.git
|
||||
|
||||
dev_dependencies:
|
||||
build_runner: ^2.3.2
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include "generated_plugin_registrant.h"
|
||||
|
||||
#include <dart_discord_rpc/dart_discord_rpc_plugin.h>
|
||||
#include <file_selector_windows/file_selector_windows.h>
|
||||
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
|
||||
#include <local_notifier/local_notifier_plugin.h>
|
||||
@ -19,6 +20,8 @@
|
||||
#include <window_size/window_size_plugin.h>
|
||||
|
||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||
DartDiscordRpcPluginRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("DartDiscordRpcPlugin"));
|
||||
FileSelectorWindowsRegisterWithRegistrar(
|
||||
registry->GetRegistrarForPlugin("FileSelectorWindows"));
|
||||
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
|
||||
|
@ -3,6 +3,7 @@
|
||||
#
|
||||
|
||||
list(APPEND FLUTTER_PLUGIN_LIST
|
||||
dart_discord_rpc
|
||||
file_selector_windows
|
||||
flutter_secure_storage_windows
|
||||
local_notifier
|
||||
|
Loading…
Reference in New Issue
Block a user