Personal downloader for Circle course lesson videos accessible from your own account.
Project description
Circle Course Downloader
A small, practical CLI for saving Circle course videos that you can already access with your own account.
Circle Course Downloader opens a dedicated Chromium profile, lets you sign in normally, discovers course lessons through the authenticated page, and downloads the video streams with yt-dlp. It is built for personal offline viewing, backups, and unreliable connections.
This project is unofficial and is not affiliated with Circle. It does not bypass DRM, paywalls, 2FA, captchas, or access controls. Use it only for content you are authorized to view and download.
Highlights
- Browser-only authentication: no terminal passwords, copied cookies, or pasted tokens.
- Reusable local session stored in a dedicated Playwright Chromium profile.
- Course lesson discovery from real Circle course pages.
- Video URL detection for Circle HLS, direct video links, YouTube, Vimeo, Wistia, Loom, Mux, and Cloudflare Stream.
yt-dlpdownloads with resume support and MP4 merge output.manifest.jsonandmanifest.csvexports for auditing what was found.- Dry-run mode for inspecting generated download commands before saving media.
Installation
Install the package and the Playwright browser runtime:
python -m pip install circle-course-downloader
python -m playwright install chromium
Python 3.11 or newer is required.
Quick Start
Run the downloader with a full Circle course URL:
circle-course-downloader download "https://your-community.example.com/c/course-slug"
On the first run, a Chromium window opens. Sign in to Circle in that browser, return to the terminal, and press Enter.
After that, the CLI reuses the same dedicated browser profile for future downloads:
circle-course-downloader download "https://your-community.example.com/c/another-course"
Downloaded videos are saved to downloads/ by default.
How It Works
- Opens the requested Circle course page in a persistent Chromium profile.
- If login is required, waits while you authenticate in the browser.
- Saves the browser session under
.auth/. - Discovers lesson links from the course page.
- Visits each lesson, finds candidate video URLs, and classifies the provider.
- Writes a manifest and downloads each available video with
yt-dlp.
The default local files are:
.auth/session-browser-profile/
.auth/session.json
downloads/manifest.json
downloads/manifest.csv
downloads/01 - Lesson title.mp4
Generated manifests can contain signed media URLs. Do not publish or commit them.
CLI Usage
circle-course-downloader download [OPTIONS] COURSE_URL
| Option | Description |
|---|---|
--output-dir PATH |
Save videos and manifests somewhere other than downloads/. |
--session PATH |
Use a different exported session file. The browser profile is stored next to it. |
--force-login |
Delete the saved auth state and open a fresh visible login browser. |
--headless |
Run Chromium without a visible window after a saved browser profile exists. |
--dry-run |
Discover lessons and print the yt-dlp commands without downloading videos. |
Examples:
circle-course-downloader download "https://your-community.example.com/c/course-slug" --dry-run
circle-course-downloader download "https://your-community.example.com/c/course-slug" --output-dir "./my-videos"
circle-course-downloader download "https://your-community.example.com/c/course-slug" --force-login
circle-course-downloader download "https://your-community.example.com/c/course-slug" --headless
--headless is useful only after a saved browser profile already exists. First login always uses a visible browser window.
Install From Source
Clone the repository, create a virtual environment, install the package, and install Chromium for Playwright:
python -m venv .venv
.\.venv\Scripts\python -m pip install .
.\.venv\Scripts\python -m playwright install chromium
Then run the CLI from the virtual environment:
.\.venv\Scripts\circle-course-downloader download "https://your-community.example.com/c/course-slug"
For development and publishing tools:
.\.venv\Scripts\python -m pip install -r requirements.txt
Development
Run the local checks before opening a pull request:
.\.venv\Scripts\python -m pytest
.\.venv\Scripts\python -m compileall .\src
.\.venv\Scripts\python -m build
.\.venv\Scripts\python -m twine check dist/*
.\.venv\Scripts\circle-course-downloader --help
.\.venv\Scripts\circle-course-downloader download --help
The package metadata is defined in pyproject.toml, and the CLI entry point is:
circle-course-downloader = circle_courses_downloader.cli:main
Safety And Privacy
Circle Course Downloader uses its own Chromium profile under .auth/. It does not read cookies, sessions, or tokens from your default browser.
Contributing
Contributions are welcome when they keep the project focused on the browser-only Circle course download flow.
Good first improvements include:
- Better provider detection for embedded video platforms.
- Clearer error messages for expired sessions or unavailable lessons.
- More fixture-based parser tests.
- Cross-platform documentation polish.
Please read CONTRIBUTING.md and SECURITY.md before opening a pull request.
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file circle_course_downloader-0.1.3.tar.gz.
File metadata
- Download URL: circle_course_downloader-0.1.3.tar.gz
- Upload date:
- Size: 11.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4fc1c5da02cbb90c6d6c379cb437c04ef890a97979035565623feaf41ce33027
|
|
| MD5 |
899c4671cc03f0498c0ec6cd411d30d8
|
|
| BLAKE2b-256 |
8f9639ea6bdd817e0f18d5d4d767def0fb5ee5efe0ee27abcee73f70b6075b99
|
Provenance
The following attestation bundles were made for circle_course_downloader-0.1.3.tar.gz:
Publisher:
publish.yml on paladini/circle-courses-downloader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
circle_course_downloader-0.1.3.tar.gz -
Subject digest:
4fc1c5da02cbb90c6d6c379cb437c04ef890a97979035565623feaf41ce33027 - Sigstore transparency entry: 1598131023
- Sigstore integration time:
-
Permalink:
paladini/circle-courses-downloader@6a4b2e708a7b81fe2b3b5114622e314cb9270b31 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/paladini
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6a4b2e708a7b81fe2b3b5114622e314cb9270b31 -
Trigger Event:
push
-
Statement type:
File details
Details for the file circle_course_downloader-0.1.3-py3-none-any.whl.
File metadata
- Download URL: circle_course_downloader-0.1.3-py3-none-any.whl
- Upload date:
- Size: 12.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48850ccd0d1c841c7376a657787248a455526fbcf27b4a1dc568b1665aad3a18
|
|
| MD5 |
257a5b8630e5d16e1a130dfa46441411
|
|
| BLAKE2b-256 |
e548a205f3880aaac3a1d662c7c5aefdd01cabdb29396c219d58f84d8abe424a
|
Provenance
The following attestation bundles were made for circle_course_downloader-0.1.3-py3-none-any.whl:
Publisher:
publish.yml on paladini/circle-courses-downloader
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
circle_course_downloader-0.1.3-py3-none-any.whl -
Subject digest:
48850ccd0d1c841c7376a657787248a455526fbcf27b4a1dc568b1665aad3a18 - Sigstore transparency entry: 1598131306
- Sigstore integration time:
-
Permalink:
paladini/circle-courses-downloader@6a4b2e708a7b81fe2b3b5114622e314cb9270b31 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/paladini
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6a4b2e708a7b81fe2b3b5114622e314cb9270b31 -
Trigger Event:
push
-
Statement type: