1 // (c) 2004 Christian Muehlhaeuser <chris@chris.de>
2 // (c) 2004 Sami Nieminen <sami.nieminen@iki.fi>
3 // (c) 2006 Shane King <kde@dontletsstart.com>
4 // (c) 2006 Iain Benson <iain@arctos.me.uk>
5 // See COPYING file for licensing information
7 #ifndef AMAROK_SCROBBLER_H
8 #define AMAROK_SCROBBLER_H
10 #include "engineobserver.h"
13 #include <q3ptrdict.h>
14 #include <q3ptrlist.h>
17 //some setups require this
18 #undef PROTOCOL_VERSION
20 namespace KIO
{ class Job
; }
25 class ScrobblerSubmitter
;
27 class Scrobbler
: public QObject
, public EngineObserver
29 friend class MediaDevice
;
34 static Scrobbler
*instance();
36 void similarArtists( const QString
& /*artist*/ );
40 void similarArtistsFetched( const QString
& artist
, const QStringList
& suggestions
);
43 void subTrack( long currentPos
, long startPos
, long endPos
); // cuefiles can update length without track change
49 void engineNewMetaData( const MetaBundle
& /*bundle*/, bool /*state*/ );
50 void engineTrackPositionChanged( long /*position*/ , bool /*userSeek*/ );
53 void audioScrobblerSimilarArtistsResult( KIO::Job
* /*job*/ );
54 void audioScrobblerSimilarArtistsData(
55 KIO::Job
* /*job*/, const QByteArray
& /*data*/ );
58 QTimer m_timer
; //works around xine bug
59 //http://sourceforge.net/tracker/index.php?func=detail&aid=1401026&group_id=9655&atid=109655
60 QByteArray m_similarArtistsBuffer
;
61 KIO::Job
* m_similarArtistsJob
;
63 bool m_validForSending
;
65 ScrobblerSubmitter
* m_submitter
;
72 friend class ScrobblerSubmitter
;
76 const QString
& /*artist*/,
77 const QString
& /*album*/,
78 const QString
& /*title*/,
81 SubmitItem( const QDomElement
& /* domElement */ );
84 bool operator==( const SubmitItem
& item
);
86 void setArtist( const QString
& artist
) { m_artist
= artist
; }
87 void setAlbum( const QString
& album
) { m_album
= album
; }
88 void setTitle( const QString
& title
) { m_title
= title
; }
89 const QString
artist() const { return m_artist
; }
90 const QString
album() const { return m_album
; }
91 const QString
title() const { return m_title
; }
92 int length() const { return m_length
; }
93 uint
playStartTime() const { return m_playStartTime
; }
95 QDomElement
toDomElement( QDomDocument
& /* document */ ) const;
97 bool valid() const { return !m_artist
.isEmpty() && !m_title
.isEmpty() && m_length
>= 30; }
104 uint m_playStartTime
;
108 class SubmitQueue
: public Q3PtrList
<SubmitItem
>
111 int compareItems( Q3PtrCollection::Item item1
, Q3PtrCollection::Item item2
);
115 class ScrobblerSubmitter
: public QObject
120 static QString PROTOCOL_VERSION
;
121 static QString CLIENT_ID
;
122 static QString CLIENT_VERSION
;
123 static QString HANDSHAKE_URL
;
125 ScrobblerSubmitter();
126 ~ScrobblerSubmitter();
128 void submitItem( SubmitItem
* /* item */ );
130 void configure( const QString
& /*username*/, const QString
& /* password*/, bool /*enabled*/ );
135 void scheduledTimeReached();
136 void audioScrobblerHandshakeResult( KIO::Job
* /*job*/ );
137 void audioScrobblerSubmitResult( KIO::Job
* /*job*/ );
138 void audioScrobblerSubmitData(
139 KIO::Job
* /*job*/, const QByteArray
& /*data*/ );
142 bool canSubmit() const;
143 void enqueueItem( SubmitItem
* /* item */ );
144 SubmitItem
* dequeueItem();
145 void enqueueJob( KIO::Job
* /* job */ );
146 void finishJob( KIO::Job
* /* job */ );
148 SubmitItem
* /* item */, int /* tracks */, bool /* success */ ) const;
149 void saveSubmitQueue();
150 void readSubmitQueue();
151 bool schedule( bool failure
);
152 void performHandshake();
153 void performSubmit();
155 // on failure, start at MIN_BACKOFF, and double on subsequent failures
156 // until MAX_BACKOFF is reached
157 static const int MIN_BACKOFF
= 60;
158 static const int MAX_BACKOFF
= 60 * 60;
160 QString m_submitResultBuffer
;
166 bool m_scrobblerEnabled
;
167 bool m_holdFakeQueue
;
169 bool m_needHandshake
;
170 uint m_prevSubmitTime
;
173 uint m_lastSubmissionFinishTime
;
174 uint m_fakeQueueLength
;
176 Q3PtrDict
<SubmitItem
> m_ongoingSubmits
;
177 SubmitQueue m_submitQueue
; // songs played by Amarok
178 SubmitQueue m_fakeQueue
; // songs for which play times have to be faked (e.g. when submitting from media device)
184 #endif /* AMAROK_SCROBBLER_H */