summaryrefslogtreecommitdiffstats
path: root/noatun/modules/metatag/metatag.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'noatun/modules/metatag/metatag.cpp')
-rw-r--r--noatun/modules/metatag/metatag.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/noatun/modules/metatag/metatag.cpp b/noatun/modules/metatag/metatag.cpp
new file mode 100644
index 00000000..d0531092
--- /dev/null
+++ b/noatun/modules/metatag/metatag.cpp
@@ -0,0 +1,124 @@
+
+#include "metatag.h"
+#include "edit.h"
+
+#include <string.h>
+
+#include <noatun/app.h>
+#include <noatun/stdaction.h>
+
+#include <qfile.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kaction.h>
+#include <kglobal.h>
+#include <klineedit.h>
+#include <kconfig.h>
+#include <kaction.h>
+#include <kiconloader.h>
+#include <kpopupmenu.h>
+#include <kfilemetainfo.h>
+
+extern "C"
+{
+ KDE_EXPORT Plugin *create_plugin()
+ {
+ return new MetaTagLoader;
+ }
+}
+
+MetaTagLoader::MetaTagLoader():Plugin()
+{
+ mAction = new KAction(i18n("&Tag Editor..."), "edit", 0, this, SLOT(editTag()), this, "edittag");
+ napp->pluginActionMenu()->insert(mAction);
+}
+
+MetaTagLoader::~MetaTagLoader()
+{
+ napp->pluginActionMenu()->remove(mAction);
+}
+
+void MetaTagLoader::editTag()
+{
+ PlaylistItem i = napp->player()->current();
+
+ if(!i)
+ return;
+
+ Editor *e = new Editor();
+ e->open(i);
+ e->show();
+
+ connect(e, SIGNAL(saved(PlaylistItem &)),
+ SLOT(update(PlaylistItem &)));
+}
+
+bool MetaTagLoader::update(PlaylistItem & item)
+{
+ KFileMetaInfo file_info(item.file(),item.mimetype());
+
+ // Ack, no file info :(
+ if ( !file_info.isValid() )
+ return false;
+
+ if(item.length() == -1) // no value set, set almost correct id3tag time
+ {
+ KFileMetaInfoItem length_item = file_info.item("Length");
+ if(length_item.isValid())
+ {
+ int numVal = length_item.value().toInt();
+ if (numVal != 0)
+ item.setLength(numVal * 1000);
+ }
+ }
+
+ // Yes, this is icky. It maps KFileMetaInfo property names to Noatun's
+ setProperty(file_info, item, "Title", "title");
+ setProperty(file_info, item, "Artist", "author");
+ setProperty(file_info, item, "Album", "album");
+ setProperty(file_info, item, "Genre", "genre");
+ setProperty(file_info, item, "Tracknumber", "track");
+ setProperty(file_info, item, "Date", "date");
+ setProperty(file_info, item, "Comment", "comment");
+ setProperty(file_info, item, "Location", "location");
+ setProperty(file_info, item, "Organization", "organization");
+
+ // Now map the audio properties over
+ setProperty(file_info, item, "Bitrate", "bitrate");
+ setProperty(file_info, item, "Sample Rate", "samplerate");
+ setProperty(file_info, item, "Channels", "channels");
+
+ return true;
+}
+
+bool MetaTagLoader::setProperty(KFileMetaInfo &info, PlaylistItem &item, const QString &key, const QString &property)
+{
+ KFileMetaInfoItem info_item = info.item(key);
+
+ if ( info_item.isValid() )
+ {
+ if (!info_item.value().toString().stripWhiteSpace().isEmpty())
+ {
+ // The item is valid and non-empty, add it
+ item.setProperty(property, info_item.value().toString());
+ }
+ else
+ {
+ // If the info_item is valid, but empty.
+ // This means we know for a fact that this
+ // property has no value. Blow it away.
+ item.clearProperty(property);
+ }
+ return true;
+ }
+
+ // The item isn't valid, so we don't know that it has
+ // no value. Don't remove the property, so we can work
+ // well with other tag readers, like Lucky
+ return false;
+}
+
+#include "metatag.moc"