Skip to content

Commit b928012

Browse files
feat: add interactive torrent management with inline buttons and improved list formatting
- Add inline keyboard to /qtorrents with action buttons (Refresh, Pause All, Resume All, Details) - Implement callback query processing for button interactions with instant feedback - Add pause_torrent, resume_torrent, delete_torrent, and get_torrent_info functions to qbittorrent_api - Improve torrent list formatting with categorization (Active, Paused, Finished, Error) - Add detailed torrent information display (
1 parent 3e3613d commit b928012

File tree

5 files changed

+402
-47
lines changed

5 files changed

+402
-47
lines changed

README.md

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,26 @@ O bot inclui um teclado personalizado que aparece na parte inferior do chat, for
190190
### Comandos Gerais
191191

192192
- `/start`: Inicia a interação com o bot e exibe mensagem de boas-vindas com o teclado personalizado
193-
- `/help` ou clique em **Ajuda**: Exibe a lista completa de comandos disponíveis e suas descrições
193+
- `/help` ou clique em **Ajuda**: Exibe a lista completa de comandos disponíveis e suas descrições
194194

195195
### Comandos do qBittorrent
196196

197197
#### Gerenciamento de Torrents
198198
- `/qtorrents`: Lista todos os torrents ativos, pausados, finalizados e parados (requer autorização).
199-
- Exibe nome, progresso, velocidade e status de cada torrent.
200-
- Permite visualizar detalhes específicos de cada download.
199+
- **Interface Aprimorada**: Formatação moderna com contadores e separadores visuais
200+
- **Informações Detalhadas**: Exibe nome (limitado a 50 caracteres), progresso, tamanho, velocidade de download/upload
201+
- **Categorização Inteligente**:
202+
- **Downloads Ativos** (até 5 exibidos)
203+
- **Pausados** (até 3 exibidos)
204+
- **Finalizados/Seeding** (até 3 exibidos)
205+
- **Com Erro** (todos exibidos)
206+
- **Botões Interativos**:
207+
- **Atualizar Lista**: Atualiza a lista de torrents em tempo real
208+
- **Pausar Todos**: Pausa todos os torrents ativos de uma vez
209+
- **Retomar Todos**: Retoma todos os torrents pausados simultaneamente
210+
- **Detalhes**: Exibe ajuda contextual sobre o gerenciador
211+
- **Feedback Instantâneo**: Confirmação imediata de ações executadas
212+
201213
- **Links Magnet**: Envie qualquer link magnet válido para iniciar o download (requer autorização).
202214
- Formato: `magnet:?xt=urn:btih:...`
203215
- O bot confirmará o recebimento e iniciará o download automaticamente.

ROADMAP.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,14 @@
8383
- [ ] Níveis de acesso (admin, usuário, convidado)
8484
- [ ] Restrição de comandos por nível
8585
- [ ] Logs de acesso e auditoria
86-
- [ ] Melhorias na interface de listagem de torrents
87-
- [ ] Formatação aprimorada com contadores
88-
- [ ] Limitação de caracteres em nomes longos
89-
- [ ] Separadores visuais entre categorias
86+
- [x] ~~**Melhorias na interface de listagem de torrents**~~ (Concluído: 18/03/2026)
87+
- [x] ~~Formatação aprimorada com contadores e separadores visuais~~
88+
- [x] ~~Limitação de caracteres em nomes longos (50 caracteres)~~
89+
- [x] ~~Categorização inteligente (Ativos, Pausados, Finalizados, Com Erro)~~
90+
- [x] ~~Informações detalhadas (progresso, tamanho, velocidade)~~
91+
- [x] ~~Botões inline para ações (Atualizar, Pausar Todos, Retomar Todos, Detalhes)~~
92+
- [x] ~~Processamento de callbacks para botões interativos~~
93+
- [x] ~~Feedback instantâneo de ações executadas~~
9094

9195
### v0.0.1.6-alpha (Previsto: Mai/2026)
9296
**Objetivo**: Sincronização e automação básica

qbittorrent_api.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,91 @@ def get_transfer_info(sess, qb_url):
7878
return resp.json()
7979
except Exception as e:
8080
logger.error(f"Erro ao obter informações de transferência: {e}")
81+
return None
82+
83+
def pause_torrent(sess, qb_url, torrent_hash):
84+
"""Pausa um torrent específico.
85+
86+
Args:
87+
sess: Sessão autenticada do qBittorrent
88+
qb_url: URL base da API do qBittorrent
89+
torrent_hash: Hash do torrent a ser pausado
90+
91+
Returns:
92+
bool: True se pausado com sucesso, False caso contrário
93+
"""
94+
try:
95+
data = {"hashes": torrent_hash}
96+
resp = sess.post(f"{qb_url}/api/v2/torrents/pause", data=data)
97+
resp.raise_for_status()
98+
logger.info(f"Torrent {torrent_hash} pausado com sucesso")
99+
return True
100+
except Exception as e:
101+
logger.error(f"Erro ao pausar torrent {torrent_hash}: {e}")
102+
return False
103+
104+
def resume_torrent(sess, qb_url, torrent_hash):
105+
"""Retoma um torrent pausado.
106+
107+
Args:
108+
sess: Sessão autenticada do qBittorrent
109+
qb_url: URL base da API do qBittorrent
110+
torrent_hash: Hash do torrent a ser retomado
111+
112+
Returns:
113+
bool: True se retomado com sucesso, False caso contrário
114+
"""
115+
try:
116+
data = {"hashes": torrent_hash}
117+
resp = sess.post(f"{qb_url}/api/v2/torrents/resume", data=data)
118+
resp.raise_for_status()
119+
logger.info(f"Torrent {torrent_hash} retomado com sucesso")
120+
return True
121+
except Exception as e:
122+
logger.error(f"Erro ao retomar torrent {torrent_hash}: {e}")
123+
return False
124+
125+
def delete_torrent(sess, qb_url, torrent_hash, delete_files=False):
126+
"""Remove um torrent.
127+
128+
Args:
129+
sess: Sessão autenticada do qBittorrent
130+
qb_url: URL base da API do qBittorrent
131+
torrent_hash: Hash do torrent a ser removido
132+
delete_files: Se True, remove também os arquivos baixados
133+
134+
Returns:
135+
bool: True se removido com sucesso, False caso contrário
136+
"""
137+
try:
138+
data = {
139+
"hashes": torrent_hash,
140+
"deleteFiles": "true" if delete_files else "false"
141+
}
142+
resp = sess.post(f"{qb_url}/api/v2/torrents/delete", data=data)
143+
resp.raise_for_status()
144+
logger.info(f"Torrent {torrent_hash} removido com sucesso (arquivos deletados: {delete_files})")
145+
return True
146+
except Exception as e:
147+
logger.error(f"Erro ao remover torrent {torrent_hash}: {e}")
148+
return False
149+
150+
def get_torrent_info(sess, qb_url, torrent_hash):
151+
"""Obtém informações detalhadas de um torrent específico.
152+
153+
Args:
154+
sess: Sessão autenticada do qBittorrent
155+
qb_url: URL base da API do qBittorrent
156+
torrent_hash: Hash do torrent
157+
158+
Returns:
159+
dict: Informações do torrent ou None em caso de erro
160+
"""
161+
try:
162+
resp = sess.get(f"{qb_url}/api/v2/torrents/info", params={"hashes": torrent_hash})
163+
resp.raise_for_status()
164+
torrents = resp.json()
165+
return torrents[0] if torrents else None
166+
except Exception as e:
167+
logger.error(f"Erro ao obter informações do torrent {torrent_hash}: {e}")
81168
return None

0 commit comments

Comments
 (0)