| 921 | } |
| 922 | |
| 923 | CloudSyncService::DownloadAudioFuture CloudSyncService::DownloadCloudAudio( |
| 924 | std::string_view audioId, |
| 925 | sync::ProgressCallback callback) |
| 926 | { |
| 927 | ASSERT_MAIN_THREAD(); |
| 928 | |
| 929 | mDownloadAudioPromise = {}; |
| 930 | |
| 931 | if (mDownloadInProcess.exchange(true)) |
| 932 | { |
| 933 | mDownloadAudioPromise.set_value( |
| 934 | { sync::DownloadAudioResult::StatusCode::Blocked, {}, {}}); |
| 935 | return mDownloadAudioPromise.get_future(); |
| 936 | } |
| 937 | |
| 938 | if (audioId.empty()) |
| 939 | { |
| 940 | mDownloadAudioPromise.set_value( |
| 941 | { sync::DownloadAudioResult::StatusCode::Failed, |
| 942 | { SyncResultCode::InternalClientError, "Empty audioId" }, |
| 943 | {} }); |
| 944 | return mDownloadAudioPromise.get_future(); |
| 945 | } |
| 946 | |
| 947 | if (!callback) |
| 948 | mProgressCallback = [](auto...) { return true; }; |
| 949 | else |
| 950 | mProgressCallback = std::move(callback); |
| 951 | |
| 952 | GetAudioInfo(GetOAuthService(), GetServiceConfig(), std::string(audioId), |
| 953 | [this](sync::CloudAudioFullInfo audioInfo, ResponseResult result) |
| 954 | { |
| 955 | if (result.Code != SyncResultCode::Success) |
| 956 | { |
| 957 | mDownloadInProcess.store(false); |
| 958 | mDownloadAudioPromise.set_value( |
| 959 | { sync::DownloadAudioResult::StatusCode::Failed, |
| 960 | std::move(result), |
| 961 | {} }); |
| 962 | return; |
| 963 | } |
| 964 | |
| 965 | if (!audioInfo.IsDownloadable && audioInfo.AuthorId != GetUserService().GetUserId()) { |
| 966 | mDownloadInProcess.store(false); |
| 967 | mDownloadAudioPromise.set_value( |
| 968 | { sync::DownloadAudioResult::StatusCode::Failed, |
| 969 | { SyncResultCode::Forbidden, "You don't have permission to download this audio" }, |
| 970 | {} }); |
| 971 | return; |
| 972 | } |
| 973 | |
| 974 | GetAudioDownloadInfo(GetOAuthService(), GetServiceConfig(), audioInfo.Id, |
| 975 | [this, audioInfo](sync::CloudAudioDownloadInfo downloadInfo, ResponseResult result) |
| 976 | { |
| 977 | if (result.Code != SyncResultCode::Success) |
| 978 | { |
| 979 | mDownloadInProcess.store(false); |
| 980 | mDownloadAudioPromise.set_value( |
no test coverage detected