diff options
-rw-r--r-- | src/tag_id3.c | 46 | ||||
-rw-r--r-- | src/tag_id3.h | 14 |
2 files changed, 41 insertions, 19 deletions
diff --git a/src/tag_id3.c b/src/tag_id3.c index c98179f0a..0971829f0 100644 --- a/src/tag_id3.c +++ b/src/tag_id3.c @@ -541,30 +541,42 @@ tag_id3_riff_aiff_load(FILE *file) return tag; } -bool -tag_id3_scan(const char *path_fs, - const struct tag_handler *handler, void *handler_ctx) +struct id3_tag * +tag_id3_load(const char *path_fs, GError **error_r) { - struct id3_tag *tag; - FILE *stream; + FILE *file = fopen(path_fs, "rb"); + if (file == NULL) { + g_set_error(error_r, g_file_error_quark(), errno, + "Failed to open file %s: %s", + path_fs, g_strerror(errno)); + return NULL; + } - stream = fopen(path_fs, "rb"); - if (!stream) { - g_debug("tag_id3_load: Failed to open file: '%s', %s", - path_fs, g_strerror(errno)); - return false; + struct id3_tag *tag = tag_id3_find_from_beginning(file); + if (tag == NULL) { + tag = tag_id3_riff_aiff_load(file); + if (tag == NULL) + tag = tag_id3_find_from_end(file); } - tag = tag_id3_find_from_beginning(stream); - if (tag == NULL) - tag = tag_id3_riff_aiff_load(stream); - if (!tag) - tag = tag_id3_find_from_end(stream); + fclose(file); + return tag; +} - fclose(stream); +bool +tag_id3_scan(const char *path_fs, + const struct tag_handler *handler, void *handler_ctx) +{ + GError *error = NULL; + struct id3_tag *tag = tag_id3_load(path_fs, &error); + if (tag == NULL) { + if (error != NULL) { + g_warning("%s", error->message); + g_error_free(error); + } - if (!tag) return false; + } scan_id3_tag(tag, handler, handler_ctx); id3_tag_delete(tag); diff --git a/src/tag_id3.h b/src/tag_id3.h index b99b4480f..049c53ad9 100644 --- a/src/tag_id3.h +++ b/src/tag_id3.h @@ -22,6 +22,8 @@ #include "check.h" +#include <glib.h> + #include <stdbool.h> struct tag_handler; @@ -36,9 +38,17 @@ tag_id3_scan(const char *path_fs, struct id3_tag; struct tag *tag_id3_import(struct id3_tag *); -#else +/** + * Loads the ID3 tags from the file into a libid3tag object. The + * return value must be freed with id3_tag_delete(). + * + * @return NULL on error or if no ID3 tag was found in the file (no + * GError will be set) + */ +struct id3_tag * +tag_id3_load(const char *path_fs, GError **error_r); -#include <glib.h> +#else static inline bool tag_id3_scan(G_GNUC_UNUSED const char *path_fs, |