Laying down some infrastructure for the Song database table.
This commit is contained in:
@@ -66,6 +66,8 @@ Song ObjToSong(JE *env, SongObj obj) {
|
|||||||
auto songArtist = env->GetFieldID( songClass, "artist", "Ljava/lang/String;" );
|
auto songArtist = env->GetFieldID( songClass, "artist", "Ljava/lang/String;" );
|
||||||
auto songGenre = env->GetFieldID( songClass, "genre", "Ljava/lang/String;" );
|
auto songGenre = env->GetFieldID( songClass, "genre", "Ljava/lang/String;" );
|
||||||
auto songDuration = env->GetFieldID( songClass, "duration", "I" );
|
auto songDuration = env->GetFieldID( songClass, "duration", "I" );
|
||||||
|
auto songTrack = env->GetFieldID(songClass, "track", "I");
|
||||||
|
auto songDisc = env->GetFieldID(songClass, "disc", "I");
|
||||||
auto songYear = env->GetFieldID( songClass, "year", "I" );
|
auto songYear = env->GetFieldID( songClass, "year", "I" );
|
||||||
auto songCoverArtId = env->GetFieldID(songClass, "coverArtId", "I");
|
auto songCoverArtId = env->GetFieldID(songClass, "coverArtId", "I");
|
||||||
auto songPathId = env->GetFieldID(songClass, "path", "Ljava/lang/String;");
|
auto songPathId = env->GetFieldID(songClass, "path", "Ljava/lang/String;");
|
||||||
@@ -79,6 +81,8 @@ Song ObjToSong(JE *env, SongObj obj) {
|
|||||||
auto songArtistVal = (jstring)env->GetObjectField(obj, songArtist);
|
auto songArtistVal = (jstring)env->GetObjectField(obj, songArtist);
|
||||||
auto songGenreVal = (jstring)env->GetObjectField(obj, songGenre);
|
auto songGenreVal = (jstring)env->GetObjectField(obj, songGenre);
|
||||||
auto songDurationVal = env->GetIntField(obj, songDuration);
|
auto songDurationVal = env->GetIntField(obj, songDuration);
|
||||||
|
auto songTrackVal = env->GetIntField(obj, songTrack);
|
||||||
|
auto songDiscVal = env->GetIntField(obj, songDisc);
|
||||||
auto songYearVal = env->GetIntField(obj, songYear);
|
auto songYearVal = env->GetIntField(obj, songYear);
|
||||||
auto songCoverArtIdVal = env->GetIntField(obj, songCoverArtId);
|
auto songCoverArtIdVal = env->GetIntField(obj, songCoverArtId);
|
||||||
auto songPathVal = (jstring)env->GetObjectField(obj, songPathId);
|
auto songPathVal = (jstring)env->GetObjectField(obj, songPathId);
|
||||||
@@ -93,6 +97,8 @@ Song ObjToSong(JE *env, SongObj obj) {
|
|||||||
song.albumArtist = env->GetStringUTFChars(albumArtistVal, nullptr);
|
song.albumArtist = env->GetStringUTFChars(albumArtistVal, nullptr);
|
||||||
song.genre = env->GetStringUTFChars(songGenreVal, nullptr);
|
song.genre = env->GetStringUTFChars(songGenreVal, nullptr);
|
||||||
song.duration = songDurationVal;
|
song.duration = songDurationVal;
|
||||||
|
song.track = songTrackVal;
|
||||||
|
song.disc = songDiscVal;
|
||||||
song.year = songYearVal;
|
song.year = songYearVal;
|
||||||
song.coverArtId = songCoverArtIdVal;
|
song.coverArtId = songCoverArtIdVal;
|
||||||
song.path = (songPathVal == nullptr) ? "" : env->GetStringUTFChars(songPathVal, nullptr);
|
song.path = (songPathVal == nullptr) ? "" : env->GetStringUTFChars(songPathVal, nullptr);
|
||||||
@@ -294,6 +300,8 @@ jobject songToObj(JNIEnv *env, const Song& song) {
|
|||||||
auto songGenre = env->GetFieldID( songClass, "genre", "Ljava/lang/String;" );
|
auto songGenre = env->GetFieldID( songClass, "genre", "Ljava/lang/String;" );
|
||||||
auto songYear = env->GetFieldID( songClass, "year", "I" );
|
auto songYear = env->GetFieldID( songClass, "year", "I" );
|
||||||
auto songDuration = env->GetFieldID( songClass, "duration", "I" );
|
auto songDuration = env->GetFieldID( songClass, "duration", "I" );
|
||||||
|
auto songTrack = env->GetFieldID(songClass, "track", "I");
|
||||||
|
auto songDisc = env->GetFieldID(songClass, "disc", "I");
|
||||||
auto songCoverArtId = env->GetFieldID(songClass, "coverArtId", "I");
|
auto songCoverArtId = env->GetFieldID(songClass, "coverArtId", "I");
|
||||||
auto songDownloadedId = env->GetFieldID(songClass, "downloaded", "Z");
|
auto songDownloadedId = env->GetFieldID(songClass, "downloaded", "Z");
|
||||||
auto songPathId = env->GetFieldID(songClass, "path", "Ljava/lang/String;");
|
auto songPathId = env->GetFieldID(songClass, "path", "Ljava/lang/String;");
|
||||||
@@ -310,6 +318,8 @@ jobject songToObj(JNIEnv *env, const Song& song) {
|
|||||||
env->SetObjectField(songObj, songGenre, env->NewStringUTF(song.genre.c_str()));
|
env->SetObjectField(songObj, songGenre, env->NewStringUTF(song.genre.c_str()));
|
||||||
env->SetIntField(songObj, songYear, song.year);
|
env->SetIntField(songObj, songYear, song.year);
|
||||||
env->SetIntField(songObj, songDuration, song.duration);
|
env->SetIntField(songObj, songDuration, song.duration);
|
||||||
|
env->SetIntField(songObj, songTrack, song.track);
|
||||||
|
env->SetIntField(songObj, songDisc, song.disc);
|
||||||
env->SetIntField(songObj, songCoverArtId, song.coverArtId);
|
env->SetIntField(songObj, songCoverArtId, song.coverArtId);
|
||||||
env->SetBooleanField(songObj, songDownloadedId, song.downloaded);
|
env->SetBooleanField(songObj, songDownloadedId, song.downloaded);
|
||||||
env->SetObjectField(songObj, songPathId, songPath);
|
env->SetObjectField(songObj, songPathId, songPath);
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ namespace model {
|
|||||||
std::string albumArtist;
|
std::string albumArtist;
|
||||||
std::string genre;
|
std::string genre;
|
||||||
int duration;
|
int duration;
|
||||||
|
int track;
|
||||||
|
int disc;
|
||||||
int year;
|
int year;
|
||||||
int coverArtId;
|
int coverArtId;
|
||||||
std::vector<char> data;
|
std::vector<char> data;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include "../model/Song.h"
|
#include "../model/Song.h"
|
||||||
#include "../model/Token.h"
|
#include "../model/Token.h"
|
||||||
|
#include "BaseRepository.h"
|
||||||
#include "../utility/GeneralUtility.h"
|
#include "../utility/GeneralUtility.h"
|
||||||
|
|
||||||
namespace repository {
|
namespace repository {
|
||||||
@@ -63,6 +64,8 @@ namespace repository {
|
|||||||
songJson["year"].get<int>(), songJson["coverart_id"].get<int>());
|
songJson["year"].get<int>(), songJson["coverart_id"].get<int>());
|
||||||
song.filename = "";
|
song.filename = "";
|
||||||
song.path = "";
|
song.path = "";
|
||||||
|
song.track = songJson["track"].get<int>();
|
||||||
|
song.disc = songJson["disc"].get<int>();
|
||||||
song.downloaded = false;
|
song.downloaded = false;
|
||||||
|
|
||||||
songs.push_back(song);
|
songs.push_back(song);
|
||||||
@@ -112,6 +115,8 @@ namespace repository {
|
|||||||
s["album_artist"].get<std::string>(), s["genre"].get<std::string>(),
|
s["album_artist"].get<std::string>(), s["genre"].get<std::string>(),
|
||||||
s["duration"].get<int>(), s["year"].get<int>(),
|
s["duration"].get<int>(), s["year"].get<int>(),
|
||||||
s["coverart_id"].get<int>());
|
s["coverart_id"].get<int>());
|
||||||
|
song.track = s["track"].get<int>();
|
||||||
|
song.disc = s["disc"].get<int>();
|
||||||
song.filename = "";
|
song.filename = "";
|
||||||
song.path = "";
|
song.path = "";
|
||||||
song.downloaded = false;
|
song.downloaded = false;
|
||||||
@@ -147,11 +152,11 @@ namespace repository {
|
|||||||
curl_easy_cleanup(curl);
|
curl_easy_cleanup(curl);
|
||||||
downloadedSong.data = std::move(std::vector<char>(data.begin(), data.end()));
|
downloadedSong.data = std::move(std::vector<char>(data.begin(), data.end()));
|
||||||
downloadedSong.filename = "track";
|
downloadedSong.filename = "track";
|
||||||
if (song.id < 10) {
|
if (song.track < 10) {
|
||||||
downloadedSong.filename.append("0");
|
downloadedSong.filename.append("0");
|
||||||
downloadedSong.filename.append(std::to_string(song.id));
|
downloadedSong.filename.append(std::to_string(song.track));
|
||||||
} else {
|
} else {
|
||||||
downloadedSong.filename.append(std::to_string(song.id));
|
downloadedSong.filename.append(std::to_string(song.track));
|
||||||
}
|
}
|
||||||
downloadedSong.filename.append(".mp3");
|
downloadedSong.filename.append(".mp3");
|
||||||
|
|
||||||
@@ -167,6 +172,139 @@ namespace repository {
|
|||||||
|
|
||||||
constexpr auto songDownloadEndpoint() noexcept { return "api/v1/song/data/"; }
|
constexpr auto songDownloadEndpoint() noexcept { return "api/v1/song/data/"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace local {
|
||||||
|
template<class Song = model::Song>
|
||||||
|
class SongRepository : public BaseRepository {
|
||||||
|
public:
|
||||||
|
SongRepository() {
|
||||||
|
m_tableName = songTable();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<Song> retrieveAllSongs(const std::string& appPath) {
|
||||||
|
std::vector<Song> downloadedSongs;
|
||||||
|
try {
|
||||||
|
// TODO: left off here
|
||||||
|
|
||||||
|
} catch (std::exception& ex) {
|
||||||
|
auto msg = ex.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
return downloadedSongs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Song retrieveSong(const Song& song, const std::string& appPath) {
|
||||||
|
Song retrievedSong;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const auto dbPath = pathOfDatabase(appPath);
|
||||||
|
SQLite::Database db(dbPath, SQLite::OPEN_READONLY);
|
||||||
|
|
||||||
|
std::string queryString("SELECT * FROM ");
|
||||||
|
queryString.append(m_tableName);
|
||||||
|
queryString.append(" WHERE Id = ?");
|
||||||
|
queryString.append(" LIMIT 1");
|
||||||
|
|
||||||
|
SQLite::Statement query(db, queryString);
|
||||||
|
query.bind(1, song.id);
|
||||||
|
auto result = query.executeStep();
|
||||||
|
|
||||||
|
retrievedSong.id = query.getColumn(0).getInt();
|
||||||
|
retrievedSong.title = query.getColumn(1).getString();
|
||||||
|
retrievedSong.artist = query.getColumn(2).getString();
|
||||||
|
retrievedSong.album = query.getColumn(3).getString();
|
||||||
|
retrievedSong.albumArtist = query.getColumn(4).getString();
|
||||||
|
retrievedSong.genre = query.getColumn(5).getString();
|
||||||
|
retrievedSong.year = query.getColumn(6).getInt();
|
||||||
|
retrievedSong.duration = query.getColumn(7).getInt();
|
||||||
|
retrievedSong.track = query.getColumn(8).getInt();
|
||||||
|
retrievedSong.disc = query.getColumn(9).getInt();
|
||||||
|
retrievedSong.filename = query.getColumn(10).getString();
|
||||||
|
retrievedSong.path = query.getColumn(11).getString();
|
||||||
|
retrievedSong.coverArtId = query.getColumn(12).getInt();
|
||||||
|
retrievedSong.downloaded = true;
|
||||||
|
|
||||||
|
} catch (std::exception& ex) {
|
||||||
|
auto msg = ex.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
return retrievedSong;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void createSongTable(const std::string& appPath) {
|
||||||
|
try {
|
||||||
|
const auto dbPath = pathOfDatabase(appPath);
|
||||||
|
SQLite::Database db(dbPath, SQLite::OPEN_READWRITE);
|
||||||
|
|
||||||
|
std::string queryString("CREATE TABLE ");
|
||||||
|
queryString.append(m_tableName);
|
||||||
|
queryString.append(" (Id INTEGER, Title TEXT, Artist TEXT, Album TEXT, ");
|
||||||
|
queryString.append("AlbumArtist TEXT, Genre TEXT, Year INTEGER, ");
|
||||||
|
queryString.append("Duration INTEGER, Track INTEGER, Disc INTEGER, ");
|
||||||
|
queryString.append("Filename TEXT, Path TEXT, CoverArtId INTEGER)");
|
||||||
|
|
||||||
|
db.exec(queryString);
|
||||||
|
} catch (std::exception& ex) {
|
||||||
|
auto msg = ex.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteSongFromTable(const Song& song, const std::string& appPath) {
|
||||||
|
try {
|
||||||
|
const auto dbPath = pathOfDatabase(appPath);
|
||||||
|
SQLite::Database db(dbPath, SQLite::OPEN_READWRITE);
|
||||||
|
|
||||||
|
std::string queryString("DELETE FROM ");
|
||||||
|
queryString.append(m_tableName);
|
||||||
|
queryString.append(" WHERE Id = ?");
|
||||||
|
// queryString.append("Duration, Track, Disc, Filename, Path, CoverArtId)");
|
||||||
|
SQLite::Statement query(db, queryString);
|
||||||
|
query.bind(1, song.id);
|
||||||
|
|
||||||
|
query.exec();
|
||||||
|
} catch (std::exception& ex) {
|
||||||
|
auto msg = ex.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void saveSong(const Song& song, const std::string& appPath) {
|
||||||
|
try {
|
||||||
|
const auto dbPath = pathOfDatabase(appPath);
|
||||||
|
SQLite::Database db(dbPath, SQLite::OPEN_READWRITE);
|
||||||
|
|
||||||
|
std::string queryString("INSERT INTO ");
|
||||||
|
queryString.append(m_tableName);
|
||||||
|
queryString.append(" (Id, Title, Artist, Album, AlbumArtist, Genre, Year, ");
|
||||||
|
queryString.append("Duration, Track, Disc, Filename, Path, CoverArtId) ");
|
||||||
|
queryString.append("VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
|
|
||||||
|
SQLite::Statement query(db, queryString);
|
||||||
|
query.bind(1, song.id);
|
||||||
|
query.bind(2, song.title);
|
||||||
|
query.bind(3, song.artist);
|
||||||
|
query.bind(4, song.album);
|
||||||
|
query.bind(5, song.albumArtist);
|
||||||
|
query.bind(6, song.genre);
|
||||||
|
query.bind(7, song.year);
|
||||||
|
query.bind(8, song.duration);
|
||||||
|
query.bind(9, song.track);
|
||||||
|
query.bind(10, song.disc);
|
||||||
|
query.bind(11, song.filename);
|
||||||
|
query.bind(12, song.path);
|
||||||
|
query.bind(13, song.coverArtId);
|
||||||
|
|
||||||
|
query.exec();
|
||||||
|
} catch (std::exception& ex) {
|
||||||
|
auto msg = ex.what();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
constexpr auto songTable() noexcept { return "Song"; }
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ namespace repository { namespace local {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
std::string userTable() noexcept { return "User"; }
|
const std::string userTable() noexcept { return "User"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -94,6 +94,10 @@ class SongAdapter(val mOnClickListener: (Song) -> Unit,
|
|||||||
v.trackArtist.setText(songItems.albumArtist)
|
v.trackArtist.setText(songItems.albumArtist)
|
||||||
|
|
||||||
v.setOnClickListener { clickList(songItem!!)}
|
v.setOnClickListener { clickList(songItem!!)}
|
||||||
|
if (songItems.downloaded) {
|
||||||
|
var rs = v.resources
|
||||||
|
v.setBackgroundColor(v.resources.getColor(R.color.track_seek))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (ex: Exception) {
|
catch (ex: Exception) {
|
||||||
val msg = ex.message
|
val msg = ex.message
|
||||||
|
|||||||
@@ -3,5 +3,6 @@ package com.example.mear.models
|
|||||||
class Song (var id: Int = 3, var title: String = "", var album: String = "",
|
class Song (var id: Int = 3, var title: String = "", var album: String = "",
|
||||||
var albumArtist: String = "", var artist: String = "",
|
var albumArtist: String = "", var artist: String = "",
|
||||||
var genre: String = "", var year: Int = 0, var duration: Int = 0,
|
var genre: String = "", var year: Int = 0, var duration: Int = 0,
|
||||||
|
var track: Int = 0, var disc: Int = 0,
|
||||||
var coverArtId: Int = 0, var downloaded: Boolean = false, var path: String = "",
|
var coverArtId: Int = 0, var downloaded: Boolean = false, var path: String = "",
|
||||||
var filename: String = "")
|
var filename: String = "")
|
||||||
|
|||||||
Reference in New Issue
Block a user