MythTV  master
metaiowavpack.cpp
Go to the documentation of this file.
1 #include <cmath>
2 
3 #include <QtGlobal> // before taglib includes
4 
5 #include <apetag.h>
6 #include <apeitem.h>
7 
8 // libmythmetadata
9 #include "metaiowavpack.h"
10 #include "musicmetadata.h"
11 #include "musicutils.h"
12 
19 TagLib::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 
37 bool 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 }
MetaIOTagLib::WriteGenericMetadata
static void WriteGenericMetadata(TagLib::Tag *tag, const MusicMetadata *metadata)
Writes metadata common to all tag formats to the tag.
Definition: metaiotaglib.cpp:24
MusicMetadata::CompilationArtist
QString CompilationArtist() const
Definition: musicmetadata.h:137
MetaIOWavPack::OpenFile
static TagLib::WavPack::File * OpenFile(const QString &filename)
Open the file to read the tag.
Definition: metaiowavpack.cpp:19
MetaIO::m_filename
QString m_filename
Definition: metaio.h:168
MusicMetadata
Definition: musicmetadata.h:80
musicutils.h
MetaIOTagLib::getTrackLength
static std::chrono::milliseconds getTrackLength(TagLib::File *file)
Find the length of the track (in milliseconds)
Definition: metaiotaglib.cpp:89
MetaIOTagLib::ReadGenericMetadata
void ReadGenericMetadata(TagLib::Tag *tag, MusicMetadata *metadata)
Writes metadata common to all tag formats to the tag.
Definition: metaiotaglib.cpp:54
MetaIO::restoreTimeStamps
void restoreTimeStamps(void)
Definition: metaio.cpp:232
MetaIOWavPack::write
bool write(const QString &filename, MusicMetadata *mdata) override
Writes all metadata back to a file.
Definition: metaiowavpack.cpp:37
metaiowavpack.h
MetaIOWavPack::read
MusicMetadata * read(const QString &filename) override
Reads MusicMetadata from a file.
Definition: metaiowavpack.cpp:87
MusicMetadata::Compilation
bool Compilation() const
Definition: musicmetadata.h:251
build_compdb.filename
filename
Definition: build_compdb.py:21
musicmetadata.h
MetaIO::saveTimeStamps
void saveTimeStamps(void)
Definition: metaio.cpp:223