Ferramenta CLI para upload automatizado em Usenet com RAR, PAR2 e nyuu
Project description
UpaPasta
UpaPasta automatiza o upload completo para Usenet em um único comando. Cria RAR5, gera paridade PAR2, faz o upload via nyuu e entrega o NZB pronto — tudo com o mínimo de configuração.
upapasta /caminho/para/pasta
→ Documentação completa · CHANGELOG
O que faz
- (Opcional) Cria arquivos RAR5 a partir de pastas
- Gera PAR2 com perfis fast/balanced/safe e backends parpar (padrão) ou par2
- Faz upload via nyuu sem cópia temporária — paths diretos
- Gera NZB + NFO com metadados de vídeo
- Registra tudo em
~/.config/upapasta/history.dbcom senha, NZB e metadados
Fluxo Recomendado 2026
Para pastas com subpastas, descarte o RAR e confie no parpar para preservar a hierarquia:
upapasta Pasta/ --backend parpar --obfuscate \
--filepath-format common --par-profile safe
Por quê? SABnzbd/NZBGet recentes reconstroem a árvore no download. Sem RAR (padrão), a proteção vem de:
- Nomes aleatórios no subject e headers
- Estrutura de pastas preservada apenas nos .par2 (invisível em scans básicos)
- RAR-com-senha é opcional, para casos legados ou quando realmente necessário
Casos de Uso
| Caso | Comando |
|---|---|
| Pasta com subpastas | upapasta Pasta/ --backend parpar (sem RAR por padrão) |
| Arquivo único | upapasta arquivo.mkv (sem RAR automaticamente) |
| Ofuscado | upapasta Pasta/ --obfuscate |
| Monitoramento automático | upapasta /downloads/ --watch |
| Cada arquivo separado | upapasta /tv/ --each |
| Episódios + NZB da temporada | upapasta /tv/Show.S04/ --season |
| Teste sem upload | upapasta Pasta/ --dry-run |
Uso Rápido
Básico
upapasta /tv/Night.of.the.Living.Dead.S01/
upapasta /movies/Nosferatu.1922.mkv
upapasta /courses/'Learn Python'
Com Obfuscação
# Pasta: obfuscação moderna (sem RAR): nomes aleatórios + parpar
upapasta /tv/Night.of.the.Living.Dead.S01/ --obfuscate
# Pasta: obfuscação + RAR com senha automática
upapasta /tv/Night.of.the.Living.Dead.S01/ --obfuscate --rar
# Pasta: obfuscação + RAR com senha manual
upapasta /tv/Show.S01/ --obfuscate --rar --password "abc123"
# Arquivo: obfuscação (sem RAR): apenas nomes aleatórios
upapasta /movies/Nosferatu.1922.mkv --obfuscate
# Arquivo: cria RAR com senha (não obfusca nomes)
upapasta /movies/Nosferatu.1922.mkv --password "xyz789"
# Máxima privacidade: nomes aleatórios em TUDO (indexadores não veem nada)
upapasta /files/Confidential/ --strong-obfuscate
Modo Watch (Daemon)
upapasta /downloads/ --watch
upapasta /files/ --watch --obfuscate
Modo Season
upapasta /tv/The.Boys.S04/ --season --obfuscate
Upload Individual de Arquivos
upapasta /movies/ --each
upapasta /tv/Show.S01/ --each --obfuscate
Pré-requisitos
Obrigatórios:
nyuu— upload para NNTPparparoupar2— geração de paridade (parpar recomendado)rar— compressão RAR5 (se usar RAR; é omitido com--skip-rar)
Opcionais:
ffmpeg/ffprobe— metadados de vídeo em NFOmediainfo— informações detalhadas de mídia em NFO
Instalação
Via pip
pip install upapasta
Desenvolvimento
git clone https://github.com/franzopl/upapasta.git
cd upapasta
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
Na primeira execução, um assistente configura o servidor NNTP e salva em ~/.config/upapasta/.env:
$ upapasta /path/to/folder
? Endereço NNTP (ex: news.provider.com): news.example.com
? Porta (padrão 119):
? Usuário: user@example.com
? Senha: ••••••••
Opções Principais
Compressão e Paridade:
--rar Cria RAR antes do upload (padrão desativado)
--backend {parpar,par2} Backend de paridade (parpar é padrão)
--par-profile {fast,balanced,safe} Perfil de redundância (safe = 20%)
--filepath-format Formato de paths em PAR2: common=relativo, keep=absoluto, basename=flat
Ofuscação e Proteção:
--obfuscate Nomes aleatórios; NZB restaura nomes originais (ofuscação reversível)
--strong-obfuscate Máxima privacidade: nomes aleatórios também no NZB (implica --obfuscate)
--password SENHA Define senha RAR manualmente (presume --rar automaticamente)
Modos de Upload:
--watch Modo daemon: monitora e processa automaticamente
--each Cada arquivo = um release separado
--season Episódios individuais + NZB único da temporada
Outros:
--dry-run Testa tudo sem fazer upload real
--resume Retoma upload interrompido (detecta arquivos já postados no NZB parcial)
--log-file ARQUIVO Salva log completo da sessão
--rename-extensionless Renomeia arquivos sem extensão para .bin (evita .txt do SAB)
Múltiplos Servidores NNTP (Failover)
Configure servidores adicionais no .env para failover automático em caso de falha:
# Servidor primário (obrigatório)
NNTP_HOST=news.primary.com
NNTP_USER=usuario
NNTP_PASS=senha
# Servidor de failover (opcional — campos ausentes herdam do primário)
NNTP_HOST_2=news.backup.com
NNTP_CONNECTIONS_2=20
# Até NNTP_HOST_9
Em caso de falha, a próxima tentativa de upload usa automaticamente o servidor seguinte.
Upload Parcial / Resume
Se um upload for interrompido (Ctrl+C, queda de rede), retome com --resume:
upapasta Pasta/ --resume # mesmas flags do upload original
O UpaPasta detecta quais arquivos já foram postados via NZB parcial existente, faz upload apenas dos restantes e mescla os NZBs ao final. O state file (.upapasta-state.json) é removido automaticamente após conclusão.
Histórico
Todos os uploads são registrados em ~/.config/upapasta/history.jsonl (JSONL, append-only):
- Caminho original
- Senha (se aplicável)
- NZB gerado (arquivado em
~/.config/upapasta/nzb/via hardlink) - Metadados (data, tamanho, backend usado)
- Categoria (detectada automaticamente)
# Inspecionar os últimos 5 uploads
tail -5 ~/.config/upapasta/history.jsonl | python3 -m json.tool
# NZBs arquivados (hardlinks por timestamp)
ls -la ~/.config/upapasta/nzb/
Recuperável mesmo que os arquivos sejam movidos ou deletados.
Hooks Pós-Upload
Configure POST_UPLOAD_SCRIPT em ~/.config/upapasta/.env para executar um script após cada upload bem-sucedido:
# ~/.config/upapasta/.env
POST_UPLOAD_SCRIPT=/home/user/meus_scripts/notificar.sh
O script recebe as seguintes variáveis de ambiente:
| Variável | Descrição |
|---|---|
UPAPASTA_NZB |
Caminho completo do arquivo NZB gerado |
UPAPASTA_NFO |
Caminho completo do arquivo NFO gerado |
UPAPASTA_SENHA |
Senha RAR (vazia se não houver) |
UPAPASTA_NOME_ORIGINAL |
Nome original da entrada (antes de ofuscação) |
UPAPASTA_NOME_OFUSCADO |
Nome ofuscado usado no upload (igual ao original se sem --obfuscate) |
UPAPASTA_TAMANHO |
Tamanho total em bytes |
UPAPASTA_GRUPO |
Grupo Usenet usado no upload |
O script tem timeout de 60 segundos. Se retornar código diferente de 0, o upapasta imprime um aviso mas não aborta.
Para depurar o que é recebido, use o exemplo incluído no repositório:
# Imprime todas as variáveis UPAPASTA_* recebidas pelo hook
POST_UPLOAD_SCRIPT=/caminho/para/upapasta/examples/post_upload_debug.sh
O arquivo examples/post_upload_debug.sh pode ser usado como ponto de partida para scripts personalizados (notificações Telegram, Discord, indexadores, etc.).
Notas Importantes
Obfuscação e Senha:
--obfuscate(padrão): ofuscação reversível — nomes aleatórios nos arquivos, mas NZB restaura nomes originais--strong-obfuscate: máxima privacidade — nomes aleatórios em TUDO (arquivos, estrutura, NZB subjects)- Requer renomeação manual ou via PAR2 após download (não é conveniente para uso regular)
- Use apenas quando privacidade máxima for crítica (releases privados, conteúdo sensível)
--obfuscategera uma senha automaticamente, MAS ela só é injetada no NZB se houver RAR (use--obfuscate --rar)--passwordpresume automaticamente--rar(proteger com senha requer RAR)- Fluxo moderno (sem RAR): proteção via nomes aleatórios + parpar apenas
- Arquivo único com
--obfuscate: upload direto com nomes aleatórios (sem RAR por padrão) - Arquivo único com
--password: cria RAR automaticamente com senha
Pastas e Estrutura:
- Pastas vazias não são preservadas sem RAR (NNTP carrega apenas arquivos)
- Use
--rename-extensionlessou.keepsentinela nas pastas vazias --filepath-format common(padrão) preserva subpastas relativas nos .par2
SABnzbd:
- Desative "Recursive Unpacking" para preservar
.zipinternos - Use
--rename-extensionlessse houver arquivos sem extensão (evita .txt do SABnzbd)
Interrupção:
- Ctrl+C durante
--obfuscate: rollback garantido — nomes revertidos automaticamente viafinally
Licença
MIT — veja LICENSE.
Desenvolvido por franzopl. Contribuições via issue ou pull request são bem-vindas.
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 upapasta-0.24.1.tar.gz.
File metadata
- Download URL: upapasta-0.24.1.tar.gz
- Upload date:
- Size: 103.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15888d36c8c3c61fa06ee1eb4e5d501cea2d190d19bfe83a1057c846803d07d8
|
|
| MD5 |
75d044c92f71b4a4994062f52ba65832
|
|
| BLAKE2b-256 |
c821f9b934d9404eab19cb8a1f3e90d160fbef1897c270588f39852e5e136c54
|
File details
Details for the file upapasta-0.24.1-py3-none-any.whl.
File metadata
- Download URL: upapasta-0.24.1-py3-none-any.whl
- Upload date:
- Size: 70.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5000aeca87eff35b764ba342b830c85e21678e253e817948246bb8e37b4d2482
|
|
| MD5 |
846a184308d79d3da248cf341b8c6496
|
|
| BLAKE2b-256 |
d60bb22cd5b73eb4081dd8aa9e10518c027781a12ea4b58cca70b718471fc61a
|