Chapitre 3.1 — Le PIF : anatomie du .zip
⏱️ TL;DR — Un contenu SCORM se livre sous forme d’un PIF (Package Interchange File) : un simple fichier
.zipqui contient, à sa racine, unimsmanifest.xmlet tous les fichiers du module (HTML, JS, CSS, médias, et éventuellement les schémas.xsd). Le LMS décompresse le.zip, cherche leimsmanifest.xmltout en haut, le lit, et sait alors quoi lancer. Le piège nº 1, celui qui grille des heures : zipper le dossier parent au lieu de son contenu — le manifeste se retrouve dans un sous-dossier, et le LMS refuse le paquet.
🎯 Objectifs
- Savoir ce qu’est un PIF et pourquoi SCORM se distribue en
.zip. - Connaître le contenu type d’un paquet et le rôle de chaque famille de fichiers.
- Lire une arborescence de paquet et repérer d’un coup d’œil si le manifeste est bien à la racine.
- Comprendre, étape par étape, comment un LMS ingère un
.zipSCORM. - Éviter le piège du dossier intermédiaire.
Le PIF, c’est juste un .zip (mais bien rangé)
SCORM ne définit pas un serveur, un protocole réseau ou un format binaire exotique. Le format de livraison d’un contenu SCORM est le plus banal qui soit : un fichier .zip. Son petit nom officiel est le PIF, pour Package Interchange File — « fichier d’échange de paquet ». C’est l’unité que tu exportes depuis ton outil auteur (Storyline, Rise, Captivate, iSpring…) et que le client importe dans son LMS.
Ce .zip n’a rien de magique. Ce qui fait de lui un paquet SCORM et non une archive quelconque, c’est un seul fichier obligatoire : le imsmanifest.xml, placé à la racine de l’archive. C’est lui, et lui seul, qui transforme un tas de fichiers HTML en contenu importable et traçable.
📚 La spec — Le packaging relève du CAM (Content Aggregation Model), le premier des trois livres de SCORM. Le CAM reprend lui-même le IMS Content Packaging de l’organisation aujourd’hui appelée 1EdTech : d’où le préfixe
imsdansimsmanifest.xmlet dans le namespaceimscp. SCORM ajoute par-dessus ses propres extensions (namespaceadlcp, publié par ADL —adlnet.gov).
Ce qu’il y a dans un paquet
Un PIF SCORM contient typiquement quatre familles de fichiers :
| Famille | Exemples | Rôle |
|---|---|---|
| Le manifeste | imsmanifest.xml | La carte d’identité du paquet. Obligatoire, à la racine. |
| Les fichiers de contenu | .html, .js, .css, .png, .mp4, polices… | Ce que l’apprenant voit et exécute dans le navigateur. |
| Le code de dialogue | un wrapper JS type scorm-api.js | Le code qui trouve l’API du LMS et remonte statut/score (voir Partie 4). |
| Les schémas de contrôle | imscp_rootv1p1p2.xsd, adlcp_rootv1p2.xsd, ims_xml.xsd | Les XSD qui décrivent la grammaire du manifeste. Optionnels mais recommandés. |
Deux précisions qui évitent des malentendus :
- Les schémas
.xsdne sont pas exécutés par le navigateur. Ils servent à valider la structure du manifeste (avec un validateur XML). Les inclure dans le.zipest une bonne pratique historique héritée de SCORM 1.2 ; beaucoup de LMS modernes les ignorent, mais leur présence ne gêne jamais et rend le paquet auto-descriptif. - Le wrapper de dialogue (le JS qui parle au LMS) n’est pas imposé par le packaging — il relève du runtime (Partie 4). Mais comme il est embarqué dans le
.zipcomme n’importe quel fichier, on le déclare dans le manifeste au même titre que le reste.
💡 Réflexe — Ouvre toujours un
.zipSCORM avant de l’importer, ne serait-ce qu’un instant. Le premier élément listé doit êtreimsmanifest.xml. Si tu vois d’abord un dossier, tu tiens déjà ton bug.
L’arborescence type
Voici l’arborescence d’un paquet bien rangé — le module « Sécurité numérique » de FormaCampus :
securite-numerique.zip
├── imsmanifest.xml ← carte d'identité, À LA RACINE (obligatoire)
├── imscp_rootv1p1p2.xsd ← schémas de contrôle (optionnels, recommandés)
├── adlcp_rootv1p2.xsd
├── ims_xml.xsd
├── intro/
│ ├── index.html ← page de lancement du 1er SCO
│ └── intro.js
├── phishing/
│ ├── index.html ← page de lancement du 2e SCO
│ └── phishing.js
├── mots-de-passe/
│ ├── index.html ← page de lancement du 3e SCO
│ └── passwords.js
├── shared/
│ ├── scorm-api.js ← wrapper "find the API", partagé
│ └── styles.css
└── media/
├── logo.png
└── video-phishing.mp4Trois observations d’expert :
- Le manifeste est le premier fichier à la racine. Tout le reste peut être organisé librement en sous-dossiers ; SCORM n’impose aucune convention de nommage des dossiers de contenu.
- Les chemins sont relatifs à la racine du
.zip. Dans le manifeste, on écrirahref="intro/index.html"— jamais un chemin absolu, jamaisC:\..., jamaishttps://.... - Le partagé est mutualisé (
shared/,media/). Trois SCO peuvent réutiliser le mêmescorm-api.js: on le déclarera une fois et on le référencera via une dépendance (chapitre 3.4).
Le piège nº 1 : le dossier intermédiaire
C’est l’erreur la plus fréquente de tout débutant SCORM, et elle ne pardonne pas. Elle vient d’un réflexe Windows/macOS : on a un dossier securite-numerique/, on fait clic droit → « Compresser ». Résultat :
securite-numerique.zip
└── securite-numerique/ ← DOSSIER INTERMÉDIAIRE = paquet cassé
├── imsmanifest.xml ← n'est PLUS à la racine du .zip !
├── intro/
└── ...Le LMS décompresse, cherche imsmanifest.xml à la racine… et ne trouve rien (ou trouve un dossier). Il rejette le paquet avec un message souvent cryptique du genre « manifest not found » ou « invalid package ».
⚠️ Piège — « J’ai bien mis le manifeste dans le zip, pourtant il refuse. » Neuf fois sur dix, tu as zippé le dossier au lieu de son contenu. La règle : sélectionne les fichiers et sous-dossiers (le manifeste,
intro/,shared/…), pas le dossier qui les contient, puis compresse. Leimsmanifest.xmldoit être au niveau 0 de l’archive.
💡 Réflexe — En ligne de commande, place-toi dans le dossier de contenu et zippe
.(le contenu), pas le dossier depuis l’extérieur :
# BON — depuis l'intérieur du dossier, on zippe le contenu
cd securite-numerique
zip -r ../securite-numerique.zip .
# MAUVAIS — depuis l'extérieur, on emballe le dossier lui-même
zip -r securite-numerique.zip securite-numerique/Comment un LMS ingère le paquet
Quand tu déposes le .zip dans une activité « SCORM » de Moodle (ou n’importe quel LMS), il déroule toujours la même séquence :
Étape par étape :
- Décompression. Le LMS extrait le
.zipdans un espace privé (souvent horodaté ou lié au cours). - Recherche du manifeste. Il ouvre
imsmanifest.xmlà la racine extraite. Absent ou mal placé → rejet immédiat. - Analyse XML. Il parse le manifeste. Un XML mal formé (balise non fermée, caractère
&non échappé) → rejet. - Version. Il lit
<metadata>pour savoir s’il a affaire à du 1.2 ou du 2004 (chapitre 3.2), et adapte le runtime qu’il exposera. - Navigation. Il construit le menu à partir de
<organizations>: les titres, l’ordre, les SCO lançables. - Inventaire. Il indexe
<resources>pour savoir quel fichier ouvrir au clic sur chaque entrée du menu. - Lancement. Au premier clic, il ouvre le
hrefdu SCO dans une frame/fenêtre et injecte l’objetAPIque le SCO ira chercher.
🔌 Côté intégration — Du point de vue du client (l’école, l’académie), un import SCORM réussi se résume à : « je glisse le
.zip, un menu apparaît, je clique, ça se lance, et à la fin je vois un statut et une note dans le carnet. » Si l’import échoue, le premier suspect est toujours le packaging (manifeste mal placé, XML invalide,hrefcassé), pas le contenu pédagogique. Un paquet qui s’importe proprement du premier coup est un signal de sérieux : c’est ce qui fait la différence entre un fournisseur qu’on rappelle et un qu’on évite.
🧭 Sur FormaCampus — Le studio de FormaCampus exporte le module « Sécurité numérique » depuis son outil auteur, mais l’équipe intégration ré-empaquette à la main pour trois raisons : mutualiser
scorm-api.jsentre les SCO, alléger les médias, et contrôler queimsmanifest.xmlest bien à la racine. Leur règle interne, apprise à leurs dépens après un premier envoi refusé par le Moodle d’un collège : « on ouvre le.zip, on vérifie que la première ligne est le manifeste, puis on livre ».
✏️ Exercices
Exercice 1 — Diagnostic express. Une école t’écrit : « Votre paquet SCORM refuse de s’importer, Moodle affiche manifest not found. » Tu ouvres le .zip et tu vois, tout en haut, un unique dossier Module_Securite/ contenant le manifeste et les fichiers. Quel est le problème, et comment le corriges-tu ?
✅ Solution
Le paquet a été zippé au niveau du dossier parent : imsmanifest.xml se trouve dans Module_Securite/, donc pas à la racine du .zip. Moodle cherche le manifeste au niveau 0 de l’archive, ne le trouve pas, et rejette.
Correction : recompresser en sélectionnant le contenu du dossier (le manifeste, les sous-dossiers intro/, shared/…) et non le dossier lui-même. En ligne de commande : cd Module_Securite && zip -r ../module.zip .. Après recompression, la première entrée de l’archive doit être imsmanifest.xml.
Exercice 2 — Tri des fichiers. On te donne pêle-mêle : imsmanifest.xml, intro/index.html, shared/scorm-api.js, adlcp_rootv1p2.xsd, media/logo.png, styles.css. Classe chaque fichier dans sa famille (manifeste / contenu / code de dialogue / schéma), et dis lequel est obligatoire et où il doit se trouver.
✅ Solution
- Manifeste :
imsmanifest.xml— obligatoire, à la racine du.zip. - Contenu :
intro/index.html,media/logo.png,styles.css— ce que l’apprenant voit. - Code de dialogue :
shared/scorm-api.js— le wrapper qui parle au LMS (runtime, Partie 4). - Schéma de contrôle :
adlcp_rootv1p2.xsd— un XSD, optionnel, sert à valider le manifeste.
Seul imsmanifest.xml est strictement obligatoire et contraint en position (racine). Tous les autres peuvent être rangés librement en sous-dossiers, du moment que le manifeste les déclare avec le bon chemin relatif.
Exercice 3 — Décrire l’ingestion. En trois phrases, explique à un chef de projet non technique ce que fait Moodle « à l’intérieur » quand il importe un .zip SCORM.
✅ Solution
Moodle décompresse le .zip, puis cherche à la racine le fichier imsmanifest.xml qui décrit le module. Il lit ce manifeste pour connaître la version SCORM, la liste des écrans (le menu) et les fichiers à ouvrir. Il construit alors le menu et, au clic de l’apprenant, lance la bonne page en lui donnant accès au « tuyau » (l’API) par lequel le module remonte sa progression et sa note.
🧠 Quiz de révision
1. Que signifie PIF et de quel format de fichier s’agit-il ?
PIF = Package Interchange File, le fichier d’échange d’un paquet SCORM. Concrètement, c’est un simple fichier .zip contenant le contenu du module et son manifeste.
2. Quel fichier est obligatoire, et où doit-il se trouver ?
Le imsmanifest.xml, obligatoire et placé à la racine du .zip (niveau 0 de l’archive). C’est lui qui fait du .zip un paquet SCORM valide.
3. Quel est le piège de packaging le plus fréquent ?
Zipper le dossier parent au lieu de son contenu : le manifeste se retrouve dans un sous-dossier et n’est plus à la racine. Le LMS répond « manifest not found » et rejette le paquet.
4. À quoi servent les fichiers .xsd dans le paquet, et sont-ils obligatoires ?
Ce sont les schémas (XSD) qui décrivent la grammaire du manifeste ; ils servent à valider sa structure. Ils sont optionnels mais recommandés — le navigateur ne les exécute pas.
5. Cite les grandes étapes de l’ingestion d’un paquet par un LMS.
Décompression → recherche de imsmanifest.xml à la racine → analyse XML → lecture de la version (metadata) → lecture de l’arbre de navigation (organizations) → inventaire des fichiers (resources) → affichage du menu et lancement du premier SCO.
Chapitre suivant : Le imsmanifest.xml — on ouvre la carte d’identité du paquet et on lit un manifeste 1.2 minimal, ligne par ligne.