diff --git a/src/mpdclient.c b/src/mpdclient.c
index 6d9d72b9c206789e6694400783397f8b13553ba1..df636a566caea042d455aa648d673d8293c24c6c 100644 (file)
--- a/src/mpdclient.c
+++ b/src/mpdclient.c
-/*
- * $Id$
- *
+/*
* (c) 2004 by Kalle Wallin <kaw@linux.se>
*
* This program is free software; you can redistribute it and/or modify
#include "mpdclient.h"
#include "screen_utils.h"
#include "config.h"
-#include "ncmpc.h"
-#include "support.h"
+#include "charset.h"
#include "options.h"
#include "strfsong.h"
#define ENABLE_FANCY_PLAYLIST_MANAGMENT_CMD_DELETE
#define ENABLE_FANCY_PLAYLIST_MANAGMENT_CMD_MOVE
#define ENABLE_SONG_ID
-#define ENABLE_PLCHANGES
+#define ENABLE_PLCHANGES
#define BUFSIZE 1024
if (e1 && e2 &&
e1->type == MPD_INFO_ENTITY_TYPE_SONG &&
e2->type == MPD_INFO_ENTITY_TYPE_SONG) {
- strfsong(key1, BUFSIZE, LIST_FORMAT, e1->info.song);
- strfsong(key2, BUFSIZE, LIST_FORMAT, e2->info.song);
+ strfsong(key1, BUFSIZE, options.list_format, e1->info.song);
+ strfsong(key2, BUFSIZE, options.list_format, e2->info.song);
n = strcmp(key1,key2);
}
static gint
error_cb(mpdclient_t *c, gint error, gchar *msg)
{
- GList *list = c->error_callbacks;
-
- if( list==NULL )
- fprintf(stderr, "error [%d]: %s\n", (error & 0xFF), msg);
+ GList *list = c->error_callbacks;
- while(list)
- {
- mpdc_error_cb_t cb = list->data;
- if( cb )
- cb(c, error, msg);
- list=list->next;
- }
- mpd_clearError(c->connection);
- return error;
-}
+ if (list == NULL)
+ fprintf(stderr, "error [%d]: %s\n", (error & 0xFF), msg);
-#ifndef NDEBUG
-// Unused ath the moment
-/*
-#include "strfsong.h"
-
-static gchar *
-get_song_name(mpd_Song *song)
-{
- static gchar name[256];
+ while (list) {
+ mpdc_error_cb_t cb = list->data;
+ if (cb)
+ cb(c, error, msg);
+ list = list->next;
+ }
- strfsong(name, 256, "[%artist% - ]%title%|%file%", song);
- return name;
+ mpd_clearError(c->connection);
+ return error;
}
-*/
-#endif
+
/****************************************************************************/
/*** mpdclient functions ****************************************************/
/****************************************************************************/
gint
-mpdclient_finish_command(mpdclient_t *c)
+mpdclient_finish_command(mpdclient_t *c)
{
- mpd_finishCommand(c->connection);
+ mpd_finishCommand(c->connection);
+
+ if (c->connection->error) {
+ gint error = c->connection->error;
+ gchar *msg;
+
+ if (error == MPD_ERROR_ACK &&
+ c->connection->errorCode == MPD_ACK_ERROR_PERMISSION &&
+ screen_auth(c) == 0)
+ return 0;
- if( c->connection->error )
- {
- gchar *msg = locale_to_utf8(c->connection->errorStr);
- gint error = c->connection->error;
- if( error == MPD_ERROR_ACK )
- error = error | (c->connection->errorCode << 8);
- if( c->connection->errorCode == MPD_ACK_ERROR_PERMISSION )
- {
- if(screen_auth(c) == 0) return 0;
+ if (error == MPD_ERROR_ACK)
+ error = error | (c->connection->errorCode << 8);
+
+ msg = locale_to_utf8(c->connection->errorStr);
+ error_cb(c, error, msg);
+ g_free(msg);
+ return error;
}
- error_cb(c, error, msg);
- g_free(msg);
- return error;
- }
- return 0;
+ return 0;
}
mpdclient_t *
c->status = mpd_getStatus(c->connection);
if ((retval=mpdclient_finish_command(c)))
return retval;
-#ifndef NDEBUG
- if (c->status->error)
- D("status> %s\n", c->status->error);
-#endif
/* check if the playlist needs an update */
if (c->playlist.id != c->status->playlist) {
#ifdef ENABLE_SONG_ID
struct mpd_song *song = playlist_get_song(c, idx);
- D("Play id:%d\n", song ? song->id : -1);
if (song)
mpd_sendPlayIdCommand(c->connection, song->id);
else
if (length <= 0) {
mpd_freeStatus(status);
- screen_status_message("You have to have a playlist longer than 1 song in length to crop");
} else if (status->state == 3 || status->state == 2) {
/* If playing or paused */
mpd_freeStatus(status);
} else {
mpd_freeStatus(status);
- screen_status_message("You need to be playing to crop the playlist\n");
}
return mpdclient_finish_command(c);
return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_seek(mpdclient_t *c, gint id, gint pos)
{
- D("Seek id:%d\n", id);
- mpd_sendSeekIdCommand(c->connection, id, pos);
- return mpdclient_finish_command(c);
+ mpd_sendSeekIdCommand(c->connection, id, pos);
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_shuffle(mpdclient_t *c)
{
- mpd_sendShuffleCommand(c->connection);
- c->need_update = TRUE;
- return mpdclient_finish_command(c);
+ mpd_sendShuffleCommand(c->connection);
+ c->need_update = TRUE;
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_clear(mpdclient_t *c)
{
- gint retval = 0;
+ gint retval = 0;
- mpd_sendClearCommand(c->connection);
- retval = mpdclient_finish_command(c);
- /* call playlist updated callback */
- mpdclient_playlist_callback(c, PLAYLIST_EVENT_CLEAR, NULL);
- c->need_update = TRUE;
- return retval;
+ mpd_sendClearCommand(c->connection);
+ retval = mpdclient_finish_command(c);
+ /* call playlist updated callback */
+ mpdclient_playlist_callback(c, PLAYLIST_EVENT_CLEAR, NULL);
+ c->need_update = TRUE;
+ return retval;
}
-gint
+gint
mpdclient_cmd_repeat(mpdclient_t *c, gint value)
{
- mpd_sendRepeatCommand(c->connection, value);
- return mpdclient_finish_command(c);
+ mpd_sendRepeatCommand(c->connection, value);
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_random(mpdclient_t *c, gint value)
{
- mpd_sendRandomCommand(c->connection, value);
- return mpdclient_finish_command(c);
+ mpd_sendRandomCommand(c->connection, value);
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_crossfade(mpdclient_t *c, gint value)
{
- mpd_sendCrossfadeCommand(c->connection, value);
- return mpdclient_finish_command(c);
+ mpd_sendCrossfadeCommand(c->connection, value);
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_db_update_utf8(mpdclient_t *c, gchar *path)
{
- mpd_sendUpdateCommand(c->connection, path ? path : "");
- return mpdclient_finish_command(c);
+ mpd_sendUpdateCommand(c->connection, path ? path : "");
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_volume(mpdclient_t *c, gint value)
{
- mpd_sendSetvolCommand(c->connection, value);
- return mpdclient_finish_command(c);
+ mpd_sendSetvolCommand(c->connection, value);
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_add_path_utf8(mpdclient_t *c, gchar *path_utf8)
{
- mpd_sendAddCommand(c->connection, path_utf8);
- return mpdclient_finish_command(c);
+ mpd_sendAddCommand(c->connection, path_utf8);
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_add_path(mpdclient_t *c, gchar *path)
{
- gint retval;
- gchar *path_utf8 = locale_to_utf8(path);
+ gint retval;
+ gchar *path_utf8 = locale_to_utf8(path);
- retval=mpdclient_cmd_add_path_utf8(c, path_utf8);
- g_free(path_utf8);
- return retval;
+ retval=mpdclient_cmd_add_path_utf8(c, path_utf8);
+ g_free(path_utf8);
+ return retval;
}
gint
/* send the delete command to mpd */
#ifdef ENABLE_SONG_ID
- D("Delete id:%d\n", song->id);
mpd_sendDeleteIdCommand(c->connection, song->id);
#else
mpd_sendDeleteCommand(c->connection, idx);
/* send the move command to mpd */
#ifdef ENABLE_SONG_ID
- D("Swapping id:%d with id:%d\n", song1->id, song2->id);
mpd_sendSwapIdCommand(c->connection, song1->id, song2->id);
#else
- D("Moving index %d to id:%d\n", old_index, new_index);
mpd_sendMoveCommand(c->connection, old_index, new_index);
#endif
if( (n=mpdclient_finish_command(c)) )
#endif
/* call playlist updated callback */
- D("move> new_index=%d, old_index=%d\n", new_index, old_index);
mpdclient_playlist_callback(c, PLAYLIST_EVENT_MOVE, (gpointer) &new_index);
return 0;
}
-gint
+gint
mpdclient_cmd_save_playlist_utf8(mpdclient_t *c, gchar *filename_utf8)
{
- gint retval = 0;
+ gint retval = 0;
- mpd_sendSaveCommand(c->connection, filename_utf8);
- if( (retval=mpdclient_finish_command(c)) == 0 )
- mpdclient_browse_callback(c, BROWSE_PLAYLIST_SAVED, NULL);
- return retval;
+ mpd_sendSaveCommand(c->connection, filename_utf8);
+ if ((retval = mpdclient_finish_command(c)) == 0)
+ mpdclient_browse_callback(c, BROWSE_PLAYLIST_SAVED, NULL);
+ return retval;
}
-gint
+gint
mpdclient_cmd_save_playlist(mpdclient_t *c, gchar *filename)
{
- gint retval = 0;
- gchar *filename_utf8 = locale_to_utf8(filename);
-
- retval = mpdclient_cmd_save_playlist_utf8(c, filename);
- g_free(filename_utf8);
- return retval;
+ gint retval = 0;
+ gchar *filename_utf8 = locale_to_utf8(filename);
+
+ retval = mpdclient_cmd_save_playlist_utf8(c, filename);
+ g_free(filename_utf8);
+ return retval;
}
-gint
+gint
mpdclient_cmd_load_playlist_utf8(mpdclient_t *c, gchar *filename_utf8)
{
- mpd_sendLoadCommand(c->connection, filename_utf8);
- c->need_update = TRUE;
- return mpdclient_finish_command(c);
+ mpd_sendLoadCommand(c->connection, filename_utf8);
+ c->need_update = TRUE;
+ return mpdclient_finish_command(c);
}
-gint
+gint
mpdclient_cmd_delete_playlist_utf8(mpdclient_t *c, gchar *filename_utf8)
{
- gint retval = 0;
+ gint retval = 0;
- mpd_sendRmCommand(c->connection, filename_utf8);
- if( (retval=mpdclient_finish_command(c)) == 0 )
- mpdclient_browse_callback(c, BROWSE_PLAYLIST_DELETED, NULL);
- return retval;
+ mpd_sendRmCommand(c->connection, filename_utf8);
+ if ((retval = mpdclient_finish_command(c)) == 0)
+ mpdclient_browse_callback(c, BROWSE_PLAYLIST_DELETED, NULL);
+ return retval;
}
-gint
+gint
mpdclient_cmd_delete_playlist(mpdclient_t *c, gchar *filename)
{
- gint retval = 0;
- gchar *filename_utf8 = locale_to_utf8(filename);
+ gint retval = 0;
+ gchar *filename_utf8 = locale_to_utf8(filename);
- retval = mpdclient_cmd_delete_playlist_utf8(c, filename_utf8);
- g_free(filename_utf8);
- return retval;
+ retval = mpdclient_cmd_delete_playlist_utf8(c, filename_utf8);
+ g_free(filename_utf8);
+ return retval;
}
/****************************************************************************/
/*** Callback managment functions *******************************************/
/****************************************************************************/
+
static void
do_list_callbacks(mpdclient_t *c, GList *list, gint event, gpointer data)
{
- while(list)
- {
- mpdc_list_cb_t fn = list->data;
+ while (list) {
+ mpdc_list_cb_t fn = list->data;
- fn(c, event, data);
- list=list->next;
- }
+ fn(c, event, data);
+ list = list->next;
+ }
}
void
mpdclient_playlist_callback(mpdclient_t *c, int event, gpointer data)
{
- do_list_callbacks(c, c->playlist_callbacks, event, data);
+ do_list_callbacks(c, c->playlist_callbacks, event, data);
}
void
mpdclient_install_playlist_callback(mpdclient_t *c,mpdc_list_cb_t cb)
{
- c->playlist_callbacks = g_list_append(c->playlist_callbacks, cb);
+ c->playlist_callbacks = g_list_append(c->playlist_callbacks, cb);
}
void
mpdclient_remove_playlist_callback(mpdclient_t *c, mpdc_list_cb_t cb)
{
- c->playlist_callbacks = g_list_remove(c->playlist_callbacks, cb);
+ c->playlist_callbacks = g_list_remove(c->playlist_callbacks, cb);
}
void
mpdclient_browse_callback(mpdclient_t *c, int event, gpointer data)
{
- do_list_callbacks(c, c->browse_callbacks, event, data);
+ do_list_callbacks(c, c->browse_callbacks, event, data);
}
void
mpdclient_install_browse_callback(mpdclient_t *c,mpdc_list_cb_t cb)
{
- c->browse_callbacks = g_list_append(c->browse_callbacks, cb);
+ c->browse_callbacks = g_list_append(c->browse_callbacks, cb);
}
void
mpdclient_remove_browse_callback(mpdclient_t *c, mpdc_list_cb_t cb)
{
- c->browse_callbacks = g_list_remove(c->browse_callbacks, cb);
+ c->browse_callbacks = g_list_remove(c->browse_callbacks, cb);
}
void
mpdclient_install_error_callback(mpdclient_t *c, mpdc_error_cb_t cb)
{
- c->error_callbacks = g_list_append(c->error_callbacks, cb);
+ c->error_callbacks = g_list_append(c->error_callbacks, cb);
}
void
mpdclient_remove_error_callback(mpdclient_t *c, mpdc_error_cb_t cb)
{
- c->error_callbacks = g_list_remove(c->error_callbacks, cb);
+ c->error_callbacks = g_list_remove(c->error_callbacks, cb);
}
+
/****************************************************************************/
/*** Playlist managment functions *******************************************/
/****************************************************************************/
-
/* update playlist */
gint
mpdclient_playlist_update(mpdclient_t *c)
{
mpd_InfoEntity *entity;
- D("mpdclient_playlist_update() [%lld]\n", c->status->playlist);
-
if (MPD_ERROR(c))
return -1;
{
mpd_InfoEntity *entity;
- D("mpdclient_playlist_update_changes() [%lld -> %lld]\n",
- c->status->playlist, c->playlist.id);
-
if (MPD_ERROR(c))
return -1;
if (song->pos >= 0 && (guint)song->pos < c->playlist.list->len) {
/* update song */
- D("updating pos:%d, id=%d - %s\n",
- song->pos, song->id, song->file);
playlist_replace(&c->playlist, song->pos, song);
} else {
/* add a new song */
- D("adding song at pos %d\n", song->pos);
playlist_append(&c->playlist, song);
}
guint pos = c->playlist.list->len - 1;
/* Remove the last playlist entry */
- D("removing song at pos %d\n", pos);
playlist_remove(&c->playlist, pos);
}
gchar *path_utf8 = locale_to_utf8(path);
gboolean has_dirs_only = TRUE;
- D("mpdclient_filelist_get(%s)\n", path);
mpd_sendLsInfoCommand(c->connection, path_utf8);
filelist = filelist_new(path);
if (path && path[0] && strcmp(path, "/"))
mpdclient_finish_command(c);
g_free(path_utf8);
- filelist->updated = TRUE;
// If there are only directory entities in the filelist, we sort it
- if (has_dirs_only) {
- D("mpdclient_filelist_get: only dirs; sorting!\n");
+ if (has_dirs_only)
filelist_sort(filelist, compare_filelistentry_dir);
- }
return filelist;
}
mpdclient_filelist_t *filelist;
mpd_InfoEntity *entity;
- D("mpdclient_filelist_search(%s)\n", filter_utf8);
if (exact_match)
mpd_sendFindCommand(c->connection, table, filter_utf8);
else
return NULL;
}
- filelist->updated = TRUE;
return filelist;
}
mpdclient_filelist_t *filelist;
gchar *filter_utf8 = locale_to_utf8(_filter);
- D("mpdclient_filelist_search(%s)\n", _filter);
filelist = mpdclient_filelist_search_utf8(c, exact_match, table,
filter_utf8);
g_free(filter_utf8);
mpdclient_filelist_t *
mpdclient_filelist_update(mpdclient_t *c, mpdclient_filelist_t *filelist)
{
- if( filelist != NULL )
- {
- gchar *path = g_strdup(filelist->path);
+ if (filelist != NULL) {
+ gchar *path = g_strdup(filelist->path);
- filelist_free(filelist);
- filelist = mpdclient_filelist_get(c, path);
- g_free(path);
- return filelist;
- }
- return NULL;
+ filelist_free(filelist);
+ filelist = mpdclient_filelist_get(c, path);
+ g_free(path);
+ return filelist;
+ }
+ return NULL;
}
int
GList *
mpdclient_get_artists_utf8(mpdclient_t *c)
{
- gchar *str = NULL;
- GList *list = NULL;
+ gchar *str = NULL;
+ GList *list = NULL;
- D("mpdclient_get_artists()\n");
- mpd_sendListCommand(c->connection, MPD_TABLE_ARTIST, NULL);
- while( (str=mpd_getNextArtist(c->connection)) )
- {
- list = g_list_append(list, (gpointer) str);
- }
- if( mpdclient_finish_command(c) )
- {
- return string_list_free(list);
- }
+ mpd_sendListCommand(c->connection, MPD_TABLE_ARTIST, NULL);
+ while ((str = mpd_getNextArtist(c->connection)))
+ list = g_list_append(list, (gpointer) str);
- return list;
+ if (mpdclient_finish_command(c))
+ return string_list_free(list);
+
+ return list;
}
GList *
mpdclient_get_albums_utf8(mpdclient_t *c, gchar *artist_utf8)
{
- gchar *str = NULL;
- GList *list = NULL;
-
- D("mpdclient_get_albums(%s)\n", artist_utf8);
- mpd_sendListCommand(c->connection, MPD_TABLE_ALBUM, artist_utf8);
- while( (str=mpd_getNextAlbum(c->connection)) )
- {
- list = g_list_append(list, (gpointer) str);
- }
- if( mpdclient_finish_command(c) )
- {
- return string_list_free(list);
- }
-
- return list;
-}
-
-
+ gchar *str = NULL;
+ GList *list = NULL;
+ mpd_sendListCommand(c->connection, MPD_TABLE_ALBUM, artist_utf8);
+ while ((str = mpd_getNextAlbum(c->connection)))
+ list = g_list_append(list, (gpointer) str);
+ if (mpdclient_finish_command(c))
+ return string_list_free(list);
+ return list;
+}