From f16e3728711c3dd4fd2ca241ddbe3df4499d754e Mon Sep 17 00:00:00 2001 From: "J. Alexander Treuman" Date: Sat, 26 May 2007 14:09:09 +0000 Subject: Make sure StoredPlaylists always contain UTF-8 paths that are either relative paths in the DB or URLs. The main functional difference is that playlistmove and playlistdelete will rewrite playlists in the correct encoding and remove invalid lines instead of potentially modifying them. The specific changes are: appendSongToStoredPlaylist: * Don't convert to FS charset * Don't prepend music_directory if saving absolute paths writeStoredPlaylistToPath: * Convert to FS charset * Prepend music_directory if saving absolute paths loadStoredPlaylist: * Make sure each line is either in the DB or a URL loadPlaylist: * Don't bother checking paths, since it's done in loadStoredPlaylist now git-svn-id: https://svn.musicpd.org/mpd/trunk@6266 09075e82-0dd4-0310-85a5-a0d7c8717e4f --- src/storedPlaylist.c | 57 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 20 deletions(-) (limited to 'src/storedPlaylist.c') diff --git a/src/storedPlaylist.c b/src/storedPlaylist.c index a4b135716..9cdfeabf0 100644 --- a/src/storedPlaylist.c +++ b/src/storedPlaylist.c @@ -23,6 +23,8 @@ #include "playlist.h" #include "ack.h" #include "command.h" +#include "ls.h" +#include "directory.h" #include #include @@ -96,6 +98,11 @@ static ListNode *nodeOfStoredPlaylist(StoredPlaylist *sp, int index) return NULL; } +static void appendSongToStoredPlaylist(StoredPlaylist *sp, Song *song) +{ + insertInListWithoutKey(sp->list, strdup(getSongUrl(song))); +} + StoredPlaylist *newStoredPlaylist(const char *utf8name, int fd, int ignoreExisting) { struct stat buf; @@ -138,6 +145,7 @@ StoredPlaylist *loadStoredPlaylist(const char *utf8path, int fd) int parentlen = strlen(parent); int tempInt; int commentCharFound = 0; + Song *song; filename = utf8pathToFsPathInStoredPlaylist(utf8path, fd); if (!filename) @@ -182,10 +190,22 @@ StoredPlaylist *loadStoredPlaylist(const char *utf8path, int fd) } slength = 0; temp = fsCharsetToUtf8(s); - if (!temp) - continue; - if (!commentCharFound) - insertInListWithoutKey(sp->list, strdup(s)); + if (temp && !commentCharFound) { + song = getSongFromDB(temp); + if (song) { + appendSongToStoredPlaylist(sp, song); + continue; + } + + if (!isValidRemoteUtf8Url(temp)) + continue; + + song = newSong(temp, SONG_TYPE_URL, NULL); + if (song) { + appendSongToStoredPlaylist(sp, song); + freeJustSong(song); + } + } } else if (slength == MAXPATHLEN) { s[slength] = '\0'; commandError(sp->fd, ACK_ERROR_PLAYLIST_LOAD, @@ -365,8 +385,9 @@ int removeOneSongFromStoredPlaylistByPath(int fd, const char *utf8path, int pos) static int writeStoredPlaylistToPath(StoredPlaylist *sp, const char *fspath) { - FILE *file; ListNode *node; + FILE *file; + char *s; if (fspath == NULL) return -1; @@ -380,7 +401,12 @@ static int writeStoredPlaylistToPath(StoredPlaylist *sp, const char *fspath) node = sp->list->firstNode; while (node != NULL) { - fprintf(file, "%s\n", (char *)node->data); + s = (char *)node->data; + if (isValidRemoteUtf8Url(s) || !playlist_saveAbsolutePaths) + s = utf8ToFsCharset(s); + else + s = rmp2amp(utf8ToFsCharset(s)); + fprintf(file, "%s\n", s); node = node->nextNode; } @@ -393,22 +419,11 @@ int writeStoredPlaylist(StoredPlaylist *sp) return writeStoredPlaylistToPath(sp, sp->fspath); } -static void appendSongToStoredPlaylist(StoredPlaylist *sp, Song *song) -{ - char *s; - - if (playlist_saveAbsolutePaths && song->type == SONG_TYPE_FILE) - s = rmp2amp(utf8ToFsCharset(getSongUrl(song))); - else - s = utf8ToFsCharset(getSongUrl(song)); - - insertInListWithoutKey(sp->list, strdup(s)); -} - int appendSongToStoredPlaylistByPath(int fd, const char *utf8path, Song *song) { char *filename; FILE *file; + char *s; filename = utf8pathToFsPathInStoredPlaylist(utf8path, fd); if (!filename) @@ -422,9 +437,11 @@ int appendSongToStoredPlaylistByPath(int fd, const char *utf8path, Song *song) } if (playlist_saveAbsolutePaths && song->type == SONG_TYPE_FILE) - fprintf(file, "%s\n", rmp2amp(utf8ToFsCharset(getSongUrl(song)))); + s = rmp2amp(utf8ToFsCharset(getSongUrl(song))); else - fprintf(file, "%s\n", utf8ToFsCharset(getSongUrl(song))); + s = utf8ToFsCharset(getSongUrl(song)); + + fprintf(file, "%s\n", s); while (fclose(file) != 0 && errno == EINTR); return 0; -- cgit v1.2.3