[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