comparison pidgin-audacious.c @ 19:12d809123d69

- revised signed_on_cb() so that it calls purple_util_set_current_song(). - new debug macros. - removed watchdog_func(). - added connect_purple_signals(). - renamed is_app_running() as is_app_playing().
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Sat, 04 Oct 2008 12:06:45 +0900
parents dc3aa0bf24c0
children 4aa711530489
comparison
equal deleted inserted replaced
18:dc3aa0bf24c0 19:12d809123d69
31 #include "version.h" 31 #include "version.h"
32 #include "cmds.h" 32 #include "cmds.h"
33 #include "savedstatuses.h" 33 #include "savedstatuses.h"
34 34
35 #define PIDGINAUD_PLUGIN_ID "pidgin_audacious" 35 #define PIDGINAUD_PLUGIN_ID "pidgin_audacious"
36 36 #define PLUGIN_NAME "Pidgin-Audacious"
37 #define OPT_PIDGINAUD "/plugins/pidgin_audacious" 37 #define OPT_PIDGINAUD "/plugins/pidgin_audacious"
38 #define OPT_PROCESS_STATUS OPT_PIDGINAUD "/process_status" 38 #define OPT_PROCESS_STATUS OPT_PIDGINAUD "/process_status"
39 #define OPT_PROCESS_USERINFO OPT_PIDGINAUD "/process_userinfo" 39 #define OPT_PROCESS_USERINFO OPT_PIDGINAUD "/process_userinfo"
40 #define OPT_SONG_TEMPLATE OPT_PIDGINAUD "/song_template" 40 #define OPT_SONG_TEMPLATE OPT_PIDGINAUD "/song_template"
41 #define OPT_PASTE_TEMPLATE OPT_PIDGINAUD "/paste_template" 41 #define OPT_PASTE_TEMPLATE OPT_PIDGINAUD "/paste_template"
42 #define OPT_LOG_OUTPUT OPT_PIDGINAUD "/log_output"
42 43
43 #define DEFAULT_SONG_TEMPLATE "%artist - %title" 44 #define DEFAULT_SONG_TEMPLATE "%artist - %title"
44 #define SONG_TOKEN "%song" 45 #define SONG_TOKEN "%song"
45 #define NO_SONG_MESSAGE "No song being played." 46 #define NO_SONG_MESSAGE "No song being played."
46 47
47 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) 48 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
48 49
49 #define aud_debug(fmt, ...) purple_debug(PURPLE_DEBUG_INFO, \ 50 #define aud_debug(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_INFO, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0);
50 "Pidgin-Audacious", \ 51
51 fmt, ## __VA_ARGS__); 52 #define aud_error(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_ERROR, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0);
52 #define aud_error(fmt, ...) purple_debug(PURPLE_DEBUG_ERROR, \ 53
53 "Pidgin-Audacious", \
54 fmt, ## __VA_ARGS__);
55 /* xxx move up */ 54 /* xxx move up */
56 #define TITLE "%title" 55 #define TITLE "%title"
57 #define ARTIST "%artist" 56 #define ARTIST "%artist"
58 #define ALBUM "%album" 57 #define ALBUM "%album"
59 #define GENRE "%genre" 58 #define GENRE "%genre"
78 /* prototypes */ 77 /* prototypes */
79 extern gchar *botch_utf(const gchar *msg, gsize len, gsize *newlen) __attribute__ ((weak)); 78 extern gchar *botch_utf(const gchar *msg, gsize len, gsize *newlen) __attribute__ ((weak));
80 static void aud_process(gchar *aud_info); 79 static void aud_process(gchar *aud_info);
81 static void track_signal_cb(DBusGProxy *player_proxy, GHashTable *table, gpointer data); 80 static void track_signal_cb(DBusGProxy *player_proxy, GHashTable *table, gpointer data);
82 static void status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data); 81 static void status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data);
83 static gboolean is_app_running(void); 82 static gboolean is_app_playing(void);
84 static GHashTable *get_song_table(void); 83 static GHashTable *get_song_table(void);
85 static song_tuple *get_song_tuple(GHashTable *table); 84 static song_tuple *get_song_tuple(GHashTable *table);
85 static void signed_on_cb(PurpleConnection *gc, void *data);
86 static void prefs_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data);
86 87
87 88
88 /* implementation */ 89 /* implementation */
89 90
90 static DBusGProxy * 91 static DBusGProxy *
126 "StatusChange", 127 "StatusChange",
127 G_CALLBACK(status_signal_cb), 128 G_CALLBACK(status_signal_cb),
128 NULL, NULL); 129 NULL, NULL);
129 } 130 }
130 131
132 static void
133 connect_purple_signals(PurplePlugin *plugin)
134 {
135 purple_signal_connect(purple_connections_get_handle(),
136 "signed-on",
137 plugin,
138 PURPLE_CALLBACK(signed_on_cb),
139 NULL);
140
141 purple_signal_connect(purple_savedstatuses_get_handle(),
142 "savedstatus-changed",
143 plugin,
144 PURPLE_CALLBACK(signed_on_cb),
145 NULL);
146
147 purple_prefs_connect_callback(purple_prefs_get_handle(),
148 OPT_PIDGINAUD,
149 prefs_cb,
150 NULL);
151 }
152
131 static GHashTable * 153 static GHashTable *
132 get_song_table(void) 154 get_song_table(void)
133 { 155 {
134 GHashTable *table = NULL; 156 GHashTable *table = NULL;
135 157
136 status_signal_cb(NULL, -1, NULL); 158 if(is_app_playing()) {
137
138 if(is_app_running()) {
139 dbus_g_proxy_call(session, 159 dbus_g_proxy_call(session,
140 "GetMetadata", 160 "GetMetadata",
141 NULL, 161 NULL,
142 G_TYPE_INVALID, 162 G_TYPE_INVALID,
143 DBUS_TYPE_G_STRING_VALUE_HASHTABLE, 163 DBUS_TYPE_G_STRING_VALUE_HASHTABLE,
261 281
262 } 282 }
263 } 283 }
264 284
265 285
266 #if 0
267 static gboolean
268 watchdog_func(void)
269 {
270 gint playpos = 0;
271 gchar *song = NULL, *tmp = NULL;
272
273 gboolean rv = TRUE;
274 size_t dummy;
275
276 if(!session) {
277 session = get_dbus_session();
278 }
279
280 aud_debug("session = %p\n", session);
281 aud_debug("is_playing = %d\n", audacious_remote_is_playing(session));
282
283 if(!audacious_remote_is_playing(session)) { /* audacious isn't playing */
284 aud_process(NULL);
285 purple_util_set_current_song(NULL, NULL, NULL);
286 return rv;
287 }
288
289 playpos = audacious_remote_get_playlist_pos(session);
290 tmp = audacious_remote_get_playlist_title(session, playpos);
291 if(tmp) {
292 if(botch_utf) /* if function exists */
293 song = (gchar *) botch_utf(tmp, strlen(tmp), &dummy);
294 else
295 song = g_strdup(tmp);
296 }
297 g_free(tmp);
298 tmp = NULL;
299
300 aud_process(song);
301 g_free(song);
302 song = NULL;
303
304 /* preliminary support for purple_util_set_current_song() */
305 gchar *artist = NULL, *title = NULL, *album = NULL;
306
307 artist = audacious_get_tuple_field_data(session, "artist", playpos);
308 title = audacious_get_tuple_field_data(session, "title", playpos);
309 album = audacious_get_tuple_field_data(session, "album", playpos);
310
311 purple_util_set_current_song(title ? title : "",
312 artist ? artist : "",
313 album ? album : "");
314
315 g_free(artist);
316 g_free(title);
317 g_free(album);
318
319 return rv;
320 }
321 #endif
322
323
324
325
326
327 static void 286 static void
328 aud_process_status(PurpleConnection *gc, gchar *aud_info) 287 aud_process_status(PurpleConnection *gc, gchar *aud_info)
329 { 288 {
330 gchar *new = NULL, *key = NULL; 289 gchar *new = NULL, *key = NULL;
331 const gchar *current, *seed, *pushed, *proto; 290 const gchar *current, *seed, *pushed, *proto;
525 removeval(gpointer data) 484 removeval(gpointer data)
526 { 485 {
527 g_free(data); 486 g_free(data);
528 } 487 }
529 488
530
531
532
533
534 static PurpleCmdRet 489 static PurpleCmdRet
535 paste_current_song(PurpleConversation *conv, const gchar *cmd, 490 paste_current_song(PurpleConversation *conv, const gchar *cmd,
536 gchar **args, gchar **error, void *data) 491 gchar **args, gchar **error, void *data)
537 { 492 {
538 gchar *song = NULL, *tmp = NULL, *tmp2 = NULL; 493 gchar *song = NULL, *tmp = NULL, *tmp2 = NULL;
539 PurpleConversationType type = purple_conversation_get_type(conv); 494 PurpleConversationType type = purple_conversation_get_type(conv);
540 size_t dummy; 495 size_t dummy;
541 const gchar *template = NULL; 496 const gchar *template = NULL;
542 497
543 /* audacious isn't playing */ 498 /* audacious isn't playing */
544 if(!is_app_running()) { 499 if(!is_app_playing()) {
545 return PURPLE_CMD_RET_OK; 500 return PURPLE_CMD_RET_OK;
546 } 501 }
547 502
548 /* dbus lookup */ 503 /* dbus lookup */
549 GHashTable *table = get_song_table(); 504 GHashTable *table = get_song_table();
586 541
587 g_free(song); 542 g_free(song);
588 return PURPLE_CMD_RET_OK; 543 return PURPLE_CMD_RET_OK;
589 } 544 }
590 545
591
592
593
594
595 static gboolean 546 static gboolean
596 is_app_running(void) 547 is_app_playing(void)
597 { 548 {
598 gchar *player_name = g_strconcat("org.mpris.", "audacious", NULL); 549 gchar *player_name = g_strconcat("org.mpris.", "audacious", NULL);
599 550
600 #if 0 551 #if 0
601 if(g_strcasecmp(pidginmpris->player_name, player_name) != 0) { 552 if(g_strcasecmp(pidginmpris->player_name, player_name) != 0) {
625 { 576 {
626 gchar *song_info = NULL; 577 gchar *song_info = NULL;
627 GHashTable *table = NULL; 578 GHashTable *table = NULL;
628 song_tuple *tuple = NULL; 579 song_tuple *tuple = NULL;
629 580
581 aud_debug("called\n");
582
630 table = get_song_table(); 583 table = get_song_table();
631 tuple = get_song_tuple(table); 584 tuple = get_song_tuple(table);
585 g_hash_table_destroy(table);
586
587 /* set current song */
588 purple_util_set_current_song(tuple->title ? tuple->title : "",
589 tuple->artist ? tuple->artist : "",
590 tuple->album ? tuple->album : "");
632 591
633 song_info = format_song_info(tuple); 592 song_info = format_song_info(tuple);
634 free_song_tuple(tuple); 593 free_song_tuple(tuple);
635 g_hash_table_destroy(table); 594
636 595 aud_process(song_info);
637 if(song_info)
638 aud_process(song_info);
639
640 g_free(song_info); 596 g_free(song_info);
641 } 597 }
642 598
643 599
644 static void prefs_cb(const char *name, PurplePrefType type, 600 static void
601 prefs_cb(const char *name, PurplePrefType type,
645 gconstpointer value, gpointer data) 602 gconstpointer value, gpointer data)
646 { 603 {
647 aud_debug("settings change detected at %s\n", name); 604 aud_debug("settings change detected at %s\n", name);
648 signed_on_cb(NULL, NULL); 605 signed_on_cb(NULL, NULL);
649 } 606 }
666 623
667 /* connect to mpris signals */ 624 /* connect to mpris signals */
668 connect_dbus_signals(); 625 connect_dbus_signals();
669 626
670 /* connect to purple signals */ 627 /* connect to purple signals */
671 purple_signal_connect(purple_connections_get_handle(), 628 connect_purple_signals(plugin);
672 "signed-on",
673 plugin,
674 PURPLE_CALLBACK(signed_on_cb),
675 NULL);
676
677 purple_signal_connect(purple_savedstatuses_get_handle(),
678 "savedstatus-changed",
679 plugin,
680 PURPLE_CALLBACK(signed_on_cb),
681 NULL);
682
683 purple_prefs_connect_callback(purple_prefs_get_handle(),
684 OPT_PIDGINAUD,
685 prefs_cb,
686 NULL);
687 629
688 status_signal_cb(NULL, -1, NULL); 630 status_signal_cb(NULL, -1, NULL);
689 631
690 632
691 /* register /song command */ 633 /* register /song command */
775 0, /**< flags */ 717 0, /**< flags */
776 NULL, /**< deps */ 718 NULL, /**< deps */
777 PURPLE_PRIORITY_DEFAULT, /**< priority */ 719 PURPLE_PRIORITY_DEFAULT, /**< priority */
778 PIDGINAUD_PLUGIN_ID, /**< id */ 720 PIDGINAUD_PLUGIN_ID, /**< id */
779 "Pidgin-Audacious", /**< name */ 721 "Pidgin-Audacious", /**< name */
780 "3.0.0d2", /**< version */ 722 "3.0.0d1", /**< version */
781 "Automatically updates your Pidgin status info with the currently " 723 "Automatically updates your Pidgin status info with the currently "
782 "playing music in Audacious.", /** summary */ 724 "playing music in Audacious.", /** summary */
783 "Automatically updates your Pidgin status info with the currently " 725 "Automatically updates your Pidgin status info with the currently "
784 "playing music in Audacious.", /** desc */ 726 "playing music in Audacious.", /** desc */
785 "Yoshiki Yazawa (yaz@honeyplanet.jp)", /**< author */ 727 "Yoshiki Yazawa (yaz@honeyplanet.jp)", /**< author */
802 purple_prefs_add_none(OPT_PIDGINAUD); 744 purple_prefs_add_none(OPT_PIDGINAUD);
803 purple_prefs_add_bool(OPT_PROCESS_STATUS, TRUE); 745 purple_prefs_add_bool(OPT_PROCESS_STATUS, TRUE);
804 purple_prefs_add_bool(OPT_PROCESS_USERINFO, TRUE); 746 purple_prefs_add_bool(OPT_PROCESS_USERINFO, TRUE);
805 purple_prefs_add_string(OPT_SONG_TEMPLATE, DEFAULT_SONG_TEMPLATE); 747 purple_prefs_add_string(OPT_SONG_TEMPLATE, DEFAULT_SONG_TEMPLATE);
806 purple_prefs_add_string(OPT_PASTE_TEMPLATE, SONG_TOKEN); 748 purple_prefs_add_string(OPT_PASTE_TEMPLATE, SONG_TOKEN);
749 purple_prefs_add_bool(OPT_LOG_OUTPUT, TRUE);
807 750
808 } 751 }
809 752
810 PURPLE_INIT_PLUGIN(pidgin_audacious, init_plugin, info) 753 PURPLE_INIT_PLUGIN(pidgin_audacious, init_plugin, info)