aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/vorbis/vorbismetadatamodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/vorbis/vorbismetadatamodel.cpp')
-rw-r--r--src/plugins/Input/vorbis/vorbismetadatamodel.cpp167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/plugins/Input/vorbis/vorbismetadatamodel.cpp b/src/plugins/Input/vorbis/vorbismetadatamodel.cpp
new file mode 100644
index 000000000..71b8d2de7
--- /dev/null
+++ b/src/plugins/Input/vorbis/vorbismetadatamodel.cpp
@@ -0,0 +1,167 @@
+/***************************************************************************
+ * Copyright (C) 2009 by Ilya Kotov *
+ * forkotov02@hotmail.ru *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include <taglib/tag.h>
+#include <taglib/fileref.h>
+#include <taglib/vorbisfile.h>
+#include <taglib/xiphcomment.h>
+#include <taglib/tmap.h>
+#include "vorbismetadatamodel.h"
+
+#define QStringToTString_qt4(s) TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8)
+#define TStringToQString_qt4(s) QString::fromUtf8(s.toCString(TRUE)).trimmed()
+
+VorbisMetaDataModel::VorbisMetaDataModel(const QString &path, QObject *parent) : MetaDataModel(parent)
+{
+ m_path = path;
+ m_tags << new VorbisCommentModel(path);
+}
+
+VorbisMetaDataModel::~VorbisMetaDataModel()
+{
+ while(!m_tags.isEmpty())
+ delete m_tags.takeFirst();
+}
+
+QHash<QString, QString> VorbisMetaDataModel::audioProperties()
+{
+ QHash<QString, QString> ap;
+ TagLib::Ogg::Vorbis::File f (m_path.toLocal8Bit());
+ QString text = QString("%1").arg(f.audioProperties()->length()/60);
+ text +=":"+QString("%1").arg(f.audioProperties()->length()%60,2,10,QChar('0'));
+ ap.insert(tr("Length"), text);
+ ap.insert(tr("Sample rate"), QString("%1 " + tr("Hz")).arg(f.audioProperties()->sampleRate()));
+ ap.insert(tr("Channels"), QString("%1").arg(f.audioProperties()->channels()));
+ ap.insert(tr("Bitrate"), QString("%1 " + tr("kbps")).arg(f.audioProperties()->bitrate()));
+ ap.insert(tr("File size"), QString("%1 "+tr("KB")).arg(f.length()/1024));
+ return ap;
+}
+
+QList<TagModel* > VorbisMetaDataModel::tags()
+{
+ return m_tags;
+}
+
+VorbisCommentModel::VorbisCommentModel(const QString &path) : TagModel(TagModel::Save)
+{
+ m_file = new TagLib::Ogg::Vorbis::File (path.toLocal8Bit().constData());
+ m_tag = m_file->tag();
+}
+
+VorbisCommentModel::~VorbisCommentModel()
+{
+ delete m_file;
+}
+
+const QString VorbisCommentModel::name()
+{
+ return "Vorbis Comment";
+}
+
+const QString VorbisCommentModel::value(Qmmp::MetaData key)
+{
+ if(!m_tag)
+ return QString();
+ switch((int) key)
+ {
+ case Qmmp::TITLE:
+ return TStringToQString_qt4(m_tag->title());
+ case Qmmp::ARTIST:
+ return TStringToQString_qt4(m_tag->artist());
+ case Qmmp::ALBUM:
+ return TStringToQString_qt4(m_tag->album());
+ case Qmmp::COMMENT:
+ return TStringToQString_qt4(m_tag->comment());
+ case Qmmp::GENRE:
+ return TStringToQString_qt4(m_tag->genre());
+ case Qmmp::COMPOSER:
+ if(m_tag->fieldListMap()["COMPOSER"].isEmpty())
+ return QString();
+ else
+ return TStringToQString_qt4(m_tag->fieldListMap()["COMPOSER"].front());
+ case Qmmp::YEAR:
+ return QString::number(m_tag->year());
+ case Qmmp::TRACK:
+ return QString::number(m_tag->track());
+ case Qmmp::DISCNUMBER:
+ if(m_tag->fieldListMap()["DISCNUMBER"].isEmpty())
+ return QString();
+ else
+ return TStringToQString_qt4(m_tag->fieldListMap()["DISCNUMBER"].front());
+ }
+ return QString();
+}
+
+void VorbisCommentModel::setValue(Qmmp::MetaData key, const QString &value)
+{
+ if(!m_tag)
+ return;
+
+ TagLib::String str = QStringToTString_qt4(value);
+
+ switch((int) key)
+ {
+ case Qmmp::TITLE:
+ m_tag->setTitle(str);
+ return;
+ case Qmmp::ARTIST:
+ m_tag->setArtist(str);
+ return;
+ case Qmmp::ALBUM:
+ m_tag->setAlbum(str);
+ return;
+ case Qmmp::COMMENT:
+ m_tag->setComment(str);
+ return;
+ case Qmmp::GENRE:
+ m_tag->setGenre(str);
+ return;
+ case Qmmp::COMPOSER:
+ value.isEmpty() ?
+ m_tag->removeField("COMPOSER"):
+ m_tag->addField("COMPOSER", str, TRUE);
+ return;
+ case Qmmp::YEAR:
+ m_tag->setYear(value.toInt());
+ return;
+ case Qmmp::DISCNUMBER:
+ value.isEmpty() ?
+ m_tag->removeField("DISCNUMBER"):
+ m_tag->addField("DISCNUMBER", str, TRUE);
+ }
+}
+
+bool VorbisCommentModel::exists()
+{
+ return TRUE;
+}
+
+void VorbisCommentModel::create()
+{
+ m_tag = m_file->tag();
+}
+
+void VorbisCommentModel::remove()
+{}
+
+void VorbisCommentModel::save()
+{
+ m_file->save();
+}