File indexing completed on 2024-05-19 12:31:43
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