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

105
setup.sh
View File

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