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 #include "libmyth/mythcontext.h"
9 
10 // libmythmetadata
11 #include "metaiowavpack.h"
12 #include "musicmetadata.h"
13 #include "musicutils.h"
14 
21 TagLib::WavPack::File *MetaIOWavPack::OpenFile(const QString &filename)
22 {
23  QByteArray fname = filename.toLocal8Bit();
24  auto *wpfile = new TagLib::WavPack::File(fname.constData());
25 
26  if (!wpfile->isOpen())
27  {
28  delete wpfile;
29  wpfile = nullptr;
30  }
31 
32  return wpfile;
33 }
34 
35 
39 bool MetaIOWavPack::write(const QString &filename, MusicMetadata* mdata)
40 {
41  if (!mdata)
42  return false;
43 
44  if (filename.isEmpty())
45  return false;
46 
48 
49  TagLib::WavPack::File *wpfile = OpenFile(m_filename);
50 
51  if (!wpfile)
52  return false;
53 
54  TagLib::APE::Tag *tag = wpfile->APETag();
55 
56  if (!tag)
57  {
58  delete wpfile;
59  return false;
60  }
61 
62  WriteGenericMetadata(tag, mdata);
63 
64  // Compilation Artist ("Album artist")
65  if (mdata->Compilation())
66  {
67  TagLib::String key = "Album artist";
68  TagLib::APE::Item item = TagLib::APE::Item(key,
69  QStringToTString(mdata->CompilationArtist()));
70  tag->setItem(key, item);
71  }
72  else
73  tag->removeItem("Album artist");
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:138
MetaIOWavPack::OpenFile
static TagLib::WavPack::File * OpenFile(const QString &filename)
Open the file to read the tag.
Definition: metaiowavpack.cpp:21
MetaIO::m_filename
QString m_filename
Definition: metaio.h:182
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:224
MetaIOWavPack::write
bool write(const QString &filename, MusicMetadata *mdata) override
Writes all metadata back to a file.
Definition: metaiowavpack.cpp:39
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:252
mythcontext.h
build_compdb.filename
filename
Definition: build_compdb.py:21
musicmetadata.h
MetaIO::saveTimeStamps
void saveTimeStamps(void)
Definition: metaio.cpp:215