Add conection and remove proxy usage

This commit is contained in:
LeoMortari
2026-01-01 17:37:20 -03:00
parent 2d0d4b3b8b
commit 33574a62bd
4 changed files with 192 additions and 83 deletions

View File

@@ -1,6 +1,6 @@
from typing import Callable, Any, Optional
from yt_dlp import YoutubeDL
from database import get_all_active_proxies, format_proxy_url, mark_proxy_success
from database import get_all_active_proxies, format_proxy_url, mark_proxy_success, mark_proxy_failure
class ProxyError(Exception):
pass
@@ -32,6 +32,11 @@ def is_proxy_error(error_msg: str) -> bool:
'ssl', # Erros SSL causados por proxy
'certificate', # Erros de certificado causados por proxy
'certificate_verify_failed', # Verificação de certificado SSL falhou
'failed to parse json', # Erros de parsing JSON (proxy retornando HTML)
'jsondecode', # Erros de decodificação JSON
'remote end closed', # Conexão fechada pelo proxy
'remotedisconnected', # Desconexão remota
'connection/parsing error', # Erros de conexão/parsing do download
]
non_proxy_error_keywords = [
@@ -53,10 +58,11 @@ def is_proxy_error(error_msg: str) -> bool:
def execute_with_proxy_retry(
ydl_opts: dict,
operation: Callable[[YoutubeDL], Any],
retry_per_proxy: int = 2
retry_per_proxy: int = 2,
max_proxies_to_try: int = None
) -> Any:
"""
Tenta executar operação com todos os proxies disponíveis.
Tenta executar operação com proxies disponíveis.
Cada proxy é tentado N vezes antes de passar para o próximo.
Proxies NÃO são removidos do banco, apenas pulados.
@@ -64,34 +70,34 @@ def execute_with_proxy_retry(
ydl_opts: Opções do YoutubeDL
operation: Função a ser executada
retry_per_proxy: Número de tentativas por proxy antes de pular para o próximo
max_proxies_to_try: Número máximo de proxies a tentar (None = todos)
"""
# Busca TODOS os proxies ativos
all_proxies = get_all_active_proxies()
total_proxies = len(all_proxies)
print(f"\n{'='*60}")
print(f"Proxies disponíveis no banco: {total_proxies}")
print(f"Tentativas por proxy: {retry_per_proxy}")
print(f"{'='*60}\n")
# Limita número de proxies se especificado
if max_proxies_to_try is not None and max_proxies_to_try > 0:
all_proxies = all_proxies[:max_proxies_to_try]
total_proxies = len(all_proxies)
last_error = None
# Tenta cada proxy da lista
for proxy_index, proxy_data in enumerate(all_proxies, 1):
proxy_url = format_proxy_url(proxy_data)
ydl_opts_with_proxy = {**ydl_opts, 'proxy': proxy_url}
# Proxy desativado temporariamente - Para reativar, descomente a linha abaixo:
# ydl_opts_with_proxy = {**ydl_opts, 'proxy': proxy_url}
ydl_opts_with_proxy = {**ydl_opts} # Sem proxy por enquanto
print(f"\n[Proxy {proxy_index}/{total_proxies}] {proxy_url} (ID: {proxy_data['id']})")
proxy_failed = False
# Tenta N vezes com o MESMO proxy
for attempt in range(1, retry_per_proxy + 1):
try:
print(f" → Tentativa {attempt}/{retry_per_proxy}...", end=" ")
with YoutubeDL(ydl_opts_with_proxy) as ydl:
result = operation(ydl)
print(f"✓ SUCESSO!")
mark_proxy_success(proxy_data['id'])
return result
@@ -99,32 +105,22 @@ def execute_with_proxy_retry(
error_msg = str(e)
last_error = e
print(f"✗ Falhou")
print(f" Erro: {error_msg[:80]}...")
# Se não for erro de proxy, lança imediatamente
if not is_proxy_error(error_msg):
print(f" ⚠ Erro não relacionado a proxy, abortando")
raise e
proxy_failed = True
# Se chegou aqui, falhou todas as tentativas com este proxy
print(f" Proxy falhou {retry_per_proxy} vezes, pulando para o próximo...")
if proxy_failed:
mark_proxy_failure(proxy_data['id'])
# Se chegou aqui, todos os proxies falharam, tenta SEM proxy
print(f"\n{'='*60}")
print(f"Todos os {total_proxies} proxies falharam")
print(f"Tentando SEM proxy como último recurso...")
print(f"{'='*60}\n")
try:
print(f" → Tentativa sem proxy...", end=" ")
with YoutubeDL(ydl_opts) as ydl:
result = operation(ydl)
print(f"✓ SUCESSO!")
return result
except Exception as e:
print(f"✗ Falhou")
print(f" Erro: {str(e)[:80]}...")
last_error = e
raise ProxyError(