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>
Consolidates the manual deploy steps (env copy, install, prisma
generate/migrate deploy, build, pm2 startOrRestart+save) documented
in the README into a single scripts/deploy.sh run over SSH.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Passenger only manages the Next.js app process; the worker now gets
the same crash-recovery/auto-restart via pm2, replacing the cron-driven
PID-file restart hack. Updates README deployment steps accordingly.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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.
TypeScript 7's CommonJS export no longer populates ts.sys, which
ts-node's config loader depends on, breaking `npm run worker` with
a TypeError. tsx (esbuild-based) doesn't rely on that API and
natively resolves tsconfig.json path aliases, so tsconfig-paths is
also no longer needed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>
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>
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>
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>
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>
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>
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.
ts-jest peer-conflicts with typescript@7 and jest already uses @swc/jest as its transform, making ts-jest dead weight.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>
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>