public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Rex Dieter <rdieter@fedoraproject.org>
To: git-commits@fedoraproject.org
Subject: [rpms/amarok] epel10.2: - 20090923git snapshot
Date: Mon, 06 Jul 2026 18:30:55 GMT [thread overview]
Message-ID: <178336265533.1.24544008807803271.rpms-amarok-64b737e0ef4c@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/amarok
Branch : epel10.2
Commit : 64b737e0ef4cd288315a3d606a74b17f0f5d80d5
Author : Rex Dieter <rdieter@fedoraproject.org>
Date : 2009-09-24T01:34:17+00:00
Stats : +1356/-6 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/amarok/c/64b737e0ef4cd288315a3d606a74b17f0f5d80d5?branch=epel10.2
Log:
- 20090923git snapshot
---
diff --git a/amarok.spec b/amarok.spec
index aeee3e3..c7ab8ca 100644
--- a/amarok.spec
+++ b/amarok.spec
@@ -1,17 +1,23 @@
+%define snap 20090923git
+
Name: amarok
Summary: Media player
Version: 2.1.90
-Release: 1%{?dist}
+Release: 2.%{snap}%{?dist}
Group: Applications/Multimedia
License: GPLv2+
Url: http://amarok.kde.org/
Source0: http://download.kde.org/unstable/amarok/%{version}/src/amarok-%{version}.tar.bz2
+#Source0: amarok-%{version}-%{snap}.tar.bz2
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Patch50: amarok-2.0.90-qtscript_not_required.patch
+# mostly a: git diff v2.1.90
+Patch100: post-2.1.90-%{snap}.patch
+
BuildRequires: curl-devel
BuildRequires: desktop-file-utils
BuildRequires: gettext
@@ -72,9 +78,10 @@ Obsoletes: amarok-utilities < 2.0.96
%prep
-%setup -q
+%setup -q
%patch50 -p1 -b .qtscript_not_required
+%patch100 -p1 -b .20090923git
%build
@@ -91,10 +98,10 @@ rm -rf %{buildroot}
make install DESTDIR=%{buildroot} -C %{_target_platform}
-%find_lang amarok
-%find_lang amarokcollectionscanner_qt
-%find_lang amarokpkg
-%find_lang amarok_scriptengine_qscript
+%find_lang amarok
+%find_lang amarokcollectionscanner_qt
+%find_lang amarokpkg
+%find_lang amarok_scriptengine_qscript
cat amarokpkg.lang >> amarok.lang
cat amarok_scriptengine_qscript.lang >> amarok.lang
@@ -166,6 +173,9 @@ fi
%changelog
+* Wed Sep 23 2009 Rex Dieter <rdieter@fedoraproject.org> 2.1.90-2.20090923git
+- 20090923git snapshot
+
* Mon Sep 21 2009 Rex Dieter <rdieter@fedoraproject.org> 2.1.90-1
- amarok-2.1.90 (2.2rc1)
diff --git a/post-2.1.90-20090923git.patch b/post-2.1.90-20090923git.patch
new file mode 100644
index 0000000..f7b144e
--- /dev/null
+++ b/post-2.1.90-20090923git.patch
@@ -0,0 +1,1340 @@
+diff --git a/ChangeLog b/ChangeLog
+index 2d97559..6a4e307 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -2,6 +2,20 @@ Amarok ChangeLog
+ ================
+ (C) 2002-2009 the Amarok authors.
+
++VERSION 2.2
++ CHANGES:
++ * More collection scanning speedups.
++
++ BUGFIXES:
++ * Fix photos applet not working after resuming playback. (BR 206829)
++ * Fix regression where the genre field in the Tag Dialog would show the
++ composer of the track. (BR 208255)
++ * Don't reshuffle the playlist every time the active track changes when
++ * using a random sort order.
++ * Fix the Various Artist node sometimes being shown in the Collection
++ Browser with nothing underneath it (or an empty "Unknown" album).
++ * Fix some tracks' tags not being saved correctly to the database.
++ (BR 202021)
+
+ VERSION 2.2-rc1
+ FEATURES:
+@@ -23,6 +37,7 @@ VERSION 2.2-rc1
+ * Added "Lock layout" option to the main window's context menu.
+
+ BUGFIXES:
++ * Fix wikipedia engine refined search broken. (BR 208024)
+ * Crash in QTextCodec while scanning collection has been fixed.
+ Apparently. (BR 191447)
+ * A dialog with "Can not write playlist (/)" was displayed when using
+diff --git a/src/collection/iphoneos/amarok_collection-iphoneoscollection.desktop b/src/collection/iphoneos/amarok_collection-iphoneoscollection.desktop
+index 80396ef..373d71c 100644
+--- a/src/collection/iphoneos/amarok_collection-iphoneoscollection.desktop
++++ b/src/collection/iphoneos/amarok_collection-iphoneoscollection.desktop
+@@ -17,6 +17,7 @@ Name[nn]=Skriveverna samling for iPhone OS 3.0
+ Name[pl]=Kolekcja tylko-do-odczytu iPhone OS 3.0
+ Name[pt]=Colecção Apenas para Leitura do iPhone OS 3.0
+ Name[pt_BR]=Coleção Somente para Leitura do iPhone OS 3.0
++Name[ru]=Коллекция iPhone OS 3.0 (только для чтения)
+ Name[sr]=Збирка И‑фон ОС‑а 3.0 (само за читање)
+ Name[sr@latin]=Zbirka iPhoneOS‑a 3.0 (samo za čitanje)
+ Name[sv]=iPhone OS 3.0 skrivskyddad samling
+@@ -40,6 +41,7 @@ Comment[nn]=Amarok-samlingstillegg for iPhone OS 3.0
+ Comment[pl]=Wtyczka kolekcji tylko-do-odczytu iPhone OS 3.0 dla Amaroka
+ Comment[pt]=Um 'plugin' da colecção, apenas para leitura, do iPhone OS 3.0 para o Amarok
+ Comment[pt_BR]=Plugin de coleção somente para Leitura do iPhone OS 3.0, para o Amarok
++Comment[ru]=Модуль коллекция iPhone OS 3.0 (только для чтения)
+ Comment[sr]=Прикључак збирке на И‑фон ОС‑у 3.0 (само за читање) за Амарок
+ Comment[sr@latin]=Priključak zbirke na iPhoneOS‑u 3.0 (samo za čitanje) za Amarok
+ Comment[sv]=Insticksprogram med iPhone OS 3.0 skrivskyddad samling för Amarok
+diff --git a/src/collection/ipodcollection/amarok_collection-ipodcollection.desktop b/src/collection/ipodcollection/amarok_collection-ipodcollection.desktop
+index 4fda617..48c640a 100644
+--- a/src/collection/ipodcollection/amarok_collection-ipodcollection.desktop
++++ b/src/collection/ipodcollection/amarok_collection-ipodcollection.desktop
+@@ -36,7 +36,7 @@ Name[pl]=Kolekcja iPod
+ Name[pt]=Colecção do IPod
+ Name[pt_BR]=Coleção iPod
+ Name[ro]=Colecție Ipod
+-Name[ru]=Коллекция Ipod
++Name[ru]=Коллекция iPod
+ Name[sl]=Zbirka iPod
+ Name[sr]=Збирка и‑пода
+ Name[sr@latin]=Zbirka iPoda
+@@ -84,7 +84,7 @@ Comment[pl]=Wtyczka kolekcji iPoda dla Amaroka
+ Comment[pt]=Um 'plugin' da colecção do IPod para o Amarok
+ Comment[pt_BR]=Plug-in de coleção iPod para o Amarok
+ Comment[ro]=Modul de colecție Ipod pentru Amarok
+-Comment[ru]=Модуль коллекции Ipod для Amarok
++Comment[ru]=Модуль коллекции iPod для Amarok
+ Comment[sl]=Vstavek za zbirko iPod za Amarok
+ Comment[sr]=Прикључак збирке на и‑поду за Амарок
+ Comment[sr@latin]=Priključak zbirke na iPodu za Amarok
+diff --git a/src/collection/mysqlecollection/amarok_collection-mysqlecollection.desktop b/src/collection/mysqlecollection/amarok_collection-mysqlecollection.desktop
+index c3ae12d..1decebb 100644
+--- a/src/collection/mysqlecollection/amarok_collection-mysqlecollection.desktop
++++ b/src/collection/mysqlecollection/amarok_collection-mysqlecollection.desktop
+@@ -18,6 +18,7 @@ Name[nn]=MySQLe-samling
+ Name[pl]=Kolekcja MySQLe
+ Name[pt]=Colecção de MySQLe
+ Name[pt_BR]=Coleção MySQLe
++Name[ru]=Коллекция MySQLe
+ Name[sr]=Збирка на МајСКуЛe‑у
+ Name[sr@latin]=Zbirka na MySQLe‑u
+ Name[sv]=MySQL-samling
+diff --git a/src/collection/mysqlservercollection/amarok_collection-mysqlservercollection.desktop b/src/collection/mysqlservercollection/amarok_collection-mysqlservercollection.desktop
+index 3957d65..d2726d2 100644
+--- a/src/collection/mysqlservercollection/amarok_collection-mysqlservercollection.desktop
++++ b/src/collection/mysqlservercollection/amarok_collection-mysqlservercollection.desktop
+@@ -18,6 +18,7 @@ Name[nn]=MySQLServer-samling
+ Name[pl]=Kolekcja MySQLServer
+ Name[pt]=Colecção de MySQL (Servidor)
+ Name[pt_BR]=Coleção MySQLServer
++Name[ru]=Коллекция MySQLServer
+ Name[sr]=Збирка на серверу МајСКуЛ‑а
+ Name[sr@latin]=Zbirka na serveru MySQL‑a
+ Name[sv]=MySQLServer-samling
+diff --git a/src/collection/sqlcollection/ScanResultProcessor.cpp b/src/collection/sqlcollection/ScanResultProcessor.cpp
+index dcc45f8..c9694f4 100644
+--- a/src/collection/sqlcollection/ScanResultProcessor.cpp
++++ b/src/collection/sqlcollection/ScanResultProcessor.cpp
+@@ -114,7 +114,7 @@ ScanResultProcessor::doneWithImages()
+ if( key.first.isEmpty() || key.second.isEmpty() )
+ continue;
+
+- int artist = artistId( key.first );
++ int artist = genericId( "artists", key.first );
+ int album = albumId( key.second, artist );
+
+ // Will automatically add the image path to the database if needed
+@@ -261,7 +261,7 @@ ScanResultProcessor::processDirectory( const QList<QVariantMap > &data )
+ {
+ foreach( const QVariantMap &row, data )
+ {
+- int artist = artistId( row.value( Field::ARTIST ).toString() );
++ int artist = genericId( "artists", row.value( Field::ARTIST ).toString() );
+ addTrack( row, artist );
+ }
+ }
+@@ -269,7 +269,7 @@ ScanResultProcessor::processDirectory( const QList<QVariantMap > &data )
+ {
+ QString albumArtist = findAlbumArtist( artists, data.count() );
+ //an empty string means that no albumartist was found
+- int artist = albumArtist.isEmpty() ? 0 : artistId( albumArtist );
++ int artist = albumArtist.isEmpty() ? 0 : genericId( "artists", albumArtist );
+
+ debug() << "albumartist " << albumArtist << "for artists" << artists;
+ foreach( const QVariantMap &row, data )
+@@ -383,37 +383,23 @@ ScanResultProcessor::addTrack( const QVariantMap &trackData, int albumArtistId )
+ }
+
+ if( dir.count() == 1 )
+- {
+ compilationId = checkExistingAlbums( albumName );
+- }
+
+- if( 0 == compilationId )
+- {
+- album = albumId( albumName, albumArtistId );
+- }
++ //run a single query to fetch these at once, to save time
++ //then values will be cached in local maps, so can use the same calls below
++ databaseIdFetch( trackData.value( Field::ARTIST ).toString(),
++ trackData.value( Field::GENRE ).toString(),
++ trackData.value( Field::COMPOSER ).toString(),
++ trackData.value( Field::YEAR ).toString(),
++ albumName, albumArtistId, compilationId );
+
+- bool needToQuery = false;
+- if( !m_artists.contains( trackData.value( Field::ARTIST ).toString() ) ||
+- !m_genre.contains( trackData.value( Field::GENRE ).toString() ) ||
+- !m_composer.contains( trackData.value( Field::COMPOSER ).toString() ) ||
+- !m_year.contains( trackData.value( Field::YEAR ).toString() ) )
+- needToQuery = true;
++ int artist = genericId( "artists", trackData.value( Field::ARTIST ).toString() );
++ int genre = genericId( "genres", trackData.value( Field::GENRE ).toString() );
++ int composer = genericId( "composers", trackData.value( Field::COMPOSER ).toString() );
++ int year = genericId( "years", trackData.value( Field::YEAR ).toString() );
+
+- if( needToQuery )
+- {
+- //run a single query to fetch these at once, to save time
+- //then values will be cached in local maps, so can use the same calls below
+- databaseIdFetch( trackData.value( Field::ARTIST ).toString(),
+- trackData.value( Field::GENRE ).toString(),
+- trackData.value( Field::COMPOSER ).toString(),
+- trackData.value( Field::YEAR ).toString(),
+- albumName, albumArtistId );
+- }
+-
+- int artist = artistId( trackData.value( Field::ARTIST ).toString() );
+- int genre = genreId( trackData.value( Field::GENRE ).toString() );
+- int composer = composerId( trackData.value( Field::COMPOSER ).toString() );
+- int year = yearId( trackData.value( Field::YEAR ).toString() );
++ if( !compilationId )
++ album = albumId( albumName, albumArtistId );
+
+ QString uid = trackData.value( Field::UNIQUEID ).toString();
+
+@@ -473,131 +459,86 @@ ScanResultProcessor::addTrack( const QVariantMap &trackData, int albumArtistId )
+ }
+
+ int
+-ScanResultProcessor::artistId( const QString &artist )
++ScanResultProcessor::genericId( const QString &key, const QString &value )
+ {
+- if( m_artists.contains( artist ) )
+- return m_artists.value( artist );
+- QString query = QString( "SELECT id FROM artists_temp WHERE name = '%1';" ).arg( m_collection->escape( artist ) );
+- QStringList res = m_collection->query( query );
+- int id = 0;
+- if( res.isEmpty() )
+- id = artistInsert( artist );
++ QMap<QString, int> *currMap;
++ if( key == "artists" )
++ currMap = &m_artists;
++ else if( key == "genres" )
++ currMap = &m_genres;
++ else if( key == "years" )
++ currMap = &m_years;
++ else if( key == "composers" )
++ currMap = &m_composers;
+ else
+- id = res[0].toInt();
+- m_artists.insert( artist, id );
+- return id;
+-}
+-
+-int
+-ScanResultProcessor::artistInsert( const QString &artist )
+-{
+- QString insert = QString( "INSERT INTO artists_temp( name ) VALUES ('%1');" ).arg( m_collection->escape( artist ) );
+- int id = m_collection->insert( insert, "artists_temp" );
+- return id;
+-}
+-
+-int
+-ScanResultProcessor::genreId( const QString &genre )
+-{
+- if( m_genre.contains( genre ) )
+- return m_genre.value( genre );
+- QString query = QString( "SELECT id FROM genres_temp WHERE name = '%1';" ).arg( m_collection->escape( genre ) );
+- QStringList res = m_collection->query( query );
+- int id = 0;
+- if( res.isEmpty() )
+- id = genreInsert( genre );
+- else
+- id = res[0].toInt();
+- m_genre.insert( genre, id );
+- return id;
+-}
+-
+-int
+-ScanResultProcessor::genreInsert( const QString &genre )
+-{
+- QString insert = QString( "INSERT INTO genres_temp( name ) VALUES ('%1');" ).arg( m_collection->escape( genre ) );
+- int id = m_collection->insert( insert, "genres_temp" );
+- return id;
+-}
+-
+-int
+-ScanResultProcessor::composerId( const QString &composer )
+-{
+- if( m_composer.contains( composer ) )
+- return m_composer.value( composer );
+- QString query = QString( "SELECT id FROM composers_temp WHERE name = '%1';" ).arg( m_collection->escape( composer ) );
+- QStringList res = m_collection->query( query );
+- int id = 0;
+- if( res.isEmpty() )
+- id = composerInsert( composer );
+- else
+- id = res[0].toInt();
+- m_composer.insert( composer, id );
+- return id;
+-}
++ {
++ debug() << "Holy hell Batman, what just happened in genericId?";
++ return -9999;
++ }
+
+-int
+-ScanResultProcessor::composerInsert( const QString &composer )
+-{
+- QString insert = QString( "INSERT INTO composers_temp( name ) VALUES ('%1');" ).arg( m_collection->escape( composer ) );
+- int id = m_collection->insert( insert, "composers_temp" );
+- return id;
+-}
++ if( currMap->contains( value ) )
++ return currMap->value( value );
+
+-int
+-ScanResultProcessor::yearId( const QString &year )
+-{
+- if( m_year.contains( year ) )
+- return m_year.value( year );
+- QString query = QString( "SELECT id FROM years_temp WHERE name = '%1';" ).arg( m_collection->escape( year ) );
++ QString query = QString( "SELECT id FROM %1_temp WHERE name = '%2';" ).arg( key, m_collection->escape( value ) );
+ QStringList res = m_collection->query( query );
+ int id = 0;
+ if( res.isEmpty() )
+- id = yearInsert( year );
++ id = genericInsert( key, value );
+ else
+ id = res[0].toInt();
+- m_year.insert( year, id );
++ currMap->insert( value, id );
+ return id;
+ }
+
+ int
+-ScanResultProcessor::yearInsert( const QString &year )
++ScanResultProcessor::genericInsert( const QString &key, const QString &value )
+ {
+- QString insert = QString( "INSERT INTO years_temp( name ) VALUES ('%1');" ).arg( m_collection->escape( year ) );
+- int id = m_collection->insert( insert, "years_temp" );
++ QString insert = QString( "INSERT INTO %1_temp( name ) VALUES ('%2');" ).arg( key, m_collection->escape( value ) );
++ int id = m_collection->insert( insert, QString( "%1_temp" ).arg( key ) );
+ return id;
+ }
+
+ void
+-ScanResultProcessor::databaseIdFetch( const QString &artist, const QString &genre, const QString &composer, const QString &year, const QString &album, int albumArtistId )
++ScanResultProcessor::databaseIdFetch( const QString &artist, const QString &genre, const QString &composer, const QString &year, const QString &album, int albumArtistId, int compilationId )
+ {
+ //DEBUG_BLOCK
+- Q_UNUSED( album );
+- Q_UNUSED( albumArtistId );
++ QPair<QString, int> albumKey( album, albumArtistId );
++ bool albumFound = compilationId || m_albums.contains( albumKey );
++ bool artistFound = m_artists.contains( artist );
++ bool genreFound = m_genres.contains( genre );
++ bool composerFound = m_composers.contains( composer );
++ bool yearFound = m_years.contains( year );
++
++ if( albumFound && artistFound && genreFound && composerFound && yearFound )
++ return; //nothing to do
++
+ int l = 0; //album
+- bool albumFound = false;
+ int a = 0; //artist
+- bool artistFound = false;
+ int g = 0; //genre
+- bool genreFound = false;
+ int c = 0; //composer
+- bool composerFound = false;
+ int y = 0; //year
+- bool yearFound = false;
+
+ QString query;
+-/*
+- if( albumArtistId == 0 )
+- query += QString( "SELECT id, CONCAT('ALBUMNAME_', name) AS name FROM albums_temp WHERE artist IS NULL AND name = '%1' " )
+- .arg( m_collection->escape( album ) );
+- else
+- query += QString( "SELECT id, CONCAT('ALBUMNAME_', name) AS name FROM albums_temp WHERE artist = %1 AND name = '%2' " )
+- .arg( QString::number( albumArtistId ), m_collection->escape( album ) );
+-*/
+- query += QString( "SELECT id, CONCAT('ARTISTNAME_', name) AS name FROM artists_temp WHERE name = '%1' " ).arg( m_collection->escape( artist ) );
+- query += QString( "UNION ALL SELECT id, CONCAT('GENRENAME_', name) AS name FROM genres_temp WHERE name = '%1' " ).arg( m_collection->escape( genre ) );
+- query += QString( "UNION ALL SELECT id, CONCAT('COMPOSERNAME_', name) AS name FROM composers_temp WHERE name = '%1' " ).arg( m_collection->escape( composer ) );
+- query += QString( "UNION ALL SELECT id, CONCAT('YEARSNAME_', name) AS name FROM years_temp WHERE name = '%1';" ).arg( m_collection->escape( year ) );
++ if( !albumFound )
++ {
++ if( albumArtistId == 0 )
++ query += QString( "SELECT id, CONCAT('ALBUMNAME_', name) AS name FROM albums_temp WHERE artist IS NULL AND name = '%1' " )
++ .arg( m_collection->escape( album ) );
++ else
++ query += QString( "SELECT id, CONCAT('ALBUMNAME_', name) AS name FROM albums_temp WHERE artist = %1 AND name = '%2' " )
++ .arg( QString::number( albumArtistId ), m_collection->escape( album ) );
++ }
++ if( !artistFound )
++ query += QString( "UNION ALL SELECT id, CONCAT('ARTISTNAME_', name) AS name FROM artists_temp WHERE name = '%1' " ).arg( m_collection->escape( artist ) );
++ if( !genreFound )
++ query += QString( "UNION ALL SELECT id, CONCAT('GENRENAME_', name) AS name FROM genres_temp WHERE name = '%1' " ).arg( m_collection->escape( genre ) );
++ if( !composerFound )
++ query += QString( "UNION ALL SELECT id, CONCAT('COMPOSERNAME_', name) AS name FROM composers_temp WHERE name = '%1' " ).arg( m_collection->escape( composer ) );
++ if( !yearFound )
++ query += QString( "UNION ALL SELECT id, CONCAT('YEARSNAME_', name) AS name FROM years_temp WHERE name = '%1';" ).arg( m_collection->escape( year ) );
++ if( query.startsWith( "UNION ALL " ) )
++ query.remove( 0, 10 );
++
+ QStringList res = m_collection->query( query );
+ int index = 0;
+ QString first;
+@@ -607,58 +548,55 @@ ScanResultProcessor::databaseIdFetch( const QString &artist, const QString &genr
+ first = res.at( index++ );
+ second = res.at( index++ );
+ a = first.toInt();
+- if( second == QString( "ALBUMNAME_" + album ) )
++ if( !albumFound && second == QString( "ALBUMNAME_" + album ) )
+ {
+ l = first.toInt();
+ albumFound = true;
+ }
+- else if( second == QString( "ARTISTNAME_" + artist ) )
++ else if( !artistFound && second == QString( "ARTISTNAME_" + artist ) )
+ {
+ a = first.toInt();
+ artistFound = true;
+ }
+- else if( second == QString( "GENRENAME_" + genre ) )
++ else if( !genreFound && second == QString( "GENRENAME_" + genre ) )
+ {
+ g = first.toInt();
+ genreFound = true;
+ }
+- else if( second == QString( "COMPOSERNAME_" + composer ) )
++ else if( !composerFound && second == QString( "COMPOSERNAME_" + composer ) )
+ {
+ c = first.toInt();
+ composerFound = true;
+ }
+- else if( second == QString( "YEARSNAME_" + year ) )
++ else if( !yearFound && second == QString( "YEARSNAME_" + year ) )
+ {
+ y = first.toInt();
+ yearFound = true;
+ }
+ }
+- /*
+ if( !albumFound )
+ {
+- QPair<QString, int> key( album, albumArtistId );
+- m_albums.insert( key, albumInsert( album, albumArtistId ) );
++ m_albums.insert( albumKey, albumInsert( album, albumArtistId ) );
+ albumFound = true;
+ }
+- */
+ if( !artistFound )
+ {
+- m_artists.insert( artist, artistInsert( artist ) );
++ m_artists.insert( artist, genericInsert( "artists", artist ) );
+ artistFound = true;
+ }
+ if( !genreFound )
+ {
+- m_genre.insert( genre, genreInsert( genre ) );
++ m_genres.insert( genre, genericInsert( "genres", genre ) );
+ genreFound = true;
+ }
+ if( !composerFound )
+ {
+- m_composer.insert( composer, composerInsert( composer ) );
++ m_composers.insert( composer, genericInsert( "composers", composer ) );
+ composerFound = true;
+ }
+ if( !yearFound )
+ {
+- m_year.insert( year, yearInsert( year ) );
++ m_years.insert( year, genericInsert( "years", year ) );
+ yearFound = true;
+ }
+ }
+diff --git a/src/collection/sqlcollection/ScanResultProcessor.h b/src/collection/sqlcollection/ScanResultProcessor.h
+index fffc9e7..49c2b8b 100644
+--- a/src/collection/sqlcollection/ScanResultProcessor.h
++++ b/src/collection/sqlcollection/ScanResultProcessor.h
+@@ -58,15 +58,9 @@ class ScanResultProcessor : public QObject
+ private:
+ void addTrack( const QVariantMap &trackData, int albumArtistId );
+
+- int artistId( const QString &artist );
+- int artistInsert( const QString &artist );
+- int genreId( const QString &genre );
+- int genreInsert( const QString &genre );
+- int composerId( const QString &composer );
+- int composerInsert( const QString &composer );
+- int yearId( const QString &year );
+- int yearInsert( const QString &year );
+- void databaseIdFetch( const QString &artist, const QString &genre, const QString &composer, const QString &year, const QString &album, int albumArtistId );
++ int genericId( const QString &key, const QString &value );
++ int genericInsert( const QString &key, const QString &value );
++ void databaseIdFetch( const QString &artist, const QString &genre, const QString &composer, const QString &year, const QString &album, int albumArtistId, int compilationId );
+ int imageId( const QString &image, int albumId );
+ int albumId( const QString &album, int artistId );
+ int albumInsert( const QString &album, int artistId );
+@@ -90,9 +84,9 @@ class ScanResultProcessor : public QObject
+ bool m_setupComplete;
+
+ QMap<QString, int> m_artists;
+- QMap<QString, int> m_genre;
+- QMap<QString, int> m_year;
+- QMap<QString, int> m_composer;
++ QMap<QString, int> m_genres;
++ QMap<QString, int> m_years;
++ QMap<QString, int> m_composers;
+ QMap<QPair<QString, int>, int> m_albums;
+ QMap<QPair<QString, int>, int> m_images;
+ QMap<QString, int> m_directories;
+diff --git a/src/collection/sqlcollection/SqlQueryMaker.cpp b/src/collection/sqlcollection/SqlQueryMaker.cpp
+index a6f98fb..10cc629 100644
+--- a/src/collection/sqlcollection/SqlQueryMaker.cpp
++++ b/src/collection/sqlcollection/SqlQueryMaker.cpp
+@@ -992,6 +992,7 @@ SqlQueryMaker::handleArtists( const QStringList &result )
+ void
+ SqlQueryMaker::handleAlbums( const QStringList &result )
+ {
++ DEBUG_BLOCK
+ AlbumList albums;
+ SqlRegistry* reg = m_collection->registry();
+ for( QStringListIterator iter( result ); iter.hasNext(); )
+@@ -999,6 +1000,10 @@ SqlQueryMaker::handleAlbums( const QStringList &result )
+ QString name = iter.next();
+ QString id = iter.next();
+ QString artist = iter.next();
++ //HACK: The following is a HACK and should be fixed by fixing the HACK
++ //of always including the "tracks" table in queries in SqlQueryMaker
++ if( name.isEmpty() && id.isEmpty() && artist.isEmpty() )
++ continue;
+ albums.append( reg->getAlbum( name, id.toInt(), artist.toInt() ) );
+ }
+ emitOrStoreProperResult( AlbumPtr, albums );
+diff --git a/src/collection/umscollection/amarok_collection-umscollection.desktop b/src/collection/umscollection/amarok_collection-umscollection.desktop
+index 0124c1b..1b016e0 100644
+--- a/src/collection/umscollection/amarok_collection-umscollection.desktop
++++ b/src/collection/umscollection/amarok_collection-umscollection.desktop
+@@ -15,6 +15,7 @@ Name[nn]=Universell masselagringssamling
+ Name[pl]=Kolekcja na urządzeniu danych
+ Name[pt]=Colecção de Armazenamento em Massa Universal
+ Name[pt_BR]=Coleção de Armazenamento Universal em Massa
++Name[ru]=Коллекция UMS
+ Name[sr]=Збирка на универзалном масовном складишту
+ Name[sr@latin]=Zbirka na univerzalnom masovnom skladištu
+ Name[sv]=Samling på generell lagringsenhet
+diff --git a/src/context/Applet.cpp b/src/context/Applet.cpp
+index 38bc709..ab2c0ac 100644
+--- a/src/context/Applet.cpp
++++ b/src/context/Applet.cpp
+@@ -39,7 +39,8 @@ namespace Context
+ Context::Applet::Applet( QObject * parent, const QVariantList& args )
+ : Plasma::Applet( parent, args )
+ , m_collapsed( false )
+- , m_animationId( 0 )
++ , m_animationIdOn( 0 )
++ , m_animationIdOff( 0 )
+ , m_transient( 0 )
+ , m_standardPadding( 6.0 )
+ , m_textBackground( 0 )
+@@ -50,8 +51,10 @@ Context::Applet::Applet( QObject * parent, const QVariantList& args )
+
+ Context::Applet::~Applet( )
+ {
+- if ( m_animationId != 0)
+- Plasma::Animator::self()->stopCustomAnimation( m_animationId );
++ if ( m_animationIdOn != 0 )
++ Plasma::Animator::self()->stopCustomAnimation( m_animationIdOn );
++ if ( m_animationIdOff != 0 )
++ Plasma::Animator::self()->stopCustomAnimation( m_animationIdOff );
+ }
+
+
+@@ -228,39 +231,51 @@ Context::Applet::addAction( QAction *action, const int size )
+ void
+ Context::Applet::setCollapseOn()
+ {
++ // We are asked to collapse, but the applet is already animating to collapse, do nothing
++ if ( m_animationIdOn != 0 )
++ return;
++
++ // We are already collapsed
+ if ( size().height() == m_heightCollapseOn )
+ return;
++
+ debug() << "collapsing applet to..." << m_heightCollapseOn;
+ if( m_heightCollapseOff == -1 )
+ m_animFromHeight = size().height();
+ else
+ m_animFromHeight = m_heightCollapseOff;
+
+- if ( m_animationId != 0 ) // warning we are moving right now
++ if ( m_animationIdOff != 0 ) // warning we are extanding right now we should stop
+ {
+ // stop the anim
+- Plasma::Animator::self()->stopCustomAnimation( m_animationId );
+- m_animationId = 0;
++ Plasma::Animator::self()->stopCustomAnimation( m_animationIdOff );
++ m_animationIdOff = 0;
+ }
+ m_collapsed = false;
+- m_animationId = Plasma::Animator::self()->customAnimation(20, 1000, Plasma::Animator::EaseInCurve, this, "animateOn" );
++ m_animationIdOn = Plasma::Animator::self()->customAnimation(20, 1000, Plasma::Animator::EaseInCurve, this, "animateOn" );
+ }
+
+ void
+ Context::Applet::setCollapseOff()
+ {
+ DEBUG_BLOCK
+- debug() << "height:" << size().height() << "target:" << m_heightCollapseOff << "m_collapsed:" << m_collapsed;
++
++ // We are asked to extend, but the applet is already animating to extend, do nothing
++ if ( m_animationIdOff != 0 )
++ return;
++
++ // Applet already extended
+ if ( size().height() == m_heightCollapseOff )
+ return;
+
++ debug() << "height:" << size().height() << "target:" << m_heightCollapseOff << "m_collapsed:" << m_collapsed;
+ if( m_heightCollapseOff == -1) // if it's self-expanding, don't animate as we don't know where we're going. also, if we're shrinking
+ { // stop that and expand regardless
+- // stop the anim
+- if( m_animationId != 0 )
++ // stop the animation on now
++ if( m_animationIdOn != 0 )
+ {
+- Plasma::Animator::self()->stopCustomAnimation( m_animationId );
+- m_animationId = 0;
++ Plasma::Animator::self()->stopCustomAnimation( m_animationIdOn );
++ m_animationIdOn = 0;
+ }
+ m_heightCurrent = m_heightCollapseOff;
+ emit sizeHintChanged(Qt::PreferredSize);
+@@ -269,14 +284,14 @@ Context::Applet::setCollapseOff()
+ return;
+ }
+
+- if ( m_animationId != 0 ) // warning we are moving right now
++ if ( m_animationIdOn != 0 ) // warning we are collapsing right now, stop that and reverse it !
+ {
+ // stop the anim
+- Plasma::Animator::self()->stopCustomAnimation( m_animationId );
+- m_animationId = 0;
++ Plasma::Animator::self()->stopCustomAnimation( m_animationIdOn );
++ m_animationIdOn = 0;
+ }
+ m_collapsed = true ;
+- m_animationId = Plasma::Animator::self()->customAnimation(20, 1000, Plasma::Animator::EaseInCurve, this, "animateOff" );
++ m_animationIdOff = Plasma::Animator::self()->customAnimation(20, 1000, Plasma::Animator::EaseInCurve, this, "animateOff" );
+ }
+
+ void
+@@ -285,6 +300,19 @@ Context::Applet::setCollapseHeight( int h )
+ m_heightCollapseOn = h;
+ }
+
++bool
++Context::Applet::isAppletCollapsed()
++{
++ return ( m_heightCollapseOn == m_heightCurrent );
++}
++
++bool
++Context::Applet::isAppletExtended()
++{
++ return ( m_heightCollapseOff == m_heightCurrent );
++}
++
++
+ void
+ Context::Applet::animateOn( qreal anim )
+ {
+@@ -302,22 +330,20 @@ Context::Applet::animateOff( qreal anim )
+ void
+ Context::Applet::animateEnd( int id )
+ {
+- if( id == m_animationId )
++ if( id == m_animationIdOn )
+ {
+- if( !m_collapsed )
+- {
+- Plasma::Applet::resize( size().width(), m_heightCollapseOn );
+- m_collapsed = true;
+- }
+- else
+- {
+- Plasma::Applet::resize( size().width(), m_heightCollapseOff );
+- m_collapsed = false;
+- }
+- updateGeometry();
+- emit sizeHintChanged(Qt::PreferredSize);
+- m_animationId = 0;
++ Plasma::Applet::resize( size().width(), m_heightCollapseOn );
++ m_collapsed = true;
++ m_animationIdOn = 0;
++ }
++ if ( id == m_animationIdOff )
++ {
++ Plasma::Applet::resize( size().width(), m_heightCollapseOff );
++ m_collapsed = false;
++ m_animationIdOff = 0;
+ }
++ updateGeometry();
++ emit sizeHintChanged(Qt::PreferredSize);
+ }
+
+
+diff --git a/src/context/Applet.h b/src/context/Applet.h
+index 7811624..9f86158 100644
+--- a/src/context/Applet.h
++++ b/src/context/Applet.h
+@@ -62,6 +62,9 @@ class AMAROK_EXPORT Applet : public Plasma::Applet
+ void setCollapseOff();
+ void setCollapseHeight( int );
+
++ bool isAppletCollapsed();
++ bool isAppletExtended();
++
+ /**
+ * sizeHint is reimplemented here only for all the applet.
+ */
+@@ -86,7 +89,8 @@ class AMAROK_EXPORT Applet : public Plasma::Applet
+ int m_heightCurrent;
+ int m_heightCollapseOn;
+ int m_heightCollapseOff;
+- int m_animationId;
++ int m_animationIdOn;
++ int m_animationIdOff;
+ int m_animFromHeight;
+
+ private:
+diff --git a/src/context/applets/info/amarok-context-applet-info.desktop b/src/context/applets/info/amarok-context-applet-info.desktop
+index 7c61815..81f2e1d 100644
+--- a/src/context/applets/info/amarok-context-applet-info.desktop
++++ b/src/context/applets/info/amarok-context-applet-info.desktop
+@@ -16,6 +16,7 @@ Name[nn]=Info
+ Name[pl]=Informacja
+ Name[pt]=Informação
+ Name[pt_BR]=Informação
++Name[ru]=Сведения
+ Name[sr]=Подаци
+ Name[sr@latin]=Podaci
+ Name[sv]=Information
+diff --git a/src/context/applets/photos/PhotosApplet.cpp b/src/context/applets/photos/PhotosApplet.cpp
+index 4cc4714..884a7f3 100644
+--- a/src/context/applets/photos/PhotosApplet.cpp
++++ b/src/context/applets/photos/PhotosApplet.cpp
+@@ -116,7 +116,7 @@ PhotosApplet::~PhotosApplet()
+ void
+ PhotosApplet::engineNewTrackPlaying( )
+ {
+- // DEBUG_BLOCK
++ DEBUG_BLOCK
+ m_stoppedstate = false;
+ dataEngine( "amarok-photos" )->query( QString( "photos" ) );
+ }
+@@ -124,13 +124,14 @@ PhotosApplet::engineNewTrackPlaying( )
+ void
+ PhotosApplet::enginePlaybackEnded( int, int, PlaybackEndedReason )
+ {
+-// DEBUG_BLOCK
++ DEBUG_BLOCK
+ m_stoppedstate = true;;
+ m_headerText->setText( i18n( "Photos" ) + QString( " : " ) + i18n( "No track playing" ) );
+ m_widget->clear();
+ m_widget->hide();
+ setBusy( false );
+ setCollapseOn();
++ dataEngine( "amarok-photos" )->query( QString( "photos:stopped" ) );
+ }
+
+ void
+@@ -215,14 +216,22 @@ PhotosApplet::dataUpdated( const QString& name, const Plasma::DataEngine::Data&
+ }
+ else if ( data.contains( "data" ) )
+ {
+- m_headerText->setText( i18n( "Photos" ) + QString( " : " ) + data[ "artist" ].toString() );
+- updateConstraints();
+- update();
+- setCollapseOff();
+- // Send the data to the scrolling widget
+- m_widget->setPixmapList( data[ "data" ].value< QList < PhotosInfo * > >() );
+- m_widget->show();
+- setBusy(false);
++ // Do not show some picture if we're still animating as it can lead to trouble
++ // let's hope animating time will be shorter than fetching time of all the picture :/
++ // this also prevent the stupid effect of reanimating several time.
++ if ( isAppletExtended() )
++ {
++ m_headerText->setText( i18n( "Photos" ) + QString( " : " ) + data[ "artist" ].toString() );
++ updateConstraints();
++ update();
++ setCollapseOff();
++ // Send the data to the scrolling widget
++ m_widget->setPixmapList( data[ "data" ].value< QList < PhotosInfo * > >() );
++ m_widget->show();
++ setBusy(false);
++ }
++ else
++ return;
+ }
+ updateConstraints();
+ update();
+diff --git a/src/context/applets/photos/PhotosScrollWidget.cpp b/src/context/applets/photos/PhotosScrollWidget.cpp
+index 71d3d28..31c71ad 100644
+--- a/src/context/applets/photos/PhotosScrollWidget.cpp
++++ b/src/context/applets/photos/PhotosScrollWidget.cpp
+@@ -112,90 +112,94 @@ void PhotosScrollWidget::setPixmapList (QList < PhotosInfo * > list)
+ if ( list == m_currentlist )
+ return;
+
+- debug() << "adding " << list.count() << "new pics";
++ // debug() << "adding " << list.count() << "new pics";
+ // If a new one arrived, we change.
+ foreach( PhotosInfo *item, list )
+ {
+ if ( !m_currentlist.contains( item ) )
+ {
+- switch ( m_mode )
++ if ( !item->photo->isNull() )
+ {
+- case PHOTOS_MODE_INTERACTIVE :
++ switch ( m_mode )
+ {
+-
+- if ( !m_id ) // careful we're animating
++ case PHOTOS_MODE_INTERACTIVE :
+ {
+- Plasma::Animator::self()->stopCustomAnimation( m_id );
+- m_id = 0;
+- }
+- DragPixmapItem *dragpix = new DragPixmapItem( this );
+- dragpix->setPixmap( The::svgHandler()->addBordersToPixmap(
+- item->photo->scaledToHeight( (int) size().height() - 4 * m_margin, Qt::SmoothTransformation ), 5, "", true ) );
+- dragpix->setPos( m_actualpos, 0 );
+- dragpix->SetClickableUrl( item->urlpage );
+- dragpix->show();
+
+- m_pixmaplist << dragpix;
++ if ( !m_id ) // careful we're animating
++ {
++ Plasma::Animator::self()->stopCustomAnimation( m_id );
++ m_id = 0;
++ }
+
+- int delta = dragpix->boundingRect().width() + m_margin;
+- m_scrollmax += delta;
+- m_actualpos += delta;
++ DragPixmapItem *dragpix = new DragPixmapItem( this );
++ dragpix->setPixmap( The::svgHandler()->addBordersToPixmap(
++ item->photo->scaledToHeight( (int) size().height() - 4 * m_margin, Qt::SmoothTransformation ), 5, "", true ) );
++ dragpix->setPos( m_actualpos, 0 );
++ dragpix->SetClickableUrl( item->urlpage );
++ dragpix->show();
+
+- break;
+- }
+- case PHOTOS_MODE_AUTOMATIC :
+- {
++ m_pixmaplist << dragpix;
+
+- DragPixmapItem *dragpix = new DragPixmapItem( this );
+- dragpix->setPixmap( The::svgHandler()->addBordersToPixmap(
+- item->photo->scaledToHeight( (int) size().height() - 4 * m_margin, Qt::SmoothTransformation ), 5, "", true ) );
+- dragpix->SetClickableUrl( item->urlpage );
++ int delta = dragpix->boundingRect().width() + m_margin;
++ m_scrollmax += delta;
++ m_actualpos += delta;
+
+- if ( m_id == 0 ) // only pos and show if no animation, otherwise it will be set at the end automatically
++ break;
++ }
++ case PHOTOS_MODE_AUTOMATIC :
+ {
+- if ( ! m_pixmaplist.empty() )
+- {
+- dragpix->setPos( m_pixmaplist.last()->boundingRect().width() + m_pixmaplist.last()->pos().x() + m_margin , 0 ) ;
+- dragpix->show();
+- }
+- else
++
++ DragPixmapItem *dragpix = new DragPixmapItem( this );
++ dragpix->setPixmap( The::svgHandler()->addBordersToPixmap(
++ item->photo->scaledToHeight( (int) size().height() - 4 * m_margin, Qt::SmoothTransformation ), 5, "", true ) );
++ dragpix->SetClickableUrl( item->urlpage );
++
++ if ( m_id == 0 ) // only pos and show if no animation, otherwise it will be set at the end automatically
+ {
+- m_actualpos = 0;
+- dragpix->setPos( m_actualpos, 0 ) ;
+- dragpix->show();
++ if ( ! m_pixmaplist.empty() )
++ {
++ dragpix->setPos( m_pixmaplist.last()->boundingRect().width() + m_pixmaplist.last()->pos().x() + m_margin , 0 ) ;
++ dragpix->show();
++ }
++ else
++ {
++ m_actualpos = 0;
++ dragpix->setPos( m_actualpos, 0 ) ;
++ dragpix->show();
++ }
+ }
+- }
+
+- m_pixmaplist << dragpix;
++ m_pixmaplist << dragpix;
+
+- // set a timer after and launch
+- QTimer::singleShot( m_interval, this, SLOT( automaticAnimBegin() ) );
++ // set a timer after and launch
++ QTimer::singleShot( m_interval, this, SLOT( automaticAnimBegin() ) );
+
+- break;
+- }
+- case PHOTOS_MODE_FADING :
+- {
+-
+- DragPixmapItem *dragpix = new DragPixmapItem( this );
+- dragpix->setPixmap( The::svgHandler()->addBordersToPixmap(
+- item->photo->scaledToHeight( (int) size().height() - 4 * m_margin, Qt::SmoothTransformation ), 5, "", true ) );
+- dragpix->setPos( ( size().width() - dragpix->boundingRect().width() ) / 2, 0 );
+- dragpix->SetClickableUrl( item->urlpage );
+- dragpix->hide();
+- m_pixmaplist << dragpix;
+- if ( m_pixmaplist.size() == 1 )
+- {
+- dragpix->show();
+- m_timer->start( m_interval );
++ break;
+ }
++ case PHOTOS_MODE_FADING :
++ {
+
+- break;
++ DragPixmapItem *dragpix = new DragPixmapItem( this );
++ dragpix->setPixmap( The::svgHandler()->addBordersToPixmap(
++ item->photo->scaledToHeight( (int) size().height() - 4 * m_margin, Qt::SmoothTransformation ), 5, "", true ) );
++ dragpix->setPos( ( size().width() - dragpix->boundingRect().width() ) / 2, 0 );
++ dragpix->SetClickableUrl( item->urlpage );
++ dragpix->hide();
++ m_pixmaplist << dragpix;
++ if ( m_pixmaplist.size() == 1 )
++ {
++ dragpix->show();
++ m_timer->start( m_interval );
++ }
++
++ break;
++ }
+ }
+ }
+ }
+ }
+ m_currentlist = list;
+- debug() << "total count: " << m_pixmaplist.count();
++ // debug() << "total count: " << m_pixmaplist.count();
+ }
+
+ void PhotosScrollWidget::hoverEnterEvent(QGraphicsSceneHoverEvent*)
+@@ -266,10 +270,13 @@ void PhotosScrollWidget::resize(qreal wid, qreal hei)
+ {
+ foreach (DragPixmapItem *item, m_pixmaplist)
+ {
+- if ( size().height() != hei )
+- item->setPixmap( item->pixmap().scaledToHeight( (int) hei - 4 * m_margin, Qt::SmoothTransformation ) );
+- if ( size().width() != wid )
+- item->setPos( ( wid - item->boundingRect().width() ) / 2, 0 );
++ if ( !item->pixmap().isNull() )
++ {
++ if ( size().height() != hei )
++ item->setPixmap( item->pixmap().scaledToHeight( (int) hei - 4 * m_margin, Qt::SmoothTransformation ) );
++ if ( size().width() != wid )
++ item->setPos( ( wid - item->boundingRect().width() ) / 2, 0 );
++ }
+ }
+ break;
+ }
+diff --git a/src/context/applets/photos/amarok-context-applet-photos.desktop b/src/context/applets/photos/amarok-context-applet-photos.desktop
+index 2fed337..86662e8 100644
+--- a/src/context/applets/photos/amarok-context-applet-photos.desktop
++++ b/src/context/applets/photos/amarok-context-applet-photos.desktop
+@@ -17,6 +17,7 @@ Name[nn]=Bilete
+ Name[pl]=Zdjęcia
+ Name[pt]=Fotografias
+ Name[pt_BR]=Fotos
++Name[ru]=Фотографии
+ Name[sr]=Фотографије
+ Name[sr@latin]=Fotografije
+ Name[sv]=Foton
+diff --git a/src/context/engines/current/amarok-data-engine-current.desktop b/src/context/engines/current/amarok-data-engine-current.desktop
+index 663153f..45354b9 100644
+--- a/src/context/engines/current/amarok-data-engine-current.desktop
++++ b/src/context/engines/current/amarok-data-engine-current.desktop
+@@ -33,7 +33,7 @@ Name[pl]=Moduł danych bieżących informacji
+ Name[pt]=Motor de Dados da Informação Actual
+ Name[pt_BR]=Mecanismo de Dados das Informações Atuais
+ Name[ro]=Motor de date Informație curentă
+-Name[ru]=Движок данных для текущих сведений
++Name[ru]=Источник данных для текущих сведений
+ Name[sl]=Podatkovni pogon za podatke trenutni skladbi
+ Name[sr]=Датомотор текућих података
+ Name[sr@latin]=Datomotor tekućih podataka
+diff --git a/src/context/engines/info/amarok-data-engine-info.desktop b/src/context/engines/info/amarok-data-engine-info.desktop
+index a29040c..de16b6b 100644
+--- a/src/context/engines/info/amarok-data-engine-info.desktop
++++ b/src/context/engines/info/amarok-data-engine-info.desktop
+@@ -14,6 +14,7 @@ Name[nn]=Datamotor for informasjon
+ Name[pl]=Moduł danych informacji
+ Name[pt]=Motor de Dados da Informação
+ Name[pt_BR]=Mecanismo de Dados das Informações
++Name[ru]=Источник данных для сведений
+ Name[sr]=Датомотор података
+ Name[sr@latin]=Datomotor podataka
+ Name[sv]=Datagränssnitt för information
+diff --git a/src/context/engines/lyrics/amarok-data-engine-lyrics.desktop b/src/context/engines/lyrics/amarok-data-engine-lyrics.desktop
+index fcdb189..134176e 100644
+--- a/src/context/engines/lyrics/amarok-data-engine-lyrics.desktop
++++ b/src/context/engines/lyrics/amarok-data-engine-lyrics.desktop
+@@ -33,7 +33,7 @@ Name[pl]=Moduł danych tekstów
+ Name[pt]=Motor de Dados de Letras Musicais
+ Name[pt_BR]=Mecanismo de Dados das Letras
+ Name[ro]=Motor de date Versuri
+-Name[ru]=Движок данных для текстов песен
++Name[ru]=Источник данных для текстов песен
+ Name[sl]=Podatkovni pogon za besedila
+ Name[sr]=Датомотор стихова
+ Name[sr@latin]=Datomotor stihova
+diff --git a/src/context/engines/photos/PhotosEngine.cpp b/src/context/engines/photos/PhotosEngine.cpp
+index 7558da8..dfb13af 100644
+--- a/src/context/engines/photos/PhotosEngine.cpp
++++ b/src/context/engines/photos/PhotosEngine.cpp
+@@ -65,6 +65,7 @@ PhotosEngine::sources() const
+ bool
+ PhotosEngine::sourceRequestEvent( const QString& name )
+ {
++ DEBUG_BLOCK
+ m_requested = true; // someone is asking for data, so we turn ourselves on :)
+ QStringList tokens = name.split( ':' );
+
+@@ -86,7 +87,18 @@ PhotosEngine::sourceRequestEvent( const QString& name )
+ m_reload = true;
+ }
+ }
+-
++
++ // we've been notified by the applet to be in state stop <3
++ else if ( tokens.contains( "stopped" ) && tokens.size() > 1 )
++ {
++ if ( tokens.at( 1 ) == QString( "stopped" ) )
++ {
++ removeSource( "photos" );
++ m_reload = true;
++ return false;
++ }
++ }
++
+ removeAllData( name );
+ setData( name, QVariant() );
+ update();
+diff --git a/src/context/engines/photos/amarok-data-engine-photos.desktop b/src/context/engines/photos/amarok-data-engine-photos.desktop
+index c0e893f..d11c43c 100644
+--- a/src/context/engines/photos/amarok-data-engine-photos.desktop
++++ b/src/context/engines/photos/amarok-data-engine-photos.desktop
+@@ -15,6 +15,7 @@ Name[nn]=Datamotor for bilete
+ Name[pl]=Moduł danych zdjęć
+ Name[pt]=Motor de Dados de Fotografias
+ Name[pt_BR]=Mecanismo de Dados de Fotos
++Name[ru]=Источник данных фотографий
+ Name[sr]=Датомотор фотографија
+ Name[sr@latin]=Datomotor fotografija
+ Name[sv]=Datagränssnitt för foton
+diff --git a/src/context/engines/songkick/amarok-data-engine-songkick.desktop b/src/context/engines/songkick/amarok-data-engine-songkick.desktop
+index ee1ca93..2213533 100644
+--- a/src/context/engines/songkick/amarok-data-engine-songkick.desktop
++++ b/src/context/engines/songkick/amarok-data-engine-songkick.desktop
+@@ -33,7 +33,7 @@ Name[pl]=Moduł danych Songkick
+ Name[pt]=Motor de Dados do Songkick
+ Name[pt_BR]=Mecanismo de Dados do Songkick
+ Name[ro]=Motor de date Songkick
+-Name[ru]=Движок данных Songkick
++Name[ru]=Источник данных Songkick
+ Name[sl]=Podatkovni pogon za Songkick
+ Name[sr]=Датомотор Сонгкика
+ Name[sr@latin]=Datomotor Songkicka
+diff --git a/src/context/engines/videoclip/amarok-data-engine-videoclip.desktop b/src/context/engines/videoclip/amarok-data-engine-videoclip.desktop
+index 9fce5d7..7d3c98b 100644
+--- a/src/context/engines/videoclip/amarok-data-engine-videoclip.desktop
++++ b/src/context/engines/videoclip/amarok-data-engine-videoclip.desktop
+@@ -20,7 +20,7 @@ Name[pa]=ਵੀਡਿਓ ਕਲਿੱਪ ਡਾਟਾ ਇੰਜਣ
+ Name[pl]=Moduł danych klipów wideo
+ Name[pt]=Motor de Dados de 'Clips' de Vídeo
+ Name[pt_BR]=Motor de dados de clipe de vídeo
+-Name[ru]=Движок данных для видеоклипов
++Name[ru]=Источник данных для видеоклипов
+ Name[sl]=Podatkovni pogon za video posnetke
+ Name[sr]=Датомотор видео исечака
+ Name[sr@latin]=Datomotor video isečaka
+diff --git a/src/context/engines/wikipedia/WikipediaEngine.cpp b/src/context/engines/wikipedia/WikipediaEngine.cpp
+index 11023cb..13de58d 100644
+--- a/src/context/engines/wikipedia/WikipediaEngine.cpp
++++ b/src/context/engines/wikipedia/WikipediaEngine.cpp
+@@ -222,9 +222,11 @@ WikipediaEngine::wikiResult( KJob* job )
+ m_wiki = QString::fromUtf8( storedJob->data().data(), storedJob->data().size() );
+
+
+- // Refined search thing
++ // FIXME: For now we test if we got an article or not with a test on this string "wgArticleId=0"
++ // This is bad
+ if( m_wiki.contains( "wgArticleId=0" ) ) // The article does not exist
+ {
++ // Refined search is done here
+ if ( m_triedRefinedSearch == -1 )
+ {
+ debug() << "We already tried some refined search. Lets end this madness...";
+diff --git a/src/context/engines/wikipedia/amarok-data-engine-wikipedia.desktop b/src/context/engines/wikipedia/amarok-data-engine-wikipedia.desktop
+index 4e864eb..a97fc3c 100644
+--- a/src/context/engines/wikipedia/amarok-data-engine-wikipedia.desktop
++++ b/src/context/engines/wikipedia/amarok-data-engine-wikipedia.desktop
+@@ -33,7 +33,7 @@ Name[pl]=Moduł danych Wikipedii
+ Name[pt]=Motor de Dados do Wikipédia
+ Name[pt_BR]=Mecanismo de Dados da Wikipedia
+ Name[ro]=Motor de date Wikipedia
+-Name[ru]=Движок данных Википедии
++Name[ru]=Источник данных Википедии
+ Name[sl]=Podatkovni pogon za Wikipedijo
+ Name[sr]=Датомотор Википедије
+ Name[sr@latin]=Datomotor Wikipedije
+diff --git a/src/context/scriptengine/javascript/amarok-scriptengine-applet-simple-javascript.desktop b/src/context/scriptengine/javascript/amarok-scriptengine-applet-simple-javascript.desktop
+index 499c587..d4b50e9 100644
+--- a/src/context/scriptengine/javascript/amarok-scriptengine-applet-simple-javascript.desktop
++++ b/src/context/scriptengine/javascript/amarok-scriptengine-applet-simple-javascript.desktop
+@@ -18,6 +18,7 @@ Name[nn]=JavaScript-element for Amarok
+ Name[pl]=Aplet JavaScriptu Amaroka
+ Name[pt]='Applet' de JavaScript do Amarok
+ Name[pt_BR]=Miniaplicativo JavaScript do Amarok
++Name[ru]=Аплет JavaScript для Amarok
+ Name[sr]=Јаваскриптни аплет за Амарок
+ Name[sr@latin]=Javascript aplet za Amarok
+ Name[sv]=Amarok Javascript-miniprogram
+@@ -45,6 +46,7 @@ Comment[nn]=Innebygd Amarok-element skriven i JavaScript
+ Comment[pl]=Natywny applet Amaroka napisany w JavaScripcie
+ Comment[pt]=Uma 'applet' nativa do Amarok, feita em JavaScript
+ Comment[pt_BR]=Miniaplicativo nativo do Amarok escrito em JavaScript
++Comment[ru]=Аплет Amarok, написанный на языке JavaScript
+ Comment[sr]=Самосвојни Амароков аплет написан у јаваскрипту
+ Comment[sr@latin]=Samosvojni Amarokov aplet napisan u JavaScriptu
+ Comment[sv]=Eget Amarok miniprogram skrivet i Javascript
+diff --git a/src/context/scriptengine/javascript/amarok-scriptengine-runner-javascript.desktop b/src/context/scriptengine/javascript/amarok-scriptengine-runner-javascript.desktop
+index aa79d73..5672b8f 100644
+--- a/src/context/scriptengine/javascript/amarok-scriptengine-runner-javascript.desktop
++++ b/src/context/scriptengine/javascript/amarok-scriptengine-runner-javascript.desktop
+@@ -17,6 +17,7 @@ Name[nn]=JavaScript-køyrar for Amarok
+ Name[pl]=JavaScript Runner Amaroka
+ Name[pt]=Execução de JavaScript do Amarok
+ Name[pt_BR]=Executor JavaScript do Amarok
++Name[ru]=Модуль запуска JavaScript для Amarok
+ Name[sr]=Амароков извођач јаваскрипта
+ Name[sr@latin]=Amarokov izvođač JavaScripta
+ Name[sv]=Amarok Javascript-körprogram
+diff --git a/src/context/servicetypes/amarok_data_engine.desktop b/src/context/servicetypes/amarok_data_engine.desktop
+index 6e42b2b..fac1d1f 100644
+--- a/src/context/servicetypes/amarok_data_engine.desktop
++++ b/src/context/servicetypes/amarok_data_engine.desktop
+@@ -33,7 +33,7 @@ Name[pl]=Moduł danych Amaroka
+ Name[pt]=Motor de Dados do Amarok
+ Name[pt_BR]=Motor de Dados do Amarok
+ Name[ro]=Motor de date Amarok
+-Name[ru]=Движок данных Amarok
++Name[ru]=Источник данных Amarok
+ Name[sl]=Podatkovni pogon za Amarok
+ Name[sr]=Датомотор Амарока
+ Name[sr@latin]=Datomotor Amaroka
+@@ -83,7 +83,7 @@ Comment[pl]=Moduł danych Amaroka
+ Comment[pt]=Motor de Dados do Amarok
+ Comment[pt_BR]=Mecanismo de Dados do Amarok
+ Comment[ro]=Motor de date Amarok
+-Comment[ru]=Движок данных Amarok
++Comment[ru]=Источник данных Amarok
+ Comment[sl]=Podatkovni pogon za Amarok
+ Comment[sr]=Датомотор Амарока
+ Comment[sr@latin]=Datomotor Amaroka
+diff --git a/src/dialogs/TagDialog.cpp b/src/dialogs/TagDialog.cpp
+index 58f2ef4..08df868 100644
+--- a/src/dialogs/TagDialog.cpp
++++ b/src/dialogs/TagDialog.cpp
+@@ -888,7 +888,7 @@ void TagDialog::readTags()
+ if( m_currentData.contains( Meta::Field::COMPOSER ) )
+ selectOrInsertText( m_currentData.value( Meta::Field::COMPOSER ).toString(), ui->kComboBox_composer );
+ else
+- selectOrInsertText( QString(), ui->kComboBox_genre );
++ selectOrInsertText( QString(), ui->kComboBox_composer );
+ ui->ratingWidget->setRating( m_currentData.value( Meta::Field::RATING ).toInt() );
+ ui->ratingWidget->setMaxRating( 10 );
+ ui->qSpinBox_track->setValue( m_currentData.value( Meta::Field::TRACKNUMBER ).toInt() );
+diff --git a/src/images/splash_screen.jpg b/src/images/splash_screen.jpg
+index 6521ead..70a633b 100644
+Binary files a/src/images/splash_screen.jpg and b/src/images/splash_screen.jpg differ
+diff --git a/src/main.cpp b/src/main.cpp
+index 85e7c88..ebc8300 100644
+--- a/src/main.cpp
++++ b/src/main.cpp
+@@ -40,7 +40,7 @@ int main( int argc, char *argv[] )
+ ki18n("Developer (hydrogen)"), "parallelgrapefruit@gmail.com" );
+ aboutData.addAuthor( ki18n("Ian 'The Beard' Monroe"),
+ ki18n("Developer (eean)"), "ian@monroe.nu", "http://www.monroe.nu/" );
+- aboutData.addAuthor( ki18n("Jeff 'IROCKSOHARD' Mitchell"),
++ aboutData.addAuthor( ki18n("Jeff 'IROKSOHARD' Mitchell"),
+ ki18n("Developer (jefferai)"), "mitchell@kde.org", "http://amarok.kde.org/blog/categories/13-jefferai" );
+ aboutData.addAuthor( ki18n("Leo Franchi"),
+ ki18n("Developer (lfranchi)"), "lfranchi@kde.org" );
+diff --git a/src/playlist/PlaylistModel.cpp b/src/playlist/PlaylistModel.cpp
+index b46300c..c6ad616 100644
+--- a/src/playlist/PlaylistModel.cpp
++++ b/src/playlist/PlaylistModel.cpp
+@@ -610,6 +610,7 @@ Playlist::Model::metadataChanged( Meta::TrackPtr track )
+ {
+ emit dataChanged( createIndex( i, 0 ), createIndex( i, columnCount() - 1 ) );
+ emit metadataUpdated();
++ debug()<<"Metadata updated for track"<<track->prettyName();
+ break;
+ }
+ }
+@@ -621,13 +622,12 @@ Playlist::Model::metadataChanged( Meta::AlbumPtr album )
+ Meta::TrackList tracks = album->tracks();
+ foreach( Meta::TrackPtr track, tracks )
+ metadataChanged( track );
++ debug()<<"Album metadata changed";
+ }
+
+ bool
+ Playlist::Model::exportPlaylist( const QString &path ) const
+ {
+- DEBUG_BLOCK
+- debug() << "WARNING: You shouldn't see this at any time except on exit.";
+ return The::playlistManager()->exportPlaylist( tracks(), path );
+ }
+
+diff --git a/src/playlist/proxymodels/FilterProxy.cpp b/src/playlist/proxymodels/FilterProxy.cpp
+index 2341be4..5254236 100644
+--- a/src/playlist/proxymodels/FilterProxy.cpp
++++ b/src/playlist/proxymodels/FilterProxy.cpp
+@@ -32,7 +32,7 @@ FilterProxy::FilterProxy( AbstractModel *belowModel, QObject *parent )
+ connect( sourceModel(), SIGNAL( removedIds( const QList<quint64>& ) ), this, SLOT( slotRemovedIds( const QList<quint64>& ) ) );
+ connect( sourceModel(), SIGNAL( activeTrackChanged( const quint64 ) ), this, SIGNAL( activeTrackChanged( quint64 ) ) );
+ connect( sourceModel(), SIGNAL( metadataUpdated() ), this, SIGNAL( metadataUpdated() ) );
+- connect( this, SIGNAL( metadataUpdated() ), this, SLOT( invalidate() ) );
++ connect( this, SIGNAL( metadataUpdated() ), this, SLOT( slotInvalidateFilter() ) );
+
+ KConfigGroup config = Amarok::config("Playlist Search");
+ m_passThrough = !config.readEntry( "ShowOnlyMatches", true );
+diff --git a/src/playlist/proxymodels/FilterProxy.h b/src/playlist/proxymodels/FilterProxy.h
+index 47876ad..65ece09 100644
+--- a/src/playlist/proxymodels/FilterProxy.h
++++ b/src/playlist/proxymodels/FilterProxy.h
+@@ -122,6 +122,12 @@ protected slots:
+ */
+ void slotRemovedIds( const QList<quint64> &ids );
+
++ /**
++ * Slot that wraps around the method invalidateFilter() so one doesn't trigger the
++ * sorting invalidation too by using invalidate().
++ */
++ void slotInvalidateFilter(){ invalidateFilter(); }
++
+ signals:
+ /**
+ * Signal forwarded from the source model.
+diff --git a/src/playlist/proxymodels/SortProxy.cpp b/src/playlist/proxymodels/SortProxy.cpp
+index 46653c1..efba2cd 100644
+--- a/src/playlist/proxymodels/SortProxy.cpp
++++ b/src/playlist/proxymodels/SortProxy.cpp
+@@ -35,7 +35,7 @@ SortProxy::SortProxy( AbstractModel *belowModel, QObject *parent )
+ connect( sourceModel(), SIGNAL( removedIds( const QList<quint64>& ) ), this, SIGNAL( removedIds( const QList< quint64 >& ) ) );
+ connect( sourceModel(), SIGNAL( activeTrackChanged( const quint64 ) ), this, SIGNAL( activeTrackChanged( quint64 ) ) );
+ connect( sourceModel(), SIGNAL( metadataUpdated() ), this, SIGNAL( metadataUpdated() ) );
+- connect( this, SIGNAL( metadataUpdated() ), this, SLOT( invalidate() ) );
++ connect( this, SIGNAL( metadataUpdated() ), this, SLOT( invalidateSorting() ) );
+
+ //needed by GroupingProxy:
+ connect( sourceModel(), SIGNAL( layoutChanged() ), this, SIGNAL( layoutChanged() ) );
+@@ -48,6 +48,27 @@ SortProxy::~SortProxy()
+ void
+ SortProxy::invalidateSorting()
+ {
++ if( m_scheme.length() )
++ {
++ if( !( m_scheme.level( m_scheme.length() - 1 ).category() == -1 ) ) //if it's not random
++ {
++ invalidate();
++ }
++ }
++ else
++ invalidate();
++ //FIXME: this is a band-aid so that the playlist doesn't reshuffle every time the current track changes
++ // However the real issue is deeper, the Observer seems to notify metadataChanged() even if the metadata
++ // of a track doesn't change but just the currently active track changes, and this results in the playlist
++ // being resorted on every "next", "previous" or track selection. Twice. This is a Bad Thing (TM) and very
++ // inefficient.
++ // We're shipping 2.2 as it is, because it's way too late to go poking around Observer, but this needs
++ // to be solved ASAP post-2.2. --Téo 23/9/2009
++}
++
++void
++SortProxy::resetSorting()
++{
+ m_scheme = SortScheme();
+ reset();
+ }
+@@ -64,7 +85,7 @@ SortProxy::lessThan( const QModelIndex & left, const QModelIndex & right ) const
+ void
+ SortProxy::updateSortMap( SortScheme scheme )
+ {
+- invalidateSorting();
++ resetSorting();
+ m_scheme = scheme;
+ sort( 0 ); //0 is a dummy column
+ //HACK: sort() inverts the sortOrder on each call, this keeps the order ascending.
+diff --git a/src/playlist/proxymodels/SortProxy.h b/src/playlist/proxymodels/SortProxy.h
+index ebc745f..36cb704 100644
+--- a/src/playlist/proxymodels/SortProxy.h
++++ b/src/playlist/proxymodels/SortProxy.h
+@@ -63,7 +63,7 @@ public slots:
+ /**
+ * Resets the proxy to its original pass-through state.
+ */
+- void invalidateSorting();
++ void resetSorting();
+
+ protected:
+ /**
+@@ -82,6 +82,12 @@ protected:
+ */
+ virtual int rowToSource( int row ) const;
+
++protected slots:
++ /**
++ * Reapplies the current sorting scheme.
++ */
++ void invalidateSorting();
++
+ private:
+ SortScheme m_scheme; //! The current sorting scheme.
+ };
+diff --git a/src/services/mp3tunes/amarok_service_mp3tunes.desktop b/src/services/mp3tunes/amarok_service_mp3tunes.desktop
+index d2b3a79..8b0937d 100644
+--- a/src/services/mp3tunes/amarok_service_mp3tunes.desktop
++++ b/src/services/mp3tunes/amarok_service_mp3tunes.desktop
+@@ -70,7 +70,7 @@ Comment[pl]=Przeglądaj i słuchaj muzyki przechowywanej na twoim koncie Mp3tune
+ Comment[pt]=Navegar e escutar a música gravada na sua conta do mp3tunes
+ Comment[pt_BR]=Navegue e escute as músicas armazenadas na sua conta do mp3tunes
+ Comment[ro]=Răsfoiți și ascultați muzica stocată în contul dumneavoastră mp3tunes
+-Comment[ru]=Обзор и прослушивание музыки, сохраненной в аккаунте Mp3tunes
++Comment[ru]=Обзор и прослушивание музыки, сохраненной в учётной записи Mp3tunes
+ Comment[sl]=Brskajte po glasbi, ki jo imate shranjeno na svojem računu MP3tunes, in jo poslušajte
+ Comment[sr]=Прегледајте и слушајте музику са свог налога на МП3‑тјунсу
+ Comment[sr@latin]=Pregledajte i slušajte muziku sa svog naloga na MP3Tunesu
+diff --git a/src/services/opmldirectory/amarok_service_opmldirectory.desktop b/src/services/opmldirectory/amarok_service_opmldirectory.desktop
+index f821e17..03c08c8 100644
+--- a/src/services/opmldirectory/amarok_service_opmldirectory.desktop
++++ b/src/services/opmldirectory/amarok_service_opmldirectory.desktop
+@@ -27,7 +27,7 @@ Name[pl]=Katalog podcastów
+ Name[pt]=Pasta de 'Podcasts'
+ Name[pt_BR]=Podcast Directory
+ Name[ro]=Director Podcast
+-Name[ru]=Каталог для podcast'ов
++Name[ru]=Каталог подкастов
+ Name[sl]=Imenik podcastov
+ Name[sr]=Фасцикла подемисија
+ Name[sr@latin]=Fascikla podemisija
+@@ -69,7 +69,7 @@ Comment[pl]=Przeglądaj i zapisz się do ogromnej listy podcastów
+ Comment[pt]=Navegar e inscrever numa enorme lista de 'podcasts'
+ Comment[pt_BR]=Navegue e inscrêva-se à uma lista enorme de podcasts
+ Comment[ro]=Răsfoiți și abonați-vă la o listă uriașă de podcasturi
+-Comment[ru]=Обзор и подписка на огромный список podcast'ов
++Comment[ru]=Обзор и подписка на огромный список подкастов
+ Comment[sl]=Brskajte po obsežni zbirki podcastov in se naročite nanje
+ Comment[sr]=Прегледајте и претплатите се на огромну листу подемисија
+ Comment[sr@latin]=Pregledajte i pretplatite se na ogromnu listu podemisija
reply other threads:[~2026-07-06 18:30 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178336265533.1.24544008807803271.rpms-amarok-64b737e0ef4c@fedoraproject.org \
--to=rdieter@fedoraproject.org \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox