From a55a86d00eca0f68d8f5b2c487d861de026bcf7c Mon Sep 17 00:00:00 2001 From: speedie Date: Sat, 13 Jul 2024 05:25:47 +0200 Subject: [PATCH] Some more cleanup. --- src/mcopy.cpp | 65 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/src/mcopy.cpp b/src/mcopy.cpp index e2f8c0b..7de8a73 100644 --- a/src/mcopy.cpp +++ b/src/mcopy.cpp @@ -47,7 +47,9 @@ void help() { "@A Artist\n" << "@a Album name\n" << "@t Title\n" << - "@n Track number\n"; + "@n Track number\n" << + "@y Year\n" << + "@g Genre\n"; std::exit(EXIT_SUCCESS); } @@ -57,11 +59,24 @@ TagLib::FileRef get_file(const std::string& str) { } void get_metadata_from_file(const Settings& settings, const std::string& format, const std::string& file) { + if (!std::filesystem::is_regular_file(file)) { + std::cerr << "mcopy: invalid file '" << file << "' is skipped.\n"; + if (settings.strict) { + std::exit(EXIT_FAILURE); + } + + return; + } + TagLib::FileRef _file = get_file(file); TagLib::Tag* tag = _file.tag(); if (_file.isNull() || !_file.audioProperties()) { - std::cerr << "mcopy: invalid file: '" << file << "' is skipped.\n"; + std::cerr << "mcopy: invalid file '" << file << "' is skipped.\n"; + if (settings.strict) { + std::exit(EXIT_FAILURE); + } + return; } @@ -70,46 +85,62 @@ void get_metadata_from_file(const Settings& settings, const std::string& format, std::string album{}; std::string artist{}; std::string track{}; + std::string year{}; + std::string genre{}; }; const auto get_title = [&tag]() -> std::string { return tag->title().to8Bit(true); }; const auto get_album = [&tag]() -> std::string { return tag->album().to8Bit(true); }; const auto get_artist = [&tag]() -> std::string { return tag->artist().to8Bit(true); }; const auto get_track = [&tag]() -> std::string { return std::to_string(tag->track()); }; + const auto get_year = [&tag]() -> std::string { return std::to_string(tag->year()); }; + const auto get_genre = [&tag]() -> std::string { return tag->genre().to8Bit(true); }; - FileData data{get_title(), get_album(), get_artist(), get_track()}; + FileData data{ + get_title(), + get_album(), + get_artist(), + get_track(), + get_year(), + get_genre(), + }; #ifdef _WIN32 std::vector the_forbidden_characters{'<', '>', ':', '"', '/', '\\', '|', '?', '*'}; #else std::vector the_forbidden_characters{'/'}; #endif - - for (auto& it : std::vector{&data.title, &data.album, &data.artist, &data.track}) { + for (const auto& it : {&data.title, &data.album, &data.artist, &data.track, &data.year, &data.genre}) { for (const auto& c : the_forbidden_characters) static_cast(std::remove_if(it->begin(), it->end(), [&c](char _c) { return c == _c; })); } - for (const auto& it : std::unordered_map{{"title", data.title}, {"album", data.album}, {"artist", data.artist}, {"track", data.track}}) { - if (it.second.empty()) { - it.second = "Unknown"; - - if (settings.ask) { - std::cerr << "mcopy: failed to retrieve " << it.first << ", enter an appropriate replacement: "; - std::getline(std::cin, it.second); - } - } - } + std::unordered_map delim_map{ + {"@t", data.title}, + {"@a", data.album}, + {"@A", data.artist}, + {"@n", data.track}, + {"@y", data.year}, + {"@g", data.genre}, + }; std::string output_filename = format; - for (const auto& it : std::unordered_map{{"@t", data.title}, {"@a", data.album}, {"@A", data.artist}, {"@n", data.track}}) { + for (auto& it : delim_map) { while (output_filename.find(it.first) != std::string::npos) { + if (it.second.empty()) { + it.second = "Unknown"; + + if (settings.ask) { + std::cerr << "mcopy: failed to retrieve data for " << it.first << ", enter an appropriate replacement: "; + std::getline(std::cin, it.second); + } + } + output_filename.replace(output_filename.find(it.first), it.first.length(), it.second); } } std::ifstream ef(output_filename); - if (ef.good() && settings.skip_existing) { std::cerr << "mcopy: file << '" << file << "' already exists, skipping\n"; return;