id3v2: merge TYER/TDAT/TIME to date tag

Message ID 1300180456-19399-1-git-send-email-anton@khirnov.net
State Committed
Commit 56e2ac6b45ada4f9c107fe7b25f0706ec2e4dc11
Headers show

Commit Message

Anton Khirnov March 15, 2011, 9:14 a.m.
---
 libavformat/id3v2.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)

Comments

Kostya Shishkov March 15, 2011, 11:36 a.m. | #1
On Tue, Mar 15, 2011 at 10:14:16AM +0100, Anton Khirnov wrote:
> ---
>  libavformat/id3v2.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 47 insertions(+), 0 deletions(-)

LGTM
Justin Ruggles March 15, 2011, 5:58 p.m. | #2
On 03/15/2011 07:36 AM, Kostya wrote:

> On Tue, Mar 15, 2011 at 10:14:16AM +0100, Anton Khirnov wrote:
>> ---
>>  libavformat/id3v2.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
>>  1 files changed, 47 insertions(+), 0 deletions(-)
> 
> LGTM


queued.

Patch

diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index 76c7124..be88d10 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -136,6 +136,52 @@  static void read_ttag(AVFormatContext *s, AVIOContext *pb, int taglen, const cha
         av_metadata_set2(&s->metadata, key, val, AV_METADATA_DONT_OVERWRITE);
 }
 
+static int is_number(const char *str)
+{
+    while (*str >= '0' && *str <= '9') str++;
+    return !*str;
+}
+
+static AVMetadataTag* get_date_tag(AVMetadata *m, const char *tag)
+{
+    AVMetadataTag *t;
+    if ((t = av_metadata_get(m, tag, NULL, AV_METADATA_MATCH_CASE)) &&
+        strlen(t->value) == 4 && is_number(t->value))
+        return t;
+    return NULL;
+}
+
+static void merge_date(AVMetadata **m)
+{
+    AVMetadataTag *t;
+    char date[17] = {0};      // YYYY-MM-DD hh:mm
+
+    if (!(t = get_date_tag(*m, "TYER")) &&
+        !(t = get_date_tag(*m, "TYE")))
+        return;
+    av_strlcpy(date, t->value, 5);
+    av_metadata_set2(m, "TYER", NULL, 0);
+    av_metadata_set2(m, "TYE",  NULL, 0);
+
+    if (!(t = get_date_tag(*m, "TDAT")) &&
+        !(t = get_date_tag(*m, "TDA")))
+        goto finish;
+    snprintf(date + 4, sizeof(date) - 4, "-%.2s-%.2s", t->value + 2, t->value);
+    av_metadata_set2(m, "TDAT", NULL, 0);
+    av_metadata_set2(m, "TDA",  NULL, 0);
+
+    if (!(t = get_date_tag(*m, "TIME")) &&
+        !(t = get_date_tag(*m, "TIM")))
+        goto finish;
+    snprintf(date + 10, sizeof(date) - 10, " %.2s:%.2s", t->value, t->value + 2);
+    av_metadata_set2(m, "TIME", NULL, 0);
+    av_metadata_set2(m, "TIM",  NULL, 0);
+
+finish:
+    if (date[0])
+        av_metadata_set2(m, "date", date, 0);
+}
+
 static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t flags)
 {
     int isv34, tlen, unsync;
@@ -277,6 +323,7 @@  void ff_id3v2_read(AVFormatContext *s, const char *magic)
     ff_metadata_conv(&s->metadata, NULL, ff_id3v2_34_metadata_conv);
     ff_metadata_conv(&s->metadata, NULL, ff_id3v2_2_metadata_conv);
     ff_metadata_conv(&s->metadata, NULL, ff_id3v2_4_metadata_conv);
+    merge_date(&s->metadata);
 }
 
 const AVMetadataConv ff_id3v2_34_metadata_conv[] = {