Delete the four obsolete local transcript methods, their six helper
methods, the YouTubeConfig interface, and the now-unused statics. The
iOS player method added earlier is the sole local fallback.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
fetchTranscript now uses a three-rung ladder (ScrapeCreators, iOS
player, Supadata). getVideoMetadata is sourced from the iOS player
response instead of the watch-page HTML scrape.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add fetchIosPlayerData and fetchViaIosPlayer, built from the YouTube
iOS player approach. Not yet wired into the fallback ladder.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Fallow dead-code analysis flagged 13 issues. Removed the 10 that are
genuinely unreferenced:
- LLMFactory.getBestProvider, LLMFactory.updateSettings
- GeminiClient.isAvailable, OllamaClient.isAvailable
- ProcessingSpinner.setLabel, plus the now-dead callCount field and its
'#N' suffix in the spinner text (setLabel was callCount's only writer,
so the counter had been stuck at 0 already)
- YouTubeTranscriptExtractor.fetchTranscriptSegments, combineTranscript,
clearConfigCache, parseJsonCaptions
- dropped the unused 'export' on the CaptionTrack interface (still used
locally in the file, just never imported elsewhere)
Kept OllamaClient.validateConnection and createChatCompletion: fallow
flagged them, but transcript-summarizer.ts calls them via a loosely
typed 'client' variable that fallow cannot statically resolve.
Build and lint pass clean.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bump eslint-plugin-obsidianmd 0.2.9 -> 0.3.0 and typescript-eslint
8.58.2 -> 8.59.3. ESLint stays at 9.39.4: obsidianmd 0.3.0 peer-pins
@eslint/js ^9 and @eslint/json 0.14.0, so ESLint 10 is not yet
cleanly supported.
obsidianmd 0.3.0 adds two new rules. Fixes for the errors they raise:
- no-unnecessary-type-assertion: remove 4 redundant type assertions
(main.ts x3, fetch-shim.ts x1) - all compile-time-only, tsc confirms.
- prefer-window-timers: switch 11 activeWindow timer calls to window
(main.ts, form-utils.ts, processing-spinner.ts). TubeSage has no
popout-window feature, so window === activeWindow at every call site.
Note: obsidianmd 0.3.0's prefer-active-doc rule (warning) now flags
window.* as preferring activeWindow, directly contradicting the
error-level prefer-window-timers rule. window.* is kept because it
satisfies the error-level rule; the 11 advisory warnings are an
upstream rule conflict and cannot be resolved without suppression.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
OpenRouter exposes an OpenAI-compatible Chat Completions API, so reuse the
existing @langchain/openai ChatOpenAI client with a custom baseURL —
no new SDK required. The obsidianFetch shim continues to apply through
getLangChainConfiguration, preserving cross-platform (mobile) support.
Changes:
- model-limits-registry: add 'openrouter' to Provider union; seed registry
with curated namespaced models (openai/gpt-4o, anthropic/claude-3.5-sonnet,
google/gemini-2.5-flash, meta-llama/llama-3.1-70b-instruct, etc.)
- langchain-client: new 'openrouter' switch case mirroring the OpenAI path
but routing to https://openrouter.ai/api/v1 with the recommended
HTTP-Referer and X-Title attribution headers
- main.ts: wire openrouter into DEFAULT_SETTINGS (apiKey, selectedModel,
fetchedModels), getModelForProvider fallback, provider dropdown, and the
providerCatalog UI block with the same shape as the other providers
Both the summary pass and the timestamp-linking pass dispatch through the
same LangChainClient, so OpenRouter is available for both automatically.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root cause: for 2hr+ transcripts, the Gemini API returns a server-side
DEADLINE_EXCEEDED (504) — not a client-side timeout. The error was being
categorised as a generic timeout and the message told the user to "try again",
which is misleading since retrying the same large transcript will fail again.
Changes:
- error-utils: catch DEADLINE_EXCEEDED/deadline exceeded as Timeout category
- error-utils: replace "try again" timeout message with actionable advice
(try shorter video, reduce max tokens, or switch model)
- gemini-client: log full error body for easier debugging; surface gRPC
status code in error message; throw DEADLINE_EXCEEDED prefix on 504 so
upstream categorisation is unambiguous
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Collapsed history snapshot — represents the cumulative state of TubeSage
through 1.2.21. Earlier commit history (covering versions 1.2.0 through
1.2.20) was rewritten into this single root commit to remove tracking
of a personal deploy script that referenced local filesystem paths.
The current release content is unchanged. See manifest.json for the
plugin version. Older tags (1.2.0 through 1.2.20) have been retired.
Features in this release line:
- YouTube transcript extraction (ScrapeCreators API + local fallbacks)
- LLM-driven summarisation (OpenAI, Anthropic, Google, Ollama)
- Per-provider always-visible API key rows
- Selected-provider model controls with registry-aware overrides
- Custom-model parameter overrides with synchronous panel refresh
- Max tokens field with blur-commit and reset-on-blank
- Settings de-pollution migration on plugin load
- Summary-callout split for multi-section model output
- Security patches: fast-xml-parser >=5.7.0, uuid >=14.0.0