Initial revision
[monky] / mpd.c
1 #include "conky.h"
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include "libmpdclient.h"
6
7
8 void update_mpd()
9 {
10         struct information *current_info = &info;
11         current_info->conn =
12             mpd_newConnection(current_info->mpd.host,
13                               current_info->mpd.port, 10);
14         if (current_info->conn->error) {
15                 //fprintf(stderr, "%s\n", current_info->conn->errorStr);
16                 mpd_closeConnection(current_info->conn);
17                 return;
18         }
19
20         mpd_Status * status;
21         mpd_InfoEntity *entity;
22         mpd_sendCommandListOkBegin(current_info->conn);
23         mpd_sendStatusCommand(current_info->conn);
24         mpd_sendCurrentSongCommand(current_info->conn);
25         mpd_sendCommandListEnd(current_info->conn);
26         if ((status = mpd_getStatus(current_info->conn)) == NULL) {
27                 //fprintf(stderr, "%s\n", current_info->conn->errorStr);
28                 mpd_closeConnection(current_info->conn);
29                 return;
30         }
31         current_info->mpd.volume = status->volume;
32         //if (status->error)
33                 //printf("error: %s\n", status->error);
34
35         if(status->state == MPD_STATUS_STATE_PLAY)
36         {
37                 current_info->mpd.status = "Playing";
38         }
39         if(status->state == MPD_STATUS_STATE_STOP)
40         {
41                 current_info->mpd.status = "Stopped";
42         }
43         if(status->state == MPD_STATUS_STATE_PAUSE)
44         {
45                 current_info->mpd.status = "Paused";
46         }
47         if(status->state == MPD_STATUS_STATE_UNKNOWN)
48         {
49                 current_info->mpd.status = "Unknown";
50         }
51         if(status->state == MPD_STATUS_STATE_PLAY || 
52                   status->state == MPD_STATUS_STATE_PAUSE) {
53                 current_info->mpd.bitrate = status->bitRate;
54                 current_info->mpd.progress = (float)status->elapsedTime/status->totalTime;
55                   }
56
57
58         if (current_info->conn->error) {
59                 //fprintf(stderr, "%s\n", current_info->conn->errorStr);
60                 mpd_closeConnection(current_info->conn);
61                 return;
62         }
63
64         mpd_nextListOkCommand(current_info->conn);
65
66         while ((entity = mpd_getNextInfoEntity(current_info->conn))) {
67                 mpd_Song * song = entity->info.song;
68                 if (entity->type != MPD_INFO_ENTITY_TYPE_SONG) {
69                         mpd_freeInfoEntity(entity);
70                         continue;
71                 }
72
73                 if(current_info->mpd.artist == NULL)
74                         current_info->mpd.artist = malloc(TEXT_BUFFER_SIZE);
75                 if(current_info->mpd.album == NULL)
76                         current_info->mpd.album = malloc(TEXT_BUFFER_SIZE);
77                 if(current_info->mpd.title == NULL)
78                         current_info->mpd.title = malloc(TEXT_BUFFER_SIZE);
79                 if (song->artist) {
80                         strcpy(current_info->mpd.artist, song->artist);
81                 }
82                 else {
83                         strcpy(current_info->mpd.artist, "Unknown");
84                 }
85                 if (song->album) {
86                         strcpy(current_info->mpd.album, song->album);
87                 }
88                 else {
89                         strcpy(current_info->mpd.album, "Unknown");
90                 }
91                 if (song->title) {
92                         strcpy(current_info->mpd.title, song->title);
93                 }
94                 else {
95                         strcpy(current_info->mpd.title, "Unknown");
96                 }
97                 if (entity != NULL) {
98                         mpd_freeInfoEntity(entity);
99                 }
100         }
101         if (entity != NULL) {
102                 mpd_freeInfoEntity(entity);
103         }
104                 
105         if (current_info->conn->error) {
106                 //fprintf(stderr, "%s\n", current_info->conn->errorStr);
107                 mpd_closeConnection(current_info->conn);
108                 return;
109         }
110
111         mpd_finishCommand(current_info->conn);
112         if (current_info->conn->error) {
113                 //fprintf(stderr, "%s\n", current_info->conn->errorStr);
114                 mpd_closeConnection(current_info->conn);
115                 return;
116         }
117         mpd_freeStatus(status);
118         mpd_closeConnection(current_info->conn);
119 }