00001
00002 #include <cmath>
00003
00004
00005 #include <mythlogging.h>
00006
00007
00008 #include <audioproperties.h>
00009 #include <tag.h>
00010 #include <tstring.h>
00011 #include <fileref.h>
00012
00013
00014 #include "metaiotaglib.h"
00015 #include "metadata.h"
00016 #include "musicutils.h"
00017
00018 MetaIOTagLib::MetaIOTagLib()
00019 : MetaIO()
00020 {
00021 }
00022
00023 MetaIOTagLib::~MetaIOTagLib(void)
00024 {
00025 }
00026
00033 void MetaIOTagLib::WriteGenericMetadata(Tag *tag, const Metadata *metadata)
00034 {
00035 if (!tag || !metadata)
00036 return;
00037
00038 if (!metadata->Artist().isEmpty())
00039 tag->setArtist(QStringToTString(metadata->Artist()));
00040
00041 if (!metadata->Title().isEmpty())
00042 tag->setTitle(QStringToTString(metadata->Title()));
00043
00044 if (!metadata->Album().isEmpty())
00045 tag->setAlbum(QStringToTString(metadata->Album()));
00046
00047 if (metadata->Year() > 999 && metadata->Year() < 10000)
00048 tag->setYear(metadata->Year());
00049
00050 if (!metadata->Genre().isEmpty())
00051 tag->setGenre(QStringToTString(metadata->Genre()));
00052
00053 if (0 != metadata->Track())
00054 tag->setTrack(metadata->Track());
00055 }
00056
00063 void MetaIOTagLib::ReadGenericMetadata(Tag *tag, Metadata *metadata)
00064 {
00065
00066 if (metadata && tag && !tag->isEmpty())
00067 {
00068 metadata->setTitle(TStringToQString(tag->title()).trimmed());
00069 metadata->setArtist(TStringToQString(tag->artist()).trimmed());
00070 metadata->setAlbum(TStringToQString(tag->album()).trimmed());
00071 metadata->setTrack(tag->track());
00072 metadata->setYear(tag->year());
00073 metadata->setGenre(TStringToQString(tag->genre()).trimmed());
00074 }
00075
00076
00077 if (metadata->Title().isEmpty())
00078 readFromFilename(metadata);
00079
00080
00081 if (metadata->Title().isEmpty() && metadata->Artist().isEmpty())
00082 {
00083 LOG(VB_GENERAL, LOG_ERR,
00084 QString("MetaIOTagLib: Failed to read metadata from '%1'")
00085 .arg(metadata->Filename()));
00086 }
00087 }
00088
00095 int MetaIOTagLib::getTrackLength(TagLib::File *file)
00096 {
00097 int milliseconds = 0;
00098
00099 if (file && file->audioProperties())
00100 milliseconds = file->audioProperties()->length() * 1000;
00101
00102 return milliseconds;
00103 }
00104
00111 int MetaIOTagLib::getTrackLength(const QString &filename)
00112 {
00113 int milliseconds = 0;
00114 QByteArray fname = filename.toLocal8Bit();
00115 TagLib::FileRef *file = new TagLib::FileRef(fname.constData());
00116
00117 if (file && file->audioProperties())
00118 milliseconds = file->audioProperties()->length() * 1000;
00119
00120
00121 if (milliseconds <= 1000)
00122 LOG(VB_GENERAL, LOG_ERR,
00123 QString("MetaIOTagLib: Failed to read length "
00124 "from '%1'. It may be corrupt.").arg(filename));
00125
00126 delete file;
00127
00128 return milliseconds;
00129 }