static int rmtag_song(struct mpdcron_connection *conn, const char *tag, const char *expr) { int changes; if (expr != NULL) { if (!mpdcron_rmtag_expr(conn, expr, tag, &changes)) { eulog(LOG_ERR, "Failed to remove tag from song: %s", conn->error->message); return 1; } } else { char *esc_uri, *myexpr; struct mpd_song *song; if ((song = load_current_song()) == NULL) return 1; esc_uri = quote(mpd_song_get_uri(song)); myexpr = g_strdup_printf("uri=%s", esc_uri); g_free(esc_uri); mpd_song_free(song); if (!mpdcron_rmtag_expr(conn, myexpr, tag, &changes)) { eulog(LOG_ERR, "Failed to remove tag from current playing song: %s", conn->error->message); g_free(myexpr); return 1; } g_free(myexpr); } printf("Modified %d entries\n", changes); return 0; }
static int cmd_love_internal(bool love, const char *expr, bool artist, bool album, bool genre) { int port, ret; const char *hostname, *password; struct mpdcron_connection *conn; if ((artist && album && genre) || (artist && album) || (artist && genre) || (album && genre)) { g_printerr("--artist, --album and --genre options are mutually exclusive\n"); return 1; } hostname = g_getenv(ENV_MPDCRON_HOST) ? g_getenv(ENV_MPDCRON_HOST) : DEFAULT_HOSTNAME; port = g_getenv(ENV_MPDCRON_PORT) ? atoi(g_getenv(ENV_MPDCRON_PORT)) : DEFAULT_PORT; password = g_getenv(ENV_MPDCRON_PASSWORD); conn = mpdcron_connection_new(hostname, port); if (conn->error != NULL) { eulog(LOG_ERR, "Failed to connect: %s", conn->error->message); mpdcron_connection_free(conn); return 1; } if (password != NULL) { if (!mpdcron_password(conn, password)) { eulog(LOG_ERR, "Authentication failed: %s", conn->error->message); mpdcron_connection_free(conn); return 1; } } if (artist) ret = love_artist(conn, love, expr); else if (album) ret = love_album(conn, love, expr); else if (genre) ret = love_genre(conn, love, expr); else ret = love_song(conn, love, expr); mpdcron_connection_free(conn); return ret; }
static int rmtag_album(struct mpdcron_connection *conn, const char *tag, const char *expr) { int changes; if (expr != NULL) { if (!mpdcron_rmtag_album_expr(conn, expr, tag, &changes)) { eulog(LOG_ERR, "Failed to remove tag from album: %s", conn->error->message); return 1; } } else { char *esc_album, *esc_artist, *myexpr; struct mpd_song *song; if ((song = load_current_song()) == NULL) return 1; else if (mpd_song_get_tag(song, MPD_TAG_ARTIST, 0) == NULL) { eulog(LOG_ERR, "Current playing song has no artist tag!"); mpd_song_free(song); return 1; } else if (mpd_song_get_tag(song, MPD_TAG_ALBUM, 0) == NULL) { eulog(LOG_ERR, "Current playing song has no album tag!"); mpd_song_free(song); return 1; } esc_album = quote(mpd_song_get_tag(song, MPD_TAG_ALBUM, 0)); esc_artist = quote(mpd_song_get_tag(song, MPD_TAG_ARTIST, 0)); myexpr = g_strdup_printf("name=%s and artist=%s", esc_album, esc_artist); g_free(esc_album); g_free(esc_artist); mpd_song_free(song); if (!mpdcron_rmtag_album_expr(conn, myexpr, tag, &changes)) { eulog(LOG_ERR, "Failed to remove tag from current playing album: %s", conn->error->message); g_free(myexpr); return 1; } g_free(myexpr); } printf("Modified %d entries\n", changes); return 0; }
static int love_album(struct mpdcron_connection *conn, bool love, const char *expr) { int changes; char *esc_album, *myexpr; struct mpd_song *song; if (expr != NULL) { if (!mpdcron_love_album_expr(conn, love, expr, &changes)) { eulog(LOG_ERR, "Failed to %s album: %s", love ? "love" : "hate", conn->error->message); return 1; } } else { if ((song = load_current_song()) == NULL) return 1; else if (mpd_song_get_tag(song, MPD_TAG_ALBUM, 0) == NULL) { eulog(LOG_ERR, "Current playing song has no album tag!"); mpd_song_free(song); return 1; } esc_album = quote(mpd_song_get_tag(song, MPD_TAG_ALBUM, 0)); myexpr = g_strdup_printf("name=%s", esc_album); g_free(esc_album); mpd_song_free(song); if (!mpdcron_love_album_expr(conn, love, myexpr, &changes)) { eulog(LOG_ERR, "Failed to %s current playing album: %s", love ? "love" : "hate", conn->error->message); g_free(myexpr); return 1; } g_free(myexpr); } printf("Modified %d entries\n", changes); return 0; }
static int rmtag_genre(struct mpdcron_connection *conn, const char *tag, const char *expr) { int changes; if (expr != NULL) { if (!mpdcron_rmtag_genre_expr(conn, expr, tag, &changes)) { eulog(LOG_ERR, "Failed to remove tag from genre: %s", conn->error->message); return 1; } } else { char *esc_genre, *myexpr; struct mpd_song *song; if ((song = load_current_song()) == NULL) return 1; else if (mpd_song_get_tag(song, MPD_TAG_GENRE, 0) == NULL) { eulog(LOG_ERR, "Current playing song has no genre tag!"); mpd_song_free(song); return 1; } esc_genre = quote(mpd_song_get_tag(song, MPD_TAG_GENRE, 0)); myexpr = g_strdup_printf("name=%s", esc_genre); g_free(esc_genre); mpd_song_free(song); if (!mpdcron_rmtag_genre_expr(conn, myexpr, tag, &changes)) { eulog(LOG_ERR, "Failed to remove tag from current playing genre: %s", conn->error->message); g_free(myexpr); return 1; } g_free(myexpr); } printf("Modified %d entries\n", changes); return 0; }
static int count_artist(struct mpdcron_connection *conn, const char *expr, const char *count) { int changes; char *esc_artist, *myexpr; struct mpd_song *song; if (expr != NULL) { if (!mpdcron_count_artist_expr(conn, expr, count, &changes)) { eulog(LOG_ERR, "Failed to change play count of artist: %s", conn->error->message); return 1; } } else { if ((song = load_current_song()) == NULL) return 1; else if (mpd_song_get_tag(song, MPD_TAG_ARTIST, 0) == NULL) { eulog(LOG_ERR, "Current playing song has no artist tag!"); mpd_song_free(song); return 1; } esc_artist = quote(mpd_song_get_tag(song, MPD_TAG_ARTIST, 0)); myexpr = g_strdup_printf("name=%s", esc_artist); g_free(esc_artist); mpd_song_free(song); if (!mpdcron_count_artist_expr(conn, myexpr, count, &changes)) { eulog(LOG_ERR, "Failed to change play count of current playing artist: %s", conn->error->message); g_free(myexpr); return 1; } g_free(myexpr); } printf("Modified %d entries\n", changes); return 0; }
static int love_song(struct mpdcron_connection *conn, bool love, const char *expr) { int changes; char *esc_uri, *myexpr; struct mpd_song *song; if (expr != NULL) { if (!mpdcron_love_expr(conn, love, expr, &changes)) { eulog(LOG_ERR, "Failed to %s song: %s", love ? "love" : "hate", conn->error->message); return 1; } } else { if ((song = load_current_song()) == NULL) return 1; esc_uri = quote(mpd_song_get_uri(song)); myexpr = g_strdup_printf("uri=%s", esc_uri); g_free(esc_uri); mpd_song_free(song); if (!mpdcron_love_expr(conn, love, myexpr, &changes)) { eulog(LOG_ERR, "Failed to %s current playing song: %s", love ? "love" : "hate", conn->error->message); g_free(myexpr); return 1; } g_free(myexpr); } printf("Modified %d entries\n", changes); return 0; }