#include #include #include #include "monstercat_dl.h" #include "common.h" #include "json.hpp" using namespace std; using nlohmann::json; void usage(const char *name) { cout << "Usage: " << name << " [catalog id] ..." << endl; } string gen_resize_command(const string& release_folder, const string& convert_exec) { string cmd; cmd = convert_exec; cmd += " \""; cmd += build_fname(release_folder, "", "Cover.*"); cmd += "\" -resize 750x750 \""; cmd += build_fname(release_folder, "", "Cover_small.jpg"); cmd += "\""; return cmd; } string gen_mp3_clear(const string& filepath, const string& eyed3_exec) { string cmd; cmd = eyed3_exec; cmd += " --preserve-file-times --remove-all-images \""; cmd += filepath; cmd += "\" > /dev/null 2>&1"; return cmd; } string gen_mp3_set_tags(const string& filepath, const string& artist, const string& title, const string& album, int track_num, const string& cover_filepath, string eyed3_exec) { string cmd; cmd = eyed3_exec; cmd += " --encoding utf8 --preserve-file-times --add-image \""; cmd += cover_filepath; cmd += "\":FRONT_COVER --artist \""; cmd += artist; // cmd += "\" --album \""; // cmd += album; cmd += "\" --title \""; cmd += title; cmd += "\" --track "; cmd += to_string(track_num); cmd += " \""; cmd += filepath; cmd += "\" > /dev/null 2>&1"; return cmd; } string gen_flac_clear_images(const string& filepath, const string& metaflac_exec) { string cmd; cmd = metaflac_exec; cmd += " --preserve-modtime --no-utf8-convert"; cmd += " --remove --block-type=PICTURE \""; cmd += filepath; cmd += "\""; return cmd; } string gen_flac_clear_tags(const string& filepath, const string& metaflac_exec) { string cmd; cmd = metaflac_exec; cmd += " --preserve-modtime --no-utf8-convert"; cmd += " --remove-tag=TITLE"; cmd += " --remove-tag=ARTIST"; // cmd += " --remove-tag=ALBUM"; cmd += " --remove-tag=TRACKNUMBER"; cmd += " \""; cmd += filepath; cmd += "\""; return cmd; } string gen_flac_set_tags(const string& filepath, const string& artist, const string& title, const string& album, int track_num, const string& cover_filepath, string metaflac_exec) { string cmd; cmd = metaflac_exec; cmd += " --preserve-modtime --no-utf8-convert"; cmd += " \"--import-picture-from=3|image/jpeg|||"; cmd += cover_filepath; cmd += "\" \"--set-tag=TITLE="; cmd += title; cmd += "\" \"--set-tag=ARTIST="; cmd += artist; // cmd += "\" \"--set-tag=ALBUM="; // cmd += album; cmd += "\" \"--set-tag=TRACKNUMBER="; cmd += to_string(track_num); cmd += "\" --dont-use-padding \""; cmd += filepath; cmd += "\""; return cmd; } int main(int argc, char **argv) { // Config stuff bool ok; json config; string email; string pass; string main_path; string convert_exec = "convert"; string eyed3_exec = "eyeD3"; string metaflac_exec = "metaflac"; vector catalog_ids(&(argv[1]), &(argv[argc])); json j; Monstercat_DL mcat; Release release; // Folder stuff string release_folder; string mp3_folder; string flac_folder; string extended_folder; string filename; string filepath; ok = read_config(config); if (!ok) { cout << "Could not read config" << endl; return -1; } json_extract(config, "Email", email); json_extract(config, "Pass", pass); json_extract(config, "download_path", main_path); json_extract(config, "convert_exec", convert_exec); json_extract(config, "eyed3_exec", eyed3_exec); json_extract(config, "metaflac_exec", metaflac_exec); ok = mcat.login(email, pass); if (!ok) { cout << "Could not login" << endl; return -1; } if (argc < 2) { usage(argv[0]); return -1; } for (string& id : catalog_ids) { // Gather data j = mcat.get_release_json(id); release = mcat.parse_release_json(j); j = mcat.get_browse_json(release.id); mcat.add_extended_mixes(release, j); // Calculate folders release_folder = mcat.calc_release_folder(release, main_path); mp3_folder = release_folder; flac_folder = release_folder; if (release.tracks.size() > 1) { mp3_folder = build_fname(release_folder, "MP3", ""); flac_folder = build_fname(release_folder, "FLAC", ""); } extended_folder = build_fname(release_folder, "Extended", ""); ok = ensure_folder(mp3_folder, ""); if (!ok) { cout << "Could not ensure MP3 folder - '" << mp3_folder << "'" << endl; continue; } ok = ensure_folder(flac_folder, ""); if (!ok) { cout << "Could not ensure FLAC folder - '" << mp3_folder << "'" << endl; continue; } // Download Cover ok = mcat.download_cover(release.catalog_id, release_folder); if (!ok) { cout << "Could not download cover for release " << release.catalog_id << endl; continue; } // Resize cover ok = exec_cmd(gen_resize_command(release_folder, convert_exec)); if (!ok) { cout << "Could not resize cover for release - " << release.catalog_id << endl; continue; } // Download tracks (1 -- N) for (Track& track : release.tracks) { filename = mcat.calc_track_filename(release, track.number); // Download MP3 filepath = build_fname(mp3_folder, "", filename); filepath += ".mp3"; ok = mcat.download_track(release.id, track.id, filepath, FORMAT_MP3); if (!ok) { cout << "Could not download MP3 track " << track.number << " from release " << release.catalog_id << endl; continue; } // Clear MP3 Images ok = exec_cmd(gen_mp3_clear(filepath, eyed3_exec)); if (!ok) { cout << "Could not clear images for MP3 track " << track.number << " from release " << release.catalog_id << endl; continue; } // Set MP3 Tags ok = exec_cmd( gen_mp3_set_tags(filepath, track.artist, track.title, release.title, track.number, build_fname(release_folder, "", "Cover_small.jpg"), eyed3_exec)); if (!ok) { cout << "Could not tag MP3 track " << track.number << " from release " << release.catalog_id << endl; continue; } // Download FLAC filepath = build_fname(flac_folder, "", filename); filepath += ".flac"; ok = mcat.download_track(release.id, track.id, filepath, FORMAT_FLAC); if (!ok) { cout << "Could not download MP3 track " << track.number << " from release " << release.catalog_id << endl; continue; } // Clear FLAC Images ok = exec_cmd(gen_flac_clear_images(filepath, metaflac_exec)); if (!ok) { cout << "Could not clear images for FLAC track " << track.number << " from release " << release.catalog_id << endl; continue; } // Clear FLAC Tags ok = exec_cmd(gen_flac_clear_tags(filepath, metaflac_exec)); if (!ok) { cout << "Could not clear tags for FLAC track " << track.number << " from release " << release.catalog_id << endl; continue; } // Set FLAC Tags ok = exec_cmd( gen_flac_set_tags(filepath, track.artist, track.title, release.title, track.number, build_fname(release_folder, "", "Cover_small.jpg"), metaflac_exec)); if (!ok) { cout << "Could not tag FLAC track " << track.number << " from release " << release.catalog_id << endl; continue; } // Download Extended Mix if (!track.extended_mix_file_id.empty()) { ok = ensure_folder(extended_folder, ""); if (!ok) { cout << "Could not ensure extended folder - '" << extended_folder << "'" << endl; continue; } filepath = build_fname(extended_folder, "", filename); filepath += track.extended_mix_extension; ok = mcat.download_file(track.extended_mix_file_id, filepath); if (!ok) { cout << "Could not download extended track " << track.number << " from release " << release.catalog_id << endl; continue; } } } } ok = mcat.logout(); if (!ok) { cout << "Could not log out" << endl; } return 0; }