diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-01-31 20:26:17 +0100 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-01-31 20:26:17 +0100 |
commit | 6e6dc88fc61f4a84269a592c76c2b6bd0417bf4a (patch) | |
tree | 8b5b1fe103a9a4e93a680493d9f1dd2fcb71ded2 /playlist.c | |
parent | 9460844e2a1598dfe24a72dd2a283d02b57caddc (diff) | |
parent | 893655b27084db6399b82069a5dcb56d6e98fbfa (diff) |
Merge branch 'master' into devel
Conflicts:
main.c
plugins/flac/flac.c
plugins/mpgmad/mpgmad.c
streamer.c
Diffstat (limited to 'playlist.c')
-rw-r--r-- | playlist.c | 170 |
1 files changed, 105 insertions, 65 deletions
@@ -31,7 +31,6 @@ #endif #include <limits.h> #include "playlist.h" -#include "codec.h" #include "streamer.h" #include "messagepump.h" #include "playback.h" @@ -598,90 +597,111 @@ pl_insert_pls (playItem_t *after, const char *fname, int *pabort, int (*cb)(play char title[1024] = ""; char length[20] = ""; while (p < end) { + p = pl_str_skipspaces (p, end); if (p >= end) { break; } if (end-p < 6) { break; } - if (strncasecmp (p, "file", 4)) { - break; - } - p += 4; - while (p < end && *p != '=') { + const uint8_t *e; + int n; + if (!strncasecmp (p, "file", 4)) { + if (url[0]) { + // add track + playItem_t *it = pl_insert_file (after, url, pabort, cb, user_data); + if (it) { + after = it; + pl_set_item_duration (it, atoi (length)); + if (title[0]) { + pl_delete_all_meta (it); + pl_add_meta (it, "title", title); + } + } + if (pabort && *pabort) { + return after; + } + url[0] = 0; + title[0] = 0; + length[0] = 0; + } + p += 4; + while (p < end && *p != '=') { + p++; + } p++; + if (p >= end) { + break; + } + e = p; + while (e < end && *e >= 0x20) { + e++; + } + n = e-p; + n = min (n, sizeof (url)-1); + memcpy (url, p, n); + url[n] = 0; + trace ("url: %s\n", url); + p = ++e; } - p++; - if (p >= end) { - break; - } - const uint8_t *e = p; - while (e < end && *e >= 0x20) { - e++; - } - int n = e-p; - n = min (n, sizeof (url)-1); - memcpy (url, p, n); - url[n] = 0; - trace ("url: %s\n", url); - p = ++e; - p = pl_str_skipspaces (p, end); - if (strncasecmp (p, "title", 5)) { - break; - } - p += 5; - while (p < end && *p != '=') { + else if (!strncasecmp (p, "title", 5)) { + p += 5; + while (p < end && *p != '=') { + p++; + } p++; - } - p++; - if (p >= end) { - break; - } - e = p; - while (e < end && *e >= 0x20) { - e++; - } - n = e-p; - n = min (n, sizeof (title)-1); - memcpy (title, p, n); - title[n] = 0; - trace ("title: %s\n", title); - p = ++e; - p = pl_str_skipspaces (p, end); - if (strncasecmp (p, "length", 6)) { - break; - } - p += 6; - // skip = - while (p < end && *p != '=') { + if (p >= end) { + break; + } + e = p; + while (e < end && *e >= 0x20) { + e++; + } + n = e-p; + n = min (n, sizeof (title)-1); + memcpy (title, p, n); + title[n] = 0; + trace ("title: %s\n", title); + p = ++e; + } + else if (!strncasecmp (p, "length", 6)) { + p += 6; + // skip = + while (p < end && *p != '=') { + p++; + } p++; + if (p >= end) { + break; + } + e = p; + while (e < end && *e >= 0x20) { + e++; + } + n = e-p; + n = min (n, sizeof (length)-1); + memcpy (length, p, n); + break; } - p++; - if (p >= end) { + else { + trace ("invalid entry in pls file: %s\n", p); break; } - e = p; - while (e < end && *e >= 0x20) { + while (e < end && *e < 0x20) { e++; } - n = e-p; - n = min (n, sizeof (length)-1); - memcpy (length, p, n); - // add track + p = e; + } + if (url[0]) { playItem_t *it = pl_insert_file (after, url, pabort, cb, user_data); if (it) { after = it; pl_set_item_duration (it, atoi (length)); - pl_delete_all_meta (it); - pl_add_meta (it, "title", title); - } - if (pabort && *pabort) { - return after; - } - while (e < end && *e < 0x20) { - e++; + if (title[0]) { + pl_delete_all_meta (it); + pl_add_meta (it, "title", title); + } } - p = e; } return after; } @@ -1091,6 +1111,26 @@ pl_add_meta (playItem_t *it, const char *key, const char *value) { } void +pl_replace_meta (playItem_t *it, const char *key, const char *value) { + // check if it's already set + metaInfo_t *m = it->meta; + while (m) { + if (!strcasecmp (key, m->key)) { + break;; + } + m = m->next; + } + if (m) { + free (m->value); + m->value = strdup (value); + return; + } + else { + pl_add_meta (it, key, value); + } +} + +void pl_format_item_display_name (playItem_t *it, char *str, int len) { const char *artist = pl_find_meta (it, "artist"); const char *title = pl_find_meta (it, "title"); |