playlist: moved savePlaylist() and loadPlaylsit() to playlist_save.c

This commit is contained in:
Max Kellermann 2009-01-25 14:11:47 +01:00
parent 69c74afa25
commit 98cb8f3969
5 changed files with 83 additions and 65 deletions

View File

@ -20,6 +20,7 @@
#include "player_control.h"
#include "playlist.h"
#include "playlist_print.h"
#include "playlist_save.h"
#include "queue_print.h"
#include "ls.h"
#include "directory.h"
@ -668,7 +669,7 @@ handle_save(struct client *client,
{
enum playlist_result result;
result = savePlaylist(argv[1]);
result = spl_save_queue(argv[1], playlist_get_queue());
return print_playlist_result(client, result);
}
@ -677,7 +678,7 @@ handle_load(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
{
enum playlist_result result;
result = loadPlaylist(argv[1]);
result = playlist_load_spl(argv[1]);
return print_playlist_result(client, result);
}

View File

@ -1025,38 +1025,6 @@ void shufflePlaylist(void)
incrPlaylistVersion();
}
enum playlist_result savePlaylist(const char *utf8file)
{
FILE *fp;
char *path;
if (!is_valid_playlist_name(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;
}
while (!(fp = fopen(path, "w")) && errno == EINTR);
g_free(path);
if (fp == NULL)
return PLAYLIST_RESULT_ERRNO;
for (unsigned i = 0; i < queue_length(&playlist.queue); i++)
playlist_print_song(fp, queue_get(&playlist.queue, i));
while (fclose(fp) && errno == EINTR) ;
idle_add(IDLE_STORED_PLAYLIST);
return PLAYLIST_RESULT_SUCCESS;
}
int getPlaylistCurrentSong(void)
{
if (playlist.current >= 0)
@ -1124,35 +1092,6 @@ unsigned getPlaylistSongId(unsigned song)
return queue_position_to_id(&playlist.queue, song);
}
enum playlist_result loadPlaylist(const char *utf8file)
{
GPtrArray *list;
if (!(list = spl_load(utf8file)))
return PLAYLIST_RESULT_NO_SUCH_LIST;
for (unsigned i = 0; i < list->len; ++i) {
const char *temp = g_ptr_array_index(list, i);
if ((addToPlaylist(temp, NULL)) != PLAYLIST_RESULT_SUCCESS) {
/* for windows compatibility, convert slashes */
char *temp2 = g_strdup(temp);
char *p = temp2;
while (*p) {
if (*p == '\\')
*p = '/';
p++;
}
if ((addToPlaylist(temp, NULL)) != PLAYLIST_RESULT_SUCCESS) {
g_warning("can't add file \"%s\"", temp2);
}
free(temp2);
}
}
spl_free(list);
return PLAYLIST_RESULT_SUCCESS;
}
/*
* Not supporting '/' was done out of laziness, and we should really
* strive to support it in the future.

View File

@ -144,8 +144,6 @@ enum playlist_result swapSongsInPlaylist(unsigned song1, unsigned song2);
enum playlist_result swapSongsInPlaylistById(unsigned id1, unsigned id2);
enum playlist_result loadPlaylist(const char *utf8file);
bool getPlaylistRepeatStatus(void);
void setPlaylistRepeatStatus(bool status);

View File

@ -23,6 +23,7 @@
#include "path.h"
#include "ls.h"
#include "database.h"
#include "idle.h"
#include <glib.h>
@ -62,3 +63,67 @@ playlist_print_uri(FILE *file, const char *uri)
g_free(s);
}
}
enum playlist_result
spl_save_queue(const char *name_utf8, const struct queue *queue)
{
char *path_fs;
FILE *file;
if (!is_valid_playlist_name(name_utf8))
return PLAYLIST_RESULT_BAD_NAME;
path_fs = map_spl_utf8_to_fs(name_utf8);
if (path_fs == NULL)
return PLAYLIST_RESULT_DISABLED;
if (g_file_test(path_fs, G_FILE_TEST_EXISTS)) {
g_free(path_fs);
return PLAYLIST_RESULT_LIST_EXISTS;
}
file = fopen(path_fs, "w");
g_free(path_fs);
if (file == NULL)
return PLAYLIST_RESULT_ERRNO;
for (unsigned i = 0; i < queue_length(queue); i++)
playlist_print_song(file, queue_get(queue, i));
fclose(file);
idle_add(IDLE_STORED_PLAYLIST);
return PLAYLIST_RESULT_SUCCESS;
}
enum playlist_result
playlist_load_spl(const char *name_utf8)
{
GPtrArray *list;
list = spl_load(name_utf8);
if (list == NULL)
return PLAYLIST_RESULT_NO_SUCH_LIST;
for (unsigned i = 0; i < list->len; ++i) {
const char *temp = g_ptr_array_index(list, i);
if ((addToPlaylist(temp, NULL)) != PLAYLIST_RESULT_SUCCESS) {
/* for windows compatibility, convert slashes */
char *temp2 = g_strdup(temp);
char *p = temp2;
while (*p) {
if (*p == '\\')
*p = '/';
p++;
}
if ((addToPlaylist(temp, NULL)) != PLAYLIST_RESULT_SUCCESS) {
g_warning("can't add file \"%s\"", temp2);
}
g_free(temp2);
}
}
spl_free(list);
return PLAYLIST_RESULT_SUCCESS;
}

View File

@ -19,6 +19,8 @@
#ifndef MPD_PLAYLIST_SAVE_H
#define MPD_PLAYLIST_SAVE_H
#include "playlist.h"
#include <stdio.h>
struct song;
@ -29,4 +31,17 @@ playlist_print_song(FILE *fp, const struct song *song);
void
playlist_print_uri(FILE *fp, const char *uri);
/**
* Saves a queue object into a stored playlist file.
*/
enum playlist_result
spl_save_queue(const char *name_utf8, const struct queue *queue);
/**
* Loads a stored playlist file, and append all songs to the global
* playlist.
*/
enum playlist_result
playlist_load_spl(const char *name_utf8);
#endif