#pragma once #include #include #include "musicbrainz/web/acoustidlookuptask.h" #include "musicbrainz/web/musicbrainzrecordingstask.h" #include "track/track_decl.h" #include "util/parented_ptr.h" class TagFetcher : public QObject { Q_OBJECT // Implements retrieval of metadata in 3 subsequent stages: // 1. Chromaprint -> AcoustID fingerprint // 2. AcoustID -> MusicBrainz recording UUIDs // 3. MusicBrainz -> MusicBrainz track releases public: explicit TagFetcher( QObject* parent = nullptr); ~TagFetcher() override = default; void startFetch( TrackPointer pTrack); public slots: void cancel(); signals: void resultAvailable( TrackPointer pTrack, const QList& guessedTrackReleases); void fetchProgress( const QString& message); void networkError( int httpStatus, const QString& app, const QString& message, int code); private slots: void slotFingerprintReady(); void slotAcoustIdTaskSucceeded( QList recordingIds); void slotAcoustIdTaskFailed( const mixxx::network::JsonWebResponse& response); void slotAcoustIdTaskAborted(); void slotAcoustIdTaskNetworkError( QNetworkReply::NetworkError errorCode, const QString& errorString, const mixxx::network::WebResponseWithContent& responseWithContent); void slotMusicBrainzTaskSucceeded( const QList& guessedTrackReleases); void slotMusicBrainzTaskFailed( const mixxx::network::WebResponse& response, int errorCode, const QString& errorMessage); void slotMusicBrainzTaskAborted(); void slotMusicBrainzTaskNetworkError( QNetworkReply::NetworkError errorCode, const QString& errorString, const mixxx::network::WebResponseWithContent& responseWithContent); private: bool onAcoustIdTaskTerminated(); bool onMusicBrainzTaskTerminated(); QNetworkAccessManager m_network; QFutureWatcher m_fingerprintWatcher; parented_ptr m_pAcoustIdTask; parented_ptr m_pMusicBrainzTask; TrackPointer m_pTrack; };