CLI to download and sync subtitles for video files using semantic embeddings + DTW
Project description
subs_down_n_sync
CLI Python para baixar e sincronizar legendas para arquivos de vídeo. Idioma padrão: pt-BR, configurável via flag --lang (qualquer tag BCP 47).
A sincronização usa embeddings semânticos multilíngues (sentence-transformers, modelo paraphrase-multilingual-MiniLM-L12-v2) combinados com DTW: baixa uma legenda EN de referência e alinha os cues da legenda alvo aos timestamps da referência por similaridade semântica. Legendas com match exato (hash ou release group) são usadas sem sincronização.
Instalação
pip install subs-down-n-sync
Instale também o ffmpeg:
sudo apt install ffmpeg # Debian/Ubuntu
brew install ffmpeg # macOS
winget install Gyan.FFmpeg # Windows
Configure as credenciais do OpenSubtitles:
export OPENSUBTITLES_USERNAME="seu_usuario"
export OPENSUBTITLES_PASSWORD="sua_senha"
Para desenvolvimento, veja Setup.
Setup
Linux/macOS:
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
Windows (PowerShell):
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ".[dev]"
Windows (cmd.exe):
python -m venv .venv
.venv\Scripts\activate.bat
pip install -e ".[dev]"
Instale também o ffmpeg no sistema:
sudo apt install ffmpeg # Debian/Ubuntu
brew install ffmpeg # macOS
winget install Gyan.FFmpeg # Windows (winget)
choco install ffmpeg # Windows (Chocolatey)
scoop install ffmpeg # Windows (Scoop)
Confirme que ffmpeg está no PATH rodando ffmpeg -version em novo terminal.
Configuração (uma única vez)
Linux/macOS:
export OPENSUBTITLES_USERNAME="seu_usuario"
export OPENSUBTITLES_PASSWORD="sua_senha"
Windows (PowerShell, sessão atual):
$env:OPENSUBTITLES_USERNAME = "seu_usuario"
$env:OPENSUBTITLES_PASSWORD = "sua_senha"
Windows (persistente, próximas sessões):
setx OPENSUBTITLES_USERNAME "seu_usuario"
setx OPENSUBTITLES_PASSWORD "sua_senha"
Uso
# Default: pt-BR
subs-down-n-sync /caminho/para/filme.mkv
# Outro idioma (BCP 47: 'en', 'pt-BR', 'en-US', 'es', 'ja', ...)
subs-down-n-sync /caminho/para/filme.mkv --lang en
subs-down-n-sync /caminho/para/filme.mkv -l es
# Processar diretório inteiro (busca vídeos recursivamente)
subs-down-n-sync /caminho/para/pasta/
subs-down-n-sync /caminho/para/pasta/ --lang en
subs-down-n-sync /caminho/para/pasta/ --overwrite # sobrescreve legendas existentes
subs-down-n-sync /caminho/para/pasta/ --parallel # processa até 2 vídeos simultâneos
# Ou via módulo Python
python -m subs_down_n_sync /caminho/para/filme.mkv
Ao passar um diretório, vídeos que já têm legenda (<video>.<lang>.srt) são pulados por padrão. Use --overwrite / -o para reprocessar. Use --parallel / -p para processar até 2 vídeos em paralelo.
Saída: /caminho/para/filme.<lang>.srt (ex.: filme.pt-BR.srt, filme.en.srt). Isso permite manter legendas do mesmo vídeo em idiomas diferentes sem sobrescrever.
Desenvolvimento
pip install -e ".[dev]"
pytest
Os testes unitários rodam com gate de cobertura de 90% (configurado em pyproject.toml). O CI falha se a cobertura cair abaixo disso.
Para rodar sem o gate (útil ao explorar com -k ou --collect-only):
pytest --no-cov
Lint e formatação
O projeto usa Ruff para formatação e lint.
ruff format . # aplica formatação
ruff format --check . # verifica sem escrever (usado no CI)
ruff check . # roda lint
ruff check --fix . # aplica fixes automáticos
O CI falha se ruff format --check ou ruff check encontrarem problemas.
Testes de integração
O projeto tem duas camadas de testes:
- Testes unitários (padrão,
pytest) — rápidos, mockamsubliminalesentence_transformers. Não precisam de rede nem de binários externos além do Python. - Testes de integração (
pytest -m integration) — exercitam o pipeline real de alinhamento semântico (download do modelosentence-transformers+ DTW) sobre legendas reais. Requer acesso à internet no primeiro run para baixar o modelo (~120 MB), cacheado pelo Hugging Face em~/.cache/huggingface/.
Como rodar cada camada:
pytest # só unit (rápido)
pytest -m integration # só integração (baixa modelo de embeddings, roda DTW real)
pytest -m "" # tudo (unit + integração)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file subs_down_n_sync-1.0.1.tar.gz.
File metadata
- Download URL: subs_down_n_sync-1.0.1.tar.gz
- Upload date:
- Size: 34.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2fcbdd5c63740e11af627f6b9df26639ac12d85cb4867cc2685ab573b25fc16
|
|
| MD5 |
33de0ee4a536ad596e04a91968f39a35
|
|
| BLAKE2b-256 |
c25d249280644fcbd6ed0ae7a5fca182fec2fed84d2639ca1ea3cc4831b53d8c
|
Provenance
The following attestation bundles were made for subs_down_n_sync-1.0.1.tar.gz:
Publisher:
release.yml on airton-soares/subs_down_n_sync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
subs_down_n_sync-1.0.1.tar.gz -
Subject digest:
c2fcbdd5c63740e11af627f6b9df26639ac12d85cb4867cc2685ab573b25fc16 - Sigstore transparency entry: 1384443143
- Sigstore integration time:
-
Permalink:
airton-soares/subs_down_n_sync@dbf70310ac2085c519232f9bd36a5d275624c616 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/airton-soares
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dbf70310ac2085c519232f9bd36a5d275624c616 -
Trigger Event:
push
-
Statement type:
File details
Details for the file subs_down_n_sync-1.0.1-py3-none-any.whl.
File metadata
- Download URL: subs_down_n_sync-1.0.1-py3-none-any.whl
- Upload date:
- Size: 25.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f48e4e62c580c6fee3862364016fce6ff333823131174fd0bb5653c2ccbb1527
|
|
| MD5 |
6225d53ac39187432f8478a9807765db
|
|
| BLAKE2b-256 |
5c4bf801ae76f62d57c898216a96ff14b62eabd32e82c29fe602e403c6a880e8
|
Provenance
The following attestation bundles were made for subs_down_n_sync-1.0.1-py3-none-any.whl:
Publisher:
release.yml on airton-soares/subs_down_n_sync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
subs_down_n_sync-1.0.1-py3-none-any.whl -
Subject digest:
f48e4e62c580c6fee3862364016fce6ff333823131174fd0bb5653c2ccbb1527 - Sigstore transparency entry: 1384443147
- Sigstore integration time:
-
Permalink:
airton-soares/subs_down_n_sync@dbf70310ac2085c519232f9bd36a5d275624c616 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/airton-soares
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@dbf70310ac2085c519232f9bd36a5d275624c616 -
Trigger Event:
push
-
Statement type: