A Python CLI tool for downloading courses from Thinkific-powered websites. It includes a scraper to discover enrolled courses and a downloader to save videos and supplementary materials into organized folder structures.
- Course Scraping: Extract course names and URLs from your enrollment pages
- Video Downloading: Download HLS streams and MP4 videos using yt-dlp
- Supplementary Materials: Download PDFs, EPUBs, PowerPoint slides, and other files
- Organized Structure: Content is saved in chapter-based folder hierarchies
- Progress Tracking: Track download status (Not downloaded, Incomplete, Complete) via CSV
- Interactive CLI: Polished terminal interface with Rich UI and interactive prompts
- Resume Support: Skip already downloaded files and resume incomplete downloads
Install dependencies:
uv syncCreate a cookies.json file with your authentication cookies from the Thinkific site. You can extract these from your browser's developer tools after logging in.
cookies.json format:
[
{
"name": "visitor_id",
"value": "YOUR_VISITOR_ID",
"path": "/"
},
{
"name": "__cf_bm",
"value": "YOUR_CF_BM_VALUE",
"path": "/"
},
{
"name": "cf_clearance",
"value": "YOUR_CF_CLEARANCE_VALUE",
"path": "/"
},
{
"name": "remember_user_token",
"value": "YOUR_REMEMBER_TOKEN",
"path": "/"
},
{
"name": "_thinkific_session",
"value": "YOUR_SESSION_VALUE",
"path": "/"
}
]See cookies.json.example for a template.
For batch downloads, create a courses.csv file:
name,url,progress
My First Course,https://www.example.com/courses/take/my-first-course,Not downloaded
Another Course,https://www.example.com/courses/take/another-course,Complete
Third Course,https://www.example.com/courses/take/third-course,IncompleteThe progress column accepts: Not downloaded, Incomplete, or Complete.
See courses.csv.example for a template.
Discover and extract course URLs from your enrollment pages:
# Interactive mode
uv run scraper.py
# With options
uv run scraper.py --url https://www.example.com --pages 5 --cookies cookies.json --output courses.csvOptions:
| Option | Short | Description | Default |
|---|---|---|---|
--url |
-u |
Base URL of the Thinkific site | (prompted) |
--pages |
-p |
Number of enrollment pages to scrape | 10 |
--cookies |
-c |
Path to cookies.json | cookies.json |
--output |
-o |
Output CSV path | courses.csv |
Run without arguments to use the interactive menu:
uv run downloader.pyDownload a single course by URL:
# Interactive mode
uv run downloader.py single
# With options
uv run downloader.py single --url "https://www.example.com/courses/take/course-name" --name "Course Name" --cookies cookies.json --output courses/Options:
| Option | Short | Description | Default |
|---|---|---|---|
--url |
-u |
Course URL | (prompted) |
--name |
-n |
Course name (for folder) | (prompted) |
--cookies |
-c |
Path to cookies.json | cookies.json |
--output |
-o |
Output directory | courses |
Download multiple courses from a CSV file:
# Interactive mode
uv run downloader.py multi
# With options
uv run downloader.py multi --csv courses.csv --cookies cookies.json --output courses/Options:
| Option | Short | Description | Default |
|---|---|---|---|
--csv |
-f |
Path to courses CSV | courses.csv |
--cookies |
-c |
Path to cookies.json | cookies.json |
--output |
-o |
Output directory | courses |
Downloaded content is organized as follows:
courses/
├── Course Name/
│ ├── 1. Chapter Title/
│ │ ├── Chapter Title_Lesson 1.mp4
│ │ ├── Chapter Title_Lesson 2.mp4
│ │ └── supplementary_material.pdf
│ ├── 2. Another Chapter/
│ │ ├── Another Chapter_Video Lesson.mp4
│ │ └── slides.pptx
│ └── 3. Final Chapter/
│ └── ...
└── Another Course/
└── ...
This project is for personal/educational use. Respect the terms of service of any website you use this tool with.