/* * Strawberry Music Player * Copyright 2018-2021, Jonas Kvinge * * Strawberry 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. * * Strawberry 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 Strawberry. If not, see . * */ #ifndef TIDALREQUEST_H #define TIDALREQUEST_H #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "core/song.h" #include "tidalbaserequest.h" class QNetworkReply; class Application; class NetworkAccessManager; class TidalService; class TidalUrlHandler; class TidalRequest : public TidalBaseRequest { Q_OBJECT public: explicit TidalRequest(TidalService *service, TidalUrlHandler *url_handler, Application *app, NetworkAccessManager *network, QueryType type, QObject *parent); ~TidalRequest() override; void ReloadSettings(); void Process(); void set_need_login() override { need_login_ = true; } void Search(const int query_id, const QString &search_text); private: struct Request { Request() : offset(0), limit(0), album_explicit(false) {} QString artist_id; QString album_id; QString song_id; int offset; int limit; QString album_artist; QString album; bool album_explicit; }; struct AlbumCoverRequest { QString artist_id; QString album_id; QUrl url; QString filename; }; signals: void LoginSuccess(); void LoginFailure(QString failure_reason); void Results(int id, SongList songs, QString error); void UpdateStatus(int id, QString text); void ProgressSetMaximum(int id, int max); void UpdateProgress(int id, int max); void StreamURLFinished(QUrl original_url, QUrl url, Song::FileType, QString error = QString()); private slots: void ArtistsReplyReceived(QNetworkReply *reply, const int limit_requested, const int offset_requested); void AlbumsReplyReceived(QNetworkReply *reply, const int limit_requested, const int offset_requested); void AlbumsReceived(QNetworkReply *reply, const QString &artist_id_requested, const int limit_requested, const int offset_requested, const bool auto_login); void SongsReplyReceived(QNetworkReply *reply, const int limit_requested, const int offset_requested); void SongsReceived(QNetworkReply *reply, const QString &artist_id, const QString &album_id, const int limit_requested, const int offset_requested, const bool auto_login = false, const QString &album_artist = QString(), const QString &album = QString(), const bool album_explicit = false); void ArtistAlbumsReplyReceived(QNetworkReply *reply, const QString &artist_id, const int offset_requested); void AlbumSongsReplyReceived(QNetworkReply *reply, const QString &artist_id, const QString &album_id, const int offset_requested, const QString &album_artist, const QString &album, const bool album_explicit); void AlbumCoverReceived(QNetworkReply *reply, const QString &album_id, const QUrl &url, const QString &filename); public slots: void LoginComplete(const bool success, const QString &error = QString()); private: bool IsQuery() { return (type_ == QueryType_Artists || type_ == QueryType_Albums || type_ == QueryType_Songs); } bool IsSearch() { return (type_ == QueryType_SearchArtists || type_ == QueryType_SearchAlbums || type_ == QueryType_SearchSongs); } void GetArtists(); void GetAlbums(); void GetSongs(); void ArtistsSearch(); void AlbumsSearch(); void SongsSearch(); void AddArtistsRequest(const int offset = 0, const int limit = 0); void AddArtistsSearchRequest(const int offset = 0); void FlushArtistsRequests(); void AddAlbumsRequest(const int offset = 0, const int limit = 0); void AddAlbumsSearchRequest(const int offset = 0); void FlushAlbumsRequests(); void AddSongsRequest(const int offset = 0, const int limit = 0); void AddSongsSearchRequest(const int offset = 0); void FlushSongsRequests(); void ArtistsFinishCheck(const int limit = 0, const int offset = 0, const int artists_received = 0); void AlbumsFinishCheck(const QString &artist_id, const int limit = 0, const int offset = 0, const int albums_total = 0, const int albums_received = 0); void SongsFinishCheck(const QString &artist_id, const QString &album_id, const int limit, const int offset, const int songs_total, const int songs_received, const QString &album_artist, const QString &album, const bool album_explicit); void AddArtistAlbumsRequest(const QString &artist_id, const int offset = 0); void FlushArtistAlbumsRequests(); void AddAlbumSongsRequest(const QString &artist_id, const QString &album_id, const QString &album_artist, const QString &album, const bool album_explicit, const int offset = 0); void FlushAlbumSongsRequests(); QString ParseSong(Song &song, const QJsonObject &json_obj, const QString &artist_id_requested = QString(), const QString &album_id_requested = QString(), const QString &album_artist = QString(), const QString &album_album = QString(), const bool album_explicit = false); void GetAlbumCovers(); void AddAlbumCoverRequest(const Song &song); void FlushAlbumCoverRequests(); void AlbumCoverFinishCheck(); void FinishCheck(); static void Warn(const QString &error, const QVariant &debug = QVariant()); void Error(const QString &error, const QVariant &debug = QVariant()) override; static const char *kResourcesUrl; static const int kMaxConcurrentArtistsRequests; static const int kMaxConcurrentAlbumsRequests; static const int kMaxConcurrentSongsRequests; static const int kMaxConcurrentArtistAlbumsRequests; static const int kMaxConcurrentAlbumSongsRequests; static const int kMaxConcurrentAlbumCoverRequests; TidalService *service_; TidalUrlHandler *url_handler_; Application *app_; NetworkAccessManager *network_; QueryType type_; bool fetchalbums_; QString coversize_; int query_id_; QString search_text_; bool finished_; QQueue artists_requests_queue_; QQueue albums_requests_queue_; QQueue songs_requests_queue_; QQueue artist_albums_requests_queue_; QQueue album_songs_requests_queue_; QQueue album_cover_requests_queue_; QList artist_albums_requests_pending_; QHash album_songs_requests_pending_; QMultiMap album_covers_requests_sent_; int artists_requests_active_; int artists_total_; int artists_received_; int albums_requests_active_; int songs_requests_active_; int artist_albums_requests_active_; int artist_albums_requested_; int artist_albums_received_; int album_songs_requests_active_; int album_songs_requested_; int album_songs_received_; int album_covers_requests_active_; int album_covers_requested_; int album_covers_received_; QMap songs_; QStringList errors_; bool need_login_; bool no_results_; QList replies_; QList album_cover_replies_; }; #endif // TIDALREQUEST_H