/ desktop / datalake / indexer.cpp
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  }