diff --git a/CMakeLists.txt b/CMakeLists.txt index f0d3fe7..3176c6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,11 @@ set(SOURCES src/controller/loginController.hpp src/controller/songController.hpp src/database/base_repository.cpp + #src/database/coverArtRepository.cpp + #src/database/songRepository.cpp src/dto/loginResultDto.hpp src/main.cpp + src/managers/coverArtManager.cpp src/managers/directory_manager.cpp src/managers/song_manager.cpp src/managers/token_manager.cpp @@ -20,6 +23,9 @@ set(SOURCES ) set(HEADERS include/database/base_repository.h + #include/database/coverArtRepository.h + #include/database/songRepository.h + include/managers/coverArtManager.h include/managers/directory_manager.h include/managers/song_manager.h include/managers/token_manager.h @@ -79,6 +85,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/appsettings.json ${CMAKE_BINARY_DIR}/ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/authcredentials.json ${CMAKE_BINARY_DIR}/bin/authcredentials.json COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/database.json ${CMAKE_BINARY_DIR}/bin/database.json COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/paths.json ${CMAKE_BINARY_DIR}/bin/paths.json COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Images/Stock/CoverArt.png ${CMAKE_BINARY_DIR}/bin/CoverArt.png COPYONLY) add_executable(icarus ${SOURCES} ${HEADERS}) target_include_directories(icarus PUBLIC ${JWT_CPP_INCLUDE}) diff --git a/include/database/base_repository.h b/include/database/base_repository.h index ea90788..bc9d74e 100644 --- a/include/database/base_repository.h +++ b/include/database/base_repository.h @@ -10,6 +10,7 @@ class base_repository { public: +protected: MYSQL* setup_mysql_connection(database_connection); MYSQL_RES* perform_mysql_query(MYSQL*, const std::string&); diff --git a/include/database/coverArtRepository.h b/include/database/coverArtRepository.h new file mode 100644 index 0000000..0678e2c --- /dev/null +++ b/include/database/coverArtRepository.h @@ -0,0 +1,14 @@ +#ifndef COVERARTREPOSITORY_H_ +#define COVERARTREPOSITORY_H_ + +#include + +#include "models/models.h" + +class coverArtRepository +{ +public: +private: +}; + +#endif diff --git a/include/database/songRepository.h b/include/database/songRepository.h new file mode 100644 index 0000000..f52535d --- /dev/null +++ b/include/database/songRepository.h @@ -0,0 +1,14 @@ +#ifndef SONGREPOSITORY_H_ +#define SONGREPOSITORY_H_ + +#include + +#include "models/models.h" + +class songRespository +{ +public: +private: +}; + +#endif diff --git a/include/managers/coverArtManager.h b/include/managers/coverArtManager.h new file mode 100644 index 0000000..387f059 --- /dev/null +++ b/include/managers/coverArtManager.h @@ -0,0 +1,13 @@ +#ifndef COVERARTMANAGER_H_ +#define COVERARTMANAGER_H_ + +#include "models/models.h" + +class coverArtManager +{ +public: + Cover saveCover(const Song&, std::string&, const std::string&); +private: +}; + +#endif diff --git a/include/managers/directory_manager.h b/include/managers/directory_manager.h index ca44afc..4537c53 100644 --- a/include/managers/directory_manager.h +++ b/include/managers/directory_manager.h @@ -2,6 +2,9 @@ #define DIRECTORY_MANAGER_H_ #include +#include + +#include #include "models/models.h" @@ -10,12 +13,18 @@ class directory_manager public: std::string create_directory_process(Song, const std::string&); + static std::string configPath(std::string_view); + static std::string contentOfPath(std::string_view); + + static nlohmann::json credentialConfigContent(const std::string&); + static nlohmann::json databaseConfigContent(const std::string&); + static nlohmann::json pathConfigContent(const std::string&); // Return Cover instead - std::string read_cover_art(const std::string&); + //std::string read_cover_art(const std::string&); - void copy_stock_to_root(const std::string&, const std::string&); - void copy_song_to_path(const std::string&, const std::string&); + //void copy_stock_to_root(const std::string&, const std::string&); + //void copy_song_to_path(const std::string&, const std::string&); void delete_cover_art_file(const std::string&, const std::string&); void delete_directories(Song, const std::string&); diff --git a/include/managers/song_manager.h b/include/managers/song_manager.h index 18cc8a8..66983a7 100644 --- a/include/managers/song_manager.h +++ b/include/managers/song_manager.h @@ -4,6 +4,8 @@ #include #include +#include + #include "models/models.h" class song_manager @@ -11,8 +13,19 @@ class song_manager public: song_manager(std::string&); + /** + std::string retrieveMusicPath(); + std::string retrieveTempPath(); + */ + + //nlohmann::json pathConfigContent(); + void saveSong(Song&); + + static void printSong(const Song&); private: + void saveSongTemp(Song&); + std::string exe_path; }; diff --git a/include/utilities/metadata_retriever.h b/include/utilities/metadata_retriever.h index 4d14a8c..3a3760b 100644 --- a/include/utilities/metadata_retriever.h +++ b/include/utilities/metadata_retriever.h @@ -10,7 +10,7 @@ class metadata_retriever { public: Song retrieve_metadata(std::string&); - Cover update_cover_art(Cover, const Song, const std::string&); + Cover update_cover_art(const Song&, Cover& cov, const std::string&); void update_metadata(Song updated_song, const Song old_song); private: diff --git a/src/controller/songController.hpp b/src/controller/songController.hpp index ffc7ef0..f35e9be 100644 --- a/src/controller/songController.hpp +++ b/src/controller/songController.hpp @@ -14,8 +14,8 @@ #include "oatpp/web/server/api/ApiController.hpp" #include "managers/song_manager.h" -#include "models/models.h" #include "managers/token_manager.h" +#include "models/models.h" #include "types/scopes.h" class songController : public oatpp::web::server::api::ApiController diff --git a/src/database/coverArtRepository.cpp b/src/database/coverArtRepository.cpp new file mode 100644 index 0000000..43b6363 --- /dev/null +++ b/src/database/coverArtRepository.cpp @@ -0,0 +1 @@ +#include "database/coverArtRepository.h" diff --git a/src/database/songRepository.cpp b/src/database/songRepository.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/main.cpp b/src/main.cpp index b999ed0..0551452 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,6 +48,7 @@ void test_database() mysqlD.database = ""; // the databse to pick base_repository base; + /** auto conn = base.setup_mysql_connection(mysqlD); // assign the results return to the MYSQL_RES pointer @@ -72,10 +73,11 @@ void test_database() std::cout << std::endl; } - /* clean up the database result set */ + // clean up the database result set // mysql_free_result(res); - /* clean up the database link */ + // clean up the database link // mysql_close(conn); + */ } @@ -84,7 +86,6 @@ int main(int argc, char **argv) oatpp::base::Environment::init(); std::string working_path = argv[0]; - //test_database(); run(working_path); oatpp::base::Environment::destroy(); diff --git a/src/managers/coverArtManager.cpp b/src/managers/coverArtManager.cpp new file mode 100644 index 0000000..b5a0fc9 --- /dev/null +++ b/src/managers/coverArtManager.cpp @@ -0,0 +1,14 @@ +#include "managers/coverArtManager.h" + +#include "utilities/metadata_retriever.h" + +Cover coverArtManager::saveCover(const Song& song, std::string& rootPath, const std::string& stockCoverPath) +{ + metadata_retriever meta; + Cover cov; + cov.imagePath = rootPath; + cov = meta.update_cover_art(song, cov, stockCoverPath); + cov.songTitle = song.title; + + return cov; +} diff --git a/src/managers/directory_manager.cpp b/src/managers/directory_manager.cpp index e99904a..0c5f97c 100644 --- a/src/managers/directory_manager.cpp +++ b/src/managers/directory_manager.cpp @@ -36,6 +36,45 @@ std::string directory_manager::create_directory_process(Song song, const std::st return alb_path.string() + "/"; } + +std::string directory_manager::configPath(std::string_view path) +{ + return fs::canonical(path).parent_path().string(); +} +std::string directory_manager::contentOfPath(std::string_view path) +{ + std::string configPath(path); + std::fstream a(configPath, std::ios::in); + std::stringstream s; + s << a.rdbuf(); + a.close(); + + return s.str(); +} + +nlohmann::json directory_manager::credentialConfigContent(const std::string& exe_path) +{ + auto path = configPath(exe_path); + path.append("/authcredentials.json"); + + return nlohmann::json::parse(contentOfPath(path)); +} +nlohmann::json directory_manager::databaseConfigContent(const std::string& exe_path) +{ + auto path = configPath(exe_path); + path.append("/database.json"); + + return nlohmann::json::parse(contentOfPath(path)); +} +nlohmann::json directory_manager::pathConfigContent(const std::string& exe_path) +{ + auto path = configPath(exe_path); + path.append("/paths.json"); + + return nlohmann::json::parse(contentOfPath(path)); +} + +/** std::string directory_manager::read_cover_art(const std::string& source) { auto source_path = fs::path(source); @@ -80,6 +119,7 @@ void directory_manager::copy_song_to_path(const std::string& target, const std:: fs::remove(source); std::cout<<"copy finished"< #include +#include + +#include + +#include "managers/coverArtManager.h" +#include "managers/directory_manager.h" +#include "utilities/metadata_retriever.h" namespace fs = std::filesystem; @@ -9,14 +16,74 @@ song_manager::song_manager(std::string& x_path) : exe_path(x_path) { } +/** +std::string song_manager::retrieveMusicPath() +{ + std::string pathConfig = directory_manager::configPath(exe_path); + pathConfig.append("/paths.json"); + nlohmann::json config = nlohmann::json::parse(directory_manager::contentOfPath(pathConfig)); + + return config["root_music_path"].get(); +} +std::string song_manager::retrieveTempPath() +{ + auto pathConfig = directory_manager::configPath(exe_path); + pathConfig.append("/paths"); + + return std::string(); +} + +nlohmann::json song_manager::pathConfigContent() +{ + auto path = directory_manager::configPath(exe_path); + path.append("/paths.json"); + + return nlohmann::json::parse(directory_manager::contentOfPath(path)); +} +*/ + void song_manager::saveSong(Song& song) { - constexpr auto tmp_song = "/tmp/song.mp3"; - if (fs::exists(fs::path(tmp_song))) { - std::cout << "deleting old song " << std::endl; - fs::remove(fs::path(tmp_song)); - } + saveSongTemp(song); + metadata_retriever meta; + auto data = std::move(song.data); + song = meta.retrieve_metadata(song.songPath); + song.data = std::move(data); + printSong(song); + + coverArtManager covMgr; + auto coverRootPath = directory_manager::pathConfigContent(exe_path)["cover_root_path"].get(); + auto stockCoverPath = directory_manager::configPath(exe_path); + stockCoverPath.append("/CoverArt.png"); + auto cov = covMgr.saveCover(song, coverRootPath, stockCoverPath); +} + +void song_manager::printSong(const Song& song) +{ + std::cout << "song" << std::endl; + std::cout << "title: " << song.title << std::endl; + std::cout << "artist: " << song.artist << std::endl; + std::cout << "album: " << song.album << std::endl; + std::cout << "genre: " << song.genre << std::endl; + std::cout << "duration: " << song.duration << std::endl; + std::cout << "year: " << song.year << std::endl; + std::cout << "song path: " << song.songPath << std::endl; +} + +void song_manager::saveSongTemp(Song& song) +{ + auto config = directory_manager::pathConfigContent(exe_path); + + auto tmp_song = config["temp_root_path"].get(); + std::random_device dev; + std::mt19937 rng(dev()); + std::uniform_int_distribution dist(1,1000); + tmp_song.append(std::to_string(dist(rng))); + tmp_song.append(".mp3"); + std::fstream s(tmp_song, std::fstream::binary | std::fstream::out); s.write((char*)&song.data[0], song.data.size()); s.close(); + + song.songPath = tmp_song; } diff --git a/src/managers/token_manager.cpp b/src/managers/token_manager.cpp index 058a75a..24ef2ef 100644 --- a/src/managers/token_manager.cpp +++ b/src/managers/token_manager.cpp @@ -1,3 +1,5 @@ +#include "managers/token_manager.h" + #include #include #include @@ -10,7 +12,7 @@ #include #include -#include "managers/token_manager.h" +#include "managers/directory_manager.h" namespace fs = std::filesystem; @@ -87,22 +89,26 @@ bool token_manager::is_token_valid(std::string& auth, Scope scope) auth_credentials token_manager::parse_auth_credentials(std::string_view path) { - auto exe_path = fs::canonical(path).parent_path().string(); + auto exe_path = directory_manager::configPath(path); exe_path.append("/authcredentials.json"); + //auto content = directory_manager::contentOfPath(exe_path); + /** std::fstream a(exe_path, std::ios::in); std::stringstream s; s << a.rdbuf(); a.close(); + */ - auto con = nlohmann::json::parse(s.str()); + //auto con = nlohmann::json::parse(directory_manager::contentOfPath(exe_path)); + auto con = directory_manager::credentialConfigContent(exe_path); auth_credentials auth; auth.uri = "https://"; - auth.uri.append(con["Domain"]); - auth.api_identifier = con["ApiIdentifier"]; - auth.client_id = con["ClientId"]; - auth.client_secret = con["ClientSecret"]; + auth.uri.append(con["domain"]); + auth.api_identifier = con["api_identifier"]; + auth.client_id = con["client_id"]; + auth.client_secret = con["client_secret"]; auth.endpoint = "oauth/token"; return auth; diff --git a/src/utilities/metadata_retriever.cpp b/src/utilities/metadata_retriever.cpp index e6fc00b..2b51e01 100644 --- a/src/utilities/metadata_retriever.cpp +++ b/src/utilities/metadata_retriever.cpp @@ -14,6 +14,8 @@ #include "utilities/imageFile.h" #include "utilities/metadata_retriever.h" +namespace fs = std::filesystem; + Song metadata_retriever::retrieve_metadata(std::string& song_path) { TagLib::FileRef file(song_path.c_str()); @@ -26,30 +28,23 @@ Song metadata_retriever::retrieve_metadata(std::string& song_path) song.duration = file.audioProperties()->lengthInSeconds(); song.songPath = song_path; - /** - strcpy(sng->Title, file.tag()->title().toCString()); - strcpy(sng->Artist, file.tag()->artist().toCString()); - strcpy(sng->Album, file.tag()->album().toCString()); - strcpy(sng->Genre, file.tag()->genre().toCString()); - sng->Year = file.tag()->year(); - sng->Duration = file.audioProperties()->lengthInSeconds(); - strcpy(sng->SongPath, song_path); - */ return song; } -Cover metadata_retriever::update_cover_art(Cover cov, const Song song, const std::string& root_path) +Cover metadata_retriever::update_cover_art(const Song& song, Cover& cov, const std::string& stockCoverPath) { TagLib::MPEG::File sngF(song.songPath.c_str()); - TagLib::ID3v2::Tag *tag = sngF.ID3v2Tag(); + auto tag = sngF.ID3v2Tag(); auto frameList = tag->frameListMap()["APIC"]; if (frameList.isEmpty()) { - std::string stock_path{root_path}; - stock_path.append("CoverArt.png"); - cov.imagePath = stock_path; - //strcpy(cov->ImagePath, stock_path.c_str()); + cov.imagePath.append("CoverArt.png"); + + if (!fs::exists(cov.imagePath)) { + std::cout << "copying stock cover path" << std::endl; + fs::copy(stockCoverPath, cov.imagePath); + } imageFile stock_img(cov.imagePath.c_str()); @@ -61,23 +56,23 @@ Cover metadata_retriever::update_cover_art(Cover cov, const Song song, const std tag->addFrame(pic); sngF.save(); - std::cout<<"applied stock cover art"<( frameList.front()); directory_manager dir; - auto img_path = dir.create_directory_process(song, root_path); + auto img_path = dir.create_directory_process(song, cov.imagePath); img_path.append(song.title); img_path.append(".png"); cov.imagePath = img_path; - //strcpy(cov->ImagePath, img_path.c_str()); - std::cout<picture().data(), frame->picture().size()); img_save.close(); - std::cout<<"saved to "<