Mercurial > pidgin-audacious
comparison pidgin-audacious.c @ 20:4aa711530489
- made player configurable.
- is_app_playing() now uses GetStatus method.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sat, 04 Oct 2008 17:59:07 +0900 |
parents | 12d809123d69 |
children | 83002f858ee9 |
comparison
equal
deleted
inserted
replaced
19:12d809123d69 | 20:4aa711530489 |
---|---|
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 #define OPT_LOG_OUTPUT OPT_PIDGINAUD "/log_output" |
43 | 43 #define OPT_PLAYER OPT_PIDGINAUD "/player" |
44 #define DEFAULT_SONG_TEMPLATE "%artist - %title" | 44 |
45 #define DEFAULT_SONG_TEMPLATE "%title - %artist" | |
46 #define DEFAULT_PLAYER "audacious" | |
45 #define SONG_TOKEN "%song" | 47 #define SONG_TOKEN "%song" |
46 #define NO_SONG_MESSAGE "No song being played." | 48 #define NO_SONG_MESSAGE "No song being played." |
47 | 49 |
48 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) | 50 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) |
49 | 51 |
91 static DBusGProxy * | 93 static DBusGProxy * |
92 get_dbus_session(void) | 94 get_dbus_session(void) |
93 { | 95 { |
94 GError *error = NULL; | 96 GError *error = NULL; |
95 DBusGProxy *proxy; | 97 DBusGProxy *proxy; |
98 gchar *player = g_strconcat("org.mpris.", | |
99 purple_prefs_get_string(OPT_PLAYER), | |
100 NULL); | |
101 | |
96 connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); | 102 connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); |
97 g_clear_error(&error); | 103 g_clear_error(&error); |
98 | 104 |
105 | |
99 proxy = dbus_g_proxy_new_for_name(connection, | 106 proxy = dbus_g_proxy_new_for_name(connection, |
100 "org.mpris.audacious", | 107 player, |
101 "/Player", | 108 "/Player", |
102 "org.freedesktop.MediaPlayer"); | 109 "org.freedesktop.MediaPlayer"); |
103 | 110 |
104 g_clear_error(&error); | 111 g_clear_error(&error); |
112 g_free(player); | |
105 return proxy; | 113 return proxy; |
106 } | 114 } |
107 | 115 |
108 | 116 |
109 static void | 117 static void |
242 tmp = purple_strreplace(song_info, GENRE, tuple->genre); | 250 tmp = purple_strreplace(song_info, GENRE, tuple->genre); |
243 g_free(song_info); | 251 g_free(song_info); |
244 song_info = tmp; | 252 song_info = tmp; |
245 } | 253 } |
246 | 254 |
255 if(song_info && !strcmp(song_info, "")) { | |
256 g_free(song_info); | |
257 song_info = NULL; | |
258 } | |
259 | |
247 return song_info; | 260 return song_info; |
248 } | 261 } |
249 | 262 |
250 | 263 |
251 | 264 |
272 status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data) | 285 status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data) |
273 { | 286 { |
274 aud_debug("StatusChange %d\n", status); | 287 aud_debug("StatusChange %d\n", status); |
275 | 288 |
276 if (status != 0) { | 289 if (status != 0) { |
277 aud_process(""); | 290 aud_process(NULL); |
278 | 291 |
279 /* clear current song */ | 292 /* clear current song */ |
280 purple_util_set_current_song(NULL, NULL, NULL); | 293 purple_util_set_current_song(NULL, NULL, NULL); |
281 | 294 |
282 } | 295 } |
541 | 554 |
542 g_free(song); | 555 g_free(song); |
543 return PURPLE_CMD_RET_OK; | 556 return PURPLE_CMD_RET_OK; |
544 } | 557 } |
545 | 558 |
559 #define DBUS_TIMEOUT 1000 | |
560 #define DBUS_TYPE_MPRIS_STATUS (dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID)) | |
561 | |
562 #define PLAYING 0 | |
563 #define PAUSED 1 | |
564 #define STOPPED 2 | |
565 | |
546 static gboolean | 566 static gboolean |
547 is_app_playing(void) | 567 is_app_playing(void) |
548 { | 568 { |
549 gchar *player_name = g_strconcat("org.mpris.", "audacious", NULL); | 569 gchar *player_name = g_strconcat("org.mpris.", |
550 | 570 purple_prefs_get_string(OPT_PLAYER), |
571 NULL); | |
572 | |
573 | |
574 aud_debug("player_name = %s\n", player_name); | |
575 | |
576 if(!session) { | |
577 session = get_dbus_session(); | |
578 connect_dbus_signals(); | |
579 aud_debug("session == NULL. new session = %p\n", session); | |
580 } | |
581 | |
582 /* audacious only supports this form */ | |
583 GError *error = NULL; | |
584 int status = STOPPED; | |
585 | |
586 gboolean result = | |
587 dbus_g_proxy_call_with_timeout( | |
588 session, | |
589 "GetStatus", | |
590 DBUS_TIMEOUT, | |
591 &error, | |
592 G_TYPE_INVALID, | |
593 G_TYPE_INT, | |
594 &status, | |
595 G_TYPE_INVALID); | |
596 | |
597 aud_debug("GetStatus result = %d\n", result); | |
598 | |
599 if(status == PLAYING || status == PAUSED) | |
600 return TRUE; | |
601 else | |
602 return FALSE; | |
603 | |
604 aud_debug("GetStatus status = %d\n", status); | |
605 | |
606 | |
607 /* mpris specification 1.0 insists this is the way. no player | |
608 * supports this at this time. --yaz */ | |
551 #if 0 | 609 #if 0 |
552 if(g_strcasecmp(pidginmpris->player_name, player_name) != 0) { | 610 GError *error = NULL; |
553 pidginmpris->player_name = g_strdup(player_name); | 611 GValueArray *s; |
554 g_object_unref(pidginmpris->player); | 612 gboolean result = |
555 mpris_connect_dbus_signals(); | 613 dbus_g_proxy_call_with_timeout( |
556 } | 614 session, |
615 "GetStatus", | |
616 DBUS_TIMEOUT, //msec | |
617 &error, | |
618 G_TYPE_INVALID, | |
619 DBUS_TYPE_MPRIS_STATUS, | |
620 &s, | |
621 G_TYPE_INVALID); | |
622 | |
623 aud_debug("GetStatus result = %d\n", result); | |
624 | |
625 if(result) { | |
626 /* parse GValueArray here */ | |
627 GValue *val = g_value_array_get_nth(s, 0); | |
628 int status = g_value_get_int(val); | |
629 g_value_array_free(s); | |
630 | |
631 aud_debug("status = %d\n", status); | |
632 | |
633 if(status == STOPPED) | |
634 return FALSE; | |
635 else | |
636 return TRUE; | |
637 } | |
638 | |
639 return FALSE; | |
557 #endif | 640 #endif |
558 | 641 |
559 DBusGProxy *player = | |
560 dbus_g_proxy_new_for_name_owner(connection, | |
561 player_name, | |
562 "/Player", | |
563 "org.freedesktop.MediaPlayer", | |
564 NULL); | |
565 | |
566 if(!player) | |
567 return FALSE; | |
568 | |
569 g_object_unref(player); | |
570 g_free(player_name); | |
571 return TRUE; | |
572 } | 642 } |
573 | 643 |
574 static void | 644 static void |
575 signed_on_cb(PurpleConnection *gc, void *data) | 645 signed_on_cb(PurpleConnection *gc, void *data) |
576 { | 646 { |
578 GHashTable *table = NULL; | 648 GHashTable *table = NULL; |
579 song_tuple *tuple = NULL; | 649 song_tuple *tuple = NULL; |
580 | 650 |
581 aud_debug("called\n"); | 651 aud_debug("called\n"); |
582 | 652 |
653 if(!is_app_playing()) | |
654 return; | |
655 | |
583 table = get_song_table(); | 656 table = get_song_table(); |
584 tuple = get_song_tuple(table); | 657 tuple = get_song_tuple(table); |
585 g_hash_table_destroy(table); | 658 g_hash_table_destroy(table); |
659 | |
660 if(!tuple) { | |
661 aud_debug("tuple == NULL\n"); | |
662 return; | |
663 } | |
664 | |
665 if(tuple->title) | |
666 aud_debug("title = %s\n", tuple->title); | |
586 | 667 |
587 /* set current song */ | 668 /* set current song */ |
588 purple_util_set_current_song(tuple->title ? tuple->title : "", | 669 purple_util_set_current_song(tuple->title ? tuple->title : "", |
589 tuple->artist ? tuple->artist : "", | 670 tuple->artist ? tuple->artist : "", |
590 tuple->album ? tuple->album : ""); | 671 tuple->album ? tuple->album : ""); |
619 removekey, removeval); | 700 removekey, removeval); |
620 | 701 |
621 | 702 |
622 session = get_dbus_session(); | 703 session = get_dbus_session(); |
623 | 704 |
705 aud_debug("session = %p\n", session); | |
706 | |
624 /* connect to mpris signals */ | 707 /* connect to mpris signals */ |
625 connect_dbus_signals(); | 708 if(session) |
709 connect_dbus_signals(); | |
626 | 710 |
627 /* connect to purple signals */ | 711 /* connect to purple signals */ |
628 connect_purple_signals(plugin); | 712 connect_purple_signals(plugin); |
629 | 713 |
630 status_signal_cb(NULL, -1, NULL); | 714 status_signal_cb(NULL, -1, NULL); |
675 /* create gtk elements for the plugin preferences */ | 759 /* create gtk elements for the plugin preferences */ |
676 pref = purple_plugin_pref_new_with_label( | 760 pref = purple_plugin_pref_new_with_label( |
677 "Pidgin-Audacious Configuration"); | 761 "Pidgin-Audacious Configuration"); |
678 purple_plugin_pref_frame_add(frame, pref); | 762 purple_plugin_pref_frame_add(frame, pref); |
679 | 763 |
764 /* player to connect */ | |
765 pref = purple_plugin_pref_new_with_name_and_label( | |
766 OPT_PLAYER, | |
767 "Player to connect"); | |
768 purple_plugin_pref_frame_add(frame, pref); | |
769 | |
680 pref = purple_plugin_pref_new_with_name_and_label( | 770 pref = purple_plugin_pref_new_with_name_and_label( |
681 OPT_PROCESS_STATUS, | 771 OPT_PROCESS_STATUS, |
682 "Expand " SONG_TOKEN " to song info in the status message"); | 772 "Expand " SONG_TOKEN " to song info in the status message"); |
683 purple_plugin_pref_frame_add(frame, pref); | 773 purple_plugin_pref_frame_add(frame, pref); |
684 | 774 |
688 purple_plugin_pref_frame_add(frame, pref); | 778 purple_plugin_pref_frame_add(frame, pref); |
689 | 779 |
690 /* song template */ | 780 /* song template */ |
691 pref = purple_plugin_pref_new_with_name_and_label( | 781 pref = purple_plugin_pref_new_with_name_and_label( |
692 OPT_SONG_TEMPLATE, | 782 OPT_SONG_TEMPLATE, |
693 "Song template"); | 783 "%song compiled with"); |
694 purple_plugin_pref_frame_add(frame, pref); | 784 purple_plugin_pref_frame_add(frame, pref); |
695 | 785 |
696 /* paste template */ | 786 /* paste template */ |
697 pref = purple_plugin_pref_new_with_name_and_label( | 787 pref = purple_plugin_pref_new_with_name_and_label( |
698 OPT_PASTE_TEMPLATE, | 788 OPT_PASTE_TEMPLATE, |
699 "Paste template"); | 789 "/song command template"); |
700 purple_plugin_pref_frame_add(frame, pref); | 790 purple_plugin_pref_frame_add(frame, pref); |
701 | 791 |
702 return frame; | 792 return frame; |
703 } | 793 } |
704 | 794 |
742 | 832 |
743 /* add plugin preferences */ | 833 /* add plugin preferences */ |
744 purple_prefs_add_none(OPT_PIDGINAUD); | 834 purple_prefs_add_none(OPT_PIDGINAUD); |
745 purple_prefs_add_bool(OPT_PROCESS_STATUS, TRUE); | 835 purple_prefs_add_bool(OPT_PROCESS_STATUS, TRUE); |
746 purple_prefs_add_bool(OPT_PROCESS_USERINFO, TRUE); | 836 purple_prefs_add_bool(OPT_PROCESS_USERINFO, TRUE); |
837 purple_prefs_add_string(OPT_PLAYER, DEFAULT_PLAYER); | |
747 purple_prefs_add_string(OPT_SONG_TEMPLATE, DEFAULT_SONG_TEMPLATE); | 838 purple_prefs_add_string(OPT_SONG_TEMPLATE, DEFAULT_SONG_TEMPLATE); |
748 purple_prefs_add_string(OPT_PASTE_TEMPLATE, SONG_TOKEN); | 839 purple_prefs_add_string(OPT_PASTE_TEMPLATE, SONG_TOKEN); |
749 purple_prefs_add_bool(OPT_LOG_OUTPUT, TRUE); | 840 purple_prefs_add_bool(OPT_LOG_OUTPUT, TRUE); |
750 | 841 |
751 } | 842 } |