some pload
This commit is contained in:
@@ -3,7 +3,6 @@ const path = require('path');
|
||||
const sqlite3 = require('sqlite3');
|
||||
const { open } = require('sqlite');
|
||||
const { dbPath } = require('../config');
|
||||
const { defaultSchema } = require('./defaultSettings');
|
||||
const logger = require('../services/logger').child('DB');
|
||||
const { errorToMeta } = require('../utils/errorMeta');
|
||||
const { setLogRootDir, getJobLogDir } = require('../services/logPathService');
|
||||
@@ -521,7 +520,7 @@ async function openAndPrepareDatabase() {
|
||||
const schemaModel = await loadSchemaModel();
|
||||
await applySchemaModel(dbInstance, schemaModel);
|
||||
|
||||
await seedDefaultSettings(dbInstance);
|
||||
await seedFromSchemaFile(dbInstance);
|
||||
await migrateLegacyProfiledToolSettings(dbInstance);
|
||||
await removeDeprecatedSettings(dbInstance);
|
||||
await ensurePipelineStateRow(dbInstance);
|
||||
@@ -564,52 +563,16 @@ async function initDatabase({ allowRecovery = true } = {}) {
|
||||
|
||||
}
|
||||
|
||||
async function seedDefaultSettings(db) {
|
||||
let seeded = 0;
|
||||
for (const item of defaultSchema) {
|
||||
await db.run(
|
||||
`
|
||||
INSERT INTO settings_schema
|
||||
(key, category, label, type, required, description, default_value, options_json, validation_json, order_index)
|
||||
VALUES
|
||||
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
ON CONFLICT(key) DO UPDATE SET
|
||||
category = excluded.category,
|
||||
label = excluded.label,
|
||||
type = excluded.type,
|
||||
required = excluded.required,
|
||||
description = excluded.description,
|
||||
default_value = COALESCE(settings_schema.default_value, excluded.default_value),
|
||||
options_json = excluded.options_json,
|
||||
validation_json = excluded.validation_json,
|
||||
order_index = excluded.order_index,
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
`,
|
||||
[
|
||||
item.key,
|
||||
item.category,
|
||||
item.label,
|
||||
item.type,
|
||||
item.required,
|
||||
item.description || null,
|
||||
item.defaultValue || null,
|
||||
JSON.stringify(item.options || []),
|
||||
JSON.stringify(item.validation || {}),
|
||||
item.orderIndex || 0
|
||||
]
|
||||
);
|
||||
|
||||
await db.run(
|
||||
`
|
||||
INSERT INTO settings_values (key, value)
|
||||
VALUES (?, ?)
|
||||
ON CONFLICT(key) DO NOTHING
|
||||
`,
|
||||
[item.key, item.defaultValue || null]
|
||||
);
|
||||
seeded += 1;
|
||||
async function seedFromSchemaFile(db) {
|
||||
const schemaSql = fs.readFileSync(schemaFilePath, 'utf-8');
|
||||
const statements = schemaSql
|
||||
.split(/;\s*\n/)
|
||||
.map((s) => s.trim())
|
||||
.filter((s) => /^INSERT\b/i.test(s));
|
||||
for (const stmt of statements) {
|
||||
await db.run(stmt);
|
||||
}
|
||||
logger.info('seed:settings', { count: seeded });
|
||||
logger.info('seed:settings', { count: statements.length });
|
||||
}
|
||||
|
||||
async function readCurrentOrDefaultSettingValue(db, key) {
|
||||
|
||||
@@ -1,709 +0,0 @@
|
||||
const defaultSchema = [
|
||||
{
|
||||
key: 'drive_mode',
|
||||
category: 'Laufwerk',
|
||||
label: 'Laufwerksmodus',
|
||||
type: 'select',
|
||||
required: 1,
|
||||
description: 'Auto-Discovery oder explizites Device.',
|
||||
defaultValue: 'auto',
|
||||
options: [
|
||||
{ label: 'Auto Discovery', value: 'auto' },
|
||||
{ label: 'Explizites Device', value: 'explicit' }
|
||||
],
|
||||
validation: {},
|
||||
orderIndex: 10
|
||||
},
|
||||
{
|
||||
key: 'drive_device',
|
||||
category: 'Laufwerk',
|
||||
label: 'Device Pfad',
|
||||
type: 'path',
|
||||
required: 0,
|
||||
description: 'Nur für expliziten Modus, z.B. /dev/sr0.',
|
||||
defaultValue: '/dev/sr0',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 20
|
||||
},
|
||||
{
|
||||
key: 'makemkv_source_index',
|
||||
category: 'Laufwerk',
|
||||
label: 'MakeMKV Source Index',
|
||||
type: 'number',
|
||||
required: 1,
|
||||
description: 'Disc Index im Auto-Modus.',
|
||||
defaultValue: '0',
|
||||
options: [],
|
||||
validation: { min: 0, max: 20 },
|
||||
orderIndex: 30
|
||||
},
|
||||
{
|
||||
key: 'disc_poll_interval_ms',
|
||||
category: 'Laufwerk',
|
||||
label: 'Polling Intervall (ms)',
|
||||
type: 'number',
|
||||
required: 1,
|
||||
description: 'Intervall für Disk-Erkennung.',
|
||||
defaultValue: '4000',
|
||||
options: [],
|
||||
validation: { min: 1000, max: 60000 },
|
||||
orderIndex: 40
|
||||
},
|
||||
{
|
||||
key: 'raw_dir',
|
||||
category: 'Pfade',
|
||||
label: 'Raw Ausgabeordner',
|
||||
type: 'path',
|
||||
required: 1,
|
||||
description: 'Zwischenablage für MakeMKV Rip.',
|
||||
defaultValue: '/mnt/arm-storage/media/raw',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 100
|
||||
},
|
||||
{
|
||||
key: 'raw_dir_bluray',
|
||||
category: 'Pfade',
|
||||
label: 'Raw Ausgabeordner (Blu-ray)',
|
||||
type: 'path',
|
||||
required: 0,
|
||||
description: 'Optionaler RAW-Zielpfad nur für Blu-ray. Leer = Fallback auf "Raw Ausgabeordner".',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 101
|
||||
},
|
||||
{
|
||||
key: 'raw_dir_dvd',
|
||||
category: 'Pfade',
|
||||
label: 'Raw Ausgabeordner (DVD)',
|
||||
type: 'path',
|
||||
required: 0,
|
||||
description: 'Optionaler RAW-Zielpfad nur für DVD. Leer = Fallback auf "Raw Ausgabeordner".',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 102
|
||||
},
|
||||
{
|
||||
key: 'raw_dir_other',
|
||||
category: 'Pfade',
|
||||
label: 'Raw Ausgabeordner (Sonstiges)',
|
||||
type: 'path',
|
||||
required: 0,
|
||||
description: 'Optionaler RAW-Zielpfad nur für Sonstiges. Leer = Fallback auf "Raw Ausgabeordner".',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 103
|
||||
},
|
||||
{
|
||||
key: 'movie_dir',
|
||||
category: 'Pfade',
|
||||
label: 'Film Ausgabeordner',
|
||||
type: 'path',
|
||||
required: 1,
|
||||
description: 'Finale HandBrake Ausgabe.',
|
||||
defaultValue: '/mnt/arm-storage/media/movies',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 110
|
||||
},
|
||||
{
|
||||
key: 'movie_dir_bluray',
|
||||
category: 'Pfade',
|
||||
label: 'Film Ausgabeordner (Blu-ray)',
|
||||
type: 'path',
|
||||
required: 0,
|
||||
description: 'Optionaler Encode-Zielpfad nur für Blu-ray. Leer = Fallback auf "Film Ausgabeordner".',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 111
|
||||
},
|
||||
{
|
||||
key: 'movie_dir_dvd',
|
||||
category: 'Pfade',
|
||||
label: 'Film Ausgabeordner (DVD)',
|
||||
type: 'path',
|
||||
required: 0,
|
||||
description: 'Optionaler Encode-Zielpfad nur für DVD. Leer = Fallback auf "Film Ausgabeordner".',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 112
|
||||
},
|
||||
{
|
||||
key: 'movie_dir_other',
|
||||
category: 'Pfade',
|
||||
label: 'Film Ausgabeordner (Sonstiges)',
|
||||
type: 'path',
|
||||
required: 0,
|
||||
description: 'Optionaler Encode-Zielpfad nur für Sonstiges. Leer = Fallback auf "Film Ausgabeordner".',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 113
|
||||
},
|
||||
{
|
||||
key: 'log_dir',
|
||||
category: 'Pfade',
|
||||
label: 'Log Ordner',
|
||||
type: 'path',
|
||||
required: 1,
|
||||
description: 'Basisordner für Logs. Job-Logs liegen direkt hier, Backend-Logs in /backend.',
|
||||
defaultValue: '/mnt/arm-storage/logs',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 120
|
||||
},
|
||||
{
|
||||
key: 'hardware_monitoring_enabled',
|
||||
category: 'Monitoring',
|
||||
label: 'Hardware Monitoring aktiviert',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Master-Schalter: aktiviert/deaktiviert das komplette Hardware-Monitoring (Polling + Berechnung + WebSocket-Updates).',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 130
|
||||
},
|
||||
{
|
||||
key: 'hardware_monitoring_interval_ms',
|
||||
category: 'Monitoring',
|
||||
label: 'Hardware Monitoring Intervall (ms)',
|
||||
type: 'number',
|
||||
required: 1,
|
||||
description: 'Polling-Intervall für CPU/RAM/GPU/Storage-Metriken.',
|
||||
defaultValue: '5000',
|
||||
options: [],
|
||||
validation: { min: 1000, max: 60000 },
|
||||
orderIndex: 140
|
||||
},
|
||||
{
|
||||
key: 'makemkv_command',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Kommando',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Pfad oder Befehl für makemkvcon.',
|
||||
defaultValue: 'makemkvcon',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 200
|
||||
},
|
||||
{
|
||||
key: 'makemkv_registration_key',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Key',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Optionaler Registrierungsschlüssel. Wird vor Analyze/Rip automatisch per "makemkvcon reg" gesetzt.',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 202
|
||||
},
|
||||
{
|
||||
key: 'mediainfo_command',
|
||||
category: 'Tools',
|
||||
label: 'Mediainfo Kommando',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Pfad oder Befehl für mediainfo.',
|
||||
defaultValue: 'mediainfo',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 205
|
||||
},
|
||||
{
|
||||
key: 'makemkv_min_length_minutes',
|
||||
category: 'Tools',
|
||||
label: 'Minimale Titellänge (Minuten)',
|
||||
type: 'number',
|
||||
required: 1,
|
||||
description: 'Filtert kurze Titel beim Rip.',
|
||||
defaultValue: '60',
|
||||
options: [],
|
||||
validation: { min: 1, max: 1000 },
|
||||
orderIndex: 210
|
||||
},
|
||||
{
|
||||
key: 'handbrake_command',
|
||||
category: 'Tools',
|
||||
label: 'HandBrake Kommando',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Pfad oder Befehl für HandBrakeCLI.',
|
||||
defaultValue: 'HandBrakeCLI',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 215
|
||||
},
|
||||
{
|
||||
key: 'handbrake_restart_delete_incomplete_output',
|
||||
category: 'Tools',
|
||||
label: 'Encode-Neustart: unvollständige Ausgabe löschen',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Wenn aktiv, wird bei "Encode neu starten" der bisherige (nicht erfolgreiche) Output vor Start entfernt.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 220
|
||||
},
|
||||
{
|
||||
key: 'pipeline_max_parallel_jobs',
|
||||
category: 'Tools',
|
||||
label: 'Parallele Jobs',
|
||||
type: 'number',
|
||||
required: 1,
|
||||
description: 'Maximale Anzahl parallel laufender Jobs. Weitere Starts landen in der Queue.',
|
||||
defaultValue: '1',
|
||||
options: [],
|
||||
validation: { min: 1, max: 12 },
|
||||
orderIndex: 225
|
||||
},
|
||||
{
|
||||
key: 'mediainfo_extra_args_bluray',
|
||||
category: 'Tools',
|
||||
label: 'Mediainfo Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Parameter für mediainfo (Blu-ray).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 300
|
||||
},
|
||||
{
|
||||
key: 'makemkv_rip_mode_bluray',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Rip Modus',
|
||||
type: 'select',
|
||||
required: 1,
|
||||
description: 'mkv: direkte MKV-Dateien; backup: vollständige Blu-ray Struktur im RAW-Ordner.',
|
||||
defaultValue: 'backup',
|
||||
options: [
|
||||
{ label: 'MKV', value: 'mkv' },
|
||||
{ label: 'Backup', value: 'backup' }
|
||||
],
|
||||
validation: {},
|
||||
orderIndex: 305
|
||||
},
|
||||
{
|
||||
key: 'makemkv_analyze_extra_args_bluray',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Analyze Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Parameter für Analyze (Blu-ray).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 310
|
||||
},
|
||||
{
|
||||
key: 'makemkv_rip_extra_args_bluray',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Rip Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Parameter für Rip (Blu-ray).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 315
|
||||
},
|
||||
{
|
||||
key: 'handbrake_preset_bluray',
|
||||
category: 'Tools',
|
||||
label: 'HandBrake Preset',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Preset Name für -Z (Blu-ray).',
|
||||
defaultValue: 'H.264 MKV 1080p30',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 320
|
||||
},
|
||||
{
|
||||
key: 'handbrake_extra_args_bluray',
|
||||
category: 'Tools',
|
||||
label: 'HandBrake Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Argumente (Blu-ray).',
|
||||
defaultValue: '--audio-lang-list deu,eng --first-audio --subtitle-lang-list deu,eng --first-subtitle --aencoder copy --audio-copy-mask ac3,eac3,dts --audio-fallback ac3 --encoder-preset slow --quality 18 --encoder-tune film --encoder-profile high --encoder-level 4.1',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 325
|
||||
},
|
||||
{
|
||||
key: 'output_extension_bluray',
|
||||
category: 'Tools',
|
||||
label: 'Ausgabeformat',
|
||||
type: 'select',
|
||||
required: 1,
|
||||
description: 'Dateiendung für finale Datei (Blu-ray).',
|
||||
defaultValue: 'mkv',
|
||||
options: [
|
||||
{ label: 'MKV', value: 'mkv' },
|
||||
{ label: 'MP4', value: 'mp4' }
|
||||
],
|
||||
validation: {},
|
||||
orderIndex: 330
|
||||
},
|
||||
{
|
||||
key: 'filename_template_bluray',
|
||||
category: 'Tools',
|
||||
label: 'Dateiname Template',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Verfügbare Tokens: ${title}, ${year}, ${imdbId} (Blu-ray).',
|
||||
defaultValue: '${title} (${year})',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 335
|
||||
},
|
||||
{
|
||||
key: 'output_folder_template_bluray',
|
||||
category: 'Tools',
|
||||
label: 'Ordnername Template',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Optional. Verfügbare Tokens: ${title}, ${year}, ${imdbId}. Leer = Dateiname-Template (Blu-ray).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 340
|
||||
},
|
||||
{
|
||||
key: 'mediainfo_extra_args_dvd',
|
||||
category: 'Tools',
|
||||
label: 'Mediainfo Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Parameter für mediainfo (DVD).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 500
|
||||
},
|
||||
{
|
||||
key: 'makemkv_rip_mode_dvd',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Rip Modus',
|
||||
type: 'select',
|
||||
required: 1,
|
||||
description: 'mkv: direkte MKV-Dateien; backup: vollständige Disc-Struktur im RAW-Ordner.',
|
||||
defaultValue: 'mkv',
|
||||
options: [
|
||||
{ label: 'MKV', value: 'mkv' },
|
||||
{ label: 'Backup', value: 'backup' }
|
||||
],
|
||||
validation: {},
|
||||
orderIndex: 505
|
||||
},
|
||||
{
|
||||
key: 'makemkv_analyze_extra_args_dvd',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Analyze Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Parameter für Analyze (DVD).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 510
|
||||
},
|
||||
{
|
||||
key: 'makemkv_rip_extra_args_dvd',
|
||||
category: 'Tools',
|
||||
label: 'MakeMKV Rip Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Parameter für Rip (DVD).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 515
|
||||
},
|
||||
{
|
||||
key: 'handbrake_preset_dvd',
|
||||
category: 'Tools',
|
||||
label: 'HandBrake Preset',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Preset Name für -Z (DVD).',
|
||||
defaultValue: 'H.264 MKV 480p30',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 520
|
||||
},
|
||||
{
|
||||
key: 'handbrake_extra_args_dvd',
|
||||
category: 'Tools',
|
||||
label: 'HandBrake Extra Args',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Zusätzliche CLI-Argumente (DVD).',
|
||||
defaultValue: '--audio-lang-list deu,eng --first-audio --subtitle-lang-list deu,eng --first-subtitle --aencoder copy --audio-copy-mask ac3,eac3,dts --audio-fallback ac3 --encoder-preset slow --quality 18 --encoder-tune film --encoder-profile high --encoder-level 4.1',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 525
|
||||
},
|
||||
{
|
||||
key: 'output_extension_dvd',
|
||||
category: 'Tools',
|
||||
label: 'Ausgabeformat',
|
||||
type: 'select',
|
||||
required: 1,
|
||||
description: 'Dateiendung für finale Datei (DVD).',
|
||||
defaultValue: 'mkv',
|
||||
options: [
|
||||
{ label: 'MKV', value: 'mkv' },
|
||||
{ label: 'MP4', value: 'mp4' }
|
||||
],
|
||||
validation: {},
|
||||
orderIndex: 530
|
||||
},
|
||||
{
|
||||
key: 'filename_template_dvd',
|
||||
category: 'Tools',
|
||||
label: 'Dateiname Template',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Verfügbare Tokens: ${title}, ${year}, ${imdbId} (DVD).',
|
||||
defaultValue: '${title} (${year})',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 535
|
||||
},
|
||||
{
|
||||
key: 'output_folder_template_dvd',
|
||||
category: 'Tools',
|
||||
label: 'Ordnername Template',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Optional. Verfügbare Tokens: ${title}, ${year}, ${imdbId}. Leer = Dateiname-Template (DVD).',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 540
|
||||
},
|
||||
{
|
||||
key: 'omdb_api_key',
|
||||
category: 'Metadaten',
|
||||
label: 'OMDb API Key',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'API Key für Metadatensuche.',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 400
|
||||
},
|
||||
{
|
||||
key: 'omdb_default_type',
|
||||
category: 'Metadaten',
|
||||
label: 'OMDb Typ',
|
||||
type: 'select',
|
||||
required: 1,
|
||||
description: 'Vorauswahl für Suche.',
|
||||
defaultValue: 'movie',
|
||||
options: [
|
||||
{ label: 'Movie', value: 'movie' },
|
||||
{ label: 'Series', value: 'series' },
|
||||
{ label: 'Episode', value: 'episode' }
|
||||
],
|
||||
validation: {},
|
||||
orderIndex: 410
|
||||
},
|
||||
{
|
||||
key: 'pushover_enabled',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'PushOver aktiviert',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Master-Schalter für PushOver Versand.',
|
||||
defaultValue: 'false',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 500
|
||||
},
|
||||
{
|
||||
key: 'pushover_token',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'PushOver Token',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Application Token für PushOver.',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 510
|
||||
},
|
||||
{
|
||||
key: 'pushover_user',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'PushOver User',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'User-Key für PushOver.',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 520
|
||||
},
|
||||
{
|
||||
key: 'pushover_device',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'PushOver Device (optional)',
|
||||
type: 'string',
|
||||
required: 0,
|
||||
description: 'Optionales Ziel-Device in PushOver.',
|
||||
defaultValue: '',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 530
|
||||
},
|
||||
{
|
||||
key: 'pushover_title_prefix',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'PushOver Titel-Präfix',
|
||||
type: 'string',
|
||||
required: 1,
|
||||
description: 'Prefix im PushOver Titel.',
|
||||
defaultValue: 'Ripster',
|
||||
options: [],
|
||||
validation: { minLength: 1 },
|
||||
orderIndex: 540
|
||||
},
|
||||
{
|
||||
key: 'pushover_priority',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'PushOver Priority',
|
||||
type: 'number',
|
||||
required: 1,
|
||||
description: 'Priorität -2 bis 2.',
|
||||
defaultValue: '0',
|
||||
options: [],
|
||||
validation: { min: -2, max: 2 },
|
||||
orderIndex: 550
|
||||
},
|
||||
{
|
||||
key: 'pushover_timeout_ms',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'PushOver Timeout (ms)',
|
||||
type: 'number',
|
||||
required: 1,
|
||||
description: 'HTTP Timeout für PushOver Requests.',
|
||||
defaultValue: '7000',
|
||||
options: [],
|
||||
validation: { min: 1000, max: 60000 },
|
||||
orderIndex: 560
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_metadata_ready',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Metadaten-Auswahl senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet wenn Metadaten zur Auswahl bereitstehen.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 570
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_rip_started',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Rip-Start senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet beim Start des MakeMKV-Rips.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 580
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_encoding_started',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Encode-Start senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet beim Start von HandBrake.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 590
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_job_finished',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Erfolg senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet bei erfolgreich abgeschlossenem Job.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 600
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_job_error',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Fehler senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet bei Fehlern in der Pipeline.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 610
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_job_cancelled',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Abbruch senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet wenn Job manuell abgebrochen wurde.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 620
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_reencode_started',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Re-Encode Start senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet beim Start von RAW Re-Encode.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 630
|
||||
},
|
||||
{
|
||||
key: 'pushover_notify_reencode_finished',
|
||||
category: 'Benachrichtigungen',
|
||||
label: 'Bei Re-Encode Erfolg senden',
|
||||
type: 'boolean',
|
||||
required: 1,
|
||||
description: 'Sendet bei erfolgreichem RAW Re-Encode.',
|
||||
defaultValue: 'true',
|
||||
options: [],
|
||||
validation: {},
|
||||
orderIndex: 640
|
||||
}
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
defaultSchema
|
||||
};
|
||||
Reference in New Issue
Block a user