diff --git a/include/Managers/ActionManager.h b/include/Managers/ActionManager.h index 19f5f81..dff29fc 100644 --- a/include/Managers/ActionManager.h +++ b/include/Managers/ActionManager.h @@ -31,9 +31,9 @@ namespace Managers std::array supportedActions{ "download", "upload", "retrieve", "delete" }; - std::array supportedFlags{ - "-u", "-p", "-t", "-h", "-s", - "-d", "-D", "-b", "-rt" + std::array supportedFlags{ + "-u", "-p", "-t", "-h", "-s", "-sd", + "-sr", "-d", "-D", "-b", "-rt" }; std::vector flags; char **params; diff --git a/include/Managers/CommitManager.h b/include/Managers/CommitManager.h index d5913af..4e511fc 100644 --- a/include/Managers/CommitManager.h +++ b/include/Managers/CommitManager.h @@ -38,8 +38,7 @@ namespace Managers uploadAct }; - std::map mapActions = - std::map{ + std::map mapActions{ {"delete", deleteAct}, {"download", downloadAct}, {"retrieve", retrieveAct}, {"upload", uploadAct} diff --git a/include/Managers/TokenManager.h b/include/Managers/TokenManager.h index 217874c..9f07556 100644 --- a/include/Managers/TokenManager.h +++ b/include/Managers/TokenManager.h @@ -10,8 +10,8 @@ namespace Managers class TokenManager { public: - TokenManager(const Models::User); - TokenManager(const Models::User, Models::API); + TokenManager(const Models::User&); + TokenManager(const Models::User&, Models::API&); Models::Token requestToken(); private: diff --git a/include/Models/Song.h b/include/Models/Song.h index 1d1e013..4ed0017 100644 --- a/include/Models/Song.h +++ b/include/Models/Song.h @@ -15,7 +15,8 @@ namespace Models std::string genre; int year; int duration; - std::string data; + int track; + std::string data; std::string songPath; }; } diff --git a/include/Syncers/Download.h b/include/Syncers/Download.h index 7930a85..c5685fd 100644 --- a/include/Syncers/Download.h +++ b/include/Syncers/Download.h @@ -24,7 +24,7 @@ namespace Syncers std::string retrieveUrl(Models::Song); std::string downloadFilePath; - void saveSong(Models::Song*); + void saveSong(Models::Song&); }; } diff --git a/include/Syncers/Upload.h b/include/Syncers/Upload.h index c407bb3..b9c2543 100644 --- a/include/Syncers/Upload.h +++ b/include/Syncers/Upload.h @@ -1,7 +1,9 @@ #ifndef UPLOAD_H_ #define UPLOAD_H_ +#include #include +#include #include @@ -11,6 +13,8 @@ #include"Models/Token.h" #include"Models/UploadForm.h" +namespace fs = std::filesystem; + namespace Syncers { @@ -20,15 +24,22 @@ namespace Syncers Upload(); Upload(Models::API); - void uploadSong(const Models::Token, Models::Song); + Models::Song uploadSong(const Models::Token&, Models::Song&); + void uploadSongsFromDirectory(const Models::Token&, const std::string&, bool); private: Managers::FileManager fMgr; Models::API api; Models::Song song; + std::vector retrieveAllSongsFromDirectory(const std::string&, + bool); + std::string retrieveUrl(); + Models::Song retrieveSongPath(fs::directory_entry&); + void printSongDetails(); + void printSongDetails(std::vector&); void printJsonData(nlohmann::json); }; } diff --git a/src/Managers/ActionManager.cpp b/src/Managers/ActionManager.cpp index d56ac30..b3d9ade 100644 --- a/src/Managers/ActionManager.cpp +++ b/src/Managers/ActionManager.cpp @@ -71,7 +71,7 @@ namespace Managers } if (std::any_of(supportedFlags.begin(), supportedFlags.end(), - [&](string val) + [&](string& val) { return !val.compare(flag); })) diff --git a/src/Managers/CommitManager.cpp b/src/Managers/CommitManager.cpp index 3c8c5d5..6652f8e 100644 --- a/src/Managers/CommitManager.cpp +++ b/src/Managers/CommitManager.cpp @@ -157,14 +157,17 @@ namespace Managers } void CommitManager::uploadSong() { + bool uploadSingleSong = true; + bool recursiveDirectory = false; + string songDirectory; APIParser apiPrs{icaAction}; auto api = apiPrs.retrieveAPI(); auto token = parseToken(api); - Song song{}; + Song song; - for (auto arg : icaAction.flags) + for (auto& arg : icaAction.flags) { auto flag = arg.flag; auto value = arg.value; @@ -173,11 +176,30 @@ namespace Managers { song.songPath.assign(arg.value); } + else if (flag.compare("-sd") == 0) + { + songDirectory = value; + uploadSingleSong = false; + } + else if (flag.compare("-sr") == 0) + { + songDirectory = value; + uploadSingleSong = false; + recursiveDirectory = true; + } } Upload upld{api}; - cout<<"Uploading song..."<user = user; } - TokenManager::TokenManager(const User user, API api) + TokenManager::TokenManager(const User& user, API& api) { this->user = user; this->api = api; diff --git a/src/Syncers/Download.cpp b/src/Syncers/Download.cpp index 58133f0..1049b13 100644 --- a/src/Syncers/Download.cpp +++ b/src/Syncers/Download.cpp @@ -42,15 +42,19 @@ namespace Syncers cout<<"song path "<songPath<data.length(); - const char *data = song->data.c_str(); + cout<<"\nSaving song to: "<songPath, std::ios::binary}; + ofstream saveSong{song.songPath, std::ios::binary}; saveSong.write(data, bufferLength); saveSong.close(); } diff --git a/src/Syncers/Upload.cpp b/src/Syncers/Upload.cpp index 6233cdf..0f5923d 100644 --- a/src/Syncers/Upload.cpp +++ b/src/Syncers/Upload.cpp @@ -1,6 +1,6 @@ #include +#include #include -#include #include #include @@ -30,7 +30,7 @@ namespace Syncers } - void Upload::uploadSong(const Models::Token token, Song song) + Song Upload::uploadSong(const Models::Token& token, Song& song) { try { @@ -45,16 +45,77 @@ namespace Syncers cpr::Header{{"authorization", auth}} ); - cout << r.status_code<< std::endl; + cout << "status code: " << r.status_code<< std::endl; + auto result = nlohmann::json::parse(r.text); + cout<<"Finished"<(); + song.title = result["title"].get(); + song.artist = result["artist"].get(); + song.album = result["album"].get(); + song.genre = result["genre"].get(); + song.year = result["year"].get(); + song.duration = result["duration"].get(); + song.track = result["track"].get(); + + return song; } catch (exception e) { auto msg = e.what(); cout< Upload::retrieveAllSongsFromDirectory(const std::string& directory, + bool recursive) + { + std::vector allSongs; + if (recursive) + { + for (auto p: fs::recursive_directory_iterator(directory)) + { + auto song = retrieveSongPath(p); + if (!song.songPath.empty()) + allSongs.push_back(song); + } + } + else + { + for (auto p: fs::directory_iterator(directory)) + { + auto song = retrieveSongPath(p); + if (!song.songPath.empty()) + allSongs.push_back(song); + } + } + + return allSongs; + } + + string Upload::retrieveUrl() { const string url{api.url + "api/" + api.version + "/" + @@ -62,6 +123,26 @@ namespace Syncers return url; } + + + Song Upload::retrieveSongPath(fs::directory_entry& dirEntry) + { + constexpr auto mp3Ext = ".mp3"; + Song song; + if (fs::is_regular_file(dirEntry.path())) + { + const auto ext = dirEntry.path().extension().string(); + if (ext.compare(mp3Ext) == 0) + { + cout << "found mp3 file" << endl; + song.songPath = dirEntry.path().string(); + } + } + + return song; + } + + #pragma void Upload::printSongDetails() { @@ -74,6 +155,21 @@ namespace Syncers cout<<"Year: "<& songs) + { + for (auto& song: songs) + { + cout<<"Song details: "<