Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
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-1.1
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