static int pl_sort_compare_str (playItem_t *a, playItem_t *b) { if (pl_sort_is_duration) { float dur_a = a->_duration * 100000; float dur_b = b->_duration * 100000; return !pl_sort_ascending ? dur_b - dur_a : dur_a - dur_b; } else if (pl_sort_is_track) { int t1; int t2; const char *t; t = pl_find_meta_raw (a, "track"); if (t && !isdigit (*t)) { t1 = 999999; } else { t1 = t ? atoi (t) : -1; } t = pl_find_meta_raw (b, "track"); if (t && !isdigit (*t)) { t2 = 999999; } else { t2 = t ? atoi (t) : -1; } return !pl_sort_ascending ? t2 - t1 : t1 - t2; } else { char tmp1[1024]; char tmp2[1024]; if (pl_sort_version == 0) { pl_format_title (a, -1, tmp1, sizeof (tmp1), pl_sort_id, pl_sort_format); pl_format_title (b, -1, tmp2, sizeof (tmp2), pl_sort_id, pl_sort_format); } else { pl_sort_tf_ctx.id = pl_sort_id; pl_sort_tf_ctx.it = (ddb_playItem_t *)a; tf_eval(&pl_sort_tf_ctx, pl_sort_tf_bytecode, tmp1, sizeof(tmp1)); pl_sort_tf_ctx.it = (ddb_playItem_t *)b; tf_eval(&pl_sort_tf_ctx, pl_sort_tf_bytecode, tmp2, sizeof(tmp2)); } int res = strcasecmp_numeric (tmp1, tmp2); if (!pl_sort_ascending) { res = -res; } return res; } }
int pl_get_meta_raw (playItem_t *it, const char *key, char *val, int size) { *val = 0; pl_lock (); const char *v = pl_find_meta_raw (it, key); if (!v) { pl_unlock (); return 0; } strncpy (val, v, size); pl_unlock (); return 1; }
void pl_append_meta (playItem_t *it, const char *key, const char *value) { pl_lock (); const char *old = pl_find_meta_raw (it, key); if (old && (!strcasecmp (key, "cuesheet") || !strcasecmp (key, "log"))) { pl_unlock (); return; } size_t newlen = strlen (value); if (!old) { pl_add_meta (it, key, value); } else { // check for duplicate data const char *str = old; int len; while (str) { char *next = strchr (str, '\n'); if (next) { len = next - str; next++; } else { len = strlen (str); } if (len == newlen && !memcmp (str, value, len)) { pl_unlock (); return; } str = next; } int sz = strlen (old) + newlen + 2; char out[sz]; snprintf (out, sz, "%s\n%s", old, value); pl_replace_meta (it, key, out); } pl_unlock (); }