diff --git a/app/src/main/cpp/Demo.cpp b/app/src/main/cpp/Demo.cpp index 6557220..79f60c7 100644 --- a/app/src/main/cpp/Demo.cpp +++ b/app/src/main/cpp/Demo.cpp @@ -2,15 +2,3 @@ // Created by brahmix on 9/26/19. // #include "Demo.hpp" - - - - - - - - - - - - diff --git a/app/src/main/cpp/Demo.hpp b/app/src/main/cpp/Demo.hpp index a4e27a7..c67740e 100644 --- a/app/src/main/cpp/Demo.hpp +++ b/app/src/main/cpp/Demo.hpp @@ -6,6 +6,7 @@ #define MEAR_DEMO_H #include +#include #include #include @@ -18,6 +19,7 @@ #include #include "manager/Tok.h" +#include "manager/DirectoryManager.h" #include "model/APIInfo.h" #include "model/CoverArt.h" #include "model/Song.h" @@ -70,6 +72,7 @@ Song ObjToSong(JE *env, SongObj obj) { auto songFilenameId = env->GetFieldID(songClass, "filename", "Ljava/lang/String;"); auto songDownloadedId = env->GetFieldID(songClass, "downloaded", "Z"); + auto songIdVal = env->GetIntField(obj, songId); auto titleVal = (jstring)env->GetObjectField(obj, songTitle); auto albumVal = (jstring)env->GetObjectField(obj, songAlbum); auto albumArtistVal = (jstring)env->GetObjectField(obj, songAlbumArtist); @@ -83,6 +86,7 @@ Song ObjToSong(JE *env, SongObj obj) { Song song; + song.id = songIdVal; song.title = env->GetStringUTFChars(titleVal, nullptr); song.artist = env->GetStringUTFChars(songArtistVal, nullptr); song.album = env->GetStringUTFChars(albumVal, nullptr); @@ -91,8 +95,8 @@ Song ObjToSong(JE *env, SongObj obj) { song.duration = songDurationVal; song.year = songYearVal; song.coverArtId = songCoverArtIdVal; - song.path = env->GetStringUTFChars(songPathVal, nullptr); - song.filename = env->GetStringUTFChars(songFilenameVal, nullptr); + song.path = (songPathVal == nullptr) ? "" : env->GetStringUTFChars(songPathVal, nullptr); + song.filename = (songFilenameVal == nullptr) ? "" : env->GetStringUTFChars(songFilenameVal, nullptr); return song; } @@ -255,8 +259,24 @@ void updateShuffleMode(const std::string& path) { template void downloadSong(Song& song, const Token& token, const Str& path) { + song.filename = song.title; + song.path = path; + repository::local::APIRepository apiRepo; + auto apiInfo = apiRepo.retrieveAPIInfo(path); repository::SongRepository songRepo; - // songRepo.downloadSong(); + auto downloadedSong = songRepo.downloadSong(token, song, apiInfo); + manager::DirectoryManager dirMgr; + if (dirMgr.doesSongExist(song, path)) { + auto a = 0; + std::cout << "song already exists\n"; + return; + } + + dirMgr.createSongDirectory(song, path); + const auto fullSongPath = dirMgr.fullSongPath(song, path); + std::fstream saveSong(fullSongPath, std::ios::out | std::ios::binary); + saveSong.write((char*)&downloadedSong.data[0], downloadedSong.data.size()); + saveSong.close(); } @@ -666,7 +686,7 @@ Java_com_example_mear_repositories_TokenRepository_saveTokenRecord( extern "C" JNIEXPORT void JNICALL -Java_com_example_mear_repositories_TrackRepositories_downloadSong( +Java_com_example_mear_repositories_TrackRepository_downloadSong( JNIEnv *env, jobject thisObj, jobject tokenObj, @@ -681,8 +701,7 @@ Java_com_example_mear_repositories_TrackRepositories_downloadSong( auto song = ObjToSong(env, songObj); auto path = env->GetStringUTFChars(pathStr, nullptr); - - + downloadSong(song, token, path); } extern "C" diff --git a/app/src/main/cpp/manager/DirectoryManager.h b/app/src/main/cpp/manager/DirectoryManager.h index d372610..8331cb9 100644 --- a/app/src/main/cpp/manager/DirectoryManager.h +++ b/app/src/main/cpp/manager/DirectoryManager.h @@ -21,43 +21,46 @@ namespace manager { class DirectoryManager { public: template - Str fullSongPath(const Song& song, const Str& path) { - auto s = utility::GeneralUtility::appendForwardSlashToUri(path); + std::string fullSongPath(const Song& song, const Str& path) { + std::string s = utility::GeneralUtility::appendForwardSlashToUri(path); s.append(song.albumArtist); s.append("/"); s.append(song.album); s.append("/"); s.append(song.filename); + s.append(".mp3"); return s; } template Str albumPath(const Song& song, const Str& path) { - auto s = utility::GeneralUtility::appendForwardSlashToUri(path); + std::string s = utility::GeneralUtility::appendForwardSlashToUri(path); s.append(song.albumArtist); s.append("/"); s.append(song.album); - return s; + auto ss = s; + + return ss.c_str(); } template Str artistPath(const Song& song, const Str& path) { - auto s = utility::GeneralUtility::appendForwardSlashToUri(path); + Str s = utility::GeneralUtility::appendForwardSlashToUri(path); s.append(song.albumArtist); - return s; + return s.c_str(); } template B doesSongExist(const Song& song, const Str& path) { - auto s = albumPath(song, path); + std::string s = albumPath(song, path); s.append("/"); s.append(song.filename); - stat buffer; + struct stat buffer; return (stat (s.c_str(), &buffer) == 0); } @@ -77,7 +80,7 @@ namespace manager { template void createSongDirectory(const Song& song, const Str& path) { if (!artistDirectoryExists(song, path)) { - auto status = mkdir(artistPath(song, path).c_str(), 0777); + auto status = mkdir(artistPath(song, path).c_str(), 0777); } if (!albumDirectoryExists(song, path)) { auto status = mkdir(albumPath(song, path), 0777); @@ -91,7 +94,7 @@ namespace manager { private: template B albumDirectoryExists(const Song song, const Str& path) { - auto albumPath = utility::GeneralUtility::appendForwardSlashToUri(path); + auto albumPath = utility::GeneralUtility::appendForwardSlashToUri(path); albumPath.append(song.albumArtist); albumPath.append("/"); albumPath.append(song.album); @@ -109,7 +112,7 @@ namespace manager { template B artistDirectoryExists(const Song song, const Str& path) { - auto artistPath = utility::GeneralUtility::appendForwardSlashToUri(path); + auto artistPath = utility::GeneralUtility::appendForwardSlashToUri(path); artistPath.append(song.albumArtist); DIR* dir = opendir(artistPath.c_str()); diff --git a/app/src/main/cpp/repository/SongRepository.h b/app/src/main/cpp/repository/SongRepository.h index 02be7e5..7a615ae 100644 --- a/app/src/main/cpp/repository/SongRepository.h +++ b/app/src/main/cpp/repository/SongRepository.h @@ -122,9 +122,9 @@ namespace repository { return sng; } - template - Song downloadSong(const Token &token, const Song song, const std::string& uri) { - auto fullUri = utility::GeneralUtility::appendForwardSlashToUri(uri); + template + Song downloadSong(const Token &token, const Song song, const API& uri) { + auto fullUri = utility::GeneralUtility::appendForwardSlashToUri(uri.uri); fullUri.append(songDownloadEndpoint()); fullUri.append(std::to_string(song.id)); Song downloadedSong; @@ -146,7 +146,13 @@ namespace repository { auto res = curl_easy_perform(curl); curl_easy_cleanup(curl); downloadedSong.data = std::move(std::vector(data.begin(), data.end())); - downloadedSong.filename = downloadedSong.title; + downloadedSong.filename = "track"; + if (song.id < 10) { + downloadedSong.filename.append("0"); + downloadedSong.filename.append(std::to_string(song.id)); + } else { + downloadedSong.filename.append(std::to_string(song.id)); + } downloadedSong.filename.append(".mp3"); return downloadedSong; diff --git a/app/src/main/cpp/utility/GeneralUtility.h b/app/src/main/cpp/utility/GeneralUtility.h index 4f2743d..36b9382 100644 --- a/app/src/main/cpp/utility/GeneralUtility.h +++ b/app/src/main/cpp/utility/GeneralUtility.h @@ -14,7 +14,7 @@ namespace utility { public: template static S appendForwardSlashToUri(const S& uri) { - S fullUri(uri); + std::string fullUri(uri); if (fullUri.at(fullUri.size() - 1) != '/') { fullUri.append("/"); } diff --git a/app/src/main/java/com/example/mear/activities/MainActivity.kt b/app/src/main/java/com/example/mear/activities/MainActivity.kt index e8720cb..307f6b9 100644 --- a/app/src/main/java/com/example/mear/activities/MainActivity.kt +++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt @@ -378,6 +378,7 @@ class MainActivity : BaseServiceActivity() { val token = tokenRepo.retrieveToken(appPath) val apiInfo = apiRepo.retrieveRecord(appPath) + trackRepo.download(token, song, appPath) } R.id.action_song_play_count-> { val trk = musicService!!.getCurrentSong() diff --git a/app/src/main/java/com/example/mear/repositories/TrackRepository.kt b/app/src/main/java/com/example/mear/repositories/TrackRepository.kt index 4c67925..bdea87e 100644 --- a/app/src/main/java/com/example/mear/repositories/TrackRepository.kt +++ b/app/src/main/java/com/example/mear/repositories/TrackRepository.kt @@ -22,7 +22,7 @@ class TrackRepository(var context: Context? = null) { private external fun retrieveSong(token: Token, song: Song, uri: String): Song - private external fun downloadSong(token: Token, song: Song, uri: String) + private external fun downloadSong(token: Token, song: Song, path: String) fun fetchSongs(token: Token, uri: String): Array { @@ -38,6 +38,11 @@ class TrackRepository(var context: Context? = null) { downloadSong(token, song, uri) } + fun download(token: Token, song: Song, path: String) { + downloadSong(token, song, path) + val s = 4 + } + fun insertTracks(tracks: List) = context!!.database.use { transaction {