Skip to content

Decompose IMS Content Packages (SCORM/IMSCP) into individual Kolibri resources #332

Description

@rtibbles

Overview

Migrate the imscp code into ricecooker.

Decompose an IMS Content Package (including SCORM) into individual Kolibri resources, driven by its manifest.

This reverses the original "no dependency zips" decision; shared-library dependency zips return as a follow-up.

Complexity: High
Target branch: main

Context

  • The imscp code lives in a separate repo (learningequality/imscp) and should be native to ricecooker.
  • IMSCP is the packaging layer under SCORM.
  • Its manifest (imsmanifest.xml) is the standardized, tool-independent structure.
  • One opaque webcontent zip backs many nodes, so Kolibri's per-resource import pulls the whole package when a single node is selected.
  • Wrapping plain media in an HTML5 sandbox strips native affordances — a video should play as a VideoNode, not a <video> in a sandbox.
  • The existing reference machinery locates and rewrites references only within a single archive.

The decomposition ladder

Per manifest resource, take the highest rung it safely qualifies for:

  1. Native media node (video/audio/pdf/image) — a single media file in a wrapper.
  2. KPUB — static article/document HTML.
  3. HTML5 zip served via zipcontent — genuinely interactive content.
  4. QTI assessment item — assessment content.

Classification runs on one axis: does the resource's meaning survive stripping its JS/CSS?

  • Discount SCORM API boilerplate (pipwerks, LMSInitialize, SetValue) before judging interactivity.
  • Bias conservative — promote only on high confidence.
  • Never promote a resource carrying assessment, score, or tracking semantics.

The crux

Decomposition must rewrite references across resources: a promoted node referenced by a sibling, or a shared library in a dependency zip.

The rewrite emits two new target forms:

  • native-node references
  • zipcontent-relative dependency paths

Deferred to follow-ups

  • Per-tool deep parsers (Storyline, Captivate, Rise, iSpring, Adapt content models).
  • Interactivity classification beyond the sanitization-survival test.
  • Automatic dependency-zip vendoring for shared HTML5 libraries.

Acceptance Criteria

  • An IMSCP/SCORM package imports natively, with the imscp code migrated into ricecooker.
  • The manifest drives the node/topic tree.
  • A single wrapped media file becomes a native media node.
  • A static-article resource becomes a KPUB.
  • An interactive resource becomes an HTML5 zip served via zipcontent.
  • A resource carrying assessment semantics is never promoted to media or KPUB.
  • References between decomposed resources resolve correctly in Kolibri.
  • Each decomposed node is backed by its own files, not one shared package zip.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions