File indexing completed on 2024-05-19 04:48:29

0001 #ifndef BAE_H
0002 #define BAE_H
0003 
0004 #include <QDirIterator>
0005 #include <QFileInfo>
0006 #include <QStandardPaths>
0007 #include <QString>
0008 
0009 #include <MauiKit3/Core/fmh.h>
0010 #include <MauiKit3/FileBrowsing/fmstatic.h>
0011 
0012 namespace BAE
0013 {
0014 enum class W : uint_fast8_t { ALL, NONE, LIKE, TAG, SIMILAR, UNKNOWN, DONE, DESC, ASC, CODE, MSG };
0015 
0016 static const QMap<W, QString> SLANG =
0017     {{W::ALL, "ALL"}, {W::NONE, "NONE"}, {W::LIKE, "LIKE"}, {W::SIMILAR, "SIMILAR"}, {W::UNKNOWN, "UNKNOWN"}, {W::DONE, "DONE"}, {W::DESC, "DESC"}, {W::ASC, "ASC"}, {W::TAG, "TAG"}, {W::MSG, "MSG"}, {W::CODE, "CODE"}};
0018 
0019 enum class TABLE : uint8_t { ALBUMS, ARTISTS, SOURCES, SOURCES_TYPES, TRACKS, FOLDERS, ALL, NONE };
0020 
0021 static const QMap<TABLE, QString> TABLEMAP = {{TABLE::ALBUMS, "albums"}, {TABLE::ARTISTS, "artists"}, {TABLE::SOURCES, "sources"}, {TABLE::SOURCES_TYPES, "sources_types"}, {TABLE::TRACKS, "tracks"}, {TABLE::FOLDERS, "folders"}
0022 
0023 };
0024 
0025 enum class KEY : uint8_t {
0026     URL = 0,
0027     SOURCES_URL = 1,
0028     TRACK = 2,
0029     TITLE = 3,
0030     ARTIST = 4,
0031     ALBUM = 5,
0032     DURATION = 6,
0033     PLAYED = 7,
0034     STARS = 9,
0035     RELEASE_DATE = 10,
0036     ADD_DATE = 11,
0037     LYRICS = 12,
0038     GENRE = 13,
0039     ART = 14,
0040     TAG = 15,
0041     MOOD = 16,
0042     PLAYLIST = 17,
0043     ARTWORK = 18,
0044     WIKI = 19,
0045     SOURCE_TYPE = 20,
0046     CONTEXT = 21,
0047     RETRIEVAL_DATE = 22,
0048     COMMENT = 23,
0049     ID = 24,
0050     SQL = 25,
0051     NONE = 26
0052 };
0053 
0054 typedef QMap<BAE::KEY, QString> DB;
0055 typedef QList<DB> DB_LIST;
0056 
0057 static const DB KEYMAP = {{KEY::URL, "url"},
0058                           {KEY::SOURCES_URL, "sources_url"},
0059                           {KEY::TRACK, "track"},
0060                           {KEY::TITLE, "title"},
0061                           {KEY::ARTIST, "artist"},
0062                           {KEY::ALBUM, "album"},
0063                           {KEY::DURATION, "duration"},
0064                           {KEY::PLAYED, "played"},
0065                           {KEY::STARS, "stars"},
0066                           {KEY::RELEASE_DATE, "releaseDate"},
0067                           {KEY::ADD_DATE, "addDate"},
0068                           {KEY::LYRICS, "lyrics"},
0069                           {KEY::GENRE, "genre"},
0070                           {KEY::ART, "art"},
0071                           {KEY::TAG, "tag"},
0072                           {KEY::MOOD, "mood"},
0073                           {KEY::PLAYLIST, "playlist"},
0074                           {KEY::ARTWORK, "artwork"},
0075                           {KEY::WIKI, "wiki"},
0076                           {KEY::SOURCE_TYPE, "source_types_id"},
0077                           {KEY::CONTEXT, "context"},
0078                           {KEY::RETRIEVAL_DATE, "retrieval_date"},
0079                           {KEY::ID, "id"},
0080                           {KEY::COMMENT, "comment"},
0081                           {KEY::SQL, "sql"}};
0082 
0083 static const QString CollectionDBPath = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/vvave/").toLocalFile();
0084 
0085 #ifdef Q_OS_ANDROID
0086 const static QUrl CachePath = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/vvave/");
0087 #else
0088 const static QUrl CachePath = QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + "/vvave/");
0089 #endif
0090 
0091 const static QString DBName = QStringLiteral("collection_v2.db");
0092 const static QStringList defaultSources = QStringList() << FMStatic::MusicPath << FMStatic::DownloadsPath;
0093 
0094 static inline BAE::TABLE albumType(const FMH::MODEL &albumMap)
0095 {
0096     if (albumMap[FMH::MODEL_KEY::ALBUM].isEmpty() && !albumMap[FMH::MODEL_KEY::ARTIST].isEmpty())
0097         return BAE::TABLE::ARTISTS;
0098     else if (!albumMap[FMH::MODEL_KEY::ALBUM].isEmpty() && !albumMap[FMH::MODEL_KEY::ARTIST].isEmpty())
0099         return BAE::TABLE::ALBUMS;
0100 
0101     return BAE::TABLE::NONE;
0102 }
0103 
0104 static inline void fixArtworkImageFileName(QString &title)
0105 {
0106     title.replace("/", "_");
0107     title.replace(".", "_");
0108     title.replace("+", "_");
0109     title.replace("&", "_");
0110 }
0111 
0112 static inline bool artworkCache(FMH::MODEL &track, const FMH::MODEL_KEY &type = FMH::MODEL_KEY::ID)
0113 {
0114     QDirIterator it(CachePath.toLocalFile(), QDir::Files, QDirIterator::NoIteratorFlags);
0115     while (it.hasNext()) {
0116         const auto file = QUrl::fromLocalFile(it.next());
0117         const auto fileName = QFileInfo(file.toLocalFile()).baseName();
0118         switch (type) {
0119         case FMH::MODEL_KEY::ALBUM: {
0120             auto name = track[FMH::MODEL_KEY::ARTIST] + "_" + track[FMH::MODEL_KEY::ALBUM];
0121             fixArtworkImageFileName(name);
0122 
0123             if (fileName == name) {
0124                 track.insert(FMH::MODEL_KEY::ARTWORK, file.toString());
0125                 return true;
0126             } else
0127                 continue;
0128             break;
0129         }
0130 
0131         case FMH::MODEL_KEY::ARTIST: {
0132             auto name = track[FMH::MODEL_KEY::ARTIST];
0133             fixArtworkImageFileName(name);
0134 
0135             if (fileName == name) {
0136                 track.insert(FMH::MODEL_KEY::ARTWORK, file.toString());
0137                 return true;
0138             } else
0139                 continue;
0140             break;
0141         }
0142         default:
0143             break;
0144         }
0145     }
0146     return false;
0147 }
0148 
0149 }
0150 
0151 #endif // BAE_H