#ifndef GOOGLE_APIS_YOUTUBE_MUSIC_YOUTUBE_MUSIC_API_REQUESTS_H_
#define GOOGLE_APIS_YOUTUBE_MUSIC_YOUTUBE_MUSIC_API_REQUESTS_H_
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/types/expected.h"
#include "google_apis/common/base_requests.h"
#include "google_apis/youtube_music/youtube_music_api_request_types.h"
#include "google_apis/youtube_music/youtube_music_api_response_types.h"
namespace google_apis {
enum ApiErrorCode;
class RequestSender;
namespace youtube_music {
class GetMusicSectionRequest : public UrlFetchRequestBase {
public:
using Callback = base::OnceCallback<void(
base::expected<std::unique_ptr<TopLevelMusicRecommendations>, ApiError>)>;
GetMusicSectionRequest(RequestSender* sender,
const std::string& device_info,
Callback callback);
GetMusicSectionRequest(const GetMusicSectionRequest&) = delete;
GetMusicSectionRequest& operator=(const GetMusicSectionRequest&) = delete;
~GetMusicSectionRequest() override;
protected:
GURL GetURL() const override;
ApiErrorCode MapReasonToError(ApiErrorCode code,
const std::string& reason) override;
bool IsSuccessfulErrorCode(ApiErrorCode error) override;
std::vector<std::string> GetExtraRequestHeaders() const override;
void ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
const base::FilePath response_file,
std::string response_body) override;
void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
private:
static std::unique_ptr<TopLevelMusicRecommendations> Parse(
const std::string& json);
void OnDataParsed(
std::unique_ptr<TopLevelMusicRecommendations> recommendations);
Callback callback_;
const std::string device_info_;
base::WeakPtrFactory<GetMusicSectionRequest> weak_ptr_factory_{this};
};
class GetPlaylistRequest : public UrlFetchRequestBase {
public:
using Callback = base::OnceCallback<void(
base::expected<std::unique_ptr<Playlist>, ApiError>)>;
GetPlaylistRequest(RequestSender* sender,
const std::string& device_info,
const std::string& playlist_name,
Callback callback);
GetPlaylistRequest(const GetPlaylistRequest&) = delete;
GetPlaylistRequest& operator=(const GetPlaylistRequest&) = delete;
~GetPlaylistRequest() override;
protected:
GURL GetURL() const override;
ApiErrorCode MapReasonToError(ApiErrorCode code,
const std::string& reason) override;
bool IsSuccessfulErrorCode(ApiErrorCode error) override;
std::vector<std::string> GetExtraRequestHeaders() const override;
void ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
const base::FilePath response_file,
std::string response_body) override;
void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
private:
static std::unique_ptr<Playlist> Parse(const std::string& json);
void OnDataParsed(std::unique_ptr<Playlist> playlist);
const std::string device_info_;
std::string playlist_name_;
Callback callback_;
base::WeakPtrFactory<GetPlaylistRequest> weak_ptr_factory_{this};
};
class PlaybackQueuePrepareRequest : public SignedRequest {
public:
using Callback = base::OnceCallback<void(
base::expected<std::unique_ptr<Queue>, ApiError>)>;
PlaybackQueuePrepareRequest(RequestSender* sender,
const PlaybackQueuePrepareRequestPayload& payload,
Callback callback);
PlaybackQueuePrepareRequest(const PlaybackQueuePrepareRequest&) = delete;
PlaybackQueuePrepareRequest& operator=(const PlaybackQueuePrepareRequest&) =
delete;
~PlaybackQueuePrepareRequest() override;
protected:
GURL GetURL() const override;
ApiErrorCode MapReasonToError(ApiErrorCode code,
const std::string& reason) override;
bool IsSuccessfulErrorCode(ApiErrorCode error) override;
bool GetContentData(std::string* upload_content_type,
std::string* upload_content) override;
void ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
const base::FilePath response_file,
std::string response_body) override;
void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
private:
static std::unique_ptr<Queue> Parse(const std::string& json);
void OnDataParsed(std::unique_ptr<Queue> queue);
const PlaybackQueuePrepareRequestPayload payload_;
Callback callback_;
base::WeakPtrFactory<PlaybackQueuePrepareRequest> weak_ptr_factory_{this};
};
class PlaybackQueueNextRequest : public SignedRequest {
public:
using Callback = base::OnceCallback<void(
base::expected<std::unique_ptr<QueueContainer>, ApiError>)>;
PlaybackQueueNextRequest(RequestSender* sender,
const PlaybackQueueNextRequestPayload& payload,
Callback callback,
const std::string& playback_queue_name);
PlaybackQueueNextRequest(const PlaybackQueueNextRequest&) = delete;
PlaybackQueueNextRequest& operator=(const PlaybackQueueNextRequest&) = delete;
~PlaybackQueueNextRequest() override;
const std::string& playback_queue_name() const {
return playback_queue_name_;
}
void set_playback_queue_name(const std::string& playback_queue_name) {
playback_queue_name_ = playback_queue_name;
}
protected:
GURL GetURL() const override;
ApiErrorCode MapReasonToError(ApiErrorCode code,
const std::string& reason) override;
bool IsSuccessfulErrorCode(ApiErrorCode error) override;
bool GetContentData(std::string* upload_content_type,
std::string* upload_content) override;
void ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
const base::FilePath response_file,
std::string response_body) override;
void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
private:
static std::unique_ptr<QueueContainer> Parse(const std::string& json);
void OnDataParsed(std::unique_ptr<QueueContainer> queue_container);
const PlaybackQueueNextRequestPayload payload_;
std::string playback_queue_name_;
Callback callback_;
base::WeakPtrFactory<PlaybackQueueNextRequest> weak_ptr_factory_{this};
};
class ReportPlaybackRequest : public SignedRequest {
public:
using Callback = base::OnceCallback<void(
base::expected<std::unique_ptr<ReportPlaybackResult>, ApiError>)>;
ReportPlaybackRequest(RequestSender* sender,
std::unique_ptr<ReportPlaybackRequestPayload> payload,
Callback callback);
ReportPlaybackRequest(const ReportPlaybackRequest&) = delete;
ReportPlaybackRequest& operator=(const ReportPlaybackRequest&) = delete;
~ReportPlaybackRequest() override;
void SetBaseUrlForTesting(const GURL& base_url);
protected:
GURL GetURL() const override;
ApiErrorCode MapReasonToError(ApiErrorCode code,
const std::string& reason) override;
bool IsSuccessfulErrorCode(ApiErrorCode error) override;
bool GetContentData(std::string* upload_content_type,
std::string* upload_content) override;
void ProcessURLFetchResults(
const network::mojom::URLResponseHead* response_head,
const base::FilePath response_file,
std::string response_body) override;
void RunCallbackOnPrematureFailure(ApiErrorCode code) override;
private:
static std::unique_ptr<ReportPlaybackResult> Parse(const std::string& json);
void OnDataParsed(
std::unique_ptr<ReportPlaybackResult> report_playback_result);
const std::unique_ptr<ReportPlaybackRequestPayload> payload_;
GURL base_url_;
Callback callback_;
base::WeakPtrFactory<ReportPlaybackRequest> weak_ptr_factory_{this};
};
}
}
#endif