feat: initial database creation, loading
fixes for cartographer and automatically add track to album when adding to artist
This commit is contained in:
parent
72bbcaba9e
commit
62c99ee67c
18 changed files with 515 additions and 108 deletions
|
@ -1,19 +1,32 @@
|
|||
#include <QFileInfo>
|
||||
#include <iostream>
|
||||
|
||||
#include "cartographer.hpp"
|
||||
#include "database.hpp"
|
||||
#include "structs.hpp"
|
||||
|
||||
KotoTrack::KotoTrack() {
|
||||
this->uuid = QUuid::createUuid();
|
||||
}
|
||||
|
||||
KotoTrack* KotoTrack::fromDb() {
|
||||
return new KotoTrack();
|
||||
KotoTrack* KotoTrack::fromDb(const QSqlQuery& query, const QSqlRecord& record) {
|
||||
KotoTrack* track = new KotoTrack();
|
||||
track->uuid = QUuid {query.value(record.indexOf("id")).toString()};
|
||||
auto artist_id = query.value(record.indexOf("artist_id"));
|
||||
if (!artist_id.isNull()) { track->artist_uuid = QUuid {artist_id.toString()}; }
|
||||
|
||||
auto album_id = query.value(record.indexOf("album_id"));
|
||||
if (!album_id.isNull()) { track->album_uuid = QUuid {album_id.toString()}; }
|
||||
|
||||
track->title = QString {query.value(record.indexOf("name")).toString()};
|
||||
track->disc_number = query.value(record.indexOf("disc")).toInt();
|
||||
track->track_number = query.value(record.indexOf("position")).toInt();
|
||||
track->duration = query.value(record.indexOf("duration")).toInt();
|
||||
track->genres = QList {query.value(record.indexOf("genres")).toString().split(", ")};
|
||||
return track;
|
||||
}
|
||||
|
||||
KotoTrack::~KotoTrack() {}
|
||||
|
||||
KotoTrack* KotoTrack::fromMetadata(const KFileMetaData::SimpleExtractionResult& metadata) {
|
||||
KotoTrack* KotoTrack::fromMetadata(const KFileMetaData::SimpleExtractionResult& metadata, const QFileInfo& info) {
|
||||
auto props = metadata.properties();
|
||||
KotoTrack* track = new KotoTrack();
|
||||
track->disc_number = props.value(KFileMetaData::Property::DiscNumber, 0).toInt();
|
||||
|
@ -26,10 +39,18 @@ KotoTrack* KotoTrack::fromMetadata(const KFileMetaData::SimpleExtractionResult&
|
|||
|
||||
track->lyrics = props.value(KFileMetaData::Property::Lyrics).toString();
|
||||
track->narrator = props.value(KFileMetaData::Property::Performer).toString();
|
||||
track->title = props.value(KFileMetaData::Property::Title).toString();
|
||||
track->path = info.absolutePath();
|
||||
track->track_number = props.value(KFileMetaData::Property::TrackNumber, 0).toInt();
|
||||
track->year = props.value(KFileMetaData::Property::ReleaseYear, 0).toInt();
|
||||
|
||||
auto titleResult = props.value(KFileMetaData::Property::Title);
|
||||
if (titleResult.isValid() && !titleResult.isNull()) {
|
||||
track->title = titleResult.toString();
|
||||
} else {
|
||||
// TODO: mirror the same logic we had for cleaning up file name to determine track name, position, chapter, artist, etc.
|
||||
track->title = info.fileName();
|
||||
}
|
||||
|
||||
auto artistResult = props.value(KFileMetaData::Property::Artist);
|
||||
auto artistOptional = std::optional<KotoArtist*>();
|
||||
if (artistResult.isValid()) {
|
||||
|
@ -60,6 +81,27 @@ KotoTrack* KotoTrack::fromMetadata(const KFileMetaData::SimpleExtractionResult&
|
|||
return track;
|
||||
}
|
||||
|
||||
KotoTrack::~KotoTrack() {}
|
||||
|
||||
void KotoTrack::commit() {
|
||||
QSqlQuery query(KotoDatabase::instance().getDatabase());
|
||||
query.prepare(
|
||||
"INSERT INTO tracks(id, artist_id, album_id, name, disc, position, duration, genres) "
|
||||
"VALUES (:id, :artist_id, :album_id, :name, :disc, :position, :duration, :genres) "
|
||||
"ON CONFLICT(id) DO UPDATE SET artist_id = :artist_id, album_id = :album_id, name = :name, disc = :disc, position = :position, duration = :duration, "
|
||||
"genres = :genres");
|
||||
query.bindValue(":id", this->uuid.toString());
|
||||
query.bindValue(":artist_id", !this->artist_uuid.isNull() ? this->artist_uuid.toString() : NULL);
|
||||
query.bindValue(":album_id", this->album_uuid.has_value() ? this->album_uuid.value().toString() : NULL);
|
||||
query.bindValue(":name", this->title);
|
||||
query.bindValue(":disc", this->disc_number);
|
||||
query.bindValue(":position", this->track_number);
|
||||
query.bindValue(":duration", this->duration);
|
||||
query.bindValue(":genres", this->genres.join(", "));
|
||||
|
||||
query.exec();
|
||||
}
|
||||
|
||||
int KotoTrack::getDuration() {
|
||||
return this->duration;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue