aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tag_id3.c46
-rw-r--r--src/tag_id3.h14
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,