diff --git a/config.example.jsonc b/config.example.jsonc index 47c9cd3e..a5751221 100644 --- a/config.example.jsonc +++ b/config.example.jsonc @@ -488,6 +488,7 @@ "tags": [ "SubMiner" ], // Tags to add to cards mined or updated by SubMiner. Provide an empty array to disable automatic tagging. + "deck": "", // Restrict duplicate detection and card enrichment to this Anki deck. Leave empty to search all decks. "fields": { "word": "Expression", // Card field for the mined word or expression text. "audio": "ExpressionAudio", // Card field that receives generated sentence audio. @@ -507,8 +508,11 @@ "imageType": "static", // Image capture type: "static" for a single still frame, "avif" for an animated AVIF. Values: static | avif "imageFormat": "jpg", // Encoding format used when imageType is "static". Values: jpg | png | webp "imageQuality": 92, // Quality (0-100) used for lossy static image encoders. + "imageMaxWidth": 0, // Maximum width for static images, in pixels. Set to 0 to preserve the source resolution. + "imageMaxHeight": 0, // Maximum height for static images, in pixels. Set to 0 to preserve the source resolution. "animatedFps": 10, // Target frame rate for animated AVIF captures. "animatedMaxWidth": 640, // Maximum width applied to animated AVIF captures. + "animatedMaxHeight": 0, // Maximum height for animated AVIF captures, in pixels. Set to 0 to preserve aspect ratio. "animatedCrf": 35, // Animated AVIF CRF quality target. Lower values produce larger, higher-quality files. "syncAnimatedImageToWordAudio": true, // For animated AVIF images, prepend a frozen first frame matching the existing word-audio duration so motion starts with sentence audio. Values: true | false "audioPadding": 0.5, // Seconds of padding appended to both ends of generated sentence audio. @@ -555,6 +559,8 @@ // ========================================== "jimaku": { "apiBaseUrl": "https://jimaku.cc", // Base URL of the Jimaku subtitle search API. + "apiKey": "", // Jimaku API key. Optional but recommended for higher rate limits. Get one for free at https://jimaku.cc. + "apiKeyCommand": "", // Shell command that prints the Jimaku API key to stdout. Used instead of apiKey to avoid storing the key in plain text. "languagePreference": "ja", // Preferred language used in Jimaku search. Values: ja | en | none "maxEntryResults": 10 // Maximum Jimaku search results returned. }, // Jimaku API configuration and defaults. diff --git a/docs-site/public/config.example.jsonc b/docs-site/public/config.example.jsonc index 47c9cd3e..a5751221 100644 --- a/docs-site/public/config.example.jsonc +++ b/docs-site/public/config.example.jsonc @@ -488,6 +488,7 @@ "tags": [ "SubMiner" ], // Tags to add to cards mined or updated by SubMiner. Provide an empty array to disable automatic tagging. + "deck": "", // Restrict duplicate detection and card enrichment to this Anki deck. Leave empty to search all decks. "fields": { "word": "Expression", // Card field for the mined word or expression text. "audio": "ExpressionAudio", // Card field that receives generated sentence audio. @@ -507,8 +508,11 @@ "imageType": "static", // Image capture type: "static" for a single still frame, "avif" for an animated AVIF. Values: static | avif "imageFormat": "jpg", // Encoding format used when imageType is "static". Values: jpg | png | webp "imageQuality": 92, // Quality (0-100) used for lossy static image encoders. + "imageMaxWidth": 0, // Maximum width for static images, in pixels. Set to 0 to preserve the source resolution. + "imageMaxHeight": 0, // Maximum height for static images, in pixels. Set to 0 to preserve the source resolution. "animatedFps": 10, // Target frame rate for animated AVIF captures. "animatedMaxWidth": 640, // Maximum width applied to animated AVIF captures. + "animatedMaxHeight": 0, // Maximum height for animated AVIF captures, in pixels. Set to 0 to preserve aspect ratio. "animatedCrf": 35, // Animated AVIF CRF quality target. Lower values produce larger, higher-quality files. "syncAnimatedImageToWordAudio": true, // For animated AVIF images, prepend a frozen first frame matching the existing word-audio duration so motion starts with sentence audio. Values: true | false "audioPadding": 0.5, // Seconds of padding appended to both ends of generated sentence audio. @@ -555,6 +559,8 @@ // ========================================== "jimaku": { "apiBaseUrl": "https://jimaku.cc", // Base URL of the Jimaku subtitle search API. + "apiKey": "", // Jimaku API key. Optional but recommended for higher rate limits. Get one for free at https://jimaku.cc. + "apiKeyCommand": "", // Shell command that prints the Jimaku API key to stdout. Used instead of apiKey to avoid storing the key in plain text. "languagePreference": "ja", // Preferred language used in Jimaku search. Values: ja | en | none "maxEntryResults": 10 // Maximum Jimaku search results returned. }, // Jimaku API configuration and defaults. diff --git a/src/config/definitions/defaults-integrations.ts b/src/config/definitions/defaults-integrations.ts index 4d269271..4fc597c9 100644 --- a/src/config/definitions/defaults-integrations.ts +++ b/src/config/definitions/defaults-integrations.ts @@ -24,6 +24,7 @@ export const INTEGRATIONS_DEFAULT_CONFIG: Pick< upstreamUrl: 'http://127.0.0.1:8765', }, tags: ['SubMiner'], + deck: '', fields: { word: 'Expression', audio: 'ExpressionAudio', @@ -43,11 +44,11 @@ export const INTEGRATIONS_DEFAULT_CONFIG: Pick< imageType: 'static', imageFormat: 'jpg', imageQuality: 92, - imageMaxWidth: undefined, - imageMaxHeight: undefined, + imageMaxWidth: 0, + imageMaxHeight: 0, animatedFps: 10, animatedMaxWidth: 640, - animatedMaxHeight: undefined, + animatedMaxHeight: 0, animatedCrf: 35, syncAnimatedImageToWordAudio: true, audioPadding: 0.5, @@ -88,6 +89,8 @@ export const INTEGRATIONS_DEFAULT_CONFIG: Pick< }, jimaku: { apiBaseUrl: 'https://jimaku.cc', + apiKey: '', + apiKeyCommand: '', languagePreference: 'ja', maxEntryResults: 10, }, diff --git a/src/config/definitions/options-integrations.ts b/src/config/definitions/options-integrations.ts index d396d98a..2cf6ca7d 100644 --- a/src/config/definitions/options-integrations.ts +++ b/src/config/definitions/options-integrations.ts @@ -58,6 +58,13 @@ export function buildIntegrationConfigOptionRegistry( description: 'Tags to add to cards mined or updated by SubMiner. Provide an empty array to disable automatic tagging.', }, + { + path: 'ankiConnect.deck', + kind: 'string', + defaultValue: defaultConfig.ankiConnect.deck, + description: + 'Restrict duplicate detection and card enrichment to this Anki deck. Leave empty to search all decks.', + }, { path: 'ankiConnect.fields.word', kind: 'string', @@ -200,14 +207,14 @@ export function buildIntegrationConfigOptionRegistry( kind: 'number', defaultValue: defaultConfig.ankiConnect.media.imageMaxWidth, description: - 'Optional maximum width for static images. Leave unset to preserve the source resolution.', + 'Maximum width for static images, in pixels. Set to 0 to preserve the source resolution.', }, { path: 'ankiConnect.media.imageMaxHeight', kind: 'number', defaultValue: defaultConfig.ankiConnect.media.imageMaxHeight, description: - 'Optional maximum height for static images. Leave unset to preserve the source resolution.', + 'Maximum height for static images, in pixels. Set to 0 to preserve the source resolution.', }, { path: 'ankiConnect.media.animatedFps', @@ -226,7 +233,7 @@ export function buildIntegrationConfigOptionRegistry( kind: 'number', defaultValue: defaultConfig.ankiConnect.media.animatedMaxHeight, description: - 'Optional maximum height for animated AVIF captures. Leave unset to preserve aspect ratio.', + 'Maximum height for animated AVIF captures, in pixels. Set to 0 to preserve aspect ratio.', }, { path: 'ankiConnect.media.animatedCrf', @@ -344,6 +351,20 @@ export function buildIntegrationConfigOptionRegistry( defaultValue: defaultConfig.jimaku.apiBaseUrl, description: 'Base URL of the Jimaku subtitle search API.', }, + { + path: 'jimaku.apiKey', + kind: 'string', + defaultValue: defaultConfig.jimaku.apiKey, + description: + 'Jimaku API key. Optional but recommended for higher rate limits. Get one for free at https://jimaku.cc.', + }, + { + path: 'jimaku.apiKeyCommand', + kind: 'string', + defaultValue: defaultConfig.jimaku.apiKeyCommand, + description: + 'Shell command that prints the Jimaku API key to stdout. Used instead of apiKey to avoid storing the key in plain text.', + }, { path: 'jimaku.languagePreference', kind: 'enum',