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; } }
// this function executes server-side commands only // must be called only from within server // -1 error, program must exit with error code -1 // 0 proceed normally as nothing happened // 1 no error, but program must exit with error code 0 // 2 don't load playlist on startup // when executed in remote server -- error code will be ignored int server_exec_command_line (const char *cmdline, int len, char *sendback, int sbsize) { if (sendback) { sendback[0] = 0; } const char *parg = cmdline; const char *pend = cmdline + len; int queue = 0; while (parg < pend) { if (strlen (parg) >= 2 && parg[0] == '-' && parg[1] != '-') { parg += strlen (parg); parg++; return 0; // running under osx debugger? } else if (!strcmp (parg, "--nowplaying")) { parg += strlen (parg); parg++; if (parg >= pend) { const char *errtext = "--nowplaying expects format argument"; if (sendback) { snprintf (sendback, sbsize, "error %s\n", errtext); return 0; } else { trace_err ("%s\n", errtext); return -1; } } char out[2048]; playItem_t *curr = streamer_get_playing_track (); if (curr) { pl_format_title (curr, -1, out, sizeof (out), -1, parg); pl_item_unref (curr); } else { strcpy (out, "nothing"); } if (sendback) { snprintf (sendback, sbsize, "nowplaying %s", out); } else { fwrite (out, 1, strlen (out), stdout); return 1; // exit } } else if (!strcmp (parg, "--nowplaying-tf")) { parg += strlen (parg); parg++; if (parg >= pend) { const char *errtext = "--nowplaying-tf expects format argument"; if (sendback) { snprintf (sendback, sbsize, "error %s\n", errtext); return 0; } else { trace_err ("%s\n", errtext); return -1; } } char out[2048]; playItem_t *curr = streamer_get_playing_track (); char *script = tf_compile (parg); if (script) { ddb_tf_context_t ctx = { ._size = sizeof (ddb_tf_context_t), .it = (DB_playItem_t *)curr, }; tf_eval (&ctx, script, out, sizeof (out)); tf_free (script); } else { *out = 0; } if (curr) { pl_item_unref (curr); } if (sendback) { snprintf (sendback, sbsize, "nowplaying %s", out); } else { fwrite (out, 1, strlen (out), stdout); return 1; // exit } } else if (!strcmp (parg, "--next")) {