1
#ifndef SPOTIFYSERVICE_H
2
#define SPOTIFYSERVICE_H
4
#include "internetmodel.h"
5
#include "internetservice.h"
6
#include "spotifyblob/common/spotifymessages.pb.h"
11
#include <boost/shared_ptr.hpp>
18
class SpotifyService : public InternetService {
22
SpotifyService(InternetModel* parent);
26
Type_SearchResults = InternetModel::TypeCount,
33
Role_UserPlaylistIndex = InternetModel::RoleCount,
36
// Values are persisted - don't change.
38
LoginState_LoggedIn = 1,
39
LoginState_Banned = 2,
40
LoginState_BadCredentials = 3,
41
LoginState_NoPremium = 4,
42
LoginState_OtherError = 5,
43
LoginState_ReloginFailed = 6
46
static const char* kServiceName;
47
static const char* kSettingsGroup;
48
static const char* kBlobDownloadUrl;
49
static const int kSearchDelayMsec;
51
void ReloadSettings();
53
QStandardItem* CreateRootItem();
54
void LazyPopulate(QStandardItem* parent);
55
void ShowContextMenu(const QModelIndex& index, const QPoint& global_pos);
56
void ItemDoubleClicked(QStandardItem* item);
57
PlaylistItem::Options playlistitem_options() const;
60
void Login(const QString& username, const QString& password);
61
void Search(const QString& text, Playlist* playlist, bool now = false);
62
Q_INVOKABLE void LoadImage(const QString& id);
64
SpotifyServer* server() const;
66
bool IsBlobInstalled() const;
69
// Persisted in the settings and updated on each Login().
70
LoginState login_state() const { return login_state_; }
71
bool IsLoggedIn() const { return login_state_ == LoginState_LoggedIn; }
73
static void SongFromProtobuf(const spotify_pb::Track& track, Song* song);
76
void BlobStateChanged();
77
void LoginFinished(bool success);
78
void ImageLoaded(const QString& id, const QImage& image);
84
virtual QModelIndex GetCurrentIndex();
87
void StartBlobProcess();
88
void FillPlaylist(QStandardItem* item, const spotify_pb::LoadPlaylistResponse& response);
89
void EnsureMenuCreated();
91
QStandardItem* PlaylistBySpotifyIndex(int index) const;
92
bool DoPlaylistsDiffer(const spotify_pb::Playlists& response) const;
95
void EnsureServerCreated(const QString& username = QString(),
96
const QString& password = QString());
97
void BlobProcessError(QProcess::ProcessError error);
98
void LoginCompleted(bool success, const QString& error,
99
spotify_pb::LoginResponse_Error error_code);
100
void PlaylistsUpdated(const spotify_pb::Playlists& response);
101
void InboxLoaded(const spotify_pb::LoadPlaylistResponse& response);
102
void StarredLoaded(const spotify_pb::LoadPlaylistResponse& response);
103
void UserPlaylistLoaded(const spotify_pb::LoadPlaylistResponse& response);
104
void SearchResults(const spotify_pb::SearchResponse& response);
105
void SyncPlaylistProgress(const spotify_pb::SyncPlaylistProgress& progress);
107
void OpenSearchTab();
111
void BlobDownloadFinished();
114
SpotifyServer* server_;
116
QString system_blob_path_;
117
QString local_blob_version_;
118
QString local_blob_path_;
119
QProcess* blob_process_;
121
QStandardItem* root_;
122
QStandardItem* search_;
123
QStandardItem* starred_;
124
QStandardItem* inbox_;
125
QList<QStandardItem*> playlists_;
128
QString pending_search_;
129
Playlist* pending_search_playlist_;
131
QMenu* context_menu_;
132
QMenu* playlist_context_menu_;
133
QAction* playlist_sync_action_;
134
QModelIndex context_item_;
136
QTimer* search_delay_;
139
int starred_sync_id_;
140
QMap<int, int> playlist_sync_ids_;
142
LoginState login_state_;
143
spotify_pb::Bitrate bitrate_;
144
bool volume_normalisation_;