URI:
       mpd.c - spoon - set dwm status
  HTML git clone git://git.codemadness.org/spoon
   DIR Log
   DIR Files
   DIR Refs
   DIR LICENSE
       ---
       mpd.c (1662B)
       ---
            1 #include <err.h>
            2 #include <stdio.h>
            3 
            4 #include <mpd/client.h>
            5 
            6 #include "types.h"
            7 #include "util.h"
            8 
            9 char *anim[] = {
           10         "!!.|.",
           11         "|!.!.",
           12         "!.!!.",
           13         "!!|.!",
           14         ".!!|!",
           15 };
           16 
           17 int
           18 mpdread(void *arg, char *buf, size_t len)
           19 {
           20         static struct mpd_connection *conn;
           21         struct mpd_status *status;
           22         enum mpd_state state;
           23         struct mpd_song *song;
           24         const char *artist, *title;
           25         struct mpdarg *mpdarg = arg;
           26         static int frame = 0;
           27 
           28 #define CHECK_CONNECTION(conn) \
           29         if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS) { \
           30                 warnx("mpd_connection_get_error: %s", \
           31                       mpd_connection_get_error_message(conn)); \
           32                 goto out; \
           33         }
           34 
           35         if (conn == NULL) {
           36                 conn = mpd_connection_new(mpdarg->host, mpdarg->port, 0);
           37                 if (conn == NULL)
           38                         return -1;
           39                 CHECK_CONNECTION(conn);
           40         }
           41         mpd_send_status(conn);
           42         status = mpd_recv_status(conn);
           43         if (status == NULL) {
           44                 CHECK_CONNECTION(conn);
           45                 mpd_response_finish(conn);
           46                 return -1;
           47         }
           48         state = mpd_status_get_state(status);
           49         mpd_status_free(status);
           50         mpd_response_finish(conn);
           51         if (state != MPD_STATE_PLAY && state != MPD_STATE_PAUSE)
           52                 return -1;
           53         mpd_send_current_song(conn);
           54         song = mpd_recv_song(conn);
           55         if (song == NULL) {
           56                 CHECK_CONNECTION(conn);
           57                 mpd_response_finish(conn);
           58                 return -1;
           59         }
           60         artist = mpd_song_get_tag(song, MPD_TAG_ARTIST, 0);
           61         title = mpd_song_get_tag(song, MPD_TAG_TITLE, 0);
           62         if (artist != NULL && title != NULL) {
           63                 snprintf(buf, len, "%s - %s", artist, title);
           64         } else if (title != NULL) {
           65                 strlcpy(buf, title, len);
           66         } else {
           67                 strlcpy(buf, anim[frame++ % LEN(anim)], len);
           68         }
           69         mpd_song_free(song);
           70         mpd_response_finish(conn);
           71         return 0;
           72 out:
           73         mpd_connection_free(conn);
           74         conn = NULL;
           75         return -1;
           76 }