From b1ae61f542bf751bd361b23d722cd0c862f5e022 Mon Sep 17 00:00:00 2001 From: Andrew Rabert Date: Fri, 24 Oct 2025 17:34:54 -0400 Subject: [PATCH] Add CLI option option to override config dir (--config-dir) This commit also consolidates the default configuration directories and makes the cache path consistent. From: ~/.cache/Jellyfin Media Player ~/.local/share/jellyfinmediaplayer ~/.local/share/Jellyfin Media Player To just: ~/.cache/jellyfinmediaplayer ~/.local/share/jellyfinmediaplayer --- CMakeModules/QtConfiguration.cmake | 2 +- src/main.cpp | 39 +++++++++++++++++++++++++++++- src/settings/SettingsComponent.cpp | 29 ---------------------- src/settings/SettingsComponent.h | 8 ------ src/shared/Paths.cpp | 38 +++++++++++++++++++++++++++-- src/shared/Paths.h | 1 + 6 files changed, 76 insertions(+), 41 deletions(-) diff --git a/CMakeModules/QtConfiguration.cmake b/CMakeModules/QtConfiguration.cmake index 526187a..1d85a67 100644 --- a/CMakeModules/QtConfiguration.cmake +++ b/CMakeModules/QtConfiguration.cmake @@ -22,7 +22,7 @@ include_directories(${QTROOT}/include) set(REQUIRED_QT_VERSION "5.7.0") set(QTCONFIGROOT ${QTROOT}/lib/cmake/Qt5) -set(components Core Network WebChannel Qml Quick Xml WebEngine Widgets) +set(components Core Network WebChannel Qml Quick Xml WebEngine WebEngineWidgets Widgets) if(UNIX AND (NOT APPLE) AND ((NOT BUILD_TARGET STREQUAL "RPI"))) add_definitions(-DUSE_X11EXTRAS) diff --git a/src/main.cpp b/src/main.cpp index 1172568..2eda930 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,9 +6,11 @@ #include #include #include +#include #include #include #include +#include #include "shared/Names.h" #include "system/SystemComponent.h" @@ -114,9 +116,14 @@ int main(int argc, char *argv[]) auto devOption = QCommandLineOption("remote-debugging-port", "Port number for devtools."); devOption.setValueName("port"); + + auto configDirOption = QCommandLineOption("config-dir", "Override config directory path."); + configDirOption.setValueName("path"); + parser.addOption(scaleOption); parser.addOption(devOption); parser.addOption(platformOption); + parser.addOption(configDirOption); char **newArgv = appendCommandLineArguments(argc, argv, g_qtFlags); int newArgc = argc + g_qtFlags.size(); @@ -167,8 +174,33 @@ int main(int argc, char *argv[]) qputenv("QT_QPA_PLATFORM", platform.toUtf8()); } + auto configDir = parser.value("config-dir"); + QString webEngineDataDir; + if (!configDir.isEmpty()) + { + QFileInfo fi(configDir); + QString absPath = fi.absoluteFilePath(); + QDir parentDir = fi.dir(); + + if (!parentDir.exists()) + { + qFatal("Config directory parent does not exist: %s", qPrintable(parentDir.absolutePath())); + } + + Paths::setConfigDir(absPath); + QSettings::setPath(QSettings::NativeFormat, QSettings::UserScope, absPath); + webEngineDataDir = absPath + "/QtWebEngine"; + } + else + { + // Use Paths::dataDir() equivalent inline to avoid double nesting + QDir d(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); + d.mkpath(d.absolutePath() + "/" + Names::MainName()); + d.cd(Names::MainName()); + webEngineDataDir = d.absolutePath() + "/QtWebEngine"; + } + QApplication app(newArgc, newArgv); - app.setApplicationName("Jellyfin Media Player"); #if defined(Q_OS_WIN) // Setting window icon on OSX will break user ability to change it @@ -213,6 +245,11 @@ int main(int argc, char *argv[]) QtWebEngine::initialize(); + // Configure QtWebEngine paths + QWebEngineProfile* defaultProfile = QWebEngineProfile::defaultProfile(); + defaultProfile->setCachePath(webEngineDataDir); + defaultProfile->setPersistentStoragePath(webEngineDataDir); + // load QtWebChannel so that we can register our components with it. QQmlApplicationEngine *engine = Globals::Engine(); diff --git a/src/settings/SettingsComponent.cpp b/src/settings/SettingsComponent.cpp index 8de385c..b09d33a 100644 --- a/src/settings/SettingsComponent.cpp +++ b/src/settings/SettingsComponent.cpp @@ -13,13 +13,10 @@ #include #include #include -#include #include "input/InputComponent.h" #include "system/SystemComponent.h" #include "Version.h" -#define OLDEST_PREVIOUS_VERSION_KEY "oldestPreviousVersion" - /////////////////////////////////////////////////////////////////////////////////////////////////// SettingsComponent::SettingsComponent(QObject *parent) : ComponentBase(parent), m_settingsVersion(-1) { @@ -314,11 +311,6 @@ void SettingsComponent::loadConf(const QString& path, bool storage) /////////////////////////////////////////////////////////////////////////////////////////////////// void SettingsComponent::saveSettings() { - if (m_oldestPreviousVersion.isEmpty()) - { - qCritical() << "Not writing settings: uninitialized.\n"; - return; - } QVariantMap sections; @@ -708,9 +700,6 @@ bool SettingsComponent::componentInitialize() if (!loadDescription()) return false; - // Must be called before we possibly write the config file. - setupVersion(); - load(); // add our AudioSettingsController that will inspect audio settings and react. @@ -726,24 +715,6 @@ bool SettingsComponent::componentInitialize() return true; } -///////////////////////////////////////////////////////////////////////////////////////// -void SettingsComponent::setupVersion() -{ - QSettings settings; - m_oldestPreviousVersion = settings.value(OLDEST_PREVIOUS_VERSION_KEY).toString(); - if (m_oldestPreviousVersion.isEmpty()) - { - // Version key was not present. It could still be a pre-1.1 PMP install, - // so here we try to find out whether this is the very first install, or - // if an older one exists. - QFile configFile(Paths::dataDir("jellyfinmediaplayer.conf")); - if (configFile.exists()) - m_oldestPreviousVersion = "legacy"; - else - m_oldestPreviousVersion = Version::GetVersionString(); - settings.setValue(OLDEST_PREVIOUS_VERSION_KEY, m_oldestPreviousVersion); - } -} ///////////////////////////////////////////////////////////////////////////////////////// bool SettingsComponent::resetAndSaveOldConfiguration() diff --git a/src/settings/SettingsComponent.h b/src/settings/SettingsComponent.h index 6019c33..d1037e1 100644 --- a/src/settings/SettingsComponent.h +++ b/src/settings/SettingsComponent.h @@ -94,11 +94,6 @@ public: // static bool resetAndSaveOldConfiguration(); - QString oldestPreviousVersion() const - { - return m_oldestPreviousVersion; - } - private: explicit SettingsComponent(QObject *parent = nullptr); bool loadDescription(); @@ -106,15 +101,12 @@ private: int platformMaskFromObject(const QJsonObject& object); Platform platformFromString(const QString& platformString); void saveSection(SettingsSection* section); - void setupVersion(); QMap m_sections; int m_settingsVersion; int m_sectionIndex; - QString m_oldestPreviousVersion; - void loadConf(const QString& path, bool storage); }; diff --git a/src/shared/Paths.cpp b/src/shared/Paths.cpp index 7040b96..a4a0463 100644 --- a/src/shared/Paths.cpp +++ b/src/shared/Paths.cpp @@ -13,6 +13,15 @@ #include "Names.h" #include "Version.h" +///////////////////////////////////////////////////////////////////////////////////////// +static QString g_configDirOverride; + +///////////////////////////////////////////////////////////////////////////////////////// +void Paths::setConfigDir(const QString& path) +{ + g_configDirOverride = path; +} + ///////////////////////////////////////////////////////////////////////////////////////// static QDir writableLocation(QStandardPaths::StandardLocation loc) { @@ -59,7 +68,22 @@ QString Paths::resourceDir(const QString& file) ///////////////////////////////////////////////////////////////////////////////////////// QString Paths::dataDir(const QString& file) { - QDir d = writableLocation(QStandardPaths::GenericDataLocation); + QDir d; + + if (!g_configDirOverride.isEmpty()) + { + d = QDir(g_configDirOverride); + if (!d.mkpath(d.absolutePath())) + { + qWarning() << "Failed to create override directory:" << d.absolutePath(); + d = writableLocation(QStandardPaths::GenericDataLocation); + } + } + else + { + d = writableLocation(QStandardPaths::GenericDataLocation); + } + if (file.isEmpty()) return d.absolutePath(); return d.filePath(file); @@ -83,7 +107,17 @@ QString Paths::logDir(const QString& file) ldir.cd("Library/Logs/" + Names::MainName()); return ldir.filePath(file); #else - QDir ldir = writableLocation(QStandardPaths::GenericDataLocation); + QDir ldir; + + if (!g_configDirOverride.isEmpty()) + { + ldir = QDir(g_configDirOverride); + } + else + { + ldir = writableLocation(QStandardPaths::GenericDataLocation); + } + ldir.mkpath(ldir.absolutePath() + "/logs"); ldir.cd("logs"); return ldir.filePath(file); diff --git a/src/shared/Paths.h b/src/shared/Paths.h index 513f5db..c6c0aad 100644 --- a/src/shared/Paths.h +++ b/src/shared/Paths.h @@ -11,6 +11,7 @@ namespace Paths { + void setConfigDir(const QString& path); QString resourceDir(const QString& file = QString()); QString dataDir(const QString& file = QString()); QString cacheDir(const QString& file = QString());