mapper: make the playlist directory optional

This commit is contained in:
Max Kellermann 2009-01-18 16:15:45 +01:00
parent c2cc3b4923
commit 9933144de7
7 changed files with 57 additions and 19 deletions

1
NEWS
View File

@ -12,6 +12,7 @@ ver 0.15 - (200?/??/??)
* failure to read the state file is non-fatal
* added Icy-Metadata support
* --create-db starts the MPD daemon instead of exiting
* playlist_directory is optional
ver 0.14.1 (2009/01/17)

View File

@ -32,9 +32,6 @@ configuration file.
.B music_directory <directory>
This specifies the directory where music is located.
.TP
.B playlist_directory <directory>
This specifies the directory where saved playlists are stored.
.TP
.B follow_outside_symlinks <yes or no>
Control if MPD will follow symbolic links pointing outside the music dir.
You must recreate the database after changing this option.
@ -57,6 +54,10 @@ The special value "syslog" makes MPD use the local syslog daemon.
.B pid_file <file>
This specifies the file to save mpd's process ID in.
.TP
.B playlist_directory <directory>
This specifies the directory where saved playlists are stored.
If you do not configure this, you cannot save playlists.
.TP
.B state_file <file>
This specifies if a state file is used and where it is located. The state of
mpd will be saved to this file when mpd is terminated by a TERM signal or by

View File

@ -320,6 +320,11 @@ print_playlist_result(struct client *client,
command_error(client, ACK_ERROR_PLAYLIST_MAX,
"playlist is at the max size");
return COMMAND_RETURN_ERROR;
case PLAYLIST_RESULT_DISABLED:
command_error(client, ACK_ERROR_UNKNOWN,
"stored playlist support is disabled");
return COMMAND_RETURN_ERROR;
}
assert(0);

View File

@ -39,14 +39,29 @@ static char *music_dir;
static size_t music_dir_length;
static char *playlist_dir;
static size_t playlist_dir_length;
static void
mapper_set_playlist_dir(const char *path, int line)
{
int ret;
struct stat st;
playlist_dir = g_strdup(path);
ret = stat(playlist_dir, &st);
if (ret < 0)
g_warning("failed to stat playlist directory \"%s\" (config line %i): %s\n",
playlist_dir, line, g_strerror(errno));
else if (!S_ISDIR(st.st_mode))
g_warning("playlist directory is not a directory: \"%s\" (config line %i)\n",
playlist_dir, line);
}
void mapper_init(void)
{
struct config_param *music_dir_param =
parseConfigFilePath(CONF_MUSIC_DIR, false);
struct config_param *playlist_dir_param =
parseConfigFilePath(CONF_PLAYLIST_DIR, 1);
struct config_param *param;
int ret;
struct stat st;
@ -73,17 +88,9 @@ void mapper_init(void)
g_warning("music directory is not a directory: \"%s\" (config line %i)\n",
music_dir_param->value, music_dir_param->line);
playlist_dir = g_strdup(playlist_dir_param->value);
playlist_dir_length = strlen(playlist_dir);
ret = stat(playlist_dir, &st);
if (ret < 0)
g_warning("failed to stat playlist directory \"%s\" (config line %i): %s\n",
playlist_dir_param->value, playlist_dir_param->line,
strerror(errno));
else if (!S_ISDIR(st.st_mode))
g_warning("playlist directory is not a directory: \"%s\" (config line %i)\n",
playlist_dir_param->value, playlist_dir_param->line);
param = parseConfigFilePath(CONF_PLAYLIST_DIR, false);
if (param != NULL)
mapper_set_playlist_dir(param->value, param->line);
}
void mapper_finish(void)
@ -183,6 +190,9 @@ map_spl_utf8_to_fs(const char *name)
char *filename = g_strconcat(name, "." PLAYLIST_FILE_SUFFIX, NULL);
char *path;
if (playlist_dir == NULL)
return NULL;
path = g_build_filename(playlist_dir, filename, NULL);
g_free(filename);

View File

@ -1216,6 +1216,9 @@ enum playlist_result savePlaylist(const char *utf8file)
return PLAYLIST_RESULT_BAD_NAME;
path = map_spl_utf8_to_fs(utf8file);
if (path == NULL)
return PLAYLIST_RESULT_DISABLED;
if (g_file_test(path, G_FILE_TEST_EXISTS)) {
g_free(path);
return PLAYLIST_RESULT_LIST_EXISTS;

View File

@ -38,7 +38,8 @@ enum playlist_result {
PLAYLIST_RESULT_BAD_NAME,
PLAYLIST_RESULT_BAD_RANGE,
PLAYLIST_RESULT_NOT_PLAYING,
PLAYLIST_RESULT_TOO_LARGE
PLAYLIST_RESULT_TOO_LARGE,
PLAYLIST_RESULT_DISABLED,
};
typedef struct _Playlist {

View File

@ -80,6 +80,9 @@ spl_list(void)
GPtrArray *list;
struct stored_playlist_info *playlist;
if (parent_path_fs == NULL)
return NULL;
dir = opendir(parent_path_fs);
if (dir == NULL)
return NULL;
@ -118,6 +121,8 @@ spl_save(GPtrArray *list, const char *utf8path)
assert(utf8path != NULL);
path_fs = map_spl_utf8_to_fs(utf8path);
if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED;
while (!(file = fopen(path_fs, "w")) && errno == EINTR);
g_free(path_fs);
@ -145,6 +150,8 @@ spl_load(const char *utf8path)
return NULL;
path_fs = map_spl_utf8_to_fs(utf8path);
if (path_fs == NULL)
return NULL;
while (!(file = fopen(path_fs, "r")) && errno == EINTR);
g_free(path_fs);
@ -264,6 +271,8 @@ spl_clear(const char *utf8path)
return PLAYLIST_RESULT_BAD_NAME;
path_fs = map_spl_utf8_to_fs(utf8path);
if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED;
while (!(file = fopen(path_fs, "w")) && errno == EINTR);
g_free(path_fs);
@ -283,6 +292,9 @@ spl_delete(const char *name_utf8)
int ret;
path_fs = map_spl_utf8_to_fs(name_utf8);
if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED;
ret = unlink(path_fs);
g_free(path_fs);
if (ret < 0)
@ -330,6 +342,8 @@ spl_append_song(const char *utf8path, struct song *song)
return PLAYLIST_RESULT_BAD_NAME;
path_fs = map_spl_utf8_to_fs(utf8path);
if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED;
while (!(file = fopen(path_fs, "a")) && errno == EINTR);
g_free(path_fs);
@ -410,7 +424,10 @@ spl_rename(const char *utf8from, const char *utf8to)
from_path_fs = map_spl_utf8_to_fs(utf8from);
to_path_fs = map_spl_utf8_to_fs(utf8to);
ret = spl_rename_internal(from_path_fs, to_path_fs);
if (from_path_fs != NULL && to_path_fs != NULL)
ret = spl_rename_internal(from_path_fs, to_path_fs);
else
ret = PLAYLIST_RESULT_DISABLED;
g_free(from_path_fs);
g_free(to_path_fs);