- Live-search view: a results-count selector (20/40/60/100) replaces manual load-more (the free scrape source pages until that many are gathered); an 'these results are temporary' banner with a 'Clear now' button that discards them 'as if never added' (api.clearSearch) and returns to the feed. - Channel blocklist: a Block/Unblock toggle + 'Blocked' badge on the channel page (blocked channels don't auto-explore and their videos are hidden), and a 'Blocked channels' section in the Channel manager with one-click unblock. ChannelDetail.blocked from the backend. - Admin: a 'Purge discovery' button on the Scheduler page (immediate un-kept search/explore cleanup). EN/HU/DE throughout.
125 lines
5.4 KiB
JSON
125 lines
5.4 KiB
JSON
{
|
|
"intro": "Operational settings stored in the database — these override the file/env defaults and take effect without a redeploy. Leave a field empty (or reset it) to fall back to the default.",
|
|
"loading": "Loading configuration…",
|
|
"groups": {
|
|
"access": "Access",
|
|
"email": "Email / SMTP",
|
|
"youtube": "YouTube API",
|
|
"google": "Google sign-in",
|
|
"quota": "Quota",
|
|
"backfill": "Backfill",
|
|
"shorts": "Shorts probe",
|
|
"batch": "Batch sizes",
|
|
"explore": "Channel explore"
|
|
},
|
|
"fields": {
|
|
"smtp_host": {
|
|
"label": "SMTP host",
|
|
"hint": "e.g. smtp.gmail.com"
|
|
},
|
|
"smtp_port": {
|
|
"label": "SMTP port",
|
|
"hint": "Usually 587 (STARTTLS)."
|
|
},
|
|
"smtp_user": {
|
|
"label": "SMTP username",
|
|
"hint": "The sending account / login."
|
|
},
|
|
"smtp_from": {
|
|
"label": "From address",
|
|
"hint": "e.g. Siftlode <addr@gmail.com>. Defaults to the username."
|
|
},
|
|
"smtp_password": {
|
|
"label": "SMTP password",
|
|
"hint": "App password. Stored encrypted; write-only — it's never shown back."
|
|
},
|
|
"quota_daily_budget": {
|
|
"label": "Daily quota budget",
|
|
"hint": "Total YouTube Data API units to spend per day (free tier is 10,000). Default 9000 leaves headroom."
|
|
},
|
|
"backfill_quota_reserve": {
|
|
"label": "Backfill quota reserve",
|
|
"hint": "Units kept in reserve so scheduled backfill never starves interactive syncs / enrichment."
|
|
},
|
|
"search_daily_limit_per_user": {
|
|
"label": "Live search — daily limit per user",
|
|
"hint": "Max live YouTube searches per user per day. With the API source each search costs 100 units (so the shared budget affords only ~80-90/day total); with the scrape source it's a pure anti-abuse limit. Set 0 to disable live search."
|
|
},
|
|
"search_source": {
|
|
"label": "Live search source",
|
|
"hint": "Where live YouTube search results come from. \"scrape\" uses YouTube's internal endpoint and spends no API quota (recommended). \"api\" uses the official search.list (100 units/page). Switch to \"api\" if scraping ever breaks or is blocked."
|
|
},
|
|
"backfill_recent_max_videos": {
|
|
"label": "Recent backfill — max videos",
|
|
"hint": "Newest videos fetched per channel on the first pass."
|
|
},
|
|
"backfill_recent_max_days": {
|
|
"label": "Recent backfill — max age (days)",
|
|
"hint": "How far back the first pass reaches per channel."
|
|
},
|
|
"shorts_probe_max_seconds": {
|
|
"label": "Shorts probe — max duration (s)",
|
|
"hint": "Only videos at or below this length are probed as possible Shorts."
|
|
},
|
|
"shorts_probe_batch": {
|
|
"label": "Shorts probe — batch size",
|
|
"hint": "How many videos to classify per run."
|
|
},
|
|
"enrich_batch_size": {
|
|
"label": "Enrichment batch size",
|
|
"hint": "videos.list ids per call (YouTube caps this at 50)."
|
|
},
|
|
"autotag_title_sample": {
|
|
"label": "Auto-tag title sample",
|
|
"hint": "Recent video titles sampled per channel for language detection."
|
|
},
|
|
"youtube_api_key": {
|
|
"label": "YouTube API key",
|
|
"hint": "Optional. Used for public reads (channels/videos) so shared backfill doesn't depend on a user's OAuth. Stored encrypted; write-only."
|
|
},
|
|
"youtube_api_proxy": {
|
|
"label": "YouTube API egress proxy",
|
|
"hint": "Optional. HTTP(S) proxy URL for outbound YouTube API calls — route them through a fixed-IP host so an IP-restricted key keeps working from a dynamic-IP server. Leave empty for direct."
|
|
},
|
|
"google_client_id": {
|
|
"label": "Google client ID",
|
|
"hint": "OAuth 2.0 client ID for Sign in with Google. Stored encrypted; write-only. Leave both Google fields empty to disable Google sign-in (email+password still works)."
|
|
},
|
|
"google_client_secret": {
|
|
"label": "Google client secret",
|
|
"hint": "OAuth 2.0 client secret. Stored encrypted; write-only."
|
|
},
|
|
"allow_registration": {
|
|
"label": "Allow registration",
|
|
"hint": "When on, anyone can submit an email+password registration. They still need to verify their email and be approved by an admin before they can sign in."
|
|
},
|
|
"explore_grace_days": {
|
|
"label": "Explore — grace period (days)",
|
|
"hint": "How long an explored-but-unsubscribed channel (and its ephemeral videos) is kept before the cleanup job removes it. Subscribing keeps it permanently."
|
|
},
|
|
"search_grace_days": {
|
|
"label": "Search results — grace period (days)",
|
|
"hint": "How long an un-kept live-search result video (nobody watched / saved / subscribed to) is kept before the discovery-cleanup job removes it."
|
|
}
|
|
},
|
|
"save": "Save",
|
|
"saving": "Saving…",
|
|
"saved": "Saved",
|
|
"saveFailed": "Couldn't save",
|
|
"unsaved": "Unsaved changes",
|
|
"discard": "Discard",
|
|
"willReset": "will reset to default on save",
|
|
"reset": "Reset",
|
|
"resetHint": "Remove this override and fall back to the file/env default.",
|
|
"resetDone": "Reset to default",
|
|
"usingDefault": "using default",
|
|
"overridden": "overridden in DB",
|
|
"secretSet": "•••••••• stored",
|
|
"secretEnv": "using env value",
|
|
"secretUnset": "not set",
|
|
"secretsDisabled": "Set TOKEN_ENCRYPTION_KEY to store secrets in the database.",
|
|
"testEmail": "Send test email",
|
|
"testEmailHint": "Send a test email to your own address using the settings above, to confirm they work.",
|
|
"testSent": "Test email sent to {{to}}",
|
|
"testFailed": "Test email failed — check the settings"
|
|
}
|