Files
youtube-api/database.py
2025-12-05 00:15:16 -03:00

147 lines
4.5 KiB
Python

import os
import psycopg2
from psycopg2.extras import RealDictCursor
from typing import Optional, Dict
from dotenv import load_dotenv
load_dotenv()
def get_db_connection():
return psycopg2.connect(
host=os.getenv("DB_HOST", "localhost"),
port=os.getenv("DB_PORT", "5432"),
database=os.getenv("DB_NAME", "postgres"),
user=os.getenv("DB_USER", "postgres"),
password=os.getenv("DB_PASSWORD", ""),
cursor_factory=RealDictCursor
)
def get_latest_proxy() -> Optional[Dict]:
try:
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute("""
SELECT
id, ip_address, port, protocol, username, password,
country_code, country_name, city, is_active, is_anonymous,
response_time_ms, last_checked_at, last_successful_at,
failure_count, success_count, usage, source, notes,
created_at, updated_at
FROM proxies
WHERE is_active = TRUE
ORDER BY
last_successful_at DESC NULLS LAST,
response_time_ms ASC NULLS LAST,
(CASE WHEN success_count + failure_count > 0
THEN CAST(success_count AS FLOAT) / (success_count + failure_count)
ELSE 0 END) DESC,
created_at DESC
LIMIT 1
""")
proxy = cursor.fetchone()
cursor.close()
conn.close()
return dict(proxy) if proxy else None
except Exception as e:
print(f"Erro ao buscar proxy: {e}")
return None
def get_all_active_proxies() -> list:
"""Retorna todos os proxies ativos do banco"""
try:
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute("""
SELECT
id, ip_address, port, protocol, username, password,
country_code, country_name, city, is_active, is_anonymous,
response_time_ms, last_checked_at, last_successful_at,
failure_count, success_count, usage, source, notes,
created_at, updated_at
FROM proxies
WHERE is_active = TRUE
ORDER BY
last_successful_at DESC NULLS LAST,
response_time_ms ASC NULLS LAST,
(CASE WHEN success_count + failure_count > 0
THEN CAST(success_count AS FLOAT) / (success_count + failure_count)
ELSE 0 END) DESC,
created_at DESC
""")
proxies = cursor.fetchall()
cursor.close()
conn.close()
return [dict(proxy) for proxy in proxies] if proxies else []
except Exception as e:
print(f"Erro ao buscar proxies: {e}")
return []
def delete_proxy(proxy_id: int) -> bool:
try:
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute("""
UPDATE proxies
SET is_active = FALSE,
failure_count = failure_count + 1,
last_checked_at = NOW(),
updated_at = NOW()
WHERE id = %s
""", (proxy_id,))
conn.commit()
updated = cursor.rowcount > 0
cursor.close()
conn.close()
print(f"Proxy {proxy_id} desativado: {updated}")
return updated
except Exception as e:
print(f"Erro ao desativar proxy {proxy_id}: {e}")
return False
def format_proxy_url(proxy: Dict) -> str:
protocol = proxy.get('protocol', 'http').lower()
ip_address = proxy.get('ip_address')
port = proxy.get('port')
username = proxy.get('username')
password = proxy.get('password')
if username and password:
return f"{protocol}://{username}:{password}@{ip_address}:{port}"
else:
return f"{protocol}://{ip_address}:{port}"
def mark_proxy_success(proxy_id: int) -> bool:
try:
conn = get_db_connection()
cursor = conn.cursor()
cursor.execute("""
UPDATE proxies
SET success_count = success_count + 1,
last_successful_at = NOW(),
last_checked_at = NOW(),
updated_at = NOW(),
is_active = TRUE
WHERE id = %s
""", (proxy_id,))
conn.commit()
updated = cursor.rowcount > 0
cursor.close()
conn.close()
print(f"Proxy (id {proxy_id}) marcado como sucesso")
return updated
except Exception as e:
print(f"Erro ao marcar proxy {proxy_id} como sucesso: {e}")
return False