Export Web/SCORM : corrige les URLs absolues cassées en local (file://)
Bug signalé : icône disparue et texte suivant du dialogue absent après export. render_icone.py (et son miroir JS, forgeRenderIcone) bakaient une URL "/static/icons/..." en dur, correcte en ligne (racine du serveur Flask) mais bloquée par CORS une fois ouverte en local (file:///static/...). Même souci pour les fichiers envoyés par le créateur (/game/<slug>/uploads/..., jamais dans static/, jamais copiés par le paquet). Ajoute _relativize_absolute_urls (réécriture globale post-rendu du HTML) + copie du dossier uploads/, et relativise le port JS de l'icône pour toute régénération après action en mémoire. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
f3b72d73c9
commit
7bc4c89eaa
@@ -44,6 +44,36 @@ def _copy_static_assets(staging_dir, slug):
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
|
||||
def _copy_uploads(staging_dir, slug):
|
||||
"""Fichiers envoyés par le créateur (widget Image/Vidéo, "Envoyer un
|
||||
fichier" — voir routes/uploads/upload_file.py) : servis EN LIGNE par
|
||||
une route Flask (/game/<slug>/uploads/<fichier>, jamais static/), donc
|
||||
jamais copiés par _copy_static_assets ci-dessus. Absents s'il n'y en a
|
||||
aucun (os.path.isdir garde-fou)."""
|
||||
src = os.path.join(db.game_dir(slug), "uploads")
|
||||
if os.path.isdir(src):
|
||||
shutil.copytree(src, os.path.join(staging_dir, "uploads"))
|
||||
|
||||
|
||||
def _relativize_absolute_urls(html, slug):
|
||||
"""screens/rendering (render_icone.py) et screens/labels (sprite_
|
||||
library.py/animal_sprite_library.py) construisent certaines URLs en
|
||||
DUR avec un préfixe absolu "/static/..." ou "/game/<slug>/uploads/..."
|
||||
(corrects EN LIGNE, où ils partent de la racine du serveur Flask) —
|
||||
déjà bakées dans le HTML/JSON rendu à ce stade, impossible à
|
||||
distinguer d'un bête texte sans réécrire chaque fonction de rendu une
|
||||
à une. Un remplacement global est plus sûr : ces deux préfixes précis
|
||||
(le second inclut le slug du jeu) n'ont aucune raison d'apparaître
|
||||
ailleurs que dans une URL réellement générée par le moteur. Sans ce
|
||||
correctif, un index.html ouvert en local (file://) échouait à charger
|
||||
icônes/sprites/fichiers envoyés (CORS bloque une requête absolue vers
|
||||
file:///static/... — "la requête CORS n'utilise pas HTTP")."""
|
||||
return (
|
||||
html.replace(f"/game/{slug}/uploads/", "uploads/")
|
||||
.replace("/static/", "static/")
|
||||
)
|
||||
|
||||
|
||||
def _list_package_files(staging_dir):
|
||||
"""Chemins relatifs de tout ce qui a déjà été écrit dans staging_dir
|
||||
(hors imsmanifest.xml lui-même) — le manifeste doit les lister TOUS
|
||||
@@ -81,11 +111,13 @@ def build_scorm_zip(slug):
|
||||
staging_dir = tempfile.mkdtemp(prefix="forge_scorm_")
|
||||
try:
|
||||
_copy_static_assets(staging_dir, slug)
|
||||
_copy_uploads(staging_dir, slug)
|
||||
|
||||
html = render_template(
|
||||
"play.html", game=game, screens_data=payload["screens"], payload_json=json.dumps(payload),
|
||||
offline_mode=True, asset_url=lambda filename: "static/" + filename,
|
||||
)
|
||||
html = _relativize_absolute_urls(html, slug)
|
||||
with open(os.path.join(staging_dir, "index.html"), "w", encoding="utf-8") as f:
|
||||
f.write(html)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user