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 }