2 Copyright (C) 2008 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "ardour/audiofile_tagger.h"
23 #include "ardour/session_metadata.h"
25 #include "pbd/convert.h"
27 #include "taglib/fileref.h"
28 #include "taglib/flacfile.h"
29 #include "taglib/oggfile.h"
30 #include "taglib/tag.h"
31 #include "taglib/taglib.h"
32 #include "taglib/xiphcomment.h"
34 /* Convert string to TagLib::String */
35 #define TL_STR(string) TagLib::String ((string).c_str(), TagLib::String::UTF8)
43 AudiofileTagger::tag_file (string
const & filename
, SessionMetadata
const & metadata
)
45 TagLib::FileRef
file (filename
.c_str());
46 TagLib::Tag
& tag (*file
.tag());
48 tag_generic (tag
, metadata
);
52 TagLib::FLAC::File
* flac_file
;
53 if ((flac_file
= dynamic_cast<TagLib::FLAC::File
*> (file
.file()))) {
54 TagLib::Ogg::XiphComment
* vorbis_tag
;
55 if ((vorbis_tag
= dynamic_cast<TagLib::Ogg::XiphComment
*> (flac_file
->xiphComment (true)))) {
56 tag_vorbis_comment (*vorbis_tag
, metadata
);
58 std::cerr
<< "Could not get Xiph comment for FLAC file!" << std::endl
;
64 TagLib::Ogg::File
* ogg_file
;
65 if ((ogg_file
= dynamic_cast<TagLib::Ogg::File
*> (file
.file()))) {
66 TagLib::Ogg::XiphComment
* vorbis_tag
;
67 if ((vorbis_tag
= dynamic_cast<TagLib::Ogg::XiphComment
*> (ogg_file
->tag()))) {
68 tag_vorbis_comment (*vorbis_tag
, metadata
);
70 std::cerr
<< "Could not get Xiph comment for Ogg file!" << std::endl
;
79 AudiofileTagger::tag_generic (TagLib::Tag
& tag
, SessionMetadata
const & metadata
)
81 tag
.setTitle (TL_STR(metadata
.title()));
82 tag
.setArtist (TL_STR(metadata
.artist()));
83 tag
.setAlbum (TL_STR(metadata
.album()));
84 tag
.setComment (TL_STR(metadata
.comment()));
85 tag
.setGenre (TL_STR(metadata
.genre()));
86 tag
.setYear (metadata
.year());
87 tag
.setTrack (metadata
.track_number());
93 AudiofileTagger::tag_vorbis_comment (TagLib::Ogg::XiphComment
& tag
, SessionMetadata
const & metadata
)
95 tag
.addField ("COPYRIGHT", TL_STR(metadata
.copyright()));
96 tag
.addField ("ISRC", TL_STR(metadata
.isrc()));
97 tag
.addField ("GROUPING ", TL_STR(metadata
.grouping()));
98 tag
.addField ("SUBTITLE", TL_STR(metadata
.subtitle()));
99 tag
.addField ("ALBUMARTIST", TL_STR(metadata
.album_artist()));
100 tag
.addField ("LYRICIST", TL_STR(metadata
.lyricist()));
101 tag
.addField ("COMPOSER", TL_STR(metadata
.composer()));
102 tag
.addField ("CONDUCTOR", TL_STR(metadata
.conductor()));
103 tag
.addField ("REMIXER", TL_STR(metadata
.remixer()));
104 tag
.addField ("ARRANGER", TL_STR(metadata
.arranger()));
105 tag
.addField ("ENGINEER", TL_STR(metadata
.engineer()));
106 tag
.addField ("PRODUCER", TL_STR(metadata
.producer()));
107 tag
.addField ("DJMIXER", TL_STR(metadata
.dj_mixer()));
108 tag
.addField ("MIXER", TL_STR(metadata
.mixer()));
109 tag
.addField ("COMPILATION", TL_STR(metadata
.compilation()));
110 tag
.addField ("DISCSUBTITLE", TL_STR(metadata
.disc_subtitle()));
111 tag
.addField ("DISCNUMBER", to_string (metadata
.disc_number(), std::dec
));
113 // No field for total discs or tracks
119 } // namespace ARDOUR