Index: xbmc/Application.cpp =================================================================== --- xbmc/Application.cpp (revision 20211) +++ xbmc/Application.cpp (working copy) @@ -49,7 +49,7 @@ #endif #include "ButtonTranslator.h" #include "GUIAudioManager.h" -#include "lib/libscrobbler/scrobbler.h" +#include "lib/libscrobbler/lastfmscrobbler.h" #include "GUIPassword.h" #include "ApplicationMessenger.h" #include "SectionLoader.h" @@ -3864,7 +3864,7 @@ g_charsetConverter.clear(); g_directoryCache.Clear(); g_buttonTranslator.Clear(); - CScrobbler::RemoveInstance(); + CLastfmScrobbler::RemoveInstance(); CLastFmManager::RemoveInstance(); #ifdef HAS_EVENT_SERVER CEventServer::RemoveInstance(); @@ -4397,7 +4397,7 @@ getApplicationMessenger().HttpApi("broadcastlevel; OnPlayBackEnded;1"); #endif if (IsPlayingAudio()) - CScrobbler::GetInstance()->SubmitQueue(); + CLastfmScrobbler::GetInstance()->SubmitQueue(); CLog::Log(LOGDEBUG, "Playback has finished"); @@ -4444,7 +4444,7 @@ CLog::Log(LOGDEBUG, "Player has asked for the next item"); if(IsPlayingAudio()) - CScrobbler::GetInstance()->SubmitQueue(); + CLastfmScrobbler::GetInstance()->SubmitQueue(); CGUIMessage msg(GUI_MSG_QUEUE_NEXT_ITEM, 0, 0); m_gWindowManager.SendThreadMessage(msg); @@ -4466,7 +4466,7 @@ if (m_pXbmcHttp && g_stSettings.m_HttpApiBroadcastLevel>=1) getApplicationMessenger().HttpApi("broadcastlevel; OnPlayBackStopped;1"); #endif - CScrobbler::GetInstance()->SubmitQueue(); + CLastfmScrobbler::GetInstance()->SubmitQueue(); CLog::Log(LOGDEBUG, "Playback was stopped\n"); @@ -4919,7 +4919,7 @@ // Let scrobbler know about the track const CMusicInfoTag* tag=g_infoManager.GetCurrentSongTag(); if (tag) - CScrobbler::GetInstance()->AddSong(*tag); + CLastfmScrobbler::GetInstance()->AddSong(*tag); } return true; } @@ -5165,7 +5165,7 @@ if (IsPlayingAudio()) { - CScrobbler::GetInstance()->UpdateStatus(); + CLastfmScrobbler::GetInstance()->UpdateStatus(); // Update audio file state every 0.5 second UpdateAudioFileState(); } Index: xbmc/GUIWindowSettingsCategory.cpp =================================================================== --- xbmc/GUIWindowSettingsCategory.cpp (revision 20211) +++ xbmc/GUIWindowSettingsCategory.cpp (working copy) @@ -46,7 +46,7 @@ #include "SkinInfo.h" #include "GUIAudioManager.h" #include "AudioContext.h" -#include "lib/libscrobbler/scrobbler.h" +#include "lib/libscrobbler/lastfmscrobbler.h" #include "GUIPassword.h" #include "utils/GUIInfoManager.h" #include "GUIDialogGamepad.h" @@ -1713,11 +1713,11 @@ g_guiSettings.GetBool("lastfm.submitradio")) && !strUserName.IsEmpty() && !strPassword.IsEmpty()) { - CScrobbler::GetInstance()->Init(); + CLastfmScrobbler::GetInstance()->Init(); } else { - CScrobbler::GetInstance()->Term(); + CLastfmScrobbler::GetInstance()->Term(); } } else if (strSetting.Equals("musicplayer.outputtoallspeakers")) Index: xbmc/xbox/Network.cpp =================================================================== --- xbmc/xbox/Network.cpp (revision 20210) +++ xbmc/xbox/Network.cpp (working copy) @@ -27,7 +27,7 @@ #endif #include "Application.h" #include "FileSystem/FileSmb.h" -#include "lib/libscrobbler/scrobbler.h" +#include "lib/libscrobbler/lastfmscrobbler.h" #include "Settings.h" #include "GUIWindowManager.h" #include "RssReader.h" @@ -571,7 +571,7 @@ #ifdef HAS_UPNP g_application.StartUPnP(); #endif - CScrobbler::GetInstance()->Init(); + CLastfmScrobbler::GetInstance()->Init(); g_application.StartEventServer(); } break; @@ -593,7 +593,7 @@ #ifdef HAS_UPNP g_application.StopUPnP(); #endif - CScrobbler::GetInstance()->Term(); + CLastfmScrobbler::GetInstance()->Term(); g_application.StopEventServer(); // smb.Deinit(); if any file is open over samba this will break. Index: xbmc/lib/libscrobbler/scrobbler.h =================================================================== --- xbmc/lib/libscrobbler/scrobbler.h (revision 20211) +++ xbmc/lib/libscrobbler/scrobbler.h (working copy) @@ -28,6 +28,9 @@ #include "FileSystem/FileCurl.h" #include "CriticalSection.h" +#define SCROBBLER_USER_ERROR_BADAUTH 1 +#define SCROBBLER_USER_ERROR_BANNED 2 + namespace MUSIC_INFO { class CMusicInfoTag; @@ -105,9 +108,7 @@ class CScrobbler : public CThread { -private: - static long m_instanceLock; - static CScrobbler *m_pInstance; +protected: bool m_bRunThread; bool m_bNotified; bool m_bSubmitting; @@ -119,9 +120,11 @@ int m_failedHandshakeDelay; int m_action; time_t m_lastFailedHandshake; + CStdString m_strLogPrefix; CStdString m_strUsername; CStdString m_strPasswordHash; CStdString m_strSessionID; + CStdString m_strHandshakeURL; CStdString m_strNowPlayingURL; CStdString m_strSubmissionURL; CStdString m_strHandshakeTimeStamp; @@ -132,13 +135,15 @@ CCriticalSection m_actionLock; std::vector m_vecSubmissionQueue; -private: +protected: void ResetState(); + virtual void LoadCredentials() = 0; void ClearErrorState(); void ClearSubmissionState(); void ClearSession(); void HandleHardError(); - bool CanScrobble(); + virtual void NotifyUser(int error) = 0; + virtual bool CanScrobble() = 0; bool LoadJournal(); bool SaveJournal(); bool DoHandshake(time_t now); @@ -147,14 +152,13 @@ bool HandleNowPlayingNotification(CStdString &strResponse); bool DoSubmission(); bool HandleSubmission(CStdString &strResponse); - CStdString GetJournalFileName(); - virtual void Process(); + virtual CStdString GetJournalFileName() = 0; + virtual void Process(); // Shouldn't need over ridden by inheriting CScrobblers public: CScrobbler(); + CScrobbler(const CStdString &strHandshakeURL, const CStdString &strLogPrefix = "CScrobbler"); virtual ~CScrobbler(); - static CScrobbler *GetInstance(); - static void RemoveInstance(); void Init(); void Term(); void AddSong(const MUSIC_INFO::CMusicInfoTag &tag); @@ -162,10 +166,10 @@ void SubmitQueue(); void SetUsername(const CStdString &strUser); void SetPassword(const CStdString &strPass); - CStdString GetConnectionState(); - CStdString GetSubmitInterval(); - CStdString GetFilesCached(); - CStdString GetSubmitState(); + virtual CStdString GetConnectionState() = 0; + virtual CStdString GetSubmitInterval() = 0; + virtual CStdString GetFilesCached() = 0; + virtual CStdString GetSubmitState() = 0; }; #endif // LIBSCROBBLER_H__ Index: xbmc/lib/libscrobbler/Makefile =================================================================== --- xbmc/lib/libscrobbler/Makefile (revision 20210) +++ xbmc/lib/libscrobbler/Makefile (working copy) @@ -1,5 +1,5 @@ INCLUDES=-I. -I../../ -I../../linux -I../../../guilib -I../../utils -SRCS=scrobbler.cpp +SRCS=scrobbler.cpp lastfmscrobbler.cpp LIB=scrobbler.a Index: xbmc/lib/libscrobbler/scrobbler.cpp =================================================================== --- xbmc/lib/libscrobbler/scrobbler.cpp (revision 20211) +++ xbmc/lib/libscrobbler/scrobbler.cpp (working copy) @@ -43,18 +43,32 @@ #define SCROBBLER_MIN_DURATION 30 // seconds. API rule #define SCROBBLER_ACTION_SUBMIT 1 #define SCROBBLER_ACTION_NOWPLAYING 2 -#define SCROBBLER_HANDSHAKE_URL "post.audioscrobbler.com" +//#define SCROBBLER_HANDSHAKE_URL "post.audioscrobbler.com" //#define SCROBBLER_HANDSHAKE_URL "89.16.177.55" // libre.fm -long CScrobbler::m_instanceLock = 0; -CScrobbler *CScrobbler::m_pInstance = NULL; +CScrobbler::CScrobbler() + : CThread() +{ + m_bRunThread = false; + m_bBanned = false; + m_bBadAuth = false; + m_pHttp = NULL; + m_strHandshakeURL = ""; + m_strLogPrefix = "CScrobbler"; + ResetState(); -CScrobbler::CScrobbler() : CThread() + if (!(m_hEvent = CreateEvent(NULL, false, false, NULL))) + throw EOutOfMemory(); +} +CScrobbler::CScrobbler(const CStdString &strHandshakeURL, const CStdString &strLogPrefix) + : CThread() { - m_bRunThread = false; - m_bBanned = false; - m_bBadAuth = false; - m_pHttp = NULL; + m_bRunThread = false; + m_bBanned = false; + m_bBadAuth = false; + m_pHttp = NULL; + m_strHandshakeURL = strHandshakeURL; + m_strLogPrefix = strLogPrefix; ResetState(); if (!(m_hEvent = CreateEvent(NULL, false, false, NULL))) @@ -67,36 +81,12 @@ CloseHandle(m_hEvent); } -CScrobbler *CScrobbler::GetInstance() -{ - if (!m_pInstance) // Avoid spinning aimlessly - { - CAtomicSpinLock lock(m_instanceLock); - if (!m_pInstance) - { - m_pInstance = new CScrobbler; - } - } - return m_pInstance; -} - -void CScrobbler::RemoveInstance() -{ - if (m_pInstance) - { - CAtomicSpinLock lock(m_instanceLock); - delete m_pInstance; - m_pInstance = NULL; - } -} - void CScrobbler::Init() { if (!CanScrobble()) return; ResetState(); - SetUsername(g_guiSettings.GetString("lastfm.username")); - SetPassword(g_guiSettings.GetString("lastfm.password")); + LoadCredentials(); LoadJournal(); if (!m_bRunThread) Create(); @@ -176,7 +166,7 @@ m_bSubmitted = true; m_vecSubmissionQueue.push_back(m_CurrentTrack); SaveJournal(); - CLog::Log(LOGDEBUG, "CScrobbler: Queued track for submission"); + CLog::Log(LOGDEBUG, "%s: Queued track for submission", m_strLogPrefix.c_str()); } } @@ -212,55 +202,6 @@ m_bBadAuth = false; } -CStdString CScrobbler::GetConnectionState() -{ - if (!CanScrobble()) - return ""; - return (m_strSessionID.IsEmpty()) ? - g_localizeStrings.Get(15208) : g_localizeStrings.Get(15207); -} - -CStdString CScrobbler::GetSubmitInterval() -{ - CStdString strInterval; - if (!CanScrobble()) - return strInterval; - CStdString strFormat = g_localizeStrings.Get(15209); - strInterval.Format(strFormat, m_failedHandshakeDelay); - return strInterval; -} - -CStdString CScrobbler::GetFilesCached() -{ - CStdString strCachedTracks; - if (!CanScrobble()) - return strCachedTracks; - CSingleLock lock(m_queueLock); - CStdString strFormat = g_localizeStrings.Get(15210); - strCachedTracks.Format(strFormat, m_vecSubmissionQueue.size()); -} - -CStdString CScrobbler::GetSubmitState() -{ - CStdString strState; - CStdString strFormat = g_localizeStrings.Get(15212); - if (!CanScrobble()) - return strState; - if (m_bSubmitting) - strState = g_localizeStrings.Get(15211); - else if (m_bBadAuth || m_bBanned) - strState.Format(strFormat, 0); - else if (m_strSessionID.IsEmpty()) - strState.Format(strFormat, m_failedHandshakeDelay); - else - { - int seconds = m_CurrentTrack.length; - seconds -= time(NULL) - atoi(m_CurrentTrack.strStartTime.c_str()); - strState.Format(strFormat, std::min(0, seconds)); - } - return strState; -} - void CScrobbler::ResetState() { ClearSession(); @@ -287,29 +228,21 @@ void CScrobbler::ClearSession() { - CLog::Log(LOGDEBUG, "CScrobbler: Clearing session."); + CLog::Log(LOGDEBUG, "%s: Clearing session.", m_strLogPrefix.c_str()); m_strSessionID.clear(); } void CScrobbler::HandleHardError() { - CLog::Log(LOGDEBUG, "CScrobbler: A hard error has occurred."); + CLog::Log(LOGDEBUG, "%s: A hard error has occurred.", m_strLogPrefix.c_str()); if (++m_hardErrorCount == 3) { - CLog::Log(LOGDEBUG, "CScrobbler: Three consecuetive hard errors have "\ - "occured. Forcing new handshake."); + CLog::Log(LOGDEBUG, "%s: Three consecuetive hard errors have "\ + "occured. Forcing new handshake.", m_strLogPrefix.c_str()); ClearSession(); } } -bool CScrobbler::CanScrobble() -{ - return (!g_guiSettings.GetString("lastfm.username").IsEmpty() && - !g_guiSettings.GetString("lastfm.password").IsEmpty() && - (g_guiSettings.GetBool("lastfm.submit") || - g_guiSettings.GetBool("lastfm.submitradio"))); -} - bool CScrobbler::LoadJournal() { int journalVersion = 0; @@ -322,7 +255,7 @@ if (!xmlDoc.LoadFile(JournalFileName)) { - CLog::Log(LOGDEBUG, "CScrobbler: %s, Line %d (%s)", + CLog::Log(LOGDEBUG, "%s: %s, Line %d (%s)", m_strLogPrefix.c_str(), JournalFileName.c_str(), xmlDoc.ErrorRow(), xmlDoc.ErrorDesc()); return false; } @@ -330,7 +263,7 @@ TiXmlElement *pRoot = xmlDoc.RootElement(); if (strcmpi(pRoot->Value(), "asjournal") != 0) { - CLog::Log(LOGDEBUG, "CScrobbler: %s missing ", + CLog::Log(LOGDEBUG, "%s: %s missing ", m_strLogPrefix.c_str(), JournalFileName.c_str()); return false; } @@ -376,7 +309,7 @@ m_vecSubmissionQueue.push_back(entry); } - CLog::Log(LOGDEBUG, "CScrobbler: Journal loaded with %d entries.", + CLog::Log(LOGDEBUG, "%s: Journal loaded with %d entries.", m_strLogPrefix.c_str(), m_vecSubmissionQueue.size()); return !m_vecSubmissionQueue.empty(); } @@ -416,8 +349,8 @@ } CStdString FileName = GetJournalFileName(); - CLog::Log(LOGDEBUG, "CScrobbler: Journal with %d entries saved to %s", i, - FileName.c_str()); + CLog::Log(LOGDEBUG, "%s: Journal with %d entries saved to %s", + m_strLogPrefix.c_str(), i, FileName.c_str()); return xmlDoc.SaveFile(FileName); } @@ -436,7 +369,7 @@ // Construct handshake URL. strHandshakeRequest.Format("http://%s/?hs=true"\ - "&p=%s&c=%s&v=%s&u=%s&t=%d&a=%s", SCROBBLER_HANDSHAKE_URL, + "&p=%s&c=%s&v=%s&u=%s&t=%d&a=%s", m_strHandshakeURL.c_str(), SCROBBLER_PROTOCOL, SCROBBLER_CLIENT, SCROBBLER_CLIENT_VERSION, m_strUsername.c_str(), now, strAuthToken.c_str()); @@ -449,15 +382,15 @@ (m_failedHandshakeDelay) ? std::min(2*m_failedHandshakeDelay, 7200) : 60; m_lastFailedHandshake = now; if (!m_bBanned && !m_bBadAuth) - CLog::Log(LOGDEBUG, "CScrobbler: A hard error has occurred during "\ - "handshake. Sleeping for %d minutes.", m_failedHandshakeDelay/60); + CLog::Log(LOGDEBUG, "%s: A hard error has occurred during "\ + "handshake. Sleeping for %d minutes.", + m_strLogPrefix.c_str(), m_failedHandshakeDelay/60); return false; } bool CScrobbler::HandleHandshake(CStdString &strResponse) { - // TODO toast messages if (strResponse.IsEmpty()) return false; @@ -471,58 +404,54 @@ m_strSessionID = vecTokens[1]; m_strNowPlayingURL = vecTokens[2]; m_strSubmissionURL = vecTokens[3]; - CLog::Log(LOGDEBUG, "CScrobbler: Handshake succeeded!"); - CLog::Log(LOGDEBUG, "CScrobbler: SessionID is %s", + CLog::Log(LOGDEBUG, "%s: Handshake succeeded!", m_strLogPrefix.c_str()); + CLog::Log(LOGDEBUG, "%s: SessionID is %s", m_strLogPrefix.c_str(), m_strSessionID.c_str()); - CLog::Log(LOGDEBUG, "CScrobbler: NP URL is %s", + CLog::Log(LOGDEBUG, "%s: NP URL is %s", m_strLogPrefix.c_str(), m_strNowPlayingURL.c_str()); - CLog::Log(LOGDEBUG, "CScrobbler: Submit URL is %s", + CLog::Log(LOGDEBUG, "%s: Submit URL is %s", m_strLogPrefix.c_str(), m_strSubmissionURL.c_str()); ClearErrorState(); return true; } - CLog::Log(LOGERROR, "CScrobbler: Handshake failed! Received malformed "\ - "reply."); + CLog::Log(LOGERROR, "%s: Handshake failed! Received malformed "\ + "reply.", m_strLogPrefix.c_str()); } else if (vecTokens[0] == "BANNED") { - CLog::Log(LOGERROR, "CScrobbler: Handshake failed! Client is banned! "\ + CLog::Log(LOGERROR, "%s: Handshake failed! Client is banned! "\ "Disabling submissions. Subsequent scrobbles will be cached. "\ - "Please update your client to the newest version. "); + "Please update your client to the newest version. ", m_strLogPrefix.c_str()); if (m_failedHandshakeDelay == 0) { - CStdString strText = g_localizeStrings.Get(15205); - m_bBanned = true; - CStdString strAudioScrobbler=g_localizeStrings.Get(15200); // AudioScrobbler - g_application.m_guiDialogKaiToast.QueueNotification("", strAudioScrobbler, strText, 10000); + NotifyUser(SCROBBLER_USER_ERROR_BANNED); } } else if (vecTokens[0] == "BADAUTH") { - CLog::Log(LOGERROR, "CScrobbler: Handshake failed! Authentication failed! "\ + CLog::Log(LOGERROR, "%s: Handshake failed! Authentication failed! "\ "Disabling submissions. Subsequent scrobbles will be cached. "\ - "Please enter the correct credentials to re-enable scrobbling. "); + "Please enter the correct credentials to re-enable scrobbling. ", + m_strLogPrefix.c_str()); if (m_failedHandshakeDelay == 0) { - CStdString strText = g_localizeStrings.Get(15206); - m_bBadAuth = true; - CStdString strAudioScrobbler=g_localizeStrings.Get(15200); // AudioScrobbler - g_application.m_guiDialogKaiToast.QueueNotification("", strAudioScrobbler, strText, 10000); + NotifyUser(SCROBBLER_USER_ERROR_BADAUTH); } } else if (vecTokens[0] == "BADTIME") { - CLog::Log(LOGDEBUG, "CScrobbler: Handshake failed! Timestamp is invalid! "\ + CLog::Log(LOGDEBUG, "%s: Handshake failed! Timestamp is invalid! "\ "Disabling submissions. Subsequent scrobbles will be cached. "\ - "Please correct the system time and restart the application. "); + "Please correct the system time and restart the application. ", + m_strLogPrefix.c_str()); } else if (vecTokens[0] == "FAILED") { - CLog::Log(LOGDEBUG, "CScrobbler: Handshake failed! REASON: %s! ", + CLog::Log(LOGDEBUG, "%s: Handshake failed! REASON: %s! ", m_strLogPrefix.c_str(), strResponse.c_str()); } else - CLog::Log(LOGDEBUG, "CScrobbler: Handshake failed! REASON: Unspecified!"); + CLog::Log(LOGDEBUG, "%s: Handshake failed! REASON: Unspecified!", m_strLogPrefix.c_str()); return false; } @@ -558,19 +487,19 @@ if (vecTokens[0] == "OK") { - CLog::Log(LOGDEBUG, "CScrobbler: Now playing notification succeeded!"); + CLog::Log(LOGDEBUG, "%s: Now playing notification succeeded!", m_strLogPrefix.c_str()); ClearErrorState(); return true; } else if (vecTokens[0] == "BADSESSION") { - CLog::Log(LOGDEBUG, "CScrobbler: Now playing notification failed! "\ - "REASON: Bad session ID. Forcing new handshake."); + CLog::Log(LOGDEBUG, "%s: Now playing notification failed! "\ + "REASON: Bad session ID. Forcing new handshake.", m_strLogPrefix.c_str()); ClearSession(); } else - CLog::Log(LOGDEBUG, "CScrobbler: Now playing notification failed! "\ - "REASON: Unspecified."); + CLog::Log(LOGDEBUG, "%s: Now playing notification failed! "\ + "REASON: Unspecified.", m_strLogPrefix.c_str()); return false; } @@ -629,37 +558,31 @@ if (vecTokens[0] == "OK") { - CLog::Log(LOGDEBUG, "CScrobbler: Submission succeeded!"); + CLog::Log(LOGDEBUG, "%s: Submission succeeded!", m_strLogPrefix.c_str()); ClearErrorState(); return true; } else if (vecTokens[0] == "BADSESSION") { - CLog::Log(LOGDEBUG, "CScrobbler: Submission failed! "\ - "REASON: Bad session. Forcing new handshake."); + CLog::Log(LOGDEBUG, "%s: Submission failed! "\ + "REASON: Bad session. Forcing new handshake.", m_strLogPrefix.c_str()); ClearSession(); } else if (vecTokens[0] == "FAILED") { - CLog::Log(LOGDEBUG, "CScrobbler: Submission failed! "\ - "REASON: %s", strResponse.c_str()); + CLog::Log(LOGDEBUG, "%s: Submission failed! "\ + "REASON: %s", m_strLogPrefix.c_str(), strResponse.c_str()); } else - CLog::Log(LOGDEBUG, "CScrobbler: Submission failed! "\ - "REASON: Unspecified."); + CLog::Log(LOGDEBUG, "%s: Submission failed! "\ + "REASON: Unspecified.", m_strLogPrefix.c_str()); return false; } -CStdString CScrobbler::GetJournalFileName() -{ - CStdString strFileName = g_settings.GetProfileUserDataFolder(); - return CUtil::AddFileToFolder(strFileName, "Scrobbler.xml"); -} - void CScrobbler::Process() { - CLog::Log(LOGDEBUG, "CScrobbler: Thread started."); + CLog::Log(LOGDEBUG, "%s: Thread started.", m_strLogPrefix.c_str()); if (!m_pHttp) { // Hack since CFileCurl isn't threadsafe @@ -701,6 +624,6 @@ } delete m_pHttp; // More of aforementioned hack m_pHttp = NULL; - CLog::Log(LOGDEBUG, "CScrobbler: Thread ended."); + CLog::Log(LOGDEBUG, "%s: Thread ended.", m_strLogPrefix.c_str()); } Index: xbmc/utils/Network.cpp =================================================================== --- xbmc/utils/Network.cpp (revision 20210) +++ xbmc/utils/Network.cpp (working copy) @@ -22,7 +22,7 @@ #include "stdafx.h" #include "Network.h" #include "../Application.h" -#include "../lib/libscrobbler/scrobbler.h" +#include "../lib/libscrobbler/lastfmscrobbler.h" #include "RssReader.h" using namespace std; @@ -132,7 +132,7 @@ #ifdef HAS_ZEROCONF g_application.StartZeroconf(); #endif - CScrobbler::GetInstance()->Init(); + CLastfmScrobbler::GetInstance()->Init(); g_rssManager.Start(); } break; @@ -160,7 +160,7 @@ #ifdef HAS_ZEROCONF g_application.StopZeroconf(); #endif - CScrobbler::GetInstance()->Term(); + CLastfmScrobbler::GetInstance()->Term(); // smb.Deinit(); if any file is open over samba this will break. g_rssManager.Stop(); Index: xbmc/utils/GUIInfoManager.cpp =================================================================== --- xbmc/utils/GUIInfoManager.cpp (revision 20210) +++ xbmc/utils/GUIInfoManager.cpp (working copy) @@ -27,7 +27,7 @@ #include "GUIDialogProgress.h" #include "Application.h" #include "Util.h" -#include "lib/libscrobbler/scrobbler.h" +#include "lib/libscrobbler/lastfmscrobbler.h" #include "Weather.h" #include "PlayListPlayer.h" #include "PartyModeManager.h" @@ -3284,16 +3284,16 @@ switch (item) { case AUDIOSCROBBLER_CONN_STATE: - return CScrobbler::GetInstance()->GetConnectionState(); + return CLastfmScrobbler::GetInstance()->GetConnectionState(); break; case AUDIOSCROBBLER_SUBMIT_INT: - return CScrobbler::GetInstance()->GetSubmitInterval(); + return CLastfmScrobbler::GetInstance()->GetSubmitInterval(); break; case AUDIOSCROBBLER_FILES_CACHED: - return CScrobbler::GetInstance()->GetFilesCached(); + return CLastfmScrobbler::GetInstance()->GetFilesCached(); break; case AUDIOSCROBBLER_SUBMIT_STATE: - return CScrobbler::GetInstance()->GetSubmitState(); + return CLastfmScrobbler::GetInstance()->GetSubmitState(); break; }