From 3e25dd77b5f85f13cdc77cb81e2dfa328b755672 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 31 Dec 2021 22:15:17 -0500 Subject: [PATCH] Updates Updating required flags for uploading a song with metadata --- CMakeLists.txt | 1 + README.md | 2 +- include/Managers/ActionManager.h | 54 ++++++++++++++++++----- include/Managers/CommitManager.h | 11 ++++- include/Models/Song.h | 4 ++ include/Utilities/Checks.h | 30 +++++++++++++ include/Utilities/Conversions.h | 9 ++++ src/Managers/ActionManager.cpp | 43 +++++++----------- src/Managers/CommitManager.cpp | 75 +++++++++++++++++++++++++------- src/Models/Song.cpp | 16 +++++++ src/Syncers/Upload.cpp | 59 +++++++++++++++++++++---- 11 files changed, 240 insertions(+), 64 deletions(-) create mode 100644 include/Utilities/Checks.h create mode 100644 src/Models/Song.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b75850..784b90c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ set(SOURCES src/Managers/FileManager.cpp src/Managers/TokenManager.cpp src/Managers/UserManager.cpp + src/Models/Song.cpp src/Parsers/APIParser.cpp src/Syncers/Delete.cpp src/Syncers/Download.cpp diff --git a/README.md b/README.md index 4d2ecc5..8c42e1c 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ The program has been built and can be executed by the binary file *icd*. For inf ### Uploading Song with metadata ```BASH -icd upload-meta -u spacecadet -p stellar40 -h https://icarus.com -s /path/of/song.mp3 -m /path/to/metadata/config/collection.json -ca /path/to/cover/art/image.png +icd upload-meta -u spacecadet -p stellar40 -h https://icarus.com -s /path/of/song.mp3 -t 1 -m /path/to/metadata/config/collection.json -ca /path/to/cover/art/image.png ``` ### Uploading Song with metadata from directory diff --git a/include/Managers/ActionManager.h b/include/Managers/ActionManager.h index bab8575..51f638e 100644 --- a/include/Managers/ActionManager.h +++ b/include/Managers/ActionManager.h @@ -19,26 +19,58 @@ namespace Managers Models::IcarusAction retrieveIcarusAction() const; private: - constexpr std::array supportedFlags() noexcept + constexpr std::array supportedFlags() noexcept { - constexpr std::array allFlags{"-u", "-p", "-t", "-h", "-s", + constexpr std::array allFlags{"-u", "-p", "-t", "-h", "-s", "-sd", "-sr", "-d", "-D", "-b", "-rt", "-nc", - "-m", "-ca", "-smca"}; + "-m", "-ca", "-smca", "-t"}; return allFlags; } constexpr std::array supportedActions() noexcept; - bool isNumber(const std::string_view val) noexcept - { - return !val.empty() && std::find_if(val.begin(), - val.end(), [](char c) - { - return !std::isdigit(c); - }) == val.end(); - } void initialize(); void validateFlags(); + // Checks to see if the flag is valid + template + bool isValidFlag(const Str flag) + { + const auto flags = supportedFlags(); + const auto i = std::find_if(flags.begin(), flags.end(), [&](const Str &f) + { + return f.compare(flag) == 0 ? true : false; + }); + + auto result = i != flags.end() ? true : false; + + return result; + } + + template + bool doesFlagHaveValue(const Str flag) + { + const auto flags = parsedFlags(); + auto i = std::find_if(flags.begin(), flags.end(), [&](const Str &f) + { + return f.compare(flag) == 0 ? true : false; + }); + + if (i != flags.end()) + { + if (++i != flags.end() && !isValidFlag(*i)) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } std::vector parsedFlags(); diff --git a/include/Managers/CommitManager.h b/include/Managers/CommitManager.h index 04d77f0..fdc82d1 100644 --- a/include/Managers/CommitManager.h +++ b/include/Managers/CommitManager.h @@ -60,9 +60,18 @@ namespace Managers // // Expects // * Song - mp3 file path + // * TrackID - track number to chose from when retrieving metadata. "1" and "1:1" are similar // * Metadata - Source file containing metadata of the song // * Cover art - path to image cover art - void uploadSingleSong(); + // TODO: Change the name + void uploadSongWithMetadata(); + + // Expects the song path, trackID, metadata file path, and cover path + void singTargetUpload(const std::string &songPath, const std::string &trackID, + const std::string &metaPath, const std::string &coverPath); + // Expects the source directory that contains songs, a metadata file, and cover image + void multiTargetUpload(const std::string &sourcePath); + // Checks for the no confirm flag. Used when uploading songs from a directory bool checkForNoConfirm() diff --git a/include/Models/Song.h b/include/Models/Song.h index 3f9f76a..b2ea9d9 100644 --- a/include/Models/Song.h +++ b/include/Models/Song.h @@ -18,6 +18,10 @@ namespace Models std::cout<<"\n"; } + // TODO: Incomplete implementation + std::string toMetadataJson(); + + int id; std::string title; std::string artist; diff --git a/include/Utilities/Checks.h b/include/Utilities/Checks.h new file mode 100644 index 0000000..0760fb7 --- /dev/null +++ b/include/Utilities/Checks.h @@ -0,0 +1,30 @@ +#ifndef CHECKS_H_ +#define CHECKS_H_ + +#include +#include +#include + +namespace Utilities +{ + class Checks + { + public: + Checks() = delete; + + static bool isNumber(const std::string &val) + { + return !val.empty() && std::find_if(val.begin(), + val.end(), [](char c) + { + return !std::isdigit(c); + }) == val.end(); + } + private: + }; +} + +#endif + + + diff --git a/include/Utilities/Conversions.h b/include/Utilities/Conversions.h index d92d060..1e89994 100644 --- a/include/Utilities/Conversions.h +++ b/include/Utilities/Conversions.h @@ -11,6 +11,15 @@ namespace Utilities public: Conversions(); + + static void toLowerChar(char &c) + { + if (std::isalpha(c)) + { + c = std::tolower(c); + } + } + void initializeValues(); template diff --git a/src/Managers/ActionManager.cpp b/src/Managers/ActionManager.cpp index 7e13855..04e7bcf 100644 --- a/src/Managers/ActionManager.cpp +++ b/src/Managers/ActionManager.cpp @@ -52,40 +52,29 @@ namespace Managers const auto flagVals = parsedFlags(); - Flags flg; - - auto allSupportedFlags = supportedFlags(); - - for (auto flag : flagVals) + for (auto flag = flagVals.begin(); flag != flagVals.end(); ++flag) { - if (flag.compare("-nc") == 0) - { - flg.flag = flag; - flags.push_back(flg); - continue; - } - if (flag.size() > 3 || isNumber(flag)) - { - flg.value = flag; + Flags flg; + cout<<"Value: "<<*flag<<"\n"; - flags.push_back(flg); - flg = Flags{}; - continue; - } - - if (std::any_of(allSupportedFlags.begin(), allSupportedFlags.end(), - [&](const char *val) - { - return !flag.compare(val); - })) + if (isValidFlag(*flag) && doesFlagHaveValue(*flag)) { - flg.flag = flag; + cout<<"Flag has value\n"; + flg.flag = *flag; + flg.value = *(++flag); + } + else if (isValidFlag(*flag)) + { + cout<<"Flag does not have a value\n"; + flg.flag = *flag; } else { - cout<<"Flag is not valid"<icaAction.retrieveFlagValue("-s"); const auto metadataPath = this->icaAction.retrieveFlagValue("-m"); const auto coverPath = this->icaAction.retrieveFlagValue("-ca"); + const auto trackID = this->icaAction.retrieveFlagValue("-t"); const auto singleTarget = !songPath.empty() && !metadataPath.empty() && - !coverPath.empty() ? true : false; + !coverPath.empty() && !trackID.empty() ? true : false; const auto uni = this->icaAction.retrieveFlagValue("-smca"); const auto multiTarget = !uni.empty() ? true : false; @@ -260,20 +257,63 @@ namespace Managers return; } - cout<<"song path: "<title; + + return s.dump(); + } +} \ No newline at end of file diff --git a/src/Syncers/Upload.cpp b/src/Syncers/Upload.cpp index 3796e7b..98d3554 100644 --- a/src/Syncers/Upload.cpp +++ b/src/Syncers/Upload.cpp @@ -6,6 +6,7 @@ #include #include"Syncers/Upload.h" +#include"Utilities/Conversions.h" using std::cout; using std::cin; @@ -24,6 +25,7 @@ using namespace cpr; namespace Syncers { + #pragma region Functions Song Upload::uploadSong(Song& song) { try @@ -76,17 +78,13 @@ namespace Syncers auto answer = 'a'; cout << "are you sure you want to upload " << songs.size() << " songs? [y/n]"; cin >> answer; + Utilities::Conversions::toLowerChar(answer); if (answer == 'y' || answer == 'Y') { confirmUpload = true; break; } - else if (answer == 'n' || answer == 'N') - { - confirmUpload = false; - break; - } } if (!confirmUpload) @@ -110,12 +108,55 @@ namespace Syncers void Upload::uploadSongWithMetadata(Managers::CommitManager::Album &album, Models::Song& song, Models::CoverArt &cover) { - // TODO: Implement + this->api.endpoint.append("/upload/with/data"); + + try + { + auto url = retrieveUrl(); + + cout<<"url "<m_token.tokenType}; + auth.append(" " + this->m_token.accessToken); + + // const auto meta = song.toMetadataJson(); + nlohmann::json s; + s["title"] = song.title; + s["album"] = album.album; + s["album_artist"] = album.albumArtist; + s["artist"] = song.artist; + s["year"] = album.year; + s["genre"] = album.genre; + s["disc"] = song.disc; + s["track"] = song.track; + s["disc_count"] = album.discCount; + s["track_count"] = album.trackCount; + + const auto meta = s.dump(); + + // cout<<"\n\nMeta:\n"< Upload::retrieveAllSongsFromDirectory(const std::string& directory, bool recursive) { std::vector allSongs; + if (recursive) { for (auto p: fs::recursive_directory_iterator(directory)) @@ -166,7 +207,7 @@ namespace Syncers } - #pragma + #pragma region Testing void Upload::printSongDetails() { cout<<"Song details: "<