summaryrefslogtreecommitdiff
path: root/playlist.c
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-07-19 14:49:06 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-07-19 14:49:06 +0200
commitf87672ba62ec14a91f16a801e5fd019d1f4dcf59 (patch)
tree5cf48d14d9a2c1c3a2a98b5b400a62a3a4ebd732 /playlist.c
parente89e2345859798fa596e01bd9460a63c92785f49 (diff)
metadata WIP
Diffstat (limited to 'playlist.c')
-rw-r--r--playlist.c68
1 files changed, 58 insertions, 10 deletions
diff --git a/playlist.c b/playlist.c
index 75af730e..d6edbcc6 100644
--- a/playlist.c
+++ b/playlist.c
@@ -206,7 +206,6 @@ ps_add_cue (const char *cuename) {
it->tracknum = atoi (track);
it->timestart = tstart;
it->timeend = -1; // will be filled by next read, or by codec
- it->displayname = strdup (str);
ps_append_item (it);
// printf ("added item %x\n", it);
prev = it;
@@ -325,12 +324,6 @@ ps_remove (playItem_t *it) {
if (!it)
return -1;
ps_count--;
- if (it->fname) {
- free (it->fname);
- }
- if (it->displayname) {
- free (it->displayname);
- }
if (it->prev) {
it->prev->next = it->next;
}
@@ -343,6 +336,7 @@ ps_remove (playItem_t *it) {
else {
playlist_tail = it->prev;
}
+ ps_item_free (it);
free (it);
return 0;
}
@@ -379,6 +373,7 @@ ps_get_idx_of (playItem_t *it) {
int
ps_append_item (playItem_t *it) {
+ ps_format_item_display_name (it);
if (!playlist_tail) {
playlist_tail = playlist_head = it;
}
@@ -393,13 +388,29 @@ ps_append_item (playItem_t *it) {
void
ps_item_copy (playItem_t *out, playItem_t *it) {
out->fname = strdup (it->fname);
- out->displayname = strdup (it->displayname);
+ strcpy (out->displayname, it->displayname);
out->codec = it->codec;
out->tracknum = it->tracknum;
out->timestart = it->timestart;
out->timeend = it->timeend;
out->next = it->next;
out->prev = it->prev;
+ // copy metainfo
+ metaInfo_t *prev = NULL;
+ metaInfo_t *meta = it->meta;
+ while (meta) {
+ metaInfo_t *m = malloc (sizeof (metaInfo_t));
+ memcpy (m, meta, sizeof (metaInfo_t));
+ m->next = NULL;
+ if (prev) {
+ prev->next = m;
+ }
+ else {
+ out->meta = m;
+ }
+ prev = m;
+ meta = meta->next;
+ }
}
void
@@ -408,8 +419,10 @@ ps_item_free (playItem_t *it) {
if (it->fname) {
free (it->fname);
}
- if (it->displayname) {
- free (it->displayname);
+ while (it->meta) {
+ metaInfo_t *m = it->meta;
+ it->meta = m->next;
+ free (m);
}
memset (it, 0, sizeof (playItem_t));
}
@@ -484,3 +497,38 @@ ps_start_current (void) {
it->codec->init (it->fname, it->tracknum, it->timestart, it->timeend);
}
}
+
+void
+ps_add_meta (playItem_t *it, const char *key, const char *value) {
+ if (!value || !*value) {
+ value = "?";
+ }
+ metaInfo_t *m = malloc (sizeof (metaInfo_t));
+ m->key = key;
+ strncpy (m->value, value, META_FIELD_SIZE-1);
+ m->value[META_FIELD_SIZE-1] = 0;
+ m->next = it->meta;
+ it->meta = m;
+}
+
+void
+ps_format_item_display_name (playItem_t *it) {
+ // artist - title
+ const char *track = ps_find_meta (it, "track");
+ const char *artist = ps_find_meta (it, "artist");
+ const char *album = ps_find_meta (it, "album");
+ const char *title = ps_find_meta (it, "title");
+ snprintf (it->displayname, MAX_DISPLAY_NAME, "%s. %s - %s - %s", track, artist, album, title);
+}
+
+const char *
+ps_find_meta (playItem_t *it, const char *key) {
+ metaInfo_t *m = it->meta;
+ while (m) {
+ if (!strcmp (key, m->key)) {
+ return m->value;
+ }
+ m = m->next;
+ }
+ return "?";
+}