summaryrefslogtreecommitdiff
path: root/lib/rbcodec/metadata
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/metadata')
-rw-r--r--lib/rbcodec/metadata/metadata.c62
-rw-r--r--lib/rbcodec/metadata/metadata.h3
2 files changed, 42 insertions, 23 deletions
diff --git a/lib/rbcodec/metadata/metadata.c b/lib/rbcodec/metadata/metadata.c
index 19147ccdb3..28cef46d92 100644
--- a/lib/rbcodec/metadata/metadata.c
+++ b/lib/rbcodec/metadata/metadata.c
@@ -394,25 +394,19 @@ unsigned int probe_file_format(const char *filename)
394/* Note, that this returns false for successful, true for error! */ 394/* Note, that this returns false for successful, true for error! */
395bool mp3info(struct mp3entry *entry, const char *filename) 395bool mp3info(struct mp3entry *entry, const char *filename)
396{ 396{
397 int fd; 397 return !get_metadata(entry, -1, filename);
398 bool result;
399
400 fd = open(filename, O_RDONLY);
401 if (fd < 0)
402 return true;
403
404 result = !get_metadata(entry, fd, filename);
405
406 close(fd);
407
408 return result;
409} 398}
410 399
411/* Get metadata for track - return false if parsing showed problems with the 400/* Get metadata for track - return false if parsing showed problems with the
412 * file that would prevent playback. 401 * file that would prevent playback. supply a filedescriptor <0 and the file will be opened
402 * and closed automatically within the get_metadata call
403 * get_metadata_ex allows flags to change the way get_metadata behaves
404 * METADATA_EXCLUDE_ID3_PATH won't copy filename path to the id3 path buffer
405 * METADATA_CLOSE_FD_ON_EXIT closes the open filedescriptor on exit
413 */ 406 */
414bool get_metadata(struct mp3entry* id3, int fd, const char* trackname) 407bool get_metadata_ex(struct mp3entry* id3, int fd, const char* trackname, int flags)
415{ 408{
409 bool success = true;
416 const struct afmt_entry *entry; 410 const struct afmt_entry *entry;
417 int logfd = 0; 411 int logfd = 0;
418 DEBUGF("Read metadata for %s\n", trackname); 412 DEBUGF("Read metadata for %s\n", trackname);
@@ -426,10 +420,20 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
426 close(logfd); 420 close(logfd);
427 } 421 }
428 } 422 }
429
430 /* Clear the mp3entry to avoid having bogus pointers appear */ 423 /* Clear the mp3entry to avoid having bogus pointers appear */
431 wipe_mp3entry(id3); 424 wipe_mp3entry(id3);
432 425
426 if (fd < 0)
427 {
428 fd = open(trackname, O_RDONLY);
429 flags |= METADATA_CLOSE_FD_ON_EXIT;
430 if (fd < 0)
431 {
432 DEBUGF("Error opening %s\n", trackname);
433 return false; /*Failure*/
434 }
435 }
436
433 /* Take our best guess at the codec type based on file extension */ 437 /* Take our best guess at the codec type based on file extension */
434 id3->codectype = probe_file_format(trackname); 438 id3->codectype = probe_file_format(trackname);
435 439
@@ -443,19 +447,31 @@ bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
443 if (!entry->parse_func) 447 if (!entry->parse_func)
444 { 448 {
445 DEBUGF("nothing to parse for %s (format %s)\n", trackname, entry->label); 449 DEBUGF("nothing to parse for %s (format %s)\n", trackname, entry->label);
446 return false; 450 success = false;
447 } 451 }
448 452 else if (!entry->parse_func(fd, id3))
449 if (!entry->parse_func(fd, id3))
450 { 453 {
451 DEBUGF("parsing %s failed (format: %s)\n", trackname, entry->label); 454 DEBUGF("parsing %s failed (format: %s)\n", trackname, entry->label);
452 return false; 455 success = false;
456 wipe_mp3entry(id3); /* ensure the mp3entry is clear */
453 } 457 }
454 458
455 lseek(fd, 0, SEEK_SET); 459 if ((flags & METADATA_CLOSE_FD_ON_EXIT))
456 strlcpy(id3->path, trackname, sizeof(id3->path)); 460 close(fd);
457 /* We have successfully read the metadata from the file */ 461 else
458 return true; 462 lseek(fd, 0, SEEK_SET);
463
464 if (success && (flags & METADATA_EXCLUDE_ID3_PATH) == 0)
465 {
466 strlcpy(id3->path, trackname, sizeof(id3->path));
467 }
468 /* have we successfully read the metadata from the file? */
469 return success;
470}
471
472bool get_metadata(struct mp3entry* id3, int fd, const char* trackname)
473{
474 return get_metadata_ex(id3, fd, trackname, 0);
459} 475}
460 476
461#define MOVE_ENTRY(x) if (x) x += offset; 477#define MOVE_ENTRY(x) if (x) x += offset;
diff --git a/lib/rbcodec/metadata/metadata.h b/lib/rbcodec/metadata/metadata.h
index b30979334a..a0ba0376c6 100644
--- a/lib/rbcodec/metadata/metadata.h
+++ b/lib/rbcodec/metadata/metadata.h
@@ -24,6 +24,8 @@
24 24
25#include "platform.h" 25#include "platform.h"
26 26
27#define METADATA_EXCLUDE_ID3_PATH (0x01) /* don't copy filename path to the id3 path buffer */
28#define METADATA_CLOSE_FD_ON_EXIT (0x02) /* close the filedescriptor when finished */
27/* Audio file types. */ 29/* Audio file types. */
28/* NOTE: The values of the AFMT_* items are used for the %fc tag in the WPS 30/* NOTE: The values of the AFMT_* items are used for the %fc tag in the WPS
29 - so new entries MUST be added to the end to maintain compatibility. 31 - so new entries MUST be added to the end to maintain compatibility.
@@ -323,6 +325,7 @@ struct mp3entry {
323 325
324unsigned int probe_file_format(const char *filename); 326unsigned int probe_file_format(const char *filename);
325bool get_metadata(struct mp3entry* id3, int fd, const char* trackname); 327bool get_metadata(struct mp3entry* id3, int fd, const char* trackname);
328bool get_metadata_ex(struct mp3entry* id3, int fd, const char* trackname, int flags);
326bool mp3info(struct mp3entry *entry, const char *filename); 329bool mp3info(struct mp3entry *entry, const char *filename);
327void adjust_mp3entry(struct mp3entry *entry, void *dest, const void *orig); 330void adjust_mp3entry(struct mp3entry *entry, void *dest, const void *orig);
328void copy_mp3entry(struct mp3entry *dest, const struct mp3entry *orig); 331void copy_mp3entry(struct mp3entry *dest, const struct mp3entry *orig);