174 lines
5.9 KiB
PHP
174 lines
5.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace OCA\Memories\Settings;
|
|
|
|
use OCA\Memories\AppInfo\Application;
|
|
|
|
class SystemConfig
|
|
{
|
|
// Do not change the next line, it's used by the docs
|
|
// to generate the default config page
|
|
public const DEFAULTS = [
|
|
// Path to exiftool binary
|
|
'memories.exiftool' => '',
|
|
|
|
// Do not use packaged binaries of exiftool
|
|
// This requires perl to be available
|
|
'memories.exiftool_no_local' => false,
|
|
|
|
// Temporary directory for non-php binaries. The directory must be writable
|
|
// and the webserver user should be able to create executable binaries in it.
|
|
// go-vod temp files are separately configured (memories.vod.tempdir)
|
|
// Defaults to system temp directory if blank
|
|
'memories.exiftool.tmp' => '',
|
|
|
|
// How to index user directories
|
|
// 0 = auto-index disabled
|
|
// 1 = index everything
|
|
// 2 = index only user timelines
|
|
// 3 = index only configured path
|
|
'memories.index.mode' => '1',
|
|
|
|
// Path to index (only used if indexing mode is 3)
|
|
'memories.index.path' => '/',
|
|
|
|
// Places database type identifier
|
|
'memories.gis_type' => -1,
|
|
|
|
// Default timeline path for all users
|
|
// If set to '_empty_', the user is prompted to select a path
|
|
'memories.timeline.default_path' => '_empty_',
|
|
|
|
// Default viewer high resolution image loading condition
|
|
// Valid values: 'always' | 'zoom' | 'never'
|
|
'memories.viewer.high_res_cond_default' => 'zoom',
|
|
|
|
// Disable transcoding
|
|
'memories.vod.disable' => true,
|
|
|
|
// VA-API configuration options
|
|
'memories.vod.vaapi' => false, // Transcode with VA-API
|
|
'memories.vod.vaapi.low_power' => false, // Use low_power mode for VA-API
|
|
|
|
// NVENC configuration options
|
|
'memories.vod.nvenc' => false, // Transcode with NVIDIA NVENC
|
|
'memories.vod.nvenc.temporal_aq' => false,
|
|
'memories.vod.nvenc.scale' => 'npp', // npp or cuda
|
|
|
|
// Extra streaming configuration
|
|
'memories.vod.use_transpose' => false,
|
|
'memories.vod.use_gop_size' => false,
|
|
|
|
// Paths to ffmpeg and ffprobe binaries
|
|
'memories.vod.ffmpeg' => '',
|
|
'memories.vod.ffprobe' => '',
|
|
|
|
// Path to go-vod binary
|
|
'memories.vod.path' => '',
|
|
|
|
// Path to use for transcoded files (/tmp/go-vod/instanceid)
|
|
// Make sure this has plenty of space
|
|
'memories.vod.tempdir' => '',
|
|
|
|
// Bind address to use when starting the transcoding server
|
|
'memories.vod.bind' => '127.0.0.1:47788',
|
|
|
|
// Address used to connect to the transcoding server
|
|
// If not specified, the bind address above will be used
|
|
'memories.vod.connect' => '127.0.0.1:47788',
|
|
|
|
// Mark go-vod as external. If true, Memories will not attempt to
|
|
// start go-vod if it is not running already.
|
|
'memories.vod.external' => false,
|
|
|
|
// Quality Factor used for transcoding
|
|
// This correspondes to CRF for x264 and global_quality for VA-API
|
|
'memories.vod.qf' => 24,
|
|
|
|
// Set the default video quality for a first time user
|
|
// 0 => Auto (default)
|
|
// -1 => Original (max quality with transcoding)
|
|
// -2 => Direct (disable transcoding)
|
|
// 1080 => 1080p (and so on)
|
|
'memories.video_default_quality' => '0',
|
|
|
|
// Memories only provides an admin interface for these
|
|
'enabledPreviewProviders' => [],
|
|
'preview_max_x' => 4096,
|
|
'preview_max_y' => 4096,
|
|
'preview_max_memory' => 128,
|
|
'preview_max_filesize_image' => 50,
|
|
'preview_ffmpeg_path' => '',
|
|
|
|
// Placeholders only; these are not touched by the app
|
|
'instanceid' => 'default',
|
|
];
|
|
|
|
/**
|
|
* Get a system config key with the correct default.
|
|
*
|
|
* @param string $key System config key
|
|
* @param mixed $default Default value
|
|
*/
|
|
public static function get(string $key, mixed $default = null): mixed
|
|
{
|
|
if (!\array_key_exists($key, self::DEFAULTS)) {
|
|
throw new \InvalidArgumentException("Invalid system config key: {$key}");
|
|
}
|
|
|
|
return \OC::$server->get(\OCP\IConfig::class)
|
|
->getSystemValue($key, $default ?? self::DEFAULTS[$key])
|
|
;
|
|
}
|
|
|
|
/**
|
|
* Set a system config key.
|
|
*
|
|
* @param string $key System config key
|
|
* @param mixed $value Value to set
|
|
*
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public static function set(string $key, mixed $value): void
|
|
{
|
|
// Check if the key is valid
|
|
if (!\array_key_exists($key, self::DEFAULTS)) {
|
|
throw new \InvalidArgumentException("Invalid system config key: {$key}");
|
|
}
|
|
|
|
// Key belongs to memories namespace
|
|
$isAppKey = str_starts_with($key, Application::APPNAME.'.');
|
|
|
|
// Check if the value has the correct type
|
|
if (null !== $value && \gettype($value) !== \gettype(self::DEFAULTS[$key])) {
|
|
$expected = \gettype(self::DEFAULTS[$key]);
|
|
$got = \gettype($value);
|
|
|
|
throw new \InvalidArgumentException("Invalid type for system config {$key}, expected {$expected}, got {$got}");
|
|
}
|
|
|
|
// Do not allow null for non-app keys
|
|
if (!$isAppKey && null === $value) {
|
|
throw new \InvalidArgumentException("Invalid value for system config {$key}, null is not allowed");
|
|
}
|
|
|
|
$config = \OC::$server->get(\OCP\IConfig::class);
|
|
if ($isAppKey && ($value === self::DEFAULTS[$key] || null === $value)) {
|
|
$config->deleteSystemValue($key);
|
|
} else {
|
|
$config->setSystemValue($key, $value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if geolocation (places) is enabled and available.
|
|
* Returns the type of the GIS.
|
|
*/
|
|
public static function gisType(): int
|
|
{
|
|
return self::get('memories.gis_type');
|
|
}
|
|
}
|