File indexing completed on 2024-05-05 04:47:13

0001 #include "vvave.h"
0002 
0003 #include "db/collectionDB.h"
0004 #include "services/local/taginfo.h"
0005 
0006 #include <MauiKit3/FileBrowsing/fileloader.h>
0007 #include <MauiKit3/FileBrowsing/fm.h>
0008 
0009 #include <QSettings>
0010 
0011 #include "utils/bae.h"
0012 
0013 FMH::MODEL vvave::trackInfo(const QUrl &url)
0014 {
0015     TagInfo info(url.toLocalFile());
0016     if (info.isNull())
0017     {
0018         return FMH::MODEL();
0019     }
0020 
0021     const auto track = info.getTrack();
0022     const auto genre = info.getGenre();
0023     const auto album = info.getAlbum();
0024     const auto title = info.getTitle(); /* to fix*/
0025     const auto artist = info.getArtist();
0026     const auto sourceUrl = FMStatic::parentDir(url).toString();
0027     const auto duration = info.getDuration();
0028     const auto year = info.getYear();
0029     const auto comment = info.getComment();
0030 
0031     return FMH::MODEL {{FMH::MODEL_KEY::URL, url.toString()},
0032         {FMH::MODEL_KEY::TRACK, QString::number(track)},
0033         {FMH::MODEL_KEY::TITLE, title},
0034         {FMH::MODEL_KEY::ARTIST, artist},
0035         {FMH::MODEL_KEY::ALBUM, album},
0036         {FMH::MODEL_KEY::COMMENT, comment},
0037         {FMH::MODEL_KEY::DURATION, QString::number(duration)},
0038         {FMH::MODEL_KEY::GENRE, genre},
0039         {FMH::MODEL_KEY::SOURCE, sourceUrl},
0040         {FMH::MODEL_KEY::RELEASEDATE, QString::number(year)}};
0041 }
0042 
0043 QString vvave::artworkUrl(const QString &artist, const QString &album)
0044 {
0045     FMH::MODEL data = {{FMH::MODEL_KEY::ARTIST, artist}, {FMH::MODEL_KEY::ALBUM, album}};
0046     if (BAE::artworkCache(data, FMH::MODEL_KEY::ALBUM))
0047     {
0048         return QUrl(data[FMH::MODEL_KEY::ARTWORK]).toLocalFile();
0049     }
0050 
0051     return QString();
0052 }
0053 
0054 QVariantList vvave::getTracks(const QString &query)
0055 {
0056     return FMH::toMapList(CollectionDB::getInstance()->getDBData(query));
0057 }
0058 
0059 /*
0060  * Sets upthe app default config paths
0061  * BrainDeamon to get collection information
0062  * YoutubeFetcher ?
0063  *
0064  * */
0065 vvave::vvave(QObject *parent)
0066     : QObject(parent)
0067 {
0068     qRegisterMetaType<QList<QUrl> *>("QList<QUrl>&");
0069 
0070     QDir dirPath(BAE::CachePath.toLocalFile());
0071     if (!dirPath.exists())
0072         dirPath.mkpath(".");
0073 }
0074 
0075 void vvave::setFetchArtwork(bool fetchArtwork)
0076 {
0077     if (m_fetchArtwork == fetchArtwork)
0078         return;
0079 
0080     m_fetchArtwork = fetchArtwork;
0081     Q_EMIT fetchArtworkChanged(m_fetchArtwork);
0082 }
0083 
0084 bool vvave::fetchArtwork() const
0085 {
0086     return m_fetchArtwork;
0087 }
0088 
0089 void vvave::addSources(const QList<QUrl> &paths)
0090 {
0091     auto urls = QUrl::fromStringList(sources());
0092     QList<QUrl> newUrls;
0093 
0094     for (const auto &path : paths) {
0095         if (!urls.contains(path)) {
0096             newUrls << path;
0097             Q_EMIT sourceAdded(path);
0098         }
0099     }
0100 
0101     if (newUrls.isEmpty())
0102         return;
0103 
0104     urls << newUrls;
0105 
0106     QSettings settings;
0107     settings.beginGroup("SETTINGS");
0108     settings.setValue("SOURCES", QVariant::fromValue(QUrl::toStringList(urls)));
0109     settings.endGroup();
0110 
0111     scanDir(urls);
0112     Q_EMIT sourcesChanged();
0113 }
0114 
0115 bool vvave::removeSource(const QString &source)
0116 {
0117     auto urls = this->sources();
0118     if (!urls.contains(source))
0119         return false;
0120 
0121     urls.removeOne(source);
0122 
0123     QSettings settings;
0124     settings.beginGroup("SETTINGS");
0125     settings.setValue("SOURCES", QVariant::fromValue(urls));
0126     settings.endGroup();
0127 
0128     Q_EMIT sourcesChanged();
0129 
0130     if (CollectionDB::getInstance()->removeSource(source)) {
0131         Q_EMIT this->sourceRemoved(source);
0132         return true;
0133     }
0134 
0135     return false;
0136 }
0137 
0138 void vvave::scanDir(const QList<QUrl> &paths)
0139 {
0140     auto fileLoader = new FMH::FileLoader();
0141     fileLoader->informer = &trackInfo;
0142     //    fileLoader->setBatchCount(50);
0143 
0144     connect(fileLoader, &FMH::FileLoader::itemReady, CollectionDB::getInstance(), &CollectionDB::addTrack);
0145     connect(fileLoader, &FMH::FileLoader::finished, fileLoader, [this, fileLoader](FMH::MODEL_LIST, QList<QUrl>)
0146     {
0147         m_scanning = false;
0148         Q_EMIT scanningChanged(m_scanning);
0149 
0150         fileLoader->deleteLater();
0151     });
0152 
0153     fileLoader->requestPath(paths, true, QStringList() << FMStatic::FILTER_LIST[FMStatic::FILTER_TYPE::AUDIO] << "*.m4a");
0154 
0155     m_scanning = true;
0156     Q_EMIT scanningChanged(m_scanning);
0157 }
0158 
0159 void vvave::rescan()
0160 {
0161     scanDir(QUrl::fromStringList(sources()));
0162 }
0163 
0164 QStringList vvave::sources()
0165 {
0166     QSettings settings;
0167     settings.beginGroup("SETTINGS");
0168     auto data = settings.value("SOURCES", QVariant::fromValue(BAE::defaultSources)).toStringList();
0169     settings.endGroup();
0170     return data;
0171 }
0172 
0173 QVariantList vvave::sourcesModel()
0174 {
0175     QVariantList res;
0176     const auto urls = sources();
0177     for (const auto &url : urls)
0178     {
0179         if(FMStatic::fileExists(url))
0180         {
0181             res << FMStatic::getFileInfo(url);
0182         }
0183     }
0184 
0185     return res;
0186 }
0187 
0188 QList<QUrl> vvave::folders()
0189 {
0190     const auto sources = CollectionDB::getInstance()->getDBData("select * from sources");
0191     return QUrl::fromStringList(FMH::modelToList(sources, FMH::MODEL_KEY::URL));
0192 }
0193 
0194 bool vvave::scanning() const
0195 {
0196     return m_scanning;
0197 }
0198