Skip to content

Blazing-Fi3lds/skool-dl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

skool-dl

A CLI (Deno/TypeScript) that downloads an entire Skool classroom: all videos (Skool-native Mux + embedded providers) and lesson attachments, organized into a structured folder tree on disk.

Disclaimer: This tool is meant for archiving content you have legitimate (paid) access to — e.g. making your own courses available offline. Respect the Skool Terms of Service and the copyright of the creators. Do not download or redistribute content you do not have the rights to. Use at your own risk.

Requirements

  • Deno ≥ 2.8
  • yt-dlp and ffmpeg in your PATH
  • cookies.txt (Netscape format) exported from a logged-in browser

Getting cookies.txt

Run a browser extension like "Get cookies.txt LOCALLY" on www.skool.com and save the result as ./cookies.txt (must contain auth_token). The cookie expires — re-export it on auth errors. See cookies.example.txt for the format.

Usage

deno task dl <url> [options]
Option Default Description
<url> Community, classroom, or lesson URL
--cookies <path> ./cookies.txt Netscape cookie file
--quality <best|1080|720|480> best Video quality
--out <path> ./downloads Output directory
--lesson-only Only the lesson addressed via ?md=
--no-attachments Videos without documents
--dry-run List only, download nothing

Examples (replace <your-community> with your community slug):

# whole classroom (dry-run first)
deno task dl "https://www.skool.com/<your-community>/classroom" --dry-run
deno task dl "https://www.skool.com/<your-community>/classroom" --quality 720

# single lesson
deno task dl "https://www.skool.com/<your-community>/classroom/<root>?md=<lessonId>" --lesson-only

Output structure

downloads/<course>/<module>/NN-<lesson>/video.mp4

Already-downloaded files are skipped (resumable).

How it works

  • Skool is built on Next.js; page data lives in <script id="__NEXT_DATA__">.
  • Classroom tree: renderData.allCourses[] → per course pp.course (modules/lessons).
  • Per lesson, /<slug>/classroom/<root>?md=<lessonId> returns the Mux playbackId + signed playbackToken (JWT) in pp.video. Stream: https://stream.mux.com/<id>.m3u8?token=<jwt>, downloaded via yt-dlp with Referer: https://www.skool.com/.

Tests

deno task test

Attachments

metadata.resources is a JSON string containing {title, file_id, file_name, file_content_type}. The actual download link is resolved via POST https://api.skool.com/files/{file_id}/download-url (a signed files.skool.com URL) and then fetched.

Helper tools

  • deno run --allow-read --allow-net src/diagnose.ts <slug> [slug...] — finds lessons that should have a video but where the download failed.
  • deno run --allow-read --allow-net src/reconcile.ts <slug> [slug...] --out <dir> — lists videos that exist according to the crawl but are missing as .mp4 on disk.

Known limitations

  • Embeds (Loom/Vimeo/YouTube/Wistia) are detected from videoLink + desc.
  • Sequential download (to be gentle on rate limits). No posts/comments (YAGNI).

License

MIT — see LICENSE.

About

Download Skool classroom videos and attachments (Deno/TypeScript CLI)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors