Added exteneded mix parsing

This commit is contained in:
Nedko 2024-06-28 14:06:59 +03:00
parent b13478cebf
commit ee703e6fde
2 changed files with 96 additions and 24 deletions

View File

@ -78,10 +78,12 @@ string Monstercat_DL::calc_proper_title(const string& artist_raw,
result += trim_whitespace(version_raw);
result += ")";
}
return result;
}
Monstercat_DL::Monstercat_DL()
: log(&std::cout), m_base_url("https://player.monstercat.app/api/"),
: m_log(&std::cout), m_base_url("https://player.monstercat.app/api/"),
m_is_logged_in(false)
{}
@ -106,10 +108,10 @@ bool Monstercat_DL::login(const string& user, const string& pass)
ok = curl.post_json(url, data, &out);
if (!ok)
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "Could not post json" << endl;
*log << "CURL:" << curl.get_error() << endl;
*m_log << "Could not post json" << endl;
*m_log << "CURL:" << curl.get_error() << endl;
}
return false;
}
@ -146,10 +148,10 @@ bool Monstercat_DL::logout()
ok = curl.post_json(url, data, nullptr);
if (!ok)
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "Could not post json" << endl;
*log << "CURL:" << curl.get_error() << endl;
*m_log << "Could not post json" << endl;
*m_log << "CURL:" << curl.get_error() << endl;
}
return false;
}
@ -172,10 +174,10 @@ json Monstercat_DL::get_release_json(const string& catalog_id)
ok = curl.download(url, &out);
if (!ok)
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "Could not download json" << endl;
*log << "CURL:" << curl.get_error() << endl;
*m_log << "Could not download json" << endl;
*m_log << "CURL:" << curl.get_error() << endl;
}
return result;
}
@ -199,10 +201,10 @@ json Monstercat_DL::get_browse_json(const string& release_id)
ok = curl.download(url, &out);
if (!ok)
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "Could not download json" << endl;
*log << "CURL:" << curl.get_error() << endl;
*m_log << "Could not download json" << endl;
*m_log << "CURL:" << curl.get_error() << endl;
}
return result;
}
@ -231,6 +233,7 @@ Release Monstercat_DL::parse_release_json(const json& release_json)
}
// Parse Release
json_extract(release_object, "CatalogId", result.catalog_id);
json_extract(release_object, "Id", result.id);
json_extract(release_object, "Type", result.type);
json_extract(release_object, "ReleaseDate", result.release_date);
@ -281,6 +284,73 @@ Release Monstercat_DL::parse_release_json(const json& release_json)
return result;
}
void Monstercat_DL::add_extended_mixes(Release& release, const json& browse_json)
{
int track_num;
json data_obj;
json file_obj;
Track *track;
string mime_type;
if (browse_json.contains("Data") && browse_json["Data"].is_array())
{
data_obj = browse_json["Data"];
}
for (json& track_json : data_obj)
{
// Get the track number
track_num = 0;
if (track_json.contains("TrackNumber") && track_json["TrackNumber"].is_number_integer())
{
track_num = track_json["TrackNumber"];
}
// File must exist and be an object
if (!track_json.contains("File") || !track_json["File"].is_object())
{
continue;
}
// Find track
track = nullptr;
for (int i = 0; i < release.tracks.size(); ++i)
{
if (release.tracks[i].number == track_num)
{
track = &(release.tracks[i]);
break;
}
}
if (nullptr == track)
{
if (nullptr != m_log)
{
*m_log << "Could not find track number " << track_num << " for catalog id " << release.catalog_id << endl;
}
return;
}
file_obj = track_json["File"];
json_extract(file_obj, "Id", track->extended_mix_file_id);
json_extract(file_obj, "MimeType", mime_type);
if ("audio/wav" == mime_type)
{
track->extended_mix_extension = ".wav";
}
else
{
if (nullptr != m_log)
{
*m_log << "Unknown MIME type for catalog id " << release.catalog_id << " - " << mime_type << endl;
}
}
return;
}
}
bool Monstercat_DL::download_cover(const string& catalog_id, const string& path)
{
CURL_DL& curl = CURL_DL::get_handle();
@ -298,10 +368,10 @@ bool Monstercat_DL::download_cover(const string& catalog_id, const string& path)
ok = curl.download(url, &out, nullptr, &out_headers);
if (!ok)
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "Could not download image" << endl;
*log << "CURL:" << curl.get_error() << endl;
*m_log << "Could not download image" << endl;
*m_log << "CURL:" << curl.get_error() << endl;
}
return false;
}
@ -309,9 +379,9 @@ bool Monstercat_DL::download_cover(const string& catalog_id, const string& path)
filename = path;
if (0 == out_headers.count("content-type"))
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "No content-type" << endl;
*m_log << "No content-type" << endl;
}
}
else
@ -326,9 +396,9 @@ bool Monstercat_DL::download_cover(const string& catalog_id, const string& path)
}
else
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "Unknown Content-Type for cover - " << out_headers["content-type"] << endl;
*m_log << "Unknown Content-Type for cover - " << out_headers["content-type"] << endl;
}
}
}
@ -336,10 +406,10 @@ bool Monstercat_DL::download_cover(const string& catalog_id, const string& path)
out_file.open(filename, std::ios::binary);
if (!out_file.is_open())
{
if (nullptr != log)
if (nullptr != m_log)
{
*log << "Could not open file for write" << endl;
*log << filename << endl;
*m_log << "Could not open file for write" << endl;
*m_log << filename << endl;
}
return false;
}

View File

@ -27,12 +27,13 @@ struct Release
std::vector<Track> tracks;
std::string id;
std::string catalog_id;
};
class Monstercat_DL
{
private:
std::ostream *log;
std::ostream *m_log;
std::string m_base_url;
@ -53,6 +54,7 @@ public:
nlohmann::json get_browse_json(const std::string& release_id);
Release parse_release_json(const nlohmann::json& release_json);
void add_extended_mixes(Release& release, const nlohmann::json& browse_json);
bool download_cover(const std::string& catalog_id, const std::string& path);
bool download_track(const std::string& release_id,