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 }