void DbStorage::_prepare_queries() {
_get_artists_query = new QSqlQuery(db);
- _get_artists_query->prepare("SELECT name FROM artist ORDER BY name");
+ _get_artists_query->prepare("SELECT name FROM artist ORDER BY uname");
- _get_albums_for_artist_query = new QSqlQuery(db);
- _get_albums_for_artist_query->prepare("SELECT name FROM album WHERE artist_id in (SELECT id from artist WHERE UPPER(name) = UPPER(:name)) ORDER BY name;");
+ _get_albums_for_artist_sort_name_query = new QSqlQuery(db);
+ _get_albums_for_artist_sort_name_query->prepare("SELECT name, year FROM album WHERE artist_id in (SELECT id from artist WHERE uname = :uname) ORDER BY uname;");
+
+ _get_albums_for_artist_sort_year_query = new QSqlQuery(db);
+ _get_albums_for_artist_sort_year_query->prepare("SELECT name, year FROM album WHERE artist_id in (SELECT id from artist WHERE uname = :uname) ORDER BY year;");
_get_tracks_for_album_query = new QSqlQuery(db);
_get_tracks_for_album_query->prepare("SELECT id, title, source, count, length FROM tracks WHERE artist_id IN "
- "(SELECT id FROM artist WHERE UPPER(name) = UPPER(:artist_name)) AND album_id IN "
- "(SELECT id FROM album WHERE UPPER(name) = UPPER(:album_name));");
+ "(SELECT id FROM artist WHERE uname = :artist_uname) AND album_id IN "
+ "(SELECT id FROM album WHERE uname = :album_uname);");
_get_favorites_query = new QSqlQuery(db);
_get_favorites_query->prepare("SELECT track_id as id, title, artist, album.name as album, source, count, length FROM "
"JOIN album ON album_id = album.id LIMIT 1");
_check_artist_query = new QSqlQuery(db);
- _check_artist_query->prepare("SELECT id FROM artist WHERE UPPER(name) = UPPER(:name)");
+ _check_artist_query->prepare("SELECT id FROM artist WHERE uname = :uname");
_check_album_query = new QSqlQuery(db);
- _check_album_query->prepare("SELECT id FROM album WHERE UPPER(name) = UPPER(:name) AND artist_id = :artist_id");
+ _check_album_query->prepare("SELECT id FROM album WHERE uname = :uname AND artist_id = :artist_id");
_check_track_query = new QSqlQuery(db);
_check_track_query->prepare("SELECT id FROM tracks WHERE source = :source");
_insert_artist_query = new QSqlQuery(db);
- _insert_artist_query->prepare("INSERT INTO artist (name) values (:name)");
+ _insert_artist_query->prepare("INSERT INTO artist (name, uname) values (:name, :uname)");
_insert_album_query = new QSqlQuery(db);
- _insert_album_query->prepare("INSERT INTO album (name, artist_id) values (:name, :artist_id)");
+ _insert_album_query->prepare("INSERT INTO album (name, uname, artist_id, year) values (:name, :uname, :artist_id, :year)");
_insert_track_query = new QSqlQuery(db);
- _insert_track_query->prepare("INSERT INTO tracks (title, artist_id, album_id, source, length) values (:title, :artist_id, :album_id, :source, :length)");
+ _insert_track_query->prepare("INSERT INTO tracks (title, utitle, artist_id, album_id, source, length) values (:title, :utitle, :artist_id, :album_id, :source, :length)");
_insert_date_query = new QSqlQuery(db);
_insert_date_query->prepare("INSERT INTO adding_date (track_id, date) values (:track_id, strftime('%s', 'now'))");
void DbStorage::_create_database_structure() {
QSqlQuery *query = new QSqlQuery(db);
query->exec("create table artist (id integer primary key, "
- "name text "
+ "name text, "
+ "uname text "
");");
query->exec("create table album (id integer primary key, "
"artist_id integer, "
"name text, "
+ "uname text, "
+ "year int, "
"foreign key(artist_id) references arist(id) "
");");
query->exec("create table tracks (id integer primary key, "
"artist_id integer, "
"album_id integer, "
"title text, "
+ "utitle text, "
"source text, "
"count integer default 0, "
"length integer default 0, "
}
DbStorage::~DbStorage() {
- delete _get_albums_for_artist_query;
+ delete _get_albums_for_artist_sort_name_query;
+ delete _get_albums_for_artist_sort_year_query;
delete _get_artists_query;
delete _get_favorites_query;
delete _get_most_played_query;
return artists;
}
-QList<QString> DbStorage::getAlbumsForArtist(QString artist) {
- QList<QString> albums;
- QSqlQuery *query = _get_albums_for_artist_query;
- query->bindValue(":name", artist);
+QMap<QString, int> DbStorage::getAlbumsForArtist(QString artist) {
+ QMap<QString, int> albums;
+ Config config;
+ QString sort = config.getValue("ui/albumsorting").toString();
+ QSqlQuery *query = NULL;
+ if (sort == "date") {
+ query = _get_albums_for_artist_sort_year_query;
+ } else {
+ query = _get_albums_for_artist_sort_name_query;
+ }
+ query->bindValue(":uname", artist.toUpper());
query->exec();
while (query->next()) {
QString name = query->value(0).toString();
- albums.append(name);
+ albums[name] = query->value(1).toInt();
}
return albums;
}
QList<Track> DbStorage::getTracksForAlbum(QString album, QString artist) {
QList<Track> tracks;
QSqlQuery *query = _get_tracks_for_album_query;
- query->bindValue(":artist_name", artist);
- query->bindValue(":album_name", album);
+ query->bindValue(":artist_uname", artist.toUpper());
+ query->bindValue(":album_uname", album.toUpper());
query->exec();
while (query->next()) {
QString artist = track.metadata().artist();
QString album = track.metadata().album();
QString source = track.source();
+ int year = track.metadata().year();
int artist_id = _check_add_artist(artist);
- int album_id = _check_add_album(album, artist_id);
+ int album_id = _check_add_album(album, artist_id, year);
if (artist_id == -1 || album_id == -1) {
//big bang
return;
}
query = _insert_track_query;
query->bindValue(":title", title);
+ query->bindValue(":utitle", title.toUpper());
query->bindValue(":artist_id", artist_id);
query->bindValue(":album_id", album_id);
query->bindValue(":source", source);
int DbStorage::_check_add_artist(QString artist) {
QSqlQuery *query = _check_artist_query;
- query->bindValue(":name", artist);
+ query->bindValue(":uname", artist.toUpper());
query->exec();
if (query->next()) {
int id = query->value(0).toInt();
} else {
query = _insert_artist_query;
query->bindValue(":name", artist);
+ query->bindValue(":uname", artist.toUpper());
if (query->exec()) {
return _check_add_artist(artist);
} else {
}
}
-int DbStorage::_check_add_album(QString album, int artist_id) {
+int DbStorage::_check_add_album(QString album, int artist_id, int year) {
QSqlQuery *query = _check_album_query;
- query->bindValue(":name", album);
+ query->bindValue(":uname", album.toUpper());
query->bindValue(":artist_id", artist_id);
query->exec();
if (query->next()) {
} else {
query = _insert_album_query;
query->bindValue(":name", album);
+ query->bindValue(":uname", album.toUpper());
query->bindValue(":artist_id", artist_id);
+ query->bindValue(":year", year);
if (query->exec()) {
- return _check_add_album(album, artist_id);
+ return _check_add_album(album, artist_id, year);
} else {
// big bang
return -1;
}
}
+inline void __fill_model_album(QStandardItemModel *model, QMap<QString, int> data, QString icons_theme) {
+ model->clear();
+ int count = data.count();
+ model->setRowCount(count);
+ QMap<int, QList<QString> > years;
+ foreach (QString name, data.keys()) {
+ years[data[name]].append(name);
+ }
+ QList<int> keys = years.keys();
+ qSort(keys);
+
+ int i = 0;
+ foreach (int year, keys) {
+ foreach (QString name, years[year]) {
+ model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), ""));
+ model->setItem(i, 1, new QStandardItem(QString("[%1] %2").arg(year).arg(name)));
+ i++;
+ }
+ }
+}
+
inline void __fill_model_tracks (QStandardItemModel *model, QList<Track> tracks, QString icons_theme) {
int count = tracks.count();
model->setRowCount(count);
}
if (_state == STATE_NONE) return;
QString data = index.data().toString();
+ QRegExp regexp("\\[\\d+\\]\\ (.*)");
switch (_state) {
case STATE_ARTIST:
- __fill_model(_model, _lib->getAlbumsForArtist(data), _icons_theme);
+ __fill_model_album(_model, _lib->getAlbumsForArtist(data), _icons_theme);
ui->listView->setColumnWidth(0, 70);
ui->listView->scrollToTop();
_current_artist = data;
ui->listLabel->setText(QString("Albums by \"%1\"").arg(_current_artist));
break;
case STATE_ALBUM:
- _current_album = data;
- _current_tracks = _lib->getTracksForAlbum(data, _current_artist);
- __fill_model_tracks(_model, _current_tracks, _icons_theme);
- ui->listView->setColumnWidth(0, 70);
- ui->listView->scrollToTop();
- _state = STATE_TRACK;
- ui->backButton->setEnabled(true);
- ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
+ if (regexp.indexIn(data) != -1) {
+ _current_album = regexp.cap(1).trimmed();
+ _current_tracks = _lib->getTracksForAlbum(_current_album, _current_artist);
+ __fill_model_tracks(_model, _current_tracks, _icons_theme);
+ ui->listView->setColumnWidth(0, 70);
+ ui->listView->scrollToTop();
+ _state = STATE_TRACK;
+ ui->backButton->setEnabled(true);
+ ui->listLabel->setText(QString("Tracks from \"%1\" by \"%2\"").arg(_current_album).arg(_current_artist));
+ }
break;
case STATE_PLAYLIST:
{
void LibraryForm::_add_artist(Playlist *cur, QString artist) {
- QList<QString> albums = _lib->getAlbumsForArtist(artist);
- foreach(QString album, albums) {
+ QMap<QString, int> albums = _lib->getAlbumsForArtist(artist);
+ foreach(QString album, albums.keys()) {
_add_album(cur, artist, album);
}
}
ui->listView->scrollToTop();
break;
case STATE_TRACK:
- __fill_model(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
+ __fill_model_album(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
ui->listView->setColumnWidth(0, 70);
ui->listView->scrollToTop();
_state = STATE_ALBUM;
}
void LibraryForm::nextItem() {
- qWarning() << "searching" << _search_pattern;
QString data = _model->index(_search_current_id, 0).data().toString();
for (int i = _search_current_id+1; i < _model->rowCount(); i++) {
data = _model->index(i, 1).data().toString();
_view_button();
break;
case STATE_ALBUM:
- __fill_model(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
+ __fill_model_album(_model, _lib->getAlbumsForArtist(_current_artist), _icons_theme);
ui->listView->setColumnWidth(0, 70);
break;
case STATE_PLAYLIST:
if (id.column() == 0)
return;
if (_state == STATE_TRACK || _state == STATE_PLAYLIST_TRACK) {
- qWarning() << "double clicked";
Playlist cur = _lib->getCurrentPlaylist();
Track track = _current_tracks.at(id.row());
cur.addTrack(track);