Um bot para Telegram que interage com o qBittorrent para adicionar torrents via links magnet, fornecer atualizações de status, sincronizar automaticamente com Jellyfin e oferecer estatísticas detalhadas de uso.
O projeto foi refatorado para uma estrutura de pacotes baseada em features, facilitando manutenção, escalabilidade e organização:
src/
├── core/ # Configurações e utilitários centrais
│ ├── config.py # Carregamento centralizado de variáveis de ambiente
│ ├── logging_config.py # Configuração de logging
│ └── exceptions.py # Exceções customizadas
├── integrations/ # Integrações com serviços externos
│ ├── qbittorrent/ # Cliente e monitor do qBittorrent
│ ├── jellyfin/ # Cliente, formatador, manager e notifier do Jellyfin
│ ├── telegram/ # Cliente, teclados, utils e handlers do Telegram
│ ├── whatsapp/ # Cliente WAHA, utils e webhook
│ └── youtube/ # Downloader e utils do YouTube
├── services/ # Serviços de negócio
│ ├── sync_service.py # Sincronização qBittorrent ↔ Jellyfin
│ ├── statistics_service.py # Estatísticas e histórico
│ └── ytsbr_service.py # Integração YTS Brasil
├── commands/ # Handlers de comandos
│ ├── telegram_commands.py # Comandos avançados do Telegram
│ ├── ytsbr_commands.py # Comandos YTSBR
│ └── whatsapp_commands.py # Comandos WhatsApp
└── utils/ # Utilitários compartilhados
└── formatters.py # Formatação de bytes, duração, etc.
Arquivos legados (root): Mantidos como shims de compatibilidade, re-exportando de src/ para garantir backward compatibility.
Ponto de entrada: main.py - orquestra a inicialização de todos os serviços e integrações.
- Clone este repositório.
- Instale as dependências:
pip install -r requirements.txt
- Crie um arquivo
.envna raiz do projeto com as variáveis de ambiente necessárias:# qBittorrent QB_URL=http://localhost:8080 QB_USER=admin QB_PASS=sua_senha INTERVALO=30 QBITTORRENT_STORAGE_PATH=/ # Telegram TELEGRAM_BOT_TOKEN=seu_token_do_bot TELEGRAM_CHAT_ID=seu_chat_id AUTHORIZED_USERS=123456789,987654321 EXPIRAR_MSG=30 # Jellyfin JELLYFIN_URL=http://localhost:8096 JELLYFIN_USERNAME=seu_usuario JELLYFIN_PASSWORD=sua_senha JELLYFIN_API_KEY=sua_api_key JELLYFIN_NOTIFICATIONS_ENABLED=True JELLYFIN_NOTIFICATION_INTERVAL=1800 # WhatsApp (WAHA) WAHA_URL=http://localhost:3000 WAHA_API_KEY=local-dev-key-123 WAHA_SESSION=default AUTHORIZED_WHATSAPP_NUMBERS=5511999999999 WAHA_DASHBOARD_USERNAME=admin WAHA_DASHBOARD_PASSWORD=admin123 WAHA_SWAGGER_USERNAME=admin WAHA_SWAGGER_PASSWORD=swagger123 # YouTube YOUTUBE_DOWNLOAD_DIR=downloads REMOVE_AFTER_SEND=False # Sincronização SYNC_INTERVAL=30 AUTO_SCAN_JELLYFIN=True
- Obtenha seu
TG_CHAT_IDenviando uma mensagem para o seu bot e acessandohttps://api.telegram.org/botSEU_TOKEN/getUpdates.
O projeto também pode ser executado em contêineres Docker, facilitando a implantação e isolando as dependências.
Crie um arquivo Dockerfile na raiz do projeto com o seguinte conteúdo:
# Use uma imagem base oficial do Python
FROM python:3.9-slim
# Defina o diretório de trabalho dentro do contêiner
WORKDIR /app
# Copie o arquivo de requisitos e instale as dependências
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copie o restante do código da aplicação para o contêiner
COPY . .
# O arquivo .env não deve ser copiado diretamente para a imagem por questões de segurança.
# Considere montar o arquivo .env como um volume ou passá-lo como variáveis de ambiente ao executar o contêiner.
# Comando para executar o script principal quando o contêiner iniciar
CMD ["python", "main.py"]Se você está em um sistema Linux (Armbian, Debian, Ubuntu, Orange Pi, Raspberry Pi, etc) e não quer ou não pode usar Docker, siga estes passos para rodar o bot em um ambiente isolado:
sudo apt update
sudo apt install python3 python3-venv python3-pip -ycd /caminho/para/telegram_torrent
python3 -m venv venvsource venv/bin/activatepip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements_youtube.txtCrie ou edite o arquivo .env com seus dados do Telegram e qBittorrent.
python main.pynohup python main.py &Caso desejar verificar o log de todos os nohup utilizados (em execução e finalizados), utilize o comando:
ps aux | grep "nome_do_arquivo.py"
Se você quiser parar ou matar o processo em execução, use o killcomando seguido do ID do processo:
kill 2565
- Sempre que quiser rodar o bot, ative o ambiente virtual:
cd /caminho/para/telegram_torrent source venv/bin/activate python main.py
- Para sair do ambiente virtual, use
deactivate. - O ambiente virtual mantém as dependências isoladas do sistema.
Copie o arquivo docker-compose.yml na raiz do projeto:
#### Utilizando Docker
Depois de criar os arquivos, execute os seguintes comandos para construir e iniciar os contêineres:
1. Construir e iniciar os contêineres em segundo plano:
```bash
docker compose up -d
-
Verificar os logs da aplicação:
docker compose logs -f telegram-torrent
-
Parar os contêineres:
docker compose down
-
Para reconstruir a imagem após alterações no código:
docker compose build telegram-torrent ou docker compose build --no-cache telegram-torrent docker compose up -d
Nota: Certifique-se de que o arquivo
.envesteja configurado corretamente antes de iniciar os contêineres.
Para atualizar sua aplicação na VPS e manter o código sincronizado com o repositório:
# 1. Entrar no diretório do projeto
cd /root/telegram_torrent
# 2. Verificar status atual (opcional)
git status
# 3. Buscar as últimas alterações do repositório
git fetch origin
# 4. Puxar as últimas alterações
git pull origin main
# 5. Reconstruir e reiniciar os containers Docker
docker compose down
docker compose build --no-cache
docker compose up -d
# 6. Verificar status dos containers
docker compose pscd /root/telegram_torrent && git pull origin main && docker compose down && docker compose build --no-cache && docker compose up -dSe você tiver alterações locais que entram em conflito com as atualizações:
# Opção 1: Stash (preserva suas alterações)
git stash
git pull origin main
git stash pop
# Opção 2: Commit suas alterações
git add .
git commit -m "Minhas configurações personalizadas"
git pull origin main
# Opção 3: Descartar alterações locais
git restore .
git pull origin mainCrie um script update.sh para facilitar as atualizações:
#!/bin/bash
cd /root/telegram_torrent
echo "Atualizando código..."
git pull origin main
echo "Reconstruindo containers..."
docker compose down
docker compose build --no-cache
docker compose up -d
echo "Verificando status..."
docker compose ps
echo "Atualização concluída!"Torne executável: chmod +x update.sh
Execute quando precisar: ./update.sh
- Branch Principal: Se seu branch for
masterem vez demain, substituaorigin mainpororigin master - Backup: Sempre faça backup do arquivo
.envantes de atualizações - Arquitetura ARM64: Para dispositivos como Orange Pi, Raspberry Pi, verifique se as imagens Docker são compatíveis com ARM64
- Logs: Após atualizar, verifique os logs para garantir que tudo funcionou corretamente:
docker compose logs -f
Execute o script principal:
python main.pyO bot irá iniciar, conectar-se ao qBittorrent e começar a processar mensagens do Telegram e enviar atualizações de status.
O bot inclui um teclado personalizado que aparece na parte inferior do chat, fornecendo acesso rápido aos comandos mais usados. O teclado é ativado automaticamente após o comando /start.
- 📊 Status do Servidor: Verifica o status do servidor Jellyfin
- 📦 Listar Torrents: Mostra a lista de torrents ativos
- 💾 Espaço em Disco: Exibe o espaço em disco disponível
- 🎬 Itens Recentes: Lista os itens adicionados recentemente ao Jellyfin (comando:
/recent) - 🎭 Recentes Detalhado: Exibe informações detalhadas dos itens recentes (comando:
/recentes) - 📚 Bibliotecas: Mostra as bibliotecas disponíveis no Jellyfin
- ❓ Ajuda: Exibe a mensagem de ajuda com todos os comandos
/start: Inicia a interação com o bot e exibe mensagem de boas-vindas com o teclado personalizado/helpou clique em Ajuda: Exibe a lista completa de comandos disponíveis e suas descrições
-
/qtorrents: Lista todos os torrents ativos, pausados, finalizados e parados (requer autorização).- Interface Aprimorada: Formatação moderna com contadores e separadores visuais
- Informações Detalhadas: Exibe nome (limitado a 50 caracteres), progresso, tamanho, velocidade de download/upload
- Categorização Inteligente:
- Downloads Ativos (até 5 exibidos)
- Pausados (até 3 exibidos)
- Finalizados/Seeding (até 3 exibidos)
- Com Erro (todos exibidos)
- Botões Interativos:
- Atualizar Lista: Atualiza a lista de torrents em tempo real
- Pausar Todos: Pausa todos os torrents ativos de uma vez
- Retomar Todos: Retoma todos os torrents pausados simultaneamente
- Detalhes: Exibe ajuda contextual sobre o gerenciador
- Feedback Instantâneo: Confirmação imediata de ações executadas
-
Links Magnet: Envie qualquer link magnet válido para iniciar o download (requer autorização).
- Formato:
magnet:?xt=urn:btih:... - O bot confirmará o recebimento e iniciará o download automaticamente.
- Formato:
/qespaco: Mostra o espaço em disco disponível no servidor do qBittorrent.- Em versões recentes: Exibe Total, Usado e Livre (via API
/api/v2/app/drive_info). - Em versões antigas: Fallback para
/api/v2/sync/maindatamostrando espaço livre.
- Em versões recentes: Exibe Total, Usado e Livre (via API
-
/recentes: Lista os itens recentemente adicionados ao Jellyfin com informações detalhadas- Exibe até 8 itens recentes com informações completas
- Mostra título, ano, tipo de mídia, gêneros e avaliação
- Inclui sinopse resumida (até 150 caracteres)
- Data de adição ao servidor
- Link direto para visualização no Jellyfin
- Formatação em Markdown para melhor legibilidade
-
/recent: Lista os itens mais recentes adicionados ao Jellyfin (versão simplificada)- Exibe informações básicas dos itens recentes
- Formato mais compacto e rápido
-
/libraries: Lista todas as bibliotecas disponíveis no servidor Jellyfin- Mostra o nome e tipo de cada biblioteca
- Útil para verificar acessos e organizações de mídia
-
/status: Exibe o status atual do servidor Jellyfin- Mostra informações de conexão
- Exibe contagem de bibliotecas
- Último item adicionado
- Status da conexão
Em breve: Busca avançada na bibliotecaPlanejado: Controle de permissõesFuturo: Notificações automáticas de novos conteúdos
ℹ️ Acompanhe nosso ROADMAP.md para atualizações sobre o cronograma de lançamento e recursos planejados.
-
/sync: Sincronização manual entre qBittorrent e Jellyfin- Dispara verificação imediata de torrents concluídos
- Atualiza biblioteca Jellyfin automaticamente
- Envia notificação quando conteúdo está disponível
- Exemplo:
/sync
-
/sync_status: Exibe status atual da sincronização- Estado do sincronizador (Ativo/Inativo)
- Contador de torrents concluídos processados
- Tamanho da fila de processamento
- Configurações de auto-scan e intervalo
- Exemplo:
/sync_status
-
/stats [horas]: Exibe estatísticas de uso de banda- Uso de banda por período (padrão: 24 horas)
- Download e upload totais no período
- Média de velocidade
- Exemplos:
/stats(últimas 24 horas)/stats 48(últimas 48 horas)/stats 12(últimas 12 horas)
-
/history [dias]: Exibe histórico de downloads- Lista de torrents concluídos recentemente
- Informações: nome, tamanho, data de conclusão
- Período configurável (padrão: 7 dias)
- Exemplos:
/history(últimos 7 dias)/history 14(últimos 14 dias)/history 3(últimos 3 dias)
-
/priority [hash] [prioridade]: Altera prioridade de downloads- Prioridades disponíveis:
top- Move para o topo da filabottom- Move para o final da filaincrease- Aumenta a prioridadedecrease- Diminui a prioridade
- Exemplos:
/priority abc123def456 top/priority abc123def456 increase
- Dica: Use
/qtorrentspara ver os hashes dos torrents
- Prioridades disponíveis:
-
/remove [hash] [delete]: Remove torrents com opção de deletar arquivos- Remove apenas o torrent (mantém arquivos)
- Remove torrent e arquivos (com
delete) - Exemplos:
/remove abc123def456(remove apenas torrent)/remove abc123def456 delete(remove torrent e arquivos)
⚠️ Atenção: A remoção de arquivos é permanente!- Dica: Use
/qtorrentspara ver os hashes dos torrents
- Detecção Automática: Verifica periodicamente torrents concluídos
- Atualização Jellyfin: Scan automático da biblioteca quando downloads terminam
- Notificações: Avisa quando conteúdo está disponível no Jellyfin
- Registro de Estatísticas: Coleta dados de banda a cada minuto
- Persistência: Histórico mantido em arquivo JSON
Adicione ao seu arquivo .env as novas configurações:
# CONFIGURAÇÕES DE SINCRONIZAÇÃO (v0.0.1.7-alpha)
# Intervalo em segundos para verificar torrents concluídos (padrão: 30)
SYNC_INTERVAL=30
# Habilita/desabilita atualização automática da biblioteca Jellyfin (True/False)
AUTO_SCAN_JELLYFIN=True/youtube: Baixar vídeos do YouTube e enviar para o Telegram- Detecção Automática: Envie qualquer URL do YouTube diretamente no chat
- Formatos Suportados:
youtube.com/watch?v=...youtu.be/...youtube.com/shorts/...
- Informações do Vídeo: Exibe título, canal, duração, visualizações e data de publicação
- Download Assíncrono: Monitoramento de progresso em tempo real
- Envio Automático: Vídeo enviado automaticamente após conclusão do download
- Limitações:
- Tamanho máximo: 50MB (limite do Telegram)
- Apenas vídeos públicos
- Timeout de 10 minutos por download
- Exemplo:
/youtube https://www.youtube.com/watch?v=dQw4w9WgXcQ
-
/ytsbr [termo]: Busca filmes no YTS Brasil- Sem termo: Exibe filmes populares
- Com termo: Busca por título específico
- Exemplo:
/ytsbr Matrix
-
/ytsbr_generos: Lista todos os gêneros de filmes disponíveis -
/ytsbr_genero [gênero]: Busca filmes por gênero específico- Exemplo:
/ytsbr_genero acao
- Exemplo:
-
/ytsbr_series [termo]: Busca séries no YTS Brasil- Sem termo: Exibe séries populares
- Com termo: Busca por título específico
- Exemplo:
/ytsbr_series Breaking Bad
-
/ytsbr_series_generos: Lista todos os gêneros de séries disponíveis -
/ytsbr_series_genero [gênero]: Busca séries por gênero específico- Exemplo:
/ytsbr_series_genero drama
- Exemplo:
-
/ytsbr_anime [termo]: Busca animes no YTS Brasil- Sem termo: Exibe animes populares
- Com termo: Busca por título específico
- Exemplo:
/ytsbr_anime Naruto
-
/ytsbr_anime_generos: Lista todos os gêneros de animes disponíveis -
/ytsbr_anime_genero [gênero]: Busca animes por gênero específico- Exemplo:
/ytsbr_anime_genero acao
- Exemplo:
/ytsbr_baixar [número]: Baixa o torrent selecionado da última busca- Exemplo:
/ytsbr_baixar 1 - O número corresponde à posição do item na lista de resultados
- Sistema de cache mantém os últimos resultados de busca por usuário
- Exemplo:
- Seleção Interativa: Resultados numerados para fácil seleção
- Informações Detalhadas: Título, ano, qualidade, tamanho, gêneros
- Cache Inteligente: Mantém resultados de busca para download rápido
- Integração com qBittorrent: Download automático após seleção
O bot enviará automaticamente notificações para:
- Conclusão de downloads de torrents
- Erros durante o download
- Novos conteúdos adicionados ao Jellyfin
- Alertas de espaço em disco baixo
- Atualizações de status do servidor Jellyfin
- Sessões iniciadas ou finalizadas no Jellyfin
Para habilitar os comandos do Jellyfin, adicione as seguintes variáveis ao seu arquivo .env:
# Configurações do Jellyfin
JELLYFIN_URL=http://seu-servidor-jellyfin:8096
JELLYFIN_USERNAME=seu_usuario
JELLYFIN_PASSWORD=sua_senhaCertifique-se de que o usuário tenha permissões adequadas no servidor Jellyfin para acessar as bibliotecas e informações do sistema.
Este projeto segue o Versionamento Semântico (SemVer) e utiliza commits padronizados em Português do Brasil. O changelog é mantido no arquivo versao.md.
Consulte o arquivo versao.md para o histórico de mudanças.
https://www.digitalocean.com/community/tutorials/nohup-command-in-linux
Este projeto é desenvolvido apenas para fins educacionais e de uso pessoal. Não incentivamos ou apoiamos qualquer forma de pirataria ou uso ilegal. Os usuários são responsáveis por garantir que suas ações estejam em conformidade com todas as leis de direitos autorais e propriedade intelectual aplicáveis.