File indexing completed on 2024-04-28 04:44:36

0001 #include <QCommandLineParser>
0002 
0003 #include <QDirIterator>
0004 #include <QQmlContext>
0005 #include <QFileInfo>
0006 #include <QIcon>
0007 
0008 #include <QQmlApplicationEngine>
0009 
0010 #include <KI18n/KLocalizedString>
0011 #include "controllers/lockmanager.h"
0012 
0013 #include <MauiKit3/Core/mauiapp.h>
0014 #include <MauiKit3/FileBrowsing/fmstatic.h>
0015 #include <MauiKit3/FileBrowsing/moduleinfo.h>
0016 
0017 #include <taglib/taglib.h>
0018 #include <libavutil/avutil.h>
0019 
0020 #ifdef MPV_AVAILABLE
0021 #include "backends/mpv/mpvobject.h"
0022 #endif
0023 
0024 #include "models/videosmodel.h"
0025 #include "models/tagsmodel.h"
0026 #include "models/youtubemodel.h"
0027 #include "utils/thumbnailer.h"
0028 
0029 #include "utils/clip.h"
0030 #include "../clip_version.h"
0031 
0032 #ifdef Q_OS_ANDROID
0033 #include <QGuiApplication>
0034 #else
0035 #include <QApplication>
0036 #endif
0037 
0038 #define CLIP_URI "org.maui.clip"
0039 
0040 static const  QList<QUrl> getFolderVideos(const QString &path)
0041 {
0042     QList<QUrl> urls;
0043 
0044     if (QFileInfo(path).isDir())
0045     {
0046         QDirIterator it(path, FMStatic::FILTER_LIST[FMStatic::FILTER_TYPE::IMAGE], QDir::Files, QDirIterator::Subdirectories);
0047         while (it.hasNext())
0048             urls << QUrl::fromLocalFile(it.next());
0049 
0050     }else if (QFileInfo(path).isFile())
0051         urls << path;
0052 
0053     return urls;
0054 }
0055 
0056 static const QList<QUrl> openFiles(const QStringList &files)
0057 {
0058     QList<QUrl>  urls;
0059 
0060     if(files.size()>1)
0061     {
0062         for(const auto &file : files)
0063             urls << QUrl::fromUserInput(file);
0064     }
0065     else if(files.size() == 1)
0066     {
0067         auto folder = QFileInfo(files.first()).dir().absolutePath();
0068         urls = getFolderVideos(folder);
0069         urls.removeOne(QUrl::fromLocalFile(files.first()));
0070         urls.insert(0,QUrl::fromLocalFile(files.first()));
0071     }
0072 
0073     return urls;
0074 }
0075 
0076 Q_DECL_EXPORT int main(int argc, char *argv[])
0077 {
0078     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
0079     QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
0080 
0081 #ifdef Q_OS_ANDROID
0082     QGuiApplication app(argc, argv);
0083     if (!MAUIAndroid::checkRunTimePermissions({"android.permission.WRITE_EXTERNAL_STORAGE"}))
0084         return -1;
0085 #else
0086     QApplication app(argc, argv);
0087 #endif
0088 
0089 #ifdef MPV_AVAILABLE
0090     // Qt sets the locale in the QGuiApplication constructor, but libmpv
0091     // requires the LC_NUMERIC category to be set to "C", so change it back.
0092     std::setlocale(LC_NUMERIC, "C");
0093 #endif
0094 
0095     app.setOrganizationName("Maui");
0096     app.setWindowIcon(QIcon(":/img/assets/clip.svg"));
0097     QGuiApplication::setDesktopFileName(QStringLiteral("org.kde.clip"));
0098 
0099     KLocalizedString::setApplicationDomain("clip");
0100     KAboutData about(QStringLiteral("clip"),
0101                      QStringLiteral("Clip"),
0102                      CLIP_VERSION_STRING,
0103                      i18n("Browse and play your videos."),
0104                      KAboutLicense::LGPL_V3,
0105                      APP_COPYRIGHT_NOTICE,
0106                      QString(GIT_BRANCH) + "/" + QString(GIT_COMMIT_HASH));
0107 
0108     about.addAuthor(QStringLiteral("Camilo Higuita"), i18n("Developer"), QStringLiteral("milo.h@aol.com"));
0109     about.setHomepage("https://mauikit.org");
0110     about.setProductName("maui/clip");
0111     about.setBugAddress("https://invent.kde.org/maui/clip/-/issues");
0112     about.setOrganizationDomain(CLIP_URI);
0113     about.setProgramLogo(app.windowIcon());
0114 
0115     const auto FBData = MauiKitFileBrowsing::aboutData();
0116     about.addComponent(FBData.name(), MauiKitFileBrowsing::buildVersion(), FBData.version(), FBData.webAddress());
0117 
0118 //    about.addComponent("FFmpeg", "", QString::fromLatin1(av_version_info()), QString::fromLatin1(avutil_license()));
0119 
0120 #ifdef MPV_AVAILABLE
0121     about.addComponent("MPV");
0122 #endif
0123 
0124     about.addComponent("TagLib",
0125                        "",
0126                        QString("%1.%2.%3").arg(QString::number(TAGLIB_MAJOR_VERSION),QString::number(TAGLIB_MINOR_VERSION),QString::number(TAGLIB_PATCH_VERSION)),
0127                        "https://taglib.org/api/index.html");
0128 
0129     KAboutData::setApplicationData(about);
0130     MauiApp::instance()->setIconName("qrc:/img/assets/clip.svg");
0131 
0132     QCommandLineParser parser;
0133 
0134     about.setupCommandLine(&parser);
0135     parser.process(app);
0136 
0137     about.processCommandLine(&parser);
0138 
0139     const QStringList args = parser.positionalArguments();
0140 
0141     QPair<QString, QList<QUrl>> arguments;
0142     arguments.first = "collection";
0143 
0144     if(!args.isEmpty())
0145     {
0146         arguments.first = "viewer";
0147         arguments.second = openFiles(args);
0148     }
0149 
0150     QQmlApplicationEngine engine;
0151     const QUrl url(QStringLiteral("qrc:/main.qml"));
0152     QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
0153                      &app, [url, &arguments](QObject *obj, const QUrl &objUrl)
0154     {
0155         if (!obj && url == objUrl)
0156             QCoreApplication::exit(-1);
0157 
0158         if(!arguments.second.isEmpty())
0159             Clip::instance ()->openVideos(arguments.second);
0160 
0161     }, Qt::QueuedConnection);
0162 
0163     engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
0164 
0165     engine.rootContext()->setContextProperty("initModule", arguments.first);
0166     engine.rootContext()->setContextProperty("initData", QUrl::toStringList(arguments.second));
0167 
0168     qmlRegisterType<VideosModel>(CLIP_URI, 1, 0, "Videos");
0169     qmlRegisterType<TagsModel>(CLIP_URI, 1, 0, "Tags");
0170     qmlRegisterType<YouTubeModel>(CLIP_URI, 1, 0, "YouTube");
0171     qmlRegisterSingletonInstance<Clip>(CLIP_URI, 1, 0, "Clip", Clip::instance ());
0172     engine.addImageProvider("preview", new Thumbnailer());
0173 
0174 #ifdef MPV_AVAILABLE
0175     qRegisterMetaType<TracksModel*>();
0176     qmlRegisterType<MpvObject>("mpv", 1, 0, "MpvObject");
0177     qmlRegisterType(QUrl("qrc:/views/player/MPVPlayer.qml"), CLIP_URI, 1, 0, "Video");
0178 #else
0179     qmlRegisterType(QUrl("qrc:/views/player/Player.qml"), CLIP_URI, 1, 0, "Video");
0180 #endif
0181 
0182     qmlRegisterSingletonType<LockManager>(CLIP_URI, 1, 0, "LockManager", [](QQmlEngine*, QJSEngine*) -> QObject* {
0183         return new LockManager;
0184     });
0185 
0186     engine.load(url);
0187 
0188 #ifdef Q_OS_MACOS
0189     //    MAUIMacOS::removeTitlebarFromWindow();
0190     //    MauiApp::instance()->setEnableCSD(true); //for now index can not handle cloud accounts
0191 #endif
0192 
0193     return app.exec();
0194 }