[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [amarok/spotify] src/core-impl/collections/spotifycollection: spotify: download a ZIP instead of a s
From:       Edward Hades <edward.hades () gmail ! com>
Date:       2012-10-29 14:08:42
Message-ID: 20121029140842.68D9BA6078 () git ! kde ! org
[Download RAW message or body]

Git commit 38d1ade7ab4db9c512abc9652c0fbd9d396a7db2 by Edward Hades.
Committed on 29/10/2012 at 15:07.
Pushed by hades into branch 'spotify'.

spotify: download a ZIP instead of a single binary

Also: unpack the ZIP, set permissions, and set LD_LIBRARY_PATH before
trying to execute the resolver binary.

M  +3    -0    src/core-impl/collections/spotifycollection/SpotifyCollection.cpp
M  +6    -0    src/core-impl/collections/spotifycollection/SpotifyConfig.cpp
M  +2    -1    src/core-impl/collections/spotifycollection/SpotifyConfig.h
M  +21   -9    src/core-impl/collections/spotifycollection/SpotifySettings.cpp
M  +2    -0    src/core-impl/collections/spotifycollection/support/Controller.cpp
M  +3    -0    src/core-impl/collections/spotifycollection/support/Controller.h

http://commits.kde.org/amarok/38d1ade7ab4db9c512abc9652c0fbd9d396a7db2

diff --git a/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp \
b/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp index \
                a73cfd3..4ec1f39 100644
--- a/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp
@@ -69,6 +69,9 @@ namespace Collections
         m_config.load();
 
         m_controller = The::SpotifyController( m_config.resolverPath() );
+#ifdef Q_OS_LINUX
+        m_controller->environment().insert("LD_LIBRARY_PATH", \
SpotifyConfig::resolverDownloadPath()); +#endif
 
         Q_ASSERT( m_controller != 0 );
 
diff --git a/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp \
b/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp index \
                a778403..697181f 100644
--- a/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp
@@ -183,4 +183,10 @@ SpotifyConfig::defaultResolverName()
     return QString("spotify_resolver_%1").arg(supportedPlatformName());
 }
 
+const QString
+SpotifyConfig::resolverDownloadPath()
+{
+    return KStandardDirs::locateLocal( "data", "amarok" );
+}
+
 #include "SpotifyConfig.moc"
diff --git a/src/core-impl/collections/spotifycollection/SpotifyConfig.h \
b/src/core-impl/collections/spotifycollection/SpotifyConfig.h index 298a811..05373f2 \
                100644
--- a/src/core-impl/collections/spotifycollection/SpotifyConfig.h
+++ b/src/core-impl/collections/spotifycollection/SpotifyConfig.h
@@ -33,6 +33,7 @@ public:
     static const char *configSectionName() { return "Collection_Spotify"; }
     static const QString supportedPlatformName();
     static const QString defaultResolverName();
+    static const QString resolverDownloadPath();
 
     const QString username() const { return m_username; }
     void setUsername( const QString& username ) { m_username = username; }
@@ -43,7 +44,7 @@ public:
     const QString resolverPath() const { return m_resolverPath; }
     void setResolverPath( const QString& path ) { m_resolverPath = path; }
 
-    const QString resolverDownloadUrl() const { return m_resolverDownloadUrl + \
defaultResolverName(); } +    const QString resolverDownloadUrl() const { return \
m_resolverDownloadUrl + defaultResolverName() + ".zip"; }  
     bool highQuality() const { return m_highQuality; }
     void setHighQuality( const bool highquality ) { m_highQuality = highquality; }
diff --git a/src/core-impl/collections/spotifycollection/SpotifySettings.cpp \
b/src/core-impl/collections/spotifycollection/SpotifySettings.cpp index \
                6221d55..036cccb 100644
--- a/src/core-impl/collections/spotifycollection/SpotifySettings.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifySettings.cpp
@@ -25,8 +25,11 @@
 
 #include <KLocale>
 #include <KMessageBox>
+#include <KZip>
 
+#include <QBuffer>
 #include <QFile>
+#include <QScopedPointer>
 #include <QtGlobal>
 
 SpotifySettings::SpotifySettings( QWidget* parent, const QVariantList& args )
@@ -232,20 +235,29 @@ SpotifySettings::slotDownloadFinished()
 
     m_configWidget->progDownload->hide();
 
-    QFile file( m_config.resolverPath() );
-    if( !file.open( QIODevice::WriteOnly ) )
+    QByteArray data( m_downloadReply->readAll() );
+    QScopedPointer<QBuffer> data_buffer(new QBuffer(&data));
+
+    KZip archive( data_buffer.data() );
+    if( !archive.open( QIODevice::ReadOnly ) || !archive.directory() )
     {
-        KMessageBox::error( this, i18n( "Failed to open file '%1' to write." ).arg( \
m_config.resolverPath() ) ); +        KMessageBox::error( this, i18n( "Failed to read \
data from the downloaded file. " +                                        "Please try \
again later." ) );  slotCancel();
+        return;
     }
-    else
-    {
-        file.write( m_downloadReply->readAll() );
 
-        // Set execution permission
-        file.setPermissions( file.permissions() | QFile::ExeUser );
-        file.close();
+    archive.directory()->copyTo( SpotifyConfig::resolverDownloadPath() );
+
+    QFile file( m_config.resolverPath() );
+    if( !file.exists() )
+    {
+        KMessageBox::error( this, i18n( "Failed to extract the Spotify resolver to \
%1 " +                                        "Please check if the path is \
writeable." ).arg( SpotifyConfig::resolverDownloadPath() ) ); +        slotCancel();
+        return;
     }
+    file.setPermissions( file.permissions() | QFile::ExeUser );
 
     // Notify controller to load the resolver
     Spotify::Controller* controller = The::SpotifyController();
diff --git a/src/core-impl/collections/spotifycollection/support/Controller.cpp \
b/src/core-impl/collections/spotifycollection/support/Controller.cpp index \
                00adffe..d3b5962 100644
--- a/src/core-impl/collections/spotifycollection/support/Controller.cpp
+++ b/src/core-impl/collections/spotifycollection/support/Controller.cpp
@@ -68,6 +68,7 @@ namespace Spotify
 {
 Controller::Controller( const QString& exec )
 : QObject(0)
+, m_procEnv( QProcessEnvironment::systemEnvironment() )
 , m_filePath( exec )
 , m_lastUsername( QString() )
 , m_msgSize( 0 )
@@ -463,6 +464,7 @@ Controller::startProcess()
     debug() << "Starting " << resolverPath();
     QString runPath = resolverPath();
 
+    m_proc.setProcessEnvironment( m_procEnv );
     m_proc.start( runPath );
 
     m_loaded = true;
diff --git a/src/core-impl/collections/spotifycollection/support/Controller.h \
b/src/core-impl/collections/spotifycollection/support/Controller.h index \
                2b58b3c..5f78f0f 100644
--- a/src/core-impl/collections/spotifycollection/support/Controller.h
+++ b/src/core-impl/collections/spotifycollection/support/Controller.h
@@ -27,6 +27,7 @@
 #include "core/interfaces/Logger.h"
 
 #include <QProcess>
+#include <QProcessEnvironment>
 #include <QVariantMap>
 #include <qjson/parser.h>
 #include <qjson/serializer.h>
@@ -68,6 +69,7 @@ public:
     virtual QString name() const { return m_name; }
     virtual QString resolverPath() const { return m_filePath; }
     virtual void setFilePath( const QString& resolverPath ) { m_filePath = \
resolverPath; } +    virtual QProcessEnvironment& environment() { return m_procEnv; }
     virtual void login(const QString& username, const QString& password, const bool \
highQuality = false);  virtual bool loggedIn() const { return m_loggedIn; }
     virtual bool running() const;
@@ -209,6 +211,7 @@ private:
 
     // Members
     QProcess  m_proc;
+    QProcessEnvironment  m_procEnv;
     QString   m_name;
     QString   m_filePath;
     QString   m_lastUsername;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic