dual language game descriptions stored in DB
This commit is contained in:
parent
192d86dbd5
commit
fa8d4c4b1d
105
setup.sh
105
setup.sh
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue