Sort grooveshark results better in global search and show fewer of them.

This commit is contained in:
John Maguire 2011-11-01 13:00:27 +01:00
parent 2e2f4e570c
commit f241ebf7b9
6 changed files with 48 additions and 24 deletions

View File

@ -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);
}
}

View File

@ -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_;

View File

@ -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_;

View File

@ -47,11 +47,6 @@ private slots:
void AlbumBrowseResponse(const spotify_pb::BrowseAlbumResponse& response);
private:
struct PendingState {
int orig_id_;
QStringList tokens_;
};
SpotifyServer* server();
private:

View File

@ -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);

View File

@ -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;
};