Skip to main content

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

  1. (Opcional) Cria arquivos RAR5 a partir de pastas
  2. Gera PAR2 com perfis fast/balanced/safe e backends parpar (padrão) ou par2
  3. Faz upload via nyuu sem cópia temporária — paths diretos
  4. Gera NZB + NFO com metadados de vídeo
  5. Registra tudo em ~/.config/upapasta/history.db com 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"

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 NNTP
  • parpar ou par2 — 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 NFO
  • mediainfo — 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 + senha gerada (senha só usada com RAR)
--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
--log-file ARQUIVO      Salva log completo da sessão
--rename-extensionless  Renomeia arquivos sem extensão para .bin (evita .txt do SAB)

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 gera uma senha automaticamente, MAS ela só é injetada no NZB se houver RAR (use --obfuscate --rar)
  • --password presume 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-extensionless ou .keep sentinela nas pastas vazias
  • --filepath-format common (padrão) preserva subpastas relativas nos .par2

SABnzbd:

  • Desative "Recursive Unpacking" para preservar .zip internos
  • Use --rename-extensionless se houver arquivos sem extensão (evita .txt do SABnzbd)

Interrupção:

  • Ctrl+C durante --obfuscate: rollback garantido — nomes revertidos automaticamente via finally

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

upapasta-0.22.1.tar.gz (95.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

upapasta-0.22.1-py3-none-any.whl (67.8 kB view details)

Uploaded Python 3

File details

Details for the file upapasta-0.22.1.tar.gz.

File metadata

  • Download URL: upapasta-0.22.1.tar.gz
  • Upload date:
  • Size: 95.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for upapasta-0.22.1.tar.gz
Algorithm Hash digest
SHA256 8e72218cb65e423f18a1d7115c4ccf6137e88c17c16173bfd639d52e8ab6b2e1
MD5 9cb59621321520053a5e2229c2dea2b8
BLAKE2b-256 6089324fb79c0b4f9bc63d8cd7835bc8998d7ea9bc2d2336886c3c28168bcd32

See more details on using hashes here.

File details

Details for the file upapasta-0.22.1-py3-none-any.whl.

File metadata

  • Download URL: upapasta-0.22.1-py3-none-any.whl
  • Upload date:
  • Size: 67.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for upapasta-0.22.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0cecbb93793d9691ff949940dac737aa8fc2b3d4e3fc2a076a11ea3592a13579
MD5 01b05cc40efb77445713324fb67591dd
BLAKE2b-256 a00024826cd90a30e574f7577ee9970baa1d46a003f4ea1bba33051357c44910

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page