MythTV  master
metaiotaglib.cpp
Go to the documentation of this file.
1 // Std
2 #include <cmath>
3 
4 // Libmyth
6 
7 // Taglib
8 #include <audioproperties.h>
9 #include <tag.h>
10 #include <tstring.h>
11 #include <fileref.h>
12 
13 // libmythmetadata
14 #include "metaiotaglib.h"
15 #include "musicmetadata.h"
16 #include "musicutils.h"
17 
24 void MetaIOTagLib::WriteGenericMetadata(Tag *tag, const MusicMetadata *metadata)
25 {
26  if (!tag || !metadata)
27  return;
28 
29  if (!metadata->Artist().isEmpty())
30  tag->setArtist(QStringToTString(metadata->Artist()));
31 
32  if (!metadata->Title().isEmpty())
33  tag->setTitle(QStringToTString(metadata->Title()));
34 
35  if (!metadata->Album().isEmpty())
36  tag->setAlbum(QStringToTString(metadata->Album()));
37 
38  if (metadata->Year() > 999 && metadata->Year() < 10000) // 4 digit year.
39  tag->setYear(metadata->Year());
40 
41  if (!metadata->Genre().isEmpty())
42  tag->setGenre(QStringToTString(metadata->Genre()));
43 
44  if (0 != metadata->Track())
45  tag->setTrack(metadata->Track());
46 }
47 
55 {
56  if (!tag || ! metadata)
57  return;
58 
59  // Basic Tags
60  if (!tag->isEmpty())
61  {
62  metadata->setTitle(TStringToQString(tag->title()).trimmed());
63  metadata->setArtist(TStringToQString(tag->artist()).trimmed());
64  metadata->setAlbum(TStringToQString(tag->album()).trimmed());
65  metadata->setTrack(tag->track());
66  metadata->setYear(tag->year());
67  metadata->setGenre(TStringToQString(tag->genre()).trimmed());
68  }
69 
70  // Fallback to filename reading
71  if (metadata->Title().isEmpty())
72  readFromFilename(metadata);
73 
74  // If we don't have title and artist or don't have the length return nullptr
75  if (metadata->Title().isEmpty() && metadata->Artist().isEmpty())
76  {
77  LOG(VB_GENERAL, LOG_ERR,
78  QString("MetaIOTagLib: Failed to read metadata from '%1'")
79  .arg(metadata->Filename(false)));
80  }
81 }
82 
89 std::chrono::milliseconds MetaIOTagLib::getTrackLength(TagLib::File *file)
90 {
91  std::chrono::milliseconds milliseconds = 0ms;
92 
93  if (file && file->audioProperties())
94  milliseconds = std::chrono::milliseconds(file->audioProperties()->lengthInMilliseconds());
95 
96  return milliseconds;
97 }
98 
105 std::chrono::milliseconds MetaIOTagLib::getTrackLength(const QString &filename)
106 {
107  std::chrono::milliseconds milliseconds = 0ms;
108  QByteArray fname = filename.toLocal8Bit();
109  auto *file = new TagLib::FileRef(fname.constData());
110 
111  if (file && file->audioProperties())
112  milliseconds = std::chrono::milliseconds(file->audioProperties()->lengthInMilliseconds());
113 
114  // If we didn't get a valid length, add the metadata but show warning.
115  if (milliseconds <= 1s)
116  {
117  LOG(VB_GENERAL, LOG_ERR,
118  QString("MetaIOTagLib: Failed to read length "
119  "from '%1'. It may be corrupt.").arg(filename));
120  }
121 
122  delete file;
123 
124  return milliseconds;
125 }
MusicMetadata::Title
QString Title() const
Definition: musicmetadata.h:162
MusicMetadata::Filename
QString Filename(bool find=true)
Definition: musicmetadata.cpp:962
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::Genre
QString Genre() const
Definition: musicmetadata.h:175
MusicMetadata::setTrack
void setTrack(int ltrack)
Definition: musicmetadata.h:200
MusicMetadata::setAlbum
void setAlbum(const QString &lalbum, const QString &lalbum_sort=nullptr)
Definition: musicmetadata.h:152
MusicMetadata::Track
int Track() const
Definition: musicmetadata.h:199
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
MusicMetadata
Definition: musicmetadata.h:80
build_compdb.file
file
Definition: build_compdb.py:55
MusicMetadata::Artist
QString Artist() const
Definition: musicmetadata.h:126
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::readFromFilename
void readFromFilename(const QString &filename, QString &artist, QString &album, QString &title, QString &genre, int &tracknum)
Reads MusicMetadata based on the folder/filename.
Definition: metaio.cpp:95
mythlogging.h
MusicMetadata::setGenre
void setGenre(const QString &lgenre)
Definition: musicmetadata.h:176
MusicMetadata::setTitle
void setTitle(const QString &ltitle, const QString &ltitle_sort=nullptr)
Definition: musicmetadata.h:164
metaiotaglib.h
MusicMetadata::Album
QString Album() const
Definition: musicmetadata.h:150
MusicMetadata::setArtist
void setArtist(const QString &lartist, const QString &lartist_sort=nullptr)
Definition: musicmetadata.h:128
MusicMetadata::setYear
void setYear(int lyear)
Definition: musicmetadata.h:197
build_compdb.filename
filename
Definition: build_compdb.py:21
musicmetadata.h
MusicMetadata::Year
int Year() const
Definition: musicmetadata.h:196