00001
00002
00003 #include "metaiooggvorbis.h"
00004 #include "metadata.h"
00005 #include "musicutils.h"
00006
00007
00008 #include <mythcontext.h>
00009
00010 MetaIOOggVorbis::MetaIOOggVorbis(void)
00011 : MetaIOTagLib()
00012 {
00013 }
00014
00015 MetaIOOggVorbis::~MetaIOOggVorbis(void)
00016 {
00017 }
00018
00025 TagLib::Ogg::Vorbis::File *MetaIOOggVorbis::OpenFile(const QString &filename)
00026 {
00027 QByteArray fname = filename.toLocal8Bit();
00028 TagLib::Ogg::Vorbis::File *oggfile =
00029 new TagLib::Ogg::Vorbis::File(fname.constData());
00030
00031 if (!oggfile->isOpen())
00032 {
00033 delete oggfile;
00034 oggfile = NULL;
00035 }
00036
00037 return oggfile;
00038 }
00039
00040
00044 bool MetaIOOggVorbis::write(const Metadata* mdata)
00045 {
00046 if (!mdata)
00047 return false;
00048
00049 TagLib::Ogg::Vorbis::File *oggfile = OpenFile(mdata->Filename());
00050
00051 if (!oggfile)
00052 return false;
00053
00054 TagLib::Ogg::XiphComment *tag = oggfile->tag();
00055
00056 if (!tag)
00057 {
00058 delete oggfile;
00059 return false;
00060 }
00061
00062 WriteGenericMetadata(tag, mdata);
00063
00064
00065 if (mdata->Compilation())
00066 {
00067 tag->addField("MUSICBRAINZ_ALBUMARTISTID",
00068 MYTH_MUSICBRAINZ_ALBUMARTIST_UUID, true);
00069 tag->addField("COMPILATION_ARTIST",
00070 QStringToTString(mdata->CompilationArtist()), true);
00071 }
00072 else
00073 {
00074
00075 if (tag->contains("MUSICBRAINZ_ALBUMARTISTID") &&
00076 (tag->fieldListMap()["MUSICBRAINZ_ALBUMARTISTID"].toString() ==
00077 MYTH_MUSICBRAINZ_ALBUMARTIST_UUID))
00078 {
00079 tag->removeField("MUSICBRAINZ_ALBUMARTISTID");
00080 }
00081 tag->removeField("COMPILATION_ARTIST");
00082 }
00083
00084 bool result = oggfile->save();
00085
00086 if (oggfile)
00087 delete oggfile;
00088
00089 return (result);
00090 }
00091
00095 Metadata* MetaIOOggVorbis::read(const QString &filename)
00096 {
00097 TagLib::Ogg::Vorbis::File *oggfile = OpenFile(filename);
00098
00099 if (!oggfile)
00100 return NULL;
00101
00102 TagLib::Ogg::XiphComment *tag = oggfile->tag();
00103
00104 if (!tag)
00105 {
00106 delete oggfile;
00107 return NULL;
00108 }
00109
00110 Metadata *metadata = new Metadata(filename);
00111
00112 ReadGenericMetadata(tag, metadata);
00113
00114 bool compilation = false;
00115
00116 if (tag->contains("COMPILATION_ARTIST"))
00117 {
00118 QString compilation_artist = TStringToQString(
00119 tag->fieldListMap()["COMPILATION_ARTIST"].toString()).trimmed();
00120 if (compilation_artist != metadata->Artist())
00121 {
00122 metadata->setCompilationArtist(compilation_artist);
00123 compilation = true;
00124 }
00125 }
00126
00127 if (!compilation && tag->contains("MUSICBRAINZ_ALBUMARTISTID"))
00128 {
00129 QString musicbrainzcode = TStringToQString(
00130 tag->fieldListMap()["MUSICBRAINZ_ALBUMARTISTID"].toString()).trimmed();
00131 if (musicbrainzcode == MYTH_MUSICBRAINZ_ALBUMARTIST_UUID)
00132 compilation = true;
00133 }
00134
00135 metadata->setCompilation(compilation);
00136
00137 if (metadata->Length() <= 0)
00138 metadata->setLength(getTrackLength(oggfile));
00139 else
00140 delete oggfile;
00141
00142 return metadata;
00143 }