Este documento descreve a arquitetura para identificação dos mods instalados localmente a partir dos arquivos do Minecraft/TLauncher e o método para consultar e comparar versões com os repositórios oficiais na web (CurseForge e Modrinth).
Após inspecionar o diretório D:\Games\.minecraft\versions\UltimateMinePack, identificamos o arquivo oficial de metadados gerenciado pelo TLauncher:
- Arquivo Correto:
D:\Games\.minecraft\versions\UltimateMinePack\TLauncherAdditional.json - Tamanho: ~740 KB
- Localização dos Mods:
modpack.version.mods(array com 239 elementos)
{
"modpack": {
"name": "HorrorHardcoreZoio 2",
"version": {
"gameVersionDTO": {
"id": 46,
"name": "1.20.1"
},
"minecraftVersionName": {
"id": 4372,
"name": "47.4.23"
},
"minecraftVersionTypes": [
{
"id": 1,
"name": "forge"
}
]
}
}
}Cada mod instalado contém o mapeamento direto com o catálogo do CurseForge:
{
"id": 60028,
"name": "Aquaculture 2",
"lanName": "aquaculture",
"linkProject": "https://www.curseforge.com/minecraft/mc-mods/aquaculture",
"version": {
"id": 6296111,
"name": "Aquaculture-1.20.1-2.5.5",
"metadata": {
"path": "mods/Aquaculture-1.20.1-2.5.5.jar",
"sha1": "0b1fa66f4ceb5dcf6659fbb117dcf85b2cfc1b82",
"size": 1391583
}
}
}id: CurseForge Project ID oficial (ex:60028).version.id: CurseForge File ID oficial da versão instalada (ex:6296111).version.name: Identificador da versão instalada.version.metadata.path: Nome do arquivo.jarna pastamods/.
Para consultar a versão mais recente na web sem exigir que o usuário crie chaves de API pagas ou proprietárias do Overwolf, foi desenhada uma estratégia híbrida em camadas:
flowchart TD
A[Ler TLauncherAdditional.json] --> B[Extrair Mod ID, Slug e File ID Local]
B --> C[Camada 1: CFWidget API CurseForge]
C -->|Sucesso| D[Filtrar por 1.20.1 + Forge]
C -->|Falha / Timeout| E[Camada 2: Modrinth API]
E -->|Sucesso| F[Filtrar por 1.20.1 + Forge]
E -->|Falha / Sem Mod| G[Camada 3: Scraper HTML CurseForge]
D --> H[Comparar File ID Local vs Web]
F --> I[Comparar Versão Local vs Web]
G --> J[Comparar Nome do Jar / Release]
H --> K[Status: Atualizado ou Desatualizado]
I --> K
J --> K
- Endpoint:
GET https://api.cfwidget.com/{project_id} - Autenticação: Nenhuma (Livre / Open Source).
- Parâmetros:
{project_id}: ID numérico do mod (ex:60028para Aquaculture 2).
- Resposta JSON:
{ "id": 60028, "title": "Aquaculture 2", "files": [ { "id": 7331172, "name": "Aquaculture-1.20.1-2.5.7.jar", "versions": ["1.20.1", "Forge", "NeoForge"], "uploaded_at": "2025-12-14T05:36:23.493Z" } ] } - Lógica de Filtragem:
- Filtra os itens de
filesondeversionscontenha1.20.1e (ForgeouNeoForge). - O primeiro item resultante é a versão estável mais recente.
- Compara o
latest_file_idcom oinstalled_file_iddo JSON local.
- Filtra os itens de
- Endpoint:
GET https://api.modrinth.com/v2/project/{slug}/version - Query Params:
game_versions=["1.20.1"]loaders=["forge"]
- Exemplo de URL:
https://api.modrinth.com/v2/project/aquaculture/version?game_versions=%5B%221.20.1%22%5D&loaders=%5B%22forge%22%5D - Vantagens: API REST nativa, extremamente rápida e suporta a maioria dos mods modernos.
- URL:
https://www.curseforge.com/minecraft/mc-mods/{lanName}/files?page=1&pageSize=20&gameVersion=1.20.1 - Método: Requisição HTTP com header
User-Agentsimulando browser e parser HTML. - Uso: Utilizado apenas caso o mod não seja indexado pelas duas APIs anteriores.
A comparação ocorre por três critérios ordenados por precisão:
- Comparação por File ID (CurseForge):
- Como o CurseForge incrementa o ID de arquivo a cada novo upload:
- Se
latest_file_id == installed_file_id:UP_TO_DATE(Atualizado). - Se
latest_file_id > installed_file_id:UPDATE_AVAILABLE(Atualização disponível).
- Se
- Como o CurseForge incrementa o ID de arquivo a cada novo upload:
- Comparação por Nome / SemVer:
- Se o File ID não for compatível entre provedores, o sistema analisa a numeração de versão (ex:
2.5.5vs2.5.7).
- Se o File ID não for compatível entre provedores, o sistema analisa a numeração de versão (ex:
- Data de Publicação:
- Caso a data de upload na web seja posterior ao timestamp de atualização registrado no arquivo local.
O script de teste foi implementado em Python em:
- Arquivo:
test_update_checker.py - Execução:
(Substitua
python test_update_checker.py 55pelo número de mods desejado para testar)