You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fluxo de dados e servicos do scraper de partidas profissionais.
Visao Geral
O sistema opera em duas fases independentes:
Sync — busca partidas do calendário competitivo via LoL Esports API e indexa no Elasticsearch com riot_enriched: false
Enrichment — daemon background que enriquece cada partida com stats por jogador (champion, KDA, items, runas) via Leaguepedia
flowchart TB
subgraph Externas
LoLEsports[LoL Esports\nPersisted Gateway]
Leaguepedia[Leaguepedia\nCargo API\nlol.fandom.com]
end
subgraph Fase1_Sync
EsportsProv[providers/esports.py]
CompPipeline[etl/competitive_pipeline.py]
end
subgraph Fase2_Enrichment
LeaguepediaProv[providers/leaguepedia.py\nScoreboardGames + ScoreboardPlayers]
EnrichPipeline[etl/enrichment_pipeline.py\ndaemon 30min]
end
subgraph Storage
ES[(Elasticsearch\nlol_pro_matches)]
end
subgraph API
FastAPI[api/main.py\nFastAPI]
end
subgraph Consumidor
ProStaffAPI[ProStaff API\nRails]
end
LoLEsports --> EsportsProv --> CompPipeline --> ES
ES -- riot_enriched=false --> EnrichPipeline
Leaguepedia --> LeaguepediaProv --> EnrichPipeline --> ES
ES --> FastAPI --> ProStaffAPI
Loading
Por que Leaguepedia em vez de Riot Match-V5
Partidas do CBLOL (e outros torneios oficiais) sao disputadas em servidores internos
da Riot para esports — esses jogos nao aparecem na API publica Match-V5.
O Riot ID do jogador tinowns#BR1 exibe a ultima partida em dezembro/2025, mesmo
durante a temporada ativa de fevereiro/2026. Esse e o comportamento esperado para
contas de torneio, que sao contas separadas.
Leaguepedia recebe os dados oficiais pelo programa de divulgacao de dados da Riot
e os expoe via Cargo API (MediaWiki). E a unica fonte publica com:
Stats por jogador (champion, KDA, gold, CS, dano)
Items por nome
Runas por nome (keystone + runes primarias/secundarias + shards)
Mapeamentos dos indices lol_pro_matches e lol_timelines
API
Arquivo
Responsabilidade
api/main.py
FastAPI: endpoints de query, sync e enrichment
Fluxo Detalhado
Fase 1 — Sync (scraper-cron)
LoL Esports getCompletedEvents(leagueId)
└─ retorna series com games[], cada game tem vods[].parameter (YouTube ID)
└─ competitive_pipeline.py
├─ filtra por liga (CBLOL, LCS, etc.)
├─ para cada game: cria documento CompetitiveGame
│ {match_id, game_number, league, team1, team2,
│ start_time, vod_youtube_id, riot_enriched: false}
└─ bulk_index() → Elasticsearch lol_pro_matches
Fase 2 — Enrichment (enrichment-daemon)
A cada 30 minutos:
query_unenriched(size=50) → games com riot_enriched=false
Para cada game:
1. get_game_scoreboard(team1, team2, date, game_number)
→ ScoreboardGames: GameId (page_name), WinTeam, Patch, Gamelength
2. sleep(9s) — rate limit Leaguepedia ~1 req/8s
3. get_game_players(page_name)
→ ScoreboardPlayers: Name, Team, Champion, Role,
K/D/A, Gold, CS, Damage, Items, Runes, SummonerSpells
4. update_document(ES, doc_id, {
riot_enriched: true,
participants: [...10 players...],
patch, win_team, gamelength, game_duration_seconds,
enrichment_source: "leaguepedia"
})
5. sleep(9s) — entre games
Falha: incrementa enrichment_attempts (max 3 antes de desistir)
tenacity wait_fixed(9s) + sleep explicito entre requests
LoL Esports Persisted Gateway
Alta
tenacity exponential backoff
Riot Account/Match V5
20 req/1s (dev), 100 req/1s (prod)
riot_rate_limited.py com controle por tier
Observacoes
riot_enriched: o campo se chama assim por razoes historicas (antes tentavamos usar Match-V5). Semanticamente significa "enriched with per-player stats".
Nomes vs IDs: Leaguepedia retorna nomes de items, runas e spells como strings (ex: "Conqueror", "Black Cleaver"). Isso e preferivel a IDs numericos porque nao requer mapeamento com Data Dragon.
Collation MySQL: o Cargo API do Leaguepedia usa collation utf8_unicode_ci, portanto LEVIATÁN = Leviatan = leviatan nas queries WHERE. Isso resolve divergencias de acento entre o nome no LoL Esports e o nome no Leaguepedia.
Variaveis sensiveis: RIOT_API_KEY, ESPORTS_API_KEY, SCRAPER_API_KEY devem estar em .env e nunca commitados.