Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
5fa18d56
Commit
5fa18d56
authored
Jan 04, 2009
by
Rémi Duraffort
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
taglib: cleaning and renaming.
parent
5db54724
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
140 additions
and
201 deletions
+140
-201
modules/meta_engine/taglib.cpp
modules/meta_engine/taglib.cpp
+140
-201
No files found.
modules/meta_engine/taglib.cpp
View file @
5fa18d56
...
...
@@ -85,12 +85,85 @@ vlc_module_end ()
using
namespace
TagLib
;
/* Try detecting embedded art */
static
void
DetectImage
(
FileRef
f
,
demux_t
*
p_demux
)
/**
* Read meta informations from APE tags
* @param tag: the APE tag
* @param p_demux; the demux object
* @param p_demux_meta: the demuxer meta
* @param p_meta: the meta
*/
static
void
ReadMetaFromAPE
(
APE
::
Tag
*
tag
,
demux_t
*
p_demux
,
demux_meta_t
*
p_demux_meta
,
vlc_meta_t
*
p_meta
)
{
demux_meta_t
*
p_demux_meta
=
(
demux_meta_t
*
)
p_demux
->
p_private
;
vlc_meta_t
*
p_meta
=
p_demux_meta
->
p_meta
;
int
i_score
=
-
1
;
APE
::
Item
item
;
#define SET( keyName, metaName ) \
item = tag->itemListMap()[keyName]; \
vlc_meta_Set##metaName( p_meta, item.toString().toCString( true ) );\
SET
(
"COPYRIGHT"
,
Copyright
);
SET
(
"LANGUAGE"
,
Language
);
SET
(
"PUBLISHER"
,
Publisher
);
#undef SET
}
/**
* Read meta information from id3v2 tags
* @param tag: the id3v2 tag
* @param p_demux; the demux object
* @param p_demux_meta: the demuxer meta
* @param p_meta: the meta
*/
static
void
ReadMetaFromId3v2
(
ID3v2
::
Tag
*
tag
,
demux_t
*
p_demux
,
demux_meta_t
*
p_demux_meta
,
vlc_meta_t
*
p_meta
)
{
// Get the unique file identifier
ID3v2
::
FrameList
list
=
tag
->
frameListMap
()[
"UFID"
];
ID3v2
::
FrameList
::
Iterator
iter
;
for
(
iter
=
list
.
begin
();
iter
!=
list
.
end
();
iter
++
)
{
ID3v2
::
UniqueFileIdentifierFrame
*
p_ufid
=
dynamic_cast
<
ID3v2
::
UniqueFileIdentifierFrame
*>
(
*
iter
);
const
char
*
owner
=
p_ufid
->
owner
().
toCString
();
if
(
!
strcmp
(
owner
,
"http://musicbrainz.org"
))
{
/* ID3v2 UFID contains up to 64 bytes binary data
* but in our case it will be a '\0'
* terminated string */
char
psz_ufid
[
64
];
int
j
=
0
;
int
max_size
=
p_ufid
->
identifier
().
size
()
<
63
?
p_ufid
->
identifier
().
size
()
:
63
;
while
(
j
<
max_size
)
psz_ufid
[
j
]
=
p_ufid
->
identifier
()[
j
++
];
psz_ufid
[
j
]
=
'\0'
;
vlc_meta_SetTrackID
(
p_meta
,
psz_ufid
);
}
}
// Get the use text
list
=
tag
->
frameListMap
()[
"TXXX"
];
for
(
iter
=
list
.
begin
();
iter
!=
list
.
end
();
iter
++
)
{
ID3v2
::
UserTextIdentificationFrame
*
p_txxx
=
dynamic_cast
<
ID3v2
::
UserTextIdentificationFrame
*>
(
*
iter
);
vlc_meta_AddExtra
(
p_meta
,
p_txxx
->
description
().
toCString
(
true
),
p_txxx
->
fieldList
().
toString
().
toCString
(
true
)
);
}
// Get some more informations
#define SET( tagName, metaName ) \
list = tag->frameListMap()[tagName]; \
if( !list.isEmpty() ) \
vlc_meta_Set##metaName( p_meta, \
(*list.begin())->toString().toCString( true ) );
SET
(
"TCOP"
,
Copyright
);
SET
(
"TENC"
,
EncodedBy
);
SET
(
"TLAN"
,
Language
);
SET
(
"TPUB"
,
Publisher
);
#undef SET
/* Preferred type of image
* The 21 types are defined in id3v2 standard:
...
...
@@ -118,29 +191,25 @@ static void DetectImage( FileRef f, demux_t *p_demux )
3
,
/* Logo of the band or performer. */
2
/* Logo of the publisher (record company). */
};
int
i_score
=
-
1
;
if
(
MPEG
::
File
*
mpeg
=
dynamic_cast
<
MPEG
::
File
*>
(
f
.
file
()
)
)
{
ID3v2
::
Tag
*
p_tag
=
mpeg
->
ID3v2Tag
();
if
(
!
p_tag
)
return
;
ID3v2
::
FrameList
list
=
p_tag
->
frameListMap
()[
"APIC"
];
// Try now to get embedded art
list
=
tag
->
frameListMap
()[
"APIC"
];
if
(
list
.
isEmpty
()
)
return
;
ID3v2
::
AttachedPictureFrame
*
p_apic
;
TAB_INIT
(
p_demux_meta
->
i_attachments
,
p_demux_meta
->
attachments
);
for
(
ID3v2
::
FrameList
::
Iterator
iter
=
list
.
begin
();
iter
!=
list
.
end
();
iter
++
)
{
p_apic
=
dynamic_cast
<
ID3v2
::
AttachedPictureFrame
*>
(
*
iter
);
ID3v2
::
AttachedPictureFrame
*
p_apic
=
dynamic_cast
<
ID3v2
::
AttachedPictureFrame
*>
(
*
iter
);
input_attachment_t
*
p_attachment
;
const
char
*
psz_name
,
*
psz_mime
,
*
psz_description
;
ByteVector
p_data_taglib
;
const
char
*
p_data
;
int
i_data
;
const
char
*
p_data
;
int
i_data
;
psz_mime
=
p_apic
->
mimeType
().
toCString
(
true
);
psz_description
=
psz_name
=
p_apic
->
description
().
toCString
(
true
);
psz_mime
=
p_apic
->
mimeType
().
toCString
(
true
);
psz_description
=
psz_name
=
p_apic
->
description
().
toCString
(
true
);
/* some old iTunes version not only sets incorrectly the mime type
* or the description of the image,
...
...
@@ -149,16 +218,12 @@ static void DetectImage( FileRef f, demux_t *p_demux )
if
(
!
strncmp
(
psz_mime
,
"PNG"
,
3
)
||
!
strncmp
(
psz_name
,
"
\xC2\x89
PNG"
,
5
)
)
{
msg_Warn
(
p_demux
,
"%s: Invalid picture embedded by broken iTunes version, "
"you really shouldn't use this crappy software."
,
(
const
char
*
)
f
.
file
()
->
name
()
);
msg_Warn
(
p_demux
,
"Invalid picture embedded by broken iTunes version"
);
break
;
}
p_data_taglib
=
p_apic
->
picture
();
p_data
=
p_data_taglib
.
data
();
i_data
=
p_data_taglib
.
size
();
p_data
=
p_apic
->
picture
().
data
();
i_data
=
p_apic
->
picture
().
size
();
msg_Dbg
(
p_demux
,
"Found embedded art: %s (%s) is %i bytes"
,
psz_name
,
psz_mime
,
i_data
);
...
...
@@ -175,21 +240,35 @@ static void DetectImage( FileRef f, demux_t *p_demux )
char
*
psz_url
;
if
(
asprintf
(
&
psz_url
,
"attachment://%s"
,
p_attachment
->
psz_name
)
==
-
1
)
return
;
break
;
vlc_meta_SetArtURL
(
p_meta
,
psz_url
);
free
(
psz_url
);
}
}
}
else
if
(
Ogg
::
Vorbis
::
File
*
oggv
=
dynamic_cast
<
Ogg
::
Vorbis
::
File
*>
(
f
.
file
()
)
)
{
Ogg
::
XiphComment
*
p_tag
=
oggv
->
tag
();
if
(
!
p_tag
)
return
;
}
/**
* Read the meta informations from XiphComments
* @param tag: the Xiph Comment
* @param p_demux; the demux object
* @param p_demux_meta: the demuxer meta
* @param p_meta: the meta
*/
static
void
ReadMetaFromXiph
(
Ogg
::
XiphComment
*
tag
,
demux_t
*
p_demux
,
demux_meta_t
*
p_demux_meta
,
vlc_meta_t
*
p_meta
)
{
#define SET( keyName, metaName ) \
StringList list = tag->fieldListMap()[keyName]; \
if( !list.isEmpty() ) \
vlc_meta_Set##metaName( p_meta, (*list.begin()).toCString( true ) );
StringList
mime_list
=
p_tag
->
fieldListMap
()[
"COVERARTMIME"
];
StringList
art_list
=
p_tag
->
fieldListMap
()[
"COVERART"
];
SET
(
"COPYRIGHT"
,
Copyright
);
#undef SET
// Try now to get embedded art
StringList
mime_list
=
tag
->
fieldListMap
()[
"COVERARTMIME"
];
StringList
art_list
=
tag
->
fieldListMap
()[
"COVERART"
];
/* we support only one cover in ogg/vorbis */
if
(
mime_list
.
size
()
!=
1
||
art_list
.
size
()
!=
1
)
...
...
@@ -220,136 +299,6 @@ static void DetectImage( FileRef f, demux_t *p_demux )
p_attachment
);
vlc_meta_SetArtURL
(
p_meta
,
"attachment://cover"
);
}
#if 0
//flac embedded images are extracted in the flac demuxer
else if( FLAC::File *flac =
dynamic_cast<FLAC::File *>(f.file() ) )
{
p_tag = flac->ID3v2Tag();
if( p_tag )
return;
ID3v2::FrameList l = p_tag->frameListMap()[ "APIC" ];
if( l.isEmpty() )
return;
vlc_meta_SetArtURL( p_meta, "APIC" );
}
#endif
#if 0
/* TagLib doesn't support MP4 file yet */
else if( MP4::File *mp4 =
dynamic_cast<MP4::File *>( f.file() ) )
{
MP4::Tag *mp4tag =
dynamic_cast<MP4::Tag *>( mp4->tag() );
if( mp4tag && mp4tag->cover().size() )
vlc_meta_SetArtURL( p_meta, "MP4C" );
}
#endif
}
/**
* Read meta informations from APE tags
* @param tag: the APE tag
* @param p_meta: the meta
* @return VLC_SUCCESS if everything goes ok
*/
static
int
ReadMetaFromAPE
(
APE
::
Tag
*
tag
,
vlc_meta_t
*
p_meta
)
{
APE
::
Item
item
;
#define SET( keyName, metaName ) \
item = tag->itemListMap()[keyName]; \
vlc_meta_Set##metaName( p_meta, item.toString().toCString( true ) );\
SET
(
"COPYRIGHT"
,
Copyright
);
SET
(
"LANGUAGE"
,
Language
);
SET
(
"PUBLISHER"
,
Publisher
);
#undef SET
return
VLC_SUCCESS
;
}
/**
* Read meta information from id3v2 tags
* @param tag: the id3v2 tag
* @param p_meta: the meta
* @return VLC_SUCCESS if everything goes ok
*/
static
int
ReadMetaFromId2v2
(
ID3v2
::
Tag
*
tag
,
vlc_meta_t
*
p_meta
)
{
// Get the unique file identifier
ID3v2
::
FrameList
list
=
tag
->
frameListMap
()[
"UFID"
];
ID3v2
::
FrameList
::
Iterator
iter
;
for
(
iter
=
list
.
begin
();
iter
!=
list
.
end
();
iter
++
)
{
ID3v2
::
UniqueFileIdentifierFrame
*
p_ufid
=
dynamic_cast
<
ID3v2
::
UniqueFileIdentifierFrame
*>
(
*
iter
);
const
char
*
owner
=
p_ufid
->
owner
().
toCString
();
if
(
!
strcmp
(
owner
,
"http://musicbrainz.org"
))
{
/* ID3v2 UFID contains up to 64 bytes binary data
* but in our case it will be a '\0'
* terminated string */
char
psz_ufid
[
64
];
int
j
=
0
;
int
max_size
=
p_ufid
->
identifier
().
size
()
<
63
?
p_ufid
->
identifier
().
size
()
:
63
;
while
(
j
<
max_size
)
psz_ufid
[
j
]
=
p_ufid
->
identifier
()[
j
++
];
psz_ufid
[
j
]
=
'\0'
;
vlc_meta_SetTrackID
(
p_meta
,
psz_ufid
);
}
}
// Get the use text
list
=
tag
->
frameListMap
()[
"TXXX"
];
for
(
iter
=
list
.
begin
();
iter
!=
list
.
end
();
iter
++
)
{
ID3v2
::
UserTextIdentificationFrame
*
p_txxx
=
dynamic_cast
<
ID3v2
::
UserTextIdentificationFrame
*>
(
*
iter
);
vlc_meta_AddExtra
(
p_meta
,
p_txxx
->
description
().
toCString
(
true
),
p_txxx
->
fieldList
().
toString
().
toCString
(
true
)
);
}
// Get some more informations
#define SET( tagName, metaName ) \
list = tag->frameListMap()[tagName]; \
if( !list.isEmpty() ) \
vlc_meta_Set##metaName( p_meta, \
(*list.begin())->toString().toCString( true ) );
SET
(
"TCOP"
,
Copyright
);
SET
(
"TENC"
,
EncodedBy
);
SET
(
"TLAN"
,
Language
);
SET
(
"TPUB"
,
Publisher
);
#undef SET
return
VLC_SUCCESS
;
}
/**
* Read the meta informations from XiphComments
* @param tag: the Xiph Comment
* @param p_meta: the meta
* @return VLC_SUCCESS if everything goes ok
*/
static
int
ReadMetaFromXiph
(
Ogg
::
XiphComment
*
tag
,
vlc_meta_t
*
p_meta
)
{
#define SET( keyName, metaName ) \
StringList list = tag->fieldListMap()[keyName]; \
if( !list.isEmpty() ) \
vlc_meta_Set##metaName( p_meta, (*list.begin()).toCString( true ) );
SET
(
"COPYRIGHT"
,
Copyright
);
#undef SET
return
VLC_SUCCESS
;
}
...
...
@@ -413,45 +362,42 @@ static int ReadMeta( vlc_object_t* p_this)
if
(
FLAC
::
File
*
flac
=
dynamic_cast
<
FLAC
::
File
*>
(
f
.
file
())
)
{
if
(
flac
->
ID3v2Tag
()
)
ReadMetaFromId
2v2
(
flac
->
ID3v2Tag
()
,
p_meta
);
ReadMetaFromId
3v2
(
flac
->
ID3v2Tag
(),
p_demux
,
p_demux_meta
,
p_meta
);
else
if
(
flac
->
xiphComment
()
)
ReadMetaFromXiph
(
flac
->
xiphComment
(),
p_meta
);
ReadMetaFromXiph
(
flac
->
xiphComment
(),
p_
demux
,
p_demux_meta
,
p_
meta
);
}
else
if
(
MPC
::
File
*
mpc
=
dynamic_cast
<
MPC
::
File
*>
(
f
.
file
())
)
{
if
(
mpc
->
APETag
()
)
ReadMetaFromAPE
(
mpc
->
APETag
(),
p_meta
);
ReadMetaFromAPE
(
mpc
->
APETag
(),
p_
demux
,
p_demux_meta
,
p_
meta
);
}
else
if
(
MPEG
::
File
*
mpeg
=
dynamic_cast
<
MPEG
::
File
*>
(
f
.
file
())
)
{
if
(
mpeg
->
ID3v2Tag
()
)
ReadMetaFromId
2v2
(
mpeg
->
ID3v2Tag
()
,
p_meta
);
ReadMetaFromId
3v2
(
mpeg
->
ID3v2Tag
(),
p_demux
,
p_demux_meta
,
p_meta
);
else
if
(
mpeg
->
APETag
()
)
ReadMetaFromAPE
(
mpeg
->
APETag
(),
p_meta
);
ReadMetaFromAPE
(
mpeg
->
APETag
(),
p_
demux
,
p_demux_meta
,
p_
meta
);
}
else
if
(
Ogg
::
File
*
ogg
=
dynamic_cast
<
Ogg
::
File
*>
(
f
.
file
())
)
{
if
(
Ogg
::
FLAC
::
File
*
ogg_flac
=
dynamic_cast
<
Ogg
::
FLAC
::
File
*>
(
f
.
file
()))
ReadMetaFromXiph
(
ogg_flac
->
tag
(),
p_meta
);
ReadMetaFromXiph
(
ogg_flac
->
tag
(),
p_
demux
,
p_demux_meta
,
p_
meta
);
else
if
(
Ogg
::
Speex
::
File
*
ogg_speex
=
dynamic_cast
<
Ogg
::
Speex
::
File
*>
(
f
.
file
())
)
ReadMetaFromXiph
(
ogg_speex
->
tag
(),
p_meta
);
ReadMetaFromXiph
(
ogg_speex
->
tag
(),
p_
demux
,
p_demux_meta
,
p_
meta
);
else
if
(
Ogg
::
Vorbis
::
File
*
ogg_vorbis
=
dynamic_cast
<
Ogg
::
Vorbis
::
File
*>
(
f
.
file
())
)
ReadMetaFromXiph
(
ogg_vorbis
->
tag
(),
p_meta
);
ReadMetaFromXiph
(
ogg_vorbis
->
tag
(),
p_
demux
,
p_demux_meta
,
p_
meta
);
}
else
if
(
TrueAudio
::
File
*
trueaudio
=
dynamic_cast
<
TrueAudio
::
File
*>
(
f
.
file
())
)
{
if
(
trueaudio
->
ID3v2Tag
()
)
ReadMetaFromId
2v2
(
trueaudio
->
ID3v2Tag
()
,
p_meta
);
ReadMetaFromId
3v2
(
trueaudio
->
ID3v2Tag
(),
p_demux
,
p_demux_meta
,
p_meta
);
}
else
if
(
WavPack
::
File
*
wavpack
=
dynamic_cast
<
WavPack
::
File
*>
(
f
.
file
())
)
{
if
(
wavpack
->
APETag
()
)
ReadMetaFromAPE
(
wavpack
->
APETag
(),
p_meta
);
ReadMetaFromAPE
(
wavpack
->
APETag
(),
p_
demux
,
p_demux_meta
,
p_
meta
);
}
// Try now to find a image
DetectImage
(
f
,
p_demux
);
return
VLC_SUCCESS
;
}
...
...
@@ -461,9 +407,8 @@ static int ReadMeta( vlc_object_t* p_this)
* Write meta informations to APE tags
* @param tag: the APE tag
* @param p_item: the input item
* @return VLC_SUCCESS if everything goes ok
*/
static
int
WriteMetaToAPE
(
APE
::
Tag
*
tag
,
input_item_t
*
p_item
)
static
void
WriteMetaToAPE
(
APE
::
Tag
*
tag
,
input_item_t
*
p_item
)
{
char
*
psz_meta
;
#define WRITE( metaName, keyName ) \
...
...
@@ -481,8 +426,6 @@ static int WriteMetaToAPE( APE::Tag* tag, input_item_t* p_item )
WRITE
(
Publisher
,
"PUBLISHER"
);
#undef WRITE
return
VLC_SUCCESS
;
}
...
...
@@ -491,9 +434,8 @@ static int WriteMetaToAPE( APE::Tag* tag, input_item_t* p_item )
* Write meta information to id3v2 tags
* @param tag: the id3v2 tag
* @param p_input: the input item
* @return VLC_SUCCESS if everything goes ok
*/
static
int
WriteMetaToId2
v2
(
ID3v2
::
Tag
*
tag
,
input_item_t
*
p_item
)
static
void
WriteMetaToId3
v2
(
ID3v2
::
Tag
*
tag
,
input_item_t
*
p_item
)
{
char
*
psz_meta
;
#define WRITE( metaName, tagName ) \
...
...
@@ -515,7 +457,6 @@ static int WriteMetaToId2v2( ID3v2::Tag* tag, input_item_t* p_item )
WRITE
(
Publisher
,
"TPUB"
);
#undef WRITE
return
VLC_SUCCESS
;
}
...
...
@@ -524,9 +465,8 @@ static int WriteMetaToId2v2( ID3v2::Tag* tag, input_item_t* p_item )
* Write the meta informations to XiphComments
* @param tag: the Xiph Comment
* @param p_input: the input item
* @return VLC_SUCCESS if everything goes ok
*/
static
int
WriteMetaToXiph
(
Ogg
::
XiphComment
*
tag
,
input_item_t
*
p_item
)
static
void
WriteMetaToXiph
(
Ogg
::
XiphComment
*
tag
,
input_item_t
*
p_item
)
{
char
*
psz_meta
;
#define WRITE( metaName, keyName ) \
...
...
@@ -542,7 +482,6 @@ static int WriteMetaToXiph( Ogg::XiphComment* tag, input_item_t* p_item )
WRITE
(
Copyright
,
"COPYRIGHT"
);
#undef WRITE
return
VLC_SUCCESS
;
}
...
...
@@ -625,7 +564,7 @@ static int WriteMeta( vlc_object_t *p_this )
if
(
FLAC
::
File
*
flac
=
dynamic_cast
<
FLAC
::
File
*>
(
f
.
file
())
)
{
if
(
flac
->
ID3v2Tag
()
)
WriteMetaToId
2
v2
(
flac
->
ID3v2Tag
(),
p_item
);
WriteMetaToId
3
v2
(
flac
->
ID3v2Tag
(),
p_item
);
else
if
(
flac
->
xiphComment
()
)
WriteMetaToXiph
(
flac
->
xiphComment
(),
p_item
);
}
...
...
@@ -637,7 +576,7 @@ static int WriteMeta( vlc_object_t *p_this )
else
if
(
MPEG
::
File
*
mpeg
=
dynamic_cast
<
MPEG
::
File
*>
(
f
.
file
())
)
{
if
(
mpeg
->
ID3v2Tag
()
)
WriteMetaToId
2
v2
(
mpeg
->
ID3v2Tag
(),
p_item
);
WriteMetaToId
3
v2
(
mpeg
->
ID3v2Tag
(),
p_item
);
else
if
(
mpeg
->
APETag
()
)
WriteMetaToAPE
(
mpeg
->
APETag
(),
p_item
);
}
...
...
@@ -653,7 +592,7 @@ static int WriteMeta( vlc_object_t *p_this )
else
if
(
TrueAudio
::
File
*
trueaudio
=
dynamic_cast
<
TrueAudio
::
File
*>
(
f
.
file
())
)
{
if
(
trueaudio
->
ID3v2Tag
()
)
WriteMetaToId
2
v2
(
trueaudio
->
ID3v2Tag
(),
p_item
);
WriteMetaToId
3
v2
(
trueaudio
->
ID3v2Tag
(),
p_item
);
}
else
if
(
WavPack
::
File
*
wavpack
=
dynamic_cast
<
WavPack
::
File
*>
(
f
.
file
())
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment