Allow a secondary metadata map for metadata extraction

This commit is contained in:
Julien BLACHE 2010-03-22 18:22:39 +01:00
parent 4da80edc3f
commit 52e38dd76a

View File

@ -65,7 +65,7 @@ struct metadata_map {
* map, the slower the filescanner gets. * map, the slower the filescanner gets.
*/ */
/* Lookup is case-insensitive, first occurrence takes precedence */ /* Lookup is case-insensitive, first occurrence takes precedence */
static struct metadata_map md_map[] = static struct metadata_map md_map_generic[] =
{ {
{ "title", 0, mfi_offsetof(title) }, { "title", 0, mfi_offsetof(title) },
{ "TT2", 0, mfi_offsetof(title) }, /* ID3v2.2 */ { "TT2", 0, mfi_offsetof(title) }, /* ID3v2.2 */
@ -119,7 +119,7 @@ static struct metadata_map md_map[] =
static int static int
extract_metadata(struct media_file_info *mfi, AVMetadata *md) extract_metadata_core(struct media_file_info *mfi, AVMetadata *md, struct metadata_map *md_map)
{ {
AVMetadataTag *mdt; AVMetadataTag *mdt;
char **strval; char **strval;
@ -184,10 +184,33 @@ extract_metadata(struct media_file_info *mfi, AVMetadata *md)
return mdcount; return mdcount;
} }
static int
extract_metadata(struct media_file_info *mfi, AVMetadata *md, struct metadata_map *extra_md_map)
{
int mdcount;
int extra;
mdcount = extract_metadata_core(mfi, md, md_map_generic);
DPRINTF(E_DBG, L_SCAN, "Picked up %d metadata with generic map\n", mdcount);
if (extra_md_map)
{
extra = extract_metadata_core(mfi, md, extra_md_map);
DPRINTF(E_DBG, L_SCAN, "Picked up %d metadata with extra map\n", extra);
mdcount += extra;
}
return mdcount;
}
int int
scan_metadata_ffmpeg(char *file, struct media_file_info *mfi) scan_metadata_ffmpeg(char *file, struct media_file_info *mfi)
{ {
AVFormatContext *ctx; AVFormatContext *ctx;
struct metadata_map *extra_md_map;
enum CodecID codec_id; enum CodecID codec_id;
enum CodecID video_codec_id; enum CodecID video_codec_id;
enum CodecID audio_codec_id; enum CodecID audio_codec_id;
@ -293,6 +316,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi)
} }
/* Check codec */ /* Check codec */
extra_md_map = NULL;
codec_id = (mfi->has_video) ? video_codec_id : audio_codec_id; codec_id = (mfi->has_video) ? video_codec_id : audio_codec_id;
switch (codec_id) switch (codec_id)
{ {
@ -412,7 +436,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi)
if (ctx->metadata) if (ctx->metadata)
{ {
ret = extract_metadata(mfi, ctx->metadata); ret = extract_metadata(mfi, ctx->metadata, extra_md_map);
DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from file metadata\n", ret); DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from file metadata\n", ret);
@ -421,7 +445,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi)
if (ctx->streams[audio_stream]->metadata) if (ctx->streams[audio_stream]->metadata)
{ {
ret = extract_metadata(mfi, ctx->streams[audio_stream]->metadata); ret = extract_metadata(mfi, ctx->streams[audio_stream]->metadata, extra_md_map);
DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from audio stream metadata\n", ret); DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from audio stream metadata\n", ret);
@ -430,7 +454,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi)
if ((video_stream != -1) && (ctx->streams[video_stream]->metadata)) if ((video_stream != -1) && (ctx->streams[video_stream]->metadata))
{ {
ret = extract_metadata(mfi, ctx->streams[video_stream]->metadata); ret = extract_metadata(mfi, ctx->streams[video_stream]->metadata, extra_md_map);
DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from video stream metadata\n", ret); DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from video stream metadata\n", ret);