summaryrefslogtreecommitdiff
path: root/patch/mpdcontrol.c
diff options
context:
space:
mode:
authorBear <bear@bengtsson.win>2021-12-27 09:29:58 +0000
committerBear <bear@bengtsson.win>2021-12-27 09:29:58 +0000
commit69262b01ced79c2d776fab9b889926d1816a1e7a (patch)
treef304cd6fa8734e83a7772d07dc9b484781565155 /patch/mpdcontrol.c
Added DWM
Diffstat (limited to 'patch/mpdcontrol.c')
-rw-r--r--patch/mpdcontrol.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/patch/mpdcontrol.c b/patch/mpdcontrol.c
new file mode 100644
index 0000000..fc81e07
--- /dev/null
+++ b/patch/mpdcontrol.c
@@ -0,0 +1,145 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <regex.h>
+
+#include <mpd/client.h>
+
+#define MPDHOST "localhost"
+#define MPDPORT 6600
+
+struct mpd_connection *get_conn()
+{
+ struct mpd_connection *conn;
+
+ conn = mpd_connection_new(MPDHOST, MPDPORT, 1000);
+
+ if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS) {
+ fprintf(stderr, "Could not connect to mpd: %s\n", mpd_connection_get_error_message(conn));
+
+ mpd_connection_free(conn);
+ return NULL;
+ }
+
+ return conn;
+}
+
+void mpdchange(const Arg *direction)
+{
+ struct mpd_connection *conn;
+
+ conn = get_conn();
+
+ if (conn == NULL) {
+ return;
+ }
+
+ if (direction->i > 0) {
+ mpd_run_next(conn);
+ }
+ else {
+ mpd_run_previous(conn);
+ }
+
+ mpd_connection_free(conn);
+}
+
+char *get_regerror(int errcode, regex_t *compiled)
+{
+ size_t length = regerror(errcode, compiled, NULL, 0);
+ char *buffer = malloc(length);
+ (void) regerror(errcode, compiled, buffer, length);
+
+ return buffer;
+}
+
+void mpdcontrol()
+{
+ struct mpd_connection *conn;
+ struct mpd_status *status;
+ struct mpd_song *song;
+ enum mpd_state state;
+
+ const char *filename;
+
+ regex_t expr;
+
+ conn = get_conn();
+
+ if (conn == NULL) {
+ return;
+ }
+
+ status = mpd_run_status(conn);
+
+ if (status == NULL) {
+ fprintf(stderr, "Could not get mpd status: %s\n", mpd_status_get_error(status));
+
+ mpd_status_free(status);
+ mpd_connection_free(conn);
+ return;
+ }
+
+ state = mpd_status_get_state(status);
+
+ if (state == MPD_STATE_STOP || state == MPD_STATE_PAUSE) {
+ mpd_run_play(conn);
+ mpd_status_free(status);
+ mpd_connection_free(conn);
+ }
+ else if (state != MPD_STATE_UNKNOWN) { //playing some music
+ song = mpd_run_current_song(conn);
+
+ if (song == NULL){
+ fprintf(stderr, "Error fetching current song!\n");
+
+ mpd_song_free(song);
+ mpd_status_free(status);
+ mpd_connection_free(conn);
+ return;
+ }
+
+ filename = mpd_song_get_uri(song);
+
+ int errcode = regcomp(&expr, "^[[:alnum:]]+://", REG_EXTENDED|REG_NOSUB);
+ if (errcode != 0) {
+ char *err = get_regerror(errcode, &expr);
+ fprintf(stderr, "Could not compile regexp: %s\n", err);
+
+ mpd_song_free(song);
+ mpd_status_free(status);
+ mpd_connection_free(conn);
+ free(err);
+ regfree(&expr);
+ return;
+ }
+
+ int matchcode = regexec(&expr, filename, 0, NULL, 0);
+
+ if (matchcode == 0) {
+ if (strstr(filename, "file://") == filename) { //match just at the start of the filename
+ //this means that mpd is playing a file outside the music_dir,
+ //but on disk, so we can safely pause
+ mpd_run_toggle_pause(conn);
+ }
+ else {
+ mpd_run_stop(conn);
+ }
+ }
+ else if (matchcode == REG_NOMATCH) {
+ mpd_run_toggle_pause(conn);
+ }
+ else {
+ char *err = get_regerror(matchcode, &expr);
+ fprintf(stderr, "Error while matching regexp: %s\n", err);
+
+ free(err);
+ }
+
+ regfree(&expr);
+ mpd_song_free(song);
+ mpd_status_free(status);
+ mpd_connection_free(conn);
+ }
+}
+