Added common funcs. Added config example
This commit is contained in:
parent
0b61461039
commit
b499c65ac8
157
common.cpp
Normal file
157
common.cpp
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
using std::endl;
|
||||||
|
using std::ifstream;
|
||||||
|
using std::istream;
|
||||||
|
using std::ostream;
|
||||||
|
using std::set;
|
||||||
|
using std::string;
|
||||||
|
using std::to_string;
|
||||||
|
using nlohmann::json;
|
||||||
|
|
||||||
|
bool read_config(json& cfg, ostream* log)
|
||||||
|
{
|
||||||
|
ifstream cfg_file("config.json");
|
||||||
|
|
||||||
|
if (!cfg_file.is_open())
|
||||||
|
{
|
||||||
|
if (nullptr != log)
|
||||||
|
{
|
||||||
|
*log << "Could not open config.json" << endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse with comments
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cfg = json::parse(cfg_file, nullptr, true, true);
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
if (nullptr != log)
|
||||||
|
{
|
||||||
|
*log << e.what() << endl;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool path_exists(const string& path)
|
||||||
|
{
|
||||||
|
struct stat info;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
error = stat(path.c_str(), &info);
|
||||||
|
if (0 != error)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (S_ISDIR(info.st_mode))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
string build_fname(const string& main_path, const string& folder, const string& fname)
|
||||||
|
{
|
||||||
|
string path_to_file;
|
||||||
|
|
||||||
|
path_to_file = main_path;
|
||||||
|
if (!path_to_file.empty() && path_to_file[path_to_file.size() - 1] != '/')
|
||||||
|
{
|
||||||
|
path_to_file += '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
path_to_file += folder;
|
||||||
|
if (!path_to_file.empty() && path_to_file[path_to_file.size() - 1] != '/')
|
||||||
|
{
|
||||||
|
path_to_file += '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
path_to_file += fname;
|
||||||
|
|
||||||
|
return path_to_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
string i_to_str(int i, int size, char fill)
|
||||||
|
{
|
||||||
|
string str;
|
||||||
|
|
||||||
|
str = to_string(i);
|
||||||
|
str.insert(str.begin(), size - str.size(), fill);
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
void json_extract(const json& j, const string& key, string& out)
|
||||||
|
{
|
||||||
|
if (j.contains(key) && j[key].is_string())
|
||||||
|
{
|
||||||
|
out = j[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void json_extract(const json& j, const string& key, uint16_t& out)
|
||||||
|
{
|
||||||
|
if (j.contains(key) && j[key].is_number_unsigned())
|
||||||
|
{
|
||||||
|
out = j[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void json_extract(const json& j, const string& key, bool& out)
|
||||||
|
{
|
||||||
|
if (j.contains(key) && j[key].is_boolean())
|
||||||
|
{
|
||||||
|
out = j[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ensure_folder(const string& main_path, const string& folder)
|
||||||
|
{
|
||||||
|
string full_path;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if (!path_exists(main_path))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
full_path = build_fname(main_path, folder, "");
|
||||||
|
if (path_exists(full_path))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
error = mkdir(full_path.c_str(), 0775);
|
||||||
|
if (0 != error)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
string trim_whitespace(const string& s)
|
||||||
|
{
|
||||||
|
const string whitespace = " \t\r\n\f\v";
|
||||||
|
string result(s);
|
||||||
|
size_t pos;
|
||||||
|
|
||||||
|
pos = result.find_first_not_of(whitespace);
|
||||||
|
result.erase(0, pos);
|
||||||
|
pos = result.find_last_not_of(whitespace);
|
||||||
|
result.erase(pos + 1);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
22
common.h
Normal file
22
common.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef COMMON_H_
|
||||||
|
#define COMMON_H_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
#include "json.hpp"
|
||||||
|
|
||||||
|
bool read_config(nlohmann::json& cfg, std::ostream* log = &std::cout);
|
||||||
|
bool path_exists(const std::string& path);
|
||||||
|
std::string build_fname(const std::string& main_path, const std::string& folder,
|
||||||
|
const std::string& fname);
|
||||||
|
std::string i_to_str(int i, int size, char fill = '0');
|
||||||
|
void json_extract(const nlohmann::json& j, const std::string& key,
|
||||||
|
std::string& out);
|
||||||
|
void json_extract(const nlohmann::json& j, const std::string& key,
|
||||||
|
uint16_t& out);
|
||||||
|
void json_extract(const nlohmann::json& j, const std::string& key, bool& out);
|
||||||
|
bool ensure_folder(const std::string& main_path, const std::string& folder);
|
||||||
|
std::string trim_whitespace(const std::string& s);
|
||||||
|
|
||||||
|
#endif // COMMON_H_
|
||||||
8
config_example.json
Normal file
8
config_example.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Email": "user@example.ccom",
|
||||||
|
"Pass": "password",
|
||||||
|
"download_path": "/path/to/monstercat",
|
||||||
|
"convert_exec": "convert",
|
||||||
|
"eyed3_exec": "eyeD3",
|
||||||
|
"metaflac_exec": "metaflac"
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
#include "monstercat_dl.h"
|
#include "monstercat_dl.h"
|
||||||
|
#include "common.h"
|
||||||
#include "curl_dl.h"
|
#include "curl_dl.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
@ -15,33 +16,6 @@ using std::to_string;
|
|||||||
|
|
||||||
using nlohmann::json;
|
using nlohmann::json;
|
||||||
|
|
||||||
static bool json_extract(const json& j, const string& key, string& value)
|
|
||||||
{
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
if (j.contains(key) && j[key].is_string())
|
|
||||||
{
|
|
||||||
value = j[key];
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static string trim_whitespace(const string& s)
|
|
||||||
{
|
|
||||||
const string whitespace = " \t\r\n\f\v";
|
|
||||||
string result(s);
|
|
||||||
size_t pos;
|
|
||||||
|
|
||||||
pos = result.find_first_not_of(whitespace);
|
|
||||||
result.erase(0, pos);
|
|
||||||
pos = result.find_last_not_of(whitespace);
|
|
||||||
result.erase(pos + 1);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
string Monstercat_DL::calc_proper_artist(const string& artist_raw)
|
string Monstercat_DL::calc_proper_artist(const string& artist_raw)
|
||||||
{
|
{
|
||||||
size_t pos;
|
size_t pos;
|
||||||
@ -369,28 +343,21 @@ void Monstercat_DL::add_extended_mixes(Release& release, const json& browse_json
|
|||||||
string Monstercat_DL::calc_release_folder(const Release& release, const string& main_folder)
|
string Monstercat_DL::calc_release_folder(const Release& release, const string& main_folder)
|
||||||
{
|
{
|
||||||
string result;
|
string result;
|
||||||
|
string folder_name;
|
||||||
|
string temp;
|
||||||
|
|
||||||
// Ensure main path ends with /
|
ensure_folder(main_folder, release.type);
|
||||||
result = main_folder;
|
|
||||||
if (result.empty())
|
|
||||||
{
|
|
||||||
result = "./";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*(result.rbegin()) != '/')
|
folder_name = release.release_date;
|
||||||
{
|
folder_name += " - ";
|
||||||
result += '/';
|
folder_name += release.catalog_id;
|
||||||
}
|
folder_name += " - ";
|
||||||
|
folder_name += release.artist;
|
||||||
|
folder_name += " - ";
|
||||||
|
folder_name += release.title;
|
||||||
|
|
||||||
result += release.type;
|
result = build_fname(main_folder, release.type, folder_name);
|
||||||
result += '/';
|
ensure_folder(result, "");
|
||||||
result += release.release_date;
|
|
||||||
result += " - ";
|
|
||||||
result += release.catalog_id;
|
|
||||||
result += " - ";
|
|
||||||
result += release.artist;
|
|
||||||
result += " - ";
|
|
||||||
result += release.title;
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -446,13 +413,8 @@ string Monstercat_DL::calc_track_filename(const Release& release, int track_num)
|
|||||||
result = "";
|
result = "";
|
||||||
if (use_number)
|
if (use_number)
|
||||||
{
|
{
|
||||||
result += to_string(track->number);
|
// Always use 2 digits
|
||||||
// 2 digits always
|
result += i_to_str(track->number, 2, '0');
|
||||||
if (result.size() < 2)
|
|
||||||
{
|
|
||||||
result.insert(result.begin(), '0');
|
|
||||||
}
|
|
||||||
|
|
||||||
result += " - ";
|
result += " - ";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -494,6 +456,7 @@ bool Monstercat_DL::download_cover(const string& catalog_id, const string& path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
filepath = path;
|
filepath = path;
|
||||||
|
filepath += "Cover";
|
||||||
if (0 == out_headers.count("content-type"))
|
if (0 == out_headers.count("content-type"))
|
||||||
{
|
{
|
||||||
if (nullptr != m_log)
|
if (nullptr != m_log)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user