mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-14 08:25:16 +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 =>
|
static bool get enableUpdateChecker =>
|
||||||
DesktopTools.platform.isFlatpak || _enableUpdateChecker == "1";
|
DesktopTools.platform.isFlatpak || _enableUpdateChecker == "1";
|
||||||
|
|
||||||
|
static String discordAppId = "1176718791388975124";
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import 'package:catcher_2/catcher_2.dart';
|
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:device_preview/device_preview.dart';
|
||||||
import 'package:fl_query/fl_query.dart';
|
import 'package:fl_query/fl_query.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
@ -63,6 +64,10 @@ Future<void> main(List<String> rawArgs) async {
|
|||||||
MetadataGod.initialize();
|
MetadataGod.initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DesktopTools.platform.isWindows || DesktopTools.platform.isLinux) {
|
||||||
|
DiscordRPC.initialize();
|
||||||
|
}
|
||||||
|
|
||||||
final hiveCacheDir =
|
final hiveCacheDir =
|
||||||
kIsWeb ? null : (await getApplicationSupportDirectory()).path;
|
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/provider/user_preferences/user_preferences_state.dart';
|
||||||
import 'package:spotube/services/audio_player/audio_player.dart';
|
import 'package:spotube/services/audio_player/audio_player.dart';
|
||||||
import 'package:spotube/services/audio_services/audio_services.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/exceptions.dart';
|
||||||
import 'package:spotube/services/sourced_track/models/source_info.dart';
|
import 'package:spotube/services/sourced_track/models/source_info.dart';
|
||||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||||
@ -92,6 +93,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
|||||||
}
|
}
|
||||||
|
|
||||||
notificationService.addTrack(newActiveTrack);
|
notificationService.addTrack(newActiveTrack);
|
||||||
|
discord.updatePresence(newActiveTrack);
|
||||||
state = state.copyWith(
|
state = state.copyWith(
|
||||||
active: state.tracks
|
active: state.tracks
|
||||||
.toList()
|
.toList()
|
||||||
@ -321,6 +323,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
|||||||
collections: {},
|
collections: {},
|
||||||
);
|
);
|
||||||
await notificationService.addTrack(indexTrack);
|
await notificationService.addTrack(indexTrack);
|
||||||
|
discord.updatePresence(indexTrack);
|
||||||
} else {
|
} else {
|
||||||
final addableTrack = await SourcedTrack.fetchFromTrack(
|
final addableTrack = await SourcedTrack.fetchFromTrack(
|
||||||
ref: ref,
|
ref: ref,
|
||||||
@ -338,6 +341,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
|||||||
collections: {},
|
collections: {},
|
||||||
);
|
);
|
||||||
await notificationService.addTrack(addableTrack);
|
await notificationService.addTrack(addableTrack);
|
||||||
|
discord.updatePresence(addableTrack);
|
||||||
}
|
}
|
||||||
|
|
||||||
await audioPlayer.openPlaylist(
|
await audioPlayer.openPlaylist(
|
||||||
@ -366,6 +370,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
|||||||
|
|
||||||
if (oldTrack != null || track != null) {
|
if (oldTrack != null || track != null) {
|
||||||
await notificationService.addTrack(track ?? oldTrack!);
|
await notificationService.addTrack(track ?? oldTrack!);
|
||||||
|
discord.updatePresence(track ?? oldTrack!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -468,6 +473,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
|||||||
|
|
||||||
if (oldTrack != null || track != null) {
|
if (oldTrack != null || track != null) {
|
||||||
await notificationService.addTrack(track ?? oldTrack!);
|
await notificationService.addTrack(track ?? oldTrack!);
|
||||||
|
discord.updatePresence(track ?? oldTrack!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -493,12 +499,14 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
|
|||||||
await audioPlayer.skipToPrevious();
|
await audioPlayer.skipToPrevious();
|
||||||
if (oldTrack != null || track != null) {
|
if (oldTrack != null || track != null) {
|
||||||
await notificationService.addTrack(track ?? oldTrack!);
|
await notificationService.addTrack(track ?? oldTrack!);
|
||||||
|
discord.updatePresence(track ?? oldTrack!);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> stop() async {
|
Future<void> stop() async {
|
||||||
state = ProxyPlaylist({});
|
state = ProxyPlaylist({});
|
||||||
await audioPlayer.stop();
|
await audioPlayer.stop();
|
||||||
|
discord.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> updatePalette() async {
|
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 "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <dart_discord_rpc/dart_discord_rpc_plugin.h>
|
||||||
#include <file_selector_linux/file_selector_plugin.h>
|
#include <file_selector_linux/file_selector_plugin.h>
|
||||||
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
|
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
|
||||||
#include <local_notifier/local_notifier_plugin.h>
|
#include <local_notifier/local_notifier_plugin.h>
|
||||||
@ -18,6 +19,9 @@
|
|||||||
#include <window_size/window_size_plugin.h>
|
#include <window_size/window_size_plugin.h>
|
||||||
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
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 =
|
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
|
||||||
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
|
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
dart_discord_rpc
|
||||||
file_selector_linux
|
file_selector_linux
|
||||||
flutter_secure_storage_linux
|
flutter_secure_storage_linux
|
||||||
local_notifier
|
local_notifier
|
||||||
|
@ -393,6 +393,15 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.2"
|
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:
|
dart_style:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -115,6 +115,9 @@ dependencies:
|
|||||||
very_good_infinite_list: ^0.7.1
|
very_good_infinite_list: ^0.7.1
|
||||||
gap: ^3.0.1
|
gap: ^3.0.1
|
||||||
sliver_tools: ^0.2.12
|
sliver_tools: ^0.2.12
|
||||||
|
dart_discord_rpc:
|
||||||
|
git:
|
||||||
|
url: https://github.com/Tommypop2/dart_discord_rpc.git
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
build_runner: ^2.3.2
|
build_runner: ^2.3.2
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <dart_discord_rpc/dart_discord_rpc_plugin.h>
|
||||||
#include <file_selector_windows/file_selector_windows.h>
|
#include <file_selector_windows/file_selector_windows.h>
|
||||||
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
|
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
|
||||||
#include <local_notifier/local_notifier_plugin.h>
|
#include <local_notifier/local_notifier_plugin.h>
|
||||||
@ -19,6 +20,8 @@
|
|||||||
#include <window_size/window_size_plugin.h>
|
#include <window_size/window_size_plugin.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
|
DartDiscordRpcPluginRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("DartDiscordRpcPlugin"));
|
||||||
FileSelectorWindowsRegisterWithRegistrar(
|
FileSelectorWindowsRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("FileSelectorWindows"));
|
registry->GetRegistrarForPlugin("FileSelectorWindows"));
|
||||||
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
|
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
dart_discord_rpc
|
||||||
file_selector_windows
|
file_selector_windows
|
||||||
flutter_secure_storage_windows
|
flutter_secure_storage_windows
|
||||||
local_notifier
|
local_notifier
|
||||||
|
Loading…
Reference in New Issue
Block a user