From kde-commits Thu Feb 23 04:55:19 2012 From: Martin Tobias Holmedahl Sandsmark Date: Thu, 23 Feb 2012 04:55:19 +0000 To: kde-commits Subject: KDE/kdemultimedia/juk Message-Id: <20120223045519.5B2BDAC895 () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=132997295130638 SVN commit 1281831 by sandsmark: Add a GUI to set username/password for last.fm scrobbling in JuK. FEATURE: BUG:262194 M +1 -0 CMakeLists.txt M +10 -0 juk.cpp M +1 -0 juk.h M +1 -0 jukui-rtl.rc M +1 -0 jukui.rc M +2 -0 main.cpp A scrobbleconfigdlg.cpp [License: GPL (v2+)] A scrobbleconfigdlg.h [License: GPL (v2+)] M +51 -26 scrobbler.cpp M +5 -2 scrobbler.h --- trunk/KDE/kdemultimedia/juk/CMakeLists.txt #1281830:1281831 @@ -76,6 +76,7 @@ playlistsearch.cpp playlistsplitter.cpp scrobbler.cpp + scrobbleconfigdlg.cpp searchplaylist.cpp searchwidget.cpp slideraction.cpp --- trunk/KDE/kdemultimedia/juk/juk.cpp #1281830:1281831 @@ -49,6 +49,7 @@ #include "keydialog.h" #include "tagguesserconfigdlg.h" #include "filerenamerconfigdlg.h" +#include "scrobbleconfigdlg.h" #include "actioncollection.h" #include "cache.h" #include "playlistsplitter.h" @@ -313,6 +314,9 @@ act = collection->addAction("fileRenamerConfig", this, SLOT(slotConfigureFileRenamer())); act->setText(i18n("&File Renamer...")); + act = collection->addAction("scrobblerConfig", this, SLOT(slotConfigureScrobbling())); + act->setText(i18n("&Configure scrobbling...")); + ////////////////////////////////////////////////// // just in the toolbar ////////////////////////////////////////////////// @@ -573,6 +577,12 @@ FileRenamerConfigDlg(this).exec(); } +void JuK::slotConfigureScrobbling() +{ + ScrobbleConfigDlg(this).exec(); +} + + void JuK::slotUndo() { TagTransactionManager::instance()->undo(); --- trunk/KDE/kdemultimedia/juk/juk.h #1281830:1281831 @@ -73,6 +73,7 @@ void slotEditKeys(); void slotConfigureTagGuesser(); void slotConfigureFileRenamer(); + void slotConfigureScrobbling(); void slotUndo(); void slotCheckAlbumNextAction(bool albumRandomEnabled); void slotProcessArgs(); --- trunk/KDE/kdemultimedia/juk/jukui-rtl.rc #1281830:1281831 @@ -72,6 +72,7 @@ + --- trunk/KDE/kdemultimedia/juk/jukui.rc #1281830:1281831 @@ -74,6 +74,7 @@ + --- trunk/KDE/kdemultimedia/juk/main.cpp #1281830:1281831 @@ -43,6 +43,7 @@ static const char pascal[] = I18N_NOOP("Gimper of splash screen"); static const char laurent[] = I18N_NOOP("Porting to KDE 4 when no one else was around"); static const char giorgos[] = I18N_NOOP("Badly-needed tag editor bugfixes."); +static const char sandsmark[] = I18N_NOOP("Last.fm scrobbling support."); int main(int argc, char *argv[]) { @@ -69,6 +70,7 @@ aboutData.addCredit(ki18n("Pascal Klein"), ki18n(pascal), "4pascal@tpg.com.au"); aboutData.addCredit(ki18n("Laurent Montel"), ki18n(laurent), "montel@kde.org"); aboutData.addCredit(ki18n("Georg Grabler"), ki18n(georg), "georg@grabler.net"); + aboutData.addCredit(ki18n("Martin Sandsmark"), ki18n(sandsmark), "martin.sandsmark@kde.org"); KCmdLineArgs::init(argc, argv, &aboutData); --- trunk/KDE/kdemultimedia/juk/scrobbler.cpp #1281830:1281831 @@ -1,3 +1,18 @@ +/*************************************************************************** + begin : Tue Feb 21 2012 + copyright : (C) 2012 by Martin Sandsmark + email : martin.sandsmark@kde.org +***************************************************************************/ + +/*************************************************************************** + * * + * 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 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + #include "scrobbler.h" #include #include @@ -15,8 +30,8 @@ Scrobbler::Scrobbler(QObject* parent): QObject(parent) { KConfigGroup config(KGlobal::config(), "Scrobbling"); - m_sessionKey = config.readEntry("SessionKey", "");//TODO: use kwallet - if (m_sessionKey.isEmpty()) + QString sessionKey = config.readEntry("SessionKey", "");//TODO: use kwallet + if (sessionKey.isEmpty()) getAuthToken(); } @@ -43,17 +58,8 @@ params["api_sig"] = md5(s.toUtf8()); } - -void Scrobbler::getAuthToken() +void Scrobbler::getAuthToken(QString username, QString password) { - kDebug() << "Getting new auth token..."; - - KConfigGroup config(KGlobal::config(), "Scrobbling"); - QString username = config.readEntry("Username", "");//TODO: use kwallet - QString password = config.readEntry("Password", "");//TODO: use kwallet - if (username.isEmpty() || password.isEmpty()) - return; - QByteArray authToken = md5((username + md5(password.toUtf8() )).toUtf8()); QMap params; @@ -74,39 +80,57 @@ connect(reply, SIGNAL(finished()), this, SLOT(handleAuthenticationReply())); } +void Scrobbler::getAuthToken() +{ + kDebug() << "Getting new auth token..."; + + KConfigGroup config(KGlobal::config(), "Scrobbling"); + QString username = config.readEntry("Username", "");//TODO: use kwallet + QString password = config.readEntry("Password", "");//TODO: use kwallet + if (username.isEmpty() || password.isEmpty()) + return; + + getAuthToken(username, password); +} + void Scrobbler::handleAuthenticationReply() { QNetworkReply* reply = qobject_cast(sender()); - qWarning() << "got authentication reply"; + kDebug() << "got authentication reply"; if (reply->error() != QNetworkReply::NoError) { - qWarning() << reply->errorString(); + emit invalidAuth(); + kWarning() << "Error while getting authentication reply" << reply->errorString(); return; } QDomDocument doc; QByteArray data = reply->readAll(); - qWarning() << data; doc.setContent(data); QDomElement el = doc.documentElement(); - m_sessionKey = el.firstChildElement("session").firstChildElement("key").text(); + QString sessionKey = el.firstChildElement("session").firstChildElement("key").text(); + if (sessionKey.isEmpty()) { + emit invalidAuth(); + kWarning() << "Unable to get session key" << data; + return; + } KConfigGroup config(KGlobal::config(), "Scrobbling"); - config.writeEntry("SessionKey", m_sessionKey); - return; + config.writeEntry("SessionKey", sessionKey); + emit validAuth(); } void Scrobbler::nowPlaying(const FileHandle& file) { - if (m_sessionKey.isEmpty()) { + KConfigGroup config(KGlobal::config(), "Scrobbling"); + QString sessionKey = config.readEntry("SessionKey", "");//TODO: use kwallet + if (sessionKey.isEmpty()) { getAuthToken(); return; } - qWarning() << "Now playing" << file.tag()->title(); - QMap params; params["method"] = "track.updateNowPlaying"; - params["sk"] = m_sessionKey; + params["sk"] = sessionKey; params["track"] = file.tag()->title(); params["artist"] = file.tag()->artist(); @@ -123,16 +147,18 @@ void Scrobbler::scrobble() { - if (m_sessionKey.isEmpty()) { + KConfigGroup config(KGlobal::config(), "Scrobbling"); + QString sessionKey = config.readEntry("SessionKey", "");//TODO: use kwallet + if (sessionKey.isEmpty()) { getAuthToken(); return; } - qWarning() << "Scrobbling" << m_file.tag()->title(); + kDebug() << "Scrobbling" << m_file.tag()->title(); QMap params; params["method"] = "track.scrobble"; - params["sk"] = m_sessionKey; + params["sk"] = sessionKey; params["timestamp"] = QString::number(m_startedPlaying); @@ -167,7 +193,6 @@ { QNetworkReply* reply = qobject_cast(sender()); QByteArray data = reply->readAll(); - qWarning() << data; if (data.contains("code=\"9\"")) // We need a new token getAuthToken(); } --- trunk/KDE/kdemultimedia/juk/scrobbler.h #1281830:1281831 @@ -35,12 +35,16 @@ public slots: void nowPlaying(const FileHandle&); void scrobble(); + void getAuthToken(QString username, QString password); private slots: - void getAuthToken(); void handleAuthenticationReply(); void handleResults(); + void getAuthToken(); +signals: + void invalidAuth(); + void validAuth(); private: void sign(QMap &request); @@ -49,7 +53,6 @@ FileHandle m_file; qint64 m_startedPlaying; - QString m_sessionKey; }; #endif /* SCROBBLER_H */