- An ad-hoc request made while its target's run is under way is the run after it: the scheduler dropped a second fire of a running id, so a second Takeout file was never imported and its key stayed queued until a restart. - Un-marking or resetting a video is remembered (video_unmarks): an import of an older YouTube view no longer marks it watched again; un-marks take the user's Takeout lock. - One user's failure in the Shorts job's Takeout pass is theirs: the job keeps its own result, the others are settled, and a failed lookup spends none of the daily share. - The upload reads the user's id before giving the read connection back. - A watched row waits on a discovery video (search or explore) until the catalog keeps it, so a mark never pins it against the cleanup jobs. - The history is decoded a window at a time, a Watch later file over 2 MiB is refused unread, and two uploads at once across all users (takeout_server_busy). - A Watch later list goes in as one presence read and one insert.
230 lines
13 KiB
JSON
230 lines
13 KiB
JSON
{
|
|
"title": "Background scheduler",
|
|
"menu": "Scheduler actions",
|
|
"loading": "Loading scheduler…",
|
|
"running": "Running",
|
|
"paused": "Paused",
|
|
"notHere": "Not running in this instance",
|
|
"notHereNote": "The scheduler runs on the server. This instance shows the shared queue and quota, but live job activity appears only where the scheduler runs.",
|
|
"updating": "updating…",
|
|
"pause": "Pause",
|
|
"resume": "Resume",
|
|
"pauseHint": "Pause or resume all background sync for the whole app (every user).",
|
|
"toggleFailed": "Couldn't change the scheduler state",
|
|
"jobsTitle": "Jobs",
|
|
"queueTitle": "Work queued",
|
|
"quotaTitle": "Shared API quota",
|
|
"everyMin_one": "every {{count}} min",
|
|
"everyMin_other": "every {{count}} min",
|
|
"runningNow": "Running now…",
|
|
"lastRun": "Last run {{time}}",
|
|
"neverRun": "No run recorded yet",
|
|
"active": "active",
|
|
"nextRun": "next",
|
|
"quotaUsed": "{{used}} / {{budget}} units used today",
|
|
"quotaRemaining": "{{formatted}} left",
|
|
"quotaNote": "Shared YouTube Data API budget; resets at midnight US Pacific. Backfill yields to leave headroom for interactive use.",
|
|
"minutes": "min",
|
|
"range": "Must be between {{min}} and {{max}}",
|
|
"editInterval": "Click to change how often this runs",
|
|
"intervalFailed": "Couldn't change the interval",
|
|
"runNow": "Run now",
|
|
"runAll": "Start all now",
|
|
"runAllHint": "Run every job now, in addition to their schedules.",
|
|
"runAllPausedHint": "Resume the scheduler to run jobs (they're skipped while paused).",
|
|
"triggered": "Started {{job}}",
|
|
"triggeredAll_one": "Started {{count}} job",
|
|
"triggeredAll_other": "Started {{count}} jobs",
|
|
"phase": {
|
|
"recheck": "Re-checking flagged videos",
|
|
"revalidate": "Re-validating videos",
|
|
"enrich": "Enriching videos",
|
|
"backfill_recent": "Backfilling recent uploads",
|
|
"backfill_deep": "Backfilling full history",
|
|
"probe": "Classifying Shorts",
|
|
"rss_poll": "Checking for new uploads",
|
|
"subscriptions": "Syncing subscriptions",
|
|
"autotag": "Auto-tagging channels",
|
|
"playlist_sync": "Syncing playlists",
|
|
"working": "Working…"
|
|
},
|
|
"maintenance": {
|
|
"title": "Maintenance",
|
|
"batchLabel": "Videos re-checked per run",
|
|
"batchHint": "How many least-recently-checked videos the maintenance job re-validates each run. Higher = faster full cycle but more API quota (1 unit per 50 videos).",
|
|
"batchNote": "Default: {{default}}. ~233k videos ÷ this = days for a full re-check cycle."
|
|
},
|
|
"dot": {
|
|
"running": "running now",
|
|
"ok": "OK",
|
|
"idle": "no run recorded yet",
|
|
"error": "failed",
|
|
"skipped": "skipped (sync paused)",
|
|
"interrupted": "interrupted (the server restarted)"
|
|
},
|
|
"jobDesc": {
|
|
"rss_poll": "Checks each channel's RSS feed for new uploads (free, no quota). If it stops, new videos only appear later when a backfill pass catches them, so your Feed lags behind YouTube.",
|
|
"enrich": "Fetches video details (duration, views, live/Shorts flags) and re-checks live videos until they end. If it stops, videos stay without a duration/stats and ended livestreams stay stuck as “live”.",
|
|
"backfill": "Pulls in recent uploads, then the full back-catalogue for opted-in channels, within the shared quota. If it stops, older videos and full history don't fill in.",
|
|
"autotag": "Detects each channel's language/topics and applies automatic tags. If it stops, new channels get no auto tags, so language/topic filters miss them.",
|
|
"shorts": "Probes youtube.com/shorts to mark which videos are Shorts, then marks watched the videos a Google Takeout import was waiting on. If it stops, Shorts aren't separated from normal videos in the Feed, and those videos keep waiting.",
|
|
"subscriptions": "Re-imports every user's YouTube subscriptions. If it stops, channels subscribed to or dropped on YouTube aren't reflected here.",
|
|
"playlist_sync": "Mirrors each user's YouTube playlists into the app. If it stops, changes to your YouTube playlists don't show up locally.",
|
|
"maintenance": "Finds videos that can no longer be played (deleted, made private, abandoned premieres), hides them from the Feed and removes them after a grace period; re-checks the least-recently-checked videos. If it stops, dead videos linger in the catalogue.",
|
|
"explore_cleanup": "Removes channels you explored but never subscribed to (and their videos) after a grace period, so curiosity browsing doesn't pile up in the catalogue. If it stops, abandoned explored channels linger.",
|
|
"download_gc": "Deletes downloaded files past their retention window, reclaims space no one is holding anymore, and warns owners before a shared file or an API token expires. If it stops, old downloads pile up, disk space isn't freed, and a token runs out unannounced.",
|
|
"plex_sync": "Mirrors the enabled Plex libraries into the app's catalogue — the metadata behind Plex browsing, search, filters and the info pages (genres, cast, ratings, artwork). If it stops, newly added or changed Plex titles don't appear until the next sync.",
|
|
"plex_watch_sync": "Pulls recent Plex watch changes (finished episodes, resume positions) into Siftlode and re-pushes any local watch changes that didn't reach Plex. The cheap two-way keep-in-sync between full reconciles. If it stops, watched/resume made in the Plex app takes longer to show here.",
|
|
"plex_watch_reconcile": "A full watch-state reconcile that rescans every library — catches what the incremental pass can't, notably an episode un-marked as watched on the Plex side. Heavier, so it runs about once a day. If it stops, un-watches done in Plex aren't mirrored back.",
|
|
"audit_gc": "Prunes admin action entries, background-run history and YouTube quota history older than their retention windows (Configuration → Activity, Quota). If it stops, all three just keep growing — harmless but unbounded.",
|
|
"log_gc": "Deletes stored log events older than the retention window (Configuration → Diagnostics). Runs hourly so nothing outlives the promised limit by more than an hour.",
|
|
"tmdb_enrich": "Enriches the mirrored Plex catalogue from TMDB (keywords, crew, budget/revenue, TMDb score, recommendations, artwork), matched by each title's canonical id and served from the app's own database. Optional — a no-op until a TMDB API key is set. If it stops, new Plex titles just miss their TMDB extras until it runs again.",
|
|
"people_enrich": "Makes the people in the Plex library local: fetches each person's biography from TMDB and caches their portrait, resized through Plex, the most-credited people first. A person page and a cast strip then open from the app's own data. The TMDB half does nothing without a TMDB API key, the portrait half nothing without Plex. If it stops, a person page fetches its own bio when opened, a moment later.",
|
|
"channel_backfill": "Turning on full history for a channel fetches its whole back-catalogue at once, as its own run. The Backfill job finishes what this one could not (a very large channel, low quota, or two of these already running).",
|
|
"takeout_import": "A user's Google Takeout import: what they watched on YouTube becomes watched here (not Shorts, never over a state they set here), and their YouTube Watch later list joins theirs. A video the catalogue does not know yet waits, and is marked once it arrives."
|
|
},
|
|
"jobs": {
|
|
"rss_poll": "RSS poll (new uploads)",
|
|
"enrich": "Enrichment + live refresh",
|
|
"backfill": "Backfill (recent + full history)",
|
|
"autotag": "Auto-tagging",
|
|
"shorts": "Shorts classification",
|
|
"subscriptions": "Subscription sync from YouTube",
|
|
"playlist_sync": "Playlist sync from YouTube",
|
|
"maintenance": "Maintenance + validation",
|
|
"explore_cleanup": "Explored-channel cleanup",
|
|
"download_gc": "Download cleanup",
|
|
"plex_sync": "Plex library sync",
|
|
"plex_watch_sync": "Plex watch sync (incremental)",
|
|
"plex_watch_reconcile": "Plex watch reconcile (full)",
|
|
"tmdb_enrich": "TMDB enrichment (Plex)",
|
|
"audit_gc": "Activity and quota-history cleanup",
|
|
"log_gc": "Log cleanup",
|
|
"people_enrich": "People details and portraits (Plex)",
|
|
"channel_backfill": "A channel's full history",
|
|
"takeout_import": "Google Takeout import"
|
|
},
|
|
"queue": {
|
|
"recentPending": "Channels to sync",
|
|
"recentPendingHint": "Channels whose recent uploads haven't been fetched yet.",
|
|
"deepPending": "Full-history pending",
|
|
"deepPendingHint": "Channels opted into full-history backfill that aren't finished yet.",
|
|
"enrichPending": "Videos to enrich",
|
|
"enrichPendingHint": "Videos awaiting details (duration, stats, live/short classification).",
|
|
"shortsPending": "Shorts to classify",
|
|
"shortsPendingHint": "Enriched videos still awaiting the Shorts probe.",
|
|
"liveRefresh": "Live to refresh",
|
|
"liveRefreshHint": "Live/upcoming videos (and just-ended streams without a duration yet) re-checked until they settle."
|
|
},
|
|
"purgeDiscovery": "Purge discovery",
|
|
"purgeDiscoveryHint": "Delete all un-kept discovery content now (search results nobody watched/saved, and explored-but-unsubscribed channels) — ignoring the grace period.",
|
|
"purgeConfirmTitle": "Purge discovery content?",
|
|
"purgedDiscovery_one": "Deleted {{count}} discovery item",
|
|
"purgedDiscovery_other": "Deleted {{count}} discovery items",
|
|
"result": {
|
|
"new": "new videos",
|
|
"failed": "failed",
|
|
"fallback": "read through the API",
|
|
"channels_processed": "channels processed",
|
|
"videos_added": "videos added",
|
|
"reconciled_full": "fully reconciled",
|
|
"reason": "reason",
|
|
"channels_tagged": "channels tagged",
|
|
"orphan_tags_removed": "orphan tags removed",
|
|
"probed": "checked",
|
|
"shorts": "Shorts",
|
|
"users": "users",
|
|
"playlists_synced": "playlists synced",
|
|
"rechecked": "rechecked",
|
|
"recovered": "recovered",
|
|
"deleted": "deleted",
|
|
"notified": "notified",
|
|
"revalidated": "revalidated",
|
|
"flagged": "flagged",
|
|
"skipped": "skipped",
|
|
"expired": "expired",
|
|
"videos_deleted": "videos deleted",
|
|
"channels_deleted": "channels deleted",
|
|
"search_videos_deleted": "search results deleted",
|
|
"warned": "warned",
|
|
"evicted": "evicted",
|
|
"reaped": "cleaned up",
|
|
"swept": "swept",
|
|
"tokens_warned": "tokens warned",
|
|
"libraries": "libraries",
|
|
"movies": "movies",
|
|
"shows": "shows",
|
|
"seasons": "seasons",
|
|
"episodes": "episodes",
|
|
"collections": "collections",
|
|
"overlaid": "HU overlay",
|
|
"pruned": "pruned",
|
|
"people_enriched": "people enriched",
|
|
"media_probed": "media probed",
|
|
"people_pruned": "people pruned",
|
|
"error": "error",
|
|
"links": "links",
|
|
"watched": "watched",
|
|
"in_progress": "in progress",
|
|
"repushed": "re-sent",
|
|
"movie_probes": "movie probes",
|
|
"applied": "applied",
|
|
"cleared": "cleared",
|
|
"scanned": "scanned",
|
|
"enriched": "enriched",
|
|
"countries_coded": "countries coded",
|
|
"sessions_closed": "sessions closed",
|
|
"sessions_reaped": "sessions cleaned up",
|
|
"quota_reaped": "quota history cleaned up",
|
|
"recent": "recent",
|
|
"deep": "deep",
|
|
"bios": "biographies",
|
|
"portraits": "portraits",
|
|
"cached": "cached",
|
|
"kept": "kept as set here",
|
|
"waiting": "waiting for their video",
|
|
"watch_later_added": "added to Watch later",
|
|
"watch_later_present": "already in Watch later",
|
|
"watch_later_missing": "no longer on YouTube",
|
|
"watch_later_waiting": "Watch later waiting",
|
|
"takeout_watched": "marked watched from Takeout",
|
|
"takeout_watch_later_added": "put into Watch later from Takeout",
|
|
"takeout_failed": "Takeout users left for the next run after an error"
|
|
},
|
|
"skip": {
|
|
"disabled": "disabled",
|
|
"PlexserverURLortokenisnotconfigured": "Plex server URL or token is not configured",
|
|
"tmdbapikeynotset": "TMDB API key not set",
|
|
"noserviceuser": "no service user",
|
|
"syncpaused": "sync paused",
|
|
"lowquota": "low quota",
|
|
"noreadscope": "no YouTube read access",
|
|
"busy": "another sync is running",
|
|
"channelbusy": "this channel is already being backfilled",
|
|
"atcapacity": "two full-history backfills are already running — the scheduler finishes this one",
|
|
"nothingtodo": "nothing left to fetch",
|
|
"nouser": "the account is gone"
|
|
},
|
|
"failure": {
|
|
"rss_all_failed_one": "The RSS feed did not answer for the one channel, {{channel}}: {{cause}}. Read through the API instead: {{read}}.",
|
|
"rss_all_failed_other": "The RSS feed answered for none of the {{total}} channels — the first: {{channel}}, {{cause}}. Read through the API instead: {{read}}.",
|
|
"unexpected": "The run ran into an unexpected error."
|
|
},
|
|
"rssCause": {
|
|
"http": "HTTP {{status}}",
|
|
"transport": "unreachable",
|
|
"apply": "could not be saved",
|
|
"error": "unexpected error"
|
|
},
|
|
"dotRun": "{{state}} · {{time}} · {{trigger}}",
|
|
"trigger": {
|
|
"scheduled": "on schedule",
|
|
"manual": "started by an admin",
|
|
"ad_hoc": "started by a user"
|
|
},
|
|
"interrupted": "interrupted: the server restarted during the run",
|
|
"adHocTitle": "Ad-hoc runs",
|
|
"adHocStarted": "started by a user",
|
|
"history": "This job's runs"
|
|
}
|