MythTV master
metaiotaglib.cpp
Go to the documentation of this file.
1// Std
2#include <cmath>
3
4// Libmyth
6
7// Taglib
8#include <taglib/audioproperties.h>
9#include <taglib/tag.h>
10#include <taglib/tstring.h>
11#include <taglib/fileref.h>
12
13// libmythmetadata
14#include "metaiotaglib.h"
15#include "musicmetadata.h"
16#include "musicutils.h"
17
24void MetaIOTagLib::WriteGenericMetadata(TagLib::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
54void MetaIOTagLib::ReadGenericMetadata(TagLib::Tag *tag, MusicMetadata *metadata)
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
89std::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
105std::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}
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 readFromFilename(const QString &filename, QString &artist, QString &album, QString &title, QString &genre, int &tracknum)
Reads MusicMetadata based on the folder/filename.
Definition: metaio.cpp:101
int Year() const
void setYear(int lyear)
void setGenre(const QString &lgenre)
QString Title() const
void setTitle(const QString &ltitle, const QString &ltitle_sort=nullptr)
int Track() const
QString Filename(bool find=true)
QString Artist() const
void setAlbum(const QString &lalbum, const QString &lalbum_sort=nullptr)
void setTrack(int ltrack)
QString Genre() const
QString Album() const
void setArtist(const QString &lartist, const QString &lartist_sort=nullptr)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39