Skip to content

Commit

Permalink
feat: add discord rich presence (#945)
Browse files Browse the repository at this point in the history
  • Loading branch information
Feichtmeier authored Oct 11, 2024
1 parent f1a11c5 commit de23cf3
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 13 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Thank you [@amugofjava](https://github.com/amugofjava) for creating the very eas

Thanks [@alexmercerind](https://github.com/alexmercerind) for the super performant [Mediakit library](https://github.com/alexmercerind/media_kit) and [mpris_service](https://github.com/alexmercerind/mpris_service) dart implementation!

Thank you [@KRTirtho](https://github.com/KRTirtho) for the very easy to use [smtc_windows](https://github.com/KRTirtho/smtc_windows) package!
Thank you [@KRTirtho](https://github.com/KRTirtho) for the very easy to use [smtc_windows](https://github.com/KRTirtho/frb_plugins) package and [Flutter Discord RPC](https://github.com/KRTirtho/frb_plugins)

Thank you [@tomassasovsky](https://github.com/tomassasovsky) for the [dart implementation of radiobrowser-api](https://github.com/tomassasovsky/radio-browser-api.dart)!

Expand Down
2 changes: 2 additions & 0 deletions lib/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ const kAppName = 'musicpod';

const kAppId = 'org.feichtmeier.Musicpod';

const kDiscordApplicationId = '1235321910221602837';

const kLinuxDBusName = 'org.mpris.MediaPlayer2.musicpod';

const kAndroidChannelId = 'org.feichtmeier.musicpod.channel.audio';
Expand Down
26 changes: 26 additions & 0 deletions lib/expose/expose_service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'package:flutter_discord_rpc/flutter_discord_rpc.dart';

import '../constants.dart';

class ExposeService {
ExposeService({required FlutterDiscordRPC discordRPC})
: _discordRPC = discordRPC;

final FlutterDiscordRPC _discordRPC;

Future<void> exposeTitleOnline({
required String songDetails,
required String state,
}) {
return _discordRPC.setActivity(
activity: RPCActivity(
assets: RPCAssets(
largeText: songDetails,
smallText: kAppTitle,
),
details: songDetails,
state: state,
),
);
}
}
18 changes: 18 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:desktop_notifications/desktop_notifications.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_discord_rpc/flutter_discord_rpc.dart';
import 'package:github/github.dart';
import 'package:gtk/gtk.dart';
import 'package:media_kit/media_kit.dart';
Expand All @@ -21,6 +22,7 @@ import 'app/app_model.dart';
import 'app/connectivity_model.dart';
import 'app/view/app.dart';
import 'constants.dart';
import 'expose/expose_service.dart';
import 'library/library_service.dart';
import 'local_audio/local_audio_model.dart';
import 'local_audio/local_audio_service.dart';
Expand Down Expand Up @@ -56,10 +58,14 @@ Future<void> main(List<String> args) async {
final sharedPreferences = await SharedPreferences.getInstance();
final version = (await PackageInfo.fromPlatform()).version;

await FlutterDiscordRPC.initialize(kDiscordApplicationId);
FlutterDiscordRPC.instance.connect();

registerServicesAndViewModels(
sharedPreferences: sharedPreferences,
args: args,
version: version,
discordRPC: FlutterDiscordRPC.instance,
);

runApp(
Expand All @@ -71,6 +77,7 @@ Future<void> main(List<String> args) async {

void registerServicesAndViewModels({
required SharedPreferences sharedPreferences,
required FlutterDiscordRPC discordRPC,
required List<String> args,
required String version,
}) {
Expand All @@ -86,6 +93,16 @@ void registerServicesAndViewModels({
),
dispose: (s) => s.dispose(),
)
..registerLazySingleton<FlutterDiscordRPC>(
() => discordRPC,
dispose: (s) {
s.disconnect();
s.dispose();
},
)
..registerLazySingleton<ExposeService>(
() => ExposeService(discordRPC: di<FlutterDiscordRPC>()),
)
..registerLazySingleton<PlayerService>(
() => PlayerService(
onlineArtService: di<OnlineArtService>(),
Expand All @@ -94,6 +111,7 @@ void registerServicesAndViewModels({
configuration: const PlayerConfiguration(title: kAppTitle),
),
),
exposeService: di<ExposeService>(),
)..init(),
dispose: (s) async => s.dispose(),
)
Expand Down
46 changes: 34 additions & 12 deletions lib/player/player_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import '../common/data/audio.dart';
import '../common/data/mpv_meta_data.dart';
import '../common/data/player_state.dart';
import '../constants.dart';
import '../expose/expose_service.dart';
import '../extensions/string_x.dart';
import '../local_audio/cover_store.dart';
import '../persistence_utils.dart';
Expand All @@ -27,10 +28,13 @@ class PlayerService {
PlayerService({
required VideoController controller,
required OnlineArtService onlineArtService,
required ExposeService exposeService,
}) : _controller = controller,
_onlineArtService = onlineArtService;
_onlineArtService = onlineArtService,
_exposeService = exposeService;

final OnlineArtService _onlineArtService;
final ExposeService _exposeService;

final VideoController _controller;
VideoController get controller => _controller;
Expand Down Expand Up @@ -63,7 +67,7 @@ class PlayerService {

MpvMetaData? _mpvMetaData;
MpvMetaData? get mpvMetaData => _mpvMetaData;
void setMpvMetaData(MpvMetaData? value) {
void _setMpvMetaData(MpvMetaData? value) {
_mpvMetaData = value;

var validHistoryElement = _mpvMetaData?.icyTitle.isNotEmpty == true;
Expand Down Expand Up @@ -98,7 +102,19 @@ class PlayerService {
}
_audio = value;
_propertiesChangedController.add(true);
setMpvMetaData(null);
_setMpvMetaData(null);
if (_audio?.audioType != null &&
_audio?.title != null &&
_audio?.artist != null) {
_exposeService.exposeTitleOnline(
songDetails: '${_audio!.artist} - ${audio!.title}}',
state: switch (_audio!.audioType!) {
AudioType.local => 'Local Music',
AudioType.podcast => 'Podcast',
AudioType.radio => 'Internet Radio',
},
);
}
}

bool? _isVideo;
Expand Down Expand Up @@ -278,20 +294,26 @@ class PlayerService {
!data.contains('icy-title')) {
return;
}
final mpvMetaData = MpvMetaData.fromJson(data);
final newData = MpvMetaData.fromJson(data);
final parsedIcyTitle =
HtmlParser(newData.icyTitle).parseFragment().text;
if (parsedIcyTitle == _mpvMetaData?.icyTitle) return;

_setMpvMetaData(newData.copyWith(icyTitle: parsedIcyTitle));

if (parsedIcyTitle == null) return;

if (mpvMetaData.icyTitle == _mpvMetaData?.icyTitle) return;
setMpvMetaData(
mpvMetaData.copyWith(
icyTitle: HtmlParser(mpvMetaData.icyTitle).parseFragment().text,
),
await _exposeService.exposeTitleOnline(
songDetails: parsedIcyTitle,
state: _audio?.title ?? 'Internet Radio',
);

final songInfo = mpvMetaData.icyTitle.splitByDash;
_onlineArtService.fetchAlbumArt(mpvMetaData.icyTitle).then(
final songInfo = parsedIcyTitle.splitByDash;
_onlineArtService.fetchAlbumArt(parsedIcyTitle).then(
(albumArt) async {
await _setMediaControlsMetaData(
audio: (_audio ?? const Audio()).copyWith(
audio:
(_audio ?? const Audio(audioType: AudioType.radio)).copyWith(
imageUrl: albumArt,
title: songInfo.songName,
artist: songInfo.artist,
Expand Down
1 change: 1 addition & 0 deletions linux/flutter/generated_plugins.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
)

list(APPEND FLUTTER_FFI_PLUGIN_LIST
flutter_discord_rpc
media_kit_native_event_loop
)

Expand Down
5 changes: 5 additions & 0 deletions macos/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ PODS:
- FlutterMacOS
- file_selector_macos (0.0.1):
- FlutterMacOS
- flutter_discord_rpc (0.0.1)
- FlutterMacOS (1.0.0)
- irondash_engine_context (0.0.1):
- FlutterMacOS
Expand Down Expand Up @@ -51,6 +52,7 @@ DEPENDENCIES:
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/darwin`)
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
- file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`)
- flutter_discord_rpc (from `Flutter/ephemeral/.symlinks/plugins/flutter_discord_rpc/macos`)
- FlutterMacOS (from `Flutter/ephemeral`)
- irondash_engine_context (from `Flutter/ephemeral/.symlinks/plugins/irondash_engine_context/macos`)
- media_kit_libs_macos_video (from `Flutter/ephemeral/.symlinks/plugins/media_kit_libs_macos_video/macos`)
Expand Down Expand Up @@ -79,6 +81,8 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
file_selector_macos:
:path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos
flutter_discord_rpc:
:path: Flutter/ephemeral/.symlinks/plugins/flutter_discord_rpc/macos
FlutterMacOS:
:path: Flutter/ephemeral
irondash_engine_context:
Expand Down Expand Up @@ -118,6 +122,7 @@ SPEC CHECKSUMS:
connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db
device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720
file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d
flutter_discord_rpc: 53b006f68ef620a99fe1b3ba7e83513f3ae95b4c
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
irondash_engine_context: da62996ee25616d2f01bbeb85dc115d813359478
media_kit_libs_macos_video: b3e2bbec2eef97c285f2b1baa7963c67c753fb82
Expand Down
8 changes: 8 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.4.1"
flutter_discord_rpc:
dependency: "direct main"
description:
name: flutter_discord_rpc
sha256: "290c0d91c8ef24c3acb84cb6fcc5c5fed652fe4871b59896c8d180d5eae5d647"
url: "https://pub.dev"
source: hosted
version: "0.1.0+1"
flutter_html:
dependency: "direct main"
description:
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ dependencies:
flutter:
sdk: flutter
flutter_cache_manager: ^3.4.1
flutter_discord_rpc: ^0.1.0+1
flutter_html: ^3.0.0-beta.2
flutter_localizations:
sdk: flutter
Expand Down
1 change: 1 addition & 0 deletions windows/flutter/generated_plugins.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
)

list(APPEND FLUTTER_FFI_PLUGIN_LIST
flutter_discord_rpc
media_kit_native_event_loop
smtc_windows
)
Expand Down

0 comments on commit de23cf3

Please sign in to comment.