summaryrefslogtreecommitdiff
path: root/playlist.c
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-01-31 20:26:17 +0100
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-01-31 20:26:17 +0100
commit6e6dc88fc61f4a84269a592c76c2b6bd0417bf4a (patch)
tree8b5b1fe103a9a4e93a680493d9f1dd2fcb71ded2 /playlist.c
parent9460844e2a1598dfe24a72dd2a283d02b57caddc (diff)
parent893655b27084db6399b82069a5dcb56d6e98fbfa (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.c170
1 files changed, 105 insertions, 65 deletions
diff --git a/playlist.c b/playlist.c
index eb2dccf6..6ac561bc 100644
--- a/playlist.c
+++ b/playlist.c
@@ -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");