|
|
|
@ -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[] = { |
|
|
|
|