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.3.tar.gz (95.1 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.3-py3-none-any.whl (67.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: upapasta-0.22.3.tar.gz
  • Upload date:
  • Size: 95.1 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.3.tar.gz
Algorithm Hash digest
SHA256 82929738e778b9b04f2cc5c14d74973f2fc2f380aac1f972c888cf5c24fb48b0
MD5 f9f023e244f18d03bfe93aa8823e6461
BLAKE2b-256 1e769d8abd85f8ec0467f02b71dda337174c95e1961ce3fe20e4adf15af16c31

See more details on using hashes here.

File details

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

File metadata

  • Download URL: upapasta-0.22.3-py3-none-any.whl
  • Upload date:
  • Size: 67.6 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0b7db450b1291c3830d7e974ac528f1cc25f28153b4b736603ec6fef5b9cba6d
MD5 d12b9da7000fa649581e9a292a28e6b4
BLAKE2b-256 2fb2566e23cec956d0f1c407ff17582c43b0619ed8b232d091df1b599f76214c

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