|
34 | 34 | #include "xmlrpc.h"
|
35 | 35 | #include "recommend.h"
|
36 | 36 | #include "util.h"
|
| 37 | +#include "tag.h" |
37 | 38 |
|
38 | 39 | #include "globals.h"
|
39 | 40 |
|
@@ -322,76 +323,111 @@ const char * meta(const char * fmt, int flags, struct hash * track) {
|
322 | 323 | string[length++] = fmt[x++];
|
323 | 324 | }
|
324 | 325 | else {
|
325 |
| - const char * keys [] = { |
326 |
| - "acreator", |
327 |
| - "ttitle", |
328 |
| - "lalbum", |
329 |
| - "Aartistpage", |
330 |
| - "Ttrackpage", |
331 |
| - "Lalbumpage", |
332 |
| - "dduration", |
333 |
| - "sstation", |
334 |
| - "SstationURL", |
335 |
| - "Rremain", |
336 |
| - "Iimage" |
337 |
| - }; |
338 |
| - |
339 |
| - register unsigned i = sizeof(keys) / sizeof(char *); |
340 |
| - |
341 |
| - /* Look for a track value with that format flag. */ |
342 |
| - while(i--) { |
343 |
| - if(fmt[x] == keys[i][0]) { |
344 |
| - char * val = strdup(value(track, keys[i] + 1)); |
345 |
| - const char * color = NULL; |
346 |
| - |
347 |
| - if(flags & M_COLORED) { |
348 |
| - char colorkey[64] = { 0 }; |
349 |
| - snprintf(colorkey, sizeof(colorkey), "%c-color", keys[i][0]); |
350 |
| - color = value(& rc, colorkey); |
351 |
| - |
352 |
| - if(color) { |
353 |
| - /* Strip leading spaces from end of color (Author: Ondrej Novy) */ |
354 |
| - char * color_st = strdup(color); |
355 |
| - size_t len = strlen(color_st) - 1; |
356 |
| - |
357 |
| - assert(color_st != NULL); |
358 |
| - |
359 |
| - while(isspace(color_st[len]) && len > 0) { |
360 |
| - color_st[len] = 0; |
361 |
| - len--; |
362 |
| - } |
363 |
| - length += snprintf(string + length, remn, "\x1B[%sm", color_st); |
364 |
| - free(color_st); |
365 |
| - } |
366 |
| - } |
367 |
| - |
368 |
| - if((flags & M_RELAXPATH) && val) { |
369 |
| - unsigned n; |
370 |
| - size_t l = strlen(val); |
| 326 | + char * val = NULL; |
| 327 | + const char * trackKey = NULL; |
| 328 | + char taggingItem = 0; |
| 329 | + const char * color = NULL; |
| 330 | + |
| 331 | + switch(fmt[x]) { |
| 332 | + case 'a': |
| 333 | + trackKey = "creator"; |
| 334 | + break; |
| 335 | + case 't': |
| 336 | + trackKey = "title"; |
| 337 | + break; |
| 338 | + case 'l': |
| 339 | + trackKey = "album"; |
| 340 | + break; |
| 341 | + case 'A': |
| 342 | + trackKey = "artistpage"; |
| 343 | + break; |
| 344 | + case 'T': |
| 345 | + trackKey = "trackpage"; |
| 346 | + break; |
| 347 | + case 'L': |
| 348 | + trackKey = "albumpage"; |
| 349 | + break; |
| 350 | + case 'd': |
| 351 | + trackKey = "duration"; |
| 352 | + break; |
| 353 | + case 's': |
| 354 | + trackKey = "station"; |
| 355 | + break; |
| 356 | + case 'S': |
| 357 | + trackKey = "stationURL"; |
| 358 | + break; |
| 359 | + case 'R': |
| 360 | + trackKey = "remain"; |
| 361 | + break; |
| 362 | + case 'I': |
| 363 | + trackKey = "image"; |
| 364 | + break; |
| 365 | + case 'Z': |
| 366 | + // artist tags |
| 367 | + taggingItem = 'a'; |
| 368 | + break; |
| 369 | + case 'D': |
| 370 | + // album tags |
| 371 | + taggingItem = 'l'; |
| 372 | + break; |
| 373 | + case 'z': |
| 374 | + // track tags |
| 375 | + taggingItem = 't'; |
| 376 | + break; |
| 377 | + } |
| 378 | + if(trackKey) { |
| 379 | + val = strdup(value(track, trackKey)); |
| 380 | + } else if(taggingItem) { |
| 381 | + val = oldtags(taggingItem, * track); |
| 382 | + if(!val) { |
| 383 | + val = strdup(""); |
| 384 | + } |
| 385 | + } |
371 | 386 |
|
372 |
| - for(n = 0; n < l; ++n) { |
373 |
| - if(val[n] == '/') |
374 |
| - val[n] = '|'; |
375 |
| - } |
376 |
| - } |
| 387 | + if(flags & M_COLORED) { |
| 388 | + char colorkey[64] = { 0 }; |
| 389 | + snprintf(colorkey, sizeof(colorkey), "%c-color", fmt[x]); |
| 390 | + color = value(& rc, colorkey); |
377 | 391 |
|
378 |
| - if(flags & M_SHELLESC) { |
379 |
| - char * escaped = shellescape(val); |
380 |
| - free(val); |
381 |
| - val = escaped; |
382 |
| - } |
| 392 | + if(color) { |
| 393 | + /* Strip leading spaces from end of color (Author: Ondrej Novy) */ |
| 394 | + char * color_st = strdup(color); |
| 395 | + size_t len = strlen(color_st) - 1; |
383 | 396 |
|
384 |
| - length = strlen(strncat(string, val ? val : "(unknown)", remn)); |
| 397 | + assert(color_st != NULL); |
385 | 398 |
|
386 |
| - free(val); |
| 399 | + while(isspace(color_st[len]) && len > 0) { |
| 400 | + color_st[len] = 0; |
| 401 | + len--; |
| 402 | + } |
| 403 | + length += snprintf(string + length, remn, "\x1B[%sm", color_st); |
| 404 | + free(color_st); |
| 405 | + } |
| 406 | + } |
387 | 407 |
|
388 |
| - if(color) |
389 |
| - length = strlen(strncat(string, "\x1B[0m", remn)); |
| 408 | + if((flags & M_RELAXPATH) && val) { |
| 409 | + unsigned n; |
| 410 | + size_t l = strlen(val); |
390 | 411 |
|
391 |
| - break; |
| 412 | + for(n = 0; n < l; ++n) { |
| 413 | + if(val[n] == '/') |
| 414 | + val[n] = '|'; |
392 | 415 | }
|
393 | 416 | }
|
394 | 417 |
|
| 418 | + if(flags & M_SHELLESC) { |
| 419 | + char * escaped = shellescape(val); |
| 420 | + free(val); |
| 421 | + val = escaped; |
| 422 | + } |
| 423 | + |
| 424 | + length = strlen(strncat(string, val ? val : "(unknown)", remn)); |
| 425 | + |
| 426 | + free(val); |
| 427 | + |
| 428 | + if(color) |
| 429 | + length = strlen(strncat(string, "\x1B[0m", remn)); |
| 430 | + |
395 | 431 | ++x;
|
396 | 432 | }
|
397 | 433 | }
|
|
0 commit comments