dual language game descriptions stored in DB

This commit is contained in:
nocci 2025-05-09 10:53:09 +02:00
parent 192d86dbd5
commit fa8d4c4b1d
1 changed files with 64 additions and 41 deletions

View File

@ -478,8 +478,9 @@ class Game(db.Model):
historical_low = db.Column(db.Float)
release_date = db.Column(db.DateTime)
release_date = db.Column(db.DateTime)
steam_description = db.Column(db.Text)
itad_slug = db.Column(db.String(200))
steam_description_en = db.Column(db.Text)
steam_description_de = db.Column(db.Text)
# with users.id
user_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
@ -579,25 +580,27 @@ def log_activity(user_id, action, details=None):
db.session.commit()
# Game Infos Helper
def fetch_steam_data(appid):
def fetch_steam_data(appid, lang='en'):
lang_map = {
'en': 'english',
'de': 'german'
}
steam_lang = lang_map.get(lang, 'english')
try:
response = requests.get(
"https://store.steampowered.com/api/appdetails",
params={"appids": appid, "l": "german"},
params={"appids": appid, "l": steam_lang},
timeout=15
)
if response.status_code != 200:
app.logger.error(f"Steam API Error: Status {response.status_code}")
return None
data = response.json().get(str(appid), {})
if not data.get("success"):
app.logger.error(f"Steam API Error: {data.get('error', 'Unknown error')}")
return None
return data.get("data", {})
if data.get("success"):
return {
"name": data["data"].get("name"),
"detailed_description": data["data"].get("detailed_description"),
"release_date": data["data"].get("release_date", {}).get("date"),
}
except Exception as e:
app.logger.error(f"Steam API Exception: {str(e)}")
app.logger.error(f"Steam API error: {str(e)}")
return None
def parse_steam_release_date(date_str):
@ -1241,35 +1244,32 @@ def update_game_data(game_id):
steam_appid = request.form.get('steam_appid', '').strip()
app.logger.info(f"🚀 Update gestartet für Game {game_id} mit AppID: {steam_appid}")
# 2. Steam-Data
steam_data = None
# 2. Steam-Data (Multilingual)
if steam_appid:
try:
app.logger.debug(f"🔍 Steam-API-Aufruf für AppID: {steam_appid}")
steam_data = fetch_steam_data(steam_appid)
app.logger.debug(f"🔍 Fetching Steam data for AppID: {steam_appid}")
for lang in ['en', 'de']:
steam_data = fetch_steam_data(steam_appid, lang=lang)
if steam_data:
# 3. Daten in Datenbank schreiben
if lang == 'en' and steam_data.get("name"):
game.name = steam_data.get("name", game.name)
game.steam_description = steam_data.get("detailed_description") or "No Infos available"
# Release-Datum mit Zeitzone
date_str = steam_data.get("release_date", {}).get("date")
setattr(game, f'steam_description_{lang}', steam_data.get("detailed_description") or "No Infos available")
if lang == 'en':
date_str = steam_data.get("release_date", {})
if date_str:
parsed_date = parse_steam_release_date(date_str)
if parsed_date:
game.release_date = local_tz.localize(parsed_date)
else:
app.logger.warning(f"Could not parse Steam release date: {date_str}")
app.logger.info("✅ Steam-Daten erfolgreich aktualisiert")
else:
app.logger.warning("⚠️ Keine Steam-Daten empfangen")
flash(translate('Steam-API lieferte keine Daten'), 'warning')
app.logger.info("✅ Steam data successfully updated")
except Exception as e:
app.logger.error(f"💥 Kritischer Steam-Fehler: {str(e)}", exc_info=True)
flash(translate('Fehler bei Steam-Abfrage'), 'danger')
flash(translate('Error during Steam query'), 'danger')
else:
app.logger.warning("⚠️ Keine Steam-AppID vorhanden, Steam-Daten werden nicht aktualisiert")
flash(translate('Steam-AppID missing, no Steam Data transferred'), 'warning')
# ITAD-Slug donings and such
itad_slug = fetch_itad_slug(steam_appid)
@ -1439,6 +1439,27 @@ scheduler.add_job(
)
def update_missing_steam_descriptions_job():
with app.app_context():
games = Game.query.filter(
(Game.steam_description_en == None) | (Game.steam_description_en == '') |
(Game.steam_description_de == None) | (Game.steam_description_de == '')
).all()
for game in games:
for lang in ['en', 'de']:
if not getattr(game, f'steam_description_{lang}', None):
steam_data = fetch_steam_data(game.steam_appid, lang=lang)
if steam_data:
setattr(game, f'steam_description_{lang}', steam_data.get('detailed_description'))
db.session.commit()
scheduler.add_job(
update_missing_steam_descriptions_job,
'interval',
hours=24,
id='update_missing_steam_descriptions'
)
# start Scheduler
scheduler.start()
atexit.register(lambda: scheduler.shutdown(wait=False))
@ -2351,13 +2372,15 @@ cat <<HTML_END > templates/game_details.html
</a>
</div>
</div>
{% if game.steam_description %}
{% set lang = session.get('lang', 'en') %}
{% set desc = getattr(game, 'steam_description_' + lang) %}
{% if desc %}
<div class="row mt-4">
<div class="col-12">
<div class="card">
<div class="card-header">{{ _('Game Description') }}</div>
<div class="card-body">
{{ game.steam_description|safe }}
{{ desc|safe }}
</div>
</div>
</div>