Sort grooveshark results better in global search and show fewer of them.
This commit is contained in:
parent
2e2f4e570c
commit
f241ebf7b9
@ -54,22 +54,26 @@ void GroovesharkSearchProvider::Init(GroovesharkService* service) {
|
||||
|
||||
void GroovesharkSearchProvider::SearchAsync(int id, const QString& query) {
|
||||
const int service_id = service_->SimpleSearch(query);
|
||||
pending_searches_[service_id] = id;
|
||||
pending_searches_[service_id] = PendingState(id, TokenizeQuery(query));;
|
||||
|
||||
const int album_id = service_->SearchAlbums(query);
|
||||
pending_searches_[album_id] = id;
|
||||
pending_searches_[album_id] = PendingState(id, TokenizeQuery(query));
|
||||
}
|
||||
|
||||
void GroovesharkSearchProvider::SearchDone(int id, const SongList& songs) {
|
||||
// Map back to the original id.
|
||||
const int global_search_id = pending_searches_.take(id);
|
||||
const PendingState state = pending_searches_.take(id);
|
||||
const int global_search_id = state.orig_id_;
|
||||
|
||||
SongList songs_copy(songs);
|
||||
SortSongs(&songs_copy);
|
||||
|
||||
ResultList ret;
|
||||
foreach (const Song& song, songs) {
|
||||
foreach (const Song& song, songs_copy) {
|
||||
Result result(this);
|
||||
result.type_ = globalsearch::Type_Track;
|
||||
result.metadata_ = song;
|
||||
result.match_quality_ = globalsearch::Quality_AtStart;
|
||||
result.match_quality_ = MatchQuality(state.tokens_, song.title());
|
||||
|
||||
ret << result;
|
||||
}
|
||||
@ -79,14 +83,18 @@ void GroovesharkSearchProvider::SearchDone(int id, const SongList& songs) {
|
||||
}
|
||||
|
||||
void GroovesharkSearchProvider::AlbumSearchResult(int id, const SongList& songs) {
|
||||
const int global_search_id = pending_searches_.take(id);
|
||||
// Map back to the original id.
|
||||
const PendingState state = pending_searches_.take(id);
|
||||
const int global_search_id = state.orig_id_;
|
||||
|
||||
ResultList ret;
|
||||
foreach (const Song& s, songs) {
|
||||
Result result(this);
|
||||
result.type_ = globalsearch::Type_Album;
|
||||
result.match_quality_ = globalsearch::Quality_AtStart;
|
||||
result.metadata_ = s;
|
||||
result.match_quality_ =
|
||||
qMin(MatchQuality(state.tokens_, s.album()),
|
||||
MatchQuality(state.tokens_, s.artist()));
|
||||
|
||||
ret << result;
|
||||
}
|
||||
@ -96,8 +104,7 @@ void GroovesharkSearchProvider::AlbumSearchResult(int id, const SongList& songs)
|
||||
}
|
||||
|
||||
void GroovesharkSearchProvider::MaybeSearchFinished(int id) {
|
||||
qLog(Debug) << id << pending_searches_.keys(id);
|
||||
if (pending_searches_.keys(id).isEmpty()) {
|
||||
if (pending_searches_.keys(PendingState(id, QStringList())).isEmpty()) {
|
||||
emit SearchFinished(id);
|
||||
}
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ class GroovesharkSearchProvider : public SearchProvider {
|
||||
void FetchAlbum(int id, const Result& result);
|
||||
|
||||
GroovesharkService* service_;
|
||||
QMap<int, int> pending_searches_;
|
||||
QMap<int, PendingState> pending_searches_;
|
||||
|
||||
BackgroundThread<AlbumCoverLoader>* cover_loader_;
|
||||
QMap<quint64, int> cover_loader_tasks_;
|
||||
|
@ -130,6 +130,25 @@ protected:
|
||||
void Init(const QString& name, const QString& id, const QIcon& icon,
|
||||
Hints hints = NoHints);
|
||||
|
||||
struct PendingState {
|
||||
PendingState() : orig_id_(-1) {}
|
||||
PendingState(int orig_id, QStringList tokens)
|
||||
: orig_id_(orig_id),
|
||||
tokens_(tokens) {
|
||||
}
|
||||
int orig_id_;
|
||||
QStringList tokens_;
|
||||
|
||||
bool operator<(const PendingState& b) const {
|
||||
return orig_id_ < b.orig_id_;
|
||||
}
|
||||
|
||||
bool operator==(const PendingState& b) const {
|
||||
return orig_id_ == b.orig_id_;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
QString name_;
|
||||
QString id_;
|
||||
|
@ -47,11 +47,6 @@ private slots:
|
||||
void AlbumBrowseResponse(const spotify_pb::BrowseAlbumResponse& response);
|
||||
|
||||
private:
|
||||
struct PendingState {
|
||||
int orig_id_;
|
||||
QStringList tokens_;
|
||||
};
|
||||
|
||||
SpotifyServer* server();
|
||||
|
||||
private:
|
||||
|
@ -63,6 +63,7 @@ const char* GroovesharkService::kUrlCover = "http://beta.grooveshark.com/static/
|
||||
|
||||
const int GroovesharkService::kSearchDelayMsec = 400;
|
||||
const int GroovesharkService::kSongSearchLimit = 50;
|
||||
const int GroovesharkService::kSongSimpleSearchLimit = 10;
|
||||
|
||||
typedef QPair<QString, QVariant> Param;
|
||||
|
||||
@ -141,7 +142,7 @@ int GroovesharkService::SimpleSearch(const QString& query) {
|
||||
QList<Param> parameters;
|
||||
parameters << Param("query", query)
|
||||
<< Param("country", "")
|
||||
<< Param("limit", QString::number(kSongSearchLimit))
|
||||
<< Param("limit", QString::number(kSongSimpleSearchLimit))
|
||||
<< Param("offset", "");
|
||||
|
||||
QNetworkReply* reply = CreateRequest("getSongSearchResults", parameters, false);
|
||||
|
@ -86,14 +86,6 @@ class GroovesharkService : public InternetService {
|
||||
|
||||
static const char* kServiceName;
|
||||
static const char* kSettingsGroup;
|
||||
static const char* kUrl;
|
||||
static const char* kUrlCover;
|
||||
|
||||
static const int kSongSearchLimit;
|
||||
static const int kSearchDelayMsec;
|
||||
|
||||
static const char* kApiKey;
|
||||
static const char* kApiSecret;
|
||||
|
||||
signals:
|
||||
void LoginFinished(bool success);
|
||||
@ -193,6 +185,16 @@ class GroovesharkService : public InternetService {
|
||||
QByteArray api_key_;
|
||||
|
||||
LoginState login_state_;
|
||||
|
||||
static const char* kUrl;
|
||||
static const char* kUrlCover;
|
||||
|
||||
static const int kSongSearchLimit;
|
||||
static const int kSongSimpleSearchLimit;
|
||||
static const int kSearchDelayMsec;
|
||||
|
||||
static const char* kApiKey;
|
||||
static const char* kApiSecret;
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user