Add metadata to MPRIS output -- not complete.
This commit is contained in:
+86
-2
@@ -11,8 +11,90 @@
|
||||
|
||||
#include "dacp.h"
|
||||
|
||||
#include "metadata_hub.h"
|
||||
#include "mpris-service.h"
|
||||
|
||||
void mpris_metadata_watcher(struct metadata_bundle *argc, void *userdata) {
|
||||
debug(1, "MPRIS metadata watcher called");
|
||||
char response[100];
|
||||
switch (argc->repeat_status) {
|
||||
case RS_NONE:
|
||||
strcpy(response, "None");
|
||||
break;
|
||||
case RS_SINGLE:
|
||||
strcpy(response, "Track");
|
||||
break;
|
||||
case RS_ALL:
|
||||
strcpy(response, "Playlist");
|
||||
break;
|
||||
}
|
||||
|
||||
// debug(1,"Set loop status to \"%s\"",response);
|
||||
media_player2_player_set_loop_status(mprisPlayerPlayerSkeleton, response);
|
||||
|
||||
GVariantBuilder *dict_builder, *aa;
|
||||
GVariant *trackname, *albumname, *trackid, *tracklength;
|
||||
|
||||
// Build the Track ID from the 16-byte item_composite_id in hex prefixed by
|
||||
// /org/gnome/ShairportSync
|
||||
|
||||
char st[33];
|
||||
char *pt = st;
|
||||
int it;
|
||||
for (it = 0; it < 16; it++) {
|
||||
sprintf(pt, "%02X", argc->item_composite_id[it]);
|
||||
pt += 2;
|
||||
}
|
||||
*pt = 0;
|
||||
debug(1, "Item composite ID set to 0x%s.", st);
|
||||
|
||||
char trackidstring[1024];
|
||||
sprintf(trackidstring, "/org/gnome/ShairportSync/%s", st);
|
||||
|
||||
trackid = g_variant_new("o", trackidstring);
|
||||
|
||||
// Make up the track name and album name
|
||||
trackname = g_variant_new("s", argc->track_name);
|
||||
albumname = g_variant_new("s", argc->album_name);
|
||||
|
||||
// Make up the track length in microseconds as an int64
|
||||
|
||||
uint64_t track_length_in_microseconds = argc->songtime_in_milliseconds;
|
||||
|
||||
track_length_in_microseconds *= 1000; // to micorseconds in 64-bit precision
|
||||
|
||||
// Make up the track name and album name
|
||||
tracklength = g_variant_new("x", track_length_in_microseconds);
|
||||
|
||||
/* Build the artists array */
|
||||
// debug(1,"Build artists");
|
||||
aa = g_variant_builder_new(G_VARIANT_TYPE("as"));
|
||||
g_variant_builder_add(aa, "s", argc->artist_name);
|
||||
GVariant *artists = g_variant_builder_end(aa);
|
||||
g_variant_builder_unref(aa);
|
||||
|
||||
/* Build the genre array */
|
||||
// debug(1,"Build genre");
|
||||
aa = g_variant_builder_new(G_VARIANT_TYPE("as"));
|
||||
g_variant_builder_add(aa, "s", argc->genre);
|
||||
GVariant *genres = g_variant_builder_end(aa);
|
||||
g_variant_builder_unref(aa);
|
||||
|
||||
/* Build the metadata array */
|
||||
// debug(1,"Build metadata");
|
||||
dict_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
|
||||
g_variant_builder_add(dict_builder, "{sv}", "xesam:title", trackname);
|
||||
g_variant_builder_add(dict_builder, "{sv}", "xesam:album", albumname);
|
||||
g_variant_builder_add(dict_builder, "{sv}", "xesam:artist", artists);
|
||||
g_variant_builder_add(dict_builder, "{sv}", "xesam:genre", genres);
|
||||
g_variant_builder_add(dict_builder, "{sv}", "xesam:trackid", trackid);
|
||||
g_variant_builder_add(dict_builder, "{sv}", "xesam:length", tracklength);
|
||||
GVariant *dict = g_variant_builder_end(dict_builder);
|
||||
g_variant_builder_unref(dict_builder);
|
||||
|
||||
media_player2_player_set_metadata(mprisPlayerPlayerSkeleton, dict);
|
||||
}
|
||||
|
||||
static gboolean on_handle_next(MediaPlayer2Player *skeleton, GDBusMethodInvocation *invocation,
|
||||
gpointer user_data) {
|
||||
send_simple_dacp_command("nextitem");
|
||||
@@ -77,8 +159,8 @@ static void on_mpris_name_acquired(GDBusConnection *connection, const gchar *nam
|
||||
media_player2_set_supported_uri_schemes(mprisPlayerSkeleton, empty_string_array);
|
||||
media_player2_set_supported_mime_types(mprisPlayerSkeleton, empty_string_array);
|
||||
|
||||
media_player2_player_set_playback_status(mprisPlayerPlayerSkeleton, "stop");
|
||||
media_player2_player_set_loop_status(mprisPlayerPlayerSkeleton, "off");
|
||||
media_player2_player_set_playback_status(mprisPlayerPlayerSkeleton, "Stopped");
|
||||
media_player2_player_set_loop_status(mprisPlayerPlayerSkeleton, "None");
|
||||
media_player2_player_set_volume(mprisPlayerPlayerSkeleton, 0.5);
|
||||
media_player2_player_set_minimum_rate(mprisPlayerPlayerSkeleton, 1.0);
|
||||
media_player2_player_set_maximum_rate(mprisPlayerPlayerSkeleton, 1.0);
|
||||
@@ -98,6 +180,8 @@ static void on_mpris_name_acquired(GDBusConnection *connection, const gchar *nam
|
||||
g_signal_connect(mprisPlayerPlayerSkeleton, "handle-previous", G_CALLBACK(on_handle_previous),
|
||||
NULL);
|
||||
|
||||
add_metadata_watcher(mpris_metadata_watcher, NULL);
|
||||
|
||||
debug(1, "Shairport Sync D-BUS service started on interface \"%s\".", name);
|
||||
|
||||
debug(1, "MPRIS service started on interface \"%s\".", name);
|
||||
|
||||
Reference in New Issue
Block a user