#include #include #include #include #include #include"Syncers/Upload.h" #include"Utilities/Conversions.h" using std::cout; using std::cin; using std::endl; using std::exception; using std::string; using json = nlohmann::json; using Managers::FileManager; using Models::API; using Models::Song; using Models::UploadForm; using namespace cpr; namespace Syncers { #pragma region Functions Song Upload::uploadSong(Song& song) { try { auto url = retrieveUrl(); cout<<"url "<m_token.tokenType}; auth.append(" " + this->m_token.accessToken); auto r = cpr::Post(cpr::Url{url}, cpr::Multipart{{"key", "small value"}, {"file", cpr::File{song.songPath}}}, cpr::Header{{"authorization", auth}} ); cout << "status code: " << r.status_code<< std::endl; cout << r.text << 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<> answer; Utilities::Conversions::toLowerChar(answer); if (answer == 'y' || answer == 'Y') { confirmUpload = true; break; } } if (!confirmUpload) { cout << "exiting...\n"; std::exit(-1); } cout << "uploading songs\n"; for (auto& song: songs) { song = uploadSong(song); } } catch (exception& e) { cout<api.endpoint.assign("song/data/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)) { 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 + "/" + api.endpoint}; 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 region Testing void Upload::printSongDetails() { cout<<"Song details: "<& songs) { for (auto& song: songs) { cout<<"Song details: "<