diff options
Diffstat (limited to 'indexerwidget.cpp')
-rw-r--r-- | indexerwidget.cpp | 139 |
1 files changed, 135 insertions, 4 deletions
diff --git a/indexerwidget.cpp b/indexerwidget.cpp index caf6d7d..337f20c 100644 --- a/indexerwidget.cpp +++ b/indexerwidget.cpp @@ -5,7 +5,8 @@ #include <QProcess> #include <QApplication> #include <QCursor> -#include <QAudioDecoder> +#include <QSqlQuery> +#include <QFileInfo> #include "taglib/tag.h" #include "indexerwidget.h" @@ -14,6 +15,10 @@ IndexerWidget::IndexerWidget(QWidget *parent) : QWidget(parent) { //widgets mLog = new QTextEdit; mLog->setFont(QFont("courier new")); + mLog->setTextColor(Qt::darkGreen); + mError = new QTextEdit; + mError->setFont(QFont("courier new")); + mError->setTextColor(Qt::red); QPushButton *startB = new QPushButton(tr("Index")); connect(startB, SIGNAL(clicked()), this, SLOT(startIndexing())); QPushButton *cancelB = new QPushButton(tr("Cancel")); @@ -22,6 +27,7 @@ IndexerWidget::IndexerWidget(QWidget *parent) : QWidget(parent) { //reader mReader = new BeetReader; connect(mReader, SIGNAL(message(QString)), this, SLOT(addToLog(QString))); + connect(mReader, SIGNAL(errorMsg(QString)), this, SLOT(addToError(QString))); //layout QVBoxLayout *mainLayout = new QVBoxLayout; @@ -31,11 +37,14 @@ IndexerWidget::IndexerWidget(QWidget *parent) : QWidget(parent) { buttonLayout->addWidget(cancelB); buttonLayout->addStretch(); mainLayout->addWidget(mLog); + mainLayout->addWidget(mError); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); } void IndexerWidget::startIndexing(){ + mLog->clear(); + mError->clear(); mReader->start(); } @@ -47,30 +56,72 @@ void IndexerWidget::addToLog(QString msg){ mLog->append(msg); } +void IndexerWidget::addToError(QString msg){ + mError->append(msg); +} + + BeetReader::BeetReader() : mCanceled(false){ + mDb = QSqlDatabase::database("beetplayerdb"); + mInsertArtistsQ = new QSqlQuery(mDb); + mInsertArtistsQ->prepare("INSERT INTO artists (tartists_name) VALUES(:name)"); + mCurArtistQ = new QSqlQuery(mDb); + mCurArtistQ->prepare("SELECT currval('artist_iartists_id__seq')"); + mInsertGenresQ = new QSqlQuery(mDb); + mInsertGenresQ->prepare("INSERT INTO genres (tgenres_name) VALUES(:name)"); + mCurGenresQ = new QSqlQuery(mDb); + mCurGenresQ->prepare("SELECT currval('genres_igenre_id__seq')"); + mInsertAlbumQ = new QSqlQuery(mDb); + mInsertAlbumQ->prepare("INSERT INTO albums(iartists_id, igenres_id, talbum_name, siyear) VALUES(:aid, :genid, :name, :year)"); + mCurAlbumQ = new QSqlQuery(mDb); + mCurAlbumQ->prepare("SELECT currval('albums_ialbums_id__seq')"); + mInsertSongQ = new QSqlQuery(mDb); + mInsertSongQ->prepare("INSERT INTO songs (ialbums_id, sipos, ttitle, tfullpath) VALUES(:aid, :pos, :title, :tfp)"); } void BeetReader::run(){ + emit message(QString(tr("Clearing everything..."))); + clearAll(); QProcess lister; lister.start("beet", QStringList() << "ls" << "-p"); qApp->setOverrideCursor(QCursor(Qt::WaitCursor)); + emit message(QString(tr("Waiting for beet ls -p..."))); lister.waitForStarted(); lister.waitForFinished(); qApp->restoreOverrideCursor(); QByteArray lOut = lister.readAllStandardOutput(); QList<QByteArray> files = lOut.split('\n'); - QString foundMsg = QString(tr("Found %1 file(s)\n").arg(QString::number(files.size()))); + int totalCount = files.size(); + QString foundMsg = QString(tr("Found %1 file(s)\n").arg(QString::number(totalCount))); emit message(foundMsg); + int ctr = 1; foreach(QByteArray s, files){ + //fetch data from file TagLib::FileRef file(QString(s).toUtf8()); + if(file.isNull()){ + QString fn = QString(s).toUtf8(); + QString error = QString(tr("IsNull: %1")).arg(fn); + emit errorMsg(error); + continue; + } QString artist = toQString(file.tag()->artist()); QString album = toQString(file.tag()->album()); QString title = toQString(file.tag()->title()); QString genre = toQString(file.tag()->genre()); quint16 track = file.tag()->track(); quint16 year = file.tag()->year(); - QString msg = QString("%1 - %2: %3 - %4 (%5 - %6)").arg(artist).arg(album).arg(track, 2, 10, QChar('0')).arg(title).arg(QString::number(year)).arg(genre); - emit message(msg); + + //write to database + int artistId = doArtist(artist); + int genreId = doGenre(genre); + int albumId = doAlbum(album, genreId, artistId, year, QString(s).toUtf8()); + doSong(title, track, albumId, s); + + if(ctr % 100 == 0){ + QString msg = QString(tr("Processed %1 files of %2")).arg(QString::number(ctr)).arg(QString::number(totalCount)); + emit message(msg); + } + mCancelMx.lock(); if(mCanceled == true){ mCanceled = false; @@ -78,7 +129,9 @@ void BeetReader::run(){ return; } mCancelMx.unlock(); + ++ctr; } + emit message(QString(tr("Indexing DONE!"))); } void BeetReader::cancel(){ @@ -92,3 +145,81 @@ QString BeetReader::toQString(TagLib::String string){ retval = retval.simplified().toLower(); return retval; } + +void BeetReader::clearAll(){ + QSqlQuery q1("DELETE FROM songs", mDb); + QSqlQuery q2("DELETE FROM albums", mDb); + QSqlQuery q3("DELETE FROM genres", mDb); + QSqlQuery q4("DELETE FROM artists", mDb); + mArtistH.clear(); + mAlbumH.clear(); + mGenreH.clear(); + emit cleared(); +} + +int BeetReader::doArtist(QString name){ + if(mArtistH.contains(name)){ + return mArtistH.value(name); + } + mDb.transaction(); + mInsertArtistsQ->bindValue(":name", name); + mInsertArtistsQ->exec(); + mCurArtistQ->exec(); + int retval = -1; + while(mCurArtistQ->next()){ + retval = mCurArtistQ->value(0).toInt(); + } + mArtistH.insert(name, retval); + mDb.commit(); + return retval; +} + +int BeetReader::doGenre(QString name){ + if(mGenreH.contains(name)){ + return mGenreH.value(name); + } + mDb.transaction(); + mInsertGenresQ->bindValue(":name", name); + mInsertGenresQ->exec(); + mCurGenresQ->exec(); + int retval = -1; + mCurGenresQ->exec(); + while(mCurGenresQ->next()){ + retval = mCurGenresQ->value(0).toInt(); + } + mGenreH.insert(name, retval); + mDb.commit(); + return retval; +} + +int BeetReader::doAlbum(QString name, int genre, int artist, int year, QString fullPath){ + QFileInfo fi(fullPath); + QString key = fi.absolutePath(); + if(mAlbumH.contains(key)){ + return mAlbumH.value(key); + } + mDb.transaction(); + mInsertAlbumQ->bindValue(":name", name); + mInsertAlbumQ->bindValue(":aid", artist); + mInsertAlbumQ->bindValue(":genid", genre); + mInsertAlbumQ->bindValue(":year", year); + mInsertAlbumQ->exec(); + int retval = -1; + mCurAlbumQ->exec(); + while(mCurAlbumQ->next()){ + retval = mCurAlbumQ->value(0).toInt(); + } + mAlbumH.insert(key, retval); + mDb.commit(); + return retval; +} + +void BeetReader::doSong(QString title, int pos, int album, QString fullpath){ + mDb.transaction(); + mInsertSongQ->bindValue(":title", title); + mInsertSongQ->bindValue(":pos", pos); + mInsertSongQ->bindValue(":aid", album); + mInsertSongQ->bindValue(":tfp", fullpath); + mInsertSongQ->exec(); + mDb.commit(); +} |