[SCM] bangarang packaging branch, master, updated. debian/1.0.beta2-1-19-gd74ae09

ryanakca-guest at users.alioth.debian.org ryanakca-guest at users.alioth.debian.org
Thu Jan 7 04:13:29 UTC 2010


The following commit has been merged in the master branch:
commit e3129960d498079ef208eb19ae79b9388ba22be9
Author: Ryan Kavanagh <ryanakca at kubuntu.org>
Date:   Wed Jan 6 22:05:44 2010 -0500

    Imported Upstream version 1.0~RC

diff --git a/TESTING b/TESTING
index 8bc6b5f..34bb92b 100644
--- a/TESTING
+++ b/TESTING
@@ -15,7 +15,10 @@ All test cases should be run prior to any release.
 1.1.6 Play non-sequential item in playlist
 1.1.7 Seek to position
 1.1.8 Fullscreen
-1.1.9 Hide Controls
+1.2 Hide Controls
+1.3 Video Settings
+1.4 Remaining time/Elapsed time
+1.5 Mute/Volume control
 
 2 Media Browsing
 2.1 Select and play single and multiple media items
@@ -39,9 +42,9 @@ All test cases should be run prior to any release.
 2.3.3 Genre
 2.3.4 Series
 2.3.5 Season
-2.3 Browse highest rated
-2.4 Browse frequently played
-3.5 Browse recently played
+2.4 Browse highest rated
+2.5 Browse frequently played
+2.6 Browse recently played
 
 
 3 Playlist
@@ -51,14 +54,28 @@ All test cases should be run prior to any release.
 3.4 Clear playlist
 3.5 Repeat mode
 3.6 Shuffle mode
+3.7 Drag and drop from Dolphin
 
 4 Saved media lists
 4.1 Save selected items
 4.2 Save view
 4.3 Save current playlist
 4.4 Remove saved list
+4.5 Add items to saved list
+4.6 Remove items from saved list
+4.7 Rename saved list
 
 5 Media metadata/library
-5.1 Update media item data for each media type
+5.1 Update media item metadata for each media type
+5.2 Remove media item metadata for each media type
+5.3 Open several music files and verify automatic update of nepomuk metadata
 
 6 Nepomuk disabled
+6.1 Verify media playback functions (section 1)
+6.2 Verify saved list functions (section 4 - except 4.2)
+
+7 Startup Vectors
+7.1 Open media file in Dolphin
+7.2 Open media file via command line
+7.3 Open CD from Device Notifier
+7.4 Open DVD from Device Notifier
diff --git a/data/bangarang.desktop b/data/bangarang.desktop
index 2db1305..4d9423e 100644
--- a/data/bangarang.desktop
+++ b/data/bangarang.desktop
@@ -4,6 +4,7 @@ Version=1.0
 Name=Bangarang
 GenericName=Media Player
 GenericName[nl]=Mediaspeler
+GenericName[zh_CN]=媒体播放器
 Icon=bangarang
 X-DocPath=bangarang/index.html
 TryExec=bangarang
diff --git a/data/bangarang.svg b/data/bangarang.svg
index 4b854d7..302fec4 100644
--- a/data/bangarang.svg
+++ b/data/bangarang.svg
@@ -21,6 +21,17 @@
   <defs
      id="defs4">
     <linearGradient
+       id="linearGradient4052">
+      <stop
+         style="stop-color:#8a8a8a;stop-opacity:1;"
+         offset="0"
+         id="stop4054" />
+      <stop
+         style="stop-color:#2d2d2d;stop-opacity:1;"
+         offset="1"
+         id="stop4056" />
+    </linearGradient>
+    <linearGradient
        id="linearGradient3861">
       <stop
          style="stop-color:#000000;stop-opacity:1;"
@@ -1206,6 +1217,48 @@
        y1="855.56409"
        x2="397.52603"
        y2="973.81757" />
+    <filter
+       inkscape:collect="always"
+       id="filter4028"
+       x="-0.35937495"
+       width="1.7187499"
+       y="-0.18015667"
+       height="1.3603133">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="3.8645625"
+         id="feGaussianBlur4030" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4052"
+       id="linearGradient4058"
+       x1="854"
+       y1="480.36218"
+       x2="854"
+       y2="612.36218"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter4096"
+       x="-0.168"
+       width="1.336"
+       y="-0.168"
+       height="1.336">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="9.24"
+         id="feGaussianBlur4098" />
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4052"
+       id="linearGradient4108"
+       gradientUnits="userSpaceOnUse"
+       x1="854"
+       y1="480.36218"
+       x2="854"
+       y2="612.36218" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -1217,16 +1270,16 @@
      objecttolerance="10"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:zoom="0.5"
-     inkscape:cx="488.17005"
-     inkscape:cy="-72.986172"
+     inkscape:zoom="2.6184387"
+     inkscape:cx="685.37508"
+     inkscape:cy="294.00001"
      inkscape:document-units="px"
-     inkscape:current-layer="g3857"
+     inkscape:current-layer="layer1"
      showgrid="false"
      inkscape:window-width="1019"
      inkscape:window-height="733"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
+     inkscape:window-x="38"
+     inkscape:window-y="71"
      inkscape:window-maximized="0" />
   <metadata
      id="metadata7">
@@ -2351,5 +2404,61 @@
            style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.25;color:#000000;fill:url(#linearGradient4125);fill-opacity:1;stroke:none;stroke-width:15;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:AR PL UMing CN;-inkscape-font-specification:AR PL UMing CN" />
       </g>
     </g>
+    <g
+       id="g4100"
+       transform="translate(-178,208)"
+       inkscape:export-filename="/home/jamboarder/Projects/MediaPlayer/Bangarang/src/icons/hi22-actions-bangarang-category-browse.png"
+       inkscape:export-xdpi="10.56"
+       inkscape:export-ydpi="10.56">
+      <path
+         sodipodi:type="arc"
+         style="fill:#000000;fill-opacity:0;stroke:none"
+         id="path4110"
+         sodipodi:cx="854"
+         sodipodi:cy="546.36218"
+         sodipodi:rx="66"
+         sodipodi:ry="66"
+         d="m 920,546.36218 c 0,36.4508 -29.54921,66 -66,66 -36.45079,0 -66,-29.5492 -66,-66 0,-36.45079 29.54921,-66 66,-66 36.45079,0 66,29.54921 66,66 z"
+         transform="matrix(1.4205782,0,0,1.4205782,-359.17379,-225.78803)" />
+      <path
+         transform="translate(0,4)"
+         d="m 920,546.36218 c 0,36.4508 -29.54921,66 -66,66 -36.45079,0 -66,-29.5492 -66,-66 0,-36.45079 29.54921,-66 66,-66 36.45079,0 66,29.54921 66,66 z"
+         sodipodi:ry="66"
+         sodipodi:rx="66"
+         sodipodi:cy="546.36218"
+         sodipodi:cx="854"
+         id="path3158"
+         style="fill:#000000;fill-opacity:0.87373739;stroke:none;filter:url(#filter4096)"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#ffffff;fill-opacity:1;stroke:none"
+         id="path4032"
+         sodipodi:cx="854"
+         sodipodi:cy="546.36218"
+         sodipodi:rx="66"
+         sodipodi:ry="66"
+         d="m 920,546.36218 c 0,36.4508 -29.54921,66 -66,66 -36.45079,0 -66,-29.5492 -66,-66 0,-36.45079 29.54921,-66 66,-66 36.45079,0 66,29.54921 66,66 z" />
+      <path
+         transform="matrix(0.78947456,0,0,0.78947456,179.78873,115.02314)"
+         d="m 920,546.36218 c 0,36.4508 -29.54921,66 -66,66 -36.45079,0 -66,-29.5492 -66,-66 0,-36.45079 29.54921,-66 66,-66 36.45079,0 66,29.54921 66,66 z"
+         sodipodi:ry="66"
+         sodipodi:rx="66"
+         sodipodi:cy="546.36218"
+         sodipodi:cx="854"
+         id="path4050"
+         style="fill:url(#linearGradient4108);fill-opacity:1;stroke:none"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="ccc"
+         id="path3960"
+         d="m 842.9613,520.06076 31.80856,25.80855 -31.67414,25.67414"
+         style="fill:none;stroke:#000000;stroke-width:18;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter4028)" />
+      <path
+         sodipodi:nodetypes="ccc"
+         style="fill:none;stroke:#ffffff;stroke-width:18;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 842.9613,520.06076 31.80856,25.80855 -31.67414,25.67414"
+         id="path3970" />
+    </g>
   </g>
 </svg>
diff --git a/data/bangarang_play_cd.desktop b/data/bangarang_play_cd.desktop
index f7a7c1d..9fb5753 100644
--- a/data/bangarang_play_cd.desktop
+++ b/data/bangarang_play_cd.desktop
@@ -3,6 +3,7 @@ Exec=bangarang --play-cd %u
 Icon=bangarang
 Name=Play CD with Bangarang
 Name[nl]=CD afspelen met Bangarang
+Name[zh_CN]=使用 Bangarang 播放 CD
 
 [Desktop Entry]
 Actions=open;
diff --git a/data/bangarang_play_dvd.desktop b/data/bangarang_play_dvd.desktop
index 051e9be..a09747c 100644
--- a/data/bangarang_play_dvd.desktop
+++ b/data/bangarang_play_dvd.desktop
@@ -3,6 +3,7 @@ Exec=bangarang --play-dvd %u
 Icon=bangarang
 Name=Play DVD with Bangarang
 Name[nl]=DVD afspelen met Bangarang
+Name[zh_CN]=使用 Bangarang 播放 DVD
 X-Ubuntu-Gettext-Domain=desktop_kdebase-workspace
 
 [Desktop Entry]
diff --git a/icons/hi22-actions-bangarang-category-browse.png b/icons/hi22-actions-bangarang-category-browse.png
new file mode 100644
index 0000000..8ee2f92
Binary files /dev/null and b/icons/hi22-actions-bangarang-category-browse.png differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 57aa923..8c4febf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -49,6 +49,7 @@ SET(BangarangSources
     platform/listenginefactory.cpp
     platform/mediaindexer.cpp
     platform/mediavocabulary.cpp
+    platform/mediaquery.cpp
     platform/medialistcache.cpp
     platform/cachelistengine.cpp
     platform/audioclipslistengine.cpp
diff --git a/src/actionsmanager.cpp b/src/actionsmanager.cpp
index 61bc64c..2d39b10 100644
--- a/src/actionsmanager.cpp
+++ b/src/actionsmanager.cpp
@@ -150,7 +150,7 @@ ActionsManager::ActionsManager(MainWindow * parent) : QObject(parent)
     connect(m_newVideoList, SIGNAL(triggered()), m_parent->savedListsManager(), SLOT(showVideoListSave()));
     
     //Show Items
-    m_showItems = new QAction(KIcon("system-run"), i18n("Show items"), m_parent);
+    m_showItems = new QAction(KIcon("bangarang-category-browse"), i18n("Show items"), m_parent);
     connect(m_showItems, SIGNAL(triggered()), this, SLOT(loadSelectedSources()));
 
     //Show Info
@@ -452,7 +452,7 @@ void ActionsManager::updateSavedListsMenus()
         if (!((videoListNames.at(i) == m_parent->m_mediaItemModel->mediaListProperties().name)
             && (m_parent->m_mediaItemModel->mediaListProperties().lri.startsWith("savedlists://")))) { 
             QAction * addToSavedList = new QAction(KIcon("view-list-text"), videoListNames.at(i), m_addToVideoSavedList);
-            addToSavedList->setData(audioListNames.at(i));
+            addToSavedList->setData(videoListNames.at(i));
             m_addToVideoSavedList->addAction(addToSavedList);
         }
     }
diff --git a/src/infomanager.cpp b/src/infomanager.cpp
index ee33449..1f42e32 100644
--- a/src/infomanager.cpp
+++ b/src/infomanager.cpp
@@ -96,7 +96,7 @@ void InfoManager::showInfoView()
     loadInfoView();
 }
 
-void InfoManager::showInfoViewForMediaItem(MediaItem mediaItem)
+void InfoManager::showInfoViewForMediaItem(const MediaItem &mediaItem)
 {
     ui->stackedWidget->setCurrentIndex(0);
     ui->mediaViewHolder->setCurrentIndex(1);
@@ -204,6 +204,7 @@ void InfoManager::saveInfoView()
     
     //Save info data to nepomuk store
     saveInfoToMediaModel();
+    saveFileMetaData();
     m_parent->m_mediaItemModel->updateSourceInfo(m_infoMediaItemsModel->mediaList());
      
     //show non-editable fields
@@ -362,7 +363,7 @@ void InfoManager::showAudioMusicFields(bool edit)
         setEditWidget(startRow, new QComboBox(), commonValue("artist").toString(), valueList("artist"), true);
         setEditWidget(startRow + 1, new QComboBox(), commonValue("album").toString(), valueList("album"), true);
         setEditWidget(startRow + 2, new QSpinBox());
-        QSpinBox * yw = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(startRow + 2), 1));
+        QSpinBox * yw = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(startRow + 2), 1));
         yw->setRange(0, 9999);
         yw->setValue(commonValue("year").toInt());
         setEditWidget(startRow + 3, new QSpinBox(), commonValue("trackNumber").toInt());
@@ -427,7 +428,7 @@ void InfoManager::showVideoMovieFields(bool edit)
         
     } else {
         setEditWidget(startRow, new QSpinBox());
-        QSpinBox * yw = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(startRow), 1));
+        QSpinBox * yw = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(startRow), 1));
         yw->setRange(0, 9999);
         yw->setValue(commonValue("releaseDate").toDate().year());
         setEditWidget(startRow + 1, new QComboBox(), commonValue("genre").toString(), valueList("genre"), true);
@@ -481,7 +482,7 @@ void InfoManager::showVideoTVShowFields(bool edit)
         setEditWidget(startRow + 1, new QSpinBox(), commonValue("season").toInt());
         setEditWidget(startRow + 2, new QSpinBox(), commonValue("episodeNumber").toInt());
         setEditWidget(startRow + 3, new QSpinBox());
-        QSpinBox * yw = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(startRow + 3), 1));
+        QSpinBox * yw = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(startRow + 3), 1));
         yw->setRange(0, 9999);
         setEditWidget(startRow + 4, new QComboBox(), commonValue("genre").toString(), valueList("genre"), true);
         setEditWidget(startRow + 5, new QComboBox(), commonValue("writer").toString(), valueList("writer"), true);
@@ -491,7 +492,7 @@ void InfoManager::showVideoTVShowFields(bool edit)
     }
 }
         
-QVariant InfoManager::commonValue(QString field)
+QVariant InfoManager::commonValue(const QString &field)
 {
     QVariant value;
     QList<MediaItem> mediaList = m_infoMediaItemsModel->mediaList();
@@ -508,7 +509,7 @@ QVariant InfoManager::commonValue(QString field)
     return value;
 }
 
-QStringList InfoManager::valueList(QString field)
+QStringList InfoManager::valueList(const QString &field)
 {
     QStringList value;
     value << QString();
@@ -527,26 +528,26 @@ void InfoManager::saveInfoToMediaModel()
 {
     QList<MediaItem> mediaList = m_infoMediaItemsModel->mediaList();
     QList<MediaItem> updatedList;
-    QComboBox *typeComboBox = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(4), 1));
+    QComboBox *typeComboBox = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(4), 1));
     
     for (int i = 0; i < mediaList.count(); i++) {
         MediaItem mediaItem = mediaList.at(i);
         
         //All media types have a title
-        KLineEdit * titleWidget = static_cast<KLineEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(0), 1));
+        KLineEdit * titleWidget = qobject_cast<KLineEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(0), 1));
         QString title = titleWidget->text();
         if (!title.isEmpty()) {
             mediaItem.title = title;
             mediaItem.fields["title"] = title;
         }
         
-        ArtworkWidget * artworkWidget = static_cast<ArtworkWidget*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(1), 1));
+        ArtworkWidget * artworkWidget = qobject_cast<ArtworkWidget*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(1), 1));
         QUrl url = artworkWidget->url();
         if (!url.isEmpty()) {
             mediaItem.fields["artworkUrl"] = url.toString();
         }
 
-        QTextEdit * descriptionWidget = static_cast<QTextEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(2), 1));
+        QTextEdit * descriptionWidget = qobject_cast<QTextEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(2), 1));
         QString description = descriptionWidget->toPlainText();
         if (!description.isEmpty()) {
             if (mediaItem.type == "Video") {
@@ -561,13 +562,13 @@ void InfoManager::saveInfoToMediaModel()
                 mediaItem.type = "Audio";
                 mediaItem.fields["audioType"] = "Music";
                 
-                QComboBox *artistWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(5), 1));
+                QComboBox *artistWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(5), 1));
                 QString artist = artistWidget->currentText();
                 if (!artist.isEmpty()) {
                     mediaItem.fields["artist"] = artist;
                 }
                 
-                QComboBox *albumWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(6), 1));
+                QComboBox *albumWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(6), 1));
                 QString album = albumWidget->currentText();
                 if (!album.isEmpty()) {
                     mediaItem.fields["album"] = album;
@@ -575,19 +576,19 @@ void InfoManager::saveInfoToMediaModel()
                 
                 mediaItem.subTitle = mediaItem.fields["artist"].toString() + QString(" - ") + mediaItem.fields["album"].toString();
                 
-                QSpinBox *yearWidget = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(7), 1));
+                QSpinBox *yearWidget = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(7), 1));
                 int year = yearWidget->value();
                 if (year != 0) {
                     mediaItem.fields["year"] = year;
                 }
                 
-                QSpinBox *trackNumberWidget = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(8), 1));
+                QSpinBox *trackNumberWidget = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(8), 1));
                 int trackNumber = trackNumberWidget->value();
                 if (trackNumber != 0) {
                     mediaItem.fields["trackNumber"] = trackNumber;
                 }
                 
-                QComboBox *genreWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(9), 1));
+                QComboBox *genreWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(9), 1));
                 QString genre = genreWidget->currentText();
                 if (!genre.isEmpty()) {
                     mediaItem.fields["genre"] = genre;
@@ -597,7 +598,7 @@ void InfoManager::saveInfoToMediaModel()
                 mediaItem.type = "Audio";
                 mediaItem.fields["audioType"] = "Audio Stream";
                 
-                KLineEdit * urlWidget = static_cast<KLineEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(3), 1));
+                KLineEdit * urlWidget = qobject_cast<KLineEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(3), 1));
                 QString url = urlWidget->text();
                 if (!url.isEmpty()) {
                     mediaItem.url = url;
@@ -613,38 +614,38 @@ void InfoManager::saveInfoToMediaModel()
                 mediaItem.type = "Video";
                 mediaItem.fields["videoType"] = "Movie";
                 
-                QSpinBox *yearWidget = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(5), 1));
+                QSpinBox *yearWidget = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(5), 1));
                 if (yearWidget->value() != 0) {
                     QDate releaseDate = QDate(yearWidget->value(), 1, 1);
                     mediaItem.fields["releaseDate"] = releaseDate;
                 }
 
-                QComboBox *genreWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(6), 1));
+                QComboBox *genreWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(6), 1));
                 QString genre = genreWidget->currentText();
                 if (!genre.isEmpty()) {
                     mediaItem.fields["genre"] = genre;
                 }
                 
-                QComboBox *writerWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(7), 1));
+                QComboBox *writerWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(7), 1));
                 QString writer = writerWidget->currentText();
                 kDebug() << "Writer:" << writer;
                 if (!writer.isEmpty()) {
                     mediaItem.fields["writer"] = writer;
                 }
                 
-                QComboBox *directorWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(8), 1));
+                QComboBox *directorWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(8), 1));
                 QString director = directorWidget->currentText();
                 if (!director.isEmpty()) {
                     mediaItem.fields["director"] = director;
                 }
                 
-                QComboBox *producerWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(9), 1));
+                QComboBox *producerWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(9), 1));
                 QString producer = producerWidget->currentText();
                 if (!producer.isEmpty()) {
                     mediaItem.fields["producer"] = producer;
                 }
                 
-                QComboBox *actorWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(10), 1));
+                QComboBox *actorWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(10), 1));
                 QString actor = actorWidget->currentText();
                 if (!actor.isEmpty()) {
                     mediaItem.fields["actor"] = actor;
@@ -654,14 +655,14 @@ void InfoManager::saveInfoToMediaModel()
                 mediaItem.type = "Video";
                 mediaItem.fields["videoType"] = "TV Show";
                 
-                KLineEdit * seriesNameWidget = static_cast<KLineEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(5), 1));
+                KLineEdit * seriesNameWidget = qobject_cast<KLineEdit*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(5), 1));
                 QString seriesName = seriesNameWidget->text();
                 if (!seriesName.isEmpty()) {
                     mediaItem.fields["seriesName"] = seriesName;
                     mediaItem.subTitle = seriesName;
                 }
                 
-                QSpinBox *seasonWidget = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(6), 1));
+                QSpinBox *seasonWidget = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(6), 1));
                 int season = seasonWidget->value();
                 mediaItem.fields["season"] = season;
                 if (!mediaItem.subTitle.isEmpty()) {
@@ -669,7 +670,7 @@ void InfoManager::saveInfoToMediaModel()
                 }
                 mediaItem.subTitle += QString("Season %1").arg(season);
                 
-                QSpinBox *episodeWidget = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(7), 1));
+                QSpinBox *episodeWidget = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(7), 1));
                 int episodeNumber = episodeWidget->value();
                 mediaItem.fields["episodeNumber"] = episodeNumber;
                 if (!mediaItem.subTitle.isEmpty()) {
@@ -677,38 +678,38 @@ void InfoManager::saveInfoToMediaModel()
                 }
                 mediaItem.subTitle += QString("Episode %1").arg(episodeNumber);
                 
-                QSpinBox *yearWidget = static_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(5), 1));
+                QSpinBox *yearWidget = qobject_cast<QSpinBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(8), 1));
                 if (yearWidget->value() != 0) {
                     QDate releaseDate = QDate(yearWidget->value(), 1, 1);
                     mediaItem.fields["releaseDate"] = releaseDate;
                 }
                 
-                QComboBox *genreWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(9), 1));
+                QComboBox *genreWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(9), 1));
                 QString genre = genreWidget->currentText();
                 if (!genre.isEmpty()) {
                     mediaItem.fields["genre"] = genre;
                 }
                 
                 
-                QComboBox *writerWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(10), 1));
+                QComboBox *writerWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(10), 1));
                 QString writer = writerWidget->currentText();
                 if (!writer.isEmpty()) {
                     mediaItem.fields["writer"] = genre;
                 }
                 
-                QComboBox *directorWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(11), 1));
+                QComboBox *directorWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(11), 1));
                 QString director = directorWidget->currentText();
                 if (!director.isEmpty()) {
                     mediaItem.fields["director"] = director;
                 }
                 
-                QComboBox *producerWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(12), 1));
+                QComboBox *producerWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(12), 1));
                 QString producer = producerWidget->currentText();
                 if (!producer.isEmpty()) {
                     mediaItem.fields["producer"] = producer;
                 }
                 
-                QComboBox *actorWidget = static_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(13), 1));
+                QComboBox *actorWidget = qobject_cast<QComboBox*>(ui->infoView->itemWidget(ui->infoView->topLevelItem(13), 1));
                 QString actor = actorWidget->currentText();
                 if (!actor.isEmpty()) {
                     mediaItem.fields["actor"] = actor;
@@ -768,7 +769,7 @@ bool InfoManager::multipleAudioTypes()
     return false;
 }
 
-void InfoManager::setLabel(int row, QString label, int format)
+void InfoManager::setLabel(int row, const QString &label, int format)
 {
     QLabel * labelLabel= new QLabel();
     labelLabel->setWordWrap(true);
@@ -784,7 +785,7 @@ void InfoManager::setLabel(int row, QString label, int format)
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 0, labelLabel);    
 }
 
-void InfoManager::setInfo(int row, QString info, int format)
+void InfoManager::setInfo(int row, const QString &info, int format)
 {
     QLabel * infoLabel= new QLabel();
     infoLabel->setWordWrap(true);
@@ -800,7 +801,7 @@ void InfoManager::setInfo(int row, QString info, int format)
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 1, infoLabel);
 }
 
-void InfoManager::setInfo(int row, QPixmap pixmap)
+void InfoManager::setInfo(int row, const QPixmap &pixmap)
 {
     QLabel * infoLabel= new QLabel();
     infoLabel->setPixmap(pixmap);
@@ -809,19 +810,19 @@ void InfoManager::setInfo(int row, QPixmap pixmap)
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 1, infoLabel);
 }
 
-void InfoManager::setEditWidget(int row, KLineEdit *lineEdit, QString value)
+void InfoManager::setEditWidget(int row, KLineEdit *lineEdit, const QString &value)
 {
     lineEdit->setText(value);
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row ), 1, lineEdit);
 }
 
-void InfoManager::setEditWidget(int row, QTextEdit *textEdit, QString value)
+void InfoManager::setEditWidget(int row, QTextEdit *textEdit, const QString &value)
 {
     textEdit->setText(value);
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 1, textEdit);
 }
 
-void InfoManager::setEditWidget(int row, QComboBox *comboBox, QString value, QStringList list, bool editable)
+void InfoManager::setEditWidget(int row, QComboBox *comboBox, const QString &value, const QStringList &list, bool editable)
 {
     comboBox->addItems(list);
     if (editable) {
@@ -839,7 +840,7 @@ void InfoManager::setEditWidget(int row, QComboBox *comboBox, QString value, QSt
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 1, comboBox);    
 }
 
-void InfoManager::setEditWidget(int row, KUrlRequester *urlRequester, QString value)
+void InfoManager::setEditWidget(int row, KUrlRequester *urlRequester, const QString &value)
 {
     urlRequester->setText(value);
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 1, urlRequester);
@@ -853,16 +854,64 @@ void InfoManager::setEditWidget(int row, QSpinBox *spinBox, int value)
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 1, spinBox);
 }
 
-void InfoManager::setEditWidget(int row, ArtworkWidget *artworkWidget, QPixmap pixmap)
+void InfoManager::setEditWidget(int row, ArtworkWidget *artworkWidget, const QPixmap &pixmap)
 {
     artworkWidget->setPixmap(pixmap);
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row), 1, artworkWidget);
 }
 
-void InfoManager::setEditWidget(int row, QDateEdit *dateEdit, QDate date)
+void InfoManager::setEditWidget(int row, QDateEdit *dateEdit, const QDate &date)
 {
     dateEdit->setMinimumDate(QDate(-4000,1,1));
     dateEdit->setDisplayFormat("MMMM dd yyyy");
     dateEdit->setDate(date);
     ui->infoView->setItemWidget(ui->infoView->topLevelItem(row ), 1, dateEdit);
 }
+
+void InfoManager::saveFileMetaData()
+{
+    QList<MediaItem> mediaList = m_infoMediaItemsModel->mediaList();
+    for (int i = 0; i < mediaList.count(); i++) {
+        MediaItem mediaItem = mediaList.at(i);
+        if ((mediaItem.type == "Audio") && (mediaItem.fields["audioType"] == "Music")) {
+           if (Utilities::isMusic(mediaList.at(i).url)) {
+               QString artworkUrl = mediaItem.fields["artworkUrl"].toString();
+               if (!artworkUrl.isEmpty()) {
+                   Utilities::saveArtworkToTag(mediaList.at(i).url, artworkUrl);
+               }
+               TagLib::FileRef file(KUrl(mediaList.at(i).url).path().toLocal8Bit());
+               if (!file.isNull()) {
+                   QString title = mediaItem.title;
+                   if (!title.isEmpty()) {
+                       TagLib::String tTitle(title.trimmed().toUtf8().data(), TagLib::String::UTF8);
+                       file.tag()->setTitle(tTitle);
+                   }
+                   QString artist = mediaItem.fields["artist"].toString();
+                   if (!artist.isEmpty()) {
+                       TagLib::String tArtist(artist.trimmed().toUtf8().data(), TagLib::String::UTF8);
+                       file.tag()->setArtist(tArtist);
+                   }
+                   QString album = mediaItem.fields["album"].toString();
+                   if (!album.isEmpty()) {
+                       TagLib::String tAlbum(album.trimmed().toUtf8().data(), TagLib::String::UTF8);
+                       file.tag()->setAlbum(tAlbum);
+                   }
+                   int year = mediaItem.fields["year"].toInt();
+                   if (year != 0) {
+                       file.tag()->setYear(year);
+                   }
+                   int trackNumber = mediaItem.fields["trackNumber"].toInt();
+                   if (trackNumber != 0) {
+                       file.tag()->setTrack(trackNumber);
+                   }
+                   QString genre = mediaItem.fields["genre"].toString();
+                   if (!genre.isEmpty()) {
+                       TagLib::String tGenre(genre.trimmed().toUtf8().data(), TagLib::String::UTF8);
+                       file.tag()->setGenre(tGenre);
+                   }
+                   file.save();
+               }
+           }
+       }
+    }
+}
diff --git a/src/infomanager.h b/src/infomanager.h
index 8ee5443..729afc1 100644
--- a/src/infomanager.h
+++ b/src/infomanager.h
@@ -59,7 +59,7 @@ class InfoManager : public QObject
     public slots:
         void saveInfoView();
         void showInfoView();
-        void showInfoViewForMediaItem(MediaItem mediaItem);
+        void showInfoViewForMediaItem(const MediaItem &mediaItem);
         void editInfoView();
         void removeSelectedItemsInfo();
         
@@ -69,8 +69,8 @@ class InfoManager : public QObject
         MediaIndexer *m_mediaIndexer;
         bool m_editToggle;
         void loadInfoView();
-        QVariant commonValue(QString field);
-        QStringList valueList(QString field);
+        QVariant commonValue(const QString &field);
+        QStringList valueList(const QString &field);
         void saveInfoToMediaModel();
         QList<int> m_rows;
         void showFields(bool edit = false);
@@ -85,21 +85,22 @@ class InfoManager : public QObject
         void showVideoTVShowFields(bool edit = false);
         bool multipleVideoTypes();
         bool multipleAudioTypes();
-        void setLabel(int row, QString label, int format = NormalFormat);
-        void setInfo(int row, QString info, int format = NormalFormat);
-        void setInfo(int row, QPixmap pixmap);
-        void setEditWidget(int row, KLineEdit *lineEdit, QString value = QString());
-        void setEditWidget(int row, QTextEdit *textEdit, QString value = QString());
-        void setEditWidget(int row, QComboBox *comboBox, QString value = QString(), QStringList list = QStringList(), bool editable = false);
-        void setEditWidget(int row, KUrlRequester *urlRequester, QString value = QString());
+        void setLabel(int row, const QString &label, int format = NormalFormat);
+        void setInfo(int row, const QString &info, int format = NormalFormat);
+        void setInfo(int row, const QPixmap &pixmap);
+        void setEditWidget(int row, KLineEdit *lineEdit, const QString &value = QString());
+        void setEditWidget(int row, QTextEdit *textEdit, const QString &value = QString());
+        void setEditWidget(int row, QComboBox *comboBox, const QString &value = QString(), const QStringList &list = QStringList(), bool editable = false);
+        void setEditWidget(int row, KUrlRequester *urlRequester, const QString &value = QString());
         void setEditWidget(int row, QSpinBox *spinBox, int value = 0);
-        void setEditWidget(int row, ArtworkWidget *artworkWidget, QPixmap pixmap);
-        void setEditWidget(int row, QDateEdit *dateEdit, QDate date = QDate());
+        void setEditWidget(int row, ArtworkWidget *artworkWidget, const QPixmap &pixmap);
+        void setEditWidget(int row, QDateEdit *dateEdit, const QDate &date = QDate());
         
         
     private slots:
         void mediaViewHolderChanged(int index);
         void audioTypeChanged(int index);
         void videoTypeChanged(int index);
+        void saveFileMetaData();
 };
 #endif //INFOMANAGER_H
\ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index a487665..1fb0402 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -26,9 +26,9 @@
 #include <KAboutData>
 
 static KAboutData aboutData( "bangarang", 0,
-        ki18n("Bangarang"), "0.93 (1.0~beta3)",
+        ki18n("Bangarang"), "0.99 (1.0~RC)",
         ki18n("A Media Player"), KAboutData::License_GPL_V2,
-        ki18n("Copyright 2009, Andrew Lake"), KLocalizedString(),
+        ki18n("Copyright 2010, Andrew Lake"), KLocalizedString(),
         "" );
 
 int main(int argc, char *argv[])
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index a3af216..ba5cb08 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -223,6 +223,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi
     ui->listSummary->setFont(KGlobalSettings::smallestReadableFont());
     ui->playlistDuration->setFont(KGlobalSettings::smallestReadableFont());
     ui->playbackMessage->clear();
+    ui->collectionButton->setFocus();
     updateSeekTime(0);
     showApplicationBanner();
     updateCachedDevicesList();
@@ -353,6 +354,7 @@ void MainWindow::on_nowPlaying_clicked()
 void MainWindow::on_collectionButton_clicked()
 {
     ui->stackedWidget->setCurrentIndex(0); // Show Collection page
+    ui->collectionButton->setFocus();
 }
 
 void MainWindow::on_showPlaylist_clicked(bool checked)
@@ -601,11 +603,13 @@ void MainWindow::on_showQueue_clicked()
     m_showQueue = !m_showQueue;
     if (m_showQueue) {
         ui->playlistView->setModel(m_playlist->queueModel());
+        ui->playlistView->setDragDropMode(QAbstractItemView::InternalMove);
         ui->showQueue->setToolTip(i18n("<b>Showing Upcoming</b><br>Click to show playlist"));
         ui->playlistName->setText(i18n("<b>Playlist</b>(Upcoming)"));
         ui->showQueue->setIcon(KIcon("bangarang-preview"));
     } else {
         ui->playlistView->setModel(m_playlist->playlistModel());
+        ui->playlistView->setDragDropMode(QAbstractItemView::DragDrop);
         ui->showQueue->setToolTip(i18n("Show Upcoming"));
         playlistChanged();
         ui->showQueue->setIcon(turnIconOff(KIcon("bangarang-preview"), QSize(22, 22)));
@@ -786,13 +790,20 @@ void MainWindow::delayedNotificationHide()
 
 void MainWindow::sourceInfoUpdated(MediaItem mediaItem)
 {
-    ui->notificationText->setText(i18n("Updated info for ") + QString("<i>%1, %2</i>").arg(mediaItem.title).arg(mediaItem.subTitle));
+    QFontMetrics fm =  ui->notificationText->fontMetrics();
+    QString notificationText = i18n("Updated info for ") + QString("<i>%1, %2</i>").arg(mediaItem.title).arg(mediaItem.subTitle);
+    notificationText = fm.elidedText(notificationText, Qt::ElideMiddle, ui->notificationText->width());
+    
+    ui->notificationText->setText(notificationText);
     ui->notificationWidget->setVisible(true);
 }
 
 void MainWindow::sourceInfoRemoved(QString url)
 {
-    ui->notificationText->setText(i18n("Removed info for ") + QString("<i>%1</i>").arg(url));
+    QFontMetrics fm =  ui->notificationText->fontMetrics();
+    QString notificationText = i18n("Removed info for ") + QString("<i>%1</i>").arg(url);
+    notificationText = fm.elidedText(notificationText, Qt::ElideMiddle, ui->notificationText->width());
+    ui->notificationText->setText(notificationText);
     ui->notificationWidget->setVisible(true);
 }
 
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 80f6230..d83907d 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>720</width>
+    <width>724</width>
     <height>480</height>
    </rect>
   </property>
@@ -43,7 +43,16 @@
         <property name="spacing">
          <number>2</number>
         </property>
-        <property name="margin">
+        <property name="leftMargin">
+         <number>1</number>
+        </property>
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <property name="rightMargin">
+         <number>1</number>
+        </property>
+        <property name="bottomMargin">
          <number>0</number>
         </property>
         <item>
@@ -278,7 +287,7 @@
                  <number>0</number>
                 </property>
                 <property name="currentIndex">
-                 <number>0</number>
+                 <number>1</number>
                 </property>
                 <property name="tabSpacing">
                  <number>0</number>
@@ -317,7 +326,7 @@
                   <item>
                    <widget class="QStackedWidget" name="audioListsStack">
                     <property name="currentIndex">
-                     <number>2</number>
+                     <number>0</number>
                     </property>
                     <widget class="QWidget" name="audioListsPage">
                      <layout class="QVBoxLayout" name="verticalLayout_22">
@@ -740,8 +749,8 @@
                   <rect>
                    <x>0</x>
                    <y>0</y>
-                   <width>131</width>
-                   <height>224</height>
+                   <width>154</width>
+                   <height>324</height>
                   </rect>
                  </property>
                  <attribute name="label">
@@ -757,7 +766,7 @@
                   <item>
                    <widget class="QStackedWidget" name="videoListsStack">
                     <property name="currentIndex">
-                     <number>2</number>
+                     <number>0</number>
                     </property>
                     <widget class="QWidget" name="page_4">
                      <layout class="QVBoxLayout" name="verticalLayout_23">
@@ -1615,7 +1624,7 @@
                  </size>
                 </property>
                 <property name="autoFillBackground">
-                 <bool>false</bool>
+                 <bool>true</bool>
                 </property>
                 <layout class="QHBoxLayout" name="horizontalLayout_21">
                  <property name="leftMargin">
@@ -5234,6 +5243,9 @@ color: rgb(255, 255, 255);</string>
                              <height>0</height>
                             </size>
                            </property>
+                           <property name="acceptDrops">
+                            <bool>false</bool>
+                           </property>
                            <property name="frameShape">
                             <enum>QFrame::NoFrame</enum>
                            </property>
@@ -5247,7 +5259,7 @@ color: rgb(255, 255, 255);</string>
                             <bool>true</bool>
                            </property>
                            <property name="dragDropMode">
-                            <enum>QAbstractItemView::InternalMove</enum>
+                            <enum>QAbstractItemView::DragDrop</enum>
                            </property>
                            <property name="alternatingRowColors">
                             <bool>true</bool>
@@ -5373,13 +5385,13 @@ color: rgb(255, 255, 255);</string>
                <number>0</number>
               </property>
               <property name="leftMargin">
-               <number>0</number>
+               <number>1</number>
               </property>
               <property name="topMargin">
                <number>2</number>
               </property>
               <property name="rightMargin">
-               <number>0</number>
+               <number>1</number>
               </property>
               <property name="bottomMargin">
                <number>0</number>
@@ -5849,43 +5861,61 @@ color: rgb(255, 255, 255);</string>
   </customwidget>
  </customwidgets>
  <tabstops>
-  <tabstop>Filter</tabstop>
-  <tabstop>mediaView</tabstop>
-  <tabstop>infoView</tabstop>
-  <tabstop>nowPlaying</tabstop>
-  <tabstop>previous</tabstop>
-  <tabstop>playAll</tabstop>
-  <tabstop>playSelected</tabstop>
-  <tabstop>saveInfo</tabstop>
-  <tabstop>addVideoList</tabstop>
-  <tabstop>addAudioList</tabstop>
-  <tabstop>removeAudioList</tabstop>
-  <tabstop>configureAudioList</tabstop>
-  <tabstop>configureVideoList</tabstop>
-  <tabstop>removeVideoList</tabstop>
   <tabstop>collectionButton</tabstop>
+  <tabstop>fullScreen</tabstop>
+  <tabstop>seekTime</tabstop>
+  <tabstop>volumeIcon</tabstop>
   <tabstop>mediaPrevious</tabstop>
   <tabstop>mediaPlayPause</tabstop>
   <tabstop>mediaNext</tabstop>
-  <tabstop>volumeIcon</tabstop>
-  <tabstop>fullScreen</tabstop>
-  <tabstop>volumeSlider</tabstop>
-  <tabstop>seekSlider</tabstop>
-  <tabstop>sortList</tabstop>
-  <tabstop>showInfo</tabstop>
   <tabstop>showPlaylist</tabstop>
-  <tabstop>nowPlayingView</tabstop>
+  <tabstop>showMenu</tabstop>
   <tabstop>showQueue</tabstop>
   <tabstop>clearPlaylist</tabstop>
   <tabstop>repeat</tabstop>
   <tabstop>shuffle</tabstop>
   <tabstop>playlistView</tabstop>
-  <tabstop>seekTime</tabstop>
+  <tabstop>Filter</tabstop>
   <tabstop>audioLists</tabstop>
+  <tabstop>mediaView</tabstop>
+  <tabstop>previous</tabstop>
+  <tabstop>playAll</tabstop>
+  <tabstop>playSelected</tabstop>
+  <tabstop>nowPlaying</tabstop>
+  <tabstop>sortList</tabstop>
+  <tabstop>saveInfo</tabstop>
+  <tabstop>removeVideoList</tabstop>
+  <tabstop>nowPlayingView</tabstop>
+  <tabstop>addVideoList</tabstop>
+  <tabstop>removeAudioList</tabstop>
+  <tabstop>addAudioList</tabstop>
+  <tabstop>showInfo</tabstop>
+  <tabstop>configureVideoList</tabstop>
+  <tabstop>infoView</tabstop>
+  <tabstop>configureAudioList</tabstop>
   <tabstop>aCancelSaveList</tabstop>
   <tabstop>saveAudioList</tabstop>
   <tabstop>videoLists</tabstop>
-  <tabstop>showMenu</tabstop>
+  <tabstop>aListSourceView</tabstop>
+  <tabstop>aListSourceSelection</tabstop>
+  <tabstop>aListSourcePlaylist</tabstop>
+  <tabstop>aNewListName</tabstop>
+  <tabstop>aslsListName</tabstop>
+  <tabstop>aslsSave</tabstop>
+  <tabstop>aslsCancel</tabstop>
+  <tabstop>vListSourceSelection</tabstop>
+  <tabstop>vListSourceView</tabstop>
+  <tabstop>vListSourcePlaylist</tabstop>
+  <tabstop>vNewListName</tabstop>
+  <tabstop>saveVideoList</tabstop>
+  <tabstop>vCancelSaveList</tabstop>
+  <tabstop>vslsListName</tabstop>
+  <tabstop>vslsSave</tabstop>
+  <tabstop>vslsCancel</tabstop>
+  <tabstop>showMediaViewMenu</tabstop>
+  <tabstop>editInfo</tabstop>
+  <tabstop>saveShortCuts</tabstop>
+  <tabstop>cancelEditShortcuts</tabstop>
  </tabstops>
  <resources/>
  <connections/>
diff --git a/src/mediaitemdelegate.cpp b/src/mediaitemdelegate.cpp
index b9aa123..74e70ab 100644
--- a/src/mediaitemdelegate.cpp
+++ b/src/mediaitemdelegate.cpp
@@ -17,10 +17,10 @@
 */
 
 #include "mediaitemdelegate.h"
+#include "mainwindow.h"
 #include "platform/playlist.h"
-#include "platform/mediaitemmodel.h"
 #include "platform/mediaindexer.h"
-#include "mainwindow.h"
+#include "platform/mediaitemmodel.h"
 
 #include <KGlobalSettings>
 #include <KColorScheme>
@@ -213,9 +213,9 @@ void MediaItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opt
         } else if (isCategory) {
             //Paint Category Icon
             QIcon catIcon = index.data(Qt::DecorationRole).value<QIcon>();
-            int iconWidth = 16;
+            int iconWidth = 22;
             int topOffset = (height - iconWidth) / 2;
-            catIcon.paint(&p, left + padding , top + topOffset, iconWidth, iconWidth, Qt::AlignCenter, QIcon::Normal);
+            catIcon.paint(&p, left, top + topOffset, iconWidth, iconWidth, Qt::AlignLeft, QIcon::Normal);
         }
     }
         
diff --git a/src/nowplayingdelegate.cpp b/src/nowplayingdelegate.cpp
index f4dae60..13f88e2 100644
--- a/src/nowplayingdelegate.cpp
+++ b/src/nowplayingdelegate.cpp
@@ -98,7 +98,7 @@ void NowPlayingDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
     int topOffset = (height - iconWidth) / 2;
     
     if (!icon.isNull()) {
-        icon.paint(&p, left + padding, top + topOffset, iconWidth, iconWidth, Qt::AlignLeft, QIcon::Normal);
+        icon.paint(&p, left + padding, top + topOffset, iconWidth, iconWidth, Qt::AlignCenter, QIcon::Normal);
     } else {
         iconWidth = 0;
     }   
diff --git a/src/platform/audioclipslistengine.cpp b/src/platform/audioclipslistengine.cpp
index 0077e97..4996700 100644
--- a/src/platform/audioclipslistengine.cpp
+++ b/src/platform/audioclipslistengine.cpp
@@ -20,14 +20,11 @@
 #include "mediaitemmodel.h"
 #include "listenginefactory.h"
 #include "mediavocabulary.h"
+#include "utilities.h"
 #include <KIcon>
 #include <KUrl>
 #include <KLocale>
 #include <Soprano/QueryResultIterator>
-#include <Soprano/Vocabulary/Xesam>
-#include <Soprano/Vocabulary/NAO>
-#include <Soprano/Vocabulary/RDF>
-#include <Soprano/Vocabulary/XMLSchema>
 #include <nepomuk/variant.h>
 #include <QApplication>
 #include <QTime>
@@ -41,35 +38,6 @@ AudioClipsListEngine::~AudioClipsListEngine()
 {
 }
 
-MediaItem AudioClipsListEngine::createMediaItem(Soprano::QueryResultIterator& it) {
-    MediaItem mediaItem;
-    QUrl url = it.binding("url").uri().isEmpty() ? 
-    it.binding("r").uri() :
-    it.binding("url").uri();
-    mediaItem.url = url.toString();
-    mediaItem.title = it.binding("title").literal().toString();
-    mediaItem.fields["title"] = it.binding("title").literal().toString();
-    if (mediaItem.title.isEmpty()) {
-        if (KUrl(mediaItem.url).isLocalFile()) {
-            mediaItem.title = KUrl(mediaItem.url).fileName();
-        } else {
-            mediaItem.title = mediaItem.url;
-        }
-    }
-    
-    mediaItem.type = "Audio";
-    mediaItem.nowPlaying = false;
-    mediaItem.artwork = KIcon("audio-x-wav");
-    mediaItem.fields["url"] = mediaItem.url;
-    mediaItem.fields["genre"] = it.binding("genre").literal().toString();
-    mediaItem.fields["rating"] = it.binding("rating").literal().toInt();
-    mediaItem.fields["description"] = it.binding("description").literal().toString();
-    mediaItem.fields["artworkUrl"] = it.binding("artwork").uri().toString();
-    mediaItem.fields["audioType"] = "Audio Clip";
-    
-    return mediaItem;
-}
-
 void AudioClipsListEngine::run()
 {
     if (m_updateSourceInfo || m_removeSourceInfo) {
@@ -86,21 +54,32 @@ void AudioClipsListEngine::run()
     
     if (m_nepomukInited) {
         if (engineArg.isEmpty()) {
-            AudioClipsQuery audioClipsQuery = AudioClipsQuery(true);
-            audioClipsQuery.selectResource();
-            audioClipsQuery.selectTitle();
-            audioClipsQuery.selectRating(true);
-            audioClipsQuery.selectDescription(true);
-            audioClipsQuery.selectArtwork(true);
-            //audioClipsQuery.selectGenre(true);
-            audioClipsQuery.orderBy("?title");
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            //bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudio(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = audioClipsQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Clip"));
                 mediaList.append(mediaItem);
             }
             
@@ -109,22 +88,37 @@ void AudioClipsListEngine::run()
             m_mediaListProperties.type = QString("Sources");
             
         } else if (engineArg.toLower() == "search") {
-            AudioClipsQuery audioClipsQuery = AudioClipsQuery(true);
-            audioClipsQuery.selectResource();
-            audioClipsQuery.selectTitle();
-            audioClipsQuery.selectRating(true);
-            audioClipsQuery.selectDescription(true);
-            audioClipsQuery.selectArtwork(true);
-            //audioClipsQuery.selectGenre(true);
-            audioClipsQuery.searchString(engineFilter);
-            audioClipsQuery.orderBy("?title");
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            //bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudio(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.startFilter();
+            query.addFilterConstraint(mediaVocabulary.titleBinding(), engineFilter, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.descriptionBinding(), engineFilter, MediaQuery::Contains);
+            query.endFilter();
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = audioClipsQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Clip"));
                 mediaList.append(mediaItem);
             }
             
@@ -144,145 +138,3 @@ void AudioClipsListEngine::setFilterForSources(const QString& engineFilter)
     m_mediaListProperties.lri = QString("audioclips://?%1").arg(engineFilter);
 }
 
-
-AudioClipsQuery::AudioClipsQuery(bool distinct) :
-m_distinct(distinct),
-m_selectResource(false),
-m_selectTitle(false),
-m_selectGenre(false)
-{
-}
-
-void AudioClipsQuery::selectResource() {
-    m_selectResource = true;
-}
-
-void AudioClipsQuery::selectTitle(bool optional) {
-    m_selectTitle = true;
-    m_titleCondition = addOptional(optional,
-                                   QString("?r <%1> ?title . ")
-                                   .arg(MediaVocabulary().title().toString()));
-}
-
-void AudioClipsQuery::selectGenre(bool optional) {
-    m_selectGenre = true;
-    m_genreCondition = addOptional(optional,
-                                   QString("?r <%1> ?genre . ")
-                                   .arg(MediaVocabulary().musicGenre().toString()));
-}
-
-void AudioClipsQuery::selectRating(bool optional) {
-    m_selectRating = true;
-    m_ratingCondition = addOptional(optional,
-                                    QString("?r <%1> ?rating . ")
-                                    .arg(Soprano::Vocabulary::NAO::numericRating().toString()));
-}
-
-void AudioClipsQuery::selectDescription(bool optional) {
-    m_selectDescription = true;
-    m_descriptionCondition = addOptional(optional,
-                                         QString("?r <%1> ?description . ")
-                                         .arg(MediaVocabulary().description().toString()));
-}
-
-void AudioClipsQuery::selectArtwork(bool optional) {
-    m_selectArtwork = true;
-    m_artworkCondition = addOptional(optional,
-                                     QString("?r <%1> ?artwork . ")
-                                     .arg(MediaVocabulary().artwork().toString()));
-}
-
-void AudioClipsQuery::searchString(QString str) {
-    if (! str.isEmpty()) {
-        m_searchCondition = QString(
-        "FILTER (regex(str(?artist),\"%1\",\"i\") || " 
-        "regex(str(?album),\"%1\",\"i\") || "
-        "regex(str(?title),\"%1\",\"i\")) ")
-        .arg(str);
-    }
-}
-
-
-void AudioClipsQuery::orderBy(QString var) {
-    if (!var.isEmpty()) {
-        m_order = "ORDER BY " + var;
-    }
-}
-
-
-QString AudioClipsQuery::addOptional(bool optional, QString str) {
-    if (optional) {
-        return QString("OPTIONAL { ") + str + "} . ";
-    } else {
-        return str;
-    }
-}
-
-QString AudioClipsQuery::getPrefix() {
-    return QString("PREFIX xesam: <%1> "
-    "PREFIX rdf: <%2> "
-    "PREFIX nmm: <%3> "
-    "PREFIX xls: <%4> "
-    "PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> ")
-    .arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString())
-    .arg(Soprano::Vocabulary::RDF::rdfNamespace().toString())
-    .arg("http://www.semanticdesktop.org/ontologies/nmm#")
-    .arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString());
-}
-
-Soprano::QueryResultIterator AudioClipsQuery::executeSelect(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += "SELECT ";
-    
-    if (m_distinct)
-        queryString += "DISTINCT ";
-    if (m_selectResource)
-        queryString += "?r ?url ";
-    if (m_selectTitle)
-        queryString += "?title ";
-    if (m_selectGenre)
-        queryString += "?genre ";
-    if (m_selectRating)
-        queryString += "?rating ";
-    if (m_selectDescription)
-        queryString += "?description ";
-    if (m_selectArtwork)
-        queryString += "?artwork ";
-    
-    //NOTE: nie:url is not in any released nie ontology that I can find.
-    //      In future KDE will use nfo:fileUrl so this will need to be changed.
-    queryString += QString("WHERE { ?r rdf:type <%1> . OPTIONAL { ?r nie:url ?url } . ")
-    .arg(MediaVocabulary().typeAudio().toString());
-    
-    queryString += m_titleCondition;
-    queryString += m_genreCondition;
-    queryString += m_ratingCondition;
-    queryString += m_searchCondition;
-    queryString += m_descriptionCondition;
-    queryString += m_artworkCondition;
-    
-    queryString += "} ";
-    
-    queryString += m_order;
-    
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql);
-}
-
-bool AudioClipsQuery::executeAsk(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += QString("ASK { ?r rdf:type <%1> . ")
-    .arg(MediaVocabulary().typeAudio().toString());
-    
-    queryString += m_titleCondition;
-    queryString += m_genreCondition;
-    queryString += m_ratingCondition;
-    queryString += m_searchCondition;
-    queryString += m_descriptionCondition;
-    
-    queryString += "} ";
-    
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql)
-                               .boolValue();
-}
diff --git a/src/platform/audioclipslistengine.h b/src/platform/audioclipslistengine.h
index 6089785..2916c0a 100644
--- a/src/platform/audioclipslistengine.h
+++ b/src/platform/audioclipslistengine.h
@@ -43,58 +43,11 @@ class AudioClipsListEngine : public NepomukListEngine
         ~AudioClipsListEngine();
         void run();
         void setFilterForSources(const QString& engineFilter);
-        
-    private:
-        MediaItem createMediaItem(Soprano::QueryResultIterator& it);
-        
+
     Q_SIGNALS:
         void results(QList<MediaItem> mediaList, MediaListProperties mediaListProperties, bool done);
         
 };
 
-/**
-* This class constructs a SPARQL query to query the nepomuk store.
-*/
-class AudioClipsQuery {
-    public:
-        AudioClipsQuery(bool distinct = true);
-        
-        void selectResource();
-        void selectTitle(bool optional=false);
-        void selectGenre(bool optional=false);
-        void selectRating(bool optional=false);
-        void selectDescription(bool optional=false);
-        void selectArtwork(bool optional=false);
-        
-        void searchString(QString str);
-        
-        void orderBy(QString var);
-        
-        Soprano::QueryResultIterator executeSelect(Soprano::Model* model);
-        bool executeAsk(Soprano::Model* model);
-        
-    private:
-        bool m_distinct;
-        
-        bool m_selectResource;
-        bool m_selectTitle;
-        bool m_selectGenre;
-        bool m_selectRating;
-        bool m_selectDescription;
-        bool m_selectArtwork;
-        
-        QString m_titleCondition;
-        QString m_genreCondition;
-        QString m_searchCondition;
-        QString m_ratingCondition;
-        QString m_descriptionCondition;
-        QString m_artworkCondition;
-        
-        QString m_order;
-        
-        QString addOptional(bool optional, QString str);
-        QString getPrefix();
-};
-
 #endif // AUDIOCLIPSLISTENGINE_H
 
diff --git a/src/platform/audiostreamlistengine.cpp b/src/platform/audiostreamlistengine.cpp
index 3252693..bea1332 100644
--- a/src/platform/audiostreamlistengine.cpp
+++ b/src/platform/audiostreamlistengine.cpp
@@ -20,18 +20,14 @@
 #include "mediaitemmodel.h"
 #include "listenginefactory.h"
 #include "mediavocabulary.h"
+#include "utilities.h"
 #include <KIcon>
 #include <KUrl>
 #include <KLocale>
 #include <Soprano/QueryResultIterator>
-#include <Soprano/Vocabulary/Xesam>
-#include <Soprano/Vocabulary/NAO>
-#include <Soprano/Vocabulary/RDF>
-#include <Soprano/Vocabulary/XMLSchema>
 #include <nepomuk/variant.h>
 #include <QApplication>
 #include <QTime>
-#include <taglib/fileref.h>
 
 AudioStreamListEngine::AudioStreamListEngine(ListEngineFactory * parent) : NepomukListEngine(parent)
 {
@@ -41,35 +37,6 @@ AudioStreamListEngine::~AudioStreamListEngine()
 {
 }
 
-MediaItem AudioStreamListEngine::createMediaItem(Soprano::QueryResultIterator& it) {
-    MediaItem mediaItem;
-    QUrl url = it.binding("url").uri().isEmpty() ? 
-                    it.binding("r").uri() :
-                    it.binding("url").uri();
-    mediaItem.url = url.toString();
-    mediaItem.title = it.binding("title").literal().toString();
-    mediaItem.fields["title"] = it.binding("title").literal().toString();
-    if (mediaItem.title.isEmpty()) {
-        if (KUrl(mediaItem.url).isLocalFile()) {
-            mediaItem.title = KUrl(mediaItem.url).fileName();
-        } else {
-            mediaItem.title = mediaItem.url;
-        }
-    }
-    
-    mediaItem.type = "Audio";
-    mediaItem.nowPlaying = false;
-    mediaItem.artwork = KIcon("x-media-podcast");
-    mediaItem.fields["url"] = mediaItem.url;
-    mediaItem.fields["genre"] = it.binding("genre").literal().toString();
-    mediaItem.fields["rating"] = it.binding("rating").literal().toInt();
-    mediaItem.fields["description"] = it.binding("description").literal().toString();
-    mediaItem.fields["artworkUrl"] = it.binding("artwork").uri().toString();
-    mediaItem.fields["audioType"] = "Audio Stream";
-
-    return mediaItem;
-}
-
 void AudioStreamListEngine::run()
 {
     if (m_updateSourceInfo || m_removeSourceInfo) {
@@ -86,21 +53,32 @@ void AudioStreamListEngine::run()
     
     if (m_nepomukInited) {
         if (engineArg.isEmpty()) {
-            AudioStreamQuery audioStreamQuery = AudioStreamQuery(true);
-            audioStreamQuery.selectResource();
-            audioStreamQuery.selectTitle();
-            audioStreamQuery.selectRating(true);
-            audioStreamQuery.selectDescription(true);
-            audioStreamQuery.selectArtwork(true);
-            //audioStreamQuery.selectGenre(true);
-            audioStreamQuery.orderBy("?title");
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            //bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudioStream(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = audioStreamQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Stream"));
                 mediaList.append(mediaItem);
             }
             
@@ -116,22 +94,37 @@ void AudioStreamListEngine::run()
             m_mediaListProperties.type = QString("Sources");
             
         } else if (engineArg.toLower() == "search") {
-            AudioStreamQuery audioStreamQuery = AudioStreamQuery(true);
-            audioStreamQuery.selectResource();
-            audioStreamQuery.selectTitle();
-            audioStreamQuery.selectRating(true);
-            audioStreamQuery.selectDescription(true);
-            audioStreamQuery.selectArtwork(true);
-            //audioStreamQuery.selectGenre(true);
-            audioStreamQuery.searchString(engineFilter);
-            audioStreamQuery.orderBy("?title");
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            //bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudioStream(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.startFilter();
+            query.addFilterConstraint(mediaVocabulary.titleBinding(), engineFilter, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.descriptionBinding(), engineFilter, MediaQuery::Contains);
+            query.endFilter();
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = audioStreamQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Audio Stream"));
                 mediaList.append(mediaItem);
             }
             
@@ -170,148 +163,3 @@ void AudioStreamListEngine::activateAction()
     
     model()->addResults(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature);
 }
-
-
-
-
-AudioStreamQuery::AudioStreamQuery(bool distinct) :
-m_distinct(distinct),
-m_selectResource(false),
-m_selectTitle(false),
-m_selectGenre(false)
-{
-}
-
-void AudioStreamQuery::selectResource() {
-    m_selectResource = true;
-}
-
-void AudioStreamQuery::selectTitle(bool optional) {
-    m_selectTitle = true;
-    m_titleCondition = addOptional(optional,
-                                   QString("?r <%1> ?title . ")
-                                   .arg(MediaVocabulary().title().toString()));
-}
-
-void AudioStreamQuery::selectGenre(bool optional) {
-    m_selectGenre = true;
-    m_genreCondition = addOptional(optional,
-                                         QString("?r <%1> ?genre . ")
-                                         .arg(MediaVocabulary().musicGenre().toString()));
-}
-
-void AudioStreamQuery::selectRating(bool optional) {
-    m_selectRating = true;
-    m_ratingCondition = addOptional(optional,
-                                   QString("?r <%1> ?rating . ")
-                                   .arg(Soprano::Vocabulary::NAO::numericRating().toString()));
-}
-
-void AudioStreamQuery::selectDescription(bool optional) {
-    m_selectDescription = true;
-    m_descriptionCondition = addOptional(optional,
-                                    QString("?r <%1> ?description . ")
-                                    .arg(MediaVocabulary().description().toString()));
-}
-
-void AudioStreamQuery::selectArtwork(bool optional) {
-    m_selectArtwork = true;
-    m_artworkCondition = addOptional(optional,
-                                         QString("?r <%1> ?artwork . ")
-                                         .arg(MediaVocabulary().artwork().toString()));
-}
-
-void AudioStreamQuery::searchString(QString str) {
-    if (! str.isEmpty()) {
-        m_searchCondition = QString(
-        "FILTER (regex(str(?artist),\"%1\",\"i\") || " 
-        "regex(str(?album),\"%1\",\"i\") || "
-        "regex(str(?title),\"%1\",\"i\")) ")
-        .arg(str);
-    }
-}
-
-
-void AudioStreamQuery::orderBy(QString var) {
-    if (!var.isEmpty()) {
-        m_order = "ORDER BY " + var;
-    }
-}
-
-
-QString AudioStreamQuery::addOptional(bool optional, QString str) {
-    if (optional) {
-        return QString("OPTIONAL { ") + str + "} . ";
-    } else {
-        return str;
-    }
-}
-
-QString AudioStreamQuery::getPrefix() {
-    return QString("PREFIX xesam: <%1> "
-    "PREFIX rdf: <%2> "
-    "PREFIX nmm: <%3> "
-    "PREFIX xls: <%4> "
-    "PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> ")
-    .arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString())
-    .arg(Soprano::Vocabulary::RDF::rdfNamespace().toString())
-    .arg("http://www.semanticdesktop.org/ontologies/nmm#")
-    .arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString());
-}
-
-Soprano::QueryResultIterator AudioStreamQuery::executeSelect(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += "SELECT ";
-    
-    if (m_distinct)
-        queryString += "DISTINCT ";
-    if (m_selectResource)
-        queryString += "?r ?url ";
-    if (m_selectTitle)
-        queryString += "?title ";
-    if (m_selectGenre)
-        queryString += "?genre ";
-    if (m_selectRating)
-        queryString += "?rating ";
-    if (m_selectDescription)
-        queryString += "?description ";
-    if (m_selectArtwork)
-        queryString += "?artwork ";
-    
-    //NOTE: nie:url is not in any released nie ontology that I can find.
-    //      In future KDE will use nfo:fileUrl so this will need to be changed.
-    queryString += QString("WHERE { ?r rdf:type <%1> . OPTIONAL { ?r nie:url ?url } . ")
-    .arg(MediaVocabulary().typeAudioStream().toString());
-    
-    queryString += m_titleCondition;
-    queryString += m_genreCondition;
-    queryString += m_ratingCondition;
-    queryString += m_searchCondition;
-    queryString += m_descriptionCondition;
-    queryString += m_artworkCondition;
-    
-    queryString += "} ";
-    
-    queryString += m_order;
-    
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql);
-}
-
-bool AudioStreamQuery::executeAsk(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += QString("ASK { ?r rdf:type <%1> . ")
-    .arg(MediaVocabulary().typeAudioStream().toString());
-    
-    queryString += m_titleCondition;
-    queryString += m_genreCondition;
-    queryString += m_ratingCondition;
-    queryString += m_searchCondition;
-    queryString += m_descriptionCondition;
-    
-    queryString += "} ";
-    
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql)
-                               .boolValue();
-}
diff --git a/src/platform/audiostreamlistengine.h b/src/platform/audiostreamlistengine.h
index 2a55583..fa36ec9 100644
--- a/src/platform/audiostreamlistengine.h
+++ b/src/platform/audiostreamlistengine.h
@@ -44,54 +44,10 @@ class AudioStreamListEngine : public NepomukListEngine
         void setFilterForSources(const QString& engineFilter);
         void activateAction();
         
-    private:
-        MediaItem createMediaItem(Soprano::QueryResultIterator& it);
-        
     Q_SIGNALS:
         void results(QList<MediaItem> mediaList, MediaListProperties mediaListProperties, bool done);
         
 };
 
-class AudioStreamQuery {
-    public:
-        AudioStreamQuery(bool distinct = true);
-        
-        void selectResource();
-        void selectTitle(bool optional=false);
-        void selectGenre(bool optional=false);
-        void selectRating(bool optional=false);
-        void selectDescription(bool optional=false);
-        void selectArtwork(bool optional=false);
-        
-        void searchString(QString str);
-        
-        void orderBy(QString var);
-        
-        Soprano::QueryResultIterator executeSelect(Soprano::Model* model);
-        bool executeAsk(Soprano::Model* model);
-        
-    private:
-        bool m_distinct;
-        
-        bool m_selectResource;
-        bool m_selectTitle;
-        bool m_selectGenre;
-        bool m_selectRating;
-        bool m_selectDescription;
-        bool m_selectArtwork;
-        
-        QString m_titleCondition;
-        QString m_genreCondition;
-        QString m_searchCondition;
-        QString m_ratingCondition;
-        QString m_descriptionCondition;
-        QString m_artworkCondition;
-        
-        QString m_order;
-        
-        QString addOptional(bool optional, QString str);
-        QString getPrefix();
-};
-
 #endif // AUDIOSTREAMLISTENGINE_H
 
diff --git a/src/platform/cdlistengine.h b/src/platform/cdlistengine.h
index f511015..a460c2a 100644
--- a/src/platform/cdlistengine.h
+++ b/src/platform/cdlistengine.h
@@ -47,8 +47,6 @@ class CDListEngine : public ListEngine
         void run();
         
     private:
-        QFileInfoList crawlDir(QDir dir, QStringList mimeFilter);
-        KUrl::List QFileInfoListToKUrlList(QFileInfoList fileInfoList);
         KCompactDisc::KCompactDisc *m_cdObject;
         Phonon::MediaObject *m_mediaObject;
         bool m_loadWhenReady;
diff --git a/src/platform/dvdlistengine.h b/src/platform/dvdlistengine.h
index 8b329b6..2dd1b51 100644
--- a/src/platform/dvdlistengine.h
+++ b/src/platform/dvdlistengine.h
@@ -46,8 +46,6 @@ class DVDListEngine : public ListEngine
         void run();
         
     private:
-        QFileInfoList crawlDir(QDir dir, QStringList mimeFilter);
-        KUrl::List QFileInfoListToKUrlList(QFileInfoList fileInfoList);
         KCompactDisc::KCompactDisc *m_cdObject;
         Phonon::MediaObject *m_mediaObject;
         bool m_loadWhenReady;
diff --git a/src/platform/filelistengine.cpp b/src/platform/filelistengine.cpp
index 892cb7a..c9c4cdb 100644
--- a/src/platform/filelistengine.cpp
+++ b/src/platform/filelistengine.cpp
@@ -217,7 +217,7 @@ void FileListEngine::activateAction()
     }
 }
 
-QFileInfoList FileListEngine::crawlDir(QDir dir, QStringList mimeFilter)
+QFileInfoList FileListEngine::crawlDir(const QDir &dir, const QStringList &mimeFilter)
 {
     QFileInfoList returnList;
     QFileInfoList fileList = dir.entryInfoList(QDir::Files, QDir::Name);
@@ -238,7 +238,7 @@ QFileInfoList FileListEngine::crawlDir(QDir dir, QStringList mimeFilter)
     return returnList;
 }
 
-KUrl::List FileListEngine::QFileInfoListToKUrlList(QFileInfoList fileInfoList)
+KUrl::List FileListEngine::QFileInfoListToKUrlList(const QFileInfoList &fileInfoList)
 {
     KUrl::List urlList;
     for (int i = 0; i < fileInfoList.count(); ++i) {
@@ -247,7 +247,7 @@ KUrl::List FileListEngine::QFileInfoListToKUrlList(QFileInfoList fileInfoList)
     return urlList;
 }
 
-QList<MediaItem> FileListEngine::readAudioUrlList(KUrl::List fileList)
+QList<MediaItem> FileListEngine::readAudioUrlList(const KUrl::List &fileList)
 {
     MediaVocabulary mediaVocabulary = MediaVocabulary();
     QList<MediaItem> mediaList;
@@ -263,7 +263,7 @@ QList<MediaItem> FileListEngine::readAudioUrlList(KUrl::List fileList)
             continue;
         } 
         mediaItem.artwork = KIcon("audio-mp4");
-        mediaItem.url = fileList.at(i).url();
+        mediaItem.url = fileList.at(i).prettyUrl();
         mediaItem.title = fileList.at(i).fileName();
         mediaItem.type = "Audio";
         mediaItem.fields["url"] = mediaItem.url;
@@ -283,18 +283,19 @@ QList<MediaItem> FileListEngine::readAudioUrlList(KUrl::List fileList)
                 KEncodingProber prober(KEncodingProber::Universal);
                 KEncodingProber::ProberState result = prober.feed(tmp.toAscii());
                 if (result != KEncodingProber::NotMe) {
-                    QByteArray encodingname = prober.encoding();
-                    QString track_encoding(encodingname);
-                    if ( ( track_encoding.toLatin1() == "gb18030" ) 
-                        || ( track_encoding.toLatin1() == "big5" )
-                        || ( track_encoding.toLatin1() == "euc-kr" ) 
-                        || ( track_encoding.toLatin1() == "euc-jp" )
-                        || ( track_encoding.toLatin1() == "koi8-r" ) ) {
+                    QByteArray encodingname = prober.encoding().toLower();
+                    if ( prober.confidence() > 0.47
+                        && ( ( encodingname == "gb18030" )
+                        || ( encodingname == "big5" )
+                        || ( encodingname == "euc-kr" )
+                        || ( encodingname == "euc-jp" )
+                        || ( encodingname == "koi8-r" ) ) ) {
                         title = QTextCodec::codecForName(encodingname)->toUnicode(title.toAscii());
                         artist = QTextCodec::codecForName(encodingname)->toUnicode(artist.toAscii());
                         album = QTextCodec::codecForName(encodingname)->toUnicode(album.toAscii());
                         genre = QTextCodec::codecForName(encodingname)->toUnicode(genre.toAscii());
-                    } else if (QTextCodec::codecForLocale()->name().toLower() != "utf-8") {
+                    } else if ((prober.confidence() < 0.3 || encodingname != "utf-8")
+                        && QTextCodec::codecForLocale()->name().toLower() != "utf-8") {
                         title = QTextCodec::codecForLocale()->toUnicode(title.toAscii());
                         artist = QTextCodec::codecForLocale()->toUnicode(artist.toAscii());
                         album = QTextCodec::codecForLocale()->toUnicode(album.toAscii());
@@ -322,10 +323,9 @@ QList<MediaItem> FileListEngine::readAudioUrlList(KUrl::List fileList)
                 Nepomuk::Resource res(mediaItem.url);
                 if (res.exists()) {
                     mediaItem.fields["rating"] = res.rating();
-                    Nepomuk::Resource artworkRes = res.property(mediaVocabulary.artwork()).toResource();
-                    if (artworkRes.isValid()) {
-                        mediaItem.fields["artworkUrl"] = artworkRes.resourceUri().toString();
-                    }
+                    mediaItem.fields["description"] = res.property(mediaVocabulary.description()).toString();
+                    mediaItem.fields["playCount"] = res.property(mediaVocabulary.playCount()).toInt();
+                    mediaItem.fields["lastPlayed"] = res.property(mediaVocabulary.lastPlayed()).toDateTime();
                 }
             }
             //Index all music files
@@ -333,21 +333,20 @@ QList<MediaItem> FileListEngine::readAudioUrlList(KUrl::List fileList)
         } else {
             mediaItem.fields["audioType"] = i18n("Audio Clip");
             if (m_nepomukInited) {
-                Nepomuk::Resource res(mediaItem.url);
-                if (res.exists()) {
-                    QString title = res.property(mediaVocabulary.title()).toString();
-                    if (!title.isEmpty()) {
-                        mediaItem.title = title;
-                        mediaItem.fields["title"] = title;
-                    }
-                    mediaItem.fields["rating"] = res.rating();
-                    Nepomuk::Resource artworkRes = res.property(mediaVocabulary.artwork()).toResource();
-                    if (artworkRes.isValid()) {
-                        mediaItem.fields["artworkUrl"] = artworkRes.resourceUri().toString();
-                    }
-                } else {
-                    //Index Audio Clips not found in nepomuk store
+                bool foundInNepomuk = false;
+                MediaItem foundMediaItem;
+                Nepomuk::Resource res(QUrl(mediaItem.url.toUtf8()));
+                if (res.exists() && (res.hasType(mediaVocabulary.typeAudio()) ||
+                    res.hasType(mediaVocabulary.typeAudioMusic()) ||
+                    res.hasType(mediaVocabulary.typeAudioStream())) ) {
+                    foundMediaItem = Utilities::mediaItemFromNepomuk(res);
+                    foundInNepomuk = true;
+                }
+                if (!foundInNepomuk || foundMediaItem.type.isEmpty()) {
+                    //Index video items not found in nepomuk store
                     m_mediaListToIndex << mediaItem;
+                } else {
+                    mediaItem = foundMediaItem;
                 }
             }
         }
@@ -356,7 +355,7 @@ QList<MediaItem> FileListEngine::readAudioUrlList(KUrl::List fileList)
     return mediaList;
 }
 
-QList<MediaItem> FileListEngine::readVideoUrlList(KUrl::List fileList)
+QList<MediaItem> FileListEngine::readVideoUrlList(const KUrl::List &fileList)
 {
     MediaVocabulary mediaVocabulary = MediaVocabulary();
     mediaVocabulary.setVocabulary(MediaVocabulary::nmm);
@@ -366,7 +365,7 @@ QList<MediaItem> FileListEngine::readVideoUrlList(KUrl::List fileList)
     for (int i = 0; i < fileList.count(); ++i) {
         MediaItem mediaItem;
         mediaItem.artwork = KIcon("video-x-generic");
-        mediaItem.url = fileList.at(i).url();
+        mediaItem.url = fileList.at(i).prettyUrl();
         mediaItem.title = fileList.at(i).fileName();
         mediaItem.type = "Video";
         mediaItem.fields["url"] = mediaItem.url;
@@ -374,138 +373,20 @@ QList<MediaItem> FileListEngine::readVideoUrlList(KUrl::List fileList)
         mediaItem.fields["videoType"] = "Video Clip";
         mediaItem.artwork = KIcon("video-x-generic");
         if (m_nepomukInited) {
-            Nepomuk::Resource res(mediaItem.url);
-            if (res.exists()) {
-                QString title = res.property(mediaVocabulary.title()).toString();
-                if (!title.isEmpty()) {
-                    mediaItem.title = title;
-                    mediaItem.fields["title"] = title;
-                }
-                QString description = res.property(mediaVocabulary.description()).toString();
-                if (!description.isEmpty()) {
-                    mediaItem.fields["description"] = description;
-                }
-                if (res.hasType(mediaVocabulary.typeVideoMovie())) {
-                    mediaItem.artwork = KIcon("tool-animator");
-                    mediaItem.fields["videoType"] = "Movie";
-                    QString synopsis = res.property(mediaVocabulary.videoSynopsis()).toString();
-                    if (!synopsis.isEmpty()) {
-                        mediaItem.fields["synopsis"] = synopsis;
-                    }
-                    QString genre = res.property(mediaVocabulary.videoGenre()).toString();
-                    if (!genre.isEmpty()) {
-                        mediaItem.fields["genre"] = genre;
-                    }
-                    QDate releaseDate = res.property(mediaVocabulary.releaseDate()).toDate();
-                    if (releaseDate.isValid()) {
-                        mediaItem.fields["releaseDate"] = releaseDate;
-                    }
-                    QString writer = res.property(mediaVocabulary.videoWriter()).toString();
-                    if (!writer.isEmpty()) {
-                        mediaItem.fields["writer"] = writer;
-                    }
-                    QString director = res.property(mediaVocabulary.videoDirector()).toString();
-                    if (!director.isEmpty()) {
-                        mediaItem.fields["director"] = director;
-                    }
-                    QString assistantDirector = res.property(mediaVocabulary.videoAssistantDirector()).toString();
-                    if (!assistantDirector.isEmpty()) {
-                        mediaItem.fields["assistantDirector"] = assistantDirector;
-                    }
-                    QString producer = res.property(mediaVocabulary.videoProducer()).toString();
-                    if (!producer.isEmpty()) {
-                        mediaItem.fields["producer"] = producer;
-                    }
-                    QString actor = res.property(mediaVocabulary.videoActor()).toString();
-                    if (!actor.isEmpty()) {
-                        mediaItem.fields["actor"] = actor;
-                    }
-                    QString cinematographer = res.property(mediaVocabulary.videoGenre()).toString();
-                    if (!cinematographer.isEmpty()) {
-                        mediaItem.fields["cinematographer"] = cinematographer;
-                    }
-                    
-                } else if (res.hasType(mediaVocabulary.typeVideoTVShow())) {
-                    mediaItem.artwork = KIcon("video-television");
-                    mediaItem.fields["videoType"] = "TV Show";
-                    Nepomuk::Resource series = res.property(mediaVocabulary.videoSeries()).toResource();
-                    QString seriesName = series.property(mediaVocabulary.title()).toString();
-                    if (!seriesName.isEmpty()) {
-                        mediaItem.fields["seriesName"] = seriesName;
-                        mediaItem.subTitle = seriesName;
-                    }
-                    int season = res.property(mediaVocabulary.videoSeason()).toInt();
-                    if (season !=0 ) {
-                        mediaItem.fields["season"] = season;
-                        if (!mediaItem.subTitle.isEmpty()) {
-                            mediaItem.subTitle = QString("%1 - Season %2")
-                            .arg(mediaItem.subTitle)
-                            .arg(season);
-                        } else {
-                            mediaItem.subTitle = QString("Season %1").arg(season);
-                        }
-                    }
-                    int episode = res.property(mediaVocabulary.videoEpisodeNumber()).toInt();
-                    if (episode !=0 ) {
-                        mediaItem.fields["episode"] = episode;
-                        if (!mediaItem.subTitle.isEmpty()) {
-                            mediaItem.subTitle = i18n("%1 - Episode %2", mediaItem.subTitle, episode);
-                        } else {
-                            mediaItem.subTitle = i18n("Episode %1", episode);
-                        }
-                    }
-                    QString synopsis = res.property(mediaVocabulary.videoSynopsis()).toString();
-                    if (!synopsis.isEmpty()) {
-                        mediaItem.fields["synopsis"] = synopsis;
-                    }
-                    QString genre = res.property(mediaVocabulary.videoGenre()).toString();
-                    if (!genre.isEmpty()) {
-                        mediaItem.fields["genre"] = genre;
-                    }
-                    QDate releaseDate = res.property(mediaVocabulary.releaseDate()).toDate();
-                    if (releaseDate.isValid()) {
-                        mediaItem.fields["releaseDate"] = releaseDate;
-                    }
-                    QString writer = res.property(mediaVocabulary.videoWriter()).toString();
-                    if (!writer.isEmpty()) {
-                        mediaItem.fields["writer"] = writer;
-                    }
-                    QString director = res.property(mediaVocabulary.videoDirector()).toString();
-                    if (!director.isEmpty()) {
-                        mediaItem.fields["director"] = director;
-                    }
-                    QString assistantDirector = res.property(mediaVocabulary.videoAssistantDirector()).toString();
-                    if (!assistantDirector.isEmpty()) {
-                        mediaItem.fields["assistantDirector"] = assistantDirector;
-                    }
-                    QString producer = res.property(mediaVocabulary.videoProducer()).toString();
-                    if (!producer.isEmpty()) {
-                        mediaItem.fields["producer"] = producer;
-                    }
-                    QString actor = res.property(mediaVocabulary.videoActor()).toString();
-                    if (!actor.isEmpty()) {
-                        mediaItem.fields["actor"] = actor;
-                    }
-                    QString cinematographer = res.property(mediaVocabulary.videoGenre()).toString();
-                    if (!cinematographer.isEmpty()) {
-                        mediaItem.fields["cinematographer"] = cinematographer;
-                    }
-                    
-                } else {
-                    mediaItem.fields["videoType"] = "Video Clip";
-                    mediaItem.artwork = KIcon("video-x-generic");
-                }
-                Nepomuk::Resource res(mediaItem.url);
-                if (res.exists()) {
-                    mediaItem.fields["rating"] = res.rating();
-                    Nepomuk::Resource artworkRes = res.property(mediaVocabulary.artwork()).toResource();
-                    if (artworkRes.isValid()) {
-                        mediaItem.fields["artworkUrl"] = artworkRes.resourceUri().toString();
-                    }
-                }
-            } else {
+            bool foundInNepomuk = false;
+            MediaItem foundMediaItem;
+            Nepomuk::Resource res(QUrl(mediaItem.url.toUtf8()));
+            if (res.exists() && (res.hasType(mediaVocabulary.typeVideo()) ||
+                res.hasType(mediaVocabulary.typeVideoMovie()) ||
+                res.hasType(mediaVocabulary.typeVideoTVShow())) ) {
+                foundMediaItem = Utilities::mediaItemFromNepomuk(res);
+                foundInNepomuk = true;
+            }
+            if (!foundInNepomuk) {
                 //Index video items not found in nepomuk store
                 m_mediaListToIndex << mediaItem;
+            } else {
+                mediaItem = foundMediaItem;
             }
         }
         mediaList << mediaItem;
@@ -513,7 +394,7 @@ QList<MediaItem> FileListEngine::readVideoUrlList(KUrl::List fileList)
     return mediaList;
 }
 
-QString FileListEngine::engineFilterFromUrlList(KUrl::List fileList)
+QString FileListEngine::engineFilterFromUrlList(const KUrl::List &fileList)
 {
     QString engineFilter;
     for (int i = 0; i < fileList.count(); i++) {
diff --git a/src/platform/filelistengine.h b/src/platform/filelistengine.h
index 39a9d99..b046e0e 100644
--- a/src/platform/filelistengine.h
+++ b/src/platform/filelistengine.h
@@ -54,11 +54,11 @@ class FileListEngine : public NepomukListEngine
         void activateAction();
         
     private:
-        QFileInfoList crawlDir(QDir dir, QStringList mimeFilter);
-        KUrl::List QFileInfoListToKUrlList(QFileInfoList fileInfoList);
-        QList<MediaItem> readAudioUrlList(KUrl::List fileList);
-        QList<MediaItem> readVideoUrlList(KUrl::List fileList);
-        QString engineFilterFromUrlList(KUrl::List fileList);
+        QFileInfoList crawlDir(const QDir &dir, const QStringList &mimeFilter);
+        KUrl::List QFileInfoListToKUrlList(const QFileInfoList &fileInfoList);
+        QList<MediaItem> readAudioUrlList(const KUrl::List &fileList);
+        QList<MediaItem> readVideoUrlList(const KUrl::List &fileList);
+        QString engineFilterFromUrlList(const KUrl::List &fileList);
         KUrl::List m_fileList;
         QString m_directoryPath;
         bool m_getFilesAction;
diff --git a/src/platform/listenginefactory.cpp b/src/platform/listenginefactory.cpp
index 68027cf..4b513ad 100644
--- a/src/platform/listenginefactory.cpp
+++ b/src/platform/listenginefactory.cpp
@@ -107,7 +107,7 @@ ListEngineFactory::~ListEngineFactory()
     }
 }
 
-ListEngine * ListEngineFactory::availableListEngine(QString engine)
+ListEngine * ListEngineFactory::availableListEngine(const QString &engine)
 {
     if (engine.toLower() == "music://") {
         //Search for available list engine
@@ -306,7 +306,7 @@ QString ListEngineFactory::generateRequestSignature()
     return QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz") + m_requestSignatureSeed;
 }
 
-bool ListEngineFactory::engineExists(QString engine)
+bool ListEngineFactory::engineExists(const QString &engine)
 {
     if (m_engines.indexOf(engine) != -1) {
         return true;
diff --git a/src/platform/listenginefactory.h b/src/platform/listenginefactory.h
index dd118d0..6a00c53 100644
--- a/src/platform/listenginefactory.h
+++ b/src/platform/listenginefactory.h
@@ -65,7 +65,7 @@ class ListEngineFactory : public QObject
          *               ListEngine should be returned.
          */
         
-        virtual ListEngine* availableListEngine(QString engine);
+        virtual ListEngine* availableListEngine(const QString &engine);
         
         /**
          * Generates a unique request signature the MediaItemModel
@@ -77,7 +77,7 @@ class ListEngineFactory : public QObject
          * Returns true if a ListEngine exists for the specified
          * engine.
          */
-        bool engineExists(QString engine);
+        bool engineExists(const QString &engine);
         
     private:
         MediaItemModel * m_parent;
diff --git a/src/platform/mediaindexer.cpp b/src/platform/mediaindexer.cpp
index c7317a9..e4def0a 100644
--- a/src/platform/mediaindexer.cpp
+++ b/src/platform/mediaindexer.cpp
@@ -47,7 +47,7 @@ MediaIndexer::~MediaIndexer()
 {
 }
 
-void MediaIndexer::updateInfo(QList<MediaItem> mediaList)
+void MediaIndexer::updateInfo(const QList<MediaItem> &mediaList)
 {
     if (m_nepomukInited && (mediaList.count() > 0)) {
         QString filename = QString("bangarang/%1.jb")
@@ -83,14 +83,14 @@ void MediaIndexer::updateInfo(QList<MediaItem> mediaList)
     }
 }
 
-void MediaIndexer::updateInfo(MediaItem mediaItem)
+void MediaIndexer::updateInfo(const MediaItem &mediaItem)
 {
     QList<MediaItem> mediaList;
     mediaList << mediaItem;
     updateInfo(mediaList);
 }
 
-void MediaIndexer::removeInfo(QList<MediaItem> mediaList)
+void MediaIndexer::removeInfo(const QList<MediaItem> &mediaList)
 {
     if (m_nepomukInited && (mediaList.count() > 0)) {
         QString filename = QString("bangarang/%1.jb")
@@ -123,14 +123,14 @@ void MediaIndexer::removeInfo(QList<MediaItem> mediaList)
     }
 }
 
-void MediaIndexer::removeInfo(MediaItem mediaItem)
+void MediaIndexer::removeInfo(const MediaItem &mediaItem)
 {
     QList<MediaItem> mediaList;
     mediaList << mediaItem;
     removeInfo(mediaList);
 }
 
-void MediaIndexer::updatePlaybackInfo(QString url, bool incrementPlayCount, QDateTime playDateTime)
+void MediaIndexer::updatePlaybackInfo(const QString &url, bool incrementPlayCount, const QDateTime &playDateTime)
 {
     if (m_nepomukInited && !url.isEmpty()) {
         QString filename = QString("bangarang/%1.jb")
@@ -167,7 +167,7 @@ void MediaIndexer::updatePlaybackInfo(QString url, bool incrementPlayCount, QDat
     }
 }
 
-void MediaIndexer::updateRating(QString url, int rating)
+void MediaIndexer::updateRating(const QString &url, int rating)
 {
     if (m_nepomukInited && !url.isEmpty()
         && (rating >= 0) && (rating <= 10)) {
diff --git a/src/platform/mediaindexer.h b/src/platform/mediaindexer.h
index e1f7c72..df4bd57 100644
--- a/src/platform/mediaindexer.h
+++ b/src/platform/mediaindexer.h
@@ -49,7 +49,7 @@ class MediaIndexer : public QObject
          *
          * @param mediaList List of MediaItems containing updated information.
          */
-        void updateInfo(QList<MediaItem> mediaList);
+        void updateInfo(const QList<MediaItem> &mediaList);
         
         /**
         * Update information in the Nepomuk datastore using the specified
@@ -57,7 +57,7 @@ class MediaIndexer : public QObject
         *
         * @param mediaItem MediaItem containing updated information.
         */
-        void updateInfo(MediaItem mediaItem);
+        void updateInfo(const MediaItem &mediaItem);
         
         /**
          * Remove media information from the Nepomuk datastore corresponding
@@ -66,7 +66,7 @@ class MediaIndexer : public QObject
          * @param mediaList List of MediaItems whose information should be
          *                  removed from the datastore.
          */
-        void removeInfo(QList<MediaItem> mediaList);
+        void removeInfo(const QList<MediaItem> &mediaList);
         
         /**
         * Remove media information from the Nepomuk datastore corresponding
@@ -75,7 +75,7 @@ class MediaIndexer : public QObject
         * @param mediaItem MediaItem whose information should be
         *                  removed from the datastore.
         */
-        void removeInfo(MediaItem mediaItem);
+        void removeInfo(const MediaItem &mediaItem);
         
         /**
          * Update the playback time and/or play count for the specified url.
@@ -84,7 +84,7 @@ class MediaIndexer : public QObject
          * @param incrementPlayCount if true, the play count will be incremented
          * @param playDateTime DateTime of playback
          */
-        void updatePlaybackInfo(QString url, bool incrementPlayCount, QDateTime playDateTime);
+        void updatePlaybackInfo(const QString &url, bool incrementPlayCount, const QDateTime &playDateTime);
         
         /**
          * Update the rating of the specified url.
@@ -92,7 +92,7 @@ class MediaIndexer : public QObject
          * @param url Url of MediaItem
          * @param rating Rating: and integer between 0 and 10
          */
-        void updateRating(QString url, int rating);
+        void updateRating(const QString &url, int rating);
         
         void state();
         
diff --git a/src/platform/mediaitemmodel.cpp b/src/platform/mediaitemmodel.cpp
index fee9114..9c5093d 100644
--- a/src/platform/mediaitemmodel.cpp
+++ b/src/platform/mediaitemmodel.cpp
@@ -20,6 +20,7 @@
 #include "listengine.h"
 #include "listenginefactory.h"
 #include "medialistcache.h"
+#include "utilities.h"
 
 #include <QFontMetrics>
 #include <QDateTime>
@@ -39,6 +40,8 @@ MediaItemModel::MediaItemModel(QObject * parent) : QStandardItemModel(parent)
     m_mediaListCache = new MediaListCache(parent);
     m_cacheThreshold = 3000; //default to 3 second loading threshold for adding to cache
     m_forceRefreshFromSource = false;
+    m_loadSources = false;
+    m_reload = false;
 }
 
 MediaItemModel::~MediaItemModel() 
@@ -85,7 +88,7 @@ MediaListProperties MediaItemModel::mediaListProperties()
     return m_mediaListProperties;
 }
 
-void MediaItemModel::setMediaListProperties(MediaListProperties mediaListProperties)
+void MediaItemModel::setMediaListProperties(const MediaListProperties &mediaListProperties)
 {
     if (m_mediaListProperties.lri != mediaListProperties.lri) {
         setLoadingState(false);
@@ -104,7 +107,7 @@ MediaItem MediaItemModel::mediaItemAt(int row)
     return m_mediaList.at(row);
 }
 
-int MediaItemModel::rowOfUrl(QString url)
+int MediaItemModel::rowOfUrl(const QString &url)
 {
     return m_urlList.indexOf(url);
 }
@@ -146,28 +149,44 @@ void MediaItemModel::load()
             m_forceRefreshFromSource = false;
         }
     }
+    m_loadSources = false;
 }
 
 void MediaItemModel::reload()
 {
-    if (!m_mediaListProperties.lri.isEmpty()) {
+    m_reload = true;
+    if (m_loadSources) {
+        // If the model was populated using loadSource then reload 
+        QList<MediaItem> mediaList = m_mediaListForLoadSources;
+        clearMediaListData();
+        loadSources(mediaList);
+    } else if (!m_mediaListProperties.lri.isEmpty()) {
         clearMediaListData();
         m_forceRefreshFromSource = true;
         load();
     }
 }
 
-void MediaItemModel::loadMediaList(QList<MediaItem> mediaList, bool emitMediaListChanged)
+void MediaItemModel::loadMediaList(const QList<MediaItem> &mediaList, bool emitMediaListChanged, bool updateExisting)
 {
     for (int i = 0 ; i < mediaList.count() ; ++i) {
-        loadMediaItem(mediaList.at(i));
+        if (updateExisting) {
+            int rowOfExisting = rowOfUrl(mediaList.at(i).url);
+            if (rowOfExisting != -1) {
+                replaceMediaItemAt(rowOfExisting, mediaList.at(i));
+            } else {
+                loadMediaItem(mediaList.at(i));
+            }
+        } else {
+            loadMediaItem(mediaList.at(i));
+        }
     }
     if (emitMediaListChanged) {
         emit mediaListChanged();
     }
 }
 
-void MediaItemModel::loadMediaItem(MediaItem mediaItem, bool emitMediaListChanged)
+void MediaItemModel::loadMediaItem(const MediaItem &mediaItem, bool emitMediaListChanged)
 {
     m_mediaList << mediaItem;
     m_urlList << mediaItem.url;
@@ -232,8 +251,13 @@ void MediaItemModel::actionActivated(QModelIndex index)
     }   
 }
 
-void MediaItemModel::loadSources(QList<MediaItem> mediaList)
+void MediaItemModel::loadSources(const QList<MediaItem> &mediaList)
 {
+
+    if (mediaList.count() == 0) {
+        return;
+    }
+    
     setLoadingState(true);
     
     //Load data only for media sources
@@ -241,6 +265,7 @@ void MediaItemModel::loadSources(QList<MediaItem> mediaList)
     m_subRequestSignatures.clear();
     m_subRequestsDone = 0;
     bool onlySources = true;
+    QList<MediaItem> categories;
     m_requestSignature = m_listEngineFactory->generateRequestSignature();
     for (int i = 0; i < mediaList.count(); ++i) {
         if ((mediaList.at(i).type == "Audio") || (mediaList.at(i).type == "Video") || (mediaList.at(i).type == "Image")){
@@ -250,6 +275,7 @@ void MediaItemModel::loadSources(QList<MediaItem> mediaList)
             }
         } else if (mediaList.at(i).type == "Category") {
             onlySources = false;
+            categories.append(mediaList.at(i));
             if (mediaList.count() == 1) {
                 MediaListProperties mediaListProperties;
                 mediaListProperties.lri =  mediaList.at(i).url;
@@ -289,10 +315,10 @@ void MediaItemModel::loadSources(QList<MediaItem> mediaList)
         emit mediaListChanged();
     } else {
         //Launch load requests
-        for (int i = 0; i < mediaList.count(); ++i) {
+        for (int i = 0; i < categories.count(); ++i) {
             MediaListProperties mediaListProperties;
-            mediaListProperties.lri = mediaList.at(i).url;
-            mediaListProperties.name = mediaList.at(i).title;
+            mediaListProperties.lri = categories.at(i).url;
+            mediaListProperties.name = categories.at(i).title;
             if (m_listEngineFactory->engineExists(mediaListProperties.engine())) {
                 
                 ListEngine * listEngine = m_listEngineFactory->availableListEngine(mediaListProperties.engine());
@@ -332,6 +358,9 @@ void MediaItemModel::loadSources(QList<MediaItem> mediaList)
             }
         }
     }
+    
+    m_loadSources = true;
+    m_mediaListForLoadSources = mediaList;
 }
 
 void MediaItemModel::addResults(QString requestSignature, QList<MediaItem> mediaList, MediaListProperties mediaListProperties, bool done, QString subRequestSignature)
@@ -348,12 +377,14 @@ void MediaItemModel::addResults(QString requestSignature, QList<MediaItem> media
    if ((mediaListProperties.lri == m_mediaListProperties.lri) || (requestSignature == m_requestSignature)) {
         if (m_subRequestSignatures.count() == 0) {
             setLoadingState(false);
-            loadMediaList(mediaList);
+            loadMediaList(mediaList, false, true);
             m_mediaListProperties = mediaListProperties;
             if (done) {
                 if (rowCount() == 0) {
                     showNoResultsMessage();
                 }
+                m_reload = false;
+                m_lriIsLoadable = true;
                 emit mediaListChanged();
             }
         } else {
@@ -370,18 +401,23 @@ void MediaItemModel::addResults(QString requestSignature, QList<MediaItem> media
                         //All the subrequests results are in, go ahead and load results in correct order
                         int count = 0;
                         for (int i = 0; i < m_subRequestMediaLists.count(); ++i) {
-                            loadMediaList(m_subRequestMediaLists.at(i));
+                            loadMediaList(m_subRequestMediaLists.at(i), false, true);
                             count += m_subRequestMediaLists.at(i).count();
                         }
                         if (rowCount() == 0) {
                             showNoResultsMessage();
                         }
-                        m_mediaListProperties.lri = QString();
-                        m_mediaListProperties.name = i18n("Multiple %1", m_mediaListProperties.name);
+                        //Need a basic lri so updateInfo and removeInfo can be performed by a list engine
+                        m_mediaListProperties.lri = mediaListProperties.engine(); 
+                        if (!m_reload) {
+                            m_mediaListProperties.name = i18n("Multiple %1", m_mediaListProperties.name);
+                        }
                         m_mediaListProperties.summary = i18np("1 item", "%1 items", count);
                         m_subRequestMediaLists.clear();
                         m_subRequestSignatures.clear();
                         m_subRequestsDone = 0;
+                        m_reload = false;
+                        m_lriIsLoadable = false;
                         emit mediaListChanged();
                     }
                 }
@@ -428,9 +464,13 @@ void MediaItemModel::removeMediaItem(QString url)
 
 void MediaItemModel::clearMediaListData(bool emitMediaListChanged)
 {
+    disconnect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(synchRemoveRows(const QModelIndex &, int, int)));
     removeRows(0, rowCount());
     m_mediaList.clear();
     m_urlList.clear();
+    connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SLOT(synchRemoveRows(const QModelIndex &, int, int)));
+    m_loadSources = false;
+    m_mediaListForLoadSources.clear();
     if (emitMediaListChanged) {
         emit mediaListChanged();
     }
@@ -451,7 +491,7 @@ void MediaItemModel::removeMediaItemAt(int row, bool emitMediaListChanged)
     }
 }
 
-void MediaItemModel::replaceMediaItemAt(int row, MediaItem mediaItem, bool emitMediaListChanged)
+void MediaItemModel::replaceMediaItemAt(int row, const MediaItem &mediaItem, bool emitMediaListChanged)
 {
     m_mediaList.replace(row, mediaItem);
     m_urlList.replace(row, mediaItem.url);
@@ -565,7 +605,7 @@ QList<QStandardItem *> MediaItemModel::rowDataFromMediaItem(MediaItem mediaItem)
     } else if (mediaItem.type == "Category") {
        KIcon categoryActionIcon;
        QString tooltip;
-       categoryActionIcon = KIcon("system-run");
+       categoryActionIcon = KIcon("bangarang-category-browse");
        if (mediaItem.url.startsWith("music://songs")) {
            tooltip = "Show Songs";
        } else if (mediaItem.url.startsWith("music://albums")) {
@@ -596,10 +636,11 @@ Qt::ItemFlags MediaItemModel::flags(const QModelIndex &index) const
     //Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index);
     Qt::ItemFlags defaultFlags = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
     
-    if (index.isValid())
-        return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled |defaultFlags;
-    else
-        return defaultFlags;
+    if (index.isValid()) {
+        return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
+    } else {
+        return Qt::ItemIsDropEnabled | defaultFlags;
+    }
 }
 
 QStringList MediaItemModel::mimeTypes() const
@@ -618,7 +659,7 @@ QMimeData *MediaItemModel::mimeData(const QModelIndexList &indexes) const
         if (index.isValid() && index.column() != 1) {
             QUrl url = QUrl(data(index, MediaItem::UrlRole).toString());
             urls << url;
-            indexList += QString("%1,").arg(index.row());
+            indexList += QString("BangarangRow:%1,").arg(index.row());
         }
     }
     
@@ -650,36 +691,57 @@ bool MediaItemModel::dropMimeData(const QMimeData *data,
     }
     
     QList<QUrl> urls = data->urls();
-    QStringList rowsToMove = data->text().split(",", QString::SkipEmptyParts);
+    
+    bool internalMove = false;
+    QStringList rowsToMove;
+    if (data->text().startsWith("BangarangRow:")) {
+        rowsToMove = data->text().split(",", QString::SkipEmptyParts);
+        internalMove = true;
+    }
 
     //insert rows into model
-    QList<MediaItem> mediaItemsToMove;
+    QList<MediaItem> mediaItemsInserted;
     int insertionRow = beginRow;
     for (int i = 0; i < urls.count(); i++) {
-        if (rowsToMove.count() > 0) {
-            int rowToMove = rowsToMove.at(i).toInt();
+        if (internalMove) {
+            QString rowEntry = rowsToMove.at(i);
+            int rowToMove = rowEntry.remove("BangarangRow:").toInt();
             MediaItem mediaItem = mediaItemAt(rowToMove);
-            mediaItemsToMove << mediaItem;
+            mediaItemsInserted << mediaItem;
             QList<QStandardItem *> rowItems = rowDataFromMediaItem(mediaItem);
             insertRow(insertionRow, rowItems);
             insertionRow = insertionRow + 1;
+        } else {
+            QString url = QUrl::fromPercentEncoding(urls.at(i).toString().toUtf8());
+            if (Utilities::isAudio(url) || Utilities::isVideo(url)) {
+                MediaItem mediaItem = Utilities::mediaItemFromUrl(KUrl(url));
+                mediaItemsInserted << mediaItem;
+                QList<QStandardItem *> rowItems = rowDataFromMediaItem(mediaItem);
+                insertRow(insertionRow, rowItems);
+                insertionRow = insertionRow + 1;
+            }
         }
     }
     
     //Update cached data to reflect inserted rows
     insertionRow = beginRow;
-    for (int i = 0; i < urls.count(); i++) {
-        MediaItem mediaItem = mediaItemsToMove.at(i);
+    for (int i = 0; i < mediaItemsInserted.count(); i++) {
+        MediaItem mediaItem = mediaItemsInserted.at(i);
         m_mediaList.insert(insertionRow, mediaItem);
         m_urlList.insert(insertionRow, mediaItem.url);
         insertionRow = insertionRow + 1;
     }
-    m_emitChangedAfterDrop = true;
+    
+    if (internalMove) {
+        m_emitChangedAfterDrop = true;
+    } else {
+        emit mediaListChanged();
+    }
     
     return true;
 }
 
-void MediaItemModel::removeSourceInfo(QList<MediaItem> mediaList)
+void MediaItemModel::removeSourceInfo(const QList<MediaItem> &mediaList)
 {
     //Assumes that items in mediaList are items currently in model
     if (m_listEngineFactory->engineExists(m_mediaListProperties.engine())) {
@@ -688,7 +750,7 @@ void MediaItemModel::removeSourceInfo(QList<MediaItem> mediaList)
     }
 }
 
-void MediaItemModel::updateSourceInfo(QList<MediaItem> mediaList)
+void MediaItemModel::updateSourceInfo(const QList<MediaItem> &mediaList)
 {
     //Assumes that items in mediaList are items currently in model
     if (m_listEngineFactory->engineExists(m_mediaListProperties.engine())) {
@@ -717,3 +779,7 @@ MediaListCache * MediaItemModel::mediaListCache()
     return m_mediaListCache;
 }
 
+bool MediaItemModel::lriIsLoadable()
+{
+    return m_lriIsLoadable;
+}
\ No newline at end of file
diff --git a/src/platform/mediaitemmodel.h b/src/platform/mediaitemmodel.h
index 43ea03b..a64c29d 100644
--- a/src/platform/mediaitemmodel.h
+++ b/src/platform/mediaitemmodel.h
@@ -254,7 +254,7 @@ class MediaItemModel : public QStandardItemModel
          *       MediaListProperties.lri should either be updated to correspond 
          *       to mediaList or set to QString().
          */
-        void loadMediaList(QList<MediaItem> mediaList, bool emitMediaListChanged = false);
+        void loadMediaList(const QList<MediaItem> &mediaList, bool emitMediaListChanged = false, bool updateExisting = false);
         
         /**
          * Loads a MediaItem directly into the model
@@ -266,7 +266,7 @@ class MediaItemModel : public QStandardItemModel
          *       MediaListProperties.lri should either be updated to correspond 
          *       to mediaList or set to QString().
          */
-        void loadMediaItem(MediaItem mediaItem, bool emitMediaListChanged = false);
+        void loadMediaItem(const MediaItem &mediaItem, bool emitMediaListChanged = false);
         
         /**
          * Loads playable MediaItems into the model.
@@ -280,7 +280,12 @@ class MediaItemModel : public QStandardItemModel
          *                  (type = "Audio" or "Video") then they will be directly 
          *                  loaded into the model.
          */
-        void loadSources(QList<MediaItem> mediaList);
+        void loadSources(const QList<MediaItem> &mediaList);
+        
+        /**
+         * Returns true if lri is loadable
+         **/
+        bool lriIsLoadable();
         
         /**
          * Returns the MediaItem associated with the specified row in the model.
@@ -338,7 +343,7 @@ class MediaItemModel : public QStandardItemModel
          *       can be used to retrieve the MediaItem, its ListEngine can
          *       remove information for the MediaItem.
          */
-        void removeSourceInfo(QList<MediaItem> mediaList);
+        void removeSourceInfo(const QList<MediaItem> &mediaList);
         
         /**
          * Replace MediaItem at the specified row in the model with the one
@@ -350,7 +355,7 @@ class MediaItemModel : public QStandardItemModel
          *                             otherwise don't emit mediaListChanged().
          *
          */
-        void replaceMediaItemAt(int row, MediaItem mediaItem, bool emitMediaListChanged = false);
+        void replaceMediaItemAt(int row, const MediaItem &mediaItem, bool emitMediaListChanged = false);
         
         /**
          * Return the row of a MediaItem whose url matches the one provided
@@ -359,7 +364,7 @@ class MediaItemModel : public QStandardItemModel
          *
          * @return row of model
          */
-        int rowOfUrl(QString url);
+        int rowOfUrl(const QString &url);
         
         /**
          * Sets the threshold for the cache.
@@ -378,7 +383,7 @@ class MediaItemModel : public QStandardItemModel
          *                            model.  A subsequent load() call will 
          *                            use the MediaListProperties.lri.
          */
-        void setMediaListProperties(MediaListProperties mediaListProperties);
+        void setMediaListProperties(const MediaListProperties &mediaListProperties);
         
         /**
          * Sets the cache for the model to use.
@@ -417,7 +422,7 @@ class MediaItemModel : public QStandardItemModel
         *       can be used to retrieve the MediaItem, its ListEngine can
         *       update information for the MediaItem.
         */
-        void updateSourceInfo(QList<MediaItem> mediaList);
+        void updateSourceInfo(const QList<MediaItem> &mediaList);
         
         QString dataEngine();
         QString filter();
@@ -575,7 +580,11 @@ class MediaItemModel : public QStandardItemModel
         MediaListCache * m_mediaListCache;
         bool m_forceRefreshFromSource;
         QHash<QString, QTime> m_lriStartTimes;
-        QList<QString> m_lrisLoading;        
+        QList<QString> m_lrisLoading; 
+        bool m_loadSources;
+        QList<MediaItem> m_mediaListForLoadSources;
+        bool m_reload;
+        bool m_lriIsLoadable;
 
 };
 
diff --git a/src/platform/medialistcache.cpp b/src/platform/medialistcache.cpp
index e694616..c3853b2 100644
--- a/src/platform/medialistcache.cpp
+++ b/src/platform/medialistcache.cpp
@@ -46,7 +46,7 @@ void MediaListCache::addMediaList(MediaListProperties mediaListProperties, QList
     }
 }
 
-void MediaListCache::removeMediaList(QString lri)
+void MediaListCache::removeMediaList(const QString &lri)
 {
     if (m_lris.indexOf(lri) != -1) {
         int index = m_lris.indexOf(lri);
@@ -57,7 +57,7 @@ void MediaListCache::removeMediaList(QString lri)
     }
 }
 
-QList<MediaItem> MediaListCache::mediaList(QString lri)
+QList<MediaItem> MediaListCache::mediaList(const QString &lri)
 {
     if (m_lris.indexOf(lri) != -1) {
         int index = m_lris.indexOf(lri);
@@ -68,7 +68,7 @@ QList<MediaItem> MediaListCache::mediaList(QString lri)
     }
 }
 
-MediaListProperties MediaListCache::mediaListProperties(QString lri)
+MediaListProperties MediaListCache::mediaListProperties(const QString &lri)
 {
     if (m_lris.indexOf(lri) != -1) {
         int index = m_lris.indexOf(lri);
@@ -79,7 +79,7 @@ MediaListProperties MediaListCache::mediaListProperties(QString lri)
     }
 }
 
-bool MediaListCache::isInCache(QString lri)
+bool MediaListCache::isInCache(const QString &lri)
 {
     if (m_lris.indexOf(lri) != -1) {
         return true;
diff --git a/src/platform/medialistcache.h b/src/platform/medialistcache.h
index 349cf54..c099127 100644
--- a/src/platform/medialistcache.h
+++ b/src/platform/medialistcache.h
@@ -36,10 +36,10 @@ class MediaListCache : public QObject
         ~MediaListCache();
         
         void addMediaList(MediaListProperties mediaListProperties, QList<MediaItem> mediaList);
-        void removeMediaList(QString lri);
-        QList<MediaItem> mediaList(QString lri);
-        MediaListProperties mediaListProperties(QString lri);
-        bool isInCache(QString lri);
+        void removeMediaList(const QString &lri);
+        QList<MediaItem> mediaList(const QString &lri);
+        MediaListProperties mediaListProperties(const QString &lri);
+        bool isInCache(const QString &lri);
         
     private:
         QList< QList<MediaItem> > m_mediaListCache;
diff --git a/src/platform/medialistsengine.h b/src/platform/medialistsengine.h
index 7c986ba..e6a4001 100644
--- a/src/platform/medialistsengine.h
+++ b/src/platform/medialistsengine.h
@@ -46,8 +46,6 @@ class MediaListsEngine : public NepomukListEngine
         void run();
         
     private:
-        QFileInfoList crawlDir(QDir dir, QStringList mimeFilter);
-        KUrl::List QFileInfoListToKUrlList(QFileInfoList fileInfoList);
         bool m_loadWhenReady;
     
     Q_SIGNALS:
diff --git a/src/platform/mediaquery.cpp b/src/platform/mediaquery.cpp
new file mode 100644
index 0000000..e174bbb
--- /dev/null
+++ b/src/platform/mediaquery.cpp
@@ -0,0 +1,186 @@
+/* BANGARANG MEDIA PLAYER
+* Copyright (C) 2009 Andrew Lake (jamboarder at yahoo.com)
+* <http://gitorious.org/bangarang>
+*
+* 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "mediaquery.h"
+#include "mediavocabulary.h"
+#include <kdeversion.h>
+#include <KDebug>
+#include <Soprano/QueryResultIterator>
+#include <Soprano/Vocabulary/Xesam>
+#include <Soprano/Vocabulary/NAO>
+#include <Soprano/Vocabulary/RDF>
+#include <Soprano/Vocabulary/XMLSchema>
+
+
+MediaQuery::MediaQuery()
+{
+    m_queryPrefix = QString("PREFIX xesam: <%1> "
+                    "PREFIX rdf: <%2> "
+                    "PREFIX xls: <%3> "
+                    "PREFIX nmm: <http://www.semanticdesktop.org/ontologies/nmm#> "
+                    "PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> "
+                    "PREFIX nfo: <http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#> ")
+                    .arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString())
+                    .arg(Soprano::Vocabulary::RDF::rdfNamespace().toString())
+                    .arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString());
+}
+
+MediaQuery::~MediaQuery()
+{
+}
+
+void MediaQuery::select(const QStringList &bindings, SelectType selectType)
+{
+    m_queryForm += "SELECT ";
+    if (selectType == Distinct) {
+        m_queryForm += "DISTINCT ";
+    }
+    for (int i = 0; i < bindings.count(); i++) {
+        m_queryForm += QString("?%1 ").arg(bindings.at(i));
+    }
+}
+
+void MediaQuery::startWhere()
+{
+    m_queryForm += "WHERE { ";
+}
+
+void MediaQuery::addCondition(const QString &condition)
+{
+    m_queryCondition += condition;
+}
+
+void MediaQuery::startFilter()
+{
+    m_queryCondition += "FILTER ( ";
+}
+
+void MediaQuery::startSubFilter()
+{
+    m_queryCondition += "( ";
+}
+
+void MediaQuery::addFilterOr()
+{
+    m_queryCondition += "|| ";
+}
+
+void MediaQuery::addFilterAnd()
+{
+    m_queryCondition += "&& ";
+}
+
+void MediaQuery::addFilterConstraint(const QString &binding, const QString &test,
+                                     MediaQuery::Constraint constraint)
+{
+    m_queryCondition += filterConstraint(binding, test, constraint);
+}
+
+void MediaQuery::addFilterConstraint(const QString &binding, int test,
+                         MediaQuery::Constraint constraint)
+{
+    m_queryCondition += filterConstraint(binding, test, constraint);
+}
+
+void MediaQuery::addFilterConstraint(const QString &binding, QDate test,
+                         MediaQuery::Constraint constraint)
+{
+    m_queryCondition += filterConstraint(binding, test, constraint);
+}
+
+void MediaQuery::addFilterConstraint(const QString &binding, QDateTime test,
+                         MediaQuery::Constraint constraint)
+{
+    m_queryCondition += filterConstraint(binding, test, constraint);
+}
+
+
+void MediaQuery::addFilterString(const QString &filterString)
+{
+    m_queryCondition += filterString;
+}
+
+void MediaQuery::endSubFilter()
+{
+    m_queryCondition += ") ";
+}
+
+void MediaQuery::endFilter()
+{
+    m_queryCondition += ") ";
+}
+
+void MediaQuery::endWhere()
+{
+    m_querySuffix += "} ";
+}
+
+void MediaQuery::orderBy(const QStringList &bindings, QList<MediaQuery::Order> order)
+{
+    m_querySuffix += "ORDER BY ";
+    for (int i = 0; i < bindings.count(); i++) {
+        QString orderPrefix;
+        if (order.count() == 0) {
+            orderPrefix = "ASC";
+        } else if (order.at(i) == Ascending) {
+            orderPrefix = "ASC";
+        } else if (order.at(i) == Descending) {
+            orderPrefix = "DESC";
+        }
+        m_querySuffix += QString("%1( ?%2 ) ")
+                         .arg(orderPrefix)
+                         .arg(bindings.at(i));
+    }
+}
+
+void MediaQuery::addLimit(int limit)
+{
+    if (limit > 0) {
+        m_querySuffix += QString("LIMIT %1 ").arg(limit);
+    }
+}
+
+void MediaQuery::addOffset(int offset)
+{
+    if (offset > 0) {
+        m_querySuffix += QString("OFFSET %1 ").arg(offset);
+    }
+}
+
+
+void MediaQuery::addExtra(const QString &extra)
+{
+    m_querySuffix += extra + QString(" ");
+}
+
+QString MediaQuery::query()
+{
+    return m_queryPrefix + m_queryForm + m_queryCondition + m_querySuffix;
+}
+
+Soprano::QueryResultIterator MediaQuery::executeSelect(Soprano::Model* model)
+{
+    QString query = m_queryPrefix + m_queryForm + m_queryCondition + m_querySuffix;
+    return model->executeQuery(query, Soprano::Query::QueryLanguageSparql);
+}
+
+bool MediaQuery::executeAsk(Soprano::Model* model)
+{
+    QString query = m_queryPrefix + QString("ASK { %1 } ").arg(m_queryCondition);
+    return model->executeQuery(query, Soprano::Query::QueryLanguageSparql).boolValue();
+}
diff --git a/src/platform/mediaquery.h b/src/platform/mediaquery.h
new file mode 100644
index 0000000..e09c91c
--- /dev/null
+++ b/src/platform/mediaquery.h
@@ -0,0 +1,240 @@
+/* BANGARANG MEDIA PLAYER
+* Copyright (C) 2009 Andrew Lake (jamboarder at yahoo.com)
+* <http://gitorious.org/bangarang>
+*
+* 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 3 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, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef MEDIAQUERY_H
+#define MEDIAQUERY_H
+
+#include <QtCore>
+#include <Soprano/QueryResultIterator>
+#include <Soprano/Model>
+
+class MediaQuery {
+    
+    public:
+        MediaQuery();
+        ~MediaQuery();
+        
+        enum SelectType{NonDistinct = 0, Distinct = 1};
+        enum Constraint {Equal = 0, 
+                         NotEqual = 1,
+                         Contains = 2, 
+                         GreaterThan = 3, 
+                         LessThan = 4,
+                         GreaterThanOrEqual = 5,
+                         LessThanOrEqual = 6,
+                         Bound = 7,
+                         NotBound = 8};
+        
+        enum Match {Required = 0, Optional = 1};
+        
+        enum Order{Ascending = 0, Descending = 1};
+        
+        void select(const QStringList &bindings, SelectType selectType = NonDistinct);
+        void startWhere();
+        void addCondition(const QString &condition);
+        void startFilter();
+        void startSubFilter();
+        void addFilterOr();
+        void addFilterAnd();
+        void addFilterConstraint(const QString &binding, const QString &test,
+                                 MediaQuery::Constraint constraint);
+        void addFilterConstraint(const QString &binding, int test,
+                               MediaQuery::Constraint constraint);
+        void addFilterConstraint(const QString &binding, QDate test,
+                               MediaQuery::Constraint constraint);
+        void addFilterConstraint(const QString &binding, QDateTime test,
+                               MediaQuery::Constraint constraint);
+        void addFilterString(const QString & filterString);
+        void endSubFilter();
+        void endFilter();
+        void endWhere();
+        void orderBy(const QStringList &bindings, 
+                     QList<Order> order = QList<Order>());
+        void addLimit(int limit);
+        void addOffset(int offset);
+        void addExtra(const QString &extra);
+        QString query();
+        
+        Soprano::QueryResultIterator executeSelect(Soprano::Model* model);
+        bool executeAsk(Soprano::Model* model);
+        
+        static QString addOptional(const QString &str) {
+            return QString("OPTIONAL { ") + str + "} . ";
+        }
+
+        static QString hasType(const QString &resourceBinding, const QUrl &type)
+        {
+            return QString("?%1 rdf:type <%2> . ")
+            .arg(resourceBinding)
+            .arg(type.toString());
+        }
+
+        static QString hasProperty(const QString &resourceBinding, const QUrl &property, const QString &propertyBinding)
+        {
+            return QString("?%1 <%2> ?%3 . ")
+            .arg(resourceBinding)
+            .arg(property.toString())
+            .arg(propertyBinding);
+        }
+                
+        static QString filterConstraint(const QString &binding, const QString &test,
+                                        MediaQuery::Constraint constraint)
+        {
+            QString statement;
+            if (constraint == MediaQuery::Equal) {
+                statement += QString(" (str(?%1) = %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::NotEqual) {
+                statement += QString(" (str(?%1) != %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::Contains) {
+                statement += QString(" (regex(str(?%1), \"%2\", \"i\")) ")
+                .arg(binding)
+                .arg(test);
+            } else if (constraint == MediaQuery::LessThan) {
+                statement += QString(" (str(?%1) < %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThan) {
+                statement += QString(" (str(?%1) > %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::LessThanOrEqual) {
+                statement += QString(" (str(?%1) <= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThanOrEqual) {
+                statement += QString(" (str(?%1) >= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::Bound) {
+                statement += QString(" bound(?%1) ")
+                .arg(binding);
+            } else if (constraint == MediaQuery::NotBound) {
+                statement += QString(" !bound(?%1) ")
+                .arg(binding);
+            }
+            return statement;
+        }
+        
+        static QString filterConstraint(const QString &binding, int test,
+                                        MediaQuery::Constraint constraint)
+        {
+            QString statement;
+            if (constraint == MediaQuery::Equal) {
+                statement += QString(" (?%1 = %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::NotEqual) {
+                statement += QString(" (?%1 != %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::LessThan) {
+                statement += QString(" (?%1 < %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThan) {
+                statement += QString(" (?%1 > %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::LessThanOrEqual) {
+                statement += QString(" (?%1 <= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThanOrEqual) {
+                statement += QString(" (?%1 >= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            }
+            return statement;
+        }
+        
+        static QString filterConstraint(const QString &binding, QDate test,
+                                        MediaQuery::Constraint constraint)
+        {
+            QString statement;
+            if (constraint == MediaQuery::Equal) {
+                statement += QString(" (dT(?%1) = %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::NotEqual) {
+                statement += QString(" (dT(?%1) != %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::LessThan) {
+                statement += QString(" (dT(?%1) < %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThan) {
+                statement += QString(" (dT(?%1) > %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::LessThanOrEqual) {
+                statement += QString(" (dT(?%1) <= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThanOrEqual) {
+                statement += QString(" (dT(?%1) >= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            }
+            return statement;
+        }
+        
+        static QString filterConstraint(const QString &binding, QDateTime test,
+                               MediaQuery::Constraint constraint)
+        {
+            QString statement;
+            if (constraint == MediaQuery::Equal) {
+                statement += QString(" (dT(?%1) = %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::NotEqual) {
+                statement += QString(" (dT(?%1) != %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::LessThan) {
+                statement += QString(" (dT(?%1) < %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThan) {
+                statement += QString(" (dT(?%1) > %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::LessThanOrEqual) {
+                statement += QString(" (dT(?%1) <= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            } else if (constraint == MediaQuery::GreaterThanOrEqual) {
+                statement += QString(" (dT(?%1) >= %2) ")
+                .arg(binding)
+                .arg(Soprano::Node::literalToN3(test));
+            }
+            return statement;
+        }
+
+
+    private:
+        QString m_queryPrefix;
+        QString m_queryForm;
+        QString m_queryCondition;
+        QString m_querySuffix;
+};
+#endif // MEDIAQUERY_H
\ No newline at end of file
diff --git a/src/platform/mediavocabulary.cpp b/src/platform/mediavocabulary.cpp
index b4809db..7216c7a 100644
--- a/src/platform/mediavocabulary.cpp
+++ b/src/platform/mediavocabulary.cpp
@@ -17,15 +17,25 @@
 */
 
 #include "mediavocabulary.h"
+#include <kdeversion.h>
+#include <KDebug>
+#include <Soprano/QueryResultIterator>
 #include <Soprano/Vocabulary/Xesam>
+#include <Soprano/Vocabulary/NAO>
 #include <Soprano/Vocabulary/RDF>
-
+#include <Soprano/Vocabulary/XMLSchema>
 
 MediaVocabulary::MediaVocabulary()
 {
-    m_vocabulary = MediaVocabulary::xesam;
-    m_audioVocabulary = MediaVocabulary::nie;
-    m_musicVocabulary = MediaVocabulary::xesam;
+    if ((KDE::versionMinor() <= 3) && (KDE::versionRelease() < 83)) {
+        m_vocabulary = MediaVocabulary::xesam;
+        m_audioVocabulary = MediaVocabulary::nie;
+        m_musicVocabulary = MediaVocabulary::xesam;
+    } else {
+        m_vocabulary = MediaVocabulary::nmm;
+        m_audioVocabulary = MediaVocabulary::nmm;
+        m_musicVocabulary = MediaVocabulary::nmm;
+    }
     m_videoVocabulary = MediaVocabulary::nmm;
 }
 
@@ -103,7 +113,7 @@ QUrl MediaVocabulary::mediaNamespace(int vocabulary)
     if (vocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::xesamNamespace();
     } else if (vocabulary == MediaVocabulary::nie) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nie#");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#");
     } else if (vocabulary == MediaVocabulary::nmm) {
         returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nmm#");
     } else if (vocabulary == MediaVocabulary::nid3) {
@@ -215,16 +225,41 @@ QUrl MediaVocabulary::typeImage()
     return returnUrl;
 }
 
+QUrl MediaVocabulary::typeMusicArtist()
+{
+    QUrl returnUrl = QUrl();
+    if (m_musicVocabulary == MediaVocabulary::nmm) {
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact");
+    }
+    
+    return returnUrl;
+}
+
+QUrl MediaVocabulary::typeMusicAlbum()
+{
+    QUrl returnUrl = QUrl();
+    if (m_musicVocabulary == MediaVocabulary::nmm) {
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nmm#MusicAlbum");
+    }
+    
+    return returnUrl;
+}
+
+QUrl MediaVocabulary::typeNCOContact()
+{
+    return QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#Contact");
+}
+
 QUrl MediaVocabulary::title()
 {
     QUrl returnUrl = QUrl();
     if (m_vocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::title();
     } else if (m_vocabulary == MediaVocabulary::nie) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nie#title");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title");
     } else if (m_vocabulary == MediaVocabulary::nmm) {
         //Draft nmm ontology is extension of nie
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nie#title");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title");
     }
     
     return returnUrl;
@@ -236,10 +271,10 @@ QUrl MediaVocabulary::description()
     if (m_vocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::description();
     } else if (m_vocabulary == MediaVocabulary::nie) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nie#description");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description");
     } else if (m_vocabulary == MediaVocabulary::nmm) {
         //Draft nmm ontology is extension of nie
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nie#description");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#description");
     }
     
     return returnUrl;
@@ -263,9 +298,10 @@ QUrl MediaVocabulary::duration()
 QUrl MediaVocabulary::lastPlayed()
 {
     QUrl returnUrl = QUrl();
-    if (m_vocabulary == MediaVocabulary::xesam) {
+    //TODO:Waiting for Nepmouk ontology for useCount and lastUsed
+    //if (m_vocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::lastUsed();
-    }
+    //}
     
     return returnUrl;
 }
@@ -273,21 +309,17 @@ QUrl MediaVocabulary::lastPlayed()
 QUrl MediaVocabulary::playCount()
 {
     QUrl returnUrl = QUrl();
-    if (m_vocabulary == MediaVocabulary::xesam) {
+    //TODO:Waiting for Nepmouk ontology for useCount and lastUsed
+    //if (m_vocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::useCount();
-    }
+    //}
     
     return returnUrl;
 }
 
 QUrl MediaVocabulary::artwork()
 {
-    QUrl returnUrl = QUrl();
-    
-    //Bangarang extension to nmm ontology draft
-    returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nmm#artwork");
-    
-    return returnUrl;
+    return QUrl("http://www.semanticdesktop.org/ontologies/nmm#artwork");
 }
 
 QUrl MediaVocabulary::created()
@@ -296,10 +328,10 @@ QUrl MediaVocabulary::created()
     if (m_vocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::contentCreated();
     } else if (m_vocabulary == MediaVocabulary::nie) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nie#contentCreated");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated");
     } else if (m_vocabulary == MediaVocabulary::nmm) {
         //Draft nmm ontology is extension of nie
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nie#contentCreated");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentCreated");
     }
     
     return returnUrl;
@@ -308,12 +340,15 @@ QUrl MediaVocabulary::created()
 QUrl MediaVocabulary::releaseDate()
 {
     QUrl returnUrl = QUrl();
-    if (m_vocabulary == MediaVocabulary::nmm) {
+    if (m_vocabulary == MediaVocabulary::xesam) {
+        returnUrl = Soprano::Vocabulary::Xesam::contentCreated();
+    } else if (m_vocabulary == MediaVocabulary::nmm) {
         //Draft nmm ontology is extension of nie
         returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nmm#releaseDate");
     }
     
     return returnUrl;
+    
 }
 
 QUrl MediaVocabulary::genre()
@@ -327,13 +362,24 @@ QUrl MediaVocabulary::genre()
     return returnUrl;
 }
 
+QUrl MediaVocabulary::rating()
+{
+    return Soprano::Vocabulary::NAO::numericRating();
+    
+}
+
+QUrl MediaVocabulary::ncoFullname()
+{
+    return QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname");
+}
+
 QUrl MediaVocabulary::musicArtist()
 {
     QUrl returnUrl = QUrl();
     if (m_musicVocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::artist();
     } else if (m_musicVocabulary == MediaVocabulary::nmm) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nmm#Artist");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#creator");
     } else if (m_musicVocabulary == MediaVocabulary::nid3) {
         returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nid3#leadArtist");
     }
@@ -347,9 +393,9 @@ QUrl MediaVocabulary::musicArtistName()
     if (m_musicVocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::artist();
     } else if (m_musicVocabulary == MediaVocabulary::nmm) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nmm#Artist");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname");
     } else if (m_musicVocabulary == MediaVocabulary::nid3) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nco#fullName");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/03/22/nco#fullname");
     }
     
     return returnUrl;
@@ -375,7 +421,7 @@ QUrl MediaVocabulary::musicAlbumName()
     if (m_musicVocabulary == MediaVocabulary::xesam) {
         returnUrl = Soprano::Vocabulary::Xesam::album();
     } else if (m_musicVocabulary == MediaVocabulary::nmm) {
-        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nmm#albumTitle");
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title");
     } else if (m_musicVocabulary == MediaVocabulary::nid3) {
         returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/nid3#albumTitle");
     }
@@ -447,6 +493,16 @@ QUrl MediaVocabulary::videoSeries()
     return returnUrl;
 }
 
+QUrl MediaVocabulary::videoSeriesTitle()
+{
+    QUrl returnUrl = QUrl();
+    if (m_videoVocabulary == MediaVocabulary::nmm) {
+        returnUrl = QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#title");
+    }
+    
+    return returnUrl;
+}
+
 QUrl MediaVocabulary::videoSynopsis()
 {
     QUrl returnUrl = QUrl();
@@ -548,3 +604,776 @@ QUrl MediaVocabulary::videoCinematographer()
     
     return returnUrl;
 }
+
+QString MediaVocabulary::hasTypeAudio(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeAudio());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+         statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeAudioMusic(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeAudioMusic());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+         statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeAudioStream(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeAudioStream());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+         statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeAnyAudio(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = QString("{%1} UNION  {%2} UNION {%3} ")
+                        .arg(MediaQuery::hasType(resourceBinding, typeAudio()))
+                        .arg(MediaQuery::hasType(resourceBinding, typeAudioMusic()))
+                        .arg(MediaQuery::hasType(resourceBinding, typeAudioStream()));
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeVideo(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeVideo());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeVideoMovie(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeVideoMovie());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeVideoTVShow(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeVideoTVShow());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeAnyVideo(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = QString("{%1} UNION  {%2} UNION {%3} ")
+                        .arg(MediaQuery::hasType(resourceBinding, typeVideo()))
+                        .arg(MediaQuery::hasType(resourceBinding, typeVideoMovie()))
+                        .arg(MediaQuery::hasType(resourceBinding, typeVideoTVShow()));
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeImage(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeImage());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeTVSeries(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeTVSeries());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeMusicArtist(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeMusicArtist());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasTypeMusicAlbum(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = MediaQuery::hasType(resourceBinding, typeVideoTVShow());
+    statement += fileUrl(resourceBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+
+QString MediaVocabulary::hasResource(const QString &uri)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString statement = QString("?%1 ?dummyPredicate ?dummyObject ").arg(resourceBinding);
+    statement += QString("FILTER (?%1 = <%2> ) ").arg(resourceBinding)
+                                                .arg(uri);
+    statement += fileUrl(resourceBinding);
+    return statement;
+}
+                    
+QString MediaVocabulary::hasTitle(MediaQuery::Match match, 
+                                  const QString &title, 
+                                  MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = titleBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::title(), propertyBinding);
+    if (!title.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, title, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasDescription(MediaQuery::Match match, 
+                                        const QString &description, 
+                                        MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = descriptionBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::description(), propertyBinding);
+    if (!description.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, description, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasDuration(MediaQuery::Match match, 
+                                     int duration,
+                                     MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = durationBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::duration(), propertyBinding);
+    if (duration != -2) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, duration, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasLastPlayed(MediaQuery::Match match, 
+                      const QDateTime &lastPlayed, 
+                      MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = lastPlayedBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::lastPlayed(), propertyBinding);
+    if (lastPlayed.isValid()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, lastPlayed, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasPlayCount(MediaQuery::Match match, 
+                     int playCount, 
+                     MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = playCountBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::playCount(), propertyBinding);
+    if (playCount != -1) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, playCount, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasArtwork(MediaQuery::Match match)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = artworkBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::artwork(), propertyBinding);
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasCreated(MediaQuery::Match match, 
+                   const QDate &created, 
+                   MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = createdBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::created(), propertyBinding);
+    if (created.isValid()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, created, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasGenre(MediaQuery::Match match, 
+              const QString &genre, 
+              MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = genreBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::genre(), propertyBinding);
+    if (!genre.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, genre, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasReleaseDate(MediaQuery::Match match, 
+                                        const QDate &releaseDate, 
+                                        MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = releaseDateBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::releaseDate(), propertyBinding);
+    if (releaseDate.isValid()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, releaseDate, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasRating(MediaQuery::Match match, 
+                  int rating, 
+                  MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = ratingBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::rating(), propertyBinding);
+    if (rating != -1) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, rating, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasMusicArtistName(MediaQuery::Match match,
+                                            const QString &artistName, 
+                                            MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = musicArtistNameBinding();
+    QString statement;
+    if (m_musicVocabulary == MediaVocabulary::nmm) {
+        QString artistResourceBinding = "artistResource";
+        statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtist(), artistResourceBinding);
+        statement += MediaQuery::hasProperty(artistResourceBinding, MediaVocabulary::musicArtistName(), propertyBinding);
+    } else {
+        statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicArtistName(), propertyBinding);
+    }
+        
+    if (!artistName.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, artistName, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasMusicAlbumTitle(MediaQuery::Match match,
+                                            const QString &albumTitle,
+                                            MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = musicAlbumTitleBinding();
+    QString statement;
+    if (m_musicVocabulary == MediaVocabulary::nmm) {
+        QString albumResourceBinding = "albumResource";
+        statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicAlbum(), albumResourceBinding);
+        statement += MediaQuery::hasProperty(albumResourceBinding, MediaVocabulary::musicAlbumName(), propertyBinding);
+    } else {
+        statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicAlbumName(), propertyBinding);
+    }
+    
+    if (!albumTitle.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, albumTitle, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasMusicAlbumYear(MediaQuery::Match match,
+                                           int year, 
+                                           MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = musicAlbumYearBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicAlbumYear(), propertyBinding);
+    if (year != 0) {
+        QDate yearDate = QDate(year, 1, 1);
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, yearDate, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasMusicTrackNumber(MediaQuery::Match match,
+                                             int trackNumber, 
+                                             MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = musicTrackNumberBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::musicTrackNumber(), propertyBinding);
+    if (trackNumber != 0) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, trackNumber, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoSeriesTitle(MediaQuery::Match match,
+                                             const QString &seriesTitle,
+                                             MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoSeriesTitleBinding();
+    QString seriesResourceBinding = "seriesResource";
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoSeries(), seriesResourceBinding);
+    statement += MediaQuery::hasProperty(seriesResourceBinding, MediaVocabulary::videoSeriesTitle(), propertyBinding);
+    if (!seriesTitle.isNull()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, seriesTitle, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoSynopsis(MediaQuery::Match match,
+                                          const QString &synopsis,
+                                          MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoSynopsisBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoSynopsis(), propertyBinding);
+    if (!synopsis.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, synopsis, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+                                              
+QString MediaVocabulary::hasVideoSeason(MediaQuery::Match match,
+                                        int season, 
+                                        MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoSeasonBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoSeason(), propertyBinding);
+    if (season != 0) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, season, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoEpisodeNumber(MediaQuery::Match match,
+                                               int episodeNumber, 
+                                               MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoEpisodeNumberBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoEpisodeNumber(), propertyBinding);
+    if (episodeNumber != 0) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, episodeNumber, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoAudienceRating(MediaQuery::Match match,
+                                                const QString &audienceRating, 
+                                                MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoAudienceRatingBinding();
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoAudienceRating(), propertyBinding);
+    if (!audienceRating.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, audienceRating, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoWriter(MediaQuery::Match match,
+                                        const QString &writer, 
+                                        MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoWriterBinding();
+    QString contactResourceBinding = "writerResource";
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoWriter(), contactResourceBinding);
+    statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding);
+    if (!writer.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, writer, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoDirector(MediaQuery::Match match,
+                                          const QString &director, 
+                                          MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoDirectorBinding();
+    QString contactResourceBinding = "directorResource";
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoDirector(), contactResourceBinding);
+    statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding);
+    if (!director.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, director, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoAssistantDirector(MediaQuery::Match match,
+                                                   const QString &assistantDirector, 
+                                                   MediaQuery::Constraint constraint)
+                                                   
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoAssistantDirectorBinding();
+    QString contactResourceBinding = "assistantDirectorResource";
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoAssistantDirector(), contactResourceBinding);
+    statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding);
+    if (!assistantDirector.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, assistantDirector, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+QString MediaVocabulary::hasVideoProducer(MediaQuery::Match match,
+                                          const QString &producer, 
+                                          MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoProducerBinding();
+    QString contactResourceBinding = "producerResource";
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoProducer(), contactResourceBinding);
+    statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding);
+    if (!producer.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, producer, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoActor(MediaQuery::Match match,
+                                       const QString &actor, 
+                                       MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoActorBinding();
+    QString contactResourceBinding = "actorResource";
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoActor(), contactResourceBinding);
+    statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding);
+    if (!actor.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, actor, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::hasVideoCinematographer(MediaQuery::Match match,
+                                                 const QString &cinematographer, 
+                                                 MediaQuery::Constraint constraint)
+{
+    QString resourceBinding = mediaResourceBinding();
+    QString propertyBinding = videoCinematographerBinding();
+    QString contactResourceBinding = "cinematographerResource";
+    QString statement = MediaQuery::hasProperty(resourceBinding, MediaVocabulary::videoCinematographer(), contactResourceBinding);
+    statement += MediaQuery::hasProperty(contactResourceBinding, MediaVocabulary::ncoFullname(), propertyBinding);
+    if (!cinematographer.isEmpty()) {
+        statement += QString("FILTER ") + MediaQuery::filterConstraint(propertyBinding, cinematographer, constraint);
+    }
+    if (match == MediaQuery::Optional) {
+        statement = MediaQuery::addOptional(statement);
+    }
+    return statement;
+}
+
+QString MediaVocabulary::mediaResourceBinding()
+{
+    return "r";
+}
+
+QString MediaVocabulary::mediaResourceUrlBinding()
+{
+    return "url";
+}
+
+QString MediaVocabulary::titleBinding()
+{
+    return "title";
+}
+
+QString MediaVocabulary::descriptionBinding()
+{
+    return "description";
+}
+
+QString MediaVocabulary::durationBinding()
+{
+    return "duration";
+}
+
+QString MediaVocabulary::lastPlayedBinding()
+{
+    return "lastPlayed";
+}
+
+QString MediaVocabulary::playCountBinding()
+{
+    return "playCount";
+}
+
+QString MediaVocabulary::artworkBinding()
+{
+    return "artwork";
+}
+
+QString MediaVocabulary::createdBinding()
+{
+    return "created";
+}
+
+QString MediaVocabulary::genreBinding()
+{
+    return "genre";
+}
+
+QString MediaVocabulary::releaseDateBinding()
+{
+    return "releaseDate";
+}
+
+QString MediaVocabulary::ratingBinding()
+{
+    return "rating";
+}
+
+QString MediaVocabulary::musicArtistBinding()
+{
+    return "artist";
+}
+
+QString MediaVocabulary::musicArtistNameBinding()
+{
+    return "artist";
+}
+
+QString MediaVocabulary::musicAlbumBinding()
+{
+    return "album";
+}
+
+QString MediaVocabulary::musicAlbumTitleBinding()
+{
+    return "albumTitle";
+}
+
+QString MediaVocabulary::musicAlbumYearBinding()
+{
+    return "albumYearDate";
+}
+
+QString MediaVocabulary::musicTrackNumberBinding()
+{
+    return "trackNumber";
+}
+
+QString MediaVocabulary::musicGenreBinding()
+{
+    return "genre";
+}
+
+QString MediaVocabulary::videoGenreBinding()
+{
+    return "genre";
+}
+
+QString MediaVocabulary::videoSeriesTitleBinding()
+{
+    return "seriesTitle";
+}
+
+QString MediaVocabulary::videoSynopsisBinding()
+{
+    return "synopsis";
+}
+
+QString MediaVocabulary::videoSeasonBinding()
+{
+    return "season";
+}
+
+QString MediaVocabulary::videoEpisodeNumberBinding()
+{
+    return "episodeNumber";
+}
+
+QString MediaVocabulary::videoAudienceRatingBinding()
+{
+    return "audienceRating";
+}
+
+QString MediaVocabulary::videoWriterBinding()
+{
+    return "writer";
+}
+
+QString MediaVocabulary::videoDirectorBinding()
+{
+    return "director";
+}
+
+QString MediaVocabulary::videoAssistantDirectorBinding()
+{
+    return "assistantDirector";
+}
+
+QString MediaVocabulary::videoProducerBinding()
+{
+    return "producer";
+}
+
+QString MediaVocabulary::videoActorBinding()
+{
+    return "actor";
+}
+
+QString MediaVocabulary::videoCinematographerBinding()
+{
+    return "cinematographer";
+}
+
+QStringList MediaVocabulary::storageProcedure(QUrl mediaProperty)
+{
+    if (mediaProperty == musicArtist()) {
+        if (m_musicVocabulary == nmm) {
+            return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") <<
+                                    QString("[ResourceValue]::[Type]::%1").arg(typeMusicArtist().toString()) <<
+                                    QString("[ResourceValue]::%1::[Value]").arg(musicArtistName().toString());
+        } else {
+            return  QStringList() << QString("[Resource]::[Property]::[Value]");
+        }
+    } else if (mediaProperty == musicAlbum()) {
+        if (m_musicVocabulary == nmm) {
+            return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") <<
+                                    QString("[ResourceValue]::[Type]::%1").arg(typeMusicAlbum().toString()) <<
+                                    QString("[ResourceValue]::%1::[Value]").arg(musicAlbumName().toString());
+        } else {
+            return QStringList() << QString("[Resource]::[Property]::[Value]");
+        }
+    } else if (mediaProperty == videoSeries()) {
+        return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") <<
+                                QString("[ResourceValue]::[Type]::%1").arg(typeTVSeries().toString()) <<
+                                QString("[ResourceValue]::%1::[Value]").arg(videoSeriesTitle().toString());
+    } else if (mediaProperty == videoWriter() ||
+        mediaProperty == videoDirector() ||
+        mediaProperty == videoAssistantDirector() ||
+        mediaProperty == videoProducer() ||
+        mediaProperty == videoActor() ||
+        mediaProperty == videoCinematographer() ) {
+        return QStringList() << QString("[Resource]::[Property]::[ResourceValue]") <<
+        QString("[ResourceValue]::[Type]::%1").arg(typeNCOContact().toString()) <<
+        QString("[ResourceValue]::%1::[Value]").arg(ncoFullname().toString());
+    } else {
+        return QStringList() << QString("[Resource]::[Property]::[Value]");
+    }
+}
+
+QString MediaVocabulary::fileUrl(const QString &resourceBinding)
+{
+    return MediaQuery::addOptional(QString("?%1 nie:url ?%2 . ")
+                   .arg(resourceBinding)
+                   .arg(mediaResourceUrlBinding()));
+}
diff --git a/src/platform/mediavocabulary.h b/src/platform/mediavocabulary.h
index d2788b5..78ac672 100644
--- a/src/platform/mediavocabulary.h
+++ b/src/platform/mediavocabulary.h
@@ -20,6 +20,7 @@
 #define MEDIAVOCABULARY_H
 
 #include <QtCore>
+#include "mediaquery.h"
 
 class MediaVocabulary {
     
@@ -32,6 +33,16 @@ class MediaVocabulary {
         nmm = Qt::UserRole + 3,
         nid3 = Qt::UserRole + 4};
         
+        /*enum Constraint {Equal = 0, 
+                         NotEqual = 1,
+                         Contains = 2, 
+                         GreaterThan = 3, 
+                         LessThan = 4,
+                         GreaterThanOrEqual = 5,
+                         LessThanOrEqual = 6};
+        
+        enum Match {Required = 0, Optional = 1};*/
+        
         void setVocabulary(int vocabulary);
         void setAudioVocabulary(int vocabulary);
         void setMusicVocabulary(int vocabulary);
@@ -53,6 +64,10 @@ class MediaVocabulary {
         
         //Media-related types
         QUrl typeTVSeries();
+        QUrl typeMusicArtist();
+        QUrl typeMusicAlbum();
+        QUrl typeNCOContact();
+
         
         //These properties are applicable to all media types
         QUrl title();
@@ -64,7 +79,10 @@ class MediaVocabulary {
         QUrl created();
         QUrl genre();
         QUrl releaseDate();
+        QUrl rating();
+        QUrl ncoFullname();
         
+        //These properties are applicable to Music
         QUrl musicArtist();
         QUrl musicArtistName();
         QUrl musicAlbum();
@@ -73,8 +91,10 @@ class MediaVocabulary {
         QUrl musicTrackNumber();
         QUrl musicGenre();
         
+        //These properties are applicable to Movie and TV shows
         QUrl videoGenre();
         QUrl videoSeries();
+        QUrl videoSeriesTitle();
         QUrl videoSynopsis();
         QUrl videoSeason();
         QUrl videoEpisodeNumber();
@@ -86,6 +106,134 @@ class MediaVocabulary {
         QUrl videoActor();
         QUrl videoCinematographer();
         
+        //SPARQL condition statements
+        QString hasTypeAudio(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeAudioMusic(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeAudioStream(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeAnyAudio(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeVideo(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeVideoMovie(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeVideoTVShow(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeAnyVideo(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeImage(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeTVSeries(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeMusicArtist(MediaQuery::Match match = MediaQuery::Required);
+        QString hasTypeMusicAlbum(MediaQuery::Match match = MediaQuery::Required);
+        
+        QString hasResource(const QString &uri);
+        QString hasTitle(MediaQuery::Match match = MediaQuery::Required, 
+                         const QString &title = QString(), 
+                         MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasDescription(MediaQuery::Match match = MediaQuery::Required, 
+                               const QString &description = QString(), 
+                               MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasDuration(MediaQuery::Match match = MediaQuery::Required, 
+                            int duration = -2, 
+                            MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasLastPlayed(MediaQuery::Match match = MediaQuery::Required, 
+                              const QDateTime &lastPlayed = QDateTime(), 
+                              MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasPlayCount(MediaQuery::Match match = MediaQuery::Required, 
+                             int playCount = -1, 
+                             MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasArtwork(MediaQuery::Match match = MediaQuery::Required);
+        QString hasCreated(MediaQuery::Match match = MediaQuery::Required, 
+                           const QDate &created = QDate(), 
+                           MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasGenre(MediaQuery::Match match = MediaQuery::Required, 
+                      const QString &description = QString(), 
+                      MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasReleaseDate(MediaQuery::Match match = MediaQuery::Required, 
+                         const QDate &created = QDate(), 
+                         MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasRating(MediaQuery::Match match = MediaQuery::Required, 
+                             int rating = -1, 
+                             MediaQuery::Constraint constraint = MediaQuery::Equal);
+        
+        QString hasMusicArtistName(MediaQuery::Match match = MediaQuery::Required, 
+                                   const QString &artistName = QString(), 
+                                   MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasMusicAlbumTitle(MediaQuery::Match match = MediaQuery::Required,
+                                   const QString &albumTitle = QString(),
+                                   MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasMusicAlbumYear(MediaQuery::Match match = MediaQuery::Required,
+                                  int year = 0, 
+                                  MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasMusicTrackNumber(MediaQuery::Match match = MediaQuery::Required,
+                                    int trackNumber = 0, 
+                                    MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoSeriesTitle(MediaQuery::Match match = MediaQuery::Required,
+                                    const QString &seriesTitle = QString(),
+                                    MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoSynopsis(MediaQuery::Match match = MediaQuery::Required,
+                                 const QString &synopsis = QString(),
+                                 MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoSeason(MediaQuery::Match match = MediaQuery::Required,
+                               int season = 0, 
+                               MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoEpisodeNumber(MediaQuery::Match match = MediaQuery::Required,
+                                      int episodeNumber = 0, 
+                                      MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoAudienceRating(MediaQuery::Match match = MediaQuery::Required,
+                                       const QString &audienceRating = QString(), 
+                                       MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoWriter(MediaQuery::Match match = MediaQuery::Required,
+                               const QString &writer = QString(), 
+                               MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoDirector(MediaQuery::Match match = MediaQuery::Required,
+                                 const QString &director = QString(), 
+                                 MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoAssistantDirector(MediaQuery::Match match = MediaQuery::Required,
+                                          const QString &assistantDirector = QString(), 
+                                          MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoProducer(MediaQuery::Match match = MediaQuery::Required,
+                                 const QString &producer = QString(), 
+                                 MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoActor(MediaQuery::Match match = MediaQuery::Required,
+                              const QString &actor = QString(), 
+                              MediaQuery::Constraint constraint = MediaQuery::Equal);
+        QString hasVideoCinematographer(MediaQuery::Match match = MediaQuery::Required,
+                                        const QString &cinematographer = QString(), 
+                                        MediaQuery::Constraint constraint = MediaQuery::Equal);
+
+        //SPARQL binding names
+        static QString mediaResourceBinding();
+        static QString mediaResourceUrlBinding();
+        static QString titleBinding();
+        static QString descriptionBinding();
+        static QString durationBinding();
+        static QString lastPlayedBinding();
+        static QString playCountBinding();
+        static QString artworkBinding();
+        static QString createdBinding();
+        static QString genreBinding();
+        static QString releaseDateBinding();
+        static QString ratingBinding();
+        
+        static QString musicArtistBinding();
+        static QString musicArtistNameBinding();
+        static QString musicAlbumBinding();
+        static QString musicAlbumTitleBinding();
+        static QString musicAlbumYearBinding();
+        static QString musicTrackNumberBinding();
+        static QString musicGenreBinding();
+        
+        static QString videoGenreBinding();
+        static QString videoSeriesTitleBinding();
+        static QString videoSynopsisBinding();
+        static QString videoSeasonBinding();
+        static QString videoEpisodeNumberBinding();
+        static QString videoAudienceRatingBinding();
+        static QString videoWriterBinding();
+        static QString videoDirectorBinding();
+        static QString videoAssistantDirectorBinding();
+        static QString videoProducerBinding();
+        static QString videoActorBinding();
+        static QString videoCinematographerBinding();
+        
+        //RDF storage procedure lookup
+        QStringList storageProcedure(QUrl mediaProperty);
+
     private:
         int m_vocabulary;
         int m_audioVocabulary;
@@ -96,7 +244,8 @@ class MediaVocabulary {
         QUrl m_audioNameSpace;
         QUrl m_musicNameSpace;
         QUrl m_videoNameSpace;
-                
-};
         
+        QString fileUrl(const QString &resourceBinding);
+};
+
 #endif // MEDIAVOCABULARY_H
\ No newline at end of file
diff --git a/src/platform/musiclistengine.cpp b/src/platform/musiclistengine.cpp
index 823f50c..0e1c703 100644
--- a/src/platform/musiclistengine.cpp
+++ b/src/platform/musiclistengine.cpp
@@ -20,11 +20,13 @@
 #include "mediaitemmodel.h"
 #include "listenginefactory.h"
 #include "mediavocabulary.h"
+#include "mediaquery.h"
 #include "utilities.h"
 #include <KIcon>
 #include <KUrl>
 #include <KLocale>
 #include <KDebug>
+#include <KMessageBox>
 #include <Soprano/QueryResultIterator>
 #include <Soprano/Vocabulary/Xesam>
 #include <Soprano/Vocabulary/NAO>
@@ -33,6 +35,8 @@
 #include <nepomuk/variant.h>
 #include <QApplication>
 #include <QTime>
+#include <QTextStream>
+#include <QFile>
 #include <taglib/fileref.h>
 
 MusicListEngine::MusicListEngine(ListEngineFactory * parent) : NepomukListEngine(parent)
@@ -43,124 +47,11 @@ MusicListEngine::~MusicListEngine()
 {
 }
 
-MediaItem MusicListEngine::createMediaItem(Soprano::QueryResultIterator& it) {
-    MediaItem mediaItem;
-    QUrl url = it.binding("url").uri().isEmpty() ? 
-                    it.binding("r").uri() :
-                    it.binding("url").uri();
-    mediaItem.url = url.toString();
-    mediaItem.title = it.binding("title").literal().toString();
-    mediaItem.fields["title"] = it.binding("title").literal().toString();
-    if (mediaItem.title.isEmpty()) {
-        if (KUrl(mediaItem.url).isLocalFile()) {
-            mediaItem.title = KUrl(mediaItem.url).fileName();
-        } else {
-            mediaItem.title = mediaItem.url;
-        }
-    }
-
-    QString artist = it.binding("artist").literal().toString();
-    if (!artist.isEmpty()) {
-        mediaItem.fields["artist"] = artist;
-        mediaItem.subTitle = artist;
-    }
-    
-    QString album = it.binding("album").literal().toString();
-    if (!album.isEmpty()) {
-        mediaItem.fields["album"] = album;
-        if (!artist.isEmpty()) {
-            mediaItem.subTitle += QString(" - %1").arg(album);
-        } else {
-            mediaItem.subTitle = album;
-        }
-    }
-    
-    int duration = it.binding("duration").literal().toInt();
-    if (duration != 0) {
-        mediaItem.duration = QTime(0,0,0,0).addSecs(duration).toString("m:ss");
-        mediaItem.fields["duration"] = it.binding("duration").literal().toInt();
-    }
-    
-    if (it.binding("created").isValid()) {
-        QDate created = it.binding("created").literal().toDate();
-        if (created.isValid()) {
-            mediaItem.fields["year"] = created.year();
-        }
-    }
-    
-    int trackNumber = it.binding("trackNumber").literal().toInt();
-    if (trackNumber != 0) {
-        mediaItem.fields["trackNumber"] = trackNumber;
-    }
-    
-    mediaItem.type = "Audio";
-    mediaItem.nowPlaying = false;
-    mediaItem.artwork = KIcon("audio-mpeg");
-    mediaItem.fields["url"] = mediaItem.url;
-    mediaItem.fields["genre"] = it.binding("genre").literal().toString();
-    mediaItem.fields["rating"] = it.binding("rating").literal().toInt();
-    mediaItem.fields["description"] = it.binding("description").literal().toString();
-    mediaItem.fields["artworkUrl"] = it.binding("artwork").uri().toString();
-    mediaItem.fields["audioType"] = "Music";
-
-    return mediaItem;
-}
-
 void MusicListEngine::run()
 {
     QThread::setTerminationEnabled(true);
 
     if (m_updateSourceInfo || m_removeSourceInfo) {
-        
-        if (m_updateSourceInfo) {
-            //Update to file metadata as well
-            QList<MediaItem> mediaList = m_mediaItemsInfoToUpdate;
-            for (int i = 0; i < mediaList.count(); i++) {
-                MediaItem mediaItem = mediaList.at(i);
-                if ((mediaItem.type == "Audio") && (mediaItem.fields["audioType"] == "Music")) {
-                    if (Utilities::isMusic(mediaList.at(i).url)) {
-                        TagLib::FileRef file(KUrl(mediaList.at(i).url).path().toLocal8Bit());
-                        if (!file.isNull()) {
-                            QString title = mediaItem.title;
-                            if (!title.isEmpty()) {
-                                TagLib::String tTitle(title.trimmed().toUtf8().data(), TagLib::String::UTF8);
-                                file.tag()->setTitle(tTitle);
-                            }
-                            QUrl url = mediaItem.fields["artworkUrl"].toString();
-                            if (!url.isEmpty()) {
-                                //FIXME: Can't understand why this doesn't work.
-                                Utilities::saveArtworkToTag(mediaList.at(i).url, url.toString());
-                            }
-                            QString artist = mediaItem.fields["artist"].toString();
-                            if (!artist.isEmpty()) {
-                                TagLib::String tArtist(artist.trimmed().toUtf8().data(), TagLib::String::UTF8);
-                                file.tag()->setArtist(tArtist);
-                            }
-                            QString album = mediaItem.fields["album"].toString();
-                            if (!album.isEmpty()) {
-                                TagLib::String tAlbum(album.trimmed().toUtf8().data(), TagLib::String::UTF8);
-                                file.tag()->setAlbum(tAlbum);
-                            }
-                            int year = mediaItem.fields["year"].toInt();
-                            if (year != 0) {
-                                file.tag()->setYear(year);
-                            }
-                            int trackNumber = mediaItem.fields["trackNumber"].toInt();
-                            if (trackNumber != 0) {
-                                file.tag()->setTrack(trackNumber);
-                            }
-                            QString genre = mediaItem.fields["genre"].toString();
-                            if (!genre.isEmpty()) {
-                                TagLib::String tGenre(genre.trimmed().toUtf8().data(), TagLib::String::UTF8);
-                                file.tag()->setGenre(tGenre);
-                            }
-                            file.save();
-                        }
-                    }
-                }
-            }
-        }
-        
         NepomukListEngine::run();
         return;
     }
@@ -190,24 +81,43 @@ void MusicListEngine::run()
     
     if (m_nepomukInited) {
         if (engineArg.toLower() == "artists") {
-            MusicQuery query = MusicQuery(true);
-            query.selectArtist();
-            if (!artist.isEmpty()) {
-                query.hasArtist(artist);
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.musicArtistNameBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required));
+            if (!artist.isEmpty()) { 
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Required,
+                                                                      artist,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Required));
             }
             if (!album.isEmpty()) {
-                query.hasAlbum(album);
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required,
+                                                                      album,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Optional));
             }
             if (!genre.isEmpty()) {
-                query.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
-            query.orderBy("?artist");
+            query.endWhere();
+            QStringList orderByBindings = bindings;
+            query.orderBy(orderByBindings);
+            
             Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
 
             //Build media list from results
             int i = 0;
             while( it.next() ) {
-                QString artist = it.binding("artist").literal().toString().trimmed();
+                QString artist = it.binding(mediaVocabulary.musicArtistNameBinding()).literal().toString().trimmed();
                 if (!artist.isEmpty()) {
                     MediaItem mediaItem;
                     mediaItem.url = QString("music://songs?%1||%2||%3").arg(artist, album, genre);
@@ -227,26 +137,45 @@ void MusicListEngine::run()
             m_mediaListProperties.type = QString("Categories");
             
         } else if (engineArg.toLower() == "albums") {
-            MusicQuery query = MusicQuery(true);
-            query.selectAlbum(true);
-            query.selectArtist();
-            if (!artist.isEmpty()) {
-                query.hasArtist(artist);
-            }
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.musicAlbumTitleBinding());
+            bindings.append(mediaVocabulary.musicArtistNameBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required));
             if (!album.isEmpty()) {
-                query.hasAlbum(album);
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required, 
+                                                                      album,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required));
+            }
+            if (!artist.isEmpty()) { 
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Required,
+                                                                      artist,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Optional));
             }
             if (!genre.isEmpty()) {
-                query.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
-            query.orderBy("?album");
+            query.endWhere();
+            QStringList orderByBindings(mediaVocabulary.musicAlbumTitleBinding());
+            query.orderBy(orderByBindings);
+            
             Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             int i = 0;
             while( it.next() ) {
-                QString artist = it.binding("artist").literal().toString().trimmed();
-                QString album = it.binding("album").literal().toString().trimmed();
+                QString artist = it.binding(mediaVocabulary.musicArtistNameBinding()).literal().toString().trimmed();
+                QString album = it.binding(mediaVocabulary.musicAlbumTitleBinding()).literal().toString().trimmed();
                 if (!album.isEmpty()) {
                     MediaItem mediaItem;
                     mediaItem.url = QString("music://songs?%1||%2||%3").arg(artist, album, genre);
@@ -259,6 +188,7 @@ void MusicListEngine::run()
                 }
                 ++i;
             }
+            
             m_mediaListProperties.name = i18n("Albums");
             if (!artist.isEmpty()) {
                 m_mediaListProperties.name = i18n("Albums - %1", artist);
@@ -274,24 +204,44 @@ void MusicListEngine::run()
             m_mediaListProperties.type = QString("Categories");
             
         } else if (engineArg.toLower() == "genres") {
-            MusicQuery query = MusicQuery(true);
-            query.selectGenre();
-            if (!artist.isEmpty()) {
-                query.hasArtist(artist);
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required));
+            if (!genre.isEmpty()) {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required));
             }
-            if (!album.isEmpty()) {
-                query.hasAlbum(album);
+            if (!artist.isEmpty()) { 
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Required,
+                                                                      artist,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Optional));
             }
-            if (!genre.isEmpty()) {
-                query.hasGenre(genre);
+            if (!album.isEmpty()) {
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required,
+                                                                      album,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Optional));
             }
-            query.orderBy("?genre");
+            query.endWhere();
+            QStringList orderByBindings = bindings;
+            query.orderBy(orderByBindings);
+            
             Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
+            
             //Build media list from results
             int i = 0;
             while( it.next() ) {
-                QString genre = it.binding("genre").literal().toString().trimmed();
+                QString genre = it.binding(mediaVocabulary.genreBinding()).literal().toString().trimmed();
                 if (!genre.isEmpty()) {
                     MediaItem mediaItem;
                     mediaItem.url = QString("music://artists?%1||%2||%3").arg(artist, album, genre);
@@ -308,36 +258,64 @@ void MusicListEngine::run()
             m_mediaListProperties.type = QString("Categories");
             
         } else if (engineArg.toLower() == "songs") {
-            
-            MusicQuery musicQuery = MusicQuery(true);
-            musicQuery.selectResource();
-            musicQuery.selectTitle();
-            musicQuery.selectArtist();
-            musicQuery.selectAlbum(true);
-            musicQuery.selectTrackNumber(true);
-            musicQuery.selectDuration(true);
-            musicQuery.selectCreated(true);
-            musicQuery.selectRating(true);
-            musicQuery.selectDescription(true);
-            musicQuery.selectArtwork(true);
-            musicQuery.selectGenre(true);
-            if (!artist.isEmpty()) {
-                musicQuery.hasArtist(artist);
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.musicArtistNameBinding());
+            bindings.append(mediaVocabulary.musicAlbumTitleBinding());
+            bindings.append(mediaVocabulary.musicTrackNumberBinding());
+            bindings.append(mediaVocabulary.durationBinding());
+            bindings.append(mediaVocabulary.musicAlbumYearBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasMusicTrackNumber(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasMusicAlbumYear(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            if (!artist.isEmpty()) { 
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Required,
+                                                                      artist,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Optional));
             }
             if (!album.isEmpty()) {
-                musicQuery.hasAlbum(album);
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Required,
+                                                                      album,
+                                                                      MediaQuery::Equal));
+            } else {
+                query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Optional));
             }
             if (!genre.isEmpty()) {
-                musicQuery.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
-            musicQuery.orderBy("?artist ?created ?album ?trackNumber");
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.musicArtistNameBinding());
+            orderByBindings.append(mediaVocabulary.musicAlbumYearBinding());
+            orderByBindings.append(mediaVocabulary.musicAlbumTitleBinding());
+            orderByBindings.append(mediaVocabulary.musicTrackNumberBinding());
+            query.orderBy(orderByBindings);
+            
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = musicQuery.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Music"));
                 mediaList.append(mediaItem);
             }
             
@@ -356,27 +334,54 @@ void MusicListEngine::run()
             m_mediaListProperties.type = QString("Sources");
             
         } else if (engineArg.toLower() == "search") {
-            MusicQuery musicQuery = MusicQuery(true);
-            musicQuery.selectResource();
-            musicQuery.selectTitle();
-            musicQuery.selectArtist();
-            musicQuery.selectAlbum(true);
-            musicQuery.selectTrackNumber(true);
-            musicQuery.selectDuration(true);
-            musicQuery.selectCreated(true);
-            musicQuery.selectRating(true);
-            musicQuery.selectDescription(true);
-            musicQuery.selectArtwork(true);
-            musicQuery.selectGenre(true);
-            musicQuery.searchString(engineFilter);
-            musicQuery.orderBy("?artist ?created ?album ?trackNumber");
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.musicArtistNameBinding());
+            bindings.append(mediaVocabulary.musicAlbumTitleBinding());
+            bindings.append(mediaVocabulary.musicTrackNumberBinding());
+            bindings.append(mediaVocabulary.durationBinding());
+            bindings.append(mediaVocabulary.musicAlbumYearBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAudioMusic(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasMusicTrackNumber(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasMusicAlbumYear(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.startFilter();
+            query.addFilterConstraint(mediaVocabulary.titleBinding(), engineFilter, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.musicArtistNameBinding(), engineFilter, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.musicAlbumTitleBinding(), engineFilter, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.descriptionBinding(), engineFilter, MediaQuery::Contains);
+            query.endFilter();
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.musicArtistNameBinding());
+            orderByBindings.append(mediaVocabulary.musicAlbumYearBinding());
+            orderByBindings.append(mediaVocabulary.musicAlbumTitleBinding());
+            orderByBindings.append(mediaVocabulary.musicTrackNumberBinding());
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = musicQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Music"));
                 mediaList.append(mediaItem);
             }
             
@@ -403,245 +408,3 @@ void MusicListEngine::setFilterForSources(const QString& engineFilter)
     m_mediaListProperties.lri = QString("music://songs?%1").arg(engineFilter);
 }
 
-MusicQuery::MusicQuery(bool distinct) :
-m_distinct(distinct),
-m_selectResource(false),
-m_selectArtist(false),
-m_selectAlbum(false),
-m_selectTitle(false),
-m_selectDuration(false),
-m_selectTrackNumber(false),
-m_selectGenre(false)
-{
-}
-
-void MusicQuery::selectResource() {
-    m_selectResource = true;
-}
-
-void MusicQuery::selectArtist(bool optional) {
-    m_selectArtist = true;
-    m_artistCondition = addOptional(optional,
-                                    QString("?r <%1> ?artist . ")
-                                    .arg(MediaVocabulary().musicArtist().toString()));
-}
-
-void MusicQuery::selectAlbum(bool optional) {
-    m_selectAlbum = true;
-    m_albumCondition = addOptional(optional,
-                                        QString("?r <%1> ?album . ")
-                                        .arg(MediaVocabulary().musicAlbum().toString()));
-}
-
-void MusicQuery::selectTitle(bool optional) {
-    m_selectTitle = true;
-    m_titleCondition = addOptional(optional,
-                                   QString("?r <%1> ?title . ")
-                                   .arg(MediaVocabulary().title().toString()));
-}
-
-void MusicQuery::selectDuration(bool optional) {
-    m_selectDuration = true;
-    m_durationCondition = addOptional(optional,
-                                      QString("?r <%1> ?duration . ")
-                                      .arg(MediaVocabulary().duration().toString()));
-}
-
-void MusicQuery::selectCreated(bool optional) {
-    m_selectCreated = true;
-    m_createdCondition = addOptional(optional,
-                                      QString("?r <%1> ?created . ")
-                                      .arg(MediaVocabulary().created().toString()));
-}
-
-void MusicQuery::selectTrackNumber(bool optional) {
-    m_selectTrackNumber = true;
-    m_trackNumberCondition = addOptional(optional,
-                                     QString("?r <%1> ?trackNumber . ")
-                                     .arg(MediaVocabulary().musicTrackNumber().toString()));
-}
-
-void MusicQuery::selectGenre(bool optional) {
-    m_selectGenre = true;
-    m_genreCondition = addOptional(optional,
-                                         QString("?r <%1> ?genre . ")
-                                         .arg(MediaVocabulary().genre().toString()));
-}
-
-void MusicQuery::selectRating(bool optional) {
-    m_selectRating = true;
-    m_ratingCondition = addOptional(optional,
-                                   QString("?r <%1> ?rating . ")
-                                   .arg(Soprano::Vocabulary::NAO::numericRating().toString()));
-}
-
-void MusicQuery::selectDescription(bool optional) {
-    m_selectDescription = true;
-    m_descriptionCondition = addOptional(optional,
-                                    QString("?r <%1> ?description . ")
-                                    .arg(MediaVocabulary().description().toString()));
-}
-
-void MusicQuery::selectArtwork(bool optional) {
-    m_selectArtwork = true;
-    m_artworkCondition = addOptional(optional,
-                                         QString("?r <%1> ?artwork . ")
-                                         .arg(MediaVocabulary().artwork().toString()));
-}
-
-void MusicQuery::hasArtist(QString artist) {
-    m_artistCondition = QString("?r <%1> ?artist . "
-                                "?r <%1> %2 . ")
-    .arg(MediaVocabulary().musicArtist().toString())
-    .arg(Soprano::Node::literalToN3(artist));
-}
-
-void MusicQuery::hasNoArtist() {
-    m_artistCondition = QString(
-    "OPTIONAL { ?r <%1> ?artist  } "
-    "FILTER (!bound(?artist) || regex(str(?artist), \"^$\")) ")
-    .arg(MediaVocabulary().musicArtist().toString());
-}
-
-void MusicQuery::hasAlbum(QString album) {
-    m_albumCondition = QString("?r <%1> ?album . "
-                                "?r <%1> %2 . ")
-    .arg(MediaVocabulary().musicAlbum().toString())
-    .arg(Soprano::Node::literalToN3(album));
-}
-
-void MusicQuery::hasNoAlbum() {
-    m_albumCondition = QString(
-    "OPTIONAL { ?r <%1> ?album  } "
-    "FILTER (!bound(?album) || regex(str(?album), \"^$\")) ")
-    .arg(MediaVocabulary().musicAlbum().toString());
-}
-
-void MusicQuery::hasGenre(QString genre) {
-    m_genreCondition = QString("?r <%1> ?genre . "
-    "?r <%1> %2 . ")
-    .arg(MediaVocabulary().genre().toString())
-    .arg(Soprano::Node::literalToN3(genre));
-}
-
-void MusicQuery::hasNoGenre() {
-    m_genreCondition = QString(
-    "OPTIONAL { ?r <%1> ?genre  } "
-    "FILTER (!bound(?genre) || regex(str(?genre), \"^$\")) ")
-    .arg(MediaVocabulary().genre().toString());
-}
-
-void MusicQuery::searchString(QString str) {
-    if (! str.isEmpty()) {
-        m_searchCondition = QString(
-        "FILTER (regex(str(?artist),\"%1\",\"i\") || " 
-        "regex(str(?album),\"%1\",\"i\") || "
-        "regex(str(?title),\"%1\",\"i\")) ")
-        .arg(str);
-    }
-}
-
-
-void MusicQuery::orderBy(QString var) {
-    if (!var.isEmpty()) {
-        m_order = "ORDER BY " + var;
-    }
-}
-
-
-QString MusicQuery::addOptional(bool optional, QString str) {
-    if (optional) {
-        return QString("OPTIONAL { ") + str + "} . ";
-    } else {
-        return str;
-    }
-}
-
-QString MusicQuery::getPrefix() {
-    return QString("PREFIX xesam: <%1> "
-    "PREFIX rdf: <%2> "
-    "PREFIX nmm: <%3> "
-    "PREFIX xls: <%4> "
-    "PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> ")
-    .arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString())
-    .arg(Soprano::Vocabulary::RDF::rdfNamespace().toString())
-    .arg("http://www.semanticdesktop.org/ontologies/nmm#")
-    .arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString());
-}
-
-Soprano::QueryResultIterator MusicQuery::executeSelect(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += "SELECT ";
-    
-    if (m_distinct)
-        queryString += "DISTINCT ";
-    if (m_selectResource)
-        queryString += "?r ?url";
-    if (m_selectArtist)
-        queryString += "?artist ";
-    if (m_selectAlbum)
-        queryString += "?album ";
-    if (m_selectTitle)
-        queryString += "?title ";
-    if (m_selectDuration)
-        queryString += "?duration ";
-    if (m_selectCreated)
-        queryString += "?created ";
-    if (m_selectTrackNumber)
-        queryString += "?trackNumber ";
-    if (m_selectGenre)
-        queryString += "?genre ";
-    if (m_selectRating)
-        queryString += "?rating ";
-    if (m_selectDescription)
-        queryString += "?description ";
-    if (m_selectArtwork)
-        queryString += "?artwork ";
-    
-    //NOTE: nie:url is not in any released nie ontology that I can find.
-    //      In future KDE will use nfo:fileUrl so this will need to be changed.
-    queryString += QString("WHERE { ?r rdf:type <%1> . OPTIONAL { ?r nie:url ?url } . ")
-    .arg(MediaVocabulary().typeAudioMusic().toString());
-    
-    queryString += m_artistCondition;
-    queryString += m_albumCondition;
-    queryString += m_titleCondition;
-    queryString += m_durationCondition;
-    queryString += m_createdCondition;
-    queryString += m_genreCondition;
-    queryString += m_trackNumberCondition;
-    queryString += m_ratingCondition;
-    queryString += m_searchCondition;
-    queryString += m_descriptionCondition;
-    queryString += m_artworkCondition;
-    
-    queryString += "} ";
-    
-    queryString += m_order;
-    
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql);
-}
-
-bool MusicQuery::executeAsk(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += QString("ASK { ?r rdf:type <%1> . ")
-    .arg(MediaVocabulary().typeAudioMusic().toString());
-    
-    queryString += m_artistCondition;
-    queryString += m_albumCondition;
-    queryString += m_titleCondition;
-    queryString += m_durationCondition;
-    queryString += m_createdCondition;
-    queryString += m_trackNumberCondition;
-    queryString += m_genreCondition;
-    queryString += m_ratingCondition;
-    queryString += m_searchCondition;
-    queryString += m_descriptionCondition;
-    
-    queryString += "} ";
-    
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql)
-                               .boolValue();
-}
diff --git a/src/platform/musiclistengine.h b/src/platform/musiclistengine.h
index fd5522a..71f3929 100644
--- a/src/platform/musiclistengine.h
+++ b/src/platform/musiclistengine.h
@@ -46,76 +46,12 @@ class MusicListEngine : public NepomukListEngine
         void setFilterForSources(const QString& engineFilter);
         
     private:
-        MediaItem createMediaItem(Soprano::QueryResultIterator& it);
+        //MediaItem createMediaItem(Soprano::QueryResultIterator& it);
         
     Q_SIGNALS:
         void results(QList<MediaItem> mediaList, MediaListProperties mediaListProperties, bool done);
         
 };
 
-class MusicQuery {
-    public:
-        MusicQuery(bool distinct = true);
-        
-        void selectResource();
-        void selectArtist(bool optional=false);
-        void selectAlbum(bool optional=false);
-        void selectTitle(bool optional=false);
-        void selectDuration(bool optional=false);
-        void selectCreated(bool optional=false);
-        void selectTrackNumber(bool optional=false);
-        void selectGenre(bool optional=false);
-        void selectRating(bool optional=false);
-        void selectDescription(bool optional=false);
-        void selectArtwork(bool optional=false);
-        
-        void hasArtist(QString album);
-        void hasNoArtist();
-        void hasAlbum(QString album);
-        void hasNoAlbum();
-        void hasGenre(QString genre);
-        void hasNoGenre();
-        
-        void searchString(QString str);
-        
-        void orderBy(QString var);
-        
-        
-        Soprano::QueryResultIterator executeSelect(Soprano::Model* model);
-        bool executeAsk(Soprano::Model* model);
-        
-    private:
-        bool m_distinct;
-        
-        bool m_selectResource;
-        bool m_selectArtist;
-        bool m_selectAlbum;
-        bool m_selectTitle;
-        bool m_selectDuration;
-        bool m_selectCreated;
-        bool m_selectTrackNumber;
-        bool m_selectGenre;
-        bool m_selectRating;
-        bool m_selectDescription;
-        bool m_selectArtwork;
-        
-        QString m_artistCondition;
-        QString m_albumCondition;
-        QString m_titleCondition;
-        QString m_durationCondition;
-        QString m_createdCondition;
-        QString m_trackNumberCondition;
-        QString m_genreCondition;
-        QString m_searchCondition;
-        QString m_ratingCondition;
-        QString m_descriptionCondition;
-        QString m_artworkCondition;
-        
-        QString m_order;
-        
-        QString addOptional(bool optional, QString str);
-        QString getPrefix();
-};
-
 #endif // MUSICLISTENGINE_H
 
diff --git a/src/platform/nepomukwriter/main.cpp b/src/platform/nepomukwriter/main.cpp
index 2359719..e0349f0 100644
--- a/src/platform/nepomukwriter/main.cpp
+++ b/src/platform/nepomukwriter/main.cpp
@@ -22,9 +22,9 @@
 #include <KLocalizedString>
 #include <KAboutData>
 #include <KDebug>
-#include <nepomuk/resource.h>
-#include <nepomuk/variant.h>
+#include <Nepomuk/Resource>
 #include <Nepomuk/ResourceManager>
+#include <Nepomuk/Variant>
 #include <KApplication>
 #include <QTextStream>
 #include <QFile>
@@ -49,6 +49,55 @@ void removeType(Nepomuk::Resource res, QUrl mediaType)
     res.setTypes(types);
 }
 
+void writeProperty(MediaVocabulary mediaVocabulary,
+                   Nepomuk::Resource res, QUrl property, Nepomuk::Variant value)
+{
+    QStringList storageProcedure = mediaVocabulary.storageProcedure(property);
+    Nepomuk::Resource valueResource;
+    for (int i = 0; i < storageProcedure.count(); i++) {
+        QString step = storageProcedure.at(i);
+        //kdebug() << step << "\n";
+        if (step == "[Resource]::[Property]::[Value]") {
+            res.setProperty(property, value);
+        } else if (step.startsWith("[ResourceValue]") && step.endsWith("[Value]")) {
+            QUrl propertyForValueResource = QUrl(step.split("::").at(1));
+            //kDebug() << "Setting new resource property " << propertyForValueResource.toString() << "\n";
+            valueResource.setProperty(propertyForValueResource, value);
+        } else {
+            QString stepValue = step.split("::").at(2);
+            if (stepValue == "[ResourceValue]") {
+                i++;
+                if (i < storageProcedure.count()) {
+                    QString valueResourceTypeStep = storageProcedure.at(i);
+                    if (valueResourceTypeStep.startsWith("[ResourceValue]::[Type]")) {
+                        //Create value resource
+                        QUrl valueResourceType = QUrl(valueResourceTypeStep.split("::").at(2));
+                        QString valueResourceIdentifier;
+                        if (property == mediaVocabulary.videoSeries()) {
+                            valueResourceIdentifier = QString("nmm-tvseries-%1").arg(value.toString());
+                        } else if (property == mediaVocabulary.musicArtist()) {
+                            valueResourceIdentifier = QString("music-artist-%1").arg(value.toString());
+                        } else if (property == mediaVocabulary.musicAlbum()) {
+                            valueResourceIdentifier = QString("music-album-%1").arg(value.toString());
+                        } else {
+                            valueResourceIdentifier = value.toString();
+                        }
+                        //kdebug() << "Creating resource " << valueResourceIdentifier;
+                        valueResource = Nepomuk::Resource(valueResourceIdentifier);
+                        if (!valueResource.exists()) {
+                            valueResource = Nepomuk::Resource(valueResourceIdentifier, valueResourceType);
+                        }
+                        
+                        //Set property of primary resource to the new value resource
+                        //kdebug() << "Pointing to new resource " << valueResource.resourceUri().toString() << "\n";
+                        res.setProperty(property, Nepomuk::Variant(valueResource));
+                    }
+                }
+            }
+        }
+    }
+}
+
 void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
 {
     //QTextStream cout(stdout, QIODevice::WriteOnly);
@@ -59,10 +108,12 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
     
     cout << QString("URL: %1\n").arg(url);
     
+    //Find resource
+    Nepomuk::Resource res(QUrl(url.toUtf8()));
+    
     if (fields["removeInfo"].toString() == "true") {
         
         //Remove metadata for media from nepomuk store
-        Nepomuk::Resource res(url);
         if (!res.exists()) {
             return;
         }
@@ -100,9 +151,9 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
                     cout << "Removing artist...\n";
                     res.removeProperty(mediaVocabulary.musicArtist());
                 }
-                if (res.hasProperty(mediaVocabulary.musicAlbumName())) {
+                if (res.hasProperty(mediaVocabulary.musicAlbum())) {
                     cout << "Removing album...\n";
-                    res.removeProperty(mediaVocabulary.musicAlbumName());
+                    res.removeProperty(mediaVocabulary.musicAlbum());
                 }
                 if (res.hasProperty(mediaVocabulary.genre())) {
                     cout << "Removing genre...\n";
@@ -229,8 +280,13 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
         
     } else {
         //Write media metadata info to nepomuk store;
-        Nepomuk::Resource res(url);
         
+        //Check and add nie:url property if necessary
+        if (!res.hasProperty(QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url"))) {
+            res.setProperty(QUrl("http://www.semanticdesktop.org/ontologies/2007/01/19/nie#url"),
+                                 QUrl(url.toUtf8()));
+        }
+    
         if (fields.contains("rating")) {
             cout << "Setting Rating...\n";
             int rating = fields["rating"].toInt();
@@ -240,13 +296,15 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
         if (fields.contains("playCount")) {
             cout << "Setting Play Count...\n";
             int playCount = fields["playCount"].toInt();
-            res.setProperty(mediaVocabulary.playCount(), Nepomuk::Variant(playCount));
+            writeProperty(mediaVocabulary, res, mediaVocabulary.playCount(), Nepomuk::Variant(playCount));
+            //res.setProperty(mediaVocabulary.playCount(), Nepomuk::Variant(playCount));
         }
         
         if (fields.contains("lastPlayed")) {
             cout << "Setting Last Played...\n";
             QDateTime lastPlayed = fields["lastPlayed"].toDateTime();
-            res.setProperty(mediaVocabulary.lastPlayed(), Nepomuk::Variant(lastPlayed));
+            writeProperty(mediaVocabulary, res, mediaVocabulary.lastPlayed(), Nepomuk::Variant(lastPlayed));
+            //res.setProperty(mediaVocabulary.lastPlayed(), Nepomuk::Variant(lastPlayed));
         }
 
         if (type == "Audio") {
@@ -283,12 +341,14 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
            QString title = fields["title"].toString();
             if (!title.isEmpty()) {
                 cout << "Writing title...\n";
-                res.setProperty(mediaVocabulary.title(), Nepomuk::Variant(title));
+                writeProperty(mediaVocabulary, res, mediaVocabulary.title(), Nepomuk::Variant(title));
+                //res.setProperty(mediaVocabulary.title(), Nepomuk::Variant(title));
             }
             QString description = fields["description"].toString();
             if (!description.isEmpty()) {
                 cout << "Writing description...\n";
-                res.setProperty(mediaVocabulary.description(), Nepomuk::Variant(description));
+                writeProperty(mediaVocabulary, res, mediaVocabulary.description(), Nepomuk::Variant(description));
+                //res.setProperty(mediaVocabulary.description(), Nepomuk::Variant(description));
             }
             QString artworkUrl = fields["artworkUrl"].toString();
             if (!artworkUrl.isEmpty()) {
@@ -303,33 +363,39 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
                 QString artist  = fields["artist"].toString();
                 if (!artist.isEmpty()) {
                     cout << "Writing artist...\n";
-                    res.setProperty(mediaVocabulary.musicArtist(), Nepomuk::Variant(artist));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.musicArtist(), Nepomuk::Variant(artist));
+                    //res.setProperty(mediaVocabulary.musicArtist(), Nepomuk::Variant(artist));
                 }
                 QString album   = fields["album"].toString();
                 if (!album.isEmpty()) {
                     cout << "Writing album...\n";
-                    res.setProperty(mediaVocabulary.musicAlbumName(), Nepomuk::Variant(album));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.musicAlbum(), Nepomuk::Variant(album));
+                    //res.setProperty(mediaVocabulary.musicAlbumName(), Nepomuk::Variant(album));
                 }
                 QString genre  = fields["genre"].toString();
                 if (!genre.isEmpty()) {
                     cout << "Writing genre...\n";
-                    res.setProperty(mediaVocabulary.genre(), Nepomuk::Variant(genre));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.genre(), Nepomuk::Variant(genre));
+                    //res.setProperty(mediaVocabulary.genre(), Nepomuk::Variant(genre));
                 }
                 int track   = fields["trackNumber"].toInt();
                 if (track != 0) {
                     cout << "Writing track...\n";
-                    res.setProperty(mediaVocabulary.musicTrackNumber(), Nepomuk::Variant(track));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.musicTrackNumber(), Nepomuk::Variant(track));
+                    //res.setProperty(mediaVocabulary.musicTrackNumber(), Nepomuk::Variant(track));
                 }
                 int duration = fields["duration"].toInt();
                 if (duration != 0) {
                     cout << "Writing duration...\n";
-                    res.setProperty(mediaVocabulary.duration(), Nepomuk::Variant(duration));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.duration(), Nepomuk::Variant(duration));
+                    //res.setProperty(mediaVocabulary.duration(), Nepomuk::Variant(duration));
                 }
                 int year = fields["year"].toInt();
                 if (year != 0) {
-                    QDate created = QDate(year, 1, 1);
+                    QDate releaseDate = QDate(year, 1, 1);
                     cout << "Writing year..." << year << "\n";
-                    res.setProperty(mediaVocabulary.created(), Nepomuk::Variant(created));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    //res.setProperty(mediaVocabulary.created(), Nepomuk::Variant(created));
                 }
             } else if ((fields["audioType"] == "Audio Stream") ||
                 (fields["audioType"] == "Audio Clip")) {
@@ -368,12 +434,14 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
             QString title = fields["title"].toString();
             if (!title.isEmpty()) {
                 cout << "Writing title...\n";
-                res.setProperty(mediaVocabulary.title(), Nepomuk::Variant(title));
+                writeProperty(mediaVocabulary, res, mediaVocabulary.title(), Nepomuk::Variant(title));
+                //res.setProperty(mediaVocabulary.title(), Nepomuk::Variant(title));
             }
             QString description = fields["description"].toString();
             if (!description.isEmpty()) {
                 cout << "Writing description...\n";
-                res.setProperty(mediaVocabulary.description(), Nepomuk::Variant(description));
+                writeProperty(mediaVocabulary, res, mediaVocabulary.description(), Nepomuk::Variant(description));
+                //res.setProperty(mediaVocabulary.description(), Nepomuk::Variant(description));
             }
             QString artworkUrl = fields["artworkUrl"].toString();
             if (!artworkUrl.isEmpty()) {
@@ -387,59 +455,71 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
             if (fields["videoType"] == "Movie") {
                 QString genre   = fields["genre"].toString();
                 if (!genre.isEmpty()) {
-                    res.setProperty(mediaVocabulary.genre(), Nepomuk::Variant(genre));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.genre(), Nepomuk::Variant(genre));
+                    //res.setProperty(mediaVocabulary.genre(), Nepomuk::Variant(genre));
                 }
                 QString synopsis   = fields["synopsis"].toString();
                 if (!synopsis.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoSynopsis(), Nepomuk::Variant(synopsis));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoSynopsis(), Nepomuk::Variant(synopsis));
+                    //res.setProperty(mediaVocabulary.videoSynopsis(), Nepomuk::Variant(synopsis));
                 }
                 int year = fields["year"].toInt();
                 if (year != 0) {
                     QDate releaseDate = QDate(year, 1, 1);
-                    res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    //res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
                 }
                 QDate releaseDate = fields["releaseDate"].toDate();
                 if (releaseDate.isValid()) {
-                    res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    //res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
                 }
                 QString writer   = fields["writer"].toString();
                 if (!writer.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoWriter(), Nepomuk::Variant(writer));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoWriter(), Nepomuk::Variant(writer));
+                    //res.setProperty(mediaVocabulary.videoWriter(), Nepomuk::Variant(writer));
                 }
                 QString director   = fields["director"].toString();
                 if (!director.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoDirector(), Nepomuk::Variant(director));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoDirector(), Nepomuk::Variant(director));
+                    //res.setProperty(mediaVocabulary.videoDirector(), Nepomuk::Variant(director));
                 }
                 QString assistantDirector   = fields["assistantDirector"].toString();
                 if (!assistantDirector.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoAssistantDirector(), Nepomuk::Variant(assistantDirector));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoAssistantDirector(), Nepomuk::Variant(assistantDirector));
+                    //res.setProperty(mediaVocabulary.videoAssistantDirector(), Nepomuk::Variant(assistantDirector));
                 }
                 QString producer   = fields["producer"].toString();
                 if (!producer.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoProducer(), Nepomuk::Variant(producer));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoProducer(), Nepomuk::Variant(producer));
+                    //res.setProperty(mediaVocabulary.videoProducer(), Nepomuk::Variant(producer));
                 }
                 QString actor   = fields["actor"].toString();
                 if (!actor.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoActor(), Nepomuk::Variant(actor));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoActor(), Nepomuk::Variant(actor));
+                    //res.setProperty(mediaVocabulary.videoActor(), Nepomuk::Variant(actor));
                 }
                 QString cinematographer   = fields["cinematographer"].toString();
                 if (!cinematographer.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoCinematographer(), Nepomuk::Variant(cinematographer));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoCinematographer(), Nepomuk::Variant(cinematographer));
+                    //res.setProperty(mediaVocabulary.videoCinematographer(), Nepomuk::Variant(cinematographer));
                 }
                 
             } else if (fields["videoType"] == "TV Show") {
                 QString seriesName = fields["seriesName"].toString();
                 if (!seriesName.isEmpty()) {
-                    Nepomuk::Resource series(fields["seriesName"].toString());
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoSeries(), Nepomuk::Variant(seriesName));
+                    /*Nepomuk::Resource series(fields["seriesName"].toString());
                     if (!series.exists()) {
                         Nepomuk::Resource(fields["seriesName"].toString(), mediaVocabulary.typeTVSeries());
                     }
                     res.setProperty(mediaVocabulary.videoSeries(), Nepomuk::Variant(series));
-                    series.setProperty(mediaVocabulary.title(), Nepomuk::Variant(seriesName));
+                    series.setProperty(mediaVocabulary.title(), Nepomuk::Variant(seriesName));*/
                 }
                 int season = fields["season"].toInt();
                 if (season != 0) {
-                    res.setProperty(mediaVocabulary.videoSeason(), Nepomuk::Variant(season));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoSeason(), Nepomuk::Variant(season));
+                    //res.setProperty(mediaVocabulary.videoSeason(), Nepomuk::Variant(season));
                 } else {
                     if (res.hasProperty(mediaVocabulary.videoSeason())) {
                         res.removeProperty(mediaVocabulary.videoSeason());
@@ -447,7 +527,8 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
                 }
                 int episodeNumber = fields["episodeNumber"].toInt();
                 if (episodeNumber != 0) {
-                    res.setProperty(mediaVocabulary.videoEpisodeNumber(), Nepomuk::Variant(episodeNumber));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoEpisodeNumber(), Nepomuk::Variant(episodeNumber));
+                    //res.setProperty(mediaVocabulary.videoEpisodeNumber(), Nepomuk::Variant(episodeNumber));
                 } else {
                     if (res.hasProperty(mediaVocabulary.videoEpisodeNumber())) {
                         res.removeProperty(mediaVocabulary.videoEpisodeNumber());
@@ -455,44 +536,54 @@ void writeToNepomuk(QTextStream &cout, QHash <QString, QVariant> fields)
                 }
                 QString genre   = fields["genre"].toString();
                 if (!genre.isEmpty()) {
-                    res.setProperty(mediaVocabulary.genre(), Nepomuk::Variant(genre));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.genre(), Nepomuk::Variant(genre));
+                    //res.setProperty(mediaVocabulary.genre(), Nepomuk::Variant(genre));
                 }
                 QString synopsis   = fields["synopsis"].toString();
                 if (!synopsis.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoSynopsis(), Nepomuk::Variant(synopsis));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoSynopsis(), Nepomuk::Variant(synopsis));
+                    //res.setProperty(mediaVocabulary.videoSynopsis(), Nepomuk::Variant(synopsis));
                 }
                 int year = fields["year"].toInt();
                 if (year != 0) {
                     QDate releaseDate = QDate(year, 1, 1);
-                    res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    //res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
                 }
                 QDate releaseDate = fields["releaseDate"].toDate();
                 if (releaseDate.isValid()) {
-                    res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
+                    //res.setProperty(mediaVocabulary.releaseDate(), Nepomuk::Variant(releaseDate));
                 }
                 QString writer   = fields["writer"].toString();
                 if (!writer.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoWriter(), Nepomuk::Variant(writer));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoWriter(), Nepomuk::Variant(writer));
+                    //res.setProperty(mediaVocabulary.videoWriter(), Nepomuk::Variant(writer));
                 }
                 QString director   = fields["director"].toString();
                 if (!director.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoDirector(), Nepomuk::Variant(director));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoDirector(), Nepomuk::Variant(director));
+                    //res.setProperty(mediaVocabulary.videoDirector(), Nepomuk::Variant(director));
                 }
                 QString assistantDirector   = fields["assistantDirector"].toString();
                 if (!assistantDirector.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoAssistantDirector(), Nepomuk::Variant(assistantDirector));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoAssistantDirector(), Nepomuk::Variant(assistantDirector));
+                    //res.setProperty(mediaVocabulary.videoAssistantDirector(), Nepomuk::Variant(assistantDirector));
                 }
                 QString producer   = fields["producer"].toString();
                 if (!producer.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoProducer(), Nepomuk::Variant(producer));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoProducer(), Nepomuk::Variant(producer));
+                    //res.setProperty(mediaVocabulary.videoProducer(), Nepomuk::Variant(producer));
                 }
                 QString actor   = fields["actor"].toString();
                 if (!actor.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoActor(), Nepomuk::Variant(actor));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoActor(), Nepomuk::Variant(actor));
+                    //res.setProperty(mediaVocabulary.videoActor(), Nepomuk::Variant(actor));
                 }
                 QString cinematographer   = fields["cinematographer"].toString();
                 if (!cinematographer.isEmpty()) {
-                    res.setProperty(mediaVocabulary.videoCinematographer(), Nepomuk::Variant(cinematographer));
+                    writeProperty(mediaVocabulary, res, mediaVocabulary.videoCinematographer(), Nepomuk::Variant(cinematographer));
+                    //res.setProperty(mediaVocabulary.videoCinematographer(), Nepomuk::Variant(cinematographer));
                 }
             }
         }
diff --git a/src/platform/playlist.cpp b/src/platform/playlist.cpp
index 68474f4..37f4f19 100644
--- a/src/platform/playlist.cpp
+++ b/src/platform/playlist.cpp
@@ -268,7 +268,7 @@ void Playlist::stop()
     emit playlistFinished();
 }
 
-void Playlist::playMediaList(QList<MediaItem> mediaList)
+void Playlist::playMediaList(const QList<MediaItem> &mediaList)
 {
     //Clear playlist
     clearPlaylist();
@@ -288,7 +288,7 @@ void Playlist::playMediaList(QList<MediaItem> mediaList)
 //--- Playlist data control methods ---
 //----------------------------------------
 
-void Playlist::addMediaList(QList<MediaItem> mediaList)
+void Playlist::addMediaList(const QList<MediaItem> &mediaList)
 {
     int startingRow = m_currentPlaylist->rowCount();
     for (int i = 0; i < mediaList.count(); ++i) {
@@ -297,7 +297,7 @@ void Playlist::addMediaList(QList<MediaItem> mediaList)
     }
 }
 
-void Playlist::addMediaItem(MediaItem mediaItem)
+void Playlist::addMediaItem(const MediaItem &mediaItem)
 {
     int startingRow = m_currentPlaylist->rowCount();
     m_currentPlaylist->loadMediaItem(mediaItem, true);
@@ -786,7 +786,7 @@ void Playlist::metaDataChanged()
         if ((mediaItem.type == "Audio") && (mediaItem.fields["audioType"].toString() == "Audio Stream")) {
             
             mediaItem.subTitle = m_mediaObject->metaData("TITLE").join(" ");
-            m_nowPlaying->replaceMediaItemAt(0, mediaItem);
+            m_nowPlaying->replaceMediaItemAt(0, mediaItem, true);
         }
     }
 }
diff --git a/src/platform/playlist.h b/src/platform/playlist.h
index e52291a..dc92219 100644
--- a/src/platform/playlist.h
+++ b/src/platform/playlist.h
@@ -65,14 +65,14 @@ class Playlist : public QObject
          *
          * @param mediaList List of MediaItems to add
          */
-        void addMediaList(QList<MediaItem> mediaList);
+        void addMediaList(const QList<MediaItem> &mediaList);
         
         /**
          * Adds a MediaItem to playlist.
          *
          * @param mediaItem MediaItem to add.
          */
-        void addMediaItem(MediaItem mediaItem);
+        void addMediaItem(const MediaItem &mediaItem);
         
         /**
          * Clears the playlist
@@ -123,7 +123,7 @@ class Playlist : public QObject
          *
          * @param mediaList list of MediaItems to play
          */
-        void playMediaList(QList<MediaItem> mediaList);
+        void playMediaList(const QList<MediaItem> &mediaList);
         
         /**
          * Returns the MediaItemModel containing the list of MediaItems
diff --git a/src/platform/savedlistsengine.cpp b/src/platform/savedlistsengine.cpp
index 9b46a4c..64a17a7 100644
--- a/src/platform/savedlistsengine.cpp
+++ b/src/platform/savedlistsengine.cpp
@@ -32,7 +32,7 @@
 #include <taglib/tstring.h>
 #include <id3v2tag.h>
 
-SavedListsEngine::SavedListsEngine(ListEngineFactory * parent) : ListEngine(parent)
+SavedListsEngine::SavedListsEngine(ListEngineFactory * parent) : NepomukListEngine(parent)
 {
 }
 
@@ -42,10 +42,15 @@ SavedListsEngine::~SavedListsEngine()
 
 void SavedListsEngine::run()
 {
-    QList<MediaItem> mediaList;
+    if (m_updateSourceInfo || m_removeSourceInfo) {
+        NepomukListEngine::run();
+        return;
+    }
     
+    QList<MediaItem> mediaList;
     
     if (!m_mediaListProperties.engineArg().isEmpty()) {
+        QString workingDir;
         QFile file(KStandardDirs::locateLocal("data", QString("bangarang/%1").arg(m_mediaListProperties.engineArg()), false));
         if (file.exists()) {
             if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
@@ -54,6 +59,7 @@ void SavedListsEngine::run()
             }
         } else {
             KUrl url(m_mediaListProperties.engineArg());
+            workingDir = url.directory(KUrl::AppendTrailingSlash);
             file.setFileName(url.path());
             if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
                 model()->addResults(m_requestSignature, mediaList, m_mediaListProperties, true, m_subRequestSignature);
@@ -96,12 +102,16 @@ void SavedListsEngine::run()
                     }
                     QString url = in.readLine().trimmed();
                     MediaItem mediaItem;
+                    KUrl itemUrl(url);
                     if (!url.isEmpty()) {
-                        mediaItem = Utilities::mediaItemFromUrl(KUrl(url));
+                        if (itemUrl.pathOrUrl() == itemUrl.fileName()) {
+                            itemUrl = KUrl(workingDir + itemUrl.fileName());
+                        }
+                        mediaItem = Utilities::mediaItemFromUrl(itemUrl);
                     } else {
                         continue;
                     }
-                    if ((!mediaItem.title.isEmpty()) && (url.contains(mediaItem.title))) {
+                    if (mediaItem.title == itemUrl.fileName()) {
                         mediaItem.title = title;
                     }
                     if ((duration > 0) && (mediaItem.fields["duration"].toInt() <= 0)) {
@@ -127,12 +137,16 @@ void SavedListsEngine::run()
                     }
                     
                     MediaItem mediaItem;
+                    KUrl itemUrl(url);
                     if (!url.isEmpty()) {
-                        mediaItem = Utilities::mediaItemFromUrl(KUrl(url));
+                        if (itemUrl.pathOrUrl() == itemUrl.fileName()) {
+                            itemUrl = KUrl(workingDir + itemUrl.fileName());
+                        }
+                        mediaItem = Utilities::mediaItemFromUrl(itemUrl);
                     } else {
                         continue;
                     }
-                    if ((!mediaItem.title.isEmpty()) && (url.contains(mediaItem.title))) {
+                    if (mediaItem.title == itemUrl.fileName()) {
                         mediaItem.title = title;
                     }
                     if ((duration > 0) && (mediaItem.fields["duration"].toInt() <= 0)) {
diff --git a/src/platform/savedlistsengine.h b/src/platform/savedlistsengine.h
index cba5767..d7e4e27 100644
--- a/src/platform/savedlistsengine.h
+++ b/src/platform/savedlistsengine.h
@@ -19,7 +19,7 @@
 #ifndef SAVEDLISTSENGINE_H
 #define SAVEDLISTSENGINE_H
 
-#include "listengine.h"
+#include "nepomuklistengine.h"
 #include <QtCore>
 #include <QDir>
 #include <KUrl>
@@ -38,7 +38,7 @@ class MediaIndexer;
 * List Resource Identifiers handled are:
 *   savedlists://[name]
 */
-class SavedListsEngine : public ListEngine
+class SavedListsEngine : public NepomukListEngine
 {
     Q_OBJECT
     
diff --git a/src/platform/semanticslistengine.cpp b/src/platform/semanticslistengine.cpp
index 8735bf9..08bfe8e 100644
--- a/src/platform/semanticslistengine.cpp
+++ b/src/platform/semanticslistengine.cpp
@@ -20,6 +20,7 @@
 #include "mediaitemmodel.h"
 #include "listenginefactory.h"
 #include "mediavocabulary.h"
+#include "mediaquery.h"
 #include "utilities.h"
 #include <KIcon>
 #include <KUrl>
@@ -56,6 +57,7 @@ void SemanticsListEngine::run()
     QString engineArg = m_mediaListProperties.engineArg();
     QString engineFilter = m_mediaListProperties.engineFilter();
     QString mediaType;
+    MediaVocabulary mediaVocabulary = MediaVocabulary();
     
     //Parse filter
     if (!engineFilter.isNull()) {
@@ -65,26 +67,41 @@ void SemanticsListEngine::run()
     
     if (m_nepomukInited) {
         if (engineArg.toLower() == "frequent") {
-            SemanticsQuery query = SemanticsQuery(true);
             if (!mediaType.isEmpty()) {
+                MediaQuery query;
+                QStringList bindings;
+                bindings.append(mediaVocabulary.mediaResourceBinding());
+                bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+                bindings.append(mediaVocabulary.playCountBinding());
+                query.select(bindings, MediaQuery::Distinct);
+                query.startWhere();
                 if (mediaType == "audio") {
-                    query.selectAudioResource();
+                    query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required));
                 } else if (mediaType == "video") {
-                    query.selectVideoResource();
+                    query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required));
                 }
-                query.selectPlayCount();
-                query.selectLastPlayed(true);
-                query.orderBy("DESC(?playcount) DESC(?lastplayed)");
+                query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Required));
+                query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional));
+                query.endWhere();
+                QStringList orderByBindings;
+                QList<MediaQuery::Order> order;
+                orderByBindings.append(mediaVocabulary.playCountBinding());
+                order.append(MediaQuery::Descending);
+                orderByBindings.append(mediaVocabulary.lastPlayedBinding());
+                order.append(MediaQuery::Descending);
+                query.orderBy(orderByBindings, order);
+                query.addLimit(20);
                 
                 Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
 
                 //Build media list from results
                 while( it.next() ) {
-                    QUrl url = it.binding("url").uri().isEmpty() ? 
-                                    it.binding("r").uri() :
-                                    it.binding("url").uri();
+                    QUrl url = it.binding(mediaVocabulary.mediaResourceUrlBinding())
+                                   .uri().isEmpty() ? it.binding(mediaVocabulary.mediaResourceBinding()).uri() :
+                                   it.binding(mediaVocabulary.mediaResourceUrlBinding()).uri();
                     MediaItem mediaItem = Utilities::mediaItemFromUrl(url);
-                    mediaItem.fields["description"] = mediaItem.fields["description"].toString() + QString(" - Played %1 times").arg(it.binding("playcount").literal().toInt());
+                    int playCount = it.binding(mediaVocabulary.playCountBinding()).literal().toInt();
+                    mediaItem.fields["description"] = mediaItem.fields["description"].toString() + QString(" - Played %1 times").arg(playCount);
                     mediaList.append(mediaItem);
                 }
                 m_mediaListProperties.name = i18n("Frequently Played");
@@ -92,24 +109,38 @@ void SemanticsListEngine::run()
             }
         }
         if (engineArg.toLower() == "recent") {
-            SemanticsQuery query = SemanticsQuery(true);
             if (!mediaType.isEmpty()) {
+                MediaQuery query;
+                QStringList bindings;
+                bindings.append(mediaVocabulary.mediaResourceBinding());
+                bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+                bindings.append(mediaVocabulary.lastPlayedBinding());
+                query.select(bindings, MediaQuery::Distinct);
+                query.startWhere();
                 if (mediaType == "audio") {
-                    query.selectAudioResource();
+                    query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required));
                 } else if (mediaType == "video") {
-                    query.selectVideoResource();
+                    query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required));
                 }
-                query.selectLastPlayed();
-                query.orderBy("DESC(?lastplayed)");
+                query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional));
+                query.endWhere();
+                QStringList orderByBindings;
+                QList<MediaQuery::Order> order;
+                orderByBindings.append(mediaVocabulary.lastPlayedBinding());
+                order.append(MediaQuery::Descending);
+                query.orderBy(orderByBindings, order);
+                query.addLimit(20);
+                
                 Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
                 
                 //Build media list from results
                 while( it.next() ) {
-                    QUrl url = it.binding("url").uri().isEmpty() ? 
-                                    it.binding("r").uri() :
-                                    it.binding("url").uri();
+                    QUrl url = it.binding(mediaVocabulary.mediaResourceUrlBinding())
+                                    .uri().isEmpty() ? 
+                                    it.binding(mediaVocabulary.mediaResourceBinding()).uri() :
+                                    it.binding(mediaVocabulary.mediaResourceUrlBinding()).uri();
                     MediaItem mediaItem = Utilities::mediaItemFromUrl(url);
-                    QString lastPlayed = it.binding("lastplayed").literal().toDateTime().toString("ddd MMMM d yyyy h:mm:ss ap") ;
+                    QString lastPlayed = it.binding(mediaVocabulary.lastPlayedBinding()).literal().toDateTime().toString("ddd MMMM d yyyy h:mm:ss ap") ;
                     mediaItem.fields["description"] = mediaItem.fields["description"].toString() + QString(" - Last Played: %1").arg(lastPlayed);
                     mediaList.append(mediaItem);
                 }
@@ -118,23 +149,39 @@ void SemanticsListEngine::run()
             }
         }
         if (engineArg.toLower() == "highest") {
-            SemanticsQuery query = SemanticsQuery(true);
             if (!mediaType.isEmpty()) {
+                MediaQuery query;
+                QStringList bindings;
+                bindings.append(mediaVocabulary.mediaResourceBinding());
+                bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+                bindings.append(mediaVocabulary.ratingBinding());
+                query.select(bindings, MediaQuery::Distinct);
+                query.startWhere();
                 if (mediaType == "audio") {
-                    query.selectAudioResource();
+                    query.addCondition(mediaVocabulary.hasTypeAnyAudio(MediaQuery::Required));
                 } else if (mediaType == "video") {
-                    query.selectVideoResource();
+                    query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required));
                 }
-                query.selectRating();
-                query.selectPlayCount(true);
-                query.orderBy("DESC(?rating) DESC(?playcount) ");
+                query.addCondition(mediaVocabulary.hasRating(MediaQuery::Required));
+                query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional));
+                query.endWhere();
+                QStringList orderByBindings;
+                QList<MediaQuery::Order> order;
+                orderByBindings.append(mediaVocabulary.ratingBinding());
+                order.append(MediaQuery::Descending);
+                orderByBindings.append(mediaVocabulary.playCountBinding());
+                order.append(MediaQuery::Descending);
+                query.orderBy(orderByBindings, order);
+                query.addLimit(20);
+                
                 Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
                 
                 //Build media list from results
                 while( it.next() ) {
-                    QUrl url = it.binding("url").uri().isEmpty() ? 
-                                    it.binding("r").uri() :
-                                    it.binding("url").uri();
+                    QUrl url = it.binding(mediaVocabulary.mediaResourceUrlBinding())
+                                .uri().isEmpty() ? 
+                                it.binding(mediaVocabulary.mediaResourceBinding()).uri() :
+                                it.binding(mediaVocabulary.mediaResourceUrlBinding()).uri();
                     MediaItem mediaItem = Utilities::mediaItemFromUrl(url);
                     mediaList.append(mediaItem);
                 }
@@ -155,158 +202,3 @@ void SemanticsListEngine::run()
     m_requestSignature = QString();
     m_subRequestSignature = QString();
 }
-
-SemanticsQuery::SemanticsQuery(bool distinct) :
-m_distinct(distinct),
-m_selectAudioResource(false),
-m_selectVideoResource(false),
-m_selectRating(false),
-m_selectPlayCount(false),
-m_selectLastPlayed(false)
-{
-}
-
-void SemanticsQuery::selectAudioResource() {
-    m_selectAudioResource = true;
-    //NOTE: nie:url is not in any released nie ontology that I can find.
-    //      In future KDE will use nfo:fileUrl so this will need to be changed.
-    m_audioResourceCondition = addOptional(false,
-                                    QString(" { ?r rdf:type <%1> } "
-                                            " UNION  "
-                                            " { ?r rdf:type <%2> } "
-                                            " UNION "
-                                            " { ?r rdf:type <%3> } "
-                                            " OPTIONAL { ?r nie:url ?url } . ")
-                                    .arg(MediaVocabulary().typeAudio().toString())
-                                    .arg(MediaVocabulary().typeAudioMusic().toString())
-                                    .arg(MediaVocabulary().typeAudioStream().toString()));
-}
-
-void SemanticsQuery::selectVideoResource() {
-    m_selectVideoResource = true;
-    //NOTE: nie:url is not in any released nie ontology that I can find.
-    //      In future KDE will use nfo:fileUrl so this will need to be changed.
-    m_videoResourceCondition = QString(" { ?r rdf:type <%1> } "
-                                           " UNION  "
-                                           " { ?r rdf:type <%2> } "
-                                           " UNION "
-                                           " { ?r rdf:type <%3> } "
-                                           " OPTIONAL { ?r nie:url ?url } . ")
-                                           .arg(MediaVocabulary().typeVideo().toString())
-                                           .arg(MediaVocabulary().typeVideoMovie().toString())
-                                           .arg(MediaVocabulary().typeVideoTVShow().toString());
-}
-
-void SemanticsQuery::selectRating(bool optional) {
-    m_selectRating = true;
-    m_ratingCondition = addOptional(optional,
-                                   QString("?r <%1> ?rating . ")
-                                   .arg(Soprano::Vocabulary::NAO::numericRating().toString()));
-}
-
-void SemanticsQuery::selectPlayCount(bool optional) {
-    m_selectPlayCount = true;
-    m_playCountCondition = addOptional(optional,
-                                    QString("?r <%1> ?playcount . ")
-                                    .arg(MediaVocabulary().playCount().toString()));
-}
-
-void SemanticsQuery::selectLastPlayed(bool optional) {
-    m_selectLastPlayed = true;
-    m_lastPlayedCondition = addOptional(optional,
-                                       QString("?r <%1> ?lastplayed . ")
-                                       .arg(MediaVocabulary().lastPlayed().toString()));
-}
-
-void SemanticsQuery::searchString(QString str) {
-    if (! str.isEmpty()) {
-        //FIXME for rating search, etc.
-        m_searchCondition = QString(
-        "FILTER (regex(str(?artist),\"%1\",\"i\") || " 
-        "regex(str(?album),\"%1\",\"i\") || "
-        "regex(str(?title),\"%1\",\"i\")) ")
-        .arg(str);
-    }
-}
-
-
-void SemanticsQuery::orderBy(QString var) {
-    if (!var.isEmpty()) {
-        m_order = "ORDER BY " + var;
-    }
-}
-
-
-QString SemanticsQuery::addOptional(bool optional, QString str) {
-    if (optional) {
-        return QString("OPTIONAL { ") + str + "} . ";
-    } else {
-        return str;
-    }
-}
-
-QString SemanticsQuery::getPrefix() {
-    return QString("PREFIX xesam: <%1> "
-    "PREFIX rdf: <%2> "
-    "PREFIX nmm: <%3> "
-    "PREFIX xls: <%4> "
-    "PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> ")
-    .arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString())
-    .arg(Soprano::Vocabulary::RDF::rdfNamespace().toString())
-    .arg("http://www.semanticdesktop.org/ontologies/nmm#")
-    .arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString());
-}
-
-QString SemanticsQuery::query() {
-    QString queryString = getPrefix();
-    queryString += "SELECT ";
-    
-    if (m_distinct)
-        queryString += "DISTINCT ";
-    if (m_selectAudioResource || m_selectVideoResource)
-        queryString += "?r ?url ";
-    if (m_selectRating)
-        queryString += "?rating ";
-    if (m_selectPlayCount)
-        queryString += "?playcount ";
-    if (m_selectLastPlayed)
-        queryString += "?lastplayed ";
-    
-    queryString += QString("WHERE { ");
-    
-    queryString += m_audioResourceCondition;
-    queryString += m_videoResourceCondition;
-    queryString += m_ratingCondition;
-    queryString += m_playCountCondition;
-    queryString += m_lastPlayedCondition;
-    
-    queryString += "} ";
-    
-    queryString += m_order;
-    queryString += " LIMIT 20 ";
-    
-    return queryString;
-}
-
-Soprano::QueryResultIterator SemanticsQuery::executeSelect(Soprano::Model* model) {
-    QString queryString = query();
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql);
-}
-
-bool SemanticsQuery::executeAsk(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += QString("ASK { ");
-    
-    queryString += m_audioResourceCondition;
-    queryString += m_videoResourceCondition;
-    queryString += m_ratingCondition;
-    queryString += m_playCountCondition;
-    queryString += m_lastPlayedCondition;
-    
-    queryString += "} ";
-    
-    return model->executeQuery(queryString,
-                               Soprano::Query::QueryLanguageSparql)
-                               .boolValue();
-}
diff --git a/src/platform/semanticslistengine.h b/src/platform/semanticslistengine.h
index 2247380..f444f86 100644
--- a/src/platform/semanticslistengine.h
+++ b/src/platform/semanticslistengine.h
@@ -53,45 +53,5 @@ class SemanticsListEngine : public NepomukListEngine
         
 };
 
-class SemanticsQuery {
-    public:
-        SemanticsQuery(bool distinct = true);
-        
-        void selectAudioResource();
-        void selectVideoResource();
-        void selectRating(bool optional=false);
-        void selectPlayCount(bool optional=false);
-        void selectLastPlayed(bool optional=false);
-        
-        void searchString(QString str);
-        
-        void orderBy(QString var);
-        
-        QString query();
-        Soprano::QueryResultIterator executeSelect(Soprano::Model* model);
-        bool executeAsk(Soprano::Model* model);
-        
-    private:
-        bool m_distinct;
-        
-        bool m_selectAudioResource;
-        bool m_selectVideoResource;
-        bool m_selectRating;
-        bool m_selectPlayCount;
-        bool m_selectLastPlayed;
-        
-        QString m_audioResourceCondition;
-        QString m_videoResourceCondition;
-        QString m_ratingCondition;
-        QString m_playCountCondition;
-        QString m_lastPlayedCondition;
-        QString m_searchCondition;
-        
-        QString m_order;
-        
-        QString addOptional(bool optional, QString str);
-        QString getPrefix();
-};
-
 #endif // SEMANTICSLISTENGINE_H
 
diff --git a/src/platform/utilities.cpp b/src/platform/utilities.cpp
index 6839922..32074af 100644
--- a/src/platform/utilities.cpp
+++ b/src/platform/utilities.cpp
@@ -19,6 +19,7 @@
 #include "utilities.h"
 #include "mediaitemmodel.h"
 #include "mediavocabulary.h"
+#include "mediaquery.h"
 
 #include <KUrl>
 #include <KEncodingProber>
@@ -30,8 +31,9 @@
 #include <Soprano/Vocabulary/Xesam>
 #include <Soprano/Vocabulary/RDF>
 #include <Soprano/Vocabulary/XMLSchema>
-#include <nepomuk/resource.h>
-#include <nepomuk/variant.h>
+#include <Soprano/Model>
+#include <Nepomuk/Resource>
+#include <Nepomuk/Variant>
 #include <Nepomuk/ResourceManager>
 
 #include <QByteArray>
@@ -49,7 +51,7 @@
 #include <taglib/attachedpictureframe.h>
 //#include "blur.cpp"
 
-QPixmap Utilities::getArtworkFromTag(QString url, QSize size)
+QPixmap Utilities::getArtworkFromTag(const QString &url, QSize size)
 {
     TagLib::MPEG::File mpegFile(KUrl(url).path().toLocal8Bit());
     TagLib::ID3v2::Tag *id3tag = mpegFile.ID3v2Tag(false);
@@ -74,7 +76,7 @@ QPixmap Utilities::getArtworkFromTag(QString url, QSize size)
     return QPixmap::fromImage(attachedImage);
 }
 
-QPixmap Utilities::getArtworkFromMediaItem(MediaItem mediaItem)
+QPixmap Utilities::getArtworkFromMediaItem(const MediaItem &mediaItem)
 {
     QPixmap pixmap = QPixmap();
     if (Utilities::isMusic(mediaItem.url)) {
@@ -89,7 +91,7 @@ QPixmap Utilities::getArtworkFromMediaItem(MediaItem mediaItem)
     return pixmap;
 }
 
-QString Utilities::getArtistFromTag(QString url)
+QString Utilities::getArtistFromTag(const QString &url)
 {
     QString artist;
     if (Utilities::isMusic(url)) {
@@ -99,7 +101,7 @@ QString Utilities::getArtistFromTag(QString url)
     return artist;
 }
 
-QString Utilities::getAlbumFromTag(QString url)
+QString Utilities::getAlbumFromTag(const QString &url)
 {
     QString album;
     if (Utilities::isMusic(url)) {
@@ -109,7 +111,7 @@ QString Utilities::getAlbumFromTag(QString url)
     return album;
 }
 
-QString Utilities::getTitleFromTag(QString url)
+QString Utilities::getTitleFromTag(const QString &url)
 {
     QString title;
     if (Utilities::isMusic(url)) {
@@ -119,7 +121,7 @@ QString Utilities::getTitleFromTag(QString url)
     return title;
 }
 
-QString Utilities::getGenreFromTag(QString url)
+QString Utilities::getGenreFromTag(const QString &url)
 {
     QString genre;
     if (Utilities::isMusic(url)) {
@@ -129,7 +131,7 @@ QString Utilities::getGenreFromTag(QString url)
     return genre;
 }
 
-int Utilities::getYearFromTag(QString url)
+int Utilities::getYearFromTag(const QString &url)
 {
     int year = 0;
     if (Utilities::isMusic(url)) {
@@ -139,7 +141,7 @@ int Utilities::getYearFromTag(QString url)
     return year;
 }
 
-int Utilities::getDurationFromTag(QString url)
+int Utilities::getDurationFromTag(const QString &url)
 {
     int duration = 0;
     if (Utilities::isMusic(url)) {
@@ -149,7 +151,7 @@ int Utilities::getDurationFromTag(QString url)
     return duration;
 }
 
-int Utilities::getTrackNumberFromTag(QString url)
+int Utilities::getTrackNumberFromTag(const QString &url)
 {
     int track = 0;
     if (Utilities::isMusic(url)) {
@@ -159,9 +161,8 @@ int Utilities::getTrackNumberFromTag(QString url)
     return track;
 }
 
-bool Utilities::saveArtworkToTag(QString url, const QPixmap *pixmap)
+bool Utilities::saveArtworkToTag(const QString &url, const QPixmap *pixmap)
 {
-    //FIXME:: HELP! Can't figure out why this doesn't work
     TagLib::MPEG::File mpegFile(KUrl(url).path().toLocal8Bit());
     TagLib::ID3v2::Tag *id3tag = mpegFile.ID3v2Tag(true);
     
@@ -171,37 +172,45 @@ bool Utilities::saveArtworkToTag(QString url, const QPixmap *pixmap)
     QBuffer buffer(&data);
     buffer.open(QIODevice::WriteOnly);
     pixmap->save(&buffer, "PNG");
-    //TagLib::ID3v2::AttachedPictureFrame *frame = new TagLib::ID3v2::AttachedPictureFrame();
     frame->setMimeType(TagLib::String("image/png"));
     frame->setPicture(TagLib::ByteVector(data.data(), data.size()));
     frame->setDescription("Cover Image");
-    //id3tag->removeFrames("APIC");
-    //id3tag->addFrame(frame);
     return mpegFile.save();
 }
 
-bool Utilities::saveArtworkToTag(QString url, QString imageurl)
+bool Utilities::saveArtworkToTag(const QString &url, const QString &imageurl)
 {
-    //QByteArray filePath = QFile::encodeName(KUrl(url).path());
-    TagLib::MPEG::File mpegFile(KUrl(url).path().toLocal8Bit());
-    TagLib::ID3v2::Tag *id3tag = mpegFile.ID3v2Tag(true);
-    
-    TagLib::ID3v2::AttachedPictureFrame *frame = Utilities::attachedPictureFrame(id3tag, true);
-    
-    QFile file(KUrl(imageurl).path());
-    file.open(QIODevice::ReadOnly);
-    QByteArray data = file.readAll();
-    
-    //TagLib::ID3v2::AttachedPictureFrame *frame = new TagLib::ID3v2::AttachedPictureFrame();
-    frame->setMimeType(TagLib::String("image/png"));
-    frame->setPicture(TagLib::ByteVector(data.data(), data.size()));
-    frame->setDescription("Cover Image");
-    //id3tag->removeFrames("APIC");
-    //id3tag->addFrame(frame);
-    return mpegFile.save();
+    KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true);
+    if (result->is("audio/mpeg")) {
+        TagLib::MPEG::File mpegFile(KUrl(url).path().toUtf8());
+        if (mpegFile.isValid()) {
+            TagLib::ID3v2::Tag *id3tag = mpegFile.ID3v2Tag(true);
+
+            TagLib::ID3v2::AttachedPictureFrame *frame = Utilities::attachedPictureFrame(id3tag, true);
+            
+            QFile file(KUrl(imageurl).path());
+            file.open(QIODevice::ReadOnly);
+            QByteArray data = file.readAll();
+            
+            KMimeType::Ptr result = KMimeType::findByUrl(KUrl(imageurl), 0, true);
+            if (result->is("image/png")) {
+                frame->setMimeType("image/png");
+            } else if (result->is("image/jpeg")) {
+                frame->setMimeType("image/jpeg");
+            }
+            
+            frame->setPicture(TagLib::ByteVector(data.data(), data.size()));
+            frame->setDescription("Cover Image");
+            return mpegFile.save();
+        } else {
+            return false;
+        }
+    } else {
+        return false;
+    }
 }
 
-void Utilities::setArtistTag(QString url, QString artist)
+void Utilities::setArtistTag(const QString &url, const QString &artist)
 {
     if (Utilities::isMusic(url)) {
         TagLib::String tArtist(artist.trimmed().toUtf8().data(), TagLib::String::UTF8);
@@ -211,7 +220,7 @@ void Utilities::setArtistTag(QString url, QString artist)
     }
 }
 
-void Utilities::setAlbumTag(QString url, QString album)
+void Utilities::setAlbumTag(const QString &url, const QString &album)
 {
     if (Utilities::isMusic(url)) {
         TagLib::String tAlbum(album.trimmed().toUtf8().data(), TagLib::String::UTF8);
@@ -221,7 +230,7 @@ void Utilities::setAlbumTag(QString url, QString album)
     }
 }
 
-void Utilities::setTitleTag(QString url, QString title)
+void Utilities::setTitleTag(const QString &url, const QString &title)
 {
     if (Utilities::isMusic(url)) {
         TagLib::String tTitle(title.trimmed().toUtf8().data(), TagLib::String::UTF8);
@@ -231,7 +240,7 @@ void Utilities::setTitleTag(QString url, QString title)
     }
 }
 
-void Utilities::setGenreTag(QString url, QString genre)
+void Utilities::setGenreTag(const QString &url, const QString &genre)
 {
     if (Utilities::isMusic(url)) {
         TagLib::String tGenre(genre.trimmed().toUtf8().data(), TagLib::String::UTF8);
@@ -241,7 +250,7 @@ void Utilities::setGenreTag(QString url, QString genre)
     }
 }
 
-void Utilities::setYearTag(QString url, int year)
+void Utilities::setYearTag(const QString &url, int year)
 {
     if (Utilities::isMusic(url)) {
         TagLib::FileRef file(KUrl(url).path().toLocal8Bit());
@@ -250,7 +259,7 @@ void Utilities::setYearTag(QString url, int year)
     }
 }
 
-void Utilities::setTrackNumberTag(QString url, int trackNumber)
+void Utilities::setTrackNumberTag(const QString &url, int trackNumber)
 {
     if (Utilities::isMusic(url)) {
         TagLib::FileRef file(KUrl(url).path().toLocal8Bit());
@@ -259,34 +268,34 @@ void Utilities::setTrackNumberTag(QString url, int trackNumber)
     }
 }
 
-bool Utilities::isMusic(QString url)
+bool Utilities::isMusic(const QString &url)
 {
     KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true);
     
     return result->is("audio/mpeg") || result->is("application/ogg") || result->is("audio/x-flac") || result->is("audio/x-musepack");
 }
 
-bool Utilities::isAudio(QString url)
+bool Utilities::isAudio(const QString &url)
 {
     KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true);
     return result->is("audio/mpeg") || result->is("audio/mp4") || result->is("audio/ogg") || result->is("audio/vorbis") || result->is("audio/aac") || result->is("audio/aiff") || result->is("audio/basic") || result->is("audio/flac") || result->is("audio/mp2") || result->is("audio/mp3") || result->is("audio/vnd.rn-realaudio") || result->is("audio/wav") || result->is("application/ogg") || result->is("audio/x-flac") || result->is("audio/x-musepack");
 }
 
-bool Utilities::isVideo(QString url)
+bool Utilities::isVideo(const QString &url)
 {
     KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true);
     
     return result->is("video/mp4") || result->is("video/mpeg") || result->is("video/ogg") || result->is("video/quicktime") || result->is("video/msvideo") || result->is("video/x-theora")|| result->is("video/x-theora+ogg") || result->is("video/x-ogm")|| result->is("video/x-ogm+ogg") || result->is("video/divx") || result->is("video/x-msvideo") || result->is("video/x-wmv") || result->is("video/x-flv") || result->is("video/x-flv");
 }
 
-bool Utilities::isM3u(QString url)
+bool Utilities::isM3u(const QString &url)
 {
     KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true);
     
     return result->is("audio/m3u") || result->is("audio/x-mpegurl");
 }
 
-bool Utilities::isPls(QString url)
+bool Utilities::isPls(const QString &url)
 {
     KMimeType::Ptr result = KMimeType::findByUrl(KUrl(url), 0, true);
     
@@ -338,7 +347,7 @@ MediaItem Utilities::mediaItemFromUrl(KUrl url)
         return mediaItem;
     } 
     
-    mediaItem.url = url.url();
+    mediaItem.url = url.prettyUrl();
     mediaItem.title = url.fileName();
     mediaItem.fields["url"] = mediaItem.url;
     mediaItem.fields["title"] = mediaItem.title;
@@ -346,67 +355,19 @@ MediaItem Utilities::mediaItemFromUrl(KUrl url)
     //Determine type of file - nepomuk is primary source
     bool foundInNepomuk = false;
     if (nepomukInited) {
-        Nepomuk::Resource res(mediaItem.url);
-        if (res.exists()) {
-            if (res.hasType(mediaVocabulary.typeAudio()) ||
-                res.hasType(mediaVocabulary.typeAudioMusic()) ||
-                res.hasType(mediaVocabulary.typeAudioStream())) {
-                mediaItem.type = "Audio";
-                if (res.hasType(mediaVocabulary.typeAudioMusic())) {
-                    mediaItem.fields["audioType"] = "Music";
-                } else if (res.hasType(mediaVocabulary.typeAudioStream())) {
-                    mediaItem.fields["audioType"] = "Audio Stream";
-                } else {
-                    mediaItem.fields["audioType"] = "Audio Clip";
-                }
-                foundInNepomuk = true;
-            } 
-            if (res.hasType(mediaVocabulary.typeVideo()) ||
-                res.hasType(mediaVocabulary.typeVideoMovie()) ||
-                res.hasType(mediaVocabulary.typeVideoTVShow())) {
-                mediaItem.type = "Video";
-                if (res.hasType(mediaVocabulary.typeVideoMovie())) {
-                    mediaItem.fields["videoType"] = "Movie";
-                } else if (res.hasType(mediaVocabulary.typeVideoTVShow())) {
-                    mediaItem.fields["videoType"] = "TV Show";
-                } else {
-                    mediaItem.fields["videoType"] = "Video Clip";
-                }
-                foundInNepomuk = true;
-            }
-            if (foundInNepomuk) {
-                if (mediaItem.type == "Video") {
-                    mediaVocabulary.setVocabulary(MediaVocabulary::nmm);
-                }
-                // Get metadata common to all media types
-                QString title = res.property(mediaVocabulary.title()).toString();
-                if (!title.isEmpty()) {
-                    mediaItem.title = title;
-                    mediaItem.fields["title"] = title;
-                }
-                QString description = res.property(mediaVocabulary.description()).toString();
-                if (!description.isEmpty()) {
-                    mediaItem.fields["description"] = description;
-                }
-                int duration = res.property(mediaVocabulary.duration()).toInt();
-                if (duration != 0) {
-                    mediaItem.duration = QTime(0,0,0,0).addSecs(duration).toString("m:ss");
-                    mediaItem.fields["duration"] = duration;
-                }
-                int playCount = res.property(mediaVocabulary.playCount()).toInt();
-                mediaItem.fields["playCount"] = playCount;
-                QDateTime lastPlayed = res.property(mediaVocabulary.lastPlayed()).toDateTime();
-                mediaItem.fields["lastPlayed"] = lastPlayed;
-                mediaItem.fields["rating"] = res.rating();
-                Nepomuk::Resource artworkRes = res.property(mediaVocabulary.artwork()).toResource();
-                if (artworkRes.isValid()) {
-                    mediaItem.fields["artworkUrl"] = artworkRes.resourceUri().toString();
-                }
-            }
+        Nepomuk::Resource res(QUrl(mediaItem.url.toUtf8()));
+        if (res.exists() && (res.hasType(mediaVocabulary.typeAudio()) ||
+            res.hasType(mediaVocabulary.typeAudioMusic()) ||
+            res.hasType(mediaVocabulary.typeAudioStream()) || 
+            res.hasType(mediaVocabulary.typeVideo()) ||
+            res.hasType(mediaVocabulary.typeVideoMovie()) ||
+            res.hasType(mediaVocabulary.typeVideoTVShow())) ) {
+            mediaItem = mediaItemFromNepomuk(res);
+            foundInNepomuk = true;
         }
     }
     
-    if (!foundInNepomuk) {
+    if (!foundInNepomuk || mediaItem.type.isEmpty()) {
         if (isAudio(mediaItem.url)) {
             mediaItem.type = "Audio";
             mediaItem.fields["audioType"] = "Audio Clip";
@@ -444,18 +405,19 @@ MediaItem Utilities::mediaItemFromUrl(KUrl url)
                     KEncodingProber prober(KEncodingProber::Universal);
                     KEncodingProber::ProberState result = prober.feed(tmp.toAscii());
                     if (result != KEncodingProber::NotMe) {
-                        QByteArray encodingname = prober.encoding();
-                        QString track_encoding(encodingname);
-                        if ( ( track_encoding.toLatin1() == "gb18030" ) 
-                            || ( track_encoding.toLatin1() == "big5" )
-                            || ( track_encoding.toLatin1() == "euc-kr" ) 
-                            || ( track_encoding.toLatin1() == "euc-jp" )
-                            || ( track_encoding.toLatin1() == "koi8-r" ) ) {
+                        QByteArray encodingname = prober.encoding().toLower();
+                        if ( prober.confidence() > 0.47
+                            && ( ( encodingname == "gb18030" )
+                            || ( encodingname == "big5" )
+                            || ( encodingname == "euc-kr" )
+                            || ( encodingname == "euc-jp" )
+                            || ( encodingname == "koi8-r" ) ) ) {
                             title = QTextCodec::codecForName(encodingname)->toUnicode(title.toAscii());
                             artist = QTextCodec::codecForName(encodingname)->toUnicode(artist.toAscii());
                             album = QTextCodec::codecForName(encodingname)->toUnicode(album.toAscii());
                             genre = QTextCodec::codecForName(encodingname)->toUnicode(genre.toAscii());
-                        } else if (QTextCodec::codecForLocale()->name().toLower() != "utf-8") {
+                        } else if ((prober.confidence() < 0.3 || encodingname != "utf-8")
+                            && QTextCodec::codecForLocale()->name().toLower() != "utf-8") {
                             title = QTextCodec::codecForLocale()->toUnicode(title.toAscii());
                             artist = QTextCodec::codecForLocale()->toUnicode(artist.toAscii());
                             album = QTextCodec::codecForLocale()->toUnicode(album.toAscii());
@@ -485,112 +447,12 @@ MediaItem Utilities::mediaItemFromUrl(KUrl url)
     } else if (mediaItem.type == "Video") {
         if (mediaItem.fields["videoType"] == "Video Clip") {
             mediaItem.artwork = KIcon("video-x-generic");
-        } else if (mediaItem.fields["videoType"] == "Movie") {
-            mediaItem.artwork = KIcon("tool-animator");
-            Nepomuk::Resource res(mediaItem.url);
-            QString synopsis = res.property(mediaVocabulary.videoSynopsis()).toString();
-            if (!synopsis.isEmpty()) {
-                mediaItem.fields["synopsis"] = synopsis;
-            }
-            QString genre = res.property(mediaVocabulary.videoGenre()).toString();
-            if (!genre.isEmpty()) {
-                mediaItem.fields["genre"] = genre;
-            }
-            QDate releaseDate = res.property(mediaVocabulary.releaseDate()).toDate();
-            if (releaseDate.isValid()) {
-                mediaItem.fields["releaseDate"] = releaseDate;
-            }
-            QString writer = res.property(mediaVocabulary.videoWriter()).toString();
-            if (!writer.isEmpty()) {
-                mediaItem.fields["writer"] = writer;
-            }
-            QString director = res.property(mediaVocabulary.videoDirector()).toString();
-            if (!director.isEmpty()) {
-                mediaItem.fields["director"] = director;
-            }
-            QString assistantDirector = res.property(mediaVocabulary.videoAssistantDirector()).toString();
-            if (!assistantDirector.isEmpty()) {
-                mediaItem.fields["assistantDirector"] = assistantDirector;
-            }
-            QString producer = res.property(mediaVocabulary.videoProducer()).toString();
-            if (!producer.isEmpty()) {
-                mediaItem.fields["producer"] = producer;
-            }
-            QString actor = res.property(mediaVocabulary.videoActor()).toString();
-            if (!actor.isEmpty()) {
-                mediaItem.fields["actor"] = actor;
-            }
-            QString cinematographer = res.property(mediaVocabulary.videoGenre()).toString();
-            if (!cinematographer.isEmpty()) {
-                mediaItem.fields["cinematographer"] = cinematographer;
-            }
-        } else if (mediaItem.fields["videoType"] == "TV Show") {
-            mediaItem.artwork = KIcon("video-television");
-            Nepomuk::Resource res(mediaItem.url);
-            Nepomuk::Resource series = res.property(mediaVocabulary.videoSeries()).toResource();
-            QString seriesName = series.property(mediaVocabulary.title()).toString();
-            if (!seriesName.isEmpty()) {
-                mediaItem.fields["seriesName"] = seriesName;
-                mediaItem.subTitle = seriesName;
-            }
-            int season = res.property(mediaVocabulary.videoSeason()).toInt();
-            if (season !=0 ) {
-                mediaItem.fields["season"] = season;
-                if (!mediaItem.subTitle.isEmpty()) {
-                    mediaItem.subTitle += " - ";
-                }
-                mediaItem.subTitle += QString("Season %1").arg(season);
-            }
-            int episodeNumber = res.property(mediaVocabulary.videoEpisodeNumber()).toInt();
-            if (episodeNumber !=0 ) {
-                mediaItem.fields["episodeNumber"] = episodeNumber;
-                if (!mediaItem.subTitle.isEmpty()) {
-                    mediaItem.subTitle += " - ";
-                }
-                mediaItem.subTitle += QString("Episode %1").arg(episodeNumber);
-            }
-            QString synopsis = res.property(mediaVocabulary.videoSynopsis()).toString();
-            if (!synopsis.isEmpty()) {
-                mediaItem.fields["synopsis"] = synopsis;
-            }
-            QString genre = res.property(mediaVocabulary.videoGenre()).toString();
-            if (!genre.isEmpty()) {
-                mediaItem.fields["genre"] = genre;
-            }
-            QDate releaseDate = res.property(mediaVocabulary.releaseDate()).toDate();
-            if (releaseDate.isValid()) {
-                mediaItem.fields["releaseDate"] = releaseDate;
-            }
-            QString writer = res.property(mediaVocabulary.videoWriter()).toString();
-            if (!writer.isEmpty()) {
-                mediaItem.fields["writer"] = writer;
-            }
-            QString director = res.property(mediaVocabulary.videoDirector()).toString();
-            if (!director.isEmpty()) {
-                mediaItem.fields["director"] = director;
-            }
-            QString assistantDirector = res.property(mediaVocabulary.videoAssistantDirector()).toString();
-            if (!assistantDirector.isEmpty()) {
-                mediaItem.fields["assistantDirector"] = assistantDirector;
-            }
-            QString producer = res.property(mediaVocabulary.videoProducer()).toString();
-            if (!producer.isEmpty()) {
-                mediaItem.fields["producer"] = producer;
-            }
-            QString actor = res.property(mediaVocabulary.videoActor()).toString();
-            if (!actor.isEmpty()) {
-                mediaItem.fields["actor"] = actor;
-            }
-            QString cinematographer = res.property(mediaVocabulary.videoGenre()).toString();
-            if (!cinematographer.isEmpty()) {
-                mediaItem.fields["cinematographer"] = cinematographer;
-            }
         }
     }
     return mediaItem;
 }
 
-QStringList Utilities::mediaListUrls(QList<MediaItem> mediaList)
+QStringList Utilities::mediaListUrls(const QList<MediaItem> &mediaList)
 {
     QStringList urls;
     for (int i = 0; i < mediaList.count(); i++) {
@@ -667,7 +529,7 @@ TagLib::ID3v2::AttachedPictureFrame *Utilities::attachedPictureFrame(TagLib::ID3
     return selectedFrame;
 }
 
-int Utilities::mediaListDuration(QList<MediaItem> mediaList) 
+int Utilities::mediaListDuration(const QList<MediaItem> &mediaList) 
 {
     int duration = 0;
     for (int i = 0; i < mediaList.count(); i++) {
@@ -676,7 +538,7 @@ int Utilities::mediaListDuration(QList<MediaItem> mediaList)
     return duration;
 }
 
-QString Utilities::mediaListDurationText(QList<MediaItem> mediaList) 
+QString Utilities::mediaListDurationText(const QList<MediaItem> &mediaList) 
 {
     int duration = mediaListDuration(mediaList);
     int hours = duration/3600;
@@ -688,7 +550,7 @@ QString Utilities::mediaListDurationText(QList<MediaItem> mediaList)
     return QString("%1:%2:%3").arg(hours).arg(min).arg(sec);
 }
 
-QList<MediaItem> Utilities::mediaItemsDontExist(QList<MediaItem> mediaList)
+QList<MediaItem> Utilities::mediaItemsDontExist(const QList<MediaItem> &mediaList)
 {
     QList<MediaItem> items;
     for (int i = 0; i < mediaList.count(); i++) {
@@ -752,3 +614,234 @@ QString Utilities::videoMimeFilter()
     mimeFilter += supportedList.join(" ");
     return mimeFilter;*/
 }
+
+MediaItem Utilities::mediaItemFromNepomuk(Nepomuk::Resource res)
+{
+    MediaVocabulary mediaVocabulary = MediaVocabulary();
+    QString type;
+    //Check types beyond the current vocabulary to detect basic Audio type indexed by Strigi
+    if (res.hasType(Soprano::Vocabulary::Xesam::Audio()) || 
+        res.hasType(QUrl("http://www.semanticdesktop.org/ontologies/nfo#Audio"))) {
+        type = "Audio Clip";
+    }
+    if (res.hasType(mediaVocabulary.typeAudioMusic())) {
+        type = "Music";
+    }
+    if (res.hasType(mediaVocabulary.typeAudioStream())) {
+        type = "Audio Stream";
+    } 
+    //Check types beyond the current vocabulary to detect basic Video type indexed by Strigi
+    if (res.hasType(QUrl("http://www.semanticdesktop.org/ontologies/nfo#Video")) ||
+        res.hasType(Soprano::Vocabulary::Xesam::Video())) { 
+        type = "Video Clip";
+    } 
+    if (res.hasType(mediaVocabulary.typeVideoMovie())) {
+        type = "Movie";
+    } 
+    if (res.hasType(mediaVocabulary.typeVideoTVShow())) {
+        type = "TV Show";
+    }
+    if (type == "Movie" || type == "TV Show" || type == "Video Clip") {
+        mediaVocabulary.setVocabulary(MediaVocabulary::nmm); //always use nmm vocabulary for video
+    }
+    
+    Soprano::Model * mainModel = Nepomuk::ResourceManager::instance()->mainModel();
+    //QString resourceUri = QString(QUrl::toPercentEncoding(res.resourceUri().toString(), "://"));
+    QString resourceUri = QString(res.resourceUri().toEncoded());
+    
+    MediaQuery query;
+    QStringList bindings;
+    bindings.append(mediaVocabulary.mediaResourceBinding());
+    bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+    bindings.append(mediaVocabulary.titleBinding());
+    bindings.append(mediaVocabulary.descriptionBinding());
+    bindings.append(mediaVocabulary.durationBinding());
+    bindings.append(mediaVocabulary.genreBinding());
+    bindings.append(mediaVocabulary.releaseDateBinding());
+    bindings.append(mediaVocabulary.artworkBinding());
+    bindings.append(mediaVocabulary.ratingBinding());
+    bindings.append(mediaVocabulary.playCountBinding());
+    bindings.append(mediaVocabulary.lastPlayedBinding());
+    
+    bindings.append(mediaVocabulary.musicArtistNameBinding());
+    bindings.append(mediaVocabulary.musicAlbumTitleBinding());
+    bindings.append(mediaVocabulary.musicTrackNumberBinding());
+    bindings.append(mediaVocabulary.musicAlbumYearBinding());
+    
+    bindings.append(mediaVocabulary.videoSynopsisBinding());
+    bindings.append(mediaVocabulary.videoAudienceRatingBinding());
+    bindings.append(mediaVocabulary.videoSeriesTitleBinding());
+    bindings.append(mediaVocabulary.videoSeasonBinding());
+    bindings.append(mediaVocabulary.videoEpisodeNumberBinding());
+    bindings.append(mediaVocabulary.videoWriterBinding());
+    bindings.append(mediaVocabulary.videoDirectorBinding());
+    bindings.append(mediaVocabulary.videoAssistantDirectorBinding());
+    bindings.append(mediaVocabulary.videoProducerBinding());
+    bindings.append(mediaVocabulary.videoActorBinding());
+    bindings.append(mediaVocabulary.videoCinematographerBinding());
+    query.select(bindings, MediaQuery::Distinct);
+    
+    query.startWhere();
+    query.addCondition(mediaVocabulary.hasResource(resourceUri));
+    query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasPlayCount(MediaQuery::Optional));
+    query.addCondition(mediaVocabulary.hasLastPlayed(MediaQuery::Optional));
+    if (type == "Music") {
+        query.addCondition(mediaVocabulary.hasMusicArtistName(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasMusicAlbumTitle(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasMusicTrackNumber(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasMusicAlbumYear(MediaQuery::Optional));
+    }
+    if (type == "Movie" || type == "TV Show") {
+        query.addCondition(mediaVocabulary.hasVideoSynopsis(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasVideoAudienceRating(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasVideoAssistantDirector(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Optional));
+        query.addCondition(mediaVocabulary.hasVideoCinematographer(MediaQuery::Optional));
+        
+        if (type == "TV Show") {
+            query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional));
+        }
+    }
+    query.endWhere();
+    
+    //kDebug() << query.query();
+    
+    Soprano::QueryResultIterator it = query.executeSelect(mainModel);
+    
+    MediaItem mediaItem;
+    while (it.next()) {
+        mediaItem = mediaItemFromIterator(it, type);
+        break;
+    }
+    
+    return mediaItem;
+}
+
+MediaItem Utilities::mediaItemFromIterator(Soprano::QueryResultIterator &it, const QString &type)
+{
+    MediaItem mediaItem;
+    QUrl url = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().isEmpty() ? 
+    it.binding(MediaVocabulary::mediaResourceBinding()).uri() :
+    it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri();
+    mediaItem.url = url.toString();
+    mediaItem.fields["url"] = mediaItem.url;
+    mediaItem.title = it.binding(MediaVocabulary::titleBinding()).literal().toString();
+    mediaItem.fields["title"] = it.binding(MediaVocabulary::titleBinding()).literal().toString();
+    if (mediaItem.title.isEmpty()) {
+        if (KUrl(mediaItem.url).isLocalFile()) {
+            mediaItem.title = KUrl(mediaItem.url).fileName();
+            mediaItem.fields["title"] = KUrl(mediaItem.url).fileName();
+        } else {
+            mediaItem.title = mediaItem.url;
+            mediaItem.fields["title"] = mediaItem.url;
+        }
+    }
+    mediaItem.fields["description"] = it.binding(MediaVocabulary::descriptionBinding()).literal().toString();
+    int duration = it.binding(MediaVocabulary::durationBinding()).literal().toInt();
+    if (duration != 0) {
+        mediaItem.duration = QTime(0,0,0,0).addSecs(duration).toString("m:ss");
+        mediaItem.fields["duration"] = it.binding(MediaVocabulary::durationBinding()).literal().toInt();
+    }
+    mediaItem.fields["genre"] = it.binding(MediaVocabulary::genreBinding()).literal().toString();
+    mediaItem.fields["rating"] = it.binding(MediaVocabulary::ratingBinding()).literal().toInt();
+    mediaItem.fields["playCount"] = it.binding(MediaVocabulary::playCountBinding()).literal().toInt();
+    mediaItem.fields["lastPlayed"] = it.binding(MediaVocabulary::lastPlayedBinding()).literal().toDateTime();
+    mediaItem.fields["artworkUrl"] = it.binding(MediaVocabulary::artworkBinding()).uri().toString();
+    if (type == "Audio Clip" || type == "Audio Stream" || type == "Music") {
+        mediaItem.type = "Audio";
+        mediaItem.fields["audioType"] = type;
+        mediaItem.artwork = KIcon("audio-x-wav");
+        if (type == "Audio Stream") {
+            mediaItem.artwork = KIcon("x-media-podcast");
+        } else if (type == "Music") {
+            mediaItem.artwork = KIcon("audio-mpeg");
+            QString artist = it.binding(MediaVocabulary::musicArtistNameBinding()).literal().toString();
+            if (!artist.isEmpty()) {
+                mediaItem.fields["artist"] = artist;
+                mediaItem.subTitle = artist;
+            }
+            
+            QString album = it.binding(MediaVocabulary::musicAlbumTitleBinding()).literal().toString();
+            if (!album.isEmpty()) {
+                mediaItem.fields["album"] = album;
+                if (!artist.isEmpty()) {
+                    mediaItem.subTitle += QString(" - %1").arg(album);
+                } else {
+                    mediaItem.subTitle = album;
+                }
+            }
+            if (it.binding(MediaVocabulary::musicAlbumYearBinding()).isValid()) {
+                QDate yearDate = it.binding(MediaVocabulary::musicAlbumYearBinding()).literal().toDate();
+                if (yearDate.isValid()) {
+                    mediaItem.fields["year"] = yearDate.year();
+                }
+            }
+            
+            int trackNumber = it.binding(MediaVocabulary::musicTrackNumberBinding()).literal().toInt();
+            if (trackNumber != 0) {
+                mediaItem.fields["trackNumber"] = trackNumber;
+            }
+        }
+    } else if (type == "Video Clip" || type == "Movie" || type == "TV Show") {
+        mediaItem.type = "Video";
+        mediaItem.fields["videoType"] = type;
+        mediaItem.artwork = KIcon("video-x-generic");
+        if (type == "Movie" || type == "TV Show") {
+            mediaItem.artwork = KIcon("tool-animator");
+            mediaItem.fields["synopsis"] = it.binding(MediaVocabulary::videoSynopsisBinding()).literal().toString();
+            if (it.binding(MediaVocabulary::releaseDateBinding()).isValid()) {
+                QDate releaseDate = it.binding(MediaVocabulary::releaseDateBinding()).literal().toDate();
+                if (releaseDate.isValid()) {
+                    mediaItem.fields["releaseDate"] = releaseDate;
+                    mediaItem.fields["year"] = releaseDate.year();
+                }
+            }
+            mediaItem.fields["writer"] = it.binding(MediaVocabulary::videoWriterBinding()).literal().toString();
+            mediaItem.fields["director"] = it.binding(MediaVocabulary::videoDirectorBinding()).literal().toString();
+            mediaItem.fields["assistantDirector"] = it.binding(MediaVocabulary::videoAssistantDirectorBinding()).literal().toString();
+            mediaItem.fields["producer"] = it.binding(MediaVocabulary::videoProducerBinding()).literal().toString();
+            mediaItem.fields["actor"] = it.binding(MediaVocabulary::videoActorBinding()).literal().toString();
+            mediaItem.fields["cinematographer"] = it.binding(MediaVocabulary::videoCinematographerBinding()).literal().toString();
+            if (type == "TV Show") {
+                mediaItem.artwork = KIcon("video-television");
+                QString seriesName = it.binding(MediaVocabulary::videoSeriesTitleBinding()).literal().toString();
+                if (!seriesName.isEmpty()) {
+                    mediaItem.fields["seriesName"] = seriesName;
+                    mediaItem.subTitle = seriesName;
+                }
+                
+                int season = it.binding(MediaVocabulary::videoSeasonBinding()).literal().toInt();
+                if (season !=0 ) {
+                    mediaItem.fields["season"] = season;
+                    if (!mediaItem.subTitle.isEmpty()) {
+                        mediaItem.subTitle += " - ";
+                    }
+                    mediaItem.subTitle += QString("Season %1").arg(season);
+                }
+                
+                int episodeNumber = it.binding(MediaVocabulary::videoEpisodeNumberBinding()).literal().toInt();
+                if (episodeNumber != 0) {
+                    mediaItem.fields["episodeNumber"] = episodeNumber;
+                    if (!mediaItem.subTitle.isEmpty()) {
+                        mediaItem.subTitle += " - ";
+                    }
+                    mediaItem.subTitle += QString("Episode %1").arg(episodeNumber);
+                }
+            }
+        }
+    }
+    
+    return mediaItem;
+}
diff --git a/src/platform/utilities.h b/src/platform/utilities.h
index 05ab4fd..a52fb71 100644
--- a/src/platform/utilities.h
+++ b/src/platform/utilities.h
@@ -24,6 +24,8 @@
 #include <QPixmap>
 #include <taglib/id3v2tag.h>
 #include <taglib/attachedpictureframe.h>
+#include <Soprano/QueryResultIterator>
+#include <Nepomuk/Resource>
 
 
 class MediaItem;
@@ -33,39 +35,40 @@ class MediaItem;
  * used throughout bangarang.
  */
 namespace Utilities {
-    QPixmap getArtworkFromTag(QString url, QSize size = QSize(128,128));
-    QPixmap getArtworkFromMediaItem(MediaItem mediaItem);
-    QString getArtistFromTag(QString url);
-    QString getAlbumFromTag(QString url);
-    QString getTitleFromTag(QString url);
-    QString getGenreFromTag(QString genre);
-    int getYearFromTag(QString url);
-    int getDurationFromTag(QString url);
-    int getTrackNumberFromTag(QString url);
-    bool saveArtworkToTag(QString url, const QPixmap *pixmap);
-    bool saveArtworkToTag(QString url, QString imageUrl);
-    void setArtistTag(QString url, QString artist);
-    void setAlbumTag(QString url, QString album);
-    void setTitleTag(QString url, QString title);
-    void setGenreTag(QString url, QString genre);
-    void setYearTag(QString url, int year);
-    void setDurationTag(QString url, int duration);
-    void setTrackNumberTag(QString url, int trackNumber);
-    bool isMusic(QString url);
-    bool isAudio(QString url);
-    bool isVideo(QString url);
-    bool isM3u(QString url);
-    bool isPls(QString url);
+    QPixmap getArtworkFromTag(const QString &url, QSize size = QSize(128,128));
+    QPixmap getArtworkFromMediaItem(const MediaItem &mediaItem);
+    QString getArtistFromTag(const QString &url);
+    QString getAlbumFromTag(const QString &url);
+    QString getTitleFromTag(const QString &url);
+    QString getGenreFromTag(const QString &genre);
+    int getYearFromTag(const QString &url);
+    int getDurationFromTag(const QString &url);
+    int getTrackNumberFromTag(const QString &url);
+    bool saveArtworkToTag(const QString &url, const QPixmap *pixmap);
+    bool saveArtworkToTag(const QString &url, const QString &imageUrl);
+    void setArtistTag(const QString &url, const QString &artist);
+    void setAlbumTag(const QString &url, const QString &album);
+    void setTitleTag(const QString &url, const QString &title);
+    void setGenreTag(const QString &url, const QString &genre);
+    void setYearTag(const QString &url, int year);
+    void setDurationTag(const QString &url, int duration);
+    void setTrackNumberTag(const QString &url, int trackNumber);
+    bool isMusic(const QString &url);
+    bool isAudio(const QString &url);
+    bool isVideo(const QString &url);
+    bool isM3u(const QString &url);
+    bool isPls(const QString &url);
     QPixmap reflection(QPixmap &pixmap);
-    void shadowBlur(QImage &image, int radius, const QColor &color);
     MediaItem mediaItemFromUrl(KUrl url);
-    QStringList mediaListUrls(QList<MediaItem> mediaList);
+    QStringList mediaListUrls(const QList<MediaItem> &mediaList);
     KIcon turnIconOff(KIcon icon, QSize size);
     TagLib::ID3v2::AttachedPictureFrame *attachedPictureFrame(TagLib::ID3v2::Tag *id3Tag, bool create = false);
-    int mediaListDuration(QList<MediaItem> mediaList);
-    QString mediaListDurationText(QList<MediaItem> mediaList);
-    QList<MediaItem> mediaItemsDontExist(QList<MediaItem> mediaList);
+    int mediaListDuration(const QList<MediaItem> &mediaList);
+    QString mediaListDurationText(const QList<MediaItem> &mediaList);
+    QList<MediaItem> mediaItemsDontExist(const QList<MediaItem> &mediaList);
     QString audioMimeFilter();
     QString videoMimeFilter();
+    MediaItem mediaItemFromNepomuk(Nepomuk::Resource res);
+    MediaItem mediaItemFromIterator(Soprano::QueryResultIterator &it, const QString &type);
 }
 #endif //UTILITIES_H    
\ No newline at end of file
diff --git a/src/platform/videolistengine.cpp b/src/platform/videolistengine.cpp
index 2bb1fd8..0886d69 100644
--- a/src/platform/videolistengine.cpp
+++ b/src/platform/videolistengine.cpp
@@ -23,16 +23,10 @@
 #include "utilities.h"
 
 #include <Soprano/QueryResultIterator>
-#include <Soprano/Vocabulary/Xesam>
-#include <Soprano/Vocabulary/RDF>
-#include <Soprano/Vocabulary/XMLSchema>
-#include <Soprano/Vocabulary/NAO>
-#include <QApplication>
 #include <KIcon>
 #include <KUrl>
 #include <KLocale>
 #include <KDebug>
-#include <taglib/fileref.h>
 #include <QTime>
 #include <nepomuk/variant.h>
 
@@ -45,104 +39,6 @@ VideoListEngine::~VideoListEngine()
 {
 }
 
-MediaItem VideoListEngine::createMediaItem(Soprano::QueryResultIterator& it) {
-    MediaVocabulary mediaVocabulary;
-    mediaVocabulary.setVocabulary(MediaVocabulary::nmm);
-    mediaVocabulary.setVideoVocabulary(MediaVocabulary::nmm);
-    
-    MediaItem mediaItem;
-    QUrl url = it.binding("url").uri().isEmpty() ? 
-                    it.binding("r").uri() :
-                    it.binding("url").uri();
-    mediaItem.url = url.toString();
-    
-    mediaItem.fields["videoType"] = "Video Clip";
-    mediaItem.artwork = KIcon("video-x-generic");
-    
-    Nepomuk::Resource res(url.toString());
-    if (res.exists()) {
-        if (res.hasType(mediaVocabulary.typeVideoMovie())) {
-            mediaItem.fields["videoType"] = "Movie";
-            mediaItem.artwork = KIcon("tool-animator");
-        }
-        if (res.hasType(mediaVocabulary.typeVideoTVShow())) {
-            mediaItem.fields["videoType"] = "TV Show";
-            mediaItem.artwork = KIcon("video-television");
-        }
-    }
-        
-    mediaItem.title = it.binding("title").literal().toString();
-    if (mediaItem.title.isEmpty()) {
-        if (KUrl(mediaItem.url).isLocalFile()) {
-            mediaItem.title = KUrl(mediaItem.url).fileName();
-        } else {
-            mediaItem.title = mediaItem.url;
-        }
-    }
-    int duration = it.binding("duration").literal().toInt();
-    if (duration != 0) {
-        mediaItem.duration = QTime(0,0,0,0).addSecs(duration).toString("m:ss");
-    }
-
-    QString seriesName = it.binding("seriesName").literal().toString();
-    if (!seriesName.isEmpty()) {
-        mediaItem.fields["seriesName"] = seriesName;
-        mediaItem.subTitle = seriesName;
-    }
-
-    int season = it.binding("season").literal().toInt();
-    if (season !=0 ) {
-        mediaItem.fields["season"] = season;
-        if (!mediaItem.subTitle.isEmpty()) {
-            mediaItem.subTitle += " - ";
-        }
-        mediaItem.subTitle += QString("Season %1").arg(season);
-    }
-
-    int episodeNumber = it.binding("episodeNumber").literal().toInt();
-    if (episodeNumber != 0) {
-        mediaItem.fields["episodeNumber"] = episodeNumber;
-        if (!mediaItem.subTitle.isEmpty()) {
-        	mediaItem.subTitle += " - ";
-        }
-        mediaItem.subTitle += QString("Episode %1").arg(episodeNumber);
-    }
-
-    if (it.binding("created").isValid()) {
-        QDate created = it.binding("created").literal().toDate();
-        if (created.isValid()) {
-            mediaItem.fields["year"] = created.year();
-        }
-    }
-    if (it.binding("releaseDate").isValid()) {
-        QDate releaseDate = it.binding("releaseDate").literal().toDate();
-        if (releaseDate.isValid()) {
-            mediaItem.fields["releaseDate"] = releaseDate;
-            mediaItem.fields["year"] = releaseDate.year();
-        }
-    }
-    
-    mediaItem.type = "Video";
-    mediaItem.nowPlaying = false;
-    mediaItem.fields["url"] = mediaItem.url;
-    mediaItem.fields["title"] = it.binding("title").literal().toString();
-    mediaItem.fields["duration"] = it.binding("duration").literal().toInt();
-    mediaItem.fields["description"] = it.binding("description").literal().toString();
-    mediaItem.fields["synopsis"] = it.binding("synopsis").literal().toString();
-    mediaItem.fields["genre"] = it.binding("genre").literal().toString();
-    mediaItem.fields["artworkUrl"] = it.binding("artwork").uri().toString();
-    mediaItem.fields["rating"] = it.binding("rating").literal().toInt();
-    mediaItem.fields["writer"] = it.binding("writer").literal().toString();
-    mediaItem.fields["director"] = it.binding("director").literal().toString();
-    mediaItem.fields["assistantDirector"] = it.binding("assistantDirector").literal().toString();
-    mediaItem.fields["producer"] = it.binding("producer").literal().toString();
-    mediaItem.fields["actor"] = it.binding("actor").literal().toString();
-    mediaItem.fields["cinematographer"] = it.binding("cinematographer").literal().toString();
-    
-    return mediaItem;
-}
-
-
 void VideoListEngine::run()
 {
     
@@ -155,6 +51,8 @@ void VideoListEngine::run()
     QList<MediaItem> mediaList;
     
     MediaVocabulary mediaVocabulary = MediaVocabulary();
+    mediaVocabulary.setVocabulary(MediaVocabulary::nmm);
+    mediaVocabulary.setVideoVocabulary(MediaVocabulary::nmm);
     
     QString engineArg = m_mediaListProperties.engineArg();
     //Parse filter
@@ -186,23 +84,32 @@ void VideoListEngine::run()
     
     if (m_nepomukInited) {
         if (engineArg.toLower() == "clips") {
-            VideoQuery videoQuery = VideoQuery(true);
-            videoQuery.selectVideoResource();
-            videoQuery.selectTitle(true);
-            videoQuery.selectDuration(true);
-            videoQuery.selectSeason(true);
-            videoQuery.selectDescription(true);
-            videoQuery.orderBy("?title");
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            //bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeVideo(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = videoQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
-
-                mediaItem.artwork = KIcon("video-x-generic");
-                mediaItem.fields["videoType"] = "Video Clip";
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Video Clip"));
                 mediaList.append(mediaItem);
             }
             
@@ -210,19 +117,29 @@ void VideoListEngine::run()
             m_mediaListProperties.summary = i18np("1 clip", "%1 clips", mediaList.count());
             m_mediaListProperties.type = QString("Sources");
         } else if (engineArg.toLower() == "tvshows") {
-            VideoQuery query = VideoQuery(true);
-            query.isTVShow();
-            query.selectSeriesName();
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required));
             if (!genre.isEmpty()) {
-                query.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
-            query.orderBy("?seriesName");
+            query.endWhere();
+            QStringList orderByBindings = bindings;
+            query.orderBy(orderByBindings);
             
             Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
 
             //Build media list from results
             while( it.next() ) {
-                QString seriesName = it.binding("seriesName").literal().toString();
+                QString seriesName = it.binding(mediaVocabulary.videoSeriesTitleBinding()).literal().toString();
                 if (!seriesName.isEmpty()) {
                     MediaItem mediaItem;
                     mediaItem.url = QString("video://seasons?||%1||%2").arg(genre).arg(seriesName);
@@ -241,11 +158,16 @@ void VideoListEngine::run()
              * specified.
              */
             if (genre.isEmpty()) {
-                VideoQuery noSeriesQuery = VideoQuery();
-                noSeriesQuery.isTVShow();
-                noSeriesQuery.hasNoSeriesName();
-
-                if(noSeriesQuery.executeAsk(m_mainModel)) {
+                MediaQuery query;
+                query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required));
+                query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
+                query.startFilter();
+                query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), QString(), MediaQuery::NotBound);
+                query.addFilterOr();
+                query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), "^$", MediaQuery::Contains);
+                query.endFilter();
+                
+                if(query.executeAsk(m_mainModel)) {
                     MediaItem mediaItem;
                     mediaItem.url = QString("video://episodes?||||~");
                     mediaItem.title = i18n("Uncategorized TV Shows");
@@ -260,23 +182,43 @@ void VideoListEngine::run()
             m_mediaListProperties.summary = i18np("1 show", "%1 shows", mediaList.count());
             m_mediaListProperties.type = QString("Categories");
         } else if (engineArg.toLower() == "seasons") {
-            VideoQuery videoQuery = VideoQuery(true);
-            videoQuery.isTVShow();
-            videoQuery.selectSeason();
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.videoSeasonBinding());
+            bindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Required));
             if (!genre.isEmpty()) {
-                if (genre == "~") genre = QString();
-                videoQuery.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
             if (!seriesName.isEmpty()) {
                 if (seriesName != "~") {
-                    videoQuery.hasSeriesName(seriesName);
+                    query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required,
+                                                            seriesName,
+                                                            MediaQuery::Equal));;
                 } else {
-                    videoQuery.hasNoSeriesName();
+                    query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
+                    query.startFilter();
+                    query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), QString(), MediaQuery::NotBound);
+                    query.addFilterOr();
+                    query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), "^$", MediaQuery::Contains);
+                    query.endFilter();
                 }
+            } else {
+                query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
             }
-            videoQuery.orderBy("?season");
-
-            Soprano::QueryResultIterator it = videoQuery.executeSelect(m_mainModel);
+            query.endWhere();
+            QStringList orderByBindings = bindings;
+            query.orderBy(orderByBindings);
+            
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
+            
 
             //Build media list from results
             while( it.next() ) {
@@ -295,11 +237,16 @@ void VideoListEngine::run()
             /* Check, whether there are TV shows, which have no series entered.
              * If so, add an entry which allows access to those files.
              */
-            VideoQuery noSeasonsQuery = VideoQuery();
-            noSeasonsQuery.isTVShow();
-            noSeasonsQuery.hasSeriesName(seriesName);
-            noSeasonsQuery.hasNoSeason();
-
+            MediaQuery noSeasonsQuery;
+            noSeasonsQuery.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required));
+            noSeasonsQuery.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required,
+                                                                   seriesName,
+                                                                   MediaQuery::Equal));
+            noSeasonsQuery.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional));
+            noSeasonsQuery.startFilter();
+            noSeasonsQuery.addFilterConstraint(mediaVocabulary.videoSeasonBinding(), QString(), MediaQuery::NotBound);
+            noSeasonsQuery.endFilter();
+            
             if(noSeasonsQuery.executeAsk(m_mainModel)) {
                 MediaItem mediaItem;
                 mediaItem.url = QString("video://episodes?||%1||%2||-1").arg(genre).arg(seriesName);
@@ -318,53 +265,92 @@ void VideoListEngine::run()
         } else if (engineArg.toLower() == "episodes") {
             bool hasSeason = false;
             
-            VideoQuery videoQuery = VideoQuery(true);
-            videoQuery.selectTVShowResource();
-            videoQuery.selectTitle();
-            videoQuery.selectSeriesName(true);
-            videoQuery.selectSeason(true);
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            bindings.append(mediaVocabulary.videoSeasonBinding());
+            bindings.append(mediaVocabulary.videoEpisodeNumberBinding());
+            bindings.append(mediaVocabulary.durationBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.videoSynopsisBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.releaseDateBinding());
+            bindings.append(mediaVocabulary.genreBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            bindings.append(mediaVocabulary.videoWriterBinding());
+            bindings.append(mediaVocabulary.videoDirectorBinding());
+            bindings.append(mediaVocabulary.videoAssistantDirectorBinding());
+            bindings.append(mediaVocabulary.videoProducerBinding());
+            bindings.append(mediaVocabulary.videoActorBinding());
+            bindings.append(mediaVocabulary.videoCinematographerBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeVideoTVShow(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoSynopsis(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoAssistantDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoCinematographer(MediaQuery::Optional));
             if (!genre.isEmpty()) {
-                if (genre == "~") genre = QString();
-                videoQuery.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
             if (!seriesName.isEmpty()) {
                 if (seriesName != "~") {
-                    videoQuery.hasSeriesName(seriesName);
+                    query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required,
+                                                                           seriesName,
+                                                                           MediaQuery::Equal));
                 } else {
-                    videoQuery.hasNoSeriesName();
+                    query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
+                    query.startFilter();
+                    query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), QString(), MediaQuery::NotBound);
+                    query.addFilterOr();
+                    query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), "^$", MediaQuery::Contains);
+                    query.endFilter();
                 }
+            } else {
+                query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
             }
             if (season > 0) {
-                videoQuery.hasSeason(season);
+                query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Required,
+                                                                       season,
+                                                                       MediaQuery::Equal));
                 hasSeason = true;
             } else if (season == -1) {
-                videoQuery.hasNoSeason();
+                query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional));
+                query.startFilter();
+                query.addFilterConstraint(mediaVocabulary.videoSeasonBinding(), QString(), MediaQuery::NotBound);
+                query.endFilter();
+            } else {
+                query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional));
             }
-            videoQuery.selectDuration(true);
-            videoQuery.selectDescription(true);
-            videoQuery.selectSynopsis(true);
-            videoQuery.selectRating(true);
-            videoQuery.selectEpisode(true);
-            videoQuery.selectCreated(true);
-            videoQuery.selectReleaseDate(true);
-            videoQuery.selectGenre(true);
-            videoQuery.selectArtwork(true);
-            videoQuery.selectWriter(true);
-            videoQuery.selectDirector(true);
-            videoQuery.selectAssistantDirector(true);
-            videoQuery.selectProducer(true);
-            videoQuery.selectActor(true);
-            videoQuery.selectCinematographer(true);
-            videoQuery.orderBy("?seriesName ?season ?episodeNumber");
-
-            //Execute Query
-            Soprano::QueryResultIterator it = videoQuery.executeSelect(m_mainModel);
-
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            orderByBindings.append(mediaVocabulary.videoSeasonBinding());
+            orderByBindings.append(mediaVocabulary.videoEpisodeNumberBinding());
+            query.orderBy(orderByBindings);
+            
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
+            
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
-                mediaItem.artwork = KIcon("video-television");
-                mediaItem.fields["videoType"] = "TV Show";
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("TV Show"));
                 mediaList.append(mediaItem);
             }
             
@@ -379,36 +365,61 @@ void VideoListEngine::run()
             m_mediaListProperties.type = QString("Sources");
             
         } else if (engineArg.toLower() == "movies") {
-            VideoQuery videoQuery = VideoQuery(false);
-            videoQuery.selectMovieResource();
-            videoQuery.selectTitle();
-            videoQuery.selectDuration(true);
-            videoQuery.selectDescription(true);
-            videoQuery.selectSynopsis(true);
-            videoQuery.selectRating(true);
-            videoQuery.selectCreated(true);
-            videoQuery.selectReleaseDate(true);
-            videoQuery.selectGenre(true);
-            videoQuery.selectArtwork(true);
-            videoQuery.selectWriter(true);
-            videoQuery.selectDirector(true);
-            videoQuery.selectAssistantDirector(true);
-            videoQuery.selectProducer(true);
-            videoQuery.selectActor(true);
-            videoQuery.selectCinematographer(true);
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.durationBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.videoSynopsisBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.releaseDateBinding());
+            bindings.append(mediaVocabulary.videoAudienceRatingBinding());
+            bindings.append(mediaVocabulary.genreBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            bindings.append(mediaVocabulary.videoWriterBinding());
+            bindings.append(mediaVocabulary.videoDirectorBinding());
+            bindings.append(mediaVocabulary.videoAssistantDirectorBinding());
+            bindings.append(mediaVocabulary.videoProducerBinding());
+            bindings.append(mediaVocabulary.videoActorBinding());
+            bindings.append(mediaVocabulary.videoCinematographerBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeVideoMovie(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoSynopsis(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoAudienceRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoAssistantDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoCinematographer(MediaQuery::Optional));
             if (!genre.isEmpty()) {
-                videoQuery.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
-            videoQuery.orderBy("?title ?created");
-
-            //Execute Query
-            Soprano::QueryResultIterator it = videoQuery.executeSelect(m_mainModel);
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            orderByBindings.append(mediaVocabulary.releaseDateBinding());
+            query.orderBy(orderByBindings);
+            
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
+            
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
-                mediaItem.artwork = KIcon("tool-animator");
-                mediaItem.fields["videoType"] = "Movie";
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, QString("Movie"));
                 mediaList.append(mediaItem);
             }
             
@@ -420,16 +431,24 @@ void VideoListEngine::run()
             m_mediaListProperties.type = QString("Sources");
             
         } else if (engineArg.toLower() == "genres") {
-            VideoQuery videoQuery = VideoQuery(true);
-            videoQuery.isAnyVideoType();
-            videoQuery.selectGenre();
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.genreBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required));
             if (!genre.isEmpty()) {
-                videoQuery.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required));
             }
-            videoQuery.orderBy("?genre");
+            query.endWhere();
+            QStringList orderByBindings = bindings;
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = videoQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
@@ -450,110 +469,210 @@ void VideoListEngine::run()
             m_mediaListProperties.type = QString("Categories");
             
         } else if (engineArg.toLower() == "search") {
-            VideoQuery videoQuery = VideoQuery(true);
-            videoQuery.selectAllVideoResources();
-            videoQuery.selectTitle(true);
-            videoQuery.selectDescription(true);
-            videoQuery.selectRating(true);
-            videoQuery.selectDuration(true);
-            videoQuery.selectSeriesName(true);
-            videoQuery.selectSeason(true);
-            videoQuery.selectSynopsis(true);
-            videoQuery.selectRating(true);
-            videoQuery.selectEpisode(true);
-            videoQuery.selectCreated(true);
-            videoQuery.selectReleaseDate(true);
-            videoQuery.selectGenre(true);
-            videoQuery.selectArtwork(true);
-            videoQuery.selectWriter(true);
-            videoQuery.selectDirector(true);
-            videoQuery.selectAssistantDirector(true);
-            videoQuery.selectProducer(true);
-            videoQuery.selectActor(true);
-            videoQuery.selectCinematographer(true);
-            videoQuery.searchString(searchTerm);
-            videoQuery.orderBy("?title ?seriesName ?season ?episodeNumber");
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            bindings.append(mediaVocabulary.videoSeasonBinding());
+            bindings.append(mediaVocabulary.videoEpisodeNumberBinding());
+            bindings.append(mediaVocabulary.durationBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.videoSynopsisBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.releaseDateBinding());
+            bindings.append(mediaVocabulary.videoAudienceRatingBinding());
+            bindings.append(mediaVocabulary.genreBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            bindings.append(mediaVocabulary.videoWriterBinding());
+            bindings.append(mediaVocabulary.videoDirectorBinding());
+            bindings.append(mediaVocabulary.videoAssistantDirectorBinding());
+            bindings.append(mediaVocabulary.videoProducerBinding());
+            bindings.append(mediaVocabulary.videoActorBinding());
+            bindings.append(mediaVocabulary.videoCinematographerBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoSynopsis(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoAudienceRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoAssistantDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoCinematographer(MediaQuery::Optional));
+            query.startFilter();
+            query.addFilterConstraint(mediaVocabulary.titleBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.descriptionBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoSynopsisBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoWriterBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoDirectorBinding(), searchTerm,  MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoAssistantDirectorBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoProducerBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoActorBinding(), searchTerm, MediaQuery::Contains);
+            query.addFilterOr();
+            query.addFilterConstraint(mediaVocabulary.videoCinematographerBinding(), searchTerm, MediaQuery::Contains);
+            query.endFilter();
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            orderByBindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            orderByBindings.append(mediaVocabulary.videoSeasonBinding());
+            orderByBindings.append(mediaVocabulary.videoEpisodeNumberBinding());
+            query.orderBy(orderByBindings);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = videoQuery.executeSelect(m_mainModel);
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                QUrl url = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().isEmpty() ? 
+                it.binding(MediaVocabulary::mediaResourceBinding()).uri() :
+                it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri();
+                Nepomuk::Resource res(url);
+                QString type = "Video Clip";
+                if (res.exists()) {
+                    if (res.hasType(mediaVocabulary.typeVideoMovie())) {
+                        type = "Movie";
+                    }
+                    if (res.hasType(mediaVocabulary.typeVideoTVShow())) {
+                        type = "TV Show";
+                    }
+                }
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, type);
+                
                 mediaList.append(mediaItem);
             }
             
-            /*if (mediaList.isEmpty()) {
-                MediaItem noResults;
-                noResults.url = "video://";
-                noResults.title = "No results";
-                noResults.type = "Message";
-                mediaList << noResults;
-            }*/
-            
             m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count());
             m_mediaListProperties.type = QString("Sources");
             
         } else if (engineArg.toLower() == "sources") {
-            VideoQuery videoQuery = VideoQuery(true);
-            videoQuery.selectAllVideoResources();
-            videoQuery.selectTitle(true);
-            videoQuery.selectDescription(true);
-            videoQuery.selectRating(true);
-            videoQuery.selectDuration(true);
-            videoQuery.selectSynopsis(true);
-            videoQuery.selectRating(true);
-            videoQuery.selectSeriesName(true);
-            videoQuery.selectSeason(true);
-            videoQuery.selectEpisode(true);
-            videoQuery.selectCreated(true);
-            videoQuery.selectReleaseDate(true);
-            videoQuery.selectGenre(true);
-            videoQuery.selectArtwork(true);
-            videoQuery.selectWriter(true);
-            videoQuery.selectDirector(true);
-            videoQuery.selectAssistantDirector(true);
-            videoQuery.selectProducer(true);
-            videoQuery.selectActor(true);
-            videoQuery.selectCinematographer(true);
-            if (!searchTerm.isEmpty()) {
-                videoQuery.searchString(searchTerm);
-            }
+            MediaQuery query;
+            QStringList bindings;
+            bindings.append(mediaVocabulary.mediaResourceBinding());
+            bindings.append(mediaVocabulary.mediaResourceUrlBinding());
+            bindings.append(mediaVocabulary.titleBinding());
+            bindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            bindings.append(mediaVocabulary.videoSeasonBinding());
+            bindings.append(mediaVocabulary.videoEpisodeNumberBinding());
+            bindings.append(mediaVocabulary.durationBinding());
+            bindings.append(mediaVocabulary.descriptionBinding());
+            bindings.append(mediaVocabulary.videoSynopsisBinding());
+            bindings.append(mediaVocabulary.ratingBinding());
+            bindings.append(mediaVocabulary.releaseDateBinding());
+            bindings.append(mediaVocabulary.videoAudienceRatingBinding());
+            bindings.append(mediaVocabulary.genreBinding());
+            bindings.append(mediaVocabulary.artworkBinding());
+            bindings.append(mediaVocabulary.videoWriterBinding());
+            bindings.append(mediaVocabulary.videoDirectorBinding());
+            bindings.append(mediaVocabulary.videoAssistantDirectorBinding());
+            bindings.append(mediaVocabulary.videoProducerBinding());
+            bindings.append(mediaVocabulary.videoActorBinding());
+            bindings.append(mediaVocabulary.videoCinematographerBinding());
+            query.select(bindings, MediaQuery::Distinct);
+            query.startWhere();
+            query.addCondition(mediaVocabulary.hasTypeAnyVideo(MediaQuery::Required));
+            query.addCondition(mediaVocabulary.hasTitle(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoEpisodeNumber(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDuration(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasDescription(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoSynopsis(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasReleaseDate(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoAudienceRating(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasArtwork(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoWriter(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoAssistantDirector(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoProducer(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoActor(MediaQuery::Optional));
+            query.addCondition(mediaVocabulary.hasVideoCinematographer(MediaQuery::Optional));
             if (!genre.isEmpty()) {
-                if (genre == "~") genre = QString();
-                videoQuery.hasGenre(genre);
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Required,
+                                                            genre,
+                                                            MediaQuery::Equal));;
+            } else {
+                query.addCondition(mediaVocabulary.hasGenre(MediaQuery::Optional));
             }
             if (!seriesName.isEmpty()) {
                 if (seriesName != "~") {
-                    videoQuery.hasSeriesName(seriesName);
+                    query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Required,
+                                                                           seriesName,
+                                                                           MediaQuery::Equal));
                 } else {
-                    videoQuery.hasNoSeriesName();
+                    query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
+                    query.startFilter();
+                    query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), QString(), MediaQuery::NotBound);
+                    query.addFilterOr();
+                    query.addFilterConstraint(mediaVocabulary.videoSeriesTitleBinding(), "^$", MediaQuery::Contains);
+                    query.endFilter();
                 }
+            } else {
+                query.addCondition(mediaVocabulary.hasVideoSeriesTitle(MediaQuery::Optional));
             }
             if (season > 0) {
-                videoQuery.hasSeason(season);
+                query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Required,
+                                                                  season,
+                                                                  MediaQuery::Equal));
             } else if (season == -1) {
-                videoQuery.hasNoSeason();
+                query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional));
+                query.startFilter();
+                query.addFilterConstraint(mediaVocabulary.videoSeasonBinding(), QString(), MediaQuery::NotBound);
+                query.endFilter();
+            } else {
+                query.addCondition(mediaVocabulary.hasVideoSeason(MediaQuery::Optional));
             }
-            videoQuery.orderBy("?seriesName ?season ?episodeNumber ?title");
+            query.endWhere();
+            QStringList orderByBindings;
+            orderByBindings.append(mediaVocabulary.videoSeriesTitleBinding());
+            orderByBindings.append(mediaVocabulary.videoSeasonBinding());
+            orderByBindings.append(mediaVocabulary.videoEpisodeNumberBinding());
+            orderByBindings.append(mediaVocabulary.titleBinding());
+            query.orderBy(orderByBindings);
+            
+            Soprano::QueryResultIterator it = query.executeSelect(m_mainModel);
             
-            //Execute Query
-            Soprano::QueryResultIterator it = videoQuery.executeSelect(m_mainModel);
             
             //Build media list from results
             while( it.next() ) {
-                MediaItem mediaItem = createMediaItem(it);
+                QUrl url = it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri().isEmpty() ? 
+                it.binding(MediaVocabulary::mediaResourceBinding()).uri() :
+                it.binding(MediaVocabulary::mediaResourceUrlBinding()).uri();
+                Nepomuk::Resource res(url);
+                QString type = "Video Clip";
+                if (res.exists()) {
+                    if (res.hasType(mediaVocabulary.typeVideoMovie())) {
+                        type = "Movie";
+                    }
+                    if (res.hasType(mediaVocabulary.typeVideoTVShow())) {
+                        type = "TV Show";
+                    }
+                }
+                MediaItem mediaItem = Utilities::mediaItemFromIterator(it, type);
+                
                 mediaList.append(mediaItem);
             }
             
-            /*if (mediaList.isEmpty()) {
-                MediaItem noResults;
-                noResults.url = "video://";
-                noResults.title = "No results";
-                noResults.type = "Message";
-                mediaList << noResults;
-            }*/
-            
             m_mediaListProperties.summary = i18np("1 item", "%1 items", mediaList.count());
             m_mediaListProperties.type = QString("Sources");
             
@@ -580,438 +699,3 @@ void VideoListEngine::setFilterForSources(const QString& engineFilter)
     m_mediaListProperties.lri = QString("video://sources?%1").arg(engineFilter);
 }
 
-
-
-VideoQuery::VideoQuery(bool distinct) :
-		m_distinct(distinct),
-        m_selectAllVideoResources(false),
-        m_selectVideoResource(false),
-        m_selectMovieResource(false),
-        m_selectTVShowResource(false),
-        m_selectSeason(false),
-		m_selectSeriesName(false),
-		m_selectTitle(false),
-		m_selectDuration(false),
-		m_selectEpisode(false),
-		m_selectDescription(false),
-        m_selectSynopsis(false),
-        m_selectReleaseDate(false),
-        m_selectCreated(false),
-        m_selectGenre(false),
-        m_selectRating(false),
-        m_selectArtwork(false),
-        m_selectWriter(false),
-        m_selectDirector(false),
-        m_selectAssistantDirector(false),
-        m_selectProducer(false),
-        m_selectActor(false),
-        m_selectCinematographer(false)
-        
-{
-        m_mediaVocabulary = MediaVocabulary();
-        m_mediaVocabulary.setVocabulary(MediaVocabulary::nmm);
-        m_mediaVocabulary.setVideoVocabulary(MediaVocabulary::nmm);
-}
-
-void VideoQuery::selectAllVideoResources(bool optional) {
-    m_selectAllVideoResources = true;
-    m_allVideoResourcesCondition = addOptional(optional,
-                                              QString(" { ?r rdf:type <%1> } "
-                                              " UNION  "
-                                              " { ?r rdf:type <%2> } "
-                                              " UNION "
-                                              " { ?r rdf:type <%3> } "
-                                              " OPTIONAL { ?r nie:url ?url } . ")
-                                              .arg(MediaVocabulary().typeVideo().toString())
-                                              .arg(MediaVocabulary().typeVideoMovie().toString())
-                                              .arg(MediaVocabulary().typeVideoTVShow().toString()));
-}
-
-void VideoQuery::selectVideoResource(bool optional) {
-    m_selectVideoResource = true;
-    m_videoResourceCondition = addOptional(optional,
-                                    QString("?r rdf:type <%1> . "
-                                    "OPTIONAL { ?r nie:url ?url } . ")
-                                    .arg(m_mediaVocabulary.typeVideo().toString()));
-}
-
-void VideoQuery::selectMovieResource(bool optional) {
-    m_selectMovieResource = true;
-    m_movieResourceCondition = addOptional(optional,
-                                           QString("?r rdf:type <%1> . "
-                                           "OPTIONAL { ?r nie:url ?url } . ")
-                                           .arg(m_mediaVocabulary.typeVideoMovie().toString()));
-}
-
-void VideoQuery::selectTVShowResource(bool optional) {
-    m_selectTVShowResource = true;
-    m_tVShowResourceCondition = addOptional(optional,
-                                           QString("?r rdf:type <%1> . "
-                                           "OPTIONAL { ?r nie:url ?url } . ")
-                                           .arg(m_mediaVocabulary.typeVideoTVShow().toString()));
-}
-
-void VideoQuery::selectSeason(bool optional) {
-	m_selectSeason = true;
-    m_seasonCondition = addOptional(optional,
-    		QString("?r <%1> ?season . ")
-    		.arg(m_mediaVocabulary.videoSeason().toString()));
-}
-
-void VideoQuery::selectSeriesName(bool optional) {
-	m_selectSeriesName = true;
-    m_seriesNameCondition = addOptional(optional,
-    		QString("?r <%1> ?series . "
-                    "?series <%2> ?seriesName . ")
-                    .arg(m_mediaVocabulary.videoSeries().toString())
-    		        .arg(m_mediaVocabulary.title().toString()));
-}
-
-void VideoQuery::selectTitle(bool optional) {
-	m_selectTitle = true;
-    m_titleCondition = addOptional(optional,
-    		QString("?r <%1> ?title . ")
-    		.arg(m_mediaVocabulary.title().toString()));
-}
-
-void VideoQuery::selectDuration(bool optional) {
-	m_selectDuration = true;
-    m_durationCondition = addOptional(optional,
-    		QString("?r <%1> ?duration . ")
-    		.arg(m_mediaVocabulary.duration().toString()));
-}
-
-void VideoQuery::selectEpisode(bool optional) {
-	m_selectEpisode = true;
-    m_episodeCondition = addOptional(optional,
-    		QString("?r <%1> ?episodeNumber . ")
-    		.arg(m_mediaVocabulary.videoEpisodeNumber().toString()));
-}
-
-void VideoQuery::selectDescription(bool optional) {
-	m_selectDescription = true;
-    m_descriptionCondition = addOptional(optional,
-    		QString("?r <%1> ?description . ")
-    		.arg(m_mediaVocabulary.description().toString()));
-}
-
-void VideoQuery::selectSynopsis(bool optional) {
-    m_selectSynopsis = true;
-    m_synopsisCondition = addOptional(optional,
-                                         QString("?r <%1> ?synopsis . ")
-                                         .arg(m_mediaVocabulary.videoSynopsis().toString()));
-}
-
-void VideoQuery::selectCreated(bool optional) {
-    m_selectCreated = true;
-    m_createdCondition = addOptional(optional,
-                                         QString("?r <%1> ?created . ")
-                                         .arg(m_mediaVocabulary.created().toString()));
-}
-
-void VideoQuery::selectReleaseDate(bool optional) {
-    m_selectReleaseDate = true;
-    m_releaseDateCondition = addOptional(optional,
-                                     QString("?r <%1> ?releaseDate . ")
-                                     .arg(m_mediaVocabulary.releaseDate().toString()));
-}
-
-void VideoQuery::selectGenre(bool optional) {
-    m_selectGenre = true;
-    m_genreCondition = addOptional(optional,
-                                         QString("?r <%1> ?genre . ")
-                                         .arg(m_mediaVocabulary.genre().toString()));
-}
-
-void VideoQuery::selectRating(bool optional) {
-    m_selectRating = true;
-    m_ratingCondition = addOptional(optional,
-                                    QString("?r <%1> ?rating . ")
-                                    .arg(Soprano::Vocabulary::NAO::numericRating().toString()));
-}
-
-void VideoQuery::selectArtwork(bool optional) {
-    m_selectArtwork = true;
-    m_artworkCondition = addOptional(optional,
-                                         QString("?r <%1> ?artwork . ")
-                                         .arg(m_mediaVocabulary.artwork().toString()));
-}
-
-void VideoQuery::selectWriter(bool optional) {
-    m_selectWriter = true;
-    m_writerCondition = addOptional(optional,
-                                     QString("?r <%1> ?writer . ")
-                                     .arg(m_mediaVocabulary.videoWriter().toString()));
-}
-
-void VideoQuery::selectDirector(bool optional) {
-    m_selectDirector = true;
-    m_directorCondition = addOptional(optional,
-                                    QString("?r <%1> ?director . ")
-                                    .arg(m_mediaVocabulary.videoDirector().toString()));
-}
-
-void VideoQuery::selectAssistantDirector(bool optional) {
-    m_selectAssistantDirector = true;
-    m_assistantDirectorCondition = addOptional(optional,
-                                    QString("?r <%1> ?assistantDirector . ")
-                                    .arg(m_mediaVocabulary.videoAssistantDirector().toString()));
-}
-
-void VideoQuery::selectProducer(bool optional) {
-    m_selectProducer = true;
-    m_producerCondition = addOptional(optional,
-                                    QString("?r <%1> ?producer . ")
-                                    .arg(m_mediaVocabulary.videoProducer().toString()));
-}
-
-void VideoQuery::selectActor(bool optional) {
-    m_selectActor = true;
-    m_actorCondition = addOptional(optional,
-                                    QString("?r <%1> ?actor . ")
-                                    .arg(m_mediaVocabulary.videoActor().toString()));
-}
-
-void VideoQuery::selectCinematographer(bool optional) {
-    m_selectCinematographer = true;
-    m_cinematographerCondition = addOptional(optional,
-                                    QString("?r <%1> ?cinematographer . ")
-                                    .arg(m_mediaVocabulary.videoCinematographer().toString()));
-}
-
-void VideoQuery::isVideo()
-{
-    m_selectVideoResource = false;
-    m_videoResourceCondition = QString("?r rdf:type <%1> . ")
-                                           .arg(m_mediaVocabulary.typeVideo().toString());
-}
-
-void VideoQuery::isMovie()
-{
-    m_selectMovieResource = false;
-    m_movieResourceCondition = QString("?r rdf:type <%1> . ")
-                                           .arg(m_mediaVocabulary.typeVideoMovie().toString());
-}
-
-void VideoQuery::isTVShow()
-{
-    m_selectTVShowResource = false;
-    m_tVShowResourceCondition = QString("?r rdf:type <%1> . ")
-                                            .arg(m_mediaVocabulary.typeVideoTVShow().toString());
-}
-
-void VideoQuery::isAnyVideoType()
-{
-    m_selectAllVideoResources = false;
-    m_allVideoResourcesCondition = QString(" { ?r rdf:type <%1> } "
-                                               " UNION  "
-                                               " { ?r rdf:type <%2> } "
-                                               " UNION "
-                                               " { ?r rdf:type <%3> } ")
-                                               .arg(MediaVocabulary().typeVideo().toString())
-                                               .arg(MediaVocabulary().typeVideoMovie().toString())
-                                               .arg(MediaVocabulary().typeVideoTVShow().toString());
-}
-
-void VideoQuery::hasSeason(int season) {
-	m_seasonCondition = QString("?r <%1> %2 . "
-                                "?r <%1> ?season . ")
-    		.arg(m_mediaVocabulary.videoSeason().toString())
-    		.arg(Soprano::Node::literalToN3(season));
-}
-
-void VideoQuery::hasNoSeason() {
-	m_seasonCondition = QString(
-			"OPTIONAL { ?r <%1> ?season  } "
-			"FILTER ( !bound(?season) ) ")
-			.arg(m_mediaVocabulary.videoSeason().toString());
-}
-
-void VideoQuery::hasSeriesName(QString seriesName) {
-    m_seriesNameCondition = QString("?r <%1> ?series . "
-                                    "?series <%2> ?seriesName . "
-                                    "?series <%2> %3 . ")
-                                    .arg(m_mediaVocabulary.videoSeries().toString())
-                                    .arg(m_mediaVocabulary.title().toString())
-                                    .arg(Soprano::Node::literalToN3(seriesName));
-}
-
-void VideoQuery::hasGenre(QString genre) {
-    m_genreCondition = QString("?r <%1> %2 . "
-                               "?r <%1> ?genre . ")
-    .arg(m_mediaVocabulary.genre().toString())
-    .arg(Soprano::Node::literalToN3(genre));
-}
-
-void VideoQuery::hasNoSeriesName() {
-	m_seriesNameCondition = QString(
-            "OPTIONAL { ?r <%1> ?series . "
-            "?series <%2> ?seriesName .  } "
-			"FILTER (!bound(?seriesName) || regex(str(?seriesName), \"^$\")) ")
-			.arg(m_mediaVocabulary.videoSeries().toString())
-            .arg(m_mediaVocabulary.title().toString());
-}
-
-void VideoQuery::searchString(QString str) {
-	if (! str.isEmpty()) {
-		m_searchCondition = QString(
-				"FILTER (regex(str(?title),\"%1\",\"i\") || "
-			    "regex(str(?description),\"%1\",\"i\") || "
-                "regex(str(?synopsis),\"%1\",\"i\") || "
-                "regex(str(?writer),\"%1\",\"i\") || "
-                "regex(str(?director),\"%1\",\"i\") || "
-                "regex(str(?assistantDirector),\"%1\",\"i\") || "
-                "regex(str(?producer),\"%1\",\"i\") || "
-                "regex(str(?actor),\"%1\",\"i\") || "
-                "regex(str(?cinematographer),\"%1\",\"i\")) ")
-				.arg(str);
-	}
-}
-
-
-void VideoQuery::orderBy(QString var) {
-	if (!var.isEmpty()) {
-		m_order = "ORDER BY " + var;
-	}
-}
-
-
-QString VideoQuery::addOptional(bool optional, QString str) {
-	if (optional) {
-		return QString("OPTIONAL { ") + str + "} . ";
- 	} else {
-		return str;
- 	}
-}
-
-QString VideoQuery::getPrefix() {
-    return QString("PREFIX xesam: <%1> "
-			"PREFIX rdf: <%2> "
-			"PREFIX nmm: <%3> "
-            "PREFIX xls: <%4> "
-            "PREFIX nie: <http://www.semanticdesktop.org/ontologies/2007/01/19/nie#> ")
-		.arg(Soprano::Vocabulary::Xesam::xesamNamespace().toString())
-		.arg(Soprano::Vocabulary::RDF::rdfNamespace().toString())
-		.arg("http://www.semanticdesktop.org/ontologies/nmm#")
-		.arg(Soprano::Vocabulary::XMLSchema::xsdNamespace().toString());
-}
-
-QString VideoQuery::query()
-{
-    QString queryString = getPrefix();
-    queryString += "SELECT ";
-    
-    if (m_distinct)
-        queryString += "DISTINCT ";
-    if (m_selectAllVideoResources || m_selectVideoResource || m_selectMovieResource || m_selectTVShowResource)
-        queryString += "?r ?url ?type ";
-    if (m_selectSeason)
-        queryString += "?season ";
-    if (m_selectSeriesName)
-        queryString += "?seriesName ";
-    if (m_selectTitle)
-        queryString += "?title ";
-    if (m_selectDuration)
-        queryString += "?duration ";
-    if (m_selectEpisode)
-        queryString += "?episodeNumber ";
-    if (m_selectDescription)
-        queryString += "?description ";
-    if (m_selectSynopsis)
-        queryString += "?synopsis ";
-    if (m_selectReleaseDate)
-        queryString += "?releaseDate ";
-    if (m_selectCreated)
-        queryString += "?created ";
-    if (m_selectGenre)
-        queryString += "?genre ";
-    if (m_selectRating)
-        queryString += "?rating ";
-    if (m_selectArtwork)
-        queryString += "?artwork ";
-    if (m_selectWriter)
-        queryString += "?writer ";
-    if (m_selectDirector)
-        queryString += "?director ";
-    if (m_selectAssistantDirector)
-        queryString += "?assistantDirector ";
-    if (m_selectProducer)
-        queryString += "?producer ";
-    if (m_selectActor)
-        queryString += "?actor ";
-    if (m_selectCinematographer)
-        queryString += "?cinematographer ";
-    
-    //NOTE: nie:url is not in any released nie ontology that I can find.
-    //      In future KDE will use nfo:fileUrl so this will need to be changed.
-    queryString += QString("WHERE { ");
-    
-    queryString += m_allVideoResourcesCondition;
-    queryString += m_videoResourceCondition;
-    queryString += m_movieResourceCondition;
-    queryString += m_tVShowResourceCondition;
-    queryString += m_seasonCondition;
-    queryString += m_seriesNameCondition;
-    queryString += m_titleCondition;
-    queryString += m_durationCondition;
-    queryString += m_episodeCondition;
-    queryString += m_descriptionCondition;
-    queryString += m_synopsisCondition;
-    queryString += m_createdCondition;
-    queryString += m_releaseDateCondition;
-    queryString += m_genreCondition;
-    queryString += m_ratingCondition;
-    queryString += m_artworkCondition;
-    queryString += m_writerCondition;
-    queryString += m_directorCondition;
-    queryString += m_assistantDirectorCondition;
-    queryString += m_producerCondition;
-    queryString += m_actorCondition;
-    queryString += m_cinematographerCondition;
-    queryString += m_searchCondition;
-    queryString += "} ";
-    
-    queryString += m_order;
-    
-    return queryString;
-}
-
-Soprano::QueryResultIterator VideoQuery::executeSelect(Soprano::Model* model) {
-    QString queryString = query();
-    return model->executeQuery(queryString,
-    		Soprano::Query::QueryLanguageSparql);
-}
-
-bool VideoQuery::executeAsk(Soprano::Model* model) {
-    QString queryString = getPrefix();
-    queryString += QString("ASK { ");
-
-    queryString += m_allVideoResourcesCondition;
-    queryString += m_videoResourceCondition;
-    queryString += m_movieResourceCondition;
-    queryString += m_tVShowResourceCondition;
-    queryString += m_seasonCondition;
-    queryString += m_seriesNameCondition;
-    queryString += m_titleCondition;
-    queryString += m_durationCondition;
-    queryString += m_episodeCondition;
-    queryString += m_descriptionCondition;
-    queryString += m_synopsisCondition;
-    queryString += m_createdCondition;
-    queryString += m_releaseDateCondition;
-    queryString += m_genreCondition;
-    queryString += m_ratingCondition;
-    queryString += m_searchCondition;
-    queryString += m_artworkCondition;
-    queryString += m_writerCondition;
-    queryString += m_directorCondition;
-    queryString += m_assistantDirectorCondition;
-    queryString += m_producerCondition;
-    queryString += m_actorCondition;
-    queryString += m_cinematographerCondition;
-    queryString += "} ";
-    
-    return model->executeQuery(queryString,
-    		Soprano::Query::QueryLanguageSparql)
-    		.boolValue();
-}
diff --git a/src/platform/videolistengine.h b/src/platform/videolistengine.h
index ce67884..04940c6 100644
--- a/src/platform/videolistengine.h
+++ b/src/platform/videolistengine.h
@@ -47,118 +47,10 @@ class VideoListEngine : public NepomukListEngine
         ~VideoListEngine();
         void run();
         void setFilterForSources(const QString& engineFilter);
-        
-    private:
-        MediaItem createMediaItem(Soprano::QueryResultIterator& it);
-
 
     Q_SIGNALS:
         void results(QList<MediaItem> mediaList, MediaListProperties mediaListProperties, bool done);
 };
 
-class VideoQuery {
-    public:
-        VideoQuery(bool distinct = true);
-        
-        void selectAllVideoResources(bool optional=false);
-        void selectVideoResource(bool optional=false);
-        void selectMovieResource(bool optional=false);
-        void selectTVShowResource(bool optional=false);
-        void selectSeason(bool optional=false);
-        void selectSeriesName(bool optional=false);
-        void selectTitle(bool optional=false);
-        void selectDuration(bool optional=false);
-        void selectEpisode(bool optional=false);
-        void selectDescription(bool optional=false);
-        void selectSynopsis(bool optional=false);
-        void selectReleaseDate(bool optional=false);
-        void selectCreated(bool optional=false);
-        void selectGenre(bool optional=false);
-        void selectRating(bool optional=false);
-        void selectArtwork(bool optional=false);
-        void selectWriter(bool optional=false);
-        void selectDirector(bool optional=false);
-        void selectAssistantDirector(bool optional=false);
-        void selectProducer(bool optional=false);
-        void selectActor(bool optional=false);
-        void selectCinematographer(bool optional=false);
-        
-        void isVideo();
-        void isMovie();
-        void isTVShow();
-        void isAnyVideoType();
-        
-        void hasSeason(int season);
-        void hasNoSeason();
-        
-        void hasSeriesName(QString seriesName);
-        void hasGenre(QString genre);
-        void hasNoSeriesName();
-        
-        void searchString(QString str);
-        
-        void orderBy(QString var);
-        
-        QString query();
-        Soprano::QueryResultIterator executeSelect(Soprano::Model* model);
-        bool executeAsk(Soprano::Model* model);
-        
-    private:
-        MediaVocabulary m_mediaVocabulary;
-        bool m_distinct;
-        
-        bool m_selectAllVideoResources;
-        bool m_selectVideoResource;
-        bool m_selectMovieResource;
-        bool m_selectTVShowResource;
-        bool m_selectSeason;
-        bool m_selectSeriesName;
-        bool m_selectTitle;
-        bool m_selectDuration;
-        bool m_selectEpisode;
-        bool m_selectDescription;
-        bool m_selectSynopsis;
-        bool m_selectReleaseDate;
-        bool m_selectCreated;
-        bool m_selectGenre;
-        bool m_selectRating;
-        bool m_selectArtwork;
-        bool m_selectWriter;
-        bool m_selectDirector;
-        bool m_selectAssistantDirector;
-        bool m_selectProducer;
-        bool m_selectActor;
-        bool m_selectCinematographer;
-        
-        QString m_allVideoResourcesCondition;
-        QString m_videoResourceCondition;
-        QString m_movieResourceCondition;
-        QString m_tVShowResourceCondition;
-        QString m_seasonCondition;
-        QString m_seriesNameCondition;
-        QString m_titleCondition;
-        QString m_durationCondition;
-        QString m_episodeCondition;
-        QString m_descriptionCondition;
-        QString m_synopsisCondition;
-        QString m_releaseDateCondition;
-        QString m_createdCondition;
-        QString m_genreCondition;
-        QString m_searchCondition;
-        QString m_ratingCondition;
-        QString m_artworkCondition;
-        QString m_writerCondition;
-        QString m_directorCondition;
-        QString m_assistantDirectorCondition;
-        QString m_producerCondition;
-        QString m_actorCondition;
-        QString m_cinematographerCondition;
-        
-        QString m_order;
-        
-        QString addOptional(bool optional, QString str);
-        QString getPrefix();
-};
-
 #endif // VIDEOLISTENGINE_H
 
diff --git a/src/savedlistsmanager.cpp b/src/savedlistsmanager.cpp
index bee3814..0ad0615 100644
--- a/src/savedlistsmanager.cpp
+++ b/src/savedlistsmanager.cpp
@@ -350,9 +350,9 @@ void SavedListsManager::mediaListChanged()
 {
     if (m_parent->m_mediaItemModel->rowCount() > 0) {
         QString listItemType = m_parent->m_mediaItemModel->mediaItemAt(0).type;
-        if (listItemType == "Audio" && m_nepomukInited) {
+        if (listItemType == "Audio" && m_nepomukInited && m_parent->m_mediaItemModel->lriIsLoadable()) {
             ui->aListSourceView->setEnabled(true);
-        } else if (listItemType == "Video" && m_nepomukInited) {
+        } else if (listItemType == "Video" && m_nepomukInited && m_parent->m_mediaItemModel->lriIsLoadable()) {
             ui->vListSourceView->setEnabled(true);
         } else {
             ui->aListSourceView->setChecked(false);
@@ -363,7 +363,7 @@ void SavedListsManager::mediaListChanged()
     }
 }
 
-void SavedListsManager::saveMediaList(QList<MediaItem> mediaList, QString name, QString type, bool append)
+void SavedListsManager::saveMediaList(QList<MediaItem> mediaList, const QString &name, const QString &type, bool append)
 {
     if (!name.isEmpty()) {
         
@@ -432,7 +432,7 @@ void SavedListsManager::saveMediaList(QList<MediaItem> mediaList, QString name,
     }
 }
 
-void SavedListsManager::saveView(QString name, QString type)
+void SavedListsManager::saveView(const QString &name, const QString &type)
 {
     if (!name.isEmpty()) {
         //Add to saved list index
@@ -519,7 +519,7 @@ void SavedListsManager::updateSavedListsIndex()
     indexFile.close();    
 }
 
-QStringList SavedListsManager::savedListNames(QString type)
+QStringList SavedListsManager::savedListNames(const QString &type)
 {
     QList<QString> savedLists ;
     if (type == "Audio") {
@@ -705,7 +705,7 @@ void SavedListsManager::saveVideoListSettings()
     returnToVideoList();
 }
 
-QString SavedListsManager::savedListLriName(QString lri)
+QString SavedListsManager::savedListLriName(const QString &lri)
 {
     QString name;
     for (int i = 0; i < m_savedAudioLists.count(); i++) {
@@ -716,8 +716,8 @@ QString SavedListsManager::savedListLriName(QString lri)
     }
         
     for (int i = 0; i < m_savedVideoLists.count(); i++) {
-        if (m_savedAudioLists.at(i).endsWith(lri)) {
-            QString indexEntry = m_savedAudioLists.at(i);
+        if (m_savedVideoLists.at(i).endsWith(lri)) {
+            QString indexEntry = m_savedVideoLists.at(i);
             name = indexEntry.split(":::").at(1);
         }
     }
diff --git a/src/savedlistsmanager.h b/src/savedlistsmanager.h
index 2980b01..1e052fb 100644
--- a/src/savedlistsmanager.h
+++ b/src/savedlistsmanager.h
@@ -41,10 +41,10 @@ class SavedListsManager : public QObject
     public:
         SavedListsManager(MainWindow * parent);
         ~SavedListsManager();
-        void saveMediaList(QList<MediaItem> mediaList, QString name, QString type, bool append = false);
-        void saveView(QString name, QString type);
-        QStringList savedListNames(QString type);
-        QString savedListLriName(QString lri);
+        void saveMediaList(QList<MediaItem> mediaList, const QString &name, const QString &type, bool append = false);
+        void saveView(const QString &name, const QString &type);
+        QStringList savedListNames(const QString &type);
+        QString savedListLriName(const QString &lri);
         
     signals:
         void savedListsChanged();
diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt
index fe983ec..5822350 100644
--- a/translations/CMakeLists.txt
+++ b/translations/CMakeLists.txt
@@ -1,3 +1,4 @@
 add_subdirectory( nl )
 add_subdirectory( de )
 add_subdirectory( fr )
+add_subdirectory( zh_CN )
diff --git a/translations/bangarang.pot b/translations/bangarang.pot
index bfe8e7f..ced7102 100644
--- a/translations/bangarang.pot
+++ b/translations/bangarang.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n"
-"POT-Creation-Date: 2009-12-21 22:58-0800\n"
+"POT-Creation-Date: 2010-01-05 21:18-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -29,21 +29,21 @@ msgstr ""
 msgid "Play previous"
 msgstr ""
 
-#: actionsmanager.cpp:75 mainwindow.cpp:1087
+#: actionsmanager.cpp:75 mainwindow.cpp:1118
 msgid "Play all"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1811
+#. i18n: file: mainwindow.ui:1820
 #. i18n: ectx: property (text), widget (QPushButton, playAll)
 #: actionsmanager.cpp:77 rc.cpp:158
 msgid "Play All"
 msgstr ""
 
-#: actionsmanager.cpp:80 mainwindow.cpp:1089
+#: actionsmanager.cpp:80 mainwindow.cpp:1120
 msgid "Play selected"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1837
+#. i18n: file: mainwindow.ui:1846
 #. i18n: ectx: property (text), widget (QPushButton, playSelected)
 #: actionsmanager.cpp:82 rc.cpp:164
 msgid "Play Selected"
@@ -61,7 +61,7 @@ msgstr ""
 msgid "Hide controls"
 msgstr ""
 
-#: actionsmanager.cpp:106 actionsmanager.cpp:381 mainwindow.cpp:348
+#: actionsmanager.cpp:106 actionsmanager.cpp:390 mainwindow.cpp:364
 msgid "Show Video Settings"
 msgstr ""
 
@@ -97,78 +97,94 @@ msgstr ""
 msgid "Show items"
 msgstr ""
 
-#: actionsmanager.cpp:158
+#: actionsmanager.cpp:157
+msgid "Show info"
+msgstr ""
+
+#: actionsmanager.cpp:162
 msgid "Configure shortcuts..."
 msgstr ""
 
-#: actionsmanager.cpp:377
+#: actionsmanager.cpp:386
 msgid "Hide Video Settings"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1673
+#. i18n: file: mainwindow.ui:1586
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:239 rc.cpp:143
+#: infomanager.cpp:267 rc.cpp:140
 msgid "Title"
 msgstr ""
 
-#: infomanager.cpp:241
+#: infomanager.cpp:269
 msgid "Artwork"
 msgstr ""
 
-#: infomanager.cpp:243
+#: infomanager.cpp:271
 msgid "Description"
 msgstr ""
 
-#: infomanager.cpp:245
+#: infomanager.cpp:273
 msgid "Location"
 msgstr ""
 
-#: infomanager.cpp:287 infomanager.cpp:345
+#: infomanager.cpp:327 infomanager.cpp:385
 msgid "Type"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1681
+#. i18n: file: mainwindow.ui:1594
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:306 rc.cpp:146
+#: infomanager.cpp:346 rc.cpp:143
 msgid "Artist"
 msgstr ""
 
-#: infomanager.cpp:308
+#: infomanager.cpp:348
 msgid "Album"
 msgstr ""
 
-#: infomanager.cpp:310 infomanager.cpp:366 infomanager.cpp:396
+#: infomanager.cpp:350 infomanager.cpp:404 infomanager.cpp:453
 msgid "Year"
 msgstr ""
 
-#: infomanager.cpp:312
+#: infomanager.cpp:352
 msgid "Track Number"
 msgstr ""
 
-#: infomanager.cpp:314 infomanager.cpp:368
+#: infomanager.cpp:354 infomanager.cpp:406 infomanager.cpp:455
 msgid "Genre"
 msgstr ""
 
-#: infomanager.cpp:364
-msgid "Collection/Series Name"
+#: infomanager.cpp:408 infomanager.cpp:457
+msgid "Writer"
+msgstr ""
+
+#: infomanager.cpp:410 infomanager.cpp:459
+msgid "Director"
+msgstr ""
+
+#: infomanager.cpp:412 infomanager.cpp:461
+msgid "Producer"
+msgstr ""
+
+#: infomanager.cpp:414 infomanager.cpp:463
+msgid "Actor"
 msgstr ""
 
-#: infomanager.cpp:391
+#: infomanager.cpp:447
 msgid "Series Name"
 msgstr ""
 
-#: infomanager.cpp:393
+#: infomanager.cpp:449
 msgid "Season"
 msgstr ""
 
-#: infomanager.cpp:395
+#: infomanager.cpp:451
 msgid "Episode"
 msgstr ""
 
 #. i18n: file: mainwindow.ui:23
 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass)
-#: main.cpp:29 mainwindow.cpp:274 mainwindow.cpp:551 mainwindow.cpp:924
-#: mainwindow.cpp:1098 rc.cpp:5
+#: main.cpp:29 mainwindow.cpp:289 mainwindow.cpp:567 mainwindow.cpp:955
+#: mainwindow.cpp:1129 rc.cpp:5
 msgid "Bangarang"
 msgstr ""
 
@@ -231,173 +247,173 @@ msgstr ""
 msgid "Show Additional Debug Output"
 msgstr ""
 
-#: mainwindow.cpp:238 platform/medialistsengine.cpp:183
+#: mainwindow.cpp:244 platform/medialistsengine.cpp:183
 msgid "DVD Video"
 msgstr ""
 
-#: mainwindow.cpp:248 platform/medialistsengine.cpp:93
+#: mainwindow.cpp:254 platform/medialistsengine.cpp:93
 msgid "Audio CD"
 msgstr ""
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid ""
 "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media "
 "library, rating and play count functions will be unavailable."
 msgstr ""
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid "Don't show this message again"
 msgstr ""
 
-#: mainwindow.cpp:356
+#: mainwindow.cpp:372
 msgid "<b>Fullscreen</b><br>Click to exit fullscreen"
 msgstr ""
 
-#: mainwindow.cpp:363
+#: mainwindow.cpp:379
 msgid "Show fullscreen"
 msgstr ""
 
-#: mainwindow.cpp:374 mainwindow.cpp:644
+#: mainwindow.cpp:390 mainwindow.cpp:668
 msgid "<b>Time remaining</b><br>Click to show elapsed time"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5535
+#. i18n: file: mainwindow.ui:5547
 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime)
-#: mainwindow.cpp:376 mainwindow.cpp:646 rc.cpp:215
+#: mainwindow.cpp:392 mainwindow.cpp:670 rc.cpp:215
 msgid "<b>Time elapsed</b><br>Click to show remaining time"
 msgstr ""
 
-#: mainwindow.cpp:385
+#: mainwindow.cpp:401
 msgid "<b>Paused</b><br>Hold to stop"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:253
+#. i18n: file: mainwindow.ui:262
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter)
-#: mainwindow.cpp:516 rc.cpp:11
+#: mainwindow.cpp:532 rc.cpp:11
 msgid "Search for audio"
 msgstr ""
 
-#: mainwindow.cpp:524
+#: mainwindow.cpp:540
 msgid "Search for video"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5147
+#. i18n: file: mainwindow.ui:5156
 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist)
-#: mainwindow.cpp:547 rc.cpp:179
+#: mainwindow.cpp:563 rc.cpp:179
 msgid "Clear Playlist"
 msgstr ""
 
-#: mainwindow.cpp:548
+#: mainwindow.cpp:564
 msgid "Are you sure you want to clear the current playlist?"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1202
+#. i18n: file: mainwindow.ui:1211
 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:553 mainwindow.cpp:654 mainwindow.cpp:656 mainwindow.cpp:926
+#: mainwindow.cpp:569 mainwindow.cpp:678 mainwindow.cpp:680 mainwindow.cpp:957
 #: rc.cpp:113
 msgid "Now Playing"
 msgstr ""
 
-#: mainwindow.cpp:563
+#: mainwindow.cpp:579
 msgid "<b>Shuffle On</b><br>Click to turn off Shuffle"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5203
+#. i18n: file: mainwindow.ui:5212
 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle)
-#: mainwindow.cpp:567 rc.cpp:188
+#: mainwindow.cpp:583 rc.cpp:188
 msgid "Turn on Shuffle"
 msgstr ""
 
-#: mainwindow.cpp:578
+#: mainwindow.cpp:594
 msgid "<b>Repeat On</b><br>Click to turn off repeat"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5174
+#. i18n: file: mainwindow.ui:5183
 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat)
-#: mainwindow.cpp:581 rc.cpp:182
+#: mainwindow.cpp:597 rc.cpp:182
 msgid "Turn on Repeat"
 msgstr ""
 
-#: mainwindow.cpp:590
+#: mainwindow.cpp:607
 msgid "<b>Showing Upcoming</b><br>Click to show playlist"
 msgstr ""
 
-#: mainwindow.cpp:591
+#: mainwindow.cpp:608
 msgid "<b>Playlist</b>(Upcoming)"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5092
+#. i18n: file: mainwindow.ui:5101
 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue)
-#: mainwindow.cpp:595 rc.cpp:173
+#: mainwindow.cpp:613 rc.cpp:173
 msgid "Show Upcoming"
 msgstr ""
 
-#: mainwindow.cpp:670
+#: mainwindow.cpp:694
 msgid "<b>Playing</b><br>Click to pause<br>Click and hold to stop"
 msgstr ""
 
-#: mainwindow.cpp:681
+#: mainwindow.cpp:705
 msgid "An error has been encountered during playback"
 msgstr ""
 
-#: mainwindow.cpp:701
+#: mainwindow.cpp:725
 msgid "Loading playlist..."
 msgstr ""
 
-#: mainwindow.cpp:703
+#: mainwindow.cpp:727
 msgid "Buffering..."
 msgstr ""
 
-#: mainwindow.cpp:705 platform/mediaitemmodel.cpp:501
+#: mainwindow.cpp:729 platform/mediaitemmodel.cpp:541
 msgid "Loading..."
 msgstr ""
 
-#: mainwindow.cpp:717
+#: mainwindow.cpp:741
 msgid "<b>Muted</b><br>Click to restore volume"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5661
+#. i18n: file: mainwindow.ui:5673
 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon)
-#: mainwindow.cpp:720 rc.cpp:221
+#: mainwindow.cpp:744 rc.cpp:221
 msgid "Mute volume"
 msgstr ""
 
-#: mainwindow.cpp:757
+#: mainwindow.cpp:781
 msgid "Updating..."
 msgstr ""
 
-#: mainwindow.cpp:763
+#: mainwindow.cpp:787
 msgid "Complete"
 msgstr ""
 
-#: mainwindow.cpp:769
+#: mainwindow.cpp:794
 msgid "Updated info for "
 msgstr ""
 
-#: mainwindow.cpp:775
+#: mainwindow.cpp:804
 msgid "Removed info for "
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5124
+#. i18n: file: mainwindow.ui:5133
 #. i18n: ectx: property (text), widget (QLabel, playlistName)
-#: mainwindow.cpp:879 rc.cpp:176
+#: mainwindow.cpp:910 rc.cpp:176
 msgid "<b>Playlist</b>"
 msgstr ""
 
-#: mainwindow.cpp:882
+#: mainwindow.cpp:913
 #, kde-format
 msgid "1 item, %2"
 msgid_plural "%1 items, %2"
 msgstr[0] ""
 msgstr[1] ""
 
-#. i18n: file: mainwindow.ui:1199
+#. i18n: file: mainwindow.ui:1208
 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:897 mainwindow.cpp:927 rc.cpp:110
+#: mainwindow.cpp:928 mainwindow.cpp:958 rc.cpp:110
 msgid "View Now Playing"
 msgstr ""
 
-#: mainwindow.cpp:1099
+#: mainwindow.cpp:1130
 msgid "Entertainment... Now"
 msgstr ""
 
@@ -411,285 +427,285 @@ msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:149
+#. i18n: file: mainwindow.ui:158
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: mainwindow.ui:5405
+#. i18n: file: mainwindow.ui:5417
 #. i18n: ectx: property (text), widget (QToolButton, collectionButton)
 #: rc.cpp:8 rc.cpp:206
 msgid "Media Lists"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:296
+#. i18n: file: mainwindow.ui:305
 #. i18n: ectx: attribute (label), widget (QWidget, AudioTool_2)
 #: rc.cpp:14
 msgid "Audio"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:364
+#. i18n: file: mainwindow.ui:373
 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList)
-#. i18n: file: mainwindow.ui:801
+#. i18n: file: mainwindow.ui:810
 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList)
 #: rc.cpp:17 rc.cpp:65
 msgid "Add list"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:381
+#. i18n: file: mainwindow.ui:390
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList)
-#. i18n: file: mainwindow.ui:818
+#. i18n: file: mainwindow.ui:827
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList)
 #: rc.cpp:20 rc.cpp:68
 msgid "Remove list"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:411
+#. i18n: file: mainwindow.ui:420
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList)
-#. i18n: file: mainwindow.ui:848
+#. i18n: file: mainwindow.ui:857
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList)
 #: rc.cpp:23 rc.cpp:71
 msgid "Settings"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:460
+#. i18n: file: mainwindow.ui:469
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#. i18n: file: mainwindow.ui:897
+#. i18n: file: mainwindow.ui:906
 #. i18n: ectx: property (text), widget (QLabel, label_7)
 #: rc.cpp:26 rc.cpp:74
 msgid "Add List"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:477
+#. i18n: file: mainwindow.ui:486
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#. i18n: file: mainwindow.ui:914
+#. i18n: file: mainwindow.ui:923
 #. i18n: ectx: property (text), widget (QLabel, label_6)
 #: rc.cpp:29 rc.cpp:77
 msgid "Source"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:499
+#. i18n: file: mainwindow.ui:508
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView)
-#. i18n: file: mainwindow.ui:940
+#. i18n: file: mainwindow.ui:949
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView)
 #: rc.cpp:32 rc.cpp:83
 msgid "Current View"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:506
+#. i18n: file: mainwindow.ui:515
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection)
-#. i18n: file: mainwindow.ui:933
+#. i18n: file: mainwindow.ui:942
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection)
 #: rc.cpp:35 rc.cpp:80
 msgid "Current Selection"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:513
+#. i18n: file: mainwindow.ui:522
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist)
-#. i18n: file: mainwindow.ui:947
+#. i18n: file: mainwindow.ui:956
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist)
 #: rc.cpp:38 rc.cpp:86
 msgid "Current Playlist"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:523
+#. i18n: file: mainwindow.ui:532
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName)
-#. i18n: file: mainwindow.ui:957
+#. i18n: file: mainwindow.ui:966
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName)
 #: rc.cpp:41 rc.cpp:89
 msgid "New List Name"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:545
+#. i18n: file: mainwindow.ui:554
 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList)
-#. i18n: file: mainwindow.ui:689
+#. i18n: file: mainwindow.ui:698
 #. i18n: ectx: property (text), widget (QPushButton, aslsSave)
-#. i18n: file: mainwindow.ui:976
+#. i18n: file: mainwindow.ui:985
 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList)
-#. i18n: file: mainwindow.ui:1096
+#. i18n: file: mainwindow.ui:1105
 #. i18n: ectx: property (text), widget (QPushButton, vslsSave)
-#. i18n: file: mainwindow.ui:1782
+#. i18n: file: mainwindow.ui:1791
 #. i18n: ectx: property (text), widget (QPushButton, saveInfo)
 #: rc.cpp:44 rc.cpp:56 rc.cpp:92 rc.cpp:104 rc.cpp:152
 msgid "Save"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:599
+#. i18n: file: mainwindow.ui:608
 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList)
-#. i18n: file: mainwindow.ui:719
+#. i18n: file: mainwindow.ui:728
 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel)
-#. i18n: file: mainwindow.ui:1126
+#. i18n: file: mainwindow.ui:1135
 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel)
 #: rc.cpp:47 rc.cpp:59 rc.cpp:107
 msgid "Return to Lists"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:638
+#. i18n: file: mainwindow.ui:647
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#. i18n: file: mainwindow.ui:1045
+#. i18n: file: mainwindow.ui:1054
 #. i18n: ectx: property (text), widget (QLabel, label_11)
 #: rc.cpp:50 rc.cpp:98
 msgid "Saved List Settings"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:664
+#. i18n: file: mainwindow.ui:673
 #. i18n: ectx: property (text), widget (QLabel, label_9)
-#. i18n: file: mainwindow.ui:1071
+#. i18n: file: mainwindow.ui:1080
 #. i18n: ectx: property (text), widget (QLabel, label_10)
 #: rc.cpp:53 rc.cpp:101
 msgid "Name"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:748
+#. i18n: file: mainwindow.ui:757
 #. i18n: ectx: attribute (label), widget (QWidget, videoTool_2)
 #: rc.cpp:62
 msgid "Video"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1009
+#. i18n: file: mainwindow.ui:1018
 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList)
 #: rc.cpp:95
 msgid "Return To Lists"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1352
+#. i18n: file: mainwindow.ui:1361
 #. i18n: ectx: property (text), widget (QLabel, listTitle)
 #: rc.cpp:116
 msgid "List Title"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1365
+#. i18n: file: mainwindow.ui:1374
 #. i18n: ectx: property (text), widget (QLabel, listSummary)
 #: rc.cpp:119
 msgid "Summary"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1375
+#. i18n: file: mainwindow.ui:1384
 #. i18n: ectx: property (text), widget (QToolButton, sortList)
 #: rc.cpp:122
 msgid "Sort"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1399
+#. i18n: file: mainwindow.ui:1408
 #. i18n: ectx: property (text), widget (QToolButton, showInfo)
 #: rc.cpp:125
 msgid "Info"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1514
-#. i18n: ectx: property (text), widget (QLabel, notificationText)
-#: rc.cpp:128
-msgid "Notification Text"
-msgstr ""
-
-#. i18n: file: mainwindow.ui:1589
+#. i18n: file: mainwindow.ui:1502
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: rc.cpp:131
+#: rc.cpp:128
 msgid "Information"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1596
+#. i18n: file: mainwindow.ui:1509
 #. i18n: ectx: property (text), widget (QToolButton, editInfo)
-#: rc.cpp:134
+#: rc.cpp:131
 msgid "Edit"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1663
+#. i18n: file: mainwindow.ui:1576
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:137
+#: rc.cpp:134
 msgid "1"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1668
+#. i18n: file: mainwindow.ui:1581
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:140
+#: rc.cpp:137
 msgid "2"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1747
+#. i18n: file: mainwindow.ui:1663
+#. i18n: ectx: property (text), widget (QLabel, notificationText)
+#: rc.cpp:146
+msgid "Notification Text"
+msgstr ""
+
+#. i18n: file: mainwindow.ui:1756
 #. i18n: ectx: property (text), widget (QToolButton, previous)
 #: rc.cpp:149
 msgid "Previous"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1805
+#. i18n: file: mainwindow.ui:1814
 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll)
 #: rc.cpp:155
 msgid "Play all media in list"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1834
+#. i18n: file: mainwindow.ui:1843
 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected)
 #: rc.cpp:161
 msgid "Play selected media in list"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:2346
+#. i18n: file: mainwindow.ui:2355
 #. i18n: ectx: property (text), widget (QLabel, playbackMessage)
 #: rc.cpp:167
 msgid "Playback message"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:2375
+#. i18n: file: mainwindow.ui:2384
 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist)
 #: rc.cpp:170
 msgid "Playlist"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5177
+#. i18n: file: mainwindow.ui:5186
 #. i18n: ectx: property (text), widget (QToolButton, repeat)
-#. i18n: file: mainwindow.ui:5206
+#. i18n: file: mainwindow.ui:5215
 #. i18n: ectx: property (text), widget (QToolButton, shuffle)
-#. i18n: file: mainwindow.ui:5449
+#. i18n: file: mainwindow.ui:5461
 #. i18n: ectx: property (text), widget (SToolButton, fullScreen)
 #: rc.cpp:185 rc.cpp:191 rc.cpp:212
 msgid "[ ]"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5306
+#. i18n: file: mainwindow.ui:5318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
 #: rc.cpp:194
 msgid "Video Settings"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5335
+#. i18n: file: mainwindow.ui:5347
 #. i18n: ectx: property (text), widget (QPushButton, saveShortCuts)
 #: rc.cpp:197
 msgid "Save Shortcuts"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5342
+#. i18n: file: mainwindow.ui:5354
 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts)
 #: rc.cpp:200
 msgid "Cancel"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5402
+#. i18n: file: mainwindow.ui:5414
 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton)
 #: rc.cpp:203
 msgid "View Media Lists"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5446
+#. i18n: file: mainwindow.ui:5458
 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen)
 #: rc.cpp:209
 msgid "Show full screen"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5538
+#. i18n: file: mainwindow.ui:5550
 #. i18n: ectx: property (text), widget (QToolButton, seekTime)
 #: rc.cpp:218
 msgid "03:00"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5699
+#. i18n: file: mainwindow.ui:5711
 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider)
 #: rc.cpp:224
 msgid "Volume"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5725
+#. i18n: file: mainwindow.ui:5737
 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious)
-#. i18n: file: mainwindow.ui:5754
+#. i18n: file: mainwindow.ui:5766
 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause)
-#. i18n: file: mainwindow.ui:5774
+#. i18n: file: mainwindow.ui:5786
 #. i18n: ectx: property (text), widget (QToolButton, mediaNext)
 #: rc.cpp:227 rc.cpp:230 rc.cpp:233
 msgid "..."
@@ -751,35 +767,35 @@ msgstr ""
 msgid "Hide"
 msgstr ""
 
-#: platform/audioclipslistengine.cpp:107 platform/audioclipslistengine.cpp:131
-#: platform/videolistengine.cpp:176
+#: platform/audioclipslistengine.cpp:86 platform/audioclipslistengine.cpp:125
+#: platform/videolistengine.cpp:117
 #, kde-format
 msgid "1 clip"
 msgid_plural "%1 clips"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/audiostreamlistengine.cpp:103
-#: platform/audiostreamlistengine.cpp:134
+#: platform/audiostreamlistengine.cpp:85
+#: platform/audiostreamlistengine.cpp:131
 #, kde-format
 msgid "1 stream"
 msgid_plural "%1 streams"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/audiostreamlistengine.cpp:108
+#: platform/audiostreamlistengine.cpp:90
 msgid "Create new audio stream item"
 msgstr ""
 
-#: platform/audiostreamlistengine.cpp:155
+#: platform/audiostreamlistengine.cpp:152
 msgid "Untitled Audio Stream"
 msgstr ""
 
-#: platform/audiostreamlistengine.cpp:156
+#: platform/audiostreamlistengine.cpp:153
 msgid "Select this item, click Info then Edit to enter audio stream info"
 msgstr ""
 
-#: platform/audiostreamlistengine.cpp:165
+#: platform/audiostreamlistengine.cpp:162
 msgid "New Audio Stream"
 msgstr ""
 
@@ -819,9 +835,9 @@ msgid "Video Files"
 msgstr ""
 
 #: platform/filelistengine.cpp:87 platform/filelistengine.cpp:98
-#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:381
-#: platform/savedlistsengine.cpp:102 platform/videolistengine.cpp:451
-#: platform/videolistengine.cpp:517
+#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:415
+#: platform/savedlistsengine.cpp:166 platform/videolistengine.cpp:566
+#: platform/videolistengine.cpp:676
 #, kde-format
 msgid "1 item"
 msgid_plural "%1 items"
@@ -852,30 +868,20 @@ msgstr ""
 msgid "Open folder containing image file(s)"
 msgstr ""
 
-#: platform/filelistengine.cpp:326
+#: platform/filelistengine.cpp:334
 msgid "Audio Clip"
 msgstr ""
 
-#: platform/filelistengine.cpp:413
-#, kde-format
-msgid "%1 - Episode %2"
-msgstr ""
-
-#: platform/filelistengine.cpp:415
-#, kde-format
-msgid "Episode %1"
-msgstr ""
-
-#: platform/mediaitemmodel.cpp:380
+#: platform/mediaitemmodel.cpp:413
 #, kde-format
 msgid "Multiple %1"
 msgstr ""
 
-#: platform/mediaitemmodel.cpp:532
+#: platform/mediaitemmodel.cpp:572
 msgid "No results"
 msgstr ""
 
-#: platform/mediaitemmodel.cpp:563
+#: platform/mediaitemmodel.cpp:603
 msgid "Add to playlist/Remove from playlist"
 msgstr ""
 
@@ -883,20 +889,20 @@ msgstr ""
 msgid "Files and Folders"
 msgstr ""
 
-#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:222
+#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:132
 msgid "Artists"
 msgstr ""
 
-#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:262
+#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:192
 msgid "Albums"
 msgstr ""
 
-#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:353
+#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:331
 msgid "Songs"
 msgstr ""
 
 #: platform/medialistsengine.cpp:69 platform/medialistsengine.cpp:159
-#: platform/musiclistengine.cpp:306 platform/videolistengine.cpp:402
+#: platform/musiclistengine.cpp:256 platform/videolistengine.cpp:467
 msgid "Genres"
 msgstr ""
 
@@ -909,130 +915,130 @@ msgid "Audio Streams"
 msgstr ""
 
 #: platform/medialistsengine.cpp:100 platform/medialistsengine.cpp:190
-#: platform/semanticslistengine.cpp:89
+#: platform/semanticslistengine.cpp:107
 msgid "Frequently Played"
 msgstr ""
 
 #: platform/medialistsengine.cpp:104 platform/medialistsengine.cpp:194
-#: platform/semanticslistengine.cpp:115
+#: platform/semanticslistengine.cpp:147
 msgid "Recently Played"
 msgstr ""
 
 #: platform/medialistsengine.cpp:108 platform/medialistsengine.cpp:198
-#: platform/semanticslistengine.cpp:140
+#: platform/semanticslistengine.cpp:188
 msgid "Highest Rated"
 msgstr ""
 
-#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:369
+#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:426
 msgid "Movies"
 msgstr ""
 
-#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:224
+#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:181
 msgid "TV Shows"
 msgstr ""
 
-#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:175
+#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:116
 msgid "Video Clips"
 msgstr ""
 
-#: platform/musiclistengine.cpp:224
+#: platform/musiclistengine.cpp:134
 #, kde-format
 msgid "Artists - %1"
 msgstr ""
 
-#: platform/musiclistengine.cpp:226
+#: platform/musiclistengine.cpp:136
 #, kde-format
 msgid "1 artist"
 msgid_plural "%1 artists"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/musiclistengine.cpp:264 platform/musiclistengine.cpp:267
+#: platform/musiclistengine.cpp:194 platform/musiclistengine.cpp:197
 #, kde-format
 msgid "Albums - %1"
 msgstr ""
 
-#: platform/musiclistengine.cpp:270
+#: platform/musiclistengine.cpp:200
 #, kde-format
 msgid "Albums - %1 - %2"
 msgstr ""
 
-#: platform/musiclistengine.cpp:273
+#: platform/musiclistengine.cpp:203
 #, kde-format
 msgid "1 album"
 msgid_plural "%1 albums"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/musiclistengine.cpp:307 platform/videolistengine.cpp:403
+#: platform/musiclistengine.cpp:257 platform/videolistengine.cpp:468
 #, kde-format
 msgid "1 genre"
 msgid_plural "%1 genres"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/musiclistengine.cpp:355 platform/musiclistengine.cpp:383
+#: platform/musiclistengine.cpp:333 platform/musiclistengine.cpp:388
 #, kde-format
 msgid "1 song"
 msgid_plural "%1 songs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:216 platform/videolistengine.cpp:332
+#: platform/videolistengine.cpp:173 platform/videolistengine.cpp:358
 msgid "Uncategorized TV Shows"
 msgstr ""
 
-#: platform/videolistengine.cpp:225
+#: platform/videolistengine.cpp:182
 #, kde-format
 msgid "1 show"
 msgid_plural "%1 shows"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:253
+#: platform/videolistengine.cpp:230
 #, kde-format
 msgid "Season %1"
 msgstr ""
 
-#: platform/videolistengine.cpp:272
+#: platform/videolistengine.cpp:254
 msgid "Uncategorized seasons"
 msgstr ""
 
-#: platform/videolistengine.cpp:279
+#: platform/videolistengine.cpp:261
 #, kde-format
 msgid "Seasons - %1"
 msgstr ""
 
-#: platform/videolistengine.cpp:280
+#: platform/videolistengine.cpp:262
 #, kde-format
 msgid "1 season"
 msgid_plural "%1 seasons"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:334
+#: platform/videolistengine.cpp:360
 #, kde-format
 msgid "%1 - Season %2"
 msgstr ""
 
-#: platform/videolistengine.cpp:336
+#: platform/videolistengine.cpp:362
 #, kde-format
 msgid "%1 - Uncategorized Seasons"
 msgstr ""
 
-#: platform/videolistengine.cpp:338
+#: platform/videolistengine.cpp:364
 #, kde-format
 msgid "1 episode"
 msgid_plural "%1 episodes"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:371
+#: platform/videolistengine.cpp:428
 #, kde-format
 msgid "Movies - %1"
 msgstr ""
 
-#: platform/videolistengine.cpp:373
+#: platform/videolistengine.cpp:430
 #, kde-format
 msgid "1 movie"
 msgid_plural "%1 movies"
diff --git a/translations/de/bangarang.po b/translations/de/bangarang.po
index ec473f6..cb4131e 100644
--- a/translations/de/bangarang.po
+++ b/translations/de/bangarang.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n"
-"POT-Creation-Date: 2009-12-21 22:58-0800\n"
+"POT-Creation-Date: 2010-01-05 21:18-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Andreas Marschke <xxtjaxx at gmail.com>\n"
 "Language-Team: GERMAN <DE at li.org>\n"
@@ -29,21 +29,21 @@ msgstr "Nächstes abspielen"
 msgid "Play previous"
 msgstr "Vorheriges abspielen"
 
-#: actionsmanager.cpp:75 mainwindow.cpp:1087
+#: actionsmanager.cpp:75 mainwindow.cpp:1118
 msgid "Play all"
 msgstr "Alle abspielen"
 
-#. i18n: file: mainwindow.ui:1811
+#. i18n: file: mainwindow.ui:1820
 #. i18n: ectx: property (text), widget (QPushButton, playAll)
 #: actionsmanager.cpp:77 rc.cpp:158
 msgid "Play All"
 msgstr "Alle Abspielen"
 
-#: actionsmanager.cpp:80 mainwindow.cpp:1089
+#: actionsmanager.cpp:80 mainwindow.cpp:1120
 msgid "Play selected"
 msgstr "Auswahl abspielen"
 
-#. i18n: file: mainwindow.ui:1837
+#. i18n: file: mainwindow.ui:1846
 #. i18n: ectx: property (text), widget (QPushButton, playSelected)
 #: actionsmanager.cpp:82 rc.cpp:164
 msgid "Play Selected"
@@ -61,7 +61,7 @@ msgstr "Von Wiedergabeliste entfernen"
 msgid "Hide controls"
 msgstr "Verstecke Steuerelemente"
 
-#: actionsmanager.cpp:106 actionsmanager.cpp:381 mainwindow.cpp:348
+#: actionsmanager.cpp:106 actionsmanager.cpp:390 mainwindow.cpp:364
 msgid "Show Video Settings"
 msgstr ""
 
@@ -102,78 +102,97 @@ msgstr "Neuer Listenname"
 msgid "Show items"
 msgstr "1 Stück"
 
-#: actionsmanager.cpp:158
+#: actionsmanager.cpp:157
+#, fuzzy
+msgid "Show info"
+msgstr "Nächstes Anzeigen"
+
+#: actionsmanager.cpp:162
 msgid "Configure shortcuts..."
 msgstr "Kurzbefehle festlegen..."
 
-#: actionsmanager.cpp:377
+#: actionsmanager.cpp:386
 msgid "Hide Video Settings"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:1673
+#. i18n: file: mainwindow.ui:1586
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:239 rc.cpp:143
+#: infomanager.cpp:267 rc.cpp:140
 msgid "Title"
 msgstr "Titel"
 
-#: infomanager.cpp:241
+#: infomanager.cpp:269
 msgid "Artwork"
 msgstr "Titelbild"
 
-#: infomanager.cpp:243
+#: infomanager.cpp:271
 msgid "Description"
 msgstr "Beschreibung"
 
-#: infomanager.cpp:245
+#: infomanager.cpp:273
 msgid "Location"
 msgstr "Ort"
 
-#: infomanager.cpp:287 infomanager.cpp:345
+#: infomanager.cpp:327 infomanager.cpp:385
 msgid "Type"
 msgstr "Typ"
 
-#. i18n: file: mainwindow.ui:1681
+#. i18n: file: mainwindow.ui:1594
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:306 rc.cpp:146
+#: infomanager.cpp:346 rc.cpp:143
 msgid "Artist"
 msgstr "Künstler"
 
-#: infomanager.cpp:308
+#: infomanager.cpp:348
 msgid "Album"
 msgstr "Album"
 
-#: infomanager.cpp:310 infomanager.cpp:366 infomanager.cpp:396
+#: infomanager.cpp:350 infomanager.cpp:404 infomanager.cpp:453
 msgid "Year"
 msgstr "Jahr"
 
-#: infomanager.cpp:312
+#: infomanager.cpp:352
 msgid "Track Number"
 msgstr "Titelnummer"
 
-#: infomanager.cpp:314 infomanager.cpp:368
+#: infomanager.cpp:354 infomanager.cpp:406 infomanager.cpp:455
 msgid "Genre"
 msgstr "Genre"
 
-#: infomanager.cpp:364
-msgid "Collection/Series Name"
-msgstr "Sammlung/Serie"
+#: infomanager.cpp:408 infomanager.cpp:457
+msgid "Writer"
+msgstr ""
+
+#: infomanager.cpp:410 infomanager.cpp:459
+#, fuzzy
+msgid "Director"
+msgstr "Betreuer"
 
-#: infomanager.cpp:391
+#: infomanager.cpp:412 infomanager.cpp:461
+msgid "Producer"
+msgstr ""
+
+#: infomanager.cpp:414 infomanager.cpp:463
+#, fuzzy
+msgid "Actor"
+msgstr "Titelbild"
+
+#: infomanager.cpp:447
 msgid "Series Name"
 msgstr "Serienname"
 
-#: infomanager.cpp:393
+#: infomanager.cpp:449
 msgid "Season"
 msgstr "Staffel"
 
-#: infomanager.cpp:395
+#: infomanager.cpp:451
 msgid "Episode"
 msgstr "Episode"
 
 #. i18n: file: mainwindow.ui:23
 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass)
-#: main.cpp:29 mainwindow.cpp:274 mainwindow.cpp:551 mainwindow.cpp:924
-#: mainwindow.cpp:1098 rc.cpp:5
+#: main.cpp:29 mainwindow.cpp:289 mainwindow.cpp:567 mainwindow.cpp:955
+#: mainwindow.cpp:1129 rc.cpp:5
 msgid "Bangarang"
 msgstr "Bangarang"
 
@@ -241,15 +260,15 @@ msgstr "Music CD abspielen"
 msgid "Show Additional Debug Output"
 msgstr ""
 
-#: mainwindow.cpp:238 platform/medialistsengine.cpp:183
+#: mainwindow.cpp:244 platform/medialistsengine.cpp:183
 msgid "DVD Video"
 msgstr "DVD Video"
 
-#: mainwindow.cpp:248 platform/medialistsengine.cpp:93
+#: mainwindow.cpp:254 platform/medialistsengine.cpp:93
 msgid "Audio CD"
 msgstr "Audio CD"
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid ""
 "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media "
 "library, rating and play count functions will be unavailable."
@@ -258,170 +277,170 @@ msgstr ""
 "erreichen. MedienBibliothek, Bewertung und Abspiel zähl-Funktionen werden "
 "nicht benutzbar sein."
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid "Don't show this message again"
 msgstr "Diese Nachricht nicht wieder anzeigen."
 
 # @TODO feels fishy!!
-#: mainwindow.cpp:356
+#: mainwindow.cpp:372
 #, fuzzy
 msgid "<b>Fullscreen</b><br>Click to exit fullscreen"
 msgstr "<b>Shuffle An</b><br>Clicken sie hier um Shuffle ab zu schalten"
 
-#: mainwindow.cpp:363
+#: mainwindow.cpp:379
 #, fuzzy
 msgid "Show fullscreen"
 msgstr "Vollbild anzeigen"
 
-#: mainwindow.cpp:374 mainwindow.cpp:644
+#: mainwindow.cpp:390 mainwindow.cpp:668
 msgid "<b>Time remaining</b><br>Click to show elapsed time"
 msgstr "<b>Verbleibende Zeit</b><br>Hier Clicken um verbleibende Zeit zu sehen"
 
-#. i18n: file: mainwindow.ui:5535
+#. i18n: file: mainwindow.ui:5547
 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime)
-#: mainwindow.cpp:376 mainwindow.cpp:646 rc.cpp:215
+#: mainwindow.cpp:392 mainwindow.cpp:670 rc.cpp:215
 msgid "<b>Time elapsed</b><br>Click to show remaining time"
 msgstr ""
 "<b>Zeit Verstrichen</b><br>Hier Clicken um die verstrichene Zeit zu sehen"
 
-#: mainwindow.cpp:385
+#: mainwindow.cpp:401
 #, fuzzy
 msgid "<b>Paused</b><br>Hold to stop"
 msgstr "<b>Ton aus</b>Hier Clicken um Ton einzuschalten"
 
-#. i18n: file: mainwindow.ui:253
+#. i18n: file: mainwindow.ui:262
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter)
-#: mainwindow.cpp:516 rc.cpp:11
+#: mainwindow.cpp:532 rc.cpp:11
 msgid "Search for audio"
 msgstr "Nach Audio-Dateien Suchen"
 
-#: mainwindow.cpp:524
+#: mainwindow.cpp:540
 msgid "Search for video"
 msgstr "Nach Video-Dateien Suchen"
 
-#. i18n: file: mainwindow.ui:5147
+#. i18n: file: mainwindow.ui:5156
 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist)
-#: mainwindow.cpp:547 rc.cpp:179
+#: mainwindow.cpp:563 rc.cpp:179
 msgid "Clear Playlist"
 msgstr "Playlist leeren"
 
-#: mainwindow.cpp:548
+#: mainwindow.cpp:564
 msgid "Are you sure you want to clear the current playlist?"
 msgstr ""
 "Sind sie sich sicher, dass sie die momentane Abspielliste leeren möchten?"
 
-#. i18n: file: mainwindow.ui:1202
+#. i18n: file: mainwindow.ui:1211
 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:553 mainwindow.cpp:654 mainwindow.cpp:656 mainwindow.cpp:926
+#: mainwindow.cpp:569 mainwindow.cpp:678 mainwindow.cpp:680 mainwindow.cpp:957
 #: rc.cpp:113
 msgid "Now Playing"
 msgstr "Jetzt Spielt"
 
 # @TODO feels fishy!!
-#: mainwindow.cpp:563
+#: mainwindow.cpp:579
 msgid "<b>Shuffle On</b><br>Click to turn off Shuffle"
 msgstr "<b>Shuffle An</b><br>Clicken sie hier um Shuffle ab zu schalten"
 
-#. i18n: file: mainwindow.ui:5203
+#. i18n: file: mainwindow.ui:5212
 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle)
-#: mainwindow.cpp:567 rc.cpp:188
+#: mainwindow.cpp:583 rc.cpp:188
 msgid "Turn on Shuffle"
 msgstr "Shuffle Aktivieren"
 
-#: mainwindow.cpp:578
+#: mainwindow.cpp:594
 msgid "<b>Repeat On</b><br>Click to turn off repeat"
 msgstr "<b>Wiederholen An</b><br>Hier Clicken um Wiederholen ab zu schalten"
 
-#. i18n: file: mainwindow.ui:5174
+#. i18n: file: mainwindow.ui:5183
 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat)
-#: mainwindow.cpp:581 rc.cpp:182
+#: mainwindow.cpp:597 rc.cpp:182
 msgid "Turn on Repeat"
 msgstr "Wiederholen Aktivieren"
 
-#: mainwindow.cpp:590
+#: mainwindow.cpp:607
 msgid "<b>Showing Upcoming</b><br>Click to show playlist"
 msgstr "<b>Vorschau An</b><br>Hier Clicken um Playlist an zu zeigen"
 
-#: mainwindow.cpp:591
+#: mainwindow.cpp:608
 msgid "<b>Playlist</b>(Upcoming)"
 msgstr "<b>Abspielliste</b>(Nächstes)"
 
-#. i18n: file: mainwindow.ui:5092
+#. i18n: file: mainwindow.ui:5101
 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue)
-#: mainwindow.cpp:595 rc.cpp:173
+#: mainwindow.cpp:613 rc.cpp:173
 msgid "Show Upcoming"
 msgstr "Nächstes Anzeigen"
 
-#: mainwindow.cpp:670
+#: mainwindow.cpp:694
 msgid "<b>Playing</b><br>Click to pause<br>Click and hold to stop"
 msgstr ""
 "<b>Spielt</b><br>Hier clicken für Pause<br>Hier clicken und halt um zu "
 "Stoppen "
 
-#: mainwindow.cpp:681
+#: mainwindow.cpp:705
 msgid "An error has been encountered during playback"
 msgstr ""
 
-#: mainwindow.cpp:701
+#: mainwindow.cpp:725
 msgid "Loading playlist..."
 msgstr "Lade Abspielliste..."
 
-#: mainwindow.cpp:703
+#: mainwindow.cpp:727
 msgid "Buffering..."
 msgstr "Puffern..."
 
-#: mainwindow.cpp:705 platform/mediaitemmodel.cpp:501
+#: mainwindow.cpp:729 platform/mediaitemmodel.cpp:541
 msgid "Loading..."
 msgstr "Laden..."
 
-#: mainwindow.cpp:717
+#: mainwindow.cpp:741
 msgid "<b>Muted</b><br>Click to restore volume"
 msgstr "<b>Ton aus</b>Hier Clicken um Ton einzuschalten"
 
-#. i18n: file: mainwindow.ui:5661
+#. i18n: file: mainwindow.ui:5673
 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon)
-#: mainwindow.cpp:720 rc.cpp:221
+#: mainwindow.cpp:744 rc.cpp:221
 msgid "Mute volume"
 msgstr "Ton aus"
 
-#: mainwindow.cpp:757
+#: mainwindow.cpp:781
 #, fuzzy
 msgid "Updating..."
 msgstr "Laden..."
 
-#: mainwindow.cpp:763
+#: mainwindow.cpp:787
 msgid "Complete"
 msgstr ""
 
-#: mainwindow.cpp:769
+#: mainwindow.cpp:794
 msgid "Updated info for "
 msgstr ""
 
-#: mainwindow.cpp:775
+#: mainwindow.cpp:804
 #, fuzzy
 msgid "Removed info for "
 msgstr "Angewählte Informationen Entfernen"
 
-#. i18n: file: mainwindow.ui:5124
+#. i18n: file: mainwindow.ui:5133
 #. i18n: ectx: property (text), widget (QLabel, playlistName)
-#: mainwindow.cpp:879 rc.cpp:176
+#: mainwindow.cpp:910 rc.cpp:176
 msgid "<b>Playlist</b>"
 msgstr "<b>Abspielliste<b>"
 
-#: mainwindow.cpp:882
+#: mainwindow.cpp:913
 #, kde-format
 msgid "1 item, %2"
 msgid_plural "%1 items, %2"
 msgstr[0] "1 Stück, %2"
 msgstr[1] "%1 Stücke, %2"
 
-#. i18n: file: mainwindow.ui:1199
+#. i18n: file: mainwindow.ui:1208
 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:897 mainwindow.cpp:927 rc.cpp:110
+#: mainwindow.cpp:928 mainwindow.cpp:958 rc.cpp:110
 msgid "View Now Playing"
 msgstr "Jetzt Spielen Ansicht"
 
-#: mainwindow.cpp:1099
+#: mainwindow.cpp:1130
 msgid "Entertainment... Now"
 msgstr "Unterhaltung... Jetzt"
 
@@ -436,292 +455,292 @@ msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "Deine E-Mail Adresse"
 
-#. i18n: file: mainwindow.ui:149
+#. i18n: file: mainwindow.ui:158
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: mainwindow.ui:5405
+#. i18n: file: mainwindow.ui:5417
 #. i18n: ectx: property (text), widget (QToolButton, collectionButton)
 #: rc.cpp:8 rc.cpp:206
 msgid "Media Lists"
 msgstr "Medienlisten"
 
-#. i18n: file: mainwindow.ui:296
+#. i18n: file: mainwindow.ui:305
 #. i18n: ectx: attribute (label), widget (QWidget, AudioTool_2)
 #: rc.cpp:14
 msgid "Audio"
 msgstr "Audio"
 
-#. i18n: file: mainwindow.ui:364
+#. i18n: file: mainwindow.ui:373
 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList)
-#. i18n: file: mainwindow.ui:801
+#. i18n: file: mainwindow.ui:810
 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList)
 #: rc.cpp:17 rc.cpp:65
 #, fuzzy
 msgid "Add list"
 msgstr "Liste hinzufügen von"
 
-#. i18n: file: mainwindow.ui:381
+#. i18n: file: mainwindow.ui:390
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList)
-#. i18n: file: mainwindow.ui:818
+#. i18n: file: mainwindow.ui:827
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList)
 #: rc.cpp:20 rc.cpp:68
 #, fuzzy
 msgid "Remove list"
 msgstr "Von Wiedergabeliste entfernen"
 
-#. i18n: file: mainwindow.ui:411
+#. i18n: file: mainwindow.ui:420
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList)
-#. i18n: file: mainwindow.ui:848
+#. i18n: file: mainwindow.ui:857
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList)
 #: rc.cpp:23 rc.cpp:71
 #, fuzzy
 msgid "Settings"
 msgstr "Videodateien"
 
-#. i18n: file: mainwindow.ui:460
+#. i18n: file: mainwindow.ui:469
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#. i18n: file: mainwindow.ui:897
+#. i18n: file: mainwindow.ui:906
 #. i18n: ectx: property (text), widget (QLabel, label_7)
 #: rc.cpp:26 rc.cpp:74
 #, fuzzy
 msgid "Add List"
 msgstr "Liste hinzufügen von"
 
-#. i18n: file: mainwindow.ui:477
+#. i18n: file: mainwindow.ui:486
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#. i18n: file: mainwindow.ui:914
+#. i18n: file: mainwindow.ui:923
 #. i18n: ectx: property (text), widget (QLabel, label_6)
 #: rc.cpp:29 rc.cpp:77
 #, fuzzy
 msgid "Source"
 msgstr "Sortieren"
 
-#. i18n: file: mainwindow.ui:499
+#. i18n: file: mainwindow.ui:508
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView)
-#. i18n: file: mainwindow.ui:940
+#. i18n: file: mainwindow.ui:949
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView)
 #: rc.cpp:32 rc.cpp:83
 msgid "Current View"
 msgstr "Momentane Ansicht"
 
-#. i18n: file: mainwindow.ui:506
+#. i18n: file: mainwindow.ui:515
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection)
-#. i18n: file: mainwindow.ui:933
+#. i18n: file: mainwindow.ui:942
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection)
 #: rc.cpp:35 rc.cpp:80
 msgid "Current Selection"
 msgstr "Momentane Auswahl"
 
-#. i18n: file: mainwindow.ui:513
+#. i18n: file: mainwindow.ui:522
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist)
-#. i18n: file: mainwindow.ui:947
+#. i18n: file: mainwindow.ui:956
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist)
 #: rc.cpp:38 rc.cpp:86
 msgid "Current Playlist"
 msgstr "Momentane Abspielliste"
 
-#. i18n: file: mainwindow.ui:523
+#. i18n: file: mainwindow.ui:532
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName)
-#. i18n: file: mainwindow.ui:957
+#. i18n: file: mainwindow.ui:966
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName)
 #: rc.cpp:41 rc.cpp:89
 msgid "New List Name"
 msgstr "Neuer Listenname"
 
-#. i18n: file: mainwindow.ui:545
+#. i18n: file: mainwindow.ui:554
 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList)
-#. i18n: file: mainwindow.ui:689
+#. i18n: file: mainwindow.ui:698
 #. i18n: ectx: property (text), widget (QPushButton, aslsSave)
-#. i18n: file: mainwindow.ui:976
+#. i18n: file: mainwindow.ui:985
 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList)
-#. i18n: file: mainwindow.ui:1096
+#. i18n: file: mainwindow.ui:1105
 #. i18n: ectx: property (text), widget (QPushButton, vslsSave)
-#. i18n: file: mainwindow.ui:1782
+#. i18n: file: mainwindow.ui:1791
 #. i18n: ectx: property (text), widget (QPushButton, saveInfo)
 #: rc.cpp:44 rc.cpp:56 rc.cpp:92 rc.cpp:104 rc.cpp:152
 msgid "Save"
 msgstr "Speichern"
 
-#. i18n: file: mainwindow.ui:599
+#. i18n: file: mainwindow.ui:608
 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList)
-#. i18n: file: mainwindow.ui:719
+#. i18n: file: mainwindow.ui:728
 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel)
-#. i18n: file: mainwindow.ui:1126
+#. i18n: file: mainwindow.ui:1135
 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel)
 #: rc.cpp:47 rc.cpp:59 rc.cpp:107
 msgid "Return to Lists"
 msgstr "Zurück zu Listen"
 
-#. i18n: file: mainwindow.ui:638
+#. i18n: file: mainwindow.ui:647
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#. i18n: file: mainwindow.ui:1045
+#. i18n: file: mainwindow.ui:1054
 #. i18n: ectx: property (text), widget (QLabel, label_11)
 #: rc.cpp:50 rc.cpp:98
 #, fuzzy
 msgid "Saved List Settings"
 msgstr "Videodateien"
 
-#. i18n: file: mainwindow.ui:664
+#. i18n: file: mainwindow.ui:673
 #. i18n: ectx: property (text), widget (QLabel, label_9)
-#. i18n: file: mainwindow.ui:1071
+#. i18n: file: mainwindow.ui:1080
 #. i18n: ectx: property (text), widget (QLabel, label_10)
 #: rc.cpp:53 rc.cpp:101
 msgid "Name"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:748
+#. i18n: file: mainwindow.ui:757
 #. i18n: ectx: attribute (label), widget (QWidget, videoTool_2)
 #: rc.cpp:62
 msgid "Video"
 msgstr "Video"
 
-#. i18n: file: mainwindow.ui:1009
+#. i18n: file: mainwindow.ui:1018
 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList)
 #: rc.cpp:95
 msgid "Return To Lists"
 msgstr "Zurück zu Listen"
 
-#. i18n: file: mainwindow.ui:1352
+#. i18n: file: mainwindow.ui:1361
 #. i18n: ectx: property (text), widget (QLabel, listTitle)
 #: rc.cpp:116
 msgid "List Title"
 msgstr "Listen Titel"
 
-#. i18n: file: mainwindow.ui:1365
+#. i18n: file: mainwindow.ui:1374
 #. i18n: ectx: property (text), widget (QLabel, listSummary)
 #: rc.cpp:119
 msgid "Summary"
 msgstr "Zusammenfassung"
 
-#. i18n: file: mainwindow.ui:1375
+#. i18n: file: mainwindow.ui:1384
 #. i18n: ectx: property (text), widget (QToolButton, sortList)
 #: rc.cpp:122
 msgid "Sort"
 msgstr "Sortieren"
 
-#. i18n: file: mainwindow.ui:1399
+#. i18n: file: mainwindow.ui:1408
 #. i18n: ectx: property (text), widget (QToolButton, showInfo)
 #: rc.cpp:125
 msgid "Info"
 msgstr "Info"
 
-#. i18n: file: mainwindow.ui:1514
-#. i18n: ectx: property (text), widget (QLabel, notificationText)
-#: rc.cpp:128
-msgid "Notification Text"
-msgstr ""
-
-#. i18n: file: mainwindow.ui:1589
+#. i18n: file: mainwindow.ui:1502
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: rc.cpp:131
+#: rc.cpp:128
 msgid "Information"
 msgstr "Information"
 
-#. i18n: file: mainwindow.ui:1596
+#. i18n: file: mainwindow.ui:1509
 #. i18n: ectx: property (text), widget (QToolButton, editInfo)
-#: rc.cpp:134
+#: rc.cpp:131
 msgid "Edit"
 msgstr "Editieren"
 
-#. i18n: file: mainwindow.ui:1663
+#. i18n: file: mainwindow.ui:1576
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:137
+#: rc.cpp:134
 msgid "1"
 msgstr "1"
 
-#. i18n: file: mainwindow.ui:1668
+#. i18n: file: mainwindow.ui:1581
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:140
+#: rc.cpp:137
 msgid "2"
 msgstr "2"
 
-#. i18n: file: mainwindow.ui:1747
+#. i18n: file: mainwindow.ui:1663
+#. i18n: ectx: property (text), widget (QLabel, notificationText)
+#: rc.cpp:146
+msgid "Notification Text"
+msgstr ""
+
+#. i18n: file: mainwindow.ui:1756
 #. i18n: ectx: property (text), widget (QToolButton, previous)
 #: rc.cpp:149
 msgid "Previous"
 msgstr "Vorher"
 
-#. i18n: file: mainwindow.ui:1805
+#. i18n: file: mainwindow.ui:1814
 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll)
 #: rc.cpp:155
 msgid "Play all media in list"
 msgstr "Alle von Liste abspielen"
 
-#. i18n: file: mainwindow.ui:1834
+#. i18n: file: mainwindow.ui:1843
 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected)
 #: rc.cpp:161
 msgid "Play selected media in list"
 msgstr "Alle ausgewählten abspielen"
 
-#. i18n: file: mainwindow.ui:2346
+#. i18n: file: mainwindow.ui:2355
 #. i18n: ectx: property (text), widget (QLabel, playbackMessage)
 #: rc.cpp:167
 msgid "Playback message"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:2375
+#. i18n: file: mainwindow.ui:2384
 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist)
 #: rc.cpp:170
 msgid "Playlist"
 msgstr "Abspielliste"
 
-#. i18n: file: mainwindow.ui:5177
+#. i18n: file: mainwindow.ui:5186
 #. i18n: ectx: property (text), widget (QToolButton, repeat)
-#. i18n: file: mainwindow.ui:5206
+#. i18n: file: mainwindow.ui:5215
 #. i18n: ectx: property (text), widget (QToolButton, shuffle)
-#. i18n: file: mainwindow.ui:5449
+#. i18n: file: mainwindow.ui:5461
 #. i18n: ectx: property (text), widget (SToolButton, fullScreen)
 #: rc.cpp:185 rc.cpp:191 rc.cpp:212
 msgid "[ ]"
 msgstr "[ ]"
 
-#. i18n: file: mainwindow.ui:5306
+#. i18n: file: mainwindow.ui:5318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
 #: rc.cpp:194
 #, fuzzy
 msgid "Video Settings"
 msgstr "Videodateien"
 
-#. i18n: file: mainwindow.ui:5335
+#. i18n: file: mainwindow.ui:5347
 #. i18n: ectx: property (text), widget (QPushButton, saveShortCuts)
 #: rc.cpp:197
 msgid "Save Shortcuts"
 msgstr "Tastenkürzel Speichern"
 
-#. i18n: file: mainwindow.ui:5342
+#. i18n: file: mainwindow.ui:5354
 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts)
 #: rc.cpp:200
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#. i18n: file: mainwindow.ui:5402
+#. i18n: file: mainwindow.ui:5414
 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton)
 #: rc.cpp:203
 msgid "View Media Lists"
 msgstr "Zeige Medienlisten"
 
-#. i18n: file: mainwindow.ui:5446
+#. i18n: file: mainwindow.ui:5458
 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen)
 #: rc.cpp:209
 msgid "Show full screen"
 msgstr "Vollbild anzeigen"
 
-#. i18n: file: mainwindow.ui:5538
+#. i18n: file: mainwindow.ui:5550
 #. i18n: ectx: property (text), widget (QToolButton, seekTime)
 #: rc.cpp:218
 msgid "03:00"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:5699
+#. i18n: file: mainwindow.ui:5711
 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider)
 #: rc.cpp:224
 msgid "Volume"
 msgstr "Lautstärke"
 
-#. i18n: file: mainwindow.ui:5725
+#. i18n: file: mainwindow.ui:5737
 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious)
-#. i18n: file: mainwindow.ui:5754
+#. i18n: file: mainwindow.ui:5766
 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause)
-#. i18n: file: mainwindow.ui:5774
+#. i18n: file: mainwindow.ui:5786
 #. i18n: ectx: property (text), widget (QToolButton, mediaNext)
 #: rc.cpp:227 rc.cpp:230 rc.cpp:233
 msgid "..."
@@ -785,36 +804,36 @@ msgstr ""
 msgid "Hide"
 msgstr "Video"
 
-#: platform/audioclipslistengine.cpp:107 platform/audioclipslistengine.cpp:131
-#: platform/videolistengine.cpp:176
+#: platform/audioclipslistengine.cpp:86 platform/audioclipslistengine.cpp:125
+#: platform/videolistengine.cpp:117
 #, kde-format
 msgid "1 clip"
 msgid_plural "%1 clips"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/audiostreamlistengine.cpp:103
-#: platform/audiostreamlistengine.cpp:134
+#: platform/audiostreamlistengine.cpp:85
+#: platform/audiostreamlistengine.cpp:131
 #, fuzzy, kde-format
 msgid "1 stream"
 msgid_plural "%1 streams"
 msgstr[0] "1 Stück"
 msgstr[1] "%1 Stück"
 
-#: platform/audiostreamlistengine.cpp:108
+#: platform/audiostreamlistengine.cpp:90
 msgid "Create new audio stream item"
 msgstr ""
 
-#: platform/audiostreamlistengine.cpp:155
+#: platform/audiostreamlistengine.cpp:152
 #, fuzzy
 msgid "Untitled Audio Stream"
 msgstr "Audiostreams"
 
-#: platform/audiostreamlistengine.cpp:156
+#: platform/audiostreamlistengine.cpp:153
 msgid "Select this item, click Info then Edit to enter audio stream info"
 msgstr ""
 
-#: platform/audiostreamlistengine.cpp:165
+#: platform/audiostreamlistengine.cpp:162
 #, fuzzy
 msgid "New Audio Stream"
 msgstr "Audiostreams"
@@ -855,9 +874,9 @@ msgid "Video Files"
 msgstr "Videodateien"
 
 #: platform/filelistengine.cpp:87 platform/filelistengine.cpp:98
-#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:381
-#: platform/savedlistsengine.cpp:102 platform/videolistengine.cpp:451
-#: platform/videolistengine.cpp:517
+#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:415
+#: platform/savedlistsengine.cpp:166 platform/videolistengine.cpp:566
+#: platform/videolistengine.cpp:676
 #, kde-format
 msgid "1 item"
 msgid_plural "%1 items"
@@ -888,30 +907,20 @@ msgstr "Öffne Bild(er)"
 msgid "Open folder containing image file(s)"
 msgstr "Öffne Ordner mit Bild(ern)"
 
-#: platform/filelistengine.cpp:326
+#: platform/filelistengine.cpp:334
 msgid "Audio Clip"
 msgstr "Audio Clip"
 
-#: platform/filelistengine.cpp:413
-#, kde-format
-msgid "%1 - Episode %2"
-msgstr "%1 - Episode %2"
-
-#: platform/filelistengine.cpp:415
-#, kde-format
-msgid "Episode %1"
-msgstr "Episode %1"
-
-#: platform/mediaitemmodel.cpp:380
+#: platform/mediaitemmodel.cpp:413
 #, fuzzy, kde-format
 msgid "Multiple %1"
 msgstr "Titel"
 
-#: platform/mediaitemmodel.cpp:532
+#: platform/mediaitemmodel.cpp:572
 msgid "No results"
 msgstr ""
 
-#: platform/mediaitemmodel.cpp:563
+#: platform/mediaitemmodel.cpp:603
 #, fuzzy
 msgid "Add to playlist/Remove from playlist"
 msgstr "Von Wiedergabeliste entfernen"
@@ -920,20 +929,20 @@ msgstr "Von Wiedergabeliste entfernen"
 msgid "Files and Folders"
 msgstr "Dateien und Ordner"
 
-#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:222
+#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:132
 msgid "Artists"
 msgstr "Künstler"
 
-#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:262
+#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:192
 msgid "Albums"
 msgstr "Alben"
 
-#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:353
+#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:331
 msgid "Songs"
 msgstr "Lieder"
 
 #: platform/medialistsengine.cpp:69 platform/medialistsengine.cpp:159
-#: platform/musiclistengine.cpp:306 platform/videolistengine.cpp:402
+#: platform/musiclistengine.cpp:256 platform/videolistengine.cpp:467
 msgid "Genres"
 msgstr "Genre"
 
@@ -946,132 +955,141 @@ msgid "Audio Streams"
 msgstr "Audiostreams"
 
 #: platform/medialistsengine.cpp:100 platform/medialistsengine.cpp:190
-#: platform/semanticslistengine.cpp:89
+#: platform/semanticslistengine.cpp:107
 msgid "Frequently Played"
 msgstr "Oft gespielt"
 
 #: platform/medialistsengine.cpp:104 platform/medialistsengine.cpp:194
-#: platform/semanticslistengine.cpp:115
+#: platform/semanticslistengine.cpp:147
 msgid "Recently Played"
 msgstr "Vor kurzem gespielt"
 
 #: platform/medialistsengine.cpp:108 platform/medialistsengine.cpp:198
-#: platform/semanticslistengine.cpp:140
+#: platform/semanticslistengine.cpp:188
 msgid "Highest Rated"
 msgstr "Höchst bewertet"
 
-#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:369
+#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:426
 msgid "Movies"
 msgstr "Filme"
 
-#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:224
+#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:181
 msgid "TV Shows"
 msgstr "TV Shows"
 
-#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:175
+#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:116
 msgid "Video Clips"
 msgstr "Video Clips"
 
-#: platform/musiclistengine.cpp:224
+#: platform/musiclistengine.cpp:134
 #, fuzzy, kde-format
 msgid "Artists - %1"
 msgstr "Künstler"
 
-#: platform/musiclistengine.cpp:226
+#: platform/musiclistengine.cpp:136
 #, fuzzy, kde-format
 msgid "1 artist"
 msgid_plural "%1 artists"
 msgstr[0] "Künstler"
 msgstr[1] "Künstler"
 
-#: platform/musiclistengine.cpp:264 platform/musiclistengine.cpp:267
+#: platform/musiclistengine.cpp:194 platform/musiclistengine.cpp:197
 #, fuzzy, kde-format
 msgid "Albums - %1"
 msgstr "Alben"
 
-#: platform/musiclistengine.cpp:270
+#: platform/musiclistengine.cpp:200
 #, kde-format
 msgid "Albums - %1 - %2"
 msgstr ""
 
-#: platform/musiclistengine.cpp:273
+#: platform/musiclistengine.cpp:203
 #, fuzzy, kde-format
 msgid "1 album"
 msgid_plural "%1 albums"
 msgstr[0] "Album"
 msgstr[1] "Album"
 
-#: platform/musiclistengine.cpp:307 platform/videolistengine.cpp:403
+#: platform/musiclistengine.cpp:257 platform/videolistengine.cpp:468
 #, fuzzy, kde-format
 msgid "1 genre"
 msgid_plural "%1 genres"
 msgstr[0] "Genre"
 msgstr[1] "Genre"
 
-#: platform/musiclistengine.cpp:355 platform/musiclistengine.cpp:383
+#: platform/musiclistengine.cpp:333 platform/musiclistengine.cpp:388
 #, kde-format
 msgid "1 song"
 msgid_plural "%1 songs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:216 platform/videolistengine.cpp:332
+#: platform/videolistengine.cpp:173 platform/videolistengine.cpp:358
 msgid "Uncategorized TV Shows"
 msgstr ""
 
-#: platform/videolistengine.cpp:225
+#: platform/videolistengine.cpp:182
 #, kde-format
 msgid "1 show"
 msgid_plural "%1 shows"
 msgstr[0] ""
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:253
+#: platform/videolistengine.cpp:230
 #, fuzzy, kde-format
 msgid "Season %1"
 msgstr "Staffel"
 
-#: platform/videolistengine.cpp:272
+#: platform/videolistengine.cpp:254
 msgid "Uncategorized seasons"
 msgstr ""
 
-#: platform/videolistengine.cpp:279
+#: platform/videolistengine.cpp:261
 #, fuzzy, kde-format
 msgid "Seasons - %1"
 msgstr "Staffel"
 
-#: platform/videolistengine.cpp:280
+#: platform/videolistengine.cpp:262
 #, fuzzy, kde-format
 msgid "1 season"
 msgid_plural "%1 seasons"
 msgstr[0] "Staffel"
 msgstr[1] "Staffel"
 
-#: platform/videolistengine.cpp:334
+#: platform/videolistengine.cpp:360
 #, fuzzy, kde-format
 msgid "%1 - Season %2"
 msgstr "%1 - Episode %2"
 
-#: platform/videolistengine.cpp:336
+#: platform/videolistengine.cpp:362
 #, kde-format
 msgid "%1 - Uncategorized Seasons"
 msgstr ""
 
-#: platform/videolistengine.cpp:338
+#: platform/videolistengine.cpp:364
 #, fuzzy, kde-format
 msgid "1 episode"
 msgid_plural "%1 episodes"
 msgstr[0] "Episode"
 msgstr[1] "Episode"
 
-#: platform/videolistengine.cpp:371
+#: platform/videolistengine.cpp:428
 #, fuzzy, kde-format
 msgid "Movies - %1"
 msgstr "Filme"
 
-#: platform/videolistengine.cpp:373
+#: platform/videolistengine.cpp:430
 #, fuzzy, kde-format
 msgid "1 movie"
 msgid_plural "%1 movies"
 msgstr[0] "1 Stück"
 msgstr[1] "%1 Stück"
+
+#~ msgid "%1 - Episode %2"
+#~ msgstr "%1 - Episode %2"
+
+#~ msgid "Episode %1"
+#~ msgstr "Episode %1"
+
+#~ msgid "Collection/Series Name"
+#~ msgstr "Sammlung/Serie"
diff --git a/translations/fr/bangarang.po b/translations/fr/bangarang.po
index 8c77adb..3c8ea26 100644
--- a/translations/fr/bangarang.po
+++ b/translations/fr/bangarang.po
@@ -3,7 +3,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n"
-"POT-Creation-Date: 2009-12-21 22:58-0800\n"
+"POT-Creation-Date: 2010-01-05 21:18-0800\n"
 "PO-Revision-Date: 2009-12-05 13:09-0500\n"
 "Last-Translator: Ryan Kavanagh <ryanakca at kubuntu.org>\n"
 "Language-Team: Français <kde-i18n-doc at kde.org>\n"
@@ -25,21 +25,21 @@ msgstr "Lire l'élément suivant"
 msgid "Play previous"
 msgstr "Lire l'élément précédent"
 
-#: actionsmanager.cpp:75 mainwindow.cpp:1087
+#: actionsmanager.cpp:75 mainwindow.cpp:1118
 msgid "Play all"
 msgstr "Lire tous les éléments"
 
-#. i18n: file: mainwindow.ui:1811
+#. i18n: file: mainwindow.ui:1820
 #. i18n: ectx: property (text), widget (QPushButton, playAll)
 #: actionsmanager.cpp:77 rc.cpp:158
 msgid "Play All"
 msgstr "Lire tous les éléments"
 
-#: actionsmanager.cpp:80 mainwindow.cpp:1089
+#: actionsmanager.cpp:80 mainwindow.cpp:1120
 msgid "Play selected"
 msgstr "Lire les sélectionnés"
 
-#. i18n: file: mainwindow.ui:1837
+#. i18n: file: mainwindow.ui:1846
 #. i18n: ectx: property (text), widget (QPushButton, playSelected)
 #: actionsmanager.cpp:82 rc.cpp:164
 msgid "Play Selected"
@@ -57,7 +57,7 @@ msgstr "Retirer de la liste de lecture"
 msgid "Hide controls"
 msgstr "Cacher les contrôles"
 
-#: actionsmanager.cpp:106 actionsmanager.cpp:381 mainwindow.cpp:348
+#: actionsmanager.cpp:106 actionsmanager.cpp:390 mainwindow.cpp:364
 #, fuzzy
 msgid "Show Video Settings"
 msgstr "Réglages audios ici!"
@@ -99,79 +99,98 @@ msgstr "Nom de la nouvelle liste"
 msgid "Show items"
 msgstr "Un élément"
 
-#: actionsmanager.cpp:158
+#: actionsmanager.cpp:157
+#, fuzzy
+msgid "Show info"
+msgstr "Afficher les prochaines pistes"
+
+#: actionsmanager.cpp:162
 msgid "Configure shortcuts..."
 msgstr "Configurer les raccourcis claviers..."
 
-#: actionsmanager.cpp:377
+#: actionsmanager.cpp:386
 #, fuzzy
 msgid "Hide Video Settings"
 msgstr "Réglages audios ici!"
 
-#. i18n: file: mainwindow.ui:1673
+#. i18n: file: mainwindow.ui:1586
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:239 rc.cpp:143
+#: infomanager.cpp:267 rc.cpp:140
 msgid "Title"
 msgstr "Titre"
 
-#: infomanager.cpp:241
+#: infomanager.cpp:269
 msgid "Artwork"
 msgstr "Pochette"
 
-#: infomanager.cpp:243
+#: infomanager.cpp:271
 msgid "Description"
 msgstr "Description"
 
-#: infomanager.cpp:245
+#: infomanager.cpp:273
 msgid "Location"
 msgstr "Emplacement : "
 
-#: infomanager.cpp:287 infomanager.cpp:345
+#: infomanager.cpp:327 infomanager.cpp:385
 msgid "Type"
 msgstr "Type"
 
-#. i18n: file: mainwindow.ui:1681
+#. i18n: file: mainwindow.ui:1594
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:306 rc.cpp:146
+#: infomanager.cpp:346 rc.cpp:143
 msgid "Artist"
 msgstr "Artiste"
 
-#: infomanager.cpp:308
+#: infomanager.cpp:348
 msgid "Album"
 msgstr "Album"
 
-#: infomanager.cpp:310 infomanager.cpp:366 infomanager.cpp:396
+#: infomanager.cpp:350 infomanager.cpp:404 infomanager.cpp:453
 msgid "Year"
 msgstr "Année"
 
-#: infomanager.cpp:312
+#: infomanager.cpp:352
 msgid "Track Number"
 msgstr "Numéro de la piste"
 
-#: infomanager.cpp:314 infomanager.cpp:368
+#: infomanager.cpp:354 infomanager.cpp:406 infomanager.cpp:455
 msgid "Genre"
 msgstr "Style"
 
-#: infomanager.cpp:364
-msgid "Collection/Series Name"
-msgstr "Nom de la collection / série"
+#: infomanager.cpp:408 infomanager.cpp:457
+msgid "Writer"
+msgstr ""
+
+#: infomanager.cpp:410 infomanager.cpp:459
+#, fuzzy
+msgid "Director"
+msgstr "Créateur"
 
-#: infomanager.cpp:391
+#: infomanager.cpp:412 infomanager.cpp:461
+msgid "Producer"
+msgstr ""
+
+#: infomanager.cpp:414 infomanager.cpp:463
+#, fuzzy
+msgid "Actor"
+msgstr "Pochette"
+
+#: infomanager.cpp:447
 msgid "Series Name"
 msgstr "Nom de la série"
 
-#: infomanager.cpp:393
+#: infomanager.cpp:449
 msgid "Season"
 msgstr "Saison"
 
-#: infomanager.cpp:395
+#: infomanager.cpp:451
 msgid "Episode"
 msgstr "Épisode"
 
 #. i18n: file: mainwindow.ui:23
 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass)
-#: main.cpp:29 mainwindow.cpp:274 mainwindow.cpp:551 mainwindow.cpp:924
-#: mainwindow.cpp:1098 rc.cpp:5
+#: main.cpp:29 mainwindow.cpp:289 mainwindow.cpp:567 mainwindow.cpp:955
+#: mainwindow.cpp:1129 rc.cpp:5
 msgid "Bangarang"
 msgstr "Bangarang"
 
@@ -239,15 +258,15 @@ msgstr "Lire un CD audio"
 msgid "Show Additional Debug Output"
 msgstr "Voir les informations de débogage"
 
-#: mainwindow.cpp:238 platform/medialistsengine.cpp:183
+#: mainwindow.cpp:244 platform/medialistsengine.cpp:183
 msgid "DVD Video"
 msgstr "Vidéo DVD"
 
-#: mainwindow.cpp:248 platform/medialistsengine.cpp:93
+#: mainwindow.cpp:254 platform/medialistsengine.cpp:93
 msgid "Audio CD"
 msgstr "CD audio"
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid ""
 "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media "
 "library, rating and play count functions will be unavailable."
@@ -256,164 +275,164 @@ msgstr ""
 "Nepomuk. La bibliothèque multimédia, les fonctions vote et nombre d'écoutes "
 "ne seront pas disponibles."
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid "Don't show this message again"
 msgstr "Ne plus afficher ce message"
 
-#: mainwindow.cpp:356
+#: mainwindow.cpp:372
 msgid "<b>Fullscreen</b><br>Click to exit fullscreen"
 msgstr "<b>Plein écran</b><br>Cliquer pour sortir du mode plein écran"
 
-#: mainwindow.cpp:363
+#: mainwindow.cpp:379
 msgid "Show fullscreen"
 msgstr "Plein écran"
 
-#: mainwindow.cpp:374 mainwindow.cpp:644
+#: mainwindow.cpp:390 mainwindow.cpp:668
 msgid "<b>Time remaining</b><br>Click to show elapsed time"
 msgstr "<b>Temps restant</b><br>Cliquer pour afficher le temps écoulé"
 
-#. i18n: file: mainwindow.ui:5535
+#. i18n: file: mainwindow.ui:5547
 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime)
-#: mainwindow.cpp:376 mainwindow.cpp:646 rc.cpp:215
+#: mainwindow.cpp:392 mainwindow.cpp:670 rc.cpp:215
 msgid "<b>Time elapsed</b><br>Click to show remaining time"
 msgstr "<b>Temps écoulé</b><br>Cliquer pour afficher le temps restant"
 
-#: mainwindow.cpp:385
+#: mainwindow.cpp:401
 msgid "<b>Paused</b><br>Hold to stop"
 msgstr "<b>Pause</b><br>Tenir pour arrêter"
 
-#. i18n: file: mainwindow.ui:253
+#. i18n: file: mainwindow.ui:262
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter)
-#: mainwindow.cpp:516 rc.cpp:11
+#: mainwindow.cpp:532 rc.cpp:11
 msgid "Search for audio"
 msgstr "Rechercher de l'audio"
 
-#: mainwindow.cpp:524
+#: mainwindow.cpp:540
 msgid "Search for video"
 msgstr "Recherche des vidéos"
 
-#. i18n: file: mainwindow.ui:5147
+#. i18n: file: mainwindow.ui:5156
 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist)
-#: mainwindow.cpp:547 rc.cpp:179
+#: mainwindow.cpp:563 rc.cpp:179
 msgid "Clear Playlist"
 msgstr "Nettoyer la liste de lecture"
 
-#: mainwindow.cpp:548
+#: mainwindow.cpp:564
 msgid "Are you sure you want to clear the current playlist?"
 msgstr "Voulez-vous vraiment effacer cette liste de lecture ?"
 
-#. i18n: file: mainwindow.ui:1202
+#. i18n: file: mainwindow.ui:1211
 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:553 mainwindow.cpp:654 mainwindow.cpp:656 mainwindow.cpp:926
+#: mainwindow.cpp:569 mainwindow.cpp:678 mainwindow.cpp:680 mainwindow.cpp:957
 #: rc.cpp:113
 msgid "Now Playing"
 msgstr "En cours de lecture"
 
-#: mainwindow.cpp:563
+#: mainwindow.cpp:579
 msgid "<b>Shuffle On</b><br>Click to turn off Shuffle"
 msgstr ""
 "<b>Mode aléatoire activé</b><br>Cliquer pour désactiver le mode aléatoire"
 
-#. i18n: file: mainwindow.ui:5203
+#. i18n: file: mainwindow.ui:5212
 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle)
-#: mainwindow.cpp:567 rc.cpp:188
+#: mainwindow.cpp:583 rc.cpp:188
 msgid "Turn on Shuffle"
 msgstr "Activer le mode aléatoire"
 
-#: mainwindow.cpp:578
+#: mainwindow.cpp:594
 msgid "<b>Repeat On</b><br>Click to turn off repeat"
 msgstr "<b>Mode répète activé</b><br>Cliquer pour désactiver le mode répète"
 
-#. i18n: file: mainwindow.ui:5174
+#. i18n: file: mainwindow.ui:5183
 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat)
-#: mainwindow.cpp:581 rc.cpp:182
+#: mainwindow.cpp:597 rc.cpp:182
 msgid "Turn on Repeat"
 msgstr "Activer le mode répète"
 
-#: mainwindow.cpp:590
+#: mainwindow.cpp:607
 msgid "<b>Showing Upcoming</b><br>Click to show playlist"
 msgstr ""
 "<b>Afficher les prochaines pistes</b><br>Cliquer pour afficher la liste de "
 "lecture"
 
-#: mainwindow.cpp:591
+#: mainwindow.cpp:608
 msgid "<b>Playlist</b>(Upcoming)"
 msgstr "<b>Liste de lecture</b>(Prochaines pistes)"
 
-#. i18n: file: mainwindow.ui:5092
+#. i18n: file: mainwindow.ui:5101
 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue)
-#: mainwindow.cpp:595 rc.cpp:173
+#: mainwindow.cpp:613 rc.cpp:173
 msgid "Show Upcoming"
 msgstr "Afficher les prochaines pistes"
 
-#: mainwindow.cpp:670
+#: mainwindow.cpp:694
 msgid "<b>Playing</b><br>Click to pause<br>Click and hold to stop"
 msgstr ""
 "<b>En cours de lecture</b><br>Cliquer pour mettre en pause<br>Cliquer et "
 "tenir pour arrêter"
 
-#: mainwindow.cpp:681
+#: mainwindow.cpp:705
 msgid "An error has been encountered during playback"
 msgstr ""
 
-#: mainwindow.cpp:701
+#: mainwindow.cpp:725
 msgid "Loading playlist..."
 msgstr "Chargement de la liste de lecture..."
 
-#: mainwindow.cpp:703
+#: mainwindow.cpp:727
 msgid "Buffering..."
 msgstr "Tamponnage..."
 
-#: mainwindow.cpp:705 platform/mediaitemmodel.cpp:501
+#: mainwindow.cpp:729 platform/mediaitemmodel.cpp:541
 msgid "Loading..."
 msgstr "Chargement..."
 
-#: mainwindow.cpp:717
+#: mainwindow.cpp:741
 msgid "<b>Muted</b><br>Click to restore volume"
 msgstr "<b>Muet</b><br>Cliquer pour restaurer le volume"
 
-#. i18n: file: mainwindow.ui:5661
+#. i18n: file: mainwindow.ui:5673
 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon)
-#: mainwindow.cpp:720 rc.cpp:221
+#: mainwindow.cpp:744 rc.cpp:221
 msgid "Mute volume"
 msgstr "Couper le volume"
 
-#: mainwindow.cpp:757
+#: mainwindow.cpp:781
 msgid "Updating..."
 msgstr "Actualisation..."
 
-#: mainwindow.cpp:763
+#: mainwindow.cpp:787
 msgid "Complete"
 msgstr ""
 
-#: mainwindow.cpp:769
+#: mainwindow.cpp:794
 msgid "Updated info for "
 msgstr "Mise à jour des données pour "
 
-#: mainwindow.cpp:775
+#: mainwindow.cpp:804
 msgid "Removed info for "
 msgstr "Supprimé les données pour "
 
-#. i18n: file: mainwindow.ui:5124
+#. i18n: file: mainwindow.ui:5133
 #. i18n: ectx: property (text), widget (QLabel, playlistName)
-#: mainwindow.cpp:879 rc.cpp:176
+#: mainwindow.cpp:910 rc.cpp:176
 msgid "<b>Playlist</b>"
 msgstr "<b>Liste de lecture</b>"
 
-#: mainwindow.cpp:882
+#: mainwindow.cpp:913
 #, kde-format
 msgid "1 item, %2"
 msgid_plural "%1 items, %2"
 msgstr[0] "Un élément, %2"
 msgstr[1] ""
 
-#. i18n: file: mainwindow.ui:1199
+#. i18n: file: mainwindow.ui:1208
 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:897 mainwindow.cpp:927 rc.cpp:110
+#: mainwindow.cpp:928 mainwindow.cpp:958 rc.cpp:110
 msgid "View Now Playing"
 msgstr "Afficher en cours de lecture"
 
-#: mainwindow.cpp:1099
+#: mainwindow.cpp:1130
 msgid "Entertainment... Now"
 msgstr "Divertissements... Maintenant"
 
@@ -427,292 +446,292 @@ msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "ryanakca at kubuntu.org"
 
-#. i18n: file: mainwindow.ui:149
+#. i18n: file: mainwindow.ui:158
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: mainwindow.ui:5405
+#. i18n: file: mainwindow.ui:5417
 #. i18n: ectx: property (text), widget (QToolButton, collectionButton)
 #: rc.cpp:8 rc.cpp:206
 msgid "Media Lists"
 msgstr "Listes de médias"
 
-#. i18n: file: mainwindow.ui:296
+#. i18n: file: mainwindow.ui:305
 #. i18n: ectx: attribute (label), widget (QWidget, AudioTool_2)
 #: rc.cpp:14
 msgid "Audio"
 msgstr "Audio"
 
-#. i18n: file: mainwindow.ui:364
+#. i18n: file: mainwindow.ui:373
 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList)
-#. i18n: file: mainwindow.ui:801
+#. i18n: file: mainwindow.ui:810
 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList)
 #: rc.cpp:17 rc.cpp:65
 #, fuzzy
 msgid "Add list"
 msgstr "Ajouter à la liste de"
 
-#. i18n: file: mainwindow.ui:381
+#. i18n: file: mainwindow.ui:390
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList)
-#. i18n: file: mainwindow.ui:818
+#. i18n: file: mainwindow.ui:827
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList)
 #: rc.cpp:20 rc.cpp:68
 #, fuzzy
 msgid "Remove list"
 msgstr "Retirer de la liste de lecture"
 
-#. i18n: file: mainwindow.ui:411
+#. i18n: file: mainwindow.ui:420
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList)
-#. i18n: file: mainwindow.ui:848
+#. i18n: file: mainwindow.ui:857
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList)
 #: rc.cpp:23 rc.cpp:71
 #, fuzzy
 msgid "Settings"
 msgstr "Réglages audios ici!"
 
-#. i18n: file: mainwindow.ui:460
+#. i18n: file: mainwindow.ui:469
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#. i18n: file: mainwindow.ui:897
+#. i18n: file: mainwindow.ui:906
 #. i18n: ectx: property (text), widget (QLabel, label_7)
 #: rc.cpp:26 rc.cpp:74
 #, fuzzy
 msgid "Add List"
 msgstr "Ajouter à la liste de"
 
-#. i18n: file: mainwindow.ui:477
+#. i18n: file: mainwindow.ui:486
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#. i18n: file: mainwindow.ui:914
+#. i18n: file: mainwindow.ui:923
 #. i18n: ectx: property (text), widget (QLabel, label_6)
 #: rc.cpp:29 rc.cpp:77
 #, fuzzy
 msgid "Source"
 msgstr "Tri"
 
-#. i18n: file: mainwindow.ui:499
+#. i18n: file: mainwindow.ui:508
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView)
-#. i18n: file: mainwindow.ui:940
+#. i18n: file: mainwindow.ui:949
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView)
 #: rc.cpp:32 rc.cpp:83
 msgid "Current View"
 msgstr "Vue en cours"
 
-#. i18n: file: mainwindow.ui:506
+#. i18n: file: mainwindow.ui:515
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection)
-#. i18n: file: mainwindow.ui:933
+#. i18n: file: mainwindow.ui:942
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection)
 #: rc.cpp:35 rc.cpp:80
 msgid "Current Selection"
 msgstr "Sélection courante"
 
-#. i18n: file: mainwindow.ui:513
+#. i18n: file: mainwindow.ui:522
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist)
-#. i18n: file: mainwindow.ui:947
+#. i18n: file: mainwindow.ui:956
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist)
 #: rc.cpp:38 rc.cpp:86
 msgid "Current Playlist"
 msgstr "Liste de lecture en cours"
 
-#. i18n: file: mainwindow.ui:523
+#. i18n: file: mainwindow.ui:532
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName)
-#. i18n: file: mainwindow.ui:957
+#. i18n: file: mainwindow.ui:966
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName)
 #: rc.cpp:41 rc.cpp:89
 msgid "New List Name"
 msgstr "Nom de la nouvelle liste"
 
-#. i18n: file: mainwindow.ui:545
+#. i18n: file: mainwindow.ui:554
 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList)
-#. i18n: file: mainwindow.ui:689
+#. i18n: file: mainwindow.ui:698
 #. i18n: ectx: property (text), widget (QPushButton, aslsSave)
-#. i18n: file: mainwindow.ui:976
+#. i18n: file: mainwindow.ui:985
 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList)
-#. i18n: file: mainwindow.ui:1096
+#. i18n: file: mainwindow.ui:1105
 #. i18n: ectx: property (text), widget (QPushButton, vslsSave)
-#. i18n: file: mainwindow.ui:1782
+#. i18n: file: mainwindow.ui:1791
 #. i18n: ectx: property (text), widget (QPushButton, saveInfo)
 #: rc.cpp:44 rc.cpp:56 rc.cpp:92 rc.cpp:104 rc.cpp:152
 msgid "Save"
 msgstr "Enregistrer"
 
-#. i18n: file: mainwindow.ui:599
+#. i18n: file: mainwindow.ui:608
 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList)
-#. i18n: file: mainwindow.ui:719
+#. i18n: file: mainwindow.ui:728
 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel)
-#. i18n: file: mainwindow.ui:1126
+#. i18n: file: mainwindow.ui:1135
 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel)
 #: rc.cpp:47 rc.cpp:59 rc.cpp:107
 msgid "Return to Lists"
 msgstr "Retour aux listes"
 
-#. i18n: file: mainwindow.ui:638
+#. i18n: file: mainwindow.ui:647
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#. i18n: file: mainwindow.ui:1045
+#. i18n: file: mainwindow.ui:1054
 #. i18n: ectx: property (text), widget (QLabel, label_11)
 #: rc.cpp:50 rc.cpp:98
 #, fuzzy
 msgid "Saved List Settings"
 msgstr "Réglages audios ici!"
 
-#. i18n: file: mainwindow.ui:664
+#. i18n: file: mainwindow.ui:673
 #. i18n: ectx: property (text), widget (QLabel, label_9)
-#. i18n: file: mainwindow.ui:1071
+#. i18n: file: mainwindow.ui:1080
 #. i18n: ectx: property (text), widget (QLabel, label_10)
 #: rc.cpp:53 rc.cpp:101
 msgid "Name"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:748
+#. i18n: file: mainwindow.ui:757
 #. i18n: ectx: attribute (label), widget (QWidget, videoTool_2)
 #: rc.cpp:62
 msgid "Video"
 msgstr "Vidéo"
 
-#. i18n: file: mainwindow.ui:1009
+#. i18n: file: mainwindow.ui:1018
 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList)
 #: rc.cpp:95
 msgid "Return To Lists"
 msgstr "Retour aux listes"
 
-#. i18n: file: mainwindow.ui:1352
+#. i18n: file: mainwindow.ui:1361
 #. i18n: ectx: property (text), widget (QLabel, listTitle)
 #: rc.cpp:116
 msgid "List Title"
 msgstr "Titre de la liste"
 
-#. i18n: file: mainwindow.ui:1365
+#. i18n: file: mainwindow.ui:1374
 #. i18n: ectx: property (text), widget (QLabel, listSummary)
 #: rc.cpp:119
 msgid "Summary"
 msgstr "Résumé"
 
-#. i18n: file: mainwindow.ui:1375
+#. i18n: file: mainwindow.ui:1384
 #. i18n: ectx: property (text), widget (QToolButton, sortList)
 #: rc.cpp:122
 msgid "Sort"
 msgstr "Tri"
 
-#. i18n: file: mainwindow.ui:1399
+#. i18n: file: mainwindow.ui:1408
 #. i18n: ectx: property (text), widget (QToolButton, showInfo)
 #: rc.cpp:125
 msgid "Info"
 msgstr "Informations"
 
-#. i18n: file: mainwindow.ui:1514
-#. i18n: ectx: property (text), widget (QLabel, notificationText)
-#: rc.cpp:128
-msgid "Notification Text"
-msgstr "Texte de notification"
-
-#. i18n: file: mainwindow.ui:1589
+#. i18n: file: mainwindow.ui:1502
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: rc.cpp:131
+#: rc.cpp:128
 msgid "Information"
 msgstr "Information"
 
-#. i18n: file: mainwindow.ui:1596
+#. i18n: file: mainwindow.ui:1509
 #. i18n: ectx: property (text), widget (QToolButton, editInfo)
-#: rc.cpp:134
+#: rc.cpp:131
 msgid "Edit"
 msgstr "Modifier"
 
-#. i18n: file: mainwindow.ui:1663
+#. i18n: file: mainwindow.ui:1576
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:137
+#: rc.cpp:134
 msgid "1"
 msgstr "1"
 
-#. i18n: file: mainwindow.ui:1668
+#. i18n: file: mainwindow.ui:1581
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:140
+#: rc.cpp:137
 msgid "2"
 msgstr "2"
 
-#. i18n: file: mainwindow.ui:1747
+#. i18n: file: mainwindow.ui:1663
+#. i18n: ectx: property (text), widget (QLabel, notificationText)
+#: rc.cpp:146
+msgid "Notification Text"
+msgstr "Texte de notification"
+
+#. i18n: file: mainwindow.ui:1756
 #. i18n: ectx: property (text), widget (QToolButton, previous)
 #: rc.cpp:149
 msgid "Previous"
 msgstr "Précédent"
 
-#. i18n: file: mainwindow.ui:1805
+#. i18n: file: mainwindow.ui:1814
 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll)
 #: rc.cpp:155
 msgid "Play all media in list"
 msgstr "Lire tout les médias dans la liste"
 
-#. i18n: file: mainwindow.ui:1834
+#. i18n: file: mainwindow.ui:1843
 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected)
 #: rc.cpp:161
 msgid "Play selected media in list"
 msgstr "Lire les médias sélectionnés dans la liste"
 
-#. i18n: file: mainwindow.ui:2346
+#. i18n: file: mainwindow.ui:2355
 #. i18n: ectx: property (text), widget (QLabel, playbackMessage)
 #: rc.cpp:167
 msgid "Playback message"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:2375
+#. i18n: file: mainwindow.ui:2384
 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist)
 #: rc.cpp:170
 msgid "Playlist"
 msgstr "Liste de lecture"
 
-#. i18n: file: mainwindow.ui:5177
+#. i18n: file: mainwindow.ui:5186
 #. i18n: ectx: property (text), widget (QToolButton, repeat)
-#. i18n: file: mainwindow.ui:5206
+#. i18n: file: mainwindow.ui:5215
 #. i18n: ectx: property (text), widget (QToolButton, shuffle)
-#. i18n: file: mainwindow.ui:5449
+#. i18n: file: mainwindow.ui:5461
 #. i18n: ectx: property (text), widget (SToolButton, fullScreen)
 #: rc.cpp:185 rc.cpp:191 rc.cpp:212
 msgid "[ ]"
 msgstr "[]"
 
-#. i18n: file: mainwindow.ui:5306
+#. i18n: file: mainwindow.ui:5318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
 #: rc.cpp:194
 #, fuzzy
 msgid "Video Settings"
 msgstr "Réglages audios ici!"
 
-#. i18n: file: mainwindow.ui:5335
+#. i18n: file: mainwindow.ui:5347
 #. i18n: ectx: property (text), widget (QPushButton, saveShortCuts)
 #: rc.cpp:197
 msgid "Save Shortcuts"
 msgstr "Enregistrer les raccourcis claviers"
 
-#. i18n: file: mainwindow.ui:5342
+#. i18n: file: mainwindow.ui:5354
 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts)
 #: rc.cpp:200
 msgid "Cancel"
 msgstr "Annuler"
 
-#. i18n: file: mainwindow.ui:5402
+#. i18n: file: mainwindow.ui:5414
 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton)
 #: rc.cpp:203
 msgid "View Media Lists"
 msgstr "Afficher les listes de médias"
 
-#. i18n: file: mainwindow.ui:5446
+#. i18n: file: mainwindow.ui:5458
 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen)
 #: rc.cpp:209
 msgid "Show full screen"
 msgstr "Afficher le plein écran"
 
-#. i18n: file: mainwindow.ui:5538
+#. i18n: file: mainwindow.ui:5550
 #. i18n: ectx: property (text), widget (QToolButton, seekTime)
 #: rc.cpp:218
 msgid "03:00"
 msgstr "03:00"
 
-#. i18n: file: mainwindow.ui:5699
+#. i18n: file: mainwindow.ui:5711
 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider)
 #: rc.cpp:224
 msgid "Volume"
 msgstr "Volume"
 
-#. i18n: file: mainwindow.ui:5725
+#. i18n: file: mainwindow.ui:5737
 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious)
-#. i18n: file: mainwindow.ui:5754
+#. i18n: file: mainwindow.ui:5766
 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause)
-#. i18n: file: mainwindow.ui:5774
+#. i18n: file: mainwindow.ui:5786
 #. i18n: ectx: property (text), widget (QToolButton, mediaNext)
 #: rc.cpp:227 rc.cpp:230 rc.cpp:233
 msgid "..."
@@ -776,37 +795,37 @@ msgstr ""
 msgid "Hide"
 msgstr "Vidéo"
 
-#: platform/audioclipslistengine.cpp:107 platform/audioclipslistengine.cpp:131
-#: platform/videolistengine.cpp:176
+#: platform/audioclipslistengine.cpp:86 platform/audioclipslistengine.cpp:125
+#: platform/videolistengine.cpp:117
 #, kde-format
 msgid "1 clip"
 msgid_plural "%1 clips"
 msgstr[0] "Un clip"
 msgstr[1] ""
 
-#: platform/audiostreamlistengine.cpp:103
-#: platform/audiostreamlistengine.cpp:134
+#: platform/audiostreamlistengine.cpp:85
+#: platform/audiostreamlistengine.cpp:131
 #, kde-format
 msgid "1 stream"
 msgid_plural "%1 streams"
 msgstr[0] "Un flux"
 msgstr[1] ""
 
-#: platform/audiostreamlistengine.cpp:108
+#: platform/audiostreamlistengine.cpp:90
 msgid "Create new audio stream item"
 msgstr "Créer un nouveau élément de flux audio"
 
-#: platform/audiostreamlistengine.cpp:155
+#: platform/audiostreamlistengine.cpp:152
 msgid "Untitled Audio Stream"
 msgstr "Flux audio sans titre"
 
-#: platform/audiostreamlistengine.cpp:156
+#: platform/audiostreamlistengine.cpp:153
 msgid "Select this item, click Info then Edit to enter audio stream info"
 msgstr ""
 "Sélectionnez cet élément, cliquez Info et Editer pour entrer les détails du "
 "flux audio"
 
-#: platform/audiostreamlistengine.cpp:165
+#: platform/audiostreamlistengine.cpp:162
 msgid "New Audio Stream"
 msgstr "Nouveau flux audio"
 
@@ -846,9 +865,9 @@ msgid "Video Files"
 msgstr "Fichiers vidéo"
 
 #: platform/filelistengine.cpp:87 platform/filelistengine.cpp:98
-#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:381
-#: platform/savedlistsengine.cpp:102 platform/videolistengine.cpp:451
-#: platform/videolistengine.cpp:517
+#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:415
+#: platform/savedlistsengine.cpp:166 platform/videolistengine.cpp:566
+#: platform/videolistengine.cpp:676
 #, kde-format
 msgid "1 item"
 msgid_plural "%1 items"
@@ -879,30 +898,20 @@ msgstr "Ouvrir des images"
 msgid "Open folder containing image file(s)"
 msgstr "Ouvrir un dossier qui contient des images"
 
-#: platform/filelistengine.cpp:326
+#: platform/filelistengine.cpp:334
 msgid "Audio Clip"
 msgstr "Clip audio"
 
-#: platform/filelistengine.cpp:413
-#, kde-format
-msgid "%1 - Episode %2"
-msgstr "%1 - Épisode %2"
-
-#: platform/filelistengine.cpp:415
-#, kde-format
-msgid "Episode %1"
-msgstr "Épisode %1"
-
-#: platform/mediaitemmodel.cpp:380
+#: platform/mediaitemmodel.cpp:413
 #, fuzzy, kde-format
 msgid "Multiple %1"
 msgstr "Titre %1"
 
-#: platform/mediaitemmodel.cpp:532
+#: platform/mediaitemmodel.cpp:572
 msgid "No results"
 msgstr ""
 
-#: platform/mediaitemmodel.cpp:563
+#: platform/mediaitemmodel.cpp:603
 msgid "Add to playlist/Remove from playlist"
 msgstr "Ajouter à la liste de lecture/Retirer de la liste de lecture"
 
@@ -910,20 +919,20 @@ msgstr "Ajouter à la liste de lecture/Retirer de la liste de lecture"
 msgid "Files and Folders"
 msgstr "Fichiers et dossiers"
 
-#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:222
+#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:132
 msgid "Artists"
 msgstr "Artistes"
 
-#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:262
+#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:192
 msgid "Albums"
 msgstr "Albums"
 
-#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:353
+#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:331
 msgid "Songs"
 msgstr "Chansons"
 
 #: platform/medialistsengine.cpp:69 platform/medialistsengine.cpp:159
-#: platform/musiclistengine.cpp:306 platform/videolistengine.cpp:402
+#: platform/musiclistengine.cpp:256 platform/videolistengine.cpp:467
 msgid "Genres"
 msgstr "Styles"
 
@@ -936,135 +945,144 @@ msgid "Audio Streams"
 msgstr "Flux audio"
 
 #: platform/medialistsengine.cpp:100 platform/medialistsengine.cpp:190
-#: platform/semanticslistengine.cpp:89
+#: platform/semanticslistengine.cpp:107
 msgid "Frequently Played"
 msgstr "Écoutés fréquemment"
 
 #: platform/medialistsengine.cpp:104 platform/medialistsengine.cpp:194
-#: platform/semanticslistengine.cpp:115
+#: platform/semanticslistengine.cpp:147
 msgid "Recently Played"
 msgstr "Écoutés récemment"
 
 #: platform/medialistsengine.cpp:108 platform/medialistsengine.cpp:198
-#: platform/semanticslistengine.cpp:140
+#: platform/semanticslistengine.cpp:188
 msgid "Highest Rated"
 msgstr "Plus de votes"
 
-#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:369
+#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:426
 msgid "Movies"
 msgstr "Films"
 
-#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:224
+#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:181
 msgid "TV Shows"
 msgstr "Émissions de télé"
 
-#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:175
+#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:116
 msgid "Video Clips"
 msgstr "Clips vidéo"
 
-#: platform/musiclistengine.cpp:224
+#: platform/musiclistengine.cpp:134
 #, kde-format
 msgid "Artists - %1"
 msgstr "Artistes - %1"
 
-#: platform/musiclistengine.cpp:226
+#: platform/musiclistengine.cpp:136
 #, kde-format
 msgid "1 artist"
 msgid_plural "%1 artists"
 msgstr[0] "Un artiste"
 msgstr[1] ""
 
-#: platform/musiclistengine.cpp:264 platform/musiclistengine.cpp:267
+#: platform/musiclistengine.cpp:194 platform/musiclistengine.cpp:197
 #, kde-format
 msgid "Albums - %1"
 msgstr "Albums - %1"
 
-#: platform/musiclistengine.cpp:270
+#: platform/musiclistengine.cpp:200
 #, kde-format
 msgid "Albums - %1 - %2"
 msgstr "Albums - %1 - %2"
 
-#: platform/musiclistengine.cpp:273
+#: platform/musiclistengine.cpp:203
 #, kde-format
 msgid "1 album"
 msgid_plural "%1 albums"
 msgstr[0] "Un album"
 msgstr[1] ""
 
-#: platform/musiclistengine.cpp:307 platform/videolistengine.cpp:403
+#: platform/musiclistengine.cpp:257 platform/videolistengine.cpp:468
 #, kde-format
 msgid "1 genre"
 msgid_plural "%1 genres"
 msgstr[0] "Un style"
 msgstr[1] ""
 
-#: platform/musiclistengine.cpp:355 platform/musiclistengine.cpp:383
+#: platform/musiclistengine.cpp:333 platform/musiclistengine.cpp:388
 #, kde-format
 msgid "1 song"
 msgid_plural "%1 songs"
 msgstr[0] "Une chanson"
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:216 platform/videolistengine.cpp:332
+#: platform/videolistengine.cpp:173 platform/videolistengine.cpp:358
 msgid "Uncategorized TV Shows"
 msgstr "Émissions de télé sans catégories"
 
-#: platform/videolistengine.cpp:225
+#: platform/videolistengine.cpp:182
 #, kde-format
 msgid "1 show"
 msgid_plural "%1 shows"
 msgstr[0] "Une émission"
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:253
+#: platform/videolistengine.cpp:230
 #, kde-format
 msgid "Season %1"
 msgstr "Saison %1"
 
-#: platform/videolistengine.cpp:272
+#: platform/videolistengine.cpp:254
 msgid "Uncategorized seasons"
 msgstr "Saisons sans catégories"
 
-#: platform/videolistengine.cpp:279
+#: platform/videolistengine.cpp:261
 #, fuzzy, kde-format
 msgid "Seasons - %1"
 msgstr "Saison %1"
 
-#: platform/videolistengine.cpp:280
+#: platform/videolistengine.cpp:262
 #, kde-format
 msgid "1 season"
 msgid_plural "%1 seasons"
 msgstr[0] "Une saison"
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:334
+#: platform/videolistengine.cpp:360
 #, kde-format
 msgid "%1 - Season %2"
 msgstr "%1 - Saison %2"
 
-#: platform/videolistengine.cpp:336
+#: platform/videolistengine.cpp:362
 #, kde-format
 msgid "%1 - Uncategorized Seasons"
 msgstr "%1 - Saisons sans catégories"
 
-#: platform/videolistengine.cpp:338
+#: platform/videolistengine.cpp:364
 #, kde-format
 msgid "1 episode"
 msgid_plural "%1 episodes"
 msgstr[0] "Une épisode"
 msgstr[1] ""
 
-#: platform/videolistengine.cpp:371
+#: platform/videolistengine.cpp:428
 #, kde-format
 msgid "Movies - %1"
 msgstr "Films - %1"
 
-#: platform/videolistengine.cpp:373
+#: platform/videolistengine.cpp:430
 #, kde-format
 msgid "1 movie"
 msgid_plural "%1 movies"
 msgstr[0] "Un film"
 msgstr[1] ""
 
+#~ msgid "%1 - Episode %2"
+#~ msgstr "%1 - Épisode %2"
+
+#~ msgid "Episode %1"
+#~ msgstr "Épisode %1"
+
+#~ msgid "Collection/Series Name"
+#~ msgstr "Nom de la collection / série"
+
 #~ msgid "buttonGroup"
 #~ msgstr "buttonGroup"
diff --git a/translations/merge.sh b/translations/merge.sh
index 0253538..7a28734 100644
--- a/translations/merge.sh
+++ b/translations/merge.sh
@@ -4,3 +4,4 @@
 msgmerge -U nl/bangarang.po bangarang.pot
 msgmerge -U de/bangarang.po bangarang.pot
 msgmerge -U fr/bangarang.po bangarang.pot
+msgmerge -U zh_CN/bangarang.po bangarang.pot
diff --git a/translations/nl/bangarang.po b/translations/nl/bangarang.po
index 357e6dc..4b75c4d 100644
--- a/translations/nl/bangarang.po
+++ b/translations/nl/bangarang.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n"
-"POT-Creation-Date: 2009-12-21 22:58-0800\n"
+"POT-Creation-Date: 2010-01-05 21:18-0800\n"
 "PO-Revision-Date: 2009-12-12 11:28+0100\n"
 "Last-Translator: Kristof Bal <kristof.bal at gmail.com>\n"
 "Language-Team: Dutch <kde-i18n-nl at kde.org>\n"
@@ -28,21 +28,21 @@ msgstr "Volgende afspelen"
 msgid "Play previous"
 msgstr "Vorige afspelen"
 
-#: actionsmanager.cpp:75 mainwindow.cpp:1087
+#: actionsmanager.cpp:75 mainwindow.cpp:1118
 msgid "Play all"
 msgstr "Alles afspelen"
 
-#. i18n: file: mainwindow.ui:1811
+#. i18n: file: mainwindow.ui:1820
 #. i18n: ectx: property (text), widget (QPushButton, playAll)
 #: actionsmanager.cpp:77 rc.cpp:158
 msgid "Play All"
 msgstr "Alles afspelen"
 
-#: actionsmanager.cpp:80 mainwindow.cpp:1089
+#: actionsmanager.cpp:80 mainwindow.cpp:1120
 msgid "Play selected"
 msgstr "Geselecteerde afspelen"
 
-#. i18n: file: mainwindow.ui:1837
+#. i18n: file: mainwindow.ui:1846
 #. i18n: ectx: property (text), widget (QPushButton, playSelected)
 #: actionsmanager.cpp:82 rc.cpp:164
 msgid "Play Selected"
@@ -60,7 +60,7 @@ msgstr "Uit afspeellijst verwijderen"
 msgid "Hide controls"
 msgstr "Bediening verbergen"
 
-#: actionsmanager.cpp:106 actionsmanager.cpp:381 mainwindow.cpp:348
+#: actionsmanager.cpp:106 actionsmanager.cpp:390 mainwindow.cpp:364
 msgid "Show Video Settings"
 msgstr "Video-instellingen tonen"
 
@@ -101,78 +101,97 @@ msgstr "Nieuwe naam van de lijst"
 msgid "Show items"
 msgstr "1 item"
 
-#: actionsmanager.cpp:158
+#: actionsmanager.cpp:157
+#, fuzzy
+msgid "Show info"
+msgstr "Volgende tonen"
+
+#: actionsmanager.cpp:162
 msgid "Configure shortcuts..."
 msgstr "Sneltoetsen instellen..."
 
-#: actionsmanager.cpp:377
+#: actionsmanager.cpp:386
 msgid "Hide Video Settings"
 msgstr "Video-instellingen verbergen"
 
-#. i18n: file: mainwindow.ui:1673
+#. i18n: file: mainwindow.ui:1586
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:239 rc.cpp:143
+#: infomanager.cpp:267 rc.cpp:140
 msgid "Title"
 msgstr "Titel"
 
-#: infomanager.cpp:241
+#: infomanager.cpp:269
 msgid "Artwork"
 msgstr "Illustraties"
 
-#: infomanager.cpp:243
+#: infomanager.cpp:271
 msgid "Description"
 msgstr "Beschrijving"
 
-#: infomanager.cpp:245
+#: infomanager.cpp:273
 msgid "Location"
 msgstr "Locatie"
 
-#: infomanager.cpp:287 infomanager.cpp:345
+#: infomanager.cpp:327 infomanager.cpp:385
 msgid "Type"
 msgstr "Type"
 
-#. i18n: file: mainwindow.ui:1681
+#. i18n: file: mainwindow.ui:1594
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:306 rc.cpp:146
+#: infomanager.cpp:346 rc.cpp:143
 msgid "Artist"
 msgstr "Artiest"
 
-#: infomanager.cpp:308
+#: infomanager.cpp:348
 msgid "Album"
 msgstr "Album"
 
-#: infomanager.cpp:310 infomanager.cpp:366 infomanager.cpp:396
+#: infomanager.cpp:350 infomanager.cpp:404 infomanager.cpp:453
 msgid "Year"
 msgstr "Jaar"
 
-#: infomanager.cpp:312
+#: infomanager.cpp:352
 msgid "Track Number"
 msgstr "Tracknummer"
 
-#: infomanager.cpp:314 infomanager.cpp:368
+#: infomanager.cpp:354 infomanager.cpp:406 infomanager.cpp:455
 msgid "Genre"
 msgstr "Genre"
 
-#: infomanager.cpp:364
-msgid "Collection/Series Name"
-msgstr "Naam van de verzameling/serie"
+#: infomanager.cpp:408 infomanager.cpp:457
+msgid "Writer"
+msgstr ""
+
+#: infomanager.cpp:410 infomanager.cpp:459
+#, fuzzy
+msgid "Director"
+msgstr "Maker"
 
-#: infomanager.cpp:391
+#: infomanager.cpp:412 infomanager.cpp:461
+msgid "Producer"
+msgstr ""
+
+#: infomanager.cpp:414 infomanager.cpp:463
+#, fuzzy
+msgid "Actor"
+msgstr "Illustraties"
+
+#: infomanager.cpp:447
 msgid "Series Name"
 msgstr "Naam van de serie"
 
-#: infomanager.cpp:393
+#: infomanager.cpp:449
 msgid "Season"
 msgstr "Seizoen"
 
-#: infomanager.cpp:395
+#: infomanager.cpp:451
 msgid "Episode"
 msgstr "Episode"
 
 #. i18n: file: mainwindow.ui:23
 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass)
-#: main.cpp:29 mainwindow.cpp:274 mainwindow.cpp:551 mainwindow.cpp:924
-#: mainwindow.cpp:1098 rc.cpp:5
+#: main.cpp:29 mainwindow.cpp:289 mainwindow.cpp:567 mainwindow.cpp:955
+#: mainwindow.cpp:1129 rc.cpp:5
 msgid "Bangarang"
 msgstr "Bangarang"
 
@@ -239,15 +258,15 @@ msgstr "CD afspelen"
 msgid "Show Additional Debug Output"
 msgstr "Extra debuguitvoer tonen"
 
-#: mainwindow.cpp:238 platform/medialistsengine.cpp:183
+#: mainwindow.cpp:244 platform/medialistsengine.cpp:183
 msgid "DVD Video"
 msgstr "DVD-video"
 
-#: mainwindow.cpp:248 platform/medialistsengine.cpp:93
+#: mainwindow.cpp:254 platform/medialistsengine.cpp:93
 msgid "Audio CD"
 msgstr "Audio-cd"
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid ""
 "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media "
 "library, rating and play count functions will be unavailable."
@@ -255,161 +274,161 @@ msgstr ""
 "Bangarang heeft geen toegang tot Nepomuk. De mediabibliotheek, waarderingen "
 "en afspeelteller zullen niet beschikbaar zijn."
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid "Don't show this message again"
 msgstr "Deze boodschap niet meer tonen"
 
-#: mainwindow.cpp:356
+#: mainwindow.cpp:372
 msgid "<b>Fullscreen</b><br>Click to exit fullscreen"
 msgstr ""
 "<b>Volledig scherm</b><br>Klik hier om volledig scherm uit te schakelen"
 
-#: mainwindow.cpp:363
+#: mainwindow.cpp:379
 msgid "Show fullscreen"
 msgstr "Volledig scherm tonen"
 
-#: mainwindow.cpp:374 mainwindow.cpp:644
+#: mainwindow.cpp:390 mainwindow.cpp:668
 msgid "<b>Time remaining</b><br>Click to show elapsed time"
 msgstr "<b>Resterende tijd</b><br>Klik hier om de verstreken tijd te tonen"
 
-#. i18n: file: mainwindow.ui:5535
+#. i18n: file: mainwindow.ui:5547
 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime)
-#: mainwindow.cpp:376 mainwindow.cpp:646 rc.cpp:215
+#: mainwindow.cpp:392 mainwindow.cpp:670 rc.cpp:215
 msgid "<b>Time elapsed</b><br>Click to show remaining time"
 msgstr "<b>Verstreken tijd</b><br>Klik hier om de resterende tijd te tonen"
 
-#: mainwindow.cpp:385
+#: mainwindow.cpp:401
 msgid "<b>Paused</b><br>Hold to stop"
 msgstr "<b>Gepauzeerd</b><br>Houden om te stoppen"
 
-#. i18n: file: mainwindow.ui:253
+#. i18n: file: mainwindow.ui:262
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter)
-#: mainwindow.cpp:516 rc.cpp:11
+#: mainwindow.cpp:532 rc.cpp:11
 msgid "Search for audio"
 msgstr "Zoeken naar audio"
 
-#: mainwindow.cpp:524
+#: mainwindow.cpp:540
 msgid "Search for video"
 msgstr "Zoeken naar video"
 
-#. i18n: file: mainwindow.ui:5147
+#. i18n: file: mainwindow.ui:5156
 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist)
-#: mainwindow.cpp:547 rc.cpp:179
+#: mainwindow.cpp:563 rc.cpp:179
 msgid "Clear Playlist"
 msgstr "Afspeellijst wissen"
 
-#: mainwindow.cpp:548
+#: mainwindow.cpp:564
 msgid "Are you sure you want to clear the current playlist?"
 msgstr "Bent u zeker dat u de huidige afspeellijst wil wissen?"
 
-#. i18n: file: mainwindow.ui:1202
+#. i18n: file: mainwindow.ui:1211
 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:553 mainwindow.cpp:654 mainwindow.cpp:656 mainwindow.cpp:926
+#: mainwindow.cpp:569 mainwindow.cpp:678 mainwindow.cpp:680 mainwindow.cpp:957
 #: rc.cpp:113
 msgid "Now Playing"
 msgstr "Speelt nu"
 
-#: mainwindow.cpp:563
+#: mainwindow.cpp:579
 msgid "<b>Shuffle On</b><br>Click to turn off Shuffle"
 msgstr "<b>Shuffle aan</b><br>Klik hier om shuffle uit te schakelen"
 
-#. i18n: file: mainwindow.ui:5203
+#. i18n: file: mainwindow.ui:5212
 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle)
-#: mainwindow.cpp:567 rc.cpp:188
+#: mainwindow.cpp:583 rc.cpp:188
 msgid "Turn on Shuffle"
 msgstr "Shuffle inschakelen"
 
-#: mainwindow.cpp:578
+#: mainwindow.cpp:594
 msgid "<b>Repeat On</b><br>Click to turn off repeat"
 msgstr "<b>Herhalen aan</b><br>Klik hier om herhalen uit te schakelen"
 
-#. i18n: file: mainwindow.ui:5174
+#. i18n: file: mainwindow.ui:5183
 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat)
-#: mainwindow.cpp:581 rc.cpp:182
+#: mainwindow.cpp:597 rc.cpp:182
 msgid "Turn on Repeat"
 msgstr "Herhalen inschakelen"
 
-#: mainwindow.cpp:590
+#: mainwindow.cpp:607
 msgid "<b>Showing Upcoming</b><br>Click to show playlist"
 msgstr "<b>Volgende tonen</b><br>Klik om de afspeellijst te tonen"
 
-#: mainwindow.cpp:591
+#: mainwindow.cpp:608
 msgid "<b>Playlist</b>(Upcoming)"
 msgstr "<b>Afspeellijst</b>(Volgende)"
 
-#. i18n: file: mainwindow.ui:5092
+#. i18n: file: mainwindow.ui:5101
 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue)
-#: mainwindow.cpp:595 rc.cpp:173
+#: mainwindow.cpp:613 rc.cpp:173
 msgid "Show Upcoming"
 msgstr "Volgende tonen"
 
-#: mainwindow.cpp:670
+#: mainwindow.cpp:694
 msgid "<b>Playing</b><br>Click to pause<br>Click and hold to stop"
 msgstr ""
 "<b>Aan het spelen</b><br>Klik om te pauzeren<br>Klik en houden om te stoppen"
 
-#: mainwindow.cpp:681
+#: mainwindow.cpp:705
 msgid "An error has been encountered during playback"
 msgstr ""
 
-#: mainwindow.cpp:701
+#: mainwindow.cpp:725
 msgid "Loading playlist..."
 msgstr "Afspeellijst laden..."
 
-#: mainwindow.cpp:703
+#: mainwindow.cpp:727
 msgid "Buffering..."
 msgstr "Bufferen..."
 
-#: mainwindow.cpp:705 platform/mediaitemmodel.cpp:501
+#: mainwindow.cpp:729 platform/mediaitemmodel.cpp:541
 msgid "Loading..."
 msgstr "Bezig met laden..."
 
-#: mainwindow.cpp:717
+#: mainwindow.cpp:741
 msgid "<b>Muted</b><br>Click to restore volume"
 msgstr "<b>Gedempt</b><br>Klik hier om het volume te herstellen"
 
-#. i18n: file: mainwindow.ui:5661
+#. i18n: file: mainwindow.ui:5673
 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon)
-#: mainwindow.cpp:720 rc.cpp:221
+#: mainwindow.cpp:744 rc.cpp:221
 msgid "Mute volume"
 msgstr "Volume dempen"
 
-#: mainwindow.cpp:757
+#: mainwindow.cpp:781
 msgid "Updating..."
 msgstr "Bijwerken..."
 
-#: mainwindow.cpp:763
+#: mainwindow.cpp:787
 msgid "Complete"
 msgstr ""
 
-#: mainwindow.cpp:769
+#: mainwindow.cpp:794
 msgid "Updated info for "
 msgstr "Informatie bijgewerkt voor "
 
-#: mainwindow.cpp:775
+#: mainwindow.cpp:804
 msgid "Removed info for "
 msgstr "Informatie verwijderd voor "
 
-#. i18n: file: mainwindow.ui:5124
+#. i18n: file: mainwindow.ui:5133
 #. i18n: ectx: property (text), widget (QLabel, playlistName)
-#: mainwindow.cpp:879 rc.cpp:176
+#: mainwindow.cpp:910 rc.cpp:176
 msgid "<b>Playlist</b>"
 msgstr "<b>Afspeellijst</b>"
 
-#: mainwindow.cpp:882
+#: mainwindow.cpp:913
 #, kde-format
 msgid "1 item, %2"
 msgid_plural "%1 items, %2"
 msgstr[0] "1 item, %2"
 msgstr[1] "%1 items, %2"
 
-#. i18n: file: mainwindow.ui:1199
+#. i18n: file: mainwindow.ui:1208
 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:897 mainwindow.cpp:927 rc.cpp:110
+#: mainwindow.cpp:928 mainwindow.cpp:958 rc.cpp:110
 msgid "View Now Playing"
 msgstr "Nu afspelende bekijken"
 
-#: mainwindow.cpp:1099
+#: mainwindow.cpp:1130
 msgid "Entertainment... Now"
 msgstr "Amusement... Nu"
 
@@ -423,291 +442,291 @@ msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "kristof.bal at gmail.com"
 
-#. i18n: file: mainwindow.ui:149
+#. i18n: file: mainwindow.ui:158
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: mainwindow.ui:5405
+#. i18n: file: mainwindow.ui:5417
 #. i18n: ectx: property (text), widget (QToolButton, collectionButton)
 #: rc.cpp:8 rc.cpp:206
 msgid "Media Lists"
 msgstr "Medialijst"
 
-#. i18n: file: mainwindow.ui:296
+#. i18n: file: mainwindow.ui:305
 #. i18n: ectx: attribute (label), widget (QWidget, AudioTool_2)
 #: rc.cpp:14
 msgid "Audio"
 msgstr "Audio"
 
-#. i18n: file: mainwindow.ui:364
+#. i18n: file: mainwindow.ui:373
 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList)
-#. i18n: file: mainwindow.ui:801
+#. i18n: file: mainwindow.ui:810
 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList)
 #: rc.cpp:17 rc.cpp:65
 #, fuzzy
 msgid "Add list"
 msgstr "Lijst toevoegen van"
 
-#. i18n: file: mainwindow.ui:381
+#. i18n: file: mainwindow.ui:390
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList)
-#. i18n: file: mainwindow.ui:818
+#. i18n: file: mainwindow.ui:827
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList)
 #: rc.cpp:20 rc.cpp:68
 #, fuzzy
 msgid "Remove list"
 msgstr "Uit afspeellijst verwijderen"
 
-#. i18n: file: mainwindow.ui:411
+#. i18n: file: mainwindow.ui:420
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList)
-#. i18n: file: mainwindow.ui:848
+#. i18n: file: mainwindow.ui:857
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList)
 #: rc.cpp:23 rc.cpp:71
 #, fuzzy
 msgid "Settings"
 msgstr "Video-instellingen"
 
-#. i18n: file: mainwindow.ui:460
+#. i18n: file: mainwindow.ui:469
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#. i18n: file: mainwindow.ui:897
+#. i18n: file: mainwindow.ui:906
 #. i18n: ectx: property (text), widget (QLabel, label_7)
 #: rc.cpp:26 rc.cpp:74
 #, fuzzy
 msgid "Add List"
 msgstr "Lijst toevoegen van"
 
-#. i18n: file: mainwindow.ui:477
+#. i18n: file: mainwindow.ui:486
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#. i18n: file: mainwindow.ui:914
+#. i18n: file: mainwindow.ui:923
 #. i18n: ectx: property (text), widget (QLabel, label_6)
 #: rc.cpp:29 rc.cpp:77
 #, fuzzy
 msgid "Source"
 msgstr "Sorteren"
 
-#. i18n: file: mainwindow.ui:499
+#. i18n: file: mainwindow.ui:508
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView)
-#. i18n: file: mainwindow.ui:940
+#. i18n: file: mainwindow.ui:949
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView)
 #: rc.cpp:32 rc.cpp:83
 msgid "Current View"
 msgstr "Huidig beeld"
 
-#. i18n: file: mainwindow.ui:506
+#. i18n: file: mainwindow.ui:515
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection)
-#. i18n: file: mainwindow.ui:933
+#. i18n: file: mainwindow.ui:942
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection)
 #: rc.cpp:35 rc.cpp:80
 msgid "Current Selection"
 msgstr "Huidige selectie"
 
-#. i18n: file: mainwindow.ui:513
+#. i18n: file: mainwindow.ui:522
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist)
-#. i18n: file: mainwindow.ui:947
+#. i18n: file: mainwindow.ui:956
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist)
 #: rc.cpp:38 rc.cpp:86
 msgid "Current Playlist"
 msgstr "Huidige afspeellijst"
 
-#. i18n: file: mainwindow.ui:523
+#. i18n: file: mainwindow.ui:532
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName)
-#. i18n: file: mainwindow.ui:957
+#. i18n: file: mainwindow.ui:966
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName)
 #: rc.cpp:41 rc.cpp:89
 msgid "New List Name"
 msgstr "Nieuwe naam van de lijst"
 
-#. i18n: file: mainwindow.ui:545
+#. i18n: file: mainwindow.ui:554
 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList)
-#. i18n: file: mainwindow.ui:689
+#. i18n: file: mainwindow.ui:698
 #. i18n: ectx: property (text), widget (QPushButton, aslsSave)
-#. i18n: file: mainwindow.ui:976
+#. i18n: file: mainwindow.ui:985
 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList)
-#. i18n: file: mainwindow.ui:1096
+#. i18n: file: mainwindow.ui:1105
 #. i18n: ectx: property (text), widget (QPushButton, vslsSave)
-#. i18n: file: mainwindow.ui:1782
+#. i18n: file: mainwindow.ui:1791
 #. i18n: ectx: property (text), widget (QPushButton, saveInfo)
 #: rc.cpp:44 rc.cpp:56 rc.cpp:92 rc.cpp:104 rc.cpp:152
 msgid "Save"
 msgstr "Opslaan"
 
-#. i18n: file: mainwindow.ui:599
+#. i18n: file: mainwindow.ui:608
 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList)
-#. i18n: file: mainwindow.ui:719
+#. i18n: file: mainwindow.ui:728
 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel)
-#. i18n: file: mainwindow.ui:1126
+#. i18n: file: mainwindow.ui:1135
 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel)
 #: rc.cpp:47 rc.cpp:59 rc.cpp:107
 msgid "Return to Lists"
 msgstr "Terug naar lijsten"
 
-#. i18n: file: mainwindow.ui:638
+#. i18n: file: mainwindow.ui:647
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#. i18n: file: mainwindow.ui:1045
+#. i18n: file: mainwindow.ui:1054
 #. i18n: ectx: property (text), widget (QLabel, label_11)
 #: rc.cpp:50 rc.cpp:98
 #, fuzzy
 msgid "Saved List Settings"
 msgstr "Video-instellingen tonen"
 
-#. i18n: file: mainwindow.ui:664
+#. i18n: file: mainwindow.ui:673
 #. i18n: ectx: property (text), widget (QLabel, label_9)
-#. i18n: file: mainwindow.ui:1071
+#. i18n: file: mainwindow.ui:1080
 #. i18n: ectx: property (text), widget (QLabel, label_10)
 #: rc.cpp:53 rc.cpp:101
 msgid "Name"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:748
+#. i18n: file: mainwindow.ui:757
 #. i18n: ectx: attribute (label), widget (QWidget, videoTool_2)
 #: rc.cpp:62
 msgid "Video"
 msgstr "Video"
 
-#. i18n: file: mainwindow.ui:1009
+#. i18n: file: mainwindow.ui:1018
 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList)
 #: rc.cpp:95
 msgid "Return To Lists"
 msgstr "Terug naar lijsten"
 
-#. i18n: file: mainwindow.ui:1352
+#. i18n: file: mainwindow.ui:1361
 #. i18n: ectx: property (text), widget (QLabel, listTitle)
 #: rc.cpp:116
 msgid "List Title"
 msgstr "Titel van de lijst"
 
-#. i18n: file: mainwindow.ui:1365
+#. i18n: file: mainwindow.ui:1374
 #. i18n: ectx: property (text), widget (QLabel, listSummary)
 #: rc.cpp:119
 msgid "Summary"
 msgstr "Samenvatting"
 
-#. i18n: file: mainwindow.ui:1375
+#. i18n: file: mainwindow.ui:1384
 #. i18n: ectx: property (text), widget (QToolButton, sortList)
 #: rc.cpp:122
 msgid "Sort"
 msgstr "Sorteren"
 
-#. i18n: file: mainwindow.ui:1399
+#. i18n: file: mainwindow.ui:1408
 #. i18n: ectx: property (text), widget (QToolButton, showInfo)
 #: rc.cpp:125
 msgid "Info"
 msgstr "Info"
 
-#. i18n: file: mainwindow.ui:1514
-#. i18n: ectx: property (text), widget (QLabel, notificationText)
-#: rc.cpp:128
-msgid "Notification Text"
-msgstr "Notification Text"
-
-#. i18n: file: mainwindow.ui:1589
+#. i18n: file: mainwindow.ui:1502
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: rc.cpp:131
+#: rc.cpp:128
 msgid "Information"
 msgstr "Informatie"
 
-#. i18n: file: mainwindow.ui:1596
+#. i18n: file: mainwindow.ui:1509
 #. i18n: ectx: property (text), widget (QToolButton, editInfo)
-#: rc.cpp:134
+#: rc.cpp:131
 msgid "Edit"
 msgstr "Bewerken"
 
-#. i18n: file: mainwindow.ui:1663
+#. i18n: file: mainwindow.ui:1576
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:137
+#: rc.cpp:134
 msgid "1"
 msgstr "1"
 
-#. i18n: file: mainwindow.ui:1668
+#. i18n: file: mainwindow.ui:1581
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:140
+#: rc.cpp:137
 msgid "2"
 msgstr "2"
 
-#. i18n: file: mainwindow.ui:1747
+#. i18n: file: mainwindow.ui:1663
+#. i18n: ectx: property (text), widget (QLabel, notificationText)
+#: rc.cpp:146
+msgid "Notification Text"
+msgstr "Notification Text"
+
+#. i18n: file: mainwindow.ui:1756
 #. i18n: ectx: property (text), widget (QToolButton, previous)
 #: rc.cpp:149
 msgid "Previous"
 msgstr "Vorige"
 
-#. i18n: file: mainwindow.ui:1805
+#. i18n: file: mainwindow.ui:1814
 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll)
 #: rc.cpp:155
 msgid "Play all media in list"
 msgstr "Alle media in lijst afspelen"
 
-#. i18n: file: mainwindow.ui:1834
+#. i18n: file: mainwindow.ui:1843
 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected)
 #: rc.cpp:161
 msgid "Play selected media in list"
 msgstr "Geselecteerde media in lijst afspelen"
 
-#. i18n: file: mainwindow.ui:2346
+#. i18n: file: mainwindow.ui:2355
 #. i18n: ectx: property (text), widget (QLabel, playbackMessage)
 #: rc.cpp:167
 msgid "Playback message"
 msgstr ""
 
-#. i18n: file: mainwindow.ui:2375
+#. i18n: file: mainwindow.ui:2384
 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist)
 #: rc.cpp:170
 msgid "Playlist"
 msgstr "Afspeellijst"
 
-#. i18n: file: mainwindow.ui:5177
+#. i18n: file: mainwindow.ui:5186
 #. i18n: ectx: property (text), widget (QToolButton, repeat)
-#. i18n: file: mainwindow.ui:5206
+#. i18n: file: mainwindow.ui:5215
 #. i18n: ectx: property (text), widget (QToolButton, shuffle)
-#. i18n: file: mainwindow.ui:5449
+#. i18n: file: mainwindow.ui:5461
 #. i18n: ectx: property (text), widget (SToolButton, fullScreen)
 #: rc.cpp:185 rc.cpp:191 rc.cpp:212
 msgid "[ ]"
 msgstr "[ ]"
 
-#. i18n: file: mainwindow.ui:5306
+#. i18n: file: mainwindow.ui:5318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
 #: rc.cpp:194
 msgid "Video Settings"
 msgstr "Video-instellingen"
 
-#. i18n: file: mainwindow.ui:5335
+#. i18n: file: mainwindow.ui:5347
 #. i18n: ectx: property (text), widget (QPushButton, saveShortCuts)
 #: rc.cpp:197
 msgid "Save Shortcuts"
 msgstr "Sneltoetsen opslaan"
 
-#. i18n: file: mainwindow.ui:5342
+#. i18n: file: mainwindow.ui:5354
 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts)
 #: rc.cpp:200
 msgid "Cancel"
 msgstr "Annuleren"
 
-#. i18n: file: mainwindow.ui:5402
+#. i18n: file: mainwindow.ui:5414
 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton)
 #: rc.cpp:203
 msgid "View Media Lists"
 msgstr "Medialijsten tonen"
 
-#. i18n: file: mainwindow.ui:5446
+#. i18n: file: mainwindow.ui:5458
 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen)
 #: rc.cpp:209
 msgid "Show full screen"
 msgstr "Volledig scherm tonen"
 
-#. i18n: file: mainwindow.ui:5538
+#. i18n: file: mainwindow.ui:5550
 #. i18n: ectx: property (text), widget (QToolButton, seekTime)
 #: rc.cpp:218
 msgid "03:00"
 msgstr "03:00"
 
-#. i18n: file: mainwindow.ui:5699
+#. i18n: file: mainwindow.ui:5711
 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider)
 #: rc.cpp:224
 msgid "Volume"
 msgstr "Volume"
 
-#. i18n: file: mainwindow.ui:5725
+#. i18n: file: mainwindow.ui:5737
 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious)
-#. i18n: file: mainwindow.ui:5754
+#. i18n: file: mainwindow.ui:5766
 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause)
-#. i18n: file: mainwindow.ui:5774
+#. i18n: file: mainwindow.ui:5786
 #. i18n: ectx: property (text), widget (QToolButton, mediaNext)
 #: rc.cpp:227 rc.cpp:230 rc.cpp:233
 msgid "..."
@@ -769,37 +788,37 @@ msgstr "Standaardwaarden"
 msgid "Hide"
 msgstr "Verbergen"
 
-#: platform/audioclipslistengine.cpp:107 platform/audioclipslistengine.cpp:131
-#: platform/videolistengine.cpp:176
+#: platform/audioclipslistengine.cpp:86 platform/audioclipslistengine.cpp:125
+#: platform/videolistengine.cpp:117
 #, kde-format
 msgid "1 clip"
 msgid_plural "%1 clips"
 msgstr[0] "1 clip"
 msgstr[1] "%1 clips"
 
-#: platform/audiostreamlistengine.cpp:103
-#: platform/audiostreamlistengine.cpp:134
+#: platform/audiostreamlistengine.cpp:85
+#: platform/audiostreamlistengine.cpp:131
 #, kde-format
 msgid "1 stream"
 msgid_plural "%1 streams"
 msgstr[0] "1 stream"
 msgstr[1] "%1 streams"
 
-#: platform/audiostreamlistengine.cpp:108
+#: platform/audiostreamlistengine.cpp:90
 msgid "Create new audio stream item"
 msgstr "Nieuwe audiostreamitem aanmaken"
 
-#: platform/audiostreamlistengine.cpp:155
+#: platform/audiostreamlistengine.cpp:152
 msgid "Untitled Audio Stream"
 msgstr "Naamloze audiostream"
 
-#: platform/audiostreamlistengine.cpp:156
+#: platform/audiostreamlistengine.cpp:153
 msgid "Select this item, click Info then Edit to enter audio stream info"
 msgstr ""
 "Selecteer dit item, klik op Info, dan Bewerken om nieuwe "
 "audiostreaminformatie toe te voegen"
 
-#: platform/audiostreamlistengine.cpp:165
+#: platform/audiostreamlistengine.cpp:162
 msgid "New Audio Stream"
 msgstr "Nieuwe audiostream"
 
@@ -839,9 +858,9 @@ msgid "Video Files"
 msgstr "Videobestanden"
 
 #: platform/filelistengine.cpp:87 platform/filelistengine.cpp:98
-#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:381
-#: platform/savedlistsengine.cpp:102 platform/videolistengine.cpp:451
-#: platform/videolistengine.cpp:517
+#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:415
+#: platform/savedlistsengine.cpp:166 platform/videolistengine.cpp:566
+#: platform/videolistengine.cpp:676
 #, kde-format
 msgid "1 item"
 msgid_plural "%1 items"
@@ -872,30 +891,20 @@ msgstr "Afbeeldingen openen"
 msgid "Open folder containing image file(s)"
 msgstr "Map openen met afbeeldingen"
 
-#: platform/filelistengine.cpp:326
+#: platform/filelistengine.cpp:334
 msgid "Audio Clip"
 msgstr "Audioclip"
 
-#: platform/filelistengine.cpp:413
-#, kde-format
-msgid "%1 - Episode %2"
-msgstr "%1 - Episode %2"
-
-#: platform/filelistengine.cpp:415
-#, kde-format
-msgid "Episode %1"
-msgstr "Episode %1"
-
-#: platform/mediaitemmodel.cpp:380
+#: platform/mediaitemmodel.cpp:413
 #, fuzzy, kde-format
 msgid "Multiple %1"
 msgstr "Titel %1"
 
-#: platform/mediaitemmodel.cpp:532
+#: platform/mediaitemmodel.cpp:572
 msgid "No results"
 msgstr "Geen resultaten"
 
-#: platform/mediaitemmodel.cpp:563
+#: platform/mediaitemmodel.cpp:603
 msgid "Add to playlist/Remove from playlist"
 msgstr "Aan afspeellijst toevoegen/Uit afspeellijst verwijderen"
 
@@ -903,20 +912,20 @@ msgstr "Aan afspeellijst toevoegen/Uit afspeellijst verwijderen"
 msgid "Files and Folders"
 msgstr "Bestanden en mappen"
 
-#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:222
+#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:132
 msgid "Artists"
 msgstr "Artiesten"
 
-#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:262
+#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:192
 msgid "Albums"
 msgstr "Albums"
 
-#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:353
+#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:331
 msgid "Songs"
 msgstr "Tracks"
 
 #: platform/medialistsengine.cpp:69 platform/medialistsengine.cpp:159
-#: platform/musiclistengine.cpp:306 platform/videolistengine.cpp:402
+#: platform/musiclistengine.cpp:256 platform/videolistengine.cpp:467
 msgid "Genres"
 msgstr "Genres"
 
@@ -929,132 +938,141 @@ msgid "Audio Streams"
 msgstr "Audiostreams"
 
 #: platform/medialistsengine.cpp:100 platform/medialistsengine.cpp:190
-#: platform/semanticslistengine.cpp:89
+#: platform/semanticslistengine.cpp:107
 msgid "Frequently Played"
 msgstr "Veel afgespeeld"
 
 #: platform/medialistsengine.cpp:104 platform/medialistsengine.cpp:194
-#: platform/semanticslistengine.cpp:115
+#: platform/semanticslistengine.cpp:147
 msgid "Recently Played"
 msgstr "Recent afgespeeld"
 
 #: platform/medialistsengine.cpp:108 platform/medialistsengine.cpp:198
-#: platform/semanticslistengine.cpp:140
+#: platform/semanticslistengine.cpp:188
 msgid "Highest Rated"
 msgstr "Hoogst beoordeeld"
 
-#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:369
+#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:426
 msgid "Movies"
 msgstr "Films"
 
-#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:224
+#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:181
 msgid "TV Shows"
 msgstr "TV-programma's"
 
-#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:175
+#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:116
 msgid "Video Clips"
 msgstr "Videoclips"
 
-#: platform/musiclistengine.cpp:224
+#: platform/musiclistengine.cpp:134
 #, kde-format
 msgid "Artists - %1"
 msgstr "Artiesten - %1"
 
-#: platform/musiclistengine.cpp:226
+#: platform/musiclistengine.cpp:136
 #, kde-format
 msgid "1 artist"
 msgid_plural "%1 artists"
 msgstr[0] "1 artiest"
 msgstr[1] "%1 artiesten"
 
-#: platform/musiclistengine.cpp:264 platform/musiclistengine.cpp:267
+#: platform/musiclistengine.cpp:194 platform/musiclistengine.cpp:197
 #, kde-format
 msgid "Albums - %1"
 msgstr "Albums - %1"
 
-#: platform/musiclistengine.cpp:270
+#: platform/musiclistengine.cpp:200
 #, kde-format
 msgid "Albums - %1 - %2"
 msgstr "Albums - %1 - %2"
 
-#: platform/musiclistengine.cpp:273
+#: platform/musiclistengine.cpp:203
 #, kde-format
 msgid "1 album"
 msgid_plural "%1 albums"
 msgstr[0] "1 album"
 msgstr[1] "%1 albums"
 
-#: platform/musiclistengine.cpp:307 platform/videolistengine.cpp:403
+#: platform/musiclistengine.cpp:257 platform/videolistengine.cpp:468
 #, kde-format
 msgid "1 genre"
 msgid_plural "%1 genres"
 msgstr[0] "1 genre"
 msgstr[1] "%1 genres"
 
-#: platform/musiclistengine.cpp:355 platform/musiclistengine.cpp:383
+#: platform/musiclistengine.cpp:333 platform/musiclistengine.cpp:388
 #, kde-format
 msgid "1 song"
 msgid_plural "%1 songs"
 msgstr[0] "1 track"
 msgstr[1] "%1 tracks"
 
-#: platform/videolistengine.cpp:216 platform/videolistengine.cpp:332
+#: platform/videolistengine.cpp:173 platform/videolistengine.cpp:358
 msgid "Uncategorized TV Shows"
 msgstr "TV-programma's zonder categorie"
 
-#: platform/videolistengine.cpp:225
+#: platform/videolistengine.cpp:182
 #, kde-format
 msgid "1 show"
 msgid_plural "%1 shows"
 msgstr[0] "1 TV-programma"
 msgstr[1] "%1 TV-programma's"
 
-#: platform/videolistengine.cpp:253
+#: platform/videolistengine.cpp:230
 #, kde-format
 msgid "Season %1"
 msgstr "Seizoen %1"
 
-#: platform/videolistengine.cpp:272
+#: platform/videolistengine.cpp:254
 msgid "Uncategorized seasons"
 msgstr "Seizoenen zonder categorie"
 
-#: platform/videolistengine.cpp:279
+#: platform/videolistengine.cpp:261
 #, fuzzy, kde-format
 msgid "Seasons - %1"
 msgstr "Seizoen %1"
 
-#: platform/videolistengine.cpp:280
+#: platform/videolistengine.cpp:262
 #, kde-format
 msgid "1 season"
 msgid_plural "%1 seasons"
 msgstr[0] "1 seizoen"
 msgstr[1] "%1 seizoenen"
 
-#: platform/videolistengine.cpp:334
+#: platform/videolistengine.cpp:360
 #, kde-format
 msgid "%1 - Season %2"
 msgstr "%1 - Seizoen %2"
 
-#: platform/videolistengine.cpp:336
+#: platform/videolistengine.cpp:362
 #, kde-format
 msgid "%1 - Uncategorized Seasons"
 msgstr "%1 - Seizoenen zonder categorie"
 
-#: platform/videolistengine.cpp:338
+#: platform/videolistengine.cpp:364
 #, kde-format
 msgid "1 episode"
 msgid_plural "%1 episodes"
 msgstr[0] "1 episode"
 msgstr[1] "%1 episodes"
 
-#: platform/videolistengine.cpp:371
+#: platform/videolistengine.cpp:428
 #, kde-format
 msgid "Movies - %1"
 msgstr "Films - %1"
 
-#: platform/videolistengine.cpp:373
+#: platform/videolistengine.cpp:430
 #, kde-format
 msgid "1 movie"
 msgid_plural "%1 movies"
 msgstr[0] "1 film"
 msgstr[1] "%1 films"
+
+#~ msgid "%1 - Episode %2"
+#~ msgstr "%1 - Episode %2"
+
+#~ msgid "Episode %1"
+#~ msgstr "Episode %1"
+
+#~ msgid "Collection/Series Name"
+#~ msgstr "Naam van de verzameling/serie"
diff --git a/translations/zh_CN/CMakeLists.txt b/translations/zh_CN/CMakeLists.txt
new file mode 100644
index 0000000..64885b9
--- /dev/null
+++ b/translations/zh_CN/CMakeLists.txt
@@ -0,0 +1,2 @@
+file(GLOB _po_files *.po)
+GETTEXT_PROCESS_PO_FILES( zh_CN ALL INSTALL_DESTINATION ${LOCALE_INSTALL_DIR} ${_po_files} )
diff --git a/translations/bangarang.pot b/translations/zh_CN/bangarang.po
similarity index 54%
copy from translations/bangarang.pot
copy to translations/zh_CN/bangarang.po
index bfe8e7f..f75caa2 100644
--- a/translations/bangarang.pot
+++ b/translations/zh_CN/bangarang.po
@@ -1,1040 +1,1043 @@
-# SOME DESCRIPTIVE TITLE.
+# translation of bangarang.po to 简体中文
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
 #
-#, fuzzy
+# Ni Hui <shuizhuyuanluo at 126.com>, 2010.
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n"
-"POT-Creation-Date: 2009-12-21 22:58-0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
-"Language-Team: LANGUAGE <LL at li.org>\n"
+"POT-Creation-Date: 2010-01-05 21:18-0800\n"
+"PO-Revision-Date: 2010-01-01 14:43+0800\n"
+"Last-Translator: Ni Hui <shuizhuyuanluo at 126.com>\n"
+"Language-Team: 简体中文 <kde-china at kde.org>\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Lokalize 1.0\n"
 
 #: actionsmanager.cpp:48
 msgid "Quit"
-msgstr ""
+msgstr "退出"
 
 #: actionsmanager.cpp:57
 msgid "Play next"
-msgstr ""
+msgstr "播放下一首"
 
 #: actionsmanager.cpp:63
 msgid "Play previous"
-msgstr ""
+msgstr "播放上一首"
 
-#: actionsmanager.cpp:75 mainwindow.cpp:1087
+#: actionsmanager.cpp:75 mainwindow.cpp:1118
 msgid "Play all"
-msgstr ""
+msgstr "全部播放"
 
-#. i18n: file: mainwindow.ui:1811
+#. i18n: file: mainwindow.ui:1820
 #. i18n: ectx: property (text), widget (QPushButton, playAll)
 #: actionsmanager.cpp:77 rc.cpp:158
 msgid "Play All"
-msgstr ""
+msgstr "全部播放"
 
-#: actionsmanager.cpp:80 mainwindow.cpp:1089
+#: actionsmanager.cpp:80 mainwindow.cpp:1120
 msgid "Play selected"
-msgstr ""
+msgstr "播放选中项"
 
-#. i18n: file: mainwindow.ui:1837
+#. i18n: file: mainwindow.ui:1846
 #. i18n: ectx: property (text), widget (QPushButton, playSelected)
 #: actionsmanager.cpp:82 rc.cpp:164
 msgid "Play Selected"
-msgstr ""
+msgstr "播放选中项"
 
 #: actionsmanager.cpp:85 actionsmanager.cpp:87
 msgid "Add to playlist"
-msgstr ""
+msgstr "添加到播放列表"
 
 #: actionsmanager.cpp:90 actionsmanager.cpp:92
 msgid "Remove from playlist"
-msgstr ""
+msgstr "从播放列表删除"
 
 #: actionsmanager.cpp:95 actionsmanager.cpp:99
 msgid "Hide controls"
-msgstr ""
+msgstr "隐藏控件"
 
-#: actionsmanager.cpp:106 actionsmanager.cpp:381 mainwindow.cpp:348
+#: actionsmanager.cpp:106 actionsmanager.cpp:390 mainwindow.cpp:364
 msgid "Show Video Settings"
-msgstr ""
+msgstr "显示视频设置"
 
 #: actionsmanager.cpp:113
 msgid "Toggle fullscreen"
-msgstr ""
+msgstr "切换全屏"
 
 #: actionsmanager.cpp:122
 msgid "Remove selected info"
-msgstr ""
+msgstr "删除选中信息"
 
 #: actionsmanager.cpp:127
 msgid "Refresh"
-msgstr ""
+msgstr "刷新"
 
 #: actionsmanager.cpp:133
 msgid "Remove from list"
-msgstr ""
+msgstr "从列表删除"
 
 #: actionsmanager.cpp:137
 msgid "Add to list"
-msgstr ""
+msgstr "添加到列表"
 
 #: actionsmanager.cpp:141
 msgid "Add to list "
-msgstr ""
+msgstr "添加到列表 "
 
 #: actionsmanager.cpp:145 actionsmanager.cpp:149
 msgid "New list"
-msgstr ""
+msgstr "新建列表"
 
 #: actionsmanager.cpp:153
 msgid "Show items"
-msgstr ""
+msgstr "显示项目"
+
+#: actionsmanager.cpp:157
+msgid "Show info"
+msgstr "显示信息"
 
-#: actionsmanager.cpp:158
+#: actionsmanager.cpp:162
 msgid "Configure shortcuts..."
-msgstr ""
+msgstr "配置快捷键..."
 
-#: actionsmanager.cpp:377
+#: actionsmanager.cpp:386
 msgid "Hide Video Settings"
-msgstr ""
+msgstr "隐藏视频设置"
 
-#. i18n: file: mainwindow.ui:1673
+#. i18n: file: mainwindow.ui:1586
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:239 rc.cpp:143
+#: infomanager.cpp:267 rc.cpp:140
 msgid "Title"
-msgstr ""
+msgstr "标题"
 
-#: infomanager.cpp:241
+#: infomanager.cpp:269
 msgid "Artwork"
-msgstr ""
+msgstr "艺照"
 
-#: infomanager.cpp:243
+#: infomanager.cpp:271
 msgid "Description"
-msgstr ""
+msgstr "描述"
 
-#: infomanager.cpp:245
+#: infomanager.cpp:273
 msgid "Location"
-msgstr ""
+msgstr "位置"
 
-#: infomanager.cpp:287 infomanager.cpp:345
+#: infomanager.cpp:327 infomanager.cpp:385
 msgid "Type"
-msgstr ""
+msgstr "类型"
 
-#. i18n: file: mainwindow.ui:1681
+#. i18n: file: mainwindow.ui:1594
 #. i18n: ectx: property (text), item, widget (QTreeWidget, infoView)
-#: infomanager.cpp:306 rc.cpp:146
+#: infomanager.cpp:346 rc.cpp:143
 msgid "Artist"
-msgstr ""
+msgstr "艺人"
 
-#: infomanager.cpp:308
+#: infomanager.cpp:348
 msgid "Album"
-msgstr ""
+msgstr "专辑"
 
-#: infomanager.cpp:310 infomanager.cpp:366 infomanager.cpp:396
+#: infomanager.cpp:350 infomanager.cpp:404 infomanager.cpp:453
 msgid "Year"
-msgstr ""
+msgstr "年份"
 
-#: infomanager.cpp:312
+#: infomanager.cpp:352
 msgid "Track Number"
-msgstr ""
+msgstr "音轨编号"
 
-#: infomanager.cpp:314 infomanager.cpp:368
+#: infomanager.cpp:354 infomanager.cpp:406 infomanager.cpp:455
 msgid "Genre"
-msgstr ""
+msgstr "流派"
 
-#: infomanager.cpp:364
-msgid "Collection/Series Name"
-msgstr ""
+#: infomanager.cpp:408 infomanager.cpp:457
+msgid "Writer"
+msgstr "编剧"
+
+#: infomanager.cpp:410 infomanager.cpp:459
+msgid "Director"
+msgstr "导演"
 
-#: infomanager.cpp:391
+#: infomanager.cpp:412 infomanager.cpp:461
+msgid "Producer"
+msgstr "制片人"
+
+#: infomanager.cpp:414 infomanager.cpp:463
+msgid "Actor"
+msgstr "演员"
+
+#: infomanager.cpp:447
 msgid "Series Name"
-msgstr ""
+msgstr "剧集名称"
 
-#: infomanager.cpp:393
+#: infomanager.cpp:449
 msgid "Season"
-msgstr ""
+msgstr "上演期"
 
-#: infomanager.cpp:395
+#: infomanager.cpp:451
 msgid "Episode"
-msgstr ""
+msgstr "片段"
 
 #. i18n: file: mainwindow.ui:23
 #. i18n: ectx: property (windowTitle), widget (QMainWindow, MainWindowClass)
-#: main.cpp:29 mainwindow.cpp:274 mainwindow.cpp:551 mainwindow.cpp:924
-#: mainwindow.cpp:1098 rc.cpp:5
+#: main.cpp:29 mainwindow.cpp:289 mainwindow.cpp:567 mainwindow.cpp:955
+#: mainwindow.cpp:1129 rc.cpp:5
 msgid "Bangarang"
-msgstr ""
+msgstr "Bangarang"
 
 #: main.cpp:30
 msgid "A Media Player"
-msgstr ""
+msgstr "媒体播放器"
 
 #: main.cpp:31
 msgid "Copyright 2009, Andrew Lake"
-msgstr ""
+msgstr "Copyright 2009,Andrew Lake"
 
 #: main.cpp:38
 msgid "Andrew (Jamboarder) Lake"
-msgstr ""
+msgstr "Andrew (Jamboarder) Lake"
 
 #: main.cpp:38
 msgid "Creator"
-msgstr ""
+msgstr "缔造者"
 
 #: main.cpp:39
 msgid "Sebastian Jambor"
-msgstr ""
+msgstr "Sebastian Jambor"
 
 #: main.cpp:39 main.cpp:40 main.cpp:41
 msgid "Contributor"
-msgstr ""
+msgstr "贡献者"
 
 #: main.cpp:40
 msgid "Janusz Lewandowski"
-msgstr ""
+msgstr "Janusz Lewandowski"
 
 #: main.cpp:41
 msgid "Andreas Marschke"
-msgstr ""
+msgstr "Andreas Marschke"
 
 #: main.cpp:43
 msgid ""
 "Defects may be reported at http://code.google.com/p/bangarangissuetracking/"
-msgstr ""
+msgstr "缺陷请到 http://code.google.com/p/bangarangissuetracking/ 报告"
 
 #: main.cpp:43
 msgid ""
 "Defects may be reported at <a href='http://code.google.com/p/"
 "bangarangissuetracking/'>Bangarang Issue Tracker</a>"
 msgstr ""
+"缺陷请到 <a href='http://code.google.com/p/"
+"bangarangissuetracking/'>Bangarang 问题跟踪</a>报告"
 
 #: main.cpp:50
 msgid "Play 'URL'"
-msgstr ""
+msgstr "播放 URL"
 
 #: main.cpp:51
 msgid "Play DVD Video"
-msgstr ""
+msgstr "播放 DVD 视频"
 
 #: main.cpp:52
 msgid "Play CD Music"
-msgstr ""
+msgstr "播放 CD 音乐"
 
 #: main.cpp:53
 msgid "Show Additional Debug Output"
-msgstr ""
+msgstr "显示额外的调试输出"
 
-#: mainwindow.cpp:238 platform/medialistsengine.cpp:183
+#: mainwindow.cpp:244 platform/medialistsengine.cpp:183
 msgid "DVD Video"
-msgstr ""
+msgstr "DVD 视频"
 
-#: mainwindow.cpp:248 platform/medialistsengine.cpp:93
+#: mainwindow.cpp:254 platform/medialistsengine.cpp:93
 msgid "Audio CD"
-msgstr ""
+msgstr "音频 CD"
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid ""
 "Bangarang is unable to access the Nepomuk Semantic Desktop repository. Media "
 "library, rating and play count functions will be unavailable."
 msgstr ""
+"Bangarang 无法访问 Nepomuk 语义学桌面仓库。媒体库、评分和播放计数功能将不可"
+"用。"
 
-#: mainwindow.cpp:274
+#: mainwindow.cpp:289
 msgid "Don't show this message again"
-msgstr ""
+msgstr "不再显示此信息"
 
-#: mainwindow.cpp:356
+#: mainwindow.cpp:372
 msgid "<b>Fullscreen</b><br>Click to exit fullscreen"
-msgstr ""
+msgstr "<b>全屏</b><br>点击退出全屏"
 
-#: mainwindow.cpp:363
+#: mainwindow.cpp:379
 msgid "Show fullscreen"
-msgstr ""
+msgstr "全屏显示"
 
-#: mainwindow.cpp:374 mainwindow.cpp:644
+#: mainwindow.cpp:390 mainwindow.cpp:668
 msgid "<b>Time remaining</b><br>Click to show elapsed time"
-msgstr ""
+msgstr "<b>剩余时间</b><br>点击显示已用时间"
 
-#. i18n: file: mainwindow.ui:5535
+#. i18n: file: mainwindow.ui:5547
 #. i18n: ectx: property (toolTip), widget (QToolButton, seekTime)
-#: mainwindow.cpp:376 mainwindow.cpp:646 rc.cpp:215
+#: mainwindow.cpp:392 mainwindow.cpp:670 rc.cpp:215
 msgid "<b>Time elapsed</b><br>Click to show remaining time"
-msgstr ""
+msgstr "<b>已用时间</b><br>点击显示剩余时间"
 
-#: mainwindow.cpp:385
+#: mainwindow.cpp:401
 msgid "<b>Paused</b><br>Hold to stop"
-msgstr ""
+msgstr "<b>已暂停</b><br>按住以停止"
 
-#. i18n: file: mainwindow.ui:253
+#. i18n: file: mainwindow.ui:262
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, Filter)
-#: mainwindow.cpp:516 rc.cpp:11
+#: mainwindow.cpp:532 rc.cpp:11
 msgid "Search for audio"
-msgstr ""
+msgstr "搜索音频"
 
-#: mainwindow.cpp:524
+#: mainwindow.cpp:540
 msgid "Search for video"
-msgstr ""
+msgstr "搜索视频"
 
-#. i18n: file: mainwindow.ui:5147
+#. i18n: file: mainwindow.ui:5156
 #. i18n: ectx: property (toolTip), widget (QToolButton, clearPlaylist)
-#: mainwindow.cpp:547 rc.cpp:179
+#: mainwindow.cpp:563 rc.cpp:179
 msgid "Clear Playlist"
-msgstr ""
+msgstr "清除播放列表"
 
-#: mainwindow.cpp:548
+#: mainwindow.cpp:564
 msgid "Are you sure you want to clear the current playlist?"
-msgstr ""
+msgstr "您确定要清除当前播放列表吗?"
 
-#. i18n: file: mainwindow.ui:1202
+#. i18n: file: mainwindow.ui:1211
 #. i18n: ectx: property (text), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:553 mainwindow.cpp:654 mainwindow.cpp:656 mainwindow.cpp:926
+#: mainwindow.cpp:569 mainwindow.cpp:678 mainwindow.cpp:680 mainwindow.cpp:957
 #: rc.cpp:113
 msgid "Now Playing"
-msgstr ""
+msgstr "现在播放"
 
-#: mainwindow.cpp:563
+#: mainwindow.cpp:579
 msgid "<b>Shuffle On</b><br>Click to turn off Shuffle"
-msgstr ""
+msgstr "<b>乱序开启</b><br>点击关闭乱序"
 
-#. i18n: file: mainwindow.ui:5203
+#. i18n: file: mainwindow.ui:5212
 #. i18n: ectx: property (toolTip), widget (QToolButton, shuffle)
-#: mainwindow.cpp:567 rc.cpp:188
+#: mainwindow.cpp:583 rc.cpp:188
 msgid "Turn on Shuffle"
-msgstr ""
+msgstr "开启乱序"
 
-#: mainwindow.cpp:578
+#: mainwindow.cpp:594
 msgid "<b>Repeat On</b><br>Click to turn off repeat"
-msgstr ""
+msgstr "<b>重复开启</b><br>点击关闭重复"
 
-#. i18n: file: mainwindow.ui:5174
+#. i18n: file: mainwindow.ui:5183
 #. i18n: ectx: property (toolTip), widget (QToolButton, repeat)
-#: mainwindow.cpp:581 rc.cpp:182
+#: mainwindow.cpp:597 rc.cpp:182
 msgid "Turn on Repeat"
-msgstr ""
+msgstr "开启重复"
 
-#: mainwindow.cpp:590
+#: mainwindow.cpp:607
 msgid "<b>Showing Upcoming</b><br>Click to show playlist"
-msgstr ""
+msgstr "<b>显示即将播放</b><br>点击显示播放列表"
 
-#: mainwindow.cpp:591
+#: mainwindow.cpp:608
 msgid "<b>Playlist</b>(Upcoming)"
-msgstr ""
+msgstr "<b>播放列表</b>(即将播放)"
 
-#. i18n: file: mainwindow.ui:5092
+#. i18n: file: mainwindow.ui:5101
 #. i18n: ectx: property (toolTip), widget (QToolButton, showQueue)
-#: mainwindow.cpp:595 rc.cpp:173
+#: mainwindow.cpp:613 rc.cpp:173
 msgid "Show Upcoming"
-msgstr ""
+msgstr "显示即将播放"
 
-#: mainwindow.cpp:670
+#: mainwindow.cpp:694
 msgid "<b>Playing</b><br>Click to pause<br>Click and hold to stop"
-msgstr ""
+msgstr "<b>播放中</b><br>点击以暂停<br>点击并按住以停止"
 
-#: mainwindow.cpp:681
+#: mainwindow.cpp:705
 msgid "An error has been encountered during playback"
-msgstr ""
+msgstr "播放时遇到错误"
 
-#: mainwindow.cpp:701
+#: mainwindow.cpp:725
 msgid "Loading playlist..."
-msgstr ""
+msgstr "正在装入播放列表..."
 
-#: mainwindow.cpp:703
+#: mainwindow.cpp:727
 msgid "Buffering..."
-msgstr ""
+msgstr "正在缓冲..."
 
-#: mainwindow.cpp:705 platform/mediaitemmodel.cpp:501
+#: mainwindow.cpp:729 platform/mediaitemmodel.cpp:541
 msgid "Loading..."
-msgstr ""
+msgstr "正在装入..."
 
-#: mainwindow.cpp:717
+#: mainwindow.cpp:741
 msgid "<b>Muted</b><br>Click to restore volume"
-msgstr ""
+msgstr "<b>已静音</b><br>点击还原音量"
 
-#. i18n: file: mainwindow.ui:5661
+#. i18n: file: mainwindow.ui:5673
 #. i18n: ectx: property (toolTip), widget (SToolButton, volumeIcon)
-#: mainwindow.cpp:720 rc.cpp:221
+#: mainwindow.cpp:744 rc.cpp:221
 msgid "Mute volume"
-msgstr ""
+msgstr "静音"
 
-#: mainwindow.cpp:757
+#: mainwindow.cpp:781
 msgid "Updating..."
-msgstr ""
+msgstr "正在更新..."
 
-#: mainwindow.cpp:763
+#: mainwindow.cpp:787
 msgid "Complete"
-msgstr ""
+msgstr "完成"
 
-#: mainwindow.cpp:769
+#: mainwindow.cpp:794
 msgid "Updated info for "
-msgstr ""
+msgstr "已更新信息 "
 
-#: mainwindow.cpp:775
+#: mainwindow.cpp:804
 msgid "Removed info for "
-msgstr ""
+msgstr "已删除信息 "
 
-#. i18n: file: mainwindow.ui:5124
+#. i18n: file: mainwindow.ui:5133
 #. i18n: ectx: property (text), widget (QLabel, playlistName)
-#: mainwindow.cpp:879 rc.cpp:176
+#: mainwindow.cpp:910 rc.cpp:176
 msgid "<b>Playlist</b>"
-msgstr ""
+msgstr "<b>播放列表</b>"
 
-#: mainwindow.cpp:882
+#: mainwindow.cpp:913
 #, kde-format
 msgid "1 item, %2"
 msgid_plural "%1 items, %2"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 项,%2"
 
-#. i18n: file: mainwindow.ui:1199
+#. i18n: file: mainwindow.ui:1208
 #. i18n: ectx: property (toolTip), widget (QToolButton, nowPlaying)
-#: mainwindow.cpp:897 mainwindow.cpp:927 rc.cpp:110
+#: mainwindow.cpp:928 mainwindow.cpp:958 rc.cpp:110
 msgid "View Now Playing"
-msgstr ""
+msgstr "查看现在播放"
 
-#: mainwindow.cpp:1099
+#: mainwindow.cpp:1130
 msgid "Entertainment... Now"
-msgstr ""
+msgstr "影音之乐... 享受吧"
 
 #: rc.cpp:1
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
-msgstr ""
+msgstr "Ni Hui"
 
 #: rc.cpp:2
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
-msgstr ""
+msgstr "shuizhuyuanluo at 126.com"
 
-#. i18n: file: mainwindow.ui:149
+#. i18n: file: mainwindow.ui:158
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: mainwindow.ui:5405
+#. i18n: file: mainwindow.ui:5417
 #. i18n: ectx: property (text), widget (QToolButton, collectionButton)
 #: rc.cpp:8 rc.cpp:206
 msgid "Media Lists"
-msgstr ""
+msgstr "媒体列表"
 
-#. i18n: file: mainwindow.ui:296
+#. i18n: file: mainwindow.ui:305
 #. i18n: ectx: attribute (label), widget (QWidget, AudioTool_2)
 #: rc.cpp:14
 msgid "Audio"
-msgstr ""
+msgstr "音频"
 
-#. i18n: file: mainwindow.ui:364
+#. i18n: file: mainwindow.ui:373
 #. i18n: ectx: property (toolTip), widget (QToolButton, addAudioList)
-#. i18n: file: mainwindow.ui:801
+#. i18n: file: mainwindow.ui:810
 #. i18n: ectx: property (toolTip), widget (QToolButton, addVideoList)
 #: rc.cpp:17 rc.cpp:65
 msgid "Add list"
-msgstr ""
+msgstr "添加列表"
 
-#. i18n: file: mainwindow.ui:381
+#. i18n: file: mainwindow.ui:390
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeAudioList)
-#. i18n: file: mainwindow.ui:818
+#. i18n: file: mainwindow.ui:827
 #. i18n: ectx: property (toolTip), widget (QToolButton, removeVideoList)
 #: rc.cpp:20 rc.cpp:68
 msgid "Remove list"
-msgstr ""
+msgstr "删除列表"
 
-#. i18n: file: mainwindow.ui:411
+#. i18n: file: mainwindow.ui:420
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureAudioList)
-#. i18n: file: mainwindow.ui:848
+#. i18n: file: mainwindow.ui:857
 #. i18n: ectx: property (toolTip), widget (QToolButton, configureVideoList)
 #: rc.cpp:23 rc.cpp:71
 msgid "Settings"
-msgstr ""
+msgstr "设置"
 
-#. i18n: file: mainwindow.ui:460
+#. i18n: file: mainwindow.ui:469
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#. i18n: file: mainwindow.ui:897
+#. i18n: file: mainwindow.ui:906
 #. i18n: ectx: property (text), widget (QLabel, label_7)
 #: rc.cpp:26 rc.cpp:74
 msgid "Add List"
-msgstr ""
+msgstr "添加列表"
 
-#. i18n: file: mainwindow.ui:477
+#. i18n: file: mainwindow.ui:486
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#. i18n: file: mainwindow.ui:914
+#. i18n: file: mainwindow.ui:923
 #. i18n: ectx: property (text), widget (QLabel, label_6)
 #: rc.cpp:29 rc.cpp:77
 msgid "Source"
-msgstr ""
+msgstr "来源"
 
-#. i18n: file: mainwindow.ui:499
+#. i18n: file: mainwindow.ui:508
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceView)
-#. i18n: file: mainwindow.ui:940
+#. i18n: file: mainwindow.ui:949
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceView)
 #: rc.cpp:32 rc.cpp:83
 msgid "Current View"
-msgstr ""
+msgstr "当前视图"
 
-#. i18n: file: mainwindow.ui:506
+#. i18n: file: mainwindow.ui:515
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourceSelection)
-#. i18n: file: mainwindow.ui:933
+#. i18n: file: mainwindow.ui:942
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourceSelection)
 #: rc.cpp:35 rc.cpp:80
 msgid "Current Selection"
-msgstr ""
+msgstr "当前选中项"
 
-#. i18n: file: mainwindow.ui:513
+#. i18n: file: mainwindow.ui:522
 #. i18n: ectx: property (text), widget (QRadioButton, aListSourcePlaylist)
-#. i18n: file: mainwindow.ui:947
+#. i18n: file: mainwindow.ui:956
 #. i18n: ectx: property (text), widget (QRadioButton, vListSourcePlaylist)
 #: rc.cpp:38 rc.cpp:86
 msgid "Current Playlist"
-msgstr ""
+msgstr "当前播放列表"
 
-#. i18n: file: mainwindow.ui:523
+#. i18n: file: mainwindow.ui:532
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, aNewListName)
-#. i18n: file: mainwindow.ui:957
+#. i18n: file: mainwindow.ui:966
 #. i18n: ectx: property (clickMessage), widget (KLineEdit, vNewListName)
 #: rc.cpp:41 rc.cpp:89
 msgid "New List Name"
-msgstr ""
+msgstr "新列表名称"
 
-#. i18n: file: mainwindow.ui:545
+#. i18n: file: mainwindow.ui:554
 #. i18n: ectx: property (text), widget (QPushButton, saveAudioList)
-#. i18n: file: mainwindow.ui:689
+#. i18n: file: mainwindow.ui:698
 #. i18n: ectx: property (text), widget (QPushButton, aslsSave)
-#. i18n: file: mainwindow.ui:976
+#. i18n: file: mainwindow.ui:985
 #. i18n: ectx: property (text), widget (QPushButton, saveVideoList)
-#. i18n: file: mainwindow.ui:1096
+#. i18n: file: mainwindow.ui:1105
 #. i18n: ectx: property (text), widget (QPushButton, vslsSave)
-#. i18n: file: mainwindow.ui:1782
+#. i18n: file: mainwindow.ui:1791
 #. i18n: ectx: property (text), widget (QPushButton, saveInfo)
 #: rc.cpp:44 rc.cpp:56 rc.cpp:92 rc.cpp:104 rc.cpp:152
 msgid "Save"
-msgstr ""
+msgstr "保存"
 
-#. i18n: file: mainwindow.ui:599
+#. i18n: file: mainwindow.ui:608
 #. i18n: ectx: property (text), widget (QToolButton, aCancelSaveList)
-#. i18n: file: mainwindow.ui:719
+#. i18n: file: mainwindow.ui:728
 #. i18n: ectx: property (text), widget (QToolButton, aslsCancel)
-#. i18n: file: mainwindow.ui:1126
+#. i18n: file: mainwindow.ui:1135
 #. i18n: ectx: property (text), widget (QToolButton, vslsCancel)
 #: rc.cpp:47 rc.cpp:59 rc.cpp:107
 msgid "Return to Lists"
-msgstr ""
+msgstr "返回到列表"
 
-#. i18n: file: mainwindow.ui:638
+#. i18n: file: mainwindow.ui:647
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#. i18n: file: mainwindow.ui:1045
+#. i18n: file: mainwindow.ui:1054
 #. i18n: ectx: property (text), widget (QLabel, label_11)
 #: rc.cpp:50 rc.cpp:98
 msgid "Saved List Settings"
-msgstr ""
+msgstr "已保存的列表设置"
 
-#. i18n: file: mainwindow.ui:664
+#. i18n: file: mainwindow.ui:673
 #. i18n: ectx: property (text), widget (QLabel, label_9)
-#. i18n: file: mainwindow.ui:1071
+#. i18n: file: mainwindow.ui:1080
 #. i18n: ectx: property (text), widget (QLabel, label_10)
 #: rc.cpp:53 rc.cpp:101
 msgid "Name"
-msgstr ""
+msgstr "名称"
 
-#. i18n: file: mainwindow.ui:748
+#. i18n: file: mainwindow.ui:757
 #. i18n: ectx: attribute (label), widget (QWidget, videoTool_2)
 #: rc.cpp:62
 msgid "Video"
-msgstr ""
+msgstr "视频"
 
-#. i18n: file: mainwindow.ui:1009
+#. i18n: file: mainwindow.ui:1018
 #. i18n: ectx: property (text), widget (QToolButton, vCancelSaveList)
 #: rc.cpp:95
 msgid "Return To Lists"
-msgstr ""
+msgstr "返回到列表"
 
-#. i18n: file: mainwindow.ui:1352
+#. i18n: file: mainwindow.ui:1361
 #. i18n: ectx: property (text), widget (QLabel, listTitle)
 #: rc.cpp:116
 msgid "List Title"
-msgstr ""
+msgstr "列出标题"
 
-#. i18n: file: mainwindow.ui:1365
+#. i18n: file: mainwindow.ui:1374
 #. i18n: ectx: property (text), widget (QLabel, listSummary)
 #: rc.cpp:119
 msgid "Summary"
-msgstr ""
+msgstr "摘要"
 
-#. i18n: file: mainwindow.ui:1375
+#. i18n: file: mainwindow.ui:1384
 #. i18n: ectx: property (text), widget (QToolButton, sortList)
 #: rc.cpp:122
 msgid "Sort"
-msgstr ""
+msgstr "排序"
 
-#. i18n: file: mainwindow.ui:1399
+#. i18n: file: mainwindow.ui:1408
 #. i18n: ectx: property (text), widget (QToolButton, showInfo)
 #: rc.cpp:125
 msgid "Info"
-msgstr ""
-
-#. i18n: file: mainwindow.ui:1514
-#. i18n: ectx: property (text), widget (QLabel, notificationText)
-#: rc.cpp:128
-msgid "Notification Text"
-msgstr ""
+msgstr "信息"
 
-#. i18n: file: mainwindow.ui:1589
+#. i18n: file: mainwindow.ui:1502
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: rc.cpp:131
+#: rc.cpp:128
 msgid "Information"
-msgstr ""
+msgstr "信息"
 
-#. i18n: file: mainwindow.ui:1596
+#. i18n: file: mainwindow.ui:1509
 #. i18n: ectx: property (text), widget (QToolButton, editInfo)
-#: rc.cpp:134
+#: rc.cpp:131
 msgid "Edit"
-msgstr ""
+msgstr "编辑"
 
-#. i18n: file: mainwindow.ui:1663
+#. i18n: file: mainwindow.ui:1576
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:137
+#: rc.cpp:134
 msgid "1"
-msgstr ""
+msgstr "1"
 
-#. i18n: file: mainwindow.ui:1668
+#. i18n: file: mainwindow.ui:1581
 #. i18n: ectx: property (text), widget (QTreeWidget, infoView)
-#: rc.cpp:140
+#: rc.cpp:137
 msgid "2"
-msgstr ""
+msgstr "2"
+
+#. i18n: file: mainwindow.ui:1663
+#. i18n: ectx: property (text), widget (QLabel, notificationText)
+#: rc.cpp:146
+msgid "Notification Text"
+msgstr "通知文本"
 
-#. i18n: file: mainwindow.ui:1747
+#. i18n: file: mainwindow.ui:1756
 #. i18n: ectx: property (text), widget (QToolButton, previous)
 #: rc.cpp:149
 msgid "Previous"
-msgstr ""
+msgstr "向前"
 
-#. i18n: file: mainwindow.ui:1805
+#. i18n: file: mainwindow.ui:1814
 #. i18n: ectx: property (toolTip), widget (QPushButton, playAll)
 #: rc.cpp:155
 msgid "Play all media in list"
-msgstr ""
+msgstr "播放列表中全部媒体"
 
-#. i18n: file: mainwindow.ui:1834
+#. i18n: file: mainwindow.ui:1843
 #. i18n: ectx: property (toolTip), widget (QPushButton, playSelected)
 #: rc.cpp:161
 msgid "Play selected media in list"
-msgstr ""
+msgstr "播放列表中选中媒体"
 
-#. i18n: file: mainwindow.ui:2346
+#. i18n: file: mainwindow.ui:2355
 #. i18n: ectx: property (text), widget (QLabel, playbackMessage)
 #: rc.cpp:167
 msgid "Playback message"
-msgstr ""
+msgstr "播放消息"
 
-#. i18n: file: mainwindow.ui:2375
+#. i18n: file: mainwindow.ui:2384
 #. i18n: ectx: property (text), widget (QToolButton, showPlaylist)
 #: rc.cpp:170
 msgid "Playlist"
-msgstr ""
+msgstr "播放列表"
 
-#. i18n: file: mainwindow.ui:5177
+#. i18n: file: mainwindow.ui:5186
 #. i18n: ectx: property (text), widget (QToolButton, repeat)
-#. i18n: file: mainwindow.ui:5206
+#. i18n: file: mainwindow.ui:5215
 #. i18n: ectx: property (text), widget (QToolButton, shuffle)
-#. i18n: file: mainwindow.ui:5449
+#. i18n: file: mainwindow.ui:5461
 #. i18n: ectx: property (text), widget (SToolButton, fullScreen)
 #: rc.cpp:185 rc.cpp:191 rc.cpp:212
 msgid "[ ]"
-msgstr ""
+msgstr "[ ]"
 
-#. i18n: file: mainwindow.ui:5306
+#. i18n: file: mainwindow.ui:5318
 #. i18n: ectx: property (text), widget (QLabel, label_3)
 #: rc.cpp:194
 msgid "Video Settings"
-msgstr ""
+msgstr "视频设置"
 
-#. i18n: file: mainwindow.ui:5335
+#. i18n: file: mainwindow.ui:5347
 #. i18n: ectx: property (text), widget (QPushButton, saveShortCuts)
 #: rc.cpp:197
 msgid "Save Shortcuts"
-msgstr ""
+msgstr "保存快捷键"
 
-#. i18n: file: mainwindow.ui:5342
+#. i18n: file: mainwindow.ui:5354
 #. i18n: ectx: property (text), widget (QPushButton, cancelEditShortcuts)
 #: rc.cpp:200
 msgid "Cancel"
-msgstr ""
+msgstr "取消"
 
-#. i18n: file: mainwindow.ui:5402
+#. i18n: file: mainwindow.ui:5414
 #. i18n: ectx: property (toolTip), widget (QToolButton, collectionButton)
 #: rc.cpp:203
 msgid "View Media Lists"
-msgstr ""
+msgstr "查看媒体列表"
 
-#. i18n: file: mainwindow.ui:5446
+#. i18n: file: mainwindow.ui:5458
 #. i18n: ectx: property (toolTip), widget (SToolButton, fullScreen)
 #: rc.cpp:209
 msgid "Show full screen"
-msgstr ""
+msgstr "全屏显示"
 
-#. i18n: file: mainwindow.ui:5538
+#. i18n: file: mainwindow.ui:5550
 #. i18n: ectx: property (text), widget (QToolButton, seekTime)
 #: rc.cpp:218
 msgid "03:00"
-msgstr ""
+msgstr "03:00"
 
-#. i18n: file: mainwindow.ui:5699
+#. i18n: file: mainwindow.ui:5711
 #. i18n: ectx: property (toolTip), widget (Phonon::VolumeSlider, volumeSlider)
 #: rc.cpp:224
 msgid "Volume"
-msgstr ""
+msgstr "音量"
 
-#. i18n: file: mainwindow.ui:5725
+#. i18n: file: mainwindow.ui:5737
 #. i18n: ectx: property (text), widget (QToolButton, mediaPrevious)
-#. i18n: file: mainwindow.ui:5754
+#. i18n: file: mainwindow.ui:5766
 #. i18n: ectx: property (text), widget (SToolButton, mediaPlayPause)
-#. i18n: file: mainwindow.ui:5774
+#. i18n: file: mainwindow.ui:5786
 #. i18n: ectx: property (text), widget (QToolButton, mediaNext)
 #: rc.cpp:227 rc.cpp:230 rc.cpp:233
 msgid "..."
-msgstr ""
+msgstr "..."
 
 #: videosettings.cpp:73
 msgid "Brightness"
-msgstr ""
+msgstr "亮度"
 
 #: videosettings.cpp:83
 msgid "Contrast"
-msgstr ""
+msgstr "对比度"
 
 #: videosettings.cpp:93
 msgid "Hue"
-msgstr ""
+msgstr "色调"
 
 #: videosettings.cpp:103
 msgid "Saturation"
-msgstr ""
+msgstr "饱和度"
 
 #: videosettings.cpp:118
 msgid "Aspect Ratio Settings"
-msgstr ""
+msgstr "纵横比设置"
 
 #: videosettings.cpp:120
 msgid "Automatic"
-msgstr ""
+msgstr "自动"
 
 #: videosettings.cpp:122
 msgid "4:3"
-msgstr ""
+msgstr "4:3"
 
 #: videosettings.cpp:124
 msgid "16:9"
-msgstr ""
+msgstr "16:9"
 
 #: videosettings.cpp:126
 msgid "Fit"
-msgstr ""
+msgstr "自适应"
 
 #: videosettings.cpp:133
 msgid "Scaling Mode"
-msgstr ""
+msgstr "缩放模式"
 
 #: videosettings.cpp:135
 msgid "Scale to fit"
-msgstr ""
+msgstr "缩放以适应"
 
 #: videosettings.cpp:137
 msgid "Scale and crop"
-msgstr ""
+msgstr "缩放并裁剪"
 
 #: videosettings.cpp:147
 msgid "Restore Defaults"
-msgstr ""
+msgstr "还原为默认值"
 
 #: videosettings.cpp:149
 msgid "Hide"
-msgstr ""
+msgstr "隐藏"
 
-#: platform/audioclipslistengine.cpp:107 platform/audioclipslistengine.cpp:131
-#: platform/videolistengine.cpp:176
+#: platform/audioclipslistengine.cpp:86 platform/audioclipslistengine.cpp:125
+#: platform/videolistengine.cpp:117
 #, kde-format
 msgid "1 clip"
 msgid_plural "%1 clips"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 个剪辑"
 
-#: platform/audiostreamlistengine.cpp:103
-#: platform/audiostreamlistengine.cpp:134
+#: platform/audiostreamlistengine.cpp:85
+#: platform/audiostreamlistengine.cpp:131
 #, kde-format
 msgid "1 stream"
 msgid_plural "%1 streams"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 个媒体流"
 
-#: platform/audiostreamlistengine.cpp:108
+#: platform/audiostreamlistengine.cpp:90
 msgid "Create new audio stream item"
-msgstr ""
+msgstr "创建新音频流项目"
 
-#: platform/audiostreamlistengine.cpp:155
+#: platform/audiostreamlistengine.cpp:152
 msgid "Untitled Audio Stream"
-msgstr ""
+msgstr "未命名音频流"
 
-#: platform/audiostreamlistengine.cpp:156
+#: platform/audiostreamlistengine.cpp:153
 msgid "Select this item, click Info then Edit to enter audio stream info"
-msgstr ""
+msgstr "选中此项,点击信息,然后点击编辑查看音频流信息"
 
-#: platform/audiostreamlistengine.cpp:165
+#: platform/audiostreamlistengine.cpp:162
 msgid "New Audio Stream"
-msgstr ""
+msgstr "新建音频流"
 
 #: platform/cdlistengine.cpp:80
 #, kde-format
 msgid "Track %1"
-msgstr ""
+msgstr "音轨 %1"
 
 #: platform/cdlistengine.cpp:84
 #, kde-format
 msgid "Audio CD - %1 Tracks"
-msgstr ""
+msgstr "音频 CD - %1 条音轨"
 
 #: platform/cdlistengine.cpp:93
 #, kde-format
 msgid "1 track"
 msgid_plural "%1 tracks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 条音轨"
 
 #: platform/dvdlistengine.cpp:76
 #, kde-format
 msgid "Title %1"
-msgstr ""
+msgstr "标题 %1"
 
 #: platform/dvdlistengine.cpp:80
 #, kde-format
 msgid "DVD Video - %1 Titles"
-msgstr ""
+msgstr "DVD 视频 - %1 个标题"
 
 #: platform/filelistengine.cpp:69 platform/filelistengine.cpp:86
 msgid "Audio Files"
-msgstr ""
+msgstr "音频文件"
 
 #: platform/filelistengine.cpp:74 platform/filelistengine.cpp:97
 msgid "Video Files"
-msgstr ""
+msgstr "视频文件"
 
 #: platform/filelistengine.cpp:87 platform/filelistengine.cpp:98
-#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:381
-#: platform/savedlistsengine.cpp:102 platform/videolistengine.cpp:451
-#: platform/videolistengine.cpp:517
+#: platform/filelistengine.cpp:182 platform/mediaitemmodel.cpp:415
+#: platform/savedlistsengine.cpp:166 platform/videolistengine.cpp:566
+#: platform/videolistengine.cpp:676
 #, kde-format
 msgid "1 item"
 msgid_plural "%1 items"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 项"
 
 #: platform/filelistengine.cpp:122 platform/filelistengine.cpp:197
 msgid "Open audio file(s)"
-msgstr ""
+msgstr "打开音频文件"
 
 #: platform/filelistengine.cpp:127 platform/filelistengine.cpp:208
 msgid "Open folder containing audio file(s)"
-msgstr ""
+msgstr "打开包含音频文件的文件夹"
 
 #: platform/filelistengine.cpp:133 platform/filelistengine.cpp:202
 msgid "Open video file(s)"
-msgstr ""
+msgstr "打开视频文件"
 
 #: platform/filelistengine.cpp:138 platform/filelistengine.cpp:213
 msgid "Open folder containing video file(s)"
-msgstr ""
+msgstr "打开包含视频文件的文件夹"
 
 #: platform/filelistengine.cpp:144
 msgid "Open image file(s)"
-msgstr ""
+msgstr "打开图像文件"
 
 #: platform/filelistengine.cpp:149
 msgid "Open folder containing image file(s)"
-msgstr ""
+msgstr "打开包含图像文件的文件夹"
 
-#: platform/filelistengine.cpp:326
+#: platform/filelistengine.cpp:334
 msgid "Audio Clip"
-msgstr ""
+msgstr "音频剪辑"
 
-#: platform/filelistengine.cpp:413
-#, kde-format
-msgid "%1 - Episode %2"
-msgstr ""
-
-#: platform/filelistengine.cpp:415
-#, kde-format
-msgid "Episode %1"
-msgstr ""
-
-#: platform/mediaitemmodel.cpp:380
+#: platform/mediaitemmodel.cpp:413
 #, kde-format
 msgid "Multiple %1"
-msgstr ""
+msgstr "多个 %1"
 
-#: platform/mediaitemmodel.cpp:532
+#: platform/mediaitemmodel.cpp:572
 msgid "No results"
-msgstr ""
+msgstr "无结果"
 
-#: platform/mediaitemmodel.cpp:563
+#: platform/mediaitemmodel.cpp:603
 msgid "Add to playlist/Remove from playlist"
-msgstr ""
+msgstr "添加到播放列表 / 从播放列表删除"
 
 #: platform/medialistsengine.cpp:52 platform/medialistsengine.cpp:150
 msgid "Files and Folders"
-msgstr ""
+msgstr "文件和文件夹"
 
-#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:222
+#: platform/medialistsengine.cpp:57 platform/musiclistengine.cpp:132
 msgid "Artists"
-msgstr ""
+msgstr "艺人"
 
-#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:262
+#: platform/medialistsengine.cpp:61 platform/musiclistengine.cpp:192
 msgid "Albums"
-msgstr ""
+msgstr "专辑"
 
-#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:353
+#: platform/medialistsengine.cpp:65 platform/musiclistengine.cpp:331
 msgid "Songs"
-msgstr ""
+msgstr "曲目"
 
 #: platform/medialistsengine.cpp:69 platform/medialistsengine.cpp:159
-#: platform/musiclistengine.cpp:306 platform/videolistengine.cpp:402
+#: platform/musiclistengine.cpp:256 platform/videolistengine.cpp:467
 msgid "Genres"
-msgstr ""
+msgstr "流派"
 
 #: platform/medialistsengine.cpp:73
 msgid "Clips"
-msgstr ""
+msgstr "剪辑"
 
 #: platform/medialistsengine.cpp:77
 msgid "Audio Streams"
-msgstr ""
+msgstr "音频流"
 
 #: platform/medialistsengine.cpp:100 platform/medialistsengine.cpp:190
-#: platform/semanticslistengine.cpp:89
+#: platform/semanticslistengine.cpp:107
 msgid "Frequently Played"
-msgstr ""
+msgstr "最常播放"
 
 #: platform/medialistsengine.cpp:104 platform/medialistsengine.cpp:194
-#: platform/semanticslistengine.cpp:115
+#: platform/semanticslistengine.cpp:147
 msgid "Recently Played"
-msgstr ""
+msgstr "最近播放"
 
 #: platform/medialistsengine.cpp:108 platform/medialistsengine.cpp:198
-#: platform/semanticslistengine.cpp:140
+#: platform/semanticslistengine.cpp:188
 msgid "Highest Rated"
-msgstr ""
+msgstr "评分较高"
 
-#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:369
+#: platform/medialistsengine.cpp:155 platform/videolistengine.cpp:426
 msgid "Movies"
-msgstr ""
+msgstr "影片"
 
-#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:224
+#: platform/medialistsengine.cpp:163 platform/videolistengine.cpp:181
 msgid "TV Shows"
-msgstr ""
+msgstr "电视节目"
 
-#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:175
+#: platform/medialistsengine.cpp:167 platform/videolistengine.cpp:116
 msgid "Video Clips"
-msgstr ""
+msgstr "视频剪辑"
 
-#: platform/musiclistengine.cpp:224
+#: platform/musiclistengine.cpp:134
 #, kde-format
 msgid "Artists - %1"
-msgstr ""
+msgstr "艺人 - %1"
 
-#: platform/musiclistengine.cpp:226
+#: platform/musiclistengine.cpp:136
 #, kde-format
 msgid "1 artist"
 msgid_plural "%1 artists"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 位艺人"
 
-#: platform/musiclistengine.cpp:264 platform/musiclistengine.cpp:267
+#: platform/musiclistengine.cpp:194 platform/musiclistengine.cpp:197
 #, kde-format
 msgid "Albums - %1"
-msgstr ""
+msgstr "专辑 - %1"
 
-#: platform/musiclistengine.cpp:270
+#: platform/musiclistengine.cpp:200
 #, kde-format
 msgid "Albums - %1 - %2"
-msgstr ""
+msgstr "专辑 - %1 - %2"
 
-#: platform/musiclistengine.cpp:273
+#: platform/musiclistengine.cpp:203
 #, kde-format
 msgid "1 album"
 msgid_plural "%1 albums"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 张专辑"
 
-#: platform/musiclistengine.cpp:307 platform/videolistengine.cpp:403
+#: platform/musiclistengine.cpp:257 platform/videolistengine.cpp:468
 #, kde-format
 msgid "1 genre"
 msgid_plural "%1 genres"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 个流派"
 
-#: platform/musiclistengine.cpp:355 platform/musiclistengine.cpp:383
+#: platform/musiclistengine.cpp:333 platform/musiclistengine.cpp:388
 #, kde-format
 msgid "1 song"
 msgid_plural "%1 songs"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 首曲目"
 
-#: platform/videolistengine.cpp:216 platform/videolistengine.cpp:332
+#: platform/videolistengine.cpp:173 platform/videolistengine.cpp:358
 msgid "Uncategorized TV Shows"
-msgstr ""
+msgstr "未分类的电视节目"
 
-#: platform/videolistengine.cpp:225
+#: platform/videolistengine.cpp:182
 #, kde-format
 msgid "1 show"
 msgid_plural "%1 shows"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 个节目"
 
-#: platform/videolistengine.cpp:253
+#: platform/videolistengine.cpp:230
 #, kde-format
 msgid "Season %1"
-msgstr ""
+msgstr "上演期 %1"
 
-#: platform/videolistengine.cpp:272
+#: platform/videolistengine.cpp:254
 msgid "Uncategorized seasons"
-msgstr ""
+msgstr "未分类的上演期"
 
-#: platform/videolistengine.cpp:279
+#: platform/videolistengine.cpp:261
 #, kde-format
 msgid "Seasons - %1"
-msgstr ""
+msgstr "上演期 - %1"
 
-#: platform/videolistengine.cpp:280
+#: platform/videolistengine.cpp:262
 #, kde-format
 msgid "1 season"
 msgid_plural "%1 seasons"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 个上演期"
 
-#: platform/videolistengine.cpp:334
+#: platform/videolistengine.cpp:360
 #, kde-format
 msgid "%1 - Season %2"
-msgstr ""
+msgstr "%1 - 上演期 %2"
 
-#: platform/videolistengine.cpp:336
+#: platform/videolistengine.cpp:362
 #, kde-format
 msgid "%1 - Uncategorized Seasons"
-msgstr ""
+msgstr "%1 - 未分类的上演期"
 
-#: platform/videolistengine.cpp:338
+#: platform/videolistengine.cpp:364
 #, kde-format
 msgid "1 episode"
 msgid_plural "%1 episodes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 个片段"
 
-#: platform/videolistengine.cpp:371
+#: platform/videolistengine.cpp:428
 #, kde-format
 msgid "Movies - %1"
-msgstr ""
+msgstr "影片 - %1"
 
-#: platform/videolistengine.cpp:373
+#: platform/videolistengine.cpp:430
 #, kde-format
 msgid "1 movie"
 msgid_plural "%1 movies"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%1 部影片"
+
+#~ msgid "%1 - Episode %2"
+#~ msgstr "%1 - 片段 %2"
+
+#~ msgid "Episode %1"
+#~ msgstr "片段 %1"

-- 
bangarang packaging



More information about the pkg-multimedia-commits mailing list