Forum Discussion

CarmelTse's avatar
CarmelTse
Community Member
20 hours ago

A Simple Zenodo Access Checker for Storyline

I recently ran into a problem while building Storyline teaching materials containing links to several published academic papers on Zenodo.

Zenodo has recently acknowledged ongoing performance challenges, including slower access and occasional failures, as demand and automated traffic have increased. That raised a simple learner-experience question: What happens when someone clicks a Digital Object Identifier (DOI) link while the external repository is temporarily inaccessible?

Rather than having learners try several links and wonder whether the learning material is broken, I built a small JavaScript solution.

When the learner enters a slide containing Zenodo resources, Storyline checks whether the browser can reach zenodo.org. If it can, nothing happens. If the request fails or times out after five seconds, a Storyline variable triggers a Zenodo Access Advisory.

The advisory remains visible for up to 10 seconds and can also be dismissed with an X.

The key was keeping the check simple:

fetch("https://zenodo.org/", { method: "GET", mode: "no-cors", cache: "no-store", signal: controller.signal })

The script isn't trying to retrieve anything from Zenodo or validate individual DOIs. It simply checks whether the external domain is reachable.

I A/B tested it using the real Zenodo domain and a deliberately nonexistent domain to confirm that both the silent and warning paths work.

I've shared the complete JavaScript, Storyline setup, testing method and limitations on GitHub for anyone who would like to adapt it:

Zenodo Access Checker – Ed Tech Solutions
https://github.com/carmeltse/Ed-Tech-Solutions/tree/main/zenodo-access-checker

It's a small solution, but potentially useful whenever Storyline learning materials depend on external resources. This solution can be worked as a SCORM on learning management systems (LMS) or a web file.

Has anyone built something similar for other external resources?

1 Reply

  • ronald-hicks's avatar
    ronald-hicks
    Community Member

    Carmel — clean solution, and yes, this exact pattern generalizes well. The version I'd build: parameterize the domain and the Storyline variable, then loop over a small list of { url, variable } pairs when the slide loads. One script covers every external dependency in the course instead of one trigger per host.

     

    Two honest caveats about no-cors fetch, since the behavior can surprise people:

     

    1. The response is opaque — you can only tell "something answered" from "nothing answered." A domain can be up while the specific resource is broken, so this catches network-level problems, not dead links or changed DOIs.

     

    2. Some LMSs block or delay cross-domain fetch from inside a SCORM package even when the learner's network is fine. Worth testing on the actual LMS, not just Review 360: if the advisory fires there on a healthy network, it's the environment, not Zenodo.

     

    One more thought: an advisory tells the learner what went wrong, but not what to do. Where the paper matters, consider swapping the DOI link for a "request the PDF from your facilitator" button when the check fails — an advisory parks the learner, a next step keeps them moving.