monstercat-downloader/main.cpp

348 lines
7.8 KiB
C++

#include <algorithm>
#include <iostream>
#include <vector>
#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<string> 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);
// Disable LOGIN
#if 0
ok = mcat.login(email, pass);
if (!ok)
{
cout << "Could not login" << endl;
return -1;
}
#endif
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;
}
}
}
}
// Disable LOGOUT
#if 0
ok = mcat.logout();
if (!ok)
{
cout << "Could not log out" << endl;
}
#endif
return 0;
}