Skip to Content

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 .zip qui contient, à sa racine, un imsmanifest.xml et tous les fichiers du module (HTML, JS, CSS, médias, et éventuellement les schémas .xsd). Le LMS décompresse le .zip, cherche le imsmanifest.xml tout 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 .zip SCORM.
  • É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 ims dans imsmanifest.xml et dans le namespace imscp. SCORM ajoute par-dessus ses propres extensions (namespace adlcp, publié par ADLadlnet.gov).

Ce qu’il y a dans un paquet

Un PIF SCORM contient typiquement quatre familles de fichiers :

FamilleExemplesRôle
Le manifesteimsmanifest.xmlLa 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 dialogueun wrapper JS type scorm-api.jsLe code qui trouve l’API du LMS et remonte statut/score (voir Partie 4).
Les schémas de contrôleimscp_rootv1p1p2.xsd, adlcp_rootv1p2.xsd, ims_xml.xsdLes XSD qui décrivent la grammaire du manifeste. Optionnels mais recommandés.

Deux précisions qui évitent des malentendus :

  • Les schémas .xsd ne sont pas exécutés par le navigateur. Ils servent à valider la structure du manifeste (avec un validateur XML). Les inclure dans le .zip est 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 .zip comme n’importe quel fichier, on le déclare dans le manifeste au même titre que le reste.

💡 Réflexe — Ouvre toujours un .zip SCORM avant de l’importer, ne serait-ce qu’un instant. Le premier élément listé doit être imsmanifest.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.mp4

Trois observations d’expert :

  1. 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.
  2. Les chemins sont relatifs à la racine du .zip. Dans le manifeste, on écrira href="intro/index.html" — jamais un chemin absolu, jamais C:\..., jamais https://....
  3. Le partagé est mutualisé (shared/, media/). Trois SCO peuvent réutiliser le même scorm-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. Le imsmanifest.xml doit ê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 :

  1. Décompression. Le LMS extrait le .zip dans un espace privé (souvent horodaté ou lié au cours).
  2. Recherche du manifeste. Il ouvre imsmanifest.xml à la racine extraite. Absent ou mal placé → rejet immédiat.
  3. Analyse XML. Il parse le manifeste. Un XML mal formé (balise non fermée, caractère & non échappé) → rejet.
  4. 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.
  5. Navigation. Il construit le menu à partir de <organizations> : les titres, l’ordre, les SCO lançables.
  6. Inventaire. Il indexe <resources> pour savoir quel fichier ouvrir au clic sur chaque entrée du menu.
  7. Lancement. Au premier clic, il ouvre le href du SCO dans une frame/fenêtre et injecte l’objet API que 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, href cassé), 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.js entre les SCO, alléger les médias, et contrôler que imsmanifest.xml est 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 il doit se trouver.

✅ Solution

  • Manifeste : imsmanifest.xmlobligatoire, à 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.

Last updated on