Commit Graph
37 Commits
Author SHA1 Message Date
anthonyandClaude Sonnet 5 38e52374c9 feat: name downloaded file after the video title and add a back-to-home link
The download endpoint served files under their internal uuid-based
storage name; it now builds the Content-Disposition filename from the
probed video title (persisted on submit) with the original extension,
falling back to the old behavior when no title is available. The
status page also gets an always-visible link back to the homepage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 15:53:14 +02:00
anthony e23bd6b235 test: cover 4K format selector in buildYtdlpArgs 2026-08-11 15:19:02 +02:00
anthony 0d46a9a099 feat: add 4K and 2K quality tiers 2026-08-11 15:18:35 +02:00
anthonyandClaude Sonnet 5 f9f2934154 fix: hide quality selector when format is mp3
Quality/resolution options don't apply to audio-only output.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 15:05:58 +02:00
anthonyandClaude Sonnet 5 1f51ec7a2b docs: refresh CLAUDE.md and README with current project state, drop dead legacy pages
Both docs still described a frontend/-subfolder Vite/react-router-dom
setup that never existed in this repo's history, and were missing the
yt-dlp probe gating, SEO landing pages, sitemap, and 4-locale i18n
shipped in recent commits. Also removes src/app/page.tsx and
src/app/status/[uuid]/page.tsx, superseded by the [locale]-based
routes and unreachable since the next-intl middleware redirects all
non-API traffic into [locale]/...

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 15:02:37 +02:00
anthony 65f92abe7b feat: add Linux ffprobe and Windows ffmpeg/ffprobe binaries to bin/
yt-dlp needs ffprobe alongside ffmpeg for postprocessing; only ffmpeg was
bundled for the Linux/o2switch prod deploy. Also add Windows builds so
local dev on Windows has a working ffmpeg/ffprobe pair, and gitignore
.env.prod/.env.local so real deployment credentials never get committed.
2026-08-11 14:39:27 +02:00
anthonyandClaude Sonnet 5 27ba48d181 feat: gate download options on real-time yt-dlp video analysis
Options (quality, subtitles) are now derived from a yt-dlp -J probe of
the submitted URL instead of a static list, so users can't pick
combinations the source video doesn't actually support. Submission is
blocked until the probe succeeds.

- New /api/probe endpoint + src/lib/ytdlp-probe.ts, with its own rate
  limiter (rate-limit.ts refactored into a createRateLimiter factory).
- New options: subtitle language selection, clip start/end trim, MP3
  audio quality.
- Fixed buildYtdlpArgs: format=mp3 never triggered audio extraction
  (-x/--audio-format), and quality=best never applied --merge-output-format,
  so the chosen container had no real effect.
- Cross-platform yt-dlp invocation: the bundled bin/yt-dlp is a Python
  zipapp relying on a shebang, which Windows' spawn() can't run
  directly. buildYtdlpCommand() runs it through `python` on Windows and
  execs it directly on Linux/o2switch, where the shebang works natively.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 14:13:38 +02:00
anthonyandClaude Sonnet 5 1d27d22581 feat: add sitemap.xml generation and sitemap <link> tag
Add app/sitemap.ts covering the homepage, supported-sites page, and
all 15 per-platform downloader pages across every locale, with
hreflang alternates between locales. Reference it from <head> via
<link rel="sitemap"> in the locale layout.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 12:01:14 +02:00
anthonyandClaude Sonnet 5 fd7515f8c2 feat: make Ombrora logo in header link to homepage
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:58:06 +02:00
anthonyandClaude Sonnet 5 f1a2639866 feat: show full supported-platforms block on each downloader page
Replace the plain "looking for another platform?" text link at the
bottom of each per-platform page with the same SupportedPlatformsSection
used on the homepage, giving stronger internal linking between all
platform pages. Drop the now-unused otherPlatforms/browseAll strings.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:55:48 +02:00
anthonyandClaude Sonnet 5 948b77cef4 feat: add per-platform SEO landing pages (/youtube-downloader, etc.)
Create a dedicated, dynamically-routed page for each of 15 curated
platforms (YouTube, TikTok, Instagram, Facebook, X, Reddit, Pinterest,
Vimeo, SoundCloud, Twitch, Dailymotion, LinkedIn, Tumblr, VK, Snapchat)
under /[locale]/[slug], with a tailored hero, an example URL matched
to the platform, a unique "about" paragraph, and a mix of
platform-specific and shared FAQ items, all translated across
en/fr/es/it. Unknown slugs 404.

Kept the scope to a curated list rather than all 1380 yt-dlp
extractors to avoid thin/duplicate "doorway page" content that search
engines penalize.

The homepage's platform badges and the "+1000 sites" links now point
to these pages, extracted the FAQ accordion markup into a shared
FaqAccordion component reused by both the homepage FAQ and the new
platform pages.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:53:36 +02:00
anthonyandClaude Sonnet 5 bd863056a3 feat: add supported sites page, remove yt-dlp mentions from public copy
yt-dlp is an internal implementation detail and should not be exposed
on the public site. Replace direct mentions in the platforms and FAQ
sections with a link to a new /supported-sites page listing every
extractor from yt-dlp's supported-sites doc (searchable, grouped
alphabetically), translated across en/fr/es/it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:36:29 +02:00
anthonyandClaude Sonnet 5 c8e991a8f7 feat: add how-it-works, supported platforms and FAQ sections to homepage
Enrich the landing page with reassurance/trust content inspired by
competitor downloader sites: a 3-step "how it works" guide, a
supported-platforms grid with a non-affiliation disclaimer, and an
8-question FAQ (with FAQPage JSON-LD) -- all translated across en/fr/es/it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 11:24:00 +02:00
anthony 1963521818 feat: redesign language switcher as dropdown, add cursor pointers
Replace flag-row selector with a dropdown to fix distorted flag icons
and remove the colored ring border. Add cursor-pointer to the language
menu and download submit button.
2026-08-11 10:51:53 +02:00
anthony 74fca57f4c fix: rename middleware.ts to proxy.ts
The middleware file convention is deprecated in this Next.js version in favor of proxy.
2026-08-11 09:38:42 +02:00
anthony e39a8c0fc0 feat: add PostHog analytics tracking script
Injects PostHog init script in the locale layout head so it loads on every page.
2026-08-11 09:23:01 +02:00
anthony f6dc3801c6 feat: restyle StatusView and status page with Tailwind 2026-08-11 09:02:32 +02:00
anthony 3f499177b6 feat: add hero section and reassurance grid to home page 2026-08-11 09:01:18 +02:00
anthony f3da96ee15 feat: add ReassuranceSection with 4 benefit cards 2026-08-11 09:01:01 +02:00
anthony 29547d1acd feat: restyle SubmitForm with Tailwind, inline button, and violet glow 2026-08-11 09:00:34 +02:00
anthony efe6515fc9 feat: update locale layout with Inter font, ThemeProvider, SEO metadata, JSON-LD, Header, and footer 2026-08-11 09:00:01 +02:00
anthony 6e7ee816ad feat: add Header component with logo, theme toggle, and language switcher 2026-08-11 08:59:32 +02:00
anthony 10a06495d8 feat: replace emoji flags with SVG flag images in LanguageSwitcher 2026-08-11 08:59:16 +02:00
anthony 3994d32d35 feat: add ThemeToggle component with next-themes 2026-08-11 08:58:58 +02:00
anthony 29ae2d3650 feat: install Tailwind CSS v4 with PostCSS 2026-08-11 08:49:43 +02:00
anthonyandClaude Sonnet 4.6 83a67928da docs: add minimalist UI design spec
Covers Tailwind CSS setup, dark mode via next-themes, flag image language
switcher, SEO metadata + JSON-LD, and full layout for home and status pages.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-10 15:48:33 +02:00
anthony e7af883953 feat: translate SubmitForm and StatusView with next-intl 2026-08-10 15:35:21 +02:00
anthony a89095b5c4 feat: restructure routes under [locale], add LanguageSwitcher 2026-08-10 15:34:34 +02:00
anthony 9ea9f4f5f1 feat: add locale-detection middleware 2026-08-10 15:32:38 +02:00
anthony 0a75aba78b feat: install next-intl and set up i18n routing config 2026-08-10 15:32:11 +02:00
anthonyandClaude Sonnet 4.6 01b67bb81c feat: bundle yt-dlp and ffmpeg Linux binaries in bin/
Adds precompiled Linux x86_64 binaries for yt-dlp and ffmpeg under bin/.
The processor resolves yt-dlp from bin/ when present, falling back to PATH.
ffmpeg is passed via --ffmpeg-location so yt-dlp uses the bundled binary on o2switch.
BIN_DIR is configurable via env var.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-10 15:13:23 +02:00
anthony 612459a4ec feat: add submission form and status page 2026-08-10 14:51:20 +02:00
anthony f21089cf76 feat: add API routes (POST /downloads, GET /downloads/[uuid], GET /download/[token]) 2026-08-10 14:40:44 +02:00
anthony ab9235fe57 feat: add yt-dlp argument builder 2026-08-10 14:31:43 +02:00
anthony 4766bb3a18 feat: add token create/validate utilities 2026-08-10 14:29:43 +02:00
anthony 3feb336bb0 feat: add IP-based rate limiter (swc/jest replaces ts-jest for TS7 compat) 2026-08-10 14:28:13 +02:00
anthony 28159d0a4a chore: add config, prisma schema and client (Prisma 7 adapter) 2026-08-10 14:23:31 +02:00