diff options
author | waker <wakeroid@gmail.com> | 2011-02-26 19:34:37 +0100 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2011-02-26 19:34:37 +0100 |
commit | 20deec5e1850c5f6e31a6c9710bf3eae7f74be97 (patch) | |
tree | cf69862a624795955e01100c46a6fc66e9563f61 /plugins/notify | |
parent | 3a30d396a8b437d12fe8ad48a6c0cc30e27acf7e (diff) |
added support for different sizes of album art images;
added album art display to notifications
Diffstat (limited to 'plugins/notify')
-rw-r--r-- | plugins/notify/notify.c | 247 |
1 files changed, 140 insertions, 107 deletions
diff --git a/plugins/notify/notify.c b/plugins/notify/notify.c index 2b9bfadc..193f6bef 100644 --- a/plugins/notify/notify.c +++ b/plugins/notify/notify.c @@ -22,6 +22,7 @@ #include <stdlib.h> #include <string.h> #include "../../gettext.h" +#include "../artwork/artwork.h" #define E_NOTIFICATION_BUS_NAME "org.freedesktop.Notifications" #define E_NOTIFICATION_INTERFACE "org.freedesktop.Notifications" @@ -29,10 +30,12 @@ DB_functions_t *deadbeef; DB_misc_t plugin; +DB_artwork_plugin_t *artwork_plugin; static dbus_uint32_t replaces_id = 0; -#define NOTIFY_DEFAULT_FORMAT "%a - %t" +#define NOTIFY_DEFAULT_TITLE "%t" +#define NOTIFY_DEFAULT_CONTENT "%a - %b" static void notify_thread (void *ctx) { @@ -114,116 +117,130 @@ notify_marshal_dict_string(DBusMessageIter *iter, const char *key, const char *v } #endif +static void +esc_xml (const char *cmd, char *esc, int size) { + const char *src = cmd; + char *dst = esc; + char *end = dst + size - 1; + while (*src && dst < end) { + if (*src == '&') { + if (end - dst < 5) { + break; + } + strcpy (dst, "&"); + dst += 5; + src++; + } + else if (*src == '<') { + if (end - dst < 4) { + break; + } + strcpy (dst, "<"); + dst += 4; + src++; + } + else if (*src == '>') { + if (end - dst < 4) { + break; + } + strcpy (dst, ">"); + dst += 4; + src++; + } + else if (*src == '\'') { + if (end - dst < 6) { + break; + } + strcpy (dst, "'"); + dst += 6; + src++; + } + else if (*src == '"') { + if (end - dst < 6) { + break; + } + strcpy (dst, """); + dst += 6; + src++; + } + else { + *dst++ = *src++; + } + } + *dst = 0; +} + + +static void +cover_avail_callback (const char *fname, const char *artist, const char *album, void *user_data) { +// show_notification (track); +} + +static void show_notification (DB_playItem_t *track) { + char title[1024]; + char content[1024]; + deadbeef->pl_format_title (track, -1, title, sizeof (title), -1, deadbeef->conf_get_str ("notify.format", NOTIFY_DEFAULT_TITLE)); + deadbeef->pl_format_title (track, -1, content, sizeof (content), -1, deadbeef->conf_get_str ("notify.format_content", NOTIFY_DEFAULT_CONTENT)); + + // escape & + char esc_title[1024]; + char esc_content[1024]; + esc_xml (title, esc_title, sizeof (esc_title)); + esc_xml (content, esc_content, sizeof (esc_content)); + DBusMessage *msg = dbus_message_new_method_call (E_NOTIFICATION_BUS_NAME, E_NOTIFICATION_PATH, E_NOTIFICATION_INTERFACE, "Notify"); + + const char *v_appname = "DeaDBeeF"; + dbus_uint32_t v_id = 0; + char *v_iconname = NULL; + if (deadbeef->conf_get_int("notify.albumart", 0) && artwork_plugin) { + const char *album = deadbeef->pl_find_meta (track, "album"); + const char *artist = deadbeef->pl_find_meta (track, "artist"); + v_iconname = artwork_plugin->get_album_art (track->fname, artist, album, 48, cover_avail_callback, NULL); + } + if (!v_iconname) { + v_iconname = strdup ("deadbeef"); + } + const char *v_summary = esc_title; + const char *v_body = esc_content; + dbus_int32_t v_timeout = -1; + + dbus_message_append_args (msg + , DBUS_TYPE_STRING, &v_appname + , DBUS_TYPE_UINT32, &replaces_id + , DBUS_TYPE_STRING, &v_iconname + , DBUS_TYPE_STRING, &v_summary + , DBUS_TYPE_STRING, &v_body + , DBUS_TYPE_INVALID + ); + + DBusMessageIter iter, sub; + // actions + dbus_message_iter_init_append(msg, &iter); + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &sub); + dbus_message_iter_close_container(&iter, &sub); + // hints + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub); + dbus_message_iter_close_container(&iter, &sub); + + dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &v_timeout); + + intptr_t tid = 0; + if ((tid=deadbeef->thread_start(notify_thread, msg)) != 0) { + dbus_message_ref (msg); + deadbeef->thread_detach (tid); + } + dbus_message_unref (msg); + if (v_iconname) { + free (v_iconname); + } +} + static int on_songchanged (DB_event_trackchange_t *ev, uintptr_t data) { if (ev->to && deadbeef->conf_get_int ("notify.enable", 0)) { DB_playItem_t *track = ev->to; if (track) { - char cmd[1024]; - deadbeef->pl_format_title (track, -1, cmd, sizeof (cmd), -1, deadbeef->conf_get_str ("notify.format", NOTIFY_DEFAULT_FORMAT)); - - // escape & - char esc[1024]; - - char *src = cmd; - char *dst = esc; - char *end = dst + sizeof (esc) - 1; - while (*src && dst < end) { - if (*src == '&') { - if (end - dst < 5) { - break; - } - strcpy (dst, "&"); - dst += 5; - src++; - } - else if (*src == '<') { - if (end - dst < 4) { - break; - } - strcpy (dst, "<"); - dst += 4; - src++; - } - else if (*src == '>') { - if (end - dst < 4) { - break; - } - strcpy (dst, ">"); - dst += 4; - src++; - } - else if (*src == '\'') { - if (end - dst < 6) { - break; - } - strcpy (dst, "'"); - dst += 6; - src++; - } - else if (*src == '"') { - if (end - dst < 6) { - break; - } - strcpy (dst, """); - dst += 6; - src++; - } - else { - *dst++ = *src++; - } - } - *dst = 0; -/* - DBusError error; - dbus_error_init (&error); - DBusConnection *conn = dbus_bus_get (DBUS_BUS_SESSION, &error); - if(conn == NULL) { - printf("connection failed: %s",error.message); - exit(1); - } -*/ - DBusMessage *msg = dbus_message_new_method_call (E_NOTIFICATION_BUS_NAME, E_NOTIFICATION_PATH, E_NOTIFICATION_INTERFACE, "Notify"); - - const char *v_appname = "DeaDBeeF"; - dbus_uint32_t v_id = 0; - const char *v_iconname = "deadbeef"; - const char *v_summary = _("DeaDBeeF now playing"); - const char *v_body = esc; - dbus_int32_t v_timeout = -1; - - dbus_message_append_args (msg - , DBUS_TYPE_STRING, &v_appname -// , DBUS_TYPE_UINT32, &v_id - , DBUS_TYPE_UINT32, &replaces_id - , DBUS_TYPE_STRING, &v_iconname - , DBUS_TYPE_STRING, &v_summary - , DBUS_TYPE_STRING, &v_body - , DBUS_TYPE_INVALID - ); - - DBusMessageIter iter, sub; - // actions - dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &sub); - dbus_message_iter_close_container(&iter, &sub); - // hints - dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub); - dbus_message_iter_close_container(&iter, &sub); - - dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &v_timeout); - - //int serial; - //dbus_bool_t retval = dbus_connection_send(conn,msg,&serial); - //dbus_connection_flush (conn); - //dbus_message_unref (msg); - - intptr_t tid = 0; - if ((tid=deadbeef->thread_start(notify_thread, msg)) != 0) { - dbus_message_ref (msg); - deadbeef->thread_detach (tid); - } - dbus_message_unref (msg); + show_notification (track); } } return 0; @@ -241,9 +258,23 @@ notify_stop (void) { return 0; } +static int +notify_connect (void) { + artwork_plugin = (DB_artwork_plugin_t *)deadbeef->plug_get_for_id ("artwork"); + return 0; +} + +static int +notify_disconnect (void) { + artwork_plugin = NULL; + return 0; +} + static const char settings_dlg[] = "property \"Enable\" checkbox notify.enable 0;\n" - "property \"Notification format\" entry notify.format \"" NOTIFY_DEFAULT_FORMAT "\";\n" + "property \"Notification title format\" entry notify.format \"" NOTIFY_DEFAULT_TITLE "\";\n" + "property \"Notification content format\" entry notify.format_content \"" NOTIFY_DEFAULT_CONTENT "\";\n" + "property \"Show album art\" checkbox notify.albumart 1;\n" ; DB_misc_t plugin = { @@ -259,6 +290,8 @@ DB_misc_t plugin = { .plugin.website = "http://deadbeef.sourceforge.net", .plugin.start = notify_start, .plugin.stop = notify_stop, + .plugin.connect = notify_connect, + .plugin.disconnect = notify_disconnect, .plugin.configdialog = settings_dlg, }; |