/** * SubMiner Example Configuration File * * This file is auto-generated from src/config/definitions.ts. * Copy to $XDG_CONFIG_HOME/SubMiner/config.jsonc (or ~/.config/SubMiner/config.jsonc) and edit as needed. */ { // ========================================== // Overlay Auto-Start // When overlay connects to mpv, automatically show overlay and hide mpv subtitles. // ========================================== "auto_start_overlay": false, // ========================================== // Visible Overlay Subtitle Binding // Control whether visible overlay toggles also toggle MPV subtitle visibility. // When enabled, visible overlay hides MPV subtitles; when disabled, MPV subtitles are left unchanged. // ========================================== "bind_visible_overlay_to_mpv_sub_visibility": true, // ========================================== // Texthooker Server // Control whether browser opens automatically for texthooker. // ========================================== "texthooker": { "openBrowser": true, }, // ========================================== // WebSocket Server // Built-in WebSocket server broadcasts subtitle text to connected clients. // Auto mode disables built-in server if mpv_websocket is detected. // ========================================== "websocket": { "enabled": "auto", "port": 6677, }, // ========================================== // Logging // Controls logging verbosity. // Set to debug for full runtime diagnostics. // ========================================== "logging": { "level": "info", }, // ========================================== // AnkiConnect Integration // Automatic Anki updates and media generation options. // ========================================== "ankiConnect": { "enabled": false, "url": "http://127.0.0.1:8765", "pollingRate": 3000, "fields": { "audio": "ExpressionAudio", "image": "Picture", "sentence": "Sentence", "miscInfo": "MiscInfo", "translation": "SelectionText", }, "ai": { "enabled": false, "alwaysUseAiTranslation": false, "apiKey": "", "model": "openai/gpt-4o-mini", "baseUrl": "https://openrouter.ai/api", "targetLanguage": "English", "systemPrompt": "You are a translation engine. Return only the translated text with no explanations.", }, "media": { "generateAudio": true, "generateImage": true, "imageType": "static", "imageFormat": "jpg", "imageQuality": 92, "animatedFps": 10, "animatedMaxWidth": 640, "animatedCrf": 35, "audioPadding": 0.5, "fallbackDuration": 3, "maxMediaDuration": 30, }, "behavior": { "overwriteAudio": true, "overwriteImage": true, "mediaInsertMode": "append", "highlightWord": true, "notificationType": "osd", "autoUpdateNewCards": true, }, "nPlusOne": { "highlightEnabled": false, "refreshMinutes": 1440, "matchMode": "headword", "decks": [], "minSentenceWords": 3, "nPlusOne": "#c6a0f6", "knownWord": "#a6da95", }, "metadata": { "pattern": "[SubMiner] %f (%t)", }, "isLapis": { "enabled": false, "sentenceCardModel": "Japanese sentences", "sentenceCardSentenceField": "Sentence", "sentenceCardAudioField": "SentenceAudio", }, "isKiku": { "enabled": false, "fieldGrouping": "disabled", "deleteDuplicateInAuto": true, }, }, // ========================================== // Keyboard Shortcuts // Overlay keyboard shortcuts. Set a shortcut to null to disable. // Fixed (non-configurable) overlay shortcuts: // - Ctrl/Cmd+A: append clipboard video path to MPV playlist // ========================================== "shortcuts": { "toggleVisibleOverlayGlobal": "Alt+Shift+O", "toggleInvisibleOverlayGlobal": "Alt+Shift+I", "copySubtitle": "CommandOrControl+C", "copySubtitleMultiple": "CommandOrControl+Shift+C", "updateLastCardFromClipboard": "CommandOrControl+V", "triggerFieldGrouping": "CommandOrControl+G", "triggerSubsync": "Ctrl+Alt+S", "mineSentence": "CommandOrControl+S", "mineSentenceMultiple": "CommandOrControl+Shift+S", "multiCopyTimeoutMs": 3000, "toggleSecondarySub": "CommandOrControl+Shift+V", "markAudioCard": "CommandOrControl+Shift+A", "openRuntimeOptions": "CommandOrControl+Shift+O", "openJimaku": "Ctrl+Shift+J", }, // ========================================== // Invisible Overlay // Startup behavior for the invisible interactive subtitle mining layer. // Invisible subtitle position edit mode: Ctrl/Cmd+Shift+P to toggle, arrow keys to move, Enter or Ctrl/Cmd+S to save, Esc to cancel. // This edit-mode shortcut is fixed and is not currently configurable. // ========================================== "invisibleOverlay": { "startupVisibility": "platform-default", }, // ========================================== // Keybindings (MPV Commands) // Extra keybindings that are merged with built-in defaults. // Set command to null to disable a default keybinding. // ========================================== "keybindings": [], // ========================================== // Subtitle Appearance // Primary and secondary subtitle styling. // ========================================== "subtitleStyle": { "enableJlpt": false, "fontFamily": "Noto Sans CJK JP Regular, Noto Sans CJK JP, Arial Unicode MS, Arial, sans-serif", "fontSize": 35, "fontColor": "#cad3f5", "fontWeight": "normal", "fontStyle": "normal", "backgroundColor": "rgba(54, 58, 79, 0.5)", "nPlusOneColor": "#c6a0f6", "knownWordColor": "#a6da95", "jlptColors": { "N1": "#ed8796", "N2": "#f5a97f", "N3": "#f9e2af", "N4": "#a6e3a1", "N5": "#8aadf4", }, "frequencyDictionary": { "enabled": false, "sourcePath": "", "topX": 1000, "mode": "single", "singleColor": "#f5a97f", "bandedColors": ["#ed8796", "#f5a97f", "#f9e2af", "#a6e3a1", "#8aadf4"], }, "secondary": { "fontSize": 24, "fontColor": "#ffffff", "backgroundColor": "transparent", "fontWeight": "normal", "fontStyle": "normal", "fontFamily": "Noto Sans CJK JP Regular, Noto Sans CJK JP, Arial Unicode MS, Arial, sans-serif", }, }, // ========================================== // Secondary Subtitles // Dual subtitle track options. // Used by subminer YouTube subtitle generation as secondary language preferences. // ========================================== "secondarySub": { "secondarySubLanguages": [], "autoLoadSecondarySub": false, "defaultMode": "hover", }, // ========================================== // Auto Subtitle Sync // Subsync engine and executable paths. // ========================================== "subsync": { "defaultMode": "auto", "alass_path": "", "ffsubsync_path": "", "ffmpeg_path": "", }, // ========================================== // Subtitle Position // Initial vertical subtitle position from the bottom. // ========================================== "subtitlePosition": { "yPercent": 10, }, // ========================================== // Jimaku // Jimaku API configuration and defaults. // ========================================== "jimaku": { "apiBaseUrl": "https://jimaku.cc", "languagePreference": "ja", "maxEntryResults": 10, }, // ========================================== // YouTube Subtitle Generation // Defaults for subminer YouTube subtitle extraction/transcription mode. // ========================================== "youtubeSubgen": { "mode": "automatic", "whisperBin": "", "whisperModel": "", "primarySubLanguages": ["ja", "jpn"], }, // ========================================== // Anilist // Anilist API credentials and update behavior. // ========================================== "anilist": { "enabled": false, "accessToken": "", }, // ========================================== // Jellyfin // Optional Jellyfin integration for auth, browsing, and playback launch. // Access token is stored in config and should be treated as a secret. // ========================================== "jellyfin": { "enabled": false, "serverUrl": "", "username": "", "accessToken": "", "userId": "", "deviceId": "subminer", "clientName": "SubMiner", "clientVersion": "0.1.0", "defaultLibraryId": "", "remoteControlEnabled": true, "remoteControlAutoConnect": true, "autoAnnounce": false, "remoteControlDeviceName": "SubMiner", "pullPictures": false, "iconCacheDir": "/tmp/subminer-jellyfin-icons", "directPlayPreferred": true, "directPlayContainers": ["mkv", "mp4", "webm", "mov", "flac", "mp3", "aac"], "transcodeVideoCodec": "h264", }, // ========================================== // Immersion Tracking // Enable/disable immersion tracking. // Set dbPath to override the default sqlite database location. // Policy tuning is available for queue, flush, and retention values. // ========================================== "immersionTracking": { "enabled": true, "dbPath": "", "batchSize": 25, "flushIntervalMs": 500, "queueCap": 1000, "payloadCapBytes": 256, "maintenanceIntervalMs": 86400000, "retention": { "eventsDays": 7, "telemetryDays": 30, "dailyRollupsDays": 365, "monthlyRollupsDays": 1825, "vacuumIntervalDays": 7, }, }, }