Skip to content

Repository files navigation

vot-mpv — голосовий переклад YouTube в mpv

Переклад англомовних YouTube відео на російську мову прямо в mpv. Використовує Яндекс Translation API через Cloudflare воркер vot-worker.eu.cc.


Встановлення

Залежності:

sudo pacman -S nodejs yt-dlp mpv fzf

Встановлення:

git clone https://github.com/MultiUpGame/vot-mpv ~/.local/share/vot-mpv
cd ~/.local/share/vot-mpv
bash install.sh

Файли системи

~/.local/share/vot-mpv/
├── vot-translate.js        # Node.js скрипт перекладу (серце системи)
├── vot-cli.js              # CLI менеджер бібліотеки
├── vot.lua                 # Lua скрипт для mpv
├── integrations/
│   ├── ytv                 # YouTube пошук + інтеграція з бібліотекою
│   └── ytv-fmt             # Допоміжний форматер для ytv
├── node_modules/           # npm пакети (@vot.js/node)
└── library.json            # Бібліотека відео (створюється автоматично)

~/.config/mpv/scripts/
└── vot.lua                 # (копія, завантажується mpv)

~/.config/mpv/script-opts/
└── vot.conf                # налаштування

~/.cache/vot/
└── <videoId>.mp3           # кеш перекладів (7 днів)

~/Videos/vot/
└── Назва відео [videoId].webm  # скачані відео

Використання

Переклад в mpv (як і раніше)

mpv 'https://www.youtube.com/watch?v=...'

Натисни Ctrl+T — вмикає/вимикає переклад. Якщо переклад вже є в кеші — починається миттєво. OSD показує джерело: [кеш] або [сервер].

Працює і для локальних файлів скачаних через vot download — скрипт витягує videoId з назви файлу і бере переклад з кешу.


vot — менеджер бібліотеки

vot add <url> [url2...]      Додати відео (можна кілька одразу, назва + thumbnail автоматично)
vot add --file <шлях>        Додати всі URL з текстового файлу (по одному на рядок, # ігнорується)
vot add-playlist <url>       Додати всі відео з плейлісту
vot list                     Показати всі відео зі статусами
vot pick                     fzf з thumbnails → відкрити в mpv
vot play <id> [quality]      Відкрити в mpv (quality: 480/720/1080/2160/best)
vot fetch <id>               Завантажити переклад для одного відео
vot fetch --all              Завантажити переклади для всіх (макс 5хв/відео)
vot download <id> [q]        Скачати відео (меню якості або вкажи q)
vot remove <id>              Видалити все: бібліотека + відео + переклад + thumbnail
vot remove-video <id>        Видалити тільки відео файл (залишити в бібліотеці)
vot remove-translation <id>  Видалити тільки переклад (щоб перескачати)
vot clean                    Видалити переклади і thumbnails без запису в бібліотеці
vot sync-thumbs              Завантажити thumbnails для всіх відео без них
vot status                   Статистика бібліотеки і місце на диску
vot update                   Оновити vot-mpv (git pull + переінсталяція)

vot pick — керування прямо в списку:

Клавіша Дія
Enter Відкрити в mpv
Ctrl+D Видалити все (бібліотека + відео + переклад + thumbnail)
Ctrl+X Скачати відео якщо нема / видалити якщо є
Ctrl+R Скачати переклад якщо нема / видалити якщо є

Список оновлюється одразу після дії. Thumbnail відображається справа.

Іконки:

  🌐 онлайн  💾 локальне відео  ✓ переклад є  ✗ провал  — немає

Якщо відео скачано — переклад зберігається назавжди (без 7-денного ліміту).


ytv — пошук YouTube з інтеграцією бібліотеки

ytv hyprland tutorial   # пошук
ytv                     # показати історію пошуку

Відкриває fzf зі списком результатів:

★  18:27  saneAspect            Hyprland - Best Tiling WM in 2025
   45:12  typecraft              Hyprland Complete Config Guide
★  32:05  Dreams of Code         Hyprland Dotfiles from Scratch

— вже є в бібліотеці.

Клавіша Дія
Enter Відкрити відео в mpv
Ctrl+A Додати в бібліотеку (залишається в fzf, ★ з'являється)
Ctrl+L Змінити ліміт результатів (зберігається в vot.conf)
Ctrl+U Оновити результати з мережі (ігнорує кеш)
Esc Вийти

Налаштування (vot.conf)

~/.config/mpv/script-opts/vot.conf:

language=ru          # мова озвучки перекладу (ru / en / kk)
autoTranslate=yes    # автоматично перекладати при відкритті відео (yes/no)
skipLangs=ru         # НЕ перекладати відео цими мовами (через кому: ru,en)
quality=1080         # якість для перегляду і скачування (480/720/1080/2160/best)
search_limit=20      # кількість результатів у ytv (змінюється через Ctrl+L в пошуку)
vot_bin=/usr/bin/node
vot_script=/home/multi-man/.local/share/vot-mpv/vot-translate.js

Підтримувані мови:

Параметр Значення
language (озвучка) ru, en, kk — більше Яндекс не підтримує
Вхідна мова відео визначається автоматично: en, zh, ko, de, fr, es, it, ja, ar та інші

skipLangs=ru — дефолт, щоб не перекладати російські відео на російську. Додай будь-які інші коди якщо хочеш пропускати: skipLangs=ru,uk,de

Українська озвучка недоступна — Яндекс її не має в TTS.

quality використовується як дефолт для vot play, vot pick, vot download і ytv. vot download завжди показує меню вибору, але підсвічує дефолт з конфігу.

Якщо відео гальмує або десинхронізується — додай у ~/.config/mpv/mpv.conf:

hwdec=auto

Вмикає апаратне декодування (VA-API/VDPAU). Особливо важливо для 4K/AV1.


Як це працює

Переклад

  1. Ctrl+Tvot.lua запускає vot-translate.js <url> /tmp/vot_xxx.mp3
  2. Скрипт перевіряє ~/.cache/vot/<videoId>.mp3 — якщо є і свіжіше 7 днів, повертає одразу
  3. Інакше — запит до vot-worker.eu.cc (Cloudflare проксі до Яндекса)
  4. Яндекс повертає URL аудіо на S3 → замінюється на audio-proxy воркера
  5. URL передається в mpv одразу (стрімінг), паралельно фоновий процес зберігає MP3 в кеш

Чому через воркер, а не напряму

Яндекс заблокований в Україні на рівні DNS і IP. vot-worker.eu.cc — Cloudflare Workers проксі, його IP не заблокований.

Локальні файли

vot.lua витягує videoId з назви файлу формату Назва [videoId].webm і конструює YouTube URL для пошуку перекладу в кеші.

Чому деякі відео не перекладаються

YouTube заблокований в Росії з серпня 2024. Яндекс не може завантажити нові відео. Працюють тільки відео що вже є в кеші Яндекса (перекладались раніше через браузерне розширення).

IPv6 проблема в Node.js

Node.js за замовчуванням пробує IPv6 першим — таймаут ~3с перед IPv4. Вирішення: require("dns").setDefaultResultOrder("ipv4first") + власна fetchFn з таймаутом 15с.


Залежності

Пакет Для чого
nodejs запуск vot-translate.js
yt-dlp тривалість відео + пошук (ytv) + скачування
mpv відтворення
fzf інтерактивний вибір в vot pick і ytv
@vot.js/node VOT API клієнт (npm, в node_modules/)

About

YouTube voice-over translation for mpv

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages