aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/decoder/aac_plugin.c13
-rw-r--r--src/decoder/flac_plugin.c18
-rw-r--r--src/decoder/mp3_plugin.c16
-rw-r--r--src/decoder/mp4_plugin.c16
-rw-r--r--src/decoder/mpc_plugin.c13
-rw-r--r--src/decoder_api.h1
-rw-r--r--src/song.c36
7 files changed, 55 insertions, 58 deletions
diff --git a/src/decoder/aac_plugin.c b/src/decoder/aac_plugin.c
index f2907129e..90d39113b 100644
--- a/src/decoder/aac_plugin.c
+++ b/src/decoder/aac_plugin.c
@@ -443,19 +443,18 @@ aac_stream_decode(struct decoder *mpd_decoder, struct input_stream *inStream)
static struct tag *aacTagDup(const char *file)
{
- struct tag *ret = NULL;
int file_time = getAacTotalTime(file);
+ struct tag *tag;
- if (file_time >= 0) {
- if ((ret = tag_id3_load(file)) == NULL)
- ret = tag_new();
- ret->time = file_time;
- } else {
+ if (file_time < 0) {
g_debug("aacTagDup: Failed to get total song time from: %s\n",
file);
+ return NULL;
}
- return ret;
+ tag = tag_new();
+ tag->time = file_time;
+ return tag;
}
static const char *const aac_suffixes[] = { "aac", NULL };
diff --git a/src/decoder/flac_plugin.c b/src/decoder/flac_plugin.c
index e02c13638..19f8d7fd4 100644
--- a/src/decoder/flac_plugin.c
+++ b/src/decoder/flac_plugin.c
@@ -282,23 +282,7 @@ flac_tag_load(const char *file)
static struct tag *
flac_tag_dup(const char *file)
{
- struct tag *ret = NULL;
-
- ret = flac_tag_load(file);
- if (!ret) {
- g_debug("Failed to grab information from: %s\n", file);
- return NULL;
- }
- if (tag_is_empty(ret)) {
- struct tag *temp = tag_id3_load(file);
- if (temp) {
- temp->time = ret->time;
- tag_free(ret);
- ret = temp;
- }
- }
-
- return ret;
+ return flac_tag_load(file);
}
static void
diff --git a/src/decoder/mp3_plugin.c b/src/decoder/mp3_plugin.c
index 3444a7e94..fd0ac21a9 100644
--- a/src/decoder/mp3_plugin.c
+++ b/src/decoder/mp3_plugin.c
@@ -19,6 +19,7 @@
#include "../decoder_api.h"
#include "../conf.h"
#include "config.h"
+#include "tag_id3.h"
#include <assert.h>
#include <unistd.h>
@@ -1190,22 +1191,19 @@ mp3_decode(struct decoder *decoder, struct input_stream *input_stream)
static struct tag *mp3_tag_dup(const char *file)
{
- struct tag *ret = NULL;
+ struct tag *tag;
int total_time;
- ret = tag_id3_load(file);
-
total_time = mp3_total_file_time(file);
- if (total_time >= 0) {
- if (!ret)
- ret = tag_new();
- ret->time = total_time;
- } else {
+ if (total_time < 0) {
g_debug("mp3_tag_dup: Failed to get total song time from: %s\n",
file);
+ return NULL;
}
- return ret;
+ tag = tag_new();
+ tag->time = total_time;
+ return tag;
}
static const char *const mp3_suffixes[] = { "mp3", "mp2", NULL };
diff --git a/src/decoder/mp4_plugin.c b/src/decoder/mp4_plugin.c
index bc36acf8a..fd7415137 100644
--- a/src/decoder/mp4_plugin.c
+++ b/src/decoder/mp4_plugin.c
@@ -405,21 +405,7 @@ mp4_load_tag(const char *file)
static struct tag *
mp4_tag_dup(const char *file)
{
- struct tag *ret = NULL;
-
- ret = mp4_load_tag(file);
- if (!ret)
- return NULL;
- if (tag_is_empty(ret)) {
- struct tag *temp = tag_id3_load(file);
- if (temp) {
- temp->time = ret->time;
- tag_free(ret);
- ret = temp;
- }
- }
-
- return ret;
+ return mp4_load_tag(file);
}
static const char *const mp4_suffixes[] = { "m4a", "mp4", NULL };
diff --git a/src/decoder/mpc_plugin.c b/src/decoder/mpc_plugin.c
index 5ef2c5448..23fa5787b 100644
--- a/src/decoder/mpc_plugin.c
+++ b/src/decoder/mpc_plugin.c
@@ -249,8 +249,8 @@ static float mpcGetTime(const char *file)
static struct tag *mpcTagDup(const char *file)
{
- struct tag *ret = NULL;
float total_time = mpcGetTime(file);
+ struct tag *tag;
if (total_time < 0) {
g_debug("mpcTagDup: Failed to get Songlength of file: %s\n",
@@ -258,14 +258,9 @@ static struct tag *mpcTagDup(const char *file)
return NULL;
}
- ret = tag_ape_load(file);
- if (!ret)
- ret = tag_id3_load(file);
- if (!ret)
- ret = tag_new();
- ret->time = total_time;
-
- return ret;
+ tag = tag_new();
+ tag->time = total_time;
+ return tag;
}
static const char *const mpcSuffixes[] = { "mpc", NULL };
diff --git a/src/decoder_api.h b/src/decoder_api.h
index b4231e706..11ee86e42 100644
--- a/src/decoder_api.h
+++ b/src/decoder_api.h
@@ -29,7 +29,6 @@
#include "input_stream.h"
#include "replay_gain.h"
#include "tag.h"
-#include "tag_id3.h"
#include "audio_format.h"
#include "playerData.h"
diff --git a/src/song.c b/src/song.c
index b56c798cb..2bb2b85b5 100644
--- a/src/song.c
+++ b/src/song.c
@@ -24,6 +24,7 @@
#include "playlist.h"
#include "decoder_list.h"
#include "decoder_api.h"
+#include "tag_id3.h"
#include <glib.h>
@@ -98,6 +99,38 @@ song_free(struct song *song)
g_free(song);
}
+/**
+ * Attempts to load APE or ID3 tags from the specified file.
+ */
+static struct tag *
+tag_load_fallback(const char *path)
+{
+ struct tag *tag = tag_ape_load(path);
+ if (tag == NULL)
+ tag = tag_id3_load(path);
+ return tag;
+}
+
+/**
+ * The decoder plugin failed to load any tags: fall back to the APE or
+ * ID3 tag loader.
+ */
+static struct tag *
+tag_fallback(const char *path, struct tag *tag)
+{
+ struct tag *fallback = tag_load_fallback(path);
+
+ if (fallback != NULL) {
+ /* tag was successfully loaded: copy the song
+ duration, and destroy the old (empty) tag */
+ fallback->time = tag->time;
+ tag_free(tag);
+ return fallback;
+ } else
+ /* no APE/ID3 tag found: return the empty tag */
+ return tag;
+}
+
bool
song_file_update(struct song *song)
{
@@ -142,6 +175,9 @@ song_file_update(struct song *song)
plugin = decoder_plugin_from_suffix(suffix, true);
} while (plugin != NULL);
+ if (song->tag != NULL && tag_is_empty(song->tag))
+ song->tag = tag_fallback(path_fs, song->tag);
+
g_free(path_fs);
return song->tag != NULL;
}