MythTV master
metaiowavpack.cpp
Go to the documentation of this file.
1#include <cmath>
2
3#include <QtGlobal> // before taglib includes
4
5#include <taglib/apetag.h>
6#include <taglib/apeitem.h>
7
8// libmythmetadata
9#include "metaiowavpack.h"
10#include "musicmetadata.h"
11#include "musicutils.h"
12
19TagLib::WavPack::File *MetaIOWavPack::OpenFile(const QString &filename)
20{
21 QByteArray fname = filename.toLocal8Bit();
22 auto *wpfile = new TagLib::WavPack::File(fname.constData());
23
24 if (!wpfile->isOpen())
25 {
26 delete wpfile;
27 wpfile = nullptr;
28 }
29
30 return wpfile;
31}
32
33
37bool MetaIOWavPack::write(const QString &filename, MusicMetadata* mdata)
38{
39 if (!mdata)
40 return false;
41
42 if (filename.isEmpty())
43 return false;
44
46
47 TagLib::WavPack::File *wpfile = OpenFile(m_filename);
48
49 if (!wpfile)
50 return false;
51
52 TagLib::APE::Tag *tag = wpfile->APETag();
53
54 if (!tag)
55 {
56 delete wpfile;
57 return false;
58 }
59
60 WriteGenericMetadata(tag, mdata);
61
62 // Compilation Artist ("Album artist")
63 if (mdata->Compilation())
64 {
65 TagLib::String key = "Album artist";
66 TagLib::APE::Item item = TagLib::APE::Item(key,
67 QStringToTString(mdata->CompilationArtist()));
68 tag->setItem(key, item);
69 }
70 else
71 {
72 tag->removeItem("Album artist");
73 }
74
76 bool result = wpfile->save();
78
79 delete wpfile;
80
81 return (result);
82}
83
88{
89 TagLib::WavPack::File *wpfile = OpenFile(filename);
90
91 if (!wpfile)
92 return nullptr;
93
94 TagLib::APE::Tag *tag = wpfile->APETag();
95
96 if (!tag)
97 {
98 delete wpfile;
99 return nullptr;
100 }
101
102 auto *metadata = new MusicMetadata(filename);
103
104 ReadGenericMetadata(tag, metadata);
105
106 bool compilation = false;
107
108 // Compilation Artist ("Album artist")
109 if(tag->itemListMap().contains("Album artist"))
110 {
111 compilation = true;
112 QString compilation_artist = TStringToQString(
113 tag->itemListMap()["Album artist"].toString()).trimmed();
114 metadata->setCompilationArtist(compilation_artist);
115 }
116
117 metadata->setCompilation(compilation);
118
119 if (metadata->Length() <= 0ms)
120 metadata->setLength(getTrackLength(wpfile));
121
122 delete wpfile;
123
124 return metadata;
125}
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.
bool write(const QString &filename, MusicMetadata *mdata) override
Writes all metadata back to a file.
MusicMetadata * read(const QString &filename) override
Reads MusicMetadata from a file.
static TagLib::WavPack::File * OpenFile(const QString &filename)
Open the file to read 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