GPtrArray * spl_load(const char *utf8path) { FILE *file; GPtrArray *list; char buffer[MPD_PATH_MAX]; char *path_fs; if (!spl_valid_name(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); if (file == NULL) return NULL; list = g_ptr_array_new(); while (fgets(buffer, sizeof(buffer), file)) { char *s = buffer; if (*s == PLAYLIST_COMMENT) continue; g_strchomp(buffer); if (!uri_has_scheme(s)) { char *path_utf8; struct song *song; path_utf8 = map_fs_to_utf8(s); if (path_utf8 == NULL) continue; song = db_get_song(path_utf8); g_free(path_utf8); if (song == NULL) continue; s = song_get_uri(song); } else s = g_strdup(s); g_ptr_array_add(list, s); if (list->len >= playlist_max_length) break; } while (fclose(file) && errno == EINTR); return list; }
static struct song * song_by_uri(const char *uri) { struct song *song; song = db_get_song(uri); if (song != NULL) return song; if (uri_has_scheme(uri)) return song_remote_new(uri); return NULL; }
enum playlist_result spl_append_uri(const char *url, const char *utf8file) { struct song *song; if (uri_has_scheme(url)) { enum playlist_result ret; song = song_remote_new(url); ret = spl_append_song(utf8file, song); song_free(song); return ret; } else { song = db_get_song(url); if (song == NULL) return PLAYLIST_RESULT_NO_SUCH_SONG; return spl_append_song(utf8file, song); } }
static struct song * playlist_check_load_song(const struct song *song, const char *uri, bool secure) { struct song *dest; if (uri_has_scheme(uri)) { dest = song_remote_new(uri); } else if (g_path_is_absolute(uri) && secure) { dest = song_file_load(uri, NULL); if (dest == NULL) return NULL; } else { dest = db_get_song(uri); if (dest == NULL) /* not found in database */ return NULL; } return apply_song_metadata(dest, song); }
bool spl_append_uri(const char *url, const char *utf8file, GError **error_r) { struct song *song; if (uri_has_scheme(url)) { song = song_remote_new(url); bool success = spl_append_song(utf8file, song, error_r); song_free(song); return success; } else { song = db_get_song(url); if (song == NULL) { g_set_error_literal(error_r, playlist_quark(), PLAYLIST_RESULT_NO_SUCH_SONG, "No such song"); return false; } return spl_append_song(utf8file, song, error_r); } }
struct song * playlist_check_translate_song(struct song *song, const char *base_uri) { struct song *dest; if (song_in_database(song)) /* already ok */ return song; char *uri = song->uri; if (uri_has_scheme(uri)) { if (uri_supported_scheme(uri)) /* valid remote song */ return song; else { /* unsupported remote song */ song_free(song); return NULL; } } if (g_path_is_absolute(uri)) { /* XXX fs_charset vs utf8? */ char *prefix = base_uri != NULL ? map_uri_fs(base_uri) : map_directory_fs(db_get_root()); if (prefix == NULL || !g_str_has_prefix(uri, prefix) || uri[strlen(prefix)] != '/') { /* local files must be relative to the music directory */ g_free(prefix); song_free(song); return NULL; } uri += strlen(prefix) + 1; g_free(prefix); } if (base_uri != NULL) uri = g_build_filename(base_uri, uri, NULL); else uri = g_strdup(uri); if (uri_has_scheme(base_uri)) { dest = song_remote_new(uri); g_free(uri); } else { dest = db_get_song(uri); g_free(uri); if (dest == NULL) { /* not found in database */ song_free(song); return dest; } } dest = apply_song_metadata(dest, song); song_free(song); return dest; }
struct song * playlist_check_translate_song(struct song *song, const char *base_uri, bool secure) { struct song *dest; if (song_in_database(song)) /* already ok */ return song; char *uri = song->uri; if (uri_has_scheme(uri)) { if (uri_supported_scheme(uri)) /* valid remote song */ return song; else { /* unsupported remote song */ song_free(song); return NULL; } } if (base_uri != NULL && strcmp(base_uri, ".") == 0) /* g_path_get_dirname() returns "." when there is no directory name in the given path; clear that now, because it would break the database lookup functions */ base_uri = NULL; if (g_path_is_absolute(uri)) { /* XXX fs_charset vs utf8? */ const char *prefix = mapper_get_music_directory(); if (prefix != NULL && g_str_has_prefix(uri, prefix) && uri[strlen(prefix)] == '/') uri += strlen(prefix) + 1; else if (!secure) { /* local files must be relative to the music directory when "secure" is enabled */ song_free(song); return NULL; } base_uri = NULL; } if (base_uri != NULL) uri = g_build_filename(base_uri, uri, NULL); else uri = g_strdup(uri); if (uri_has_scheme(uri)) { dest = song_remote_new(uri); g_free(uri); } else if (g_path_is_absolute(uri) && secure) { dest = song_file_load(uri, NULL); if (dest == NULL) { song_free(song); return NULL; } } else { dest = db_get_song(uri); g_free(uri); if (dest == NULL) { /* not found in database */ song_free(song); return dest; } } dest = apply_song_metadata(dest, song); song_free(song); return dest; }