MythTV master
metaiooggvorbis.cpp
Go to the documentation of this file.
1
2// libmythmetadata
3#include "metaiooggvorbis.h"
4#include "musicmetadata.h"
5#include "musicutils.h"
6
13TagLib::Ogg::Vorbis::File *MetaIOOggVorbis::OpenFile(const QString &filename)
14{
15 QByteArray fname = filename.toLocal8Bit();
16 auto *oggfile = new TagLib::Ogg::Vorbis::File(fname.constData());
17
18 if (!oggfile->isOpen())
19 {
20 delete oggfile;
21 oggfile = nullptr;
22 }
23
24 return oggfile;
25}
26
27
31bool MetaIOOggVorbis::write(const QString &filename, MusicMetadata* mdata)
32{
33 if (!mdata)
34 return false;
35
37
38 if (m_filename.isEmpty())
39 return false;
40
41 TagLib::Ogg::Vorbis::File *oggfile = OpenFile(m_filename);
42
43 if (!oggfile)
44 return false;
45
46 TagLib::Ogg::XiphComment *tag = oggfile->tag();
47
48 if (!tag)
49 {
50 delete oggfile;
51 return false;
52 }
53
54 WriteGenericMetadata(tag, mdata);
55
56 // Compilation
57 if (mdata->Compilation())
58 {
59 tag->addField("MUSICBRAINZ_ALBUMARTISTID",
61 tag->addField("COMPILATION_ARTIST",
62 QStringToTString(mdata->CompilationArtist()), true);
63 }
64 else
65 {
66 // Don't remove the musicbrainz field unless it indicated a compilation
67 if (tag->contains("MUSICBRAINZ_ALBUMARTISTID") &&
68 (tag->fieldListMap()["MUSICBRAINZ_ALBUMARTISTID"].toString() ==
70 {
71 tag->removeFields("MUSICBRAINZ_ALBUMARTISTID");
72 }
73 tag->removeFields("COMPILATION_ARTIST");
74 }
75
77 bool result = oggfile->save();
79
80 delete oggfile;
81
82 return (result);
83}
84
89{
90 TagLib::Ogg::Vorbis::File *oggfile = OpenFile(filename);
91
92 if (!oggfile)
93 return nullptr;
94
95 TagLib::Ogg::XiphComment *tag = oggfile->tag();
96
97 if (!tag)
98 {
99 delete oggfile;
100 return nullptr;
101 }
102
103 auto *metadata = new MusicMetadata(filename);
104
105 ReadGenericMetadata(tag, metadata);
106
107 bool compilation = false;
108
109 if (tag->contains("COMPILATION_ARTIST"))
110 {
111 QString compilation_artist = TStringToQString(
112 tag->fieldListMap()["COMPILATION_ARTIST"].toString()).trimmed();
113 if (compilation_artist != metadata->Artist())
114 {
115 metadata->setCompilationArtist(compilation_artist);
116 compilation = true;
117 }
118 }
119
120 if (!compilation && tag->contains("MUSICBRAINZ_ALBUMARTISTID"))
121 {
122 QString musicbrainzcode = TStringToQString(
123 tag->fieldListMap()["MUSICBRAINZ_ALBUMARTISTID"].toString()).trimmed();
124 if (musicbrainzcode == MYTH_MUSICBRAINZ_ALBUMARTIST_UUID)
125 compilation = true;
126 }
127
128 metadata->setCompilation(compilation);
129
130 if (metadata->Length() <= 0ms)
131 metadata->setLength(getTrackLength(oggfile));
132
133 delete oggfile;
134
135 return metadata;
136}
MusicMetadata * read(const QString &filename) override
Reads MusicMetadata from a file.
static TagLib::Ogg::Vorbis::File * OpenFile(const QString &filename)
Open the file to read the tag.
bool write(const QString &filename, MusicMetadata *mdata) override
Writes all metadata back to a file.
static void WriteGenericMetadata(TagLib::Tag *tag, const MusicMetadata *metadata)
Writes metadata common to all tag formats to the tag.
static std::chrono::milliseconds getTrackLength(TagLib::File *file)
Find the length of the track (in milliseconds)
void ReadGenericMetadata(TagLib::Tag *tag, MusicMetadata *metadata)
Writes metadata common to all tag formats to the tag.
void restoreTimeStamps(void)
Definition: metaio.cpp:232
void saveTimeStamps(void)
Definition: metaio.cpp:223
QString m_filename
Definition: metaio.h:168
QString CompilationArtist() const
bool Compilation() const
static constexpr const char * MYTH_MUSICBRAINZ_ALBUMARTIST_UUID
Definition: metaio.h:15