MythTV master
metaiooggopus.cpp
Go to the documentation of this file.
1
2// libmythmetadata
3#include "metaiooggopus.h"
4#include "musicmetadata.h"
5#include "musicutils.h"
6
13TagLib::Ogg::Opus::File *MetaIOOggOpus::OpenFile(const QString &filename)
14{
15 QByteArray fname = filename.toLocal8Bit();
16 auto *opusfile = new TagLib::Ogg::Opus::File(fname.constData());
17
18 if (!opusfile->isOpen())
19 {
20 delete opusfile;
21 opusfile = nullptr;
22 }
23
24 return opusfile;
25}
26
27
31bool MetaIOOggOpus::write(const QString &filename, MusicMetadata* mdata)
32{
33 if (!mdata)
34 return false;
35
36 if (filename.isEmpty())
37 return false;
38
40
41 TagLib::Ogg::Opus::File *opusfile = OpenFile(m_filename);
42
43 if (!opusfile)
44 return false;
45
46 TagLib::Ogg::XiphComment *tag = opusfile->tag();
47
48 if (!tag)
49 {
50 delete opusfile;
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 = opusfile->save();
79
80 delete opusfile;
81
82 return result;
83}
84
89{
90 TagLib::Ogg::Opus::File *opusfile = OpenFile(filename);
91
92 if (!opusfile)
93 return nullptr;
94
95 TagLib::Ogg::XiphComment *tag = opusfile->tag();
96
97 if (!tag)
98 {
99 delete opusfile;
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(opusfile));
132
133 delete opusfile;
134
135 return metadata;
136}
bool write(const QString &filename, MusicMetadata *mdata) override
Writes all metadata back to a file.
static TagLib::Ogg::Opus::File * OpenFile(const QString &filename)
Open the file to read the tag.
MusicMetadata * read(const QString &filename) override
Reads MusicMetadata from 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:243
void saveTimeStamps(void)
Definition: metaio.cpp:234
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