00001
00002
00003 #include <mythcontext.h>
00004
00005
00006 #include <xiphcomment.h>
00007
00008
00009 #include "metaioflacvorbis.h"
00010 #include "metadata.h"
00011 #include "musicutils.h"
00012
00013 MetaIOFLACVorbis::MetaIOFLACVorbis(void)
00014 : MetaIOTagLib()
00015 {
00016 }
00017
00018 MetaIOFLACVorbis::~MetaIOFLACVorbis(void)
00019 {
00020 }
00021
00028 TagLib::FLAC::File *MetaIOFLACVorbis::OpenFile(const QString &filename)
00029 {
00030 QByteArray fname = filename.toLocal8Bit();
00031 TagLib::FLAC::File *flacfile =
00032 new TagLib::FLAC::File(fname.constData());
00033
00034 if (!flacfile->isOpen())
00035 {
00036 delete flacfile;
00037 flacfile = NULL;
00038 }
00039
00040 return flacfile;
00041 }
00042
00043
00047 bool MetaIOFLACVorbis::write(const Metadata* mdata)
00048 {
00049 if (!mdata)
00050 return false;
00051
00052 TagLib::FLAC::File *flacfile = OpenFile(mdata->Filename());
00053
00054 if (!flacfile)
00055 return false;
00056
00057 TagLib::Ogg::XiphComment *tag = flacfile->xiphComment(true);
00058
00059 if (!tag)
00060 {
00061 delete flacfile;
00062 return false;
00063 }
00064
00065 WriteGenericMetadata(tag, mdata);
00066
00067
00068 if (mdata->Compilation())
00069 {
00070 tag->addField("MUSICBRAINZ_ALBUMARTISTID",
00071 MYTH_MUSICBRAINZ_ALBUMARTIST_UUID, true);
00072 tag->addField("COMPILATION_ARTIST",
00073 QStringToTString(mdata->CompilationArtist()), true);
00074 }
00075 else
00076 {
00077
00078 if (tag->contains("MUSICBRAINZ_ALBUMARTISTID") &&
00079 (tag->fieldListMap()["MUSICBRAINZ_ALBUMARTISTID"].toString() ==
00080 MYTH_MUSICBRAINZ_ALBUMARTIST_UUID))
00081 {
00082 tag->removeField("MUSICBRAINZ_ALBUMARTISTID");
00083 }
00084 tag->removeField("COMPILATION_ARTIST");
00085 }
00086
00087 bool result = flacfile->save();
00088
00089 if (flacfile)
00090 delete flacfile;
00091
00092 return (result);
00093 }
00094
00098 Metadata* MetaIOFLACVorbis::read(const QString &filename)
00099 {
00100 TagLib::FLAC::File *flacfile = OpenFile(filename);
00101
00102 if (!flacfile)
00103 return NULL;
00104
00105 TagLib::Ogg::XiphComment *tag = flacfile->xiphComment();
00106
00107 if (!tag)
00108 {
00109 delete flacfile;
00110 return NULL;
00111 }
00112
00113 Metadata *metadata = new Metadata(filename);
00114
00115 ReadGenericMetadata(tag, metadata);
00116
00117 bool compilation = false;
00118
00119 if (tag->contains("COMPILATION_ARTIST"))
00120 {
00121 QString compilation_artist = TStringToQString(
00122 tag->fieldListMap()["COMPILATION_ARTIST"].toString()).trimmed();
00123 if (compilation_artist != metadata->Artist())
00124 {
00125 metadata->setCompilationArtist(compilation_artist);
00126 compilation = true;
00127 }
00128 }
00129
00130 if (!compilation && tag->contains("MUSICBRAINZ_ALBUMARTISTID"))
00131 {
00132 QString musicbrainzcode = TStringToQString(
00133 tag->fieldListMap()["MUSICBRAINZ_ALBUMARTISTID"].toString()).trimmed();
00134 if (musicbrainzcode == MYTH_MUSICBRAINZ_ALBUMARTIST_UUID)
00135 compilation = true;
00136 }
00137
00138 metadata->setCompilation(compilation);
00139
00140 if (metadata->Length() <= 0)
00141 metadata->setLength(getTrackLength(flacfile));
00142
00143 delete flacfile;
00144
00145 return metadata;
00146 }
00147
00148 bool MetaIOFLACVorbis::TagExists(const QString &filename)
00149 {
00150 TagLib::FLAC::File *flacfile = OpenFile(filename);
00151
00152 if (!flacfile)
00153 return false;
00154
00155 TagLib::Ogg::XiphComment *tag = flacfile->xiphComment(false);
00156
00157 bool retval = false;
00158 if (tag && !tag->isEmpty())
00159 retval = true;
00160
00161 delete flacfile;
00162
00163 return retval;
00164 }