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); }
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; }