Skip to content

feat: ingest public X videos - #11

Merged
fUS1ONd merged 3 commits into
devfrom
plan/x-video-ingestion
Jul 24, 2026
Merged

feat: ingest public X videos#11
fUS1ONd merged 3 commits into
devfrom
plan/x-video-ingestion

Conversation

@fUS1ONd

@fUS1ONd fUS1ONd commented Jul 24, 2026

Copy link
Copy Markdown
Collaborator

Что изменено

  • Добавлена явная классификация URL для YouTube, X (x.com/twitter.com) и generic HTTP(S).
  • Для публичных X-постов реализован GraphQL metadata-preflight с единственным fallback на syndication; после выбора backend видео скачивается ровно один раз.
  • YouTube cookies, Deno и EJS больше не передаются в X/generic профили.
  • Добавлена настройка VIDEO_TARGET_RESOLUTION=144..4320|best с ориентационно-независимой сортировкой форматов.
  • Результат yt-dlp валидируется через единственный after_move:filepath в изолированном каталоге и сохраняет реальное расширение.
  • Добавлены типизированные и санитизированные ошибки media ingest без изменения публичного ErrorCode/API-контракта.
  • Закреплены yt-dlp[default]==2026.7.4, yt-dlp-ejs 0.8.0 и Deno 2.9.3; удалён плавающий runtime-upgrade yt-dlp.
  • Обновлены env-примеры, README, план реализации и тесты.

Зачем

Существующий selector height<=720 ограничивал физическую высоту кадра. Из-за этого portrait-видео уровня 720p могло деградировать до 320x568. Кроме того, все URL ошибочно использовали YouTube cookies и JS-компоненты, а фиксированное имя video.mp4 не позволяло надёжно проверить итоговый output yt-dlp.

Новая политика использует res:720 как мягкую ориентационно-независимую цель: для landscape выбирается 1280x720, для portrait — 720x1280; best выбирает максимальное качество.

Пользовательский эффект

Публичные видео X теперь можно передавать через существующее поле video_url. Для поста с несколькими видео по умолчанию выбирается первое вложение; /video/N сохраняет явный выбор. Закрытые и требующие авторизации X-посты намеренно не поддерживаются.

Wire-контракт POST /tasks, БД, usage и webhook не менялись.

Проверки

  • ruff check .
  • ruff format --check .
  • OpenAPI export без diff
  • полный suite внутри runtime-образа: 477 passed
  • hermetic yt-dlp format matrix для landscape, portrait, larger fallback и best
  • live metadata-smoke на https://x.com/i/status/2078106556634124335: выбран http-2176 | 1280x720 | https, без cookies
  • runtime smoke: yt-dlp 2026.07.04, yt-dlp-ejs 0.8.0, Deno 2.9.3, FFmpeg 7.1.5

Тестовый Docker-образ после проверок удалён.

@fUS1ONd
fUS1ONd force-pushed the plan/x-video-ingestion branch from 2645a18 to 3d9a94c Compare July 24, 2026 13:38
# Conflicts:
#	lecturelog/config/settings.py
@fUS1ONd
fUS1ONd marked this pull request as ready for review July 24, 2026 13:47
@fUS1ONd
fUS1ONd merged commit 817cd9a into dev Jul 24, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant