aboutsummaryrefslogtreecommitdiffstats
path: root/src/playlist_queue.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2010-02-08 10:28:12 +0100
committerMax Kellermann <max@duempel.org>2010-02-08 10:28:12 +0100
commitbb2aa70ec613de5a88bfd21904ef5255abed6560 (patch)
tree330e45fde4a14332aa52d6ebe5e59a6ffe4a690f /src/playlist_queue.c
parent8e34c59c82906529247072704794453bd7bfeab0 (diff)
downloadmpd-bb2aa70ec613de5a88bfd21904ef5255abed6560.tar.gz
mpd-bb2aa70ec613de5a88bfd21904ef5255abed6560.tar.xz
mpd-bb2aa70ec613de5a88bfd21904ef5255abed6560.zip
playlist_queue: moved check_translate_song() to playlist_song.c
Diffstat (limited to 'src/playlist_queue.c')
-rw-r--r--src/playlist_queue.c120
1 files changed, 2 insertions, 118 deletions
diff --git a/src/playlist_queue.c b/src/playlist_queue.c
index 9940c3323..b19921da3 100644
--- a/src/playlist_queue.c
+++ b/src/playlist_queue.c
@@ -21,129 +21,13 @@
#include "playlist_queue.h"
#include "playlist_list.h"
#include "playlist_plugin.h"
+#include "playlist_song.h"
#include "stored_playlist.h"
-#include "database.h"
#include "mapper.h"
#include "song.h"
-#include "tag.h"
#include "uri.h"
-#include "ls.h"
#include "input_stream.h"
-static void
-merge_song_metadata(struct song *dest, const struct song *base,
- const struct song *add)
-{
- dest->tag = base->tag != NULL
- ? (add->tag != NULL
- ? tag_merge(base->tag, add->tag)
- : tag_dup(base->tag))
- : (add->tag != NULL
- ? tag_dup(add->tag)
- : NULL);
-
- dest->mtime = base->mtime;
- dest->start_ms = add->start_ms;
- dest->end_ms = add->end_ms;
-}
-
-static struct song *
-apply_song_metadata(struct song *dest, const struct song *src)
-{
- struct song *tmp;
-
- assert(dest != NULL);
- assert(src != NULL);
-
- if (src->tag == NULL && src->start_ms == 0 && src->end_ms == 0)
- return dest;
-
- if (song_in_database(dest)) {
- char *path_fs = map_song_fs(dest);
- if (path_fs == NULL)
- return dest;
-
- tmp = song_file_new(path_fs, NULL);
- merge_song_metadata(tmp, dest, src);
- } else {
- tmp = song_file_new(dest->uri, NULL);
- merge_song_metadata(tmp, dest, src);
- song_free(dest);
- }
-
- return tmp;
-}
-
-/**
- * Verifies the song, returns NULL if it is unsafe. Translate the
- * song to a new song object within the database, if it is a local
- * file. The old song object is freed.
- */
-static struct song *
-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;
-}
-
enum playlist_result
playlist_load_into_queue(const char *uri, struct playlist_provider *source,
struct playlist *dest)
@@ -153,7 +37,7 @@ playlist_load_into_queue(const char *uri, struct playlist_provider *source,
char *base_uri = uri != NULL ? g_path_get_dirname(uri) : NULL;
while ((song = playlist_plugin_read(source)) != NULL) {
- song = check_translate_song(song, base_uri);
+ song = playlist_check_translate_song(song, base_uri);
if (song == NULL)
continue;