/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERFETCHER_H #define ALBUMCOVERFETCHER_H #include #include #include #include #include #include #include class QNetworkReply; class QString; class AlbumCoverFetcherSearch; // This class represents a single search-for-cover request. It identifies // and describes the request. struct CoverSearchRequest { // an unique (for one AlbumCoverFetcher) request identifier quint64 id; // a search query QString query; // is this only a search request or should we also fetch the first // cover that's found? bool search; }; // This structure represents a single result of some album's cover search request. // It contains an URL that leads to a found cover plus it's description (usually // the "artist - album" string). struct CoverSearchResult { // description of this result (we suggest using the "artist - album" format) QString description; // an URL of a cover image described by this CoverSearchResult QString image_url; }; // This is a complete result of a single search request (a list of results, each // describing one image, actually). typedef QList CoverSearchResults; // This class searches for album covers for a given query or artist/album and // returns URLs. It's NOT thread-safe. class AlbumCoverFetcher : public QObject { Q_OBJECT public: AlbumCoverFetcher(QObject* parent = 0, QNetworkAccessManager* network = 0); virtual ~AlbumCoverFetcher() {} static const int kMaxConcurrentRequests; quint64 SearchForCovers(const QString& query); quint64 FetchAlbumCover(const QString& artist, const QString& album); void Clear(); signals: void AlbumCoverFetched(quint64, const QImage& cover); void SearchFinished(quint64, const CoverSearchResults& results); private slots: void SingleSearchFinished(quint64, CoverSearchResults results); void SingleCoverFetched(quint64, const QImage& cover); void StartRequests(); private: void AddRequest(const CoverSearchRequest& req); QNetworkAccessManager* network_; quint64 next_id_; QQueue queued_requests_; QHash active_requests_; QTimer* request_starter_; }; #endif // ALBUMCOVERFETCHER_H