Working more on downloading a song and the ability to retrieve where to is stored at on the filesystem
This commit is contained in:
@@ -265,7 +265,7 @@ void updateShuffleMode(const std::string& path) {
|
||||
|
||||
template<class Song = model::Song, class Token = model::Token, typename Str = std::string>
|
||||
void downloadSong(Song& song, const Token& token, const Str& path) {
|
||||
song.filename = song.title;
|
||||
song.filename = "track";
|
||||
song.path = path;
|
||||
repository::local::APIRepository apiRepo;
|
||||
auto apiInfo = apiRepo.retrieveAPIInfo(path);
|
||||
@@ -273,16 +273,26 @@ void downloadSong(Song& song, const Token& token, const Str& path) {
|
||||
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);
|
||||
downloadedSong.path = dirMgr.fullSongPath(song, path);
|
||||
std::fstream saveSong(downloadedSong.path, std::ios::out | std::ios::binary);
|
||||
saveSong.write((char*)&downloadedSong.data[0], downloadedSong.data.size());
|
||||
saveSong.close();
|
||||
|
||||
repository::local::SongRepository localSongRepo;
|
||||
if (!localSongRepo.databaseExist(path)) {
|
||||
localSongRepo.initializedDatabase(path);
|
||||
}
|
||||
|
||||
if (!localSongRepo.doesTableExist(path)) {
|
||||
localSongRepo.createSongTable(path);
|
||||
}
|
||||
|
||||
localSongRepo.saveSong(downloadedSong, path);
|
||||
}
|
||||
|
||||
|
||||
@@ -367,6 +377,43 @@ Java_com_example_mear_repositories_TrackRepository_retrieveSongs(
|
||||
return songs;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT jobjectArray
|
||||
JNICALL
|
||||
Java_com_example_mear_repositories_TrackRepository_retrieveSongsIncludingDownloaded(
|
||||
JNIEnv *env,
|
||||
jobject thisOnj,
|
||||
jobject token,
|
||||
jstring baseUri,
|
||||
jstring appPathStr
|
||||
) {
|
||||
jclass tokenClass = env->FindClass("com/example/mear/models/Token");
|
||||
jclass songClass = env->FindClass( "com/example/mear/models/Song");
|
||||
|
||||
auto tokField = env->GetFieldID(tokenClass, "accessToken", "Ljava/lang/String;");
|
||||
auto tokObj = env->GetObjectField(token, tokField);
|
||||
std::string tokStr = env->GetStringUTFChars((jstring)tokObj, nullptr);
|
||||
std::string appPath = env->GetStringUTFChars((jstring)appPathStr, nullptr);
|
||||
model::Token tk(tokStr);
|
||||
|
||||
const std::string uri = env->GetStringUTFChars(baseUri, nullptr);
|
||||
env->DeleteLocalRef(baseUri);
|
||||
|
||||
auto allSongs = retrieveSongs(tk, uri);
|
||||
jobjectArray songs = env->NewObjectArray(allSongs.size(), songClass, nullptr);
|
||||
auto i = 0;
|
||||
for (auto& sng: allSongs) {
|
||||
try {
|
||||
auto song = songToObj<model::Song>(env, sng);
|
||||
env->SetObjectArrayElement(songs, i++, song);
|
||||
} catch (std::exception& ex) {
|
||||
auto msg = ex.what();
|
||||
}
|
||||
}
|
||||
|
||||
return songs;
|
||||
}
|
||||
|
||||
|
||||
extern "C"
|
||||
JNIEXPORT jbyteArray
|
||||
|
||||
@@ -27,7 +27,23 @@ namespace manager {
|
||||
s.append("/");
|
||||
s.append(song.album);
|
||||
s.append("/");
|
||||
s.append(song.filename);
|
||||
|
||||
if (song.disc == 0) {
|
||||
s.append("disc1");
|
||||
} else {
|
||||
s.append("disc");
|
||||
s.append(std::to_string(song.disc));
|
||||
}
|
||||
|
||||
s.append("/");
|
||||
s.append("track");
|
||||
if (song.track < 10) {
|
||||
s.append("0");
|
||||
s.append(std::to_string(song.track));
|
||||
} else {
|
||||
s.append(std::to_string(song.track));
|
||||
}
|
||||
|
||||
s.append(".mp3");
|
||||
|
||||
return s;
|
||||
@@ -45,6 +61,19 @@ namespace manager {
|
||||
return ss.c_str();
|
||||
}
|
||||
|
||||
template<typename Str = std::string>
|
||||
Str albumDiscPath(const Song& song, const Str& path) {
|
||||
std::string songPath = albumPath(song, path);
|
||||
songPath.append("/disc");
|
||||
if (song.disc == 0) {
|
||||
songPath.append("1");
|
||||
} else {
|
||||
songPath.append(std::to_string(song.disc));
|
||||
}
|
||||
|
||||
return songPath.c_str();
|
||||
}
|
||||
|
||||
template<typename Str = std::string>
|
||||
Str artistPath(const Song& song, const Str& path) {
|
||||
Str s = utility::GeneralUtility::appendForwardSlashToUri<std::string>(path);
|
||||
@@ -56,9 +85,7 @@ namespace manager {
|
||||
|
||||
template<typename Str = std::string, typename B = bool>
|
||||
B doesSongExist(const Song& song, const Str& path) {
|
||||
std::string s = albumPath(song, path);
|
||||
s.append("/");
|
||||
s.append(song.filename);
|
||||
std::string s = fullSongPath(song, path);
|
||||
|
||||
struct stat buffer;
|
||||
return (stat (s.c_str(), &buffer) == 0);
|
||||
@@ -85,6 +112,9 @@ namespace manager {
|
||||
if (!albumDirectoryExists(song, path)) {
|
||||
auto status = mkdir(albumPath(song, path), 0777);
|
||||
}
|
||||
if (!albumDiscDirectoryExists(song, path)) {
|
||||
auto status = mkdir(albumDiscPath(song, path), 0777);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Str = std::string>
|
||||
@@ -98,6 +128,16 @@ namespace manager {
|
||||
albumPath.append(song.albumArtist);
|
||||
albumPath.append("/");
|
||||
albumPath.append(song.album);
|
||||
/**
|
||||
if (song.disc == 0) {
|
||||
albumPath.append("/");
|
||||
albumPath.append("disc1");
|
||||
} else {
|
||||
albumPath.append("/");
|
||||
albumPath.append("disc");
|
||||
albumPath.append(std::to_string(song.disc));
|
||||
}
|
||||
*/
|
||||
DIR* dir = opendir(albumPath.c_str());
|
||||
|
||||
if (dir) {
|
||||
@@ -110,6 +150,28 @@ namespace manager {
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename Str = std::string, typename B = bool>
|
||||
B albumDiscDirectoryExists(const Song& song, const Str& path) {
|
||||
std::string albumDistPath = albumPath(song, path);
|
||||
albumDistPath.append("/disc");
|
||||
if (song.disc == 0) {
|
||||
albumDistPath.append("1");
|
||||
} else {
|
||||
albumDistPath.append(std::to_string(song.disc));
|
||||
}
|
||||
|
||||
DIR *dir = opendir(albumDistPath.c_str());
|
||||
|
||||
if (dir) {
|
||||
closedir(dir);
|
||||
return true;
|
||||
} else if (ENOENT == errno) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename Str = std::string, typename B = bool>
|
||||
B artistDirectoryExists(const Song song, const Str& path) {
|
||||
auto artistPath = utility::GeneralUtility::appendForwardSlashToUri<std::string>(path);
|
||||
|
||||
@@ -128,11 +128,11 @@ namespace repository {
|
||||
}
|
||||
|
||||
template<typename Token = model::Token, typename API = model::APIInfo>
|
||||
Song downloadSong(const Token &token, const Song song, const API& uri) {
|
||||
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;
|
||||
Song downloadedSong = song;
|
||||
|
||||
CURL *curl = curl_easy_init();
|
||||
struct curl_slist *chunk = nullptr;
|
||||
@@ -151,6 +151,7 @@ namespace repository {
|
||||
auto res = curl_easy_perform(curl);
|
||||
curl_easy_cleanup(curl);
|
||||
downloadedSong.data = std::move(std::vector<char>(data.begin(), data.end()));
|
||||
/**
|
||||
downloadedSong.filename = "track";
|
||||
if (song.track < 10) {
|
||||
downloadedSong.filename.append("0");
|
||||
@@ -159,6 +160,7 @@ namespace repository {
|
||||
downloadedSong.filename.append(std::to_string(song.track));
|
||||
}
|
||||
downloadedSong.filename.append(".mp3");
|
||||
*/
|
||||
|
||||
return downloadedSong;
|
||||
}
|
||||
@@ -186,7 +188,33 @@ namespace repository {
|
||||
std::vector<Song> downloadedSongs;
|
||||
try {
|
||||
// TODO: left off here
|
||||
const auto dbPath = pathOfDatabase(appPath);
|
||||
SQLite::Database db(dbPath, SQLite::OPEN_READONLY);
|
||||
|
||||
std::string queryString("SELECT * FROM ");
|
||||
queryString.append(m_tableName);
|
||||
|
||||
SQLite::Statement query(db, queryString);
|
||||
|
||||
while (query.executeStep()) {
|
||||
Song song;
|
||||
song.id = query.getColumn(0).getInt();
|
||||
song.title = query.getColumn(1).getString();
|
||||
song.artist = query.getColumn(2).getString();
|
||||
song.album = query.getColumn(3).getString();
|
||||
song.albumArtist = query.getColumn(4).getString();
|
||||
song.genre = query.getColumn(5).getString();
|
||||
song.year = query.getColumn(6).getInt();
|
||||
song.duration = query.getColumn(7).getInt();
|
||||
song.track = query.getColumn(8).getInt();
|
||||
song.disc = query.getColumn(9).getInt();
|
||||
song.filename = query.getColumn(10).getString();
|
||||
song.path = query.getColumn(11).getString();
|
||||
song.coverArtId = query.getColumn(12).getInt();
|
||||
song.downloaded = true;
|
||||
|
||||
downloadedSongs.push_back(song);
|
||||
}
|
||||
} catch (std::exception& ex) {
|
||||
auto msg = ex.what();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user