Files
MamieHenriette/protondb/__init__.py

80 lines
2.8 KiB
Python

import logging
import requests
import re
from algoliasearch.search.client import SearchClientSync, SearchConfig
from database.helpers import ConfigurationHelper
from database.models import GameAlias
from sqlalchemy import desc,func
def _call_algoliasearch(search_name:str):
try:
config = SearchConfig(ConfigurationHelper().getValue('proton_db_api_id'),
ConfigurationHelper().getValue('proton_db_api_key'))
config.set_default_hosts()
client = SearchClientSync(config=config)
return client.search_single_index(index_name="steamdb",
search_params={
"query":search_name,
"facetFilters":[["appType:Game"]],
"hitsPerPage":50},
request_options= {
'headers':{'Referer':'https://www.protondb.com/'},
'timeout': 30
})
except Exception as e:
logging.error(f'Erreur lors de la recherche Algolia pour "{search_name}" : {e}')
return None
def _call_summary(id):
try:
response = requests.get(f'http://jazzy-starlight-aeea19.netlify.app/api/v1/reports/summaries/{id}.json', timeout=30)
if (response.status_code == 200) :
return response.json()
logging.error(f'Échec de la récupération des données ProtonDB pour le jeu {id}. Code de statut HTTP : {response.status_code}')
return None
except (requests.exceptions.SSLError, requests.exceptions.Timeout, requests.exceptions.ConnectionError) as e:
logging.error(f'Erreur de connexion ProtonDB pour le jeu {id} : {e}')
return None
except Exception as e:
logging.error(f'Erreur inattendue lors de la récupération ProtonDB pour le jeu {id} : {e}')
return None
def _is_name_match(name:str, search_name:str) -> bool:
normalized_game_name = re.sub("[^a-z0-9]", "", name.lower())
normalized_search_name = re.sub("[^a-z0-9]", "", search_name.lower())
return normalized_game_name.find(normalized_search_name) >= 0
def _apply_game_aliases(search_name:str) -> str:
for alias in GameAlias.query.order_by(desc(func.length(GameAlias.alias))).all():
search_name = re.sub(re.escape(alias.alias), alias.name, search_name, flags=re.IGNORECASE)
return search_name
def searhProtonDb(search_name:str):
results = []
search_name = _apply_game_aliases(search_name)
responses = _call_algoliasearch(search_name)
if responses is None:
return results
for hit in responses.model_dump().get('hits'):
id = hit.get('object_id')
name:str = hit.get('name')
if (_is_name_match(name, search_name)) :
try:
summmary = _call_summary(id)
if (summmary != None) :
tier = summmary.get('tier')
results.append({
'id':id,
'name' : name,
'tier' : tier
})
logging.info(f'Trouvé {name}({id}) : {tier}')
except Exception as e:
logging.error(f'Erreur lors du traitement du jeu {name} (ID: {id}) : {e}')
else:
logging.info(f'{name}({id}) ne contient pas {search_name}')
return results