indexer.cpp
1 #include "indexer.hpp" 2 3 #include <KFileMetaData/ExtractorCollection> 4 #include <QDebug> 5 #include <QDirIterator> 6 #include <QMimeDatabase> 7 #include <iostream> 8 9 FileIndexer::FileIndexer(KotoLibraryConfig* config) { 10 this->i_root = QString {config->getPath().c_str()}; 11 } 12 13 FileIndexer::~FileIndexer() = default; 14 15 void FileIndexer::index() { 16 QMimeDatabase db; 17 KFileMetaData::ExtractorCollection extractors; 18 19 QStringList root_dirs {this->i_root.split(QDir::separator())}; 20 21 QDirIterator it {this->i_root, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories}; 22 23 while (it.hasNext()) { 24 QString path = it.next(); 25 QFileInfo info {path}; 26 27 if (info.isDir()) { 28 auto diffPath = info.dir().relativeFilePath(this->i_root); 29 auto diffDirs = diffPath.split(".."); 30 auto diffDirsSize = diffDirs.size() - 1; 31 32 // This is going to be an artist 33 if (diffDirsSize == 0) { 34 auto artist = new KotoArtist(); 35 artist->setName(info.fileName()); 36 artist->setPath(path); 37 artist->commit(); 38 this->i_artists.append(artist); 39 Cartographer::instance().addArtist(artist); 40 continue; 41 } else if (diffDirsSize == 1) { 42 auto album = new KotoAlbum(); 43 album->setTitle(info.fileName()); 44 45 auto artistDir = QDir(info.dir()); 46 auto artistName = artistDir.dirName(); 47 auto artistOptional = Cartographer::instance().getArtist(artistName); 48 49 if (artistOptional.has_value()) { 50 auto artist = artistOptional.value(); 51 album->artist_uuid = artist->uuid; 52 artist->addAlbum(album); 53 } 54 55 album->commit(); 56 Cartographer::instance().addAlbum(album); 57 continue; 58 } 59 } 60 61 // This is a file 62 QMimeType mime = db.mimeTypeForFile(info); 63 if (mime.name().startsWith("audio/")) { 64 auto extractorList = extractors.fetchExtractors(mime.name()); 65 if (extractorList.isEmpty()) { continue; } 66 67 auto result = KFileMetaData::SimpleExtractionResult(path, mime.name(), KFileMetaData::ExtractionResult::ExtractMetaData); 68 extractorList.first()->extract(&result); 69 70 if (!result.types().contains(KFileMetaData::Type::Audio)) { continue; } 71 72 auto track = KotoTrack::fromMetadata(result, info); 73 74 this->i_tracks.append(track); 75 track->commit(); 76 Cartographer::instance().addTrack(track); 77 } else if (mime.name().startsWith("image/")) { 78 // This is an image, TODO add cover art to album 79 } 80 } 81 } 82 83 void indexAllLibraries() { 84 for (auto library : KotoConfig::instance().getLibraries()) { 85 auto indexer = new FileIndexer(library); 86 indexer->index(); 87 } 88 }