Spaces:
Sleeping
Sleeping
Commit History
-
Search: direct scrape as primary tier, Piped as fallback
Discovery and engagement scoring are now separate concerns, because they fail independently. Discovery is tiered, first tier with results wins: direct scrape -> Piped -> Data API search.list -> yt-dlp ytsearch. The scrape runs in-process, so it depends on no third party, costs no API quota, honours YT_PROXY (residential egress), and yields view count + duration straight from YouTube. Piped keeps its instance failover and remains the fallback. Engagement metrics (likes/dislikes/subscribers/comments) are attached from Piped to whichever tier produced the candidates, so scrape-first does not lose the normalized weighted ranking. When Piped is unreachable, search still succeeds and ranking falls through to the sentiment stage as before. Enrichment is deliberately impatient: 3 instances max on a 6s timeout, abandoned on the first unreachable candidate, plus a 15-minute TTL cache on the instance list. Without those bounds a dead Piped cost 52.8s per search; now 4.1s cold, 2.6s warm. Als…a88e258
-
Enforce monthly request cap (12000/mo plan) via RapidAPI quota headers; optional MONTHLY_DOWNLOAD_LIMIT self-cap; show quota in health check
Verified signature4cf533e -
Download video via RapidAPI (own-CDN) -> faster-whisper transcript + local screenshots -> delete; retire proxies
Verified signatured790783 -
Download video via RapidAPI (own-CDN) -> faster-whisper transcript + local screenshots -> delete; retire proxies
Verified signaturebcfee56 -
Download video via RapidAPI (own-CDN) -> faster-whisper transcript + local screenshots -> delete; retire proxies
Verified signature0fe3056 -
Transcript via transcriptapi.com (no proxy) as primary; youtube-transcript-api fallback
Verified signature23f7291 -
Video search via Piped API with normalized engagement ranking + instance failover; Data API/yt-dlp fallback
Verified signaturee698ddd
-
Per-user residential proxy: proxy URL field + downloadable Home Proxy Panel
- app.py: new per-request 'Your proxy URL' field (overrides YT_PROXY secret) threaded through run_pipeline/check_access; intro links the Home Proxy Panel GitHub repo. Merged onto the current media-proxy/probe-battery app. - pipeline/transcribe.py: redact proxy credentials from error hints. - tools/home_proxy_panel.py: end-user flow (Copy my Proxy URL), bore auto-download, frozen (--run-proxy) PyInstaller support. - tools/home_proxy_panel.spec + build_panel.md: standalone executable build. - README + tools/README: how to compile + use the residential proxy with this Space (repo: github.com/vivekchakraverty/tutorialmaker-home-proxy-panel). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>12e4183 -
Add 'what the content must cover' brief text area; screenshots stay optional
Verified signature21ba408 -
Screenshots: 2-phase (HTTPS-proxy resolve + plain media-proxy chunked download + local ffmpeg)
Verified signatureba80657 -
Screenshots via yt-dlp clip download over HTTPS proxy (ffmpeg local); trust proxy CA for yt-dlp
Verified signature6e9f89d
-
Transcript: detect IP-block (SSL/EOF) + retry; expose module-level demo
- youtube-transcript-api hits www.youtube.com, which datacenter IPs get blocked from (TLS reset / SSL EOF). Retry transient connection failures and, on a clear block, the error now tells the user to set the YT_PROXY (residential) secret. Fixed a substring bug where "transcripts" matched the "ip" block keyword. - app.py exposes module-level `demo` so HF's SSR launcher stops warning "Launching demo not found in __main__". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>ffdac8f -
Re-architect: API-based acquisition, no download; ffmpeg -ss screenshots
- Comments via YouTube Data API v3 (key in UI or YOUTUBE_API_KEY secret) instead of yt-dlp scraping; sentiment ranking unchanged - Transcript via youtube-transcript-api (already timestamped) instead of faster-whisper - Screenshots without downloading: yt-dlp resolves a stream URL, ffmpeg -ss grabs one frame per weighted timestamp (sharpest of 3); falls back to text-only if blocked - Remove the whole YouTube-access section (cookies/proxy/PO-token UI) and the browser extension; thin fallback kept via optional YT_COOKIES / YT_PROXY secrets - Drop faster-whisper + full video download; add youtube-transcript-api + numpy - gitignore cookies.txt; README rewritten for the new architecture Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>f07812e -
Add PO-token support (manual PO token + visitor data) with README guide
- download + comment-fetch accept po_token/visitor_data and inject them into yt-dlp extractor_args; when a PO token is present, web-family player clients are tried so the token applies - UI: PO token + visitor data fields in the "YouTube access" panel, with a pointer to the README's PO-token guide; operator secrets YT_POT / YT_VISITOR_DATA as shared defaults - README: step-by-step manual PO-token + visitor-data extraction guide, automated (bgutil) note, and a link to the official yt-dlp PO Token Guide - Block-error hint now suggests the PO-token route Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>dc57844 -
Add per-user cookies + proxy for YouTube access (UI fields + operator secrets)
A hosted Space can't read a visitor's browser cookies, so make access explicit and self-serve: - UI: "YouTube access" panel with a cookies box (raw cookies.txt or base64) and a proxy URL box, used only for that run; throwaway-account warning included - Fall back to operator-wide YT_COOKIES / YT_PROXY secrets when the UI fields are empty - Thread proxy through download + comment-fetching; add player-client fallbacks (default/android/tv/web_safari) for best-effort access without cookies - Honest caveat in UI + README: free datacenter proxies (e.g. Webshare free tier) usually do NOT bypass YouTube's block Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>401a193 -
Replace keyword density with primary/secondary keyword placement + AEO structure
- UI: primary keyword + secondary keywords (comma-separated) instead of density inputs - LLM prompt: use primary ~3x in body and place it in title/slug/meta/first-100-words of intro and 1-2 H2 headings; each secondary keyword once - AEO best practices (from GameMaster citation guide): answer-first "Quick answer" block, descriptive title + meta description + URL slug, H2 step headings, FAQ section, and a sources/last-updated trust footer - docx_builder renders the new structure; tutorial JSON gains slug/meta_description/answer/faqs - Add count_keyword() and surface the primary-keyword count in the run status Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>01abd01 -
Fix Gradio 6 Textbox error and add SEO keyword-density controls
- Remove show_copy_button (unsupported by Textbox in Gradio 6.x) that crashed startup - Add three keyword + density% inputs; instruct the tutorial LLM to weave them in at the target keyword density, leaning toward under-use rather than keyword stuffing Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>01fb241 -
Add YouTube -> tutorial .docx pipeline (Gradio Space)
Search top videos, rank by comment sentiment, transcribe the best with faster-whisper, generate tutorial text with DeepSeek-V3, pick screenshots via a weighted LLM/Whisper-timing indicator, caption them with a vision model, and assemble a .docx. Downloaded video is auto-deleted after frame extraction. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>f6a6455