Header cleanup
[amarok.git] / src / scrobbler.h
blobabb45943b5b00e59acc4427683e96ffa5b95bc14
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"
11 #include <qdom.h>
12 #include <QObject>
13 #include <q3ptrdict.h>
14 #include <q3ptrlist.h>
15 #include <QTimer>
17 //some setups require this
18 #undef PROTOCOL_VERSION
20 namespace KIO { class Job; }
22 class QStringList;
23 class SubmitItem;
24 class SubmitQueue;
25 class ScrobblerSubmitter;
27 class Scrobbler : public QObject, public EngineObserver
29 friend class MediaDevice;
31 Q_OBJECT
33 public:
34 static Scrobbler *instance();
36 void similarArtists( const QString & /*artist*/ );
37 void applySettings();
39 signals:
40 void similarArtistsFetched( const QString& artist, const QStringList& suggestions );
42 public slots:
43 void subTrack( long currentPos, long startPos, long endPos ); // cuefiles can update length without track change
45 protected:
46 Scrobbler();
47 ~Scrobbler();
49 void engineNewMetaData( const MetaBundle& /*bundle*/, bool /*state*/ );
50 void engineTrackPositionChanged( long /*position*/ , bool /*userSeek*/ );
52 private slots:
53 void audioScrobblerSimilarArtistsResult( KIO::Job* /*job*/ );
54 void audioScrobblerSimilarArtistsData(
55 KIO::Job* /*job*/, const QByteArray& /*data*/ );
57 private:
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;
62 QString m_artist;
63 bool m_validForSending;
64 long m_startPos;
65 ScrobblerSubmitter* m_submitter;
66 SubmitItem* m_item;
70 class SubmitItem
72 friend class ScrobblerSubmitter;
74 public:
75 SubmitItem(
76 const QString& /*artist*/,
77 const QString& /*album*/,
78 const QString& /*title*/,
79 int /*length*/,
80 bool now = true );
81 SubmitItem( const QDomElement& /* domElement */ );
82 SubmitItem();
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; }
99 private:
100 QString m_artist;
101 QString m_album;
102 QString m_title;
103 int m_length;
104 uint m_playStartTime;
108 class SubmitQueue : public Q3PtrList<SubmitItem>
110 protected:
111 int compareItems( Q3PtrCollection::Item item1, Q3PtrCollection::Item item2 );
115 class ScrobblerSubmitter : public QObject
117 Q_OBJECT
119 public:
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*/ );
132 void syncComplete();
134 private slots:
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*/ );
141 private:
142 bool canSubmit() const;
143 void enqueueItem( SubmitItem* /* item */ );
144 SubmitItem* dequeueItem();
145 void enqueueJob( KIO::Job* /* job */ );
146 void finishJob( KIO::Job* /* job */ );
147 void announceSubmit(
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;
161 QString m_username;
162 QString m_password;
163 QString m_submitUrl;
164 QString m_challenge;
165 QString m_savePath;
166 bool m_scrobblerEnabled;
167 bool m_holdFakeQueue;
168 bool m_inProgress;
169 bool m_needHandshake;
170 uint m_prevSubmitTime;
171 uint m_interval;
172 uint m_backoff;
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)
180 QTimer m_timer;
184 #endif /* AMAROK_SCROBBLER_H */