@serpdownloaders/circle-downloader 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.actor/INPUT_SCHEMA.json +15 -0
- package/.actor/actor.json +10 -0
- package/.github/FUNDING.yml +8 -0
- package/.github/workflows/call-comment-on-gist.yml +48 -0
- package/.github/workflows/call-create-gist.yml +22 -0
- package/.github/workflows/call-generate-readme-from-json.yml +60 -0
- package/.github/workflows/call-update-gist.yml +25 -0
- package/.github/workflows/packagist-submit.yaml +51 -0
- package/LICENSE +61 -0
- package/README.md +216 -0
- package/composer.json +24 -0
- package/data/readme.json +84 -0
- package/images/.gitkeep +0 -0
- package/images/circle-downloader.gif +0 -0
- package/images/circle-downloader.jpg +0 -0
- package/images/circle-logo.png +0 -0
- package/images/featured.gif +0 -0
- package/images/featured.jpg +0 -0
- package/images/otp-sign-in-example.svg +62 -0
- package/index.js +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "This actor currently exposes a listing-first browser-extension surface. Runtime scraping input is not finalized yet, so the public input schema documents the current status rather than a finalized run contract.",
|
|
3
|
+
"properties": {
|
|
4
|
+
"listingNotice": {
|
|
5
|
+
"default": "No runtime input is required yet. See the README and product page for the current extension workflow.",
|
|
6
|
+
"description": "Optional informational field only. This actor currently serves as the public listing surface for the browser extension and does not yet expose a finalized runtime API contract.",
|
|
7
|
+
"editor": "textfield",
|
|
8
|
+
"title": "Listing notice",
|
|
9
|
+
"type": "string"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"schemaVersion": 1,
|
|
13
|
+
"title": "Circle Downloader input",
|
|
14
|
+
"type": "object"
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"actorSpecification": 1,
|
|
3
|
+
"buildTag": "latest",
|
|
4
|
+
"description": "Circle Downloader preserves Circle community content, coaching lessons, and embedded video platforms before they expire or disappear. It can detect Circle-native uploads as well as common embedded providers and save authorized content as MP4 files for offline access.",
|
|
5
|
+
"input": "./INPUT_SCHEMA.json",
|
|
6
|
+
"name": "circle-downloader",
|
|
7
|
+
"readme": "../README.md",
|
|
8
|
+
"title": "Circle Downloader",
|
|
9
|
+
"version": "0.0"
|
|
10
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
github: [devinschumacher]
|
|
2
|
+
open_collective: devinschumacher
|
|
3
|
+
custom: [
|
|
4
|
+
"https://apps.serp.co/circle-downloader",
|
|
5
|
+
"https://serp.co/products/circle-downloader/reviews/",
|
|
6
|
+
"https://chromewebstore.google.com/detail/circle-downloader/afjjgeafaiahjlcgnflgeojbjobglblg",
|
|
7
|
+
"https://whop.com/serp-downloaders/circle-downloader/"
|
|
8
|
+
]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
name: call-comment-on-gist
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
gist_id:
|
|
7
|
+
description: 'The ID of the gist to comment on'
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
content_source:
|
|
11
|
+
description: 'Source of comment content'
|
|
12
|
+
required: true
|
|
13
|
+
type: choice
|
|
14
|
+
options:
|
|
15
|
+
- file
|
|
16
|
+
- release
|
|
17
|
+
- issue
|
|
18
|
+
- direct
|
|
19
|
+
file_path:
|
|
20
|
+
description: 'Path to file (when content_source is file)'
|
|
21
|
+
required: false
|
|
22
|
+
type: string
|
|
23
|
+
release_tag:
|
|
24
|
+
description: 'Release tag (when content_source is release)'
|
|
25
|
+
required: false
|
|
26
|
+
type: string
|
|
27
|
+
issue_number:
|
|
28
|
+
description: 'Issue number (when content_source is issue)'
|
|
29
|
+
required: false
|
|
30
|
+
type: string
|
|
31
|
+
comment_text:
|
|
32
|
+
description: 'Direct comment text (when content_source is direct)'
|
|
33
|
+
required: false
|
|
34
|
+
type: string
|
|
35
|
+
|
|
36
|
+
jobs:
|
|
37
|
+
comment:
|
|
38
|
+
uses: devinschumacher/workflows/.github/workflows/comment-on-gist.yml@main
|
|
39
|
+
with:
|
|
40
|
+
gist_id: ${{ github.event.inputs.gist_id }}
|
|
41
|
+
content_source: ${{ github.event.inputs.content_source }}
|
|
42
|
+
file_path: ${{ github.event.inputs.file_path }}
|
|
43
|
+
release_tag: ${{ github.event.inputs.release_tag }}
|
|
44
|
+
issue_number: ${{ github.event.inputs.issue_number }}
|
|
45
|
+
comment_text: ${{ github.event.inputs.comment_text }}
|
|
46
|
+
# IMPORTANT: Replace GH_PAT with your secret name
|
|
47
|
+
# This secret must exist in your repository
|
|
48
|
+
github_token: ${{ secrets.GH_PAT }}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: call create gist
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
file_path:
|
|
7
|
+
description: 'Path to the markdown file (.md) to create as a gist'
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
jobs:
|
|
11
|
+
create:
|
|
12
|
+
permissions:
|
|
13
|
+
contents: write permissions:
|
|
14
|
+
contents: write create:
|
|
15
|
+
uses: devinschumacher/workflows/.github/workflows/create-gist.yml@main
|
|
16
|
+
with:
|
|
17
|
+
file_path: ${{ github.event.inputs.file_path }}
|
|
18
|
+
secrets:
|
|
19
|
+
# IMPORTANT: Replace GH_PAT with your secret name
|
|
20
|
+
# This secret must exist in your repository
|
|
21
|
+
# Go to Settings > Secrets and variables > Actions to add it
|
|
22
|
+
GH_PAT: ${{ secrets.GH_PAT }}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: Generate README from JSON
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
json_path:
|
|
7
|
+
description: 'Path to the JSON data file'
|
|
8
|
+
required: false
|
|
9
|
+
type: string
|
|
10
|
+
default: 'data/readme.json'
|
|
11
|
+
json_branch:
|
|
12
|
+
description: 'Branch containing the JSON data file'
|
|
13
|
+
required: false
|
|
14
|
+
type: string
|
|
15
|
+
default: 'assets'
|
|
16
|
+
script_path:
|
|
17
|
+
description: 'Path to the README generator script'
|
|
18
|
+
required: false
|
|
19
|
+
type: string
|
|
20
|
+
default: 'scripts/generate-readme.js'
|
|
21
|
+
script_branch:
|
|
22
|
+
description: 'Branch containing the generator script'
|
|
23
|
+
required: false
|
|
24
|
+
type: string
|
|
25
|
+
default: 'assets'
|
|
26
|
+
output_filename:
|
|
27
|
+
description: 'Name of the generated README file'
|
|
28
|
+
required: false
|
|
29
|
+
type: string
|
|
30
|
+
default: 'README.md'
|
|
31
|
+
output_branch:
|
|
32
|
+
description: 'Branch to commit the generated README to'
|
|
33
|
+
required: false
|
|
34
|
+
type: string
|
|
35
|
+
default: 'main'
|
|
36
|
+
commit_message:
|
|
37
|
+
description: 'Commit message for the generated README'
|
|
38
|
+
required: false
|
|
39
|
+
type: string
|
|
40
|
+
default: 'Auto-generate README from data.json'
|
|
41
|
+
|
|
42
|
+
permissions:
|
|
43
|
+
contents: write
|
|
44
|
+
pull-requests: write
|
|
45
|
+
actions: read
|
|
46
|
+
|
|
47
|
+
jobs:
|
|
48
|
+
generate-readme:
|
|
49
|
+
uses: serpapps/.github/.github/workflows/generate-readme-from-json.yml@main
|
|
50
|
+
permissions:
|
|
51
|
+
contents: write
|
|
52
|
+
secrets: inherit
|
|
53
|
+
with:
|
|
54
|
+
json_path: ${{ github.event.inputs.json_path || 'data/readme.json' }}
|
|
55
|
+
json_branch: ${{ github.event.inputs.json_branch || 'assets' }}
|
|
56
|
+
script_path: ${{ github.event.inputs.script_path || 'scripts/generate-readme.js' }}
|
|
57
|
+
script_branch: ${{ github.event.inputs.script_branch || 'assets' }}
|
|
58
|
+
output_filename: ${{ github.event.inputs.output_filename || 'README.md' }}
|
|
59
|
+
output_branch: ${{ github.event.inputs.output_branch || 'main' }}
|
|
60
|
+
commit_message: ${{ github.event.inputs.commit_message || 'Auto-generate README from data.json' }}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: call-update-gist
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
gist_id:
|
|
7
|
+
description: 'The ID of the gist to update'
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
file_path:
|
|
11
|
+
description: 'Path to the markdown file (.md) with updated content'
|
|
12
|
+
required: true
|
|
13
|
+
type: string
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
update:
|
|
17
|
+
uses: devinschumacher/workflows/.github/workflows/update-gist.yml@main
|
|
18
|
+
with:
|
|
19
|
+
gist_id: ${{ github.event.inputs.gist_id }}
|
|
20
|
+
file_path: ${{ github.event.inputs.file_path }}
|
|
21
|
+
secrets:
|
|
22
|
+
# IMPORTANT: Replace GH_PAT with your secret name
|
|
23
|
+
# This secret must exist in your repository
|
|
24
|
+
# Go to Settings > Secrets and variables > Actions to add it
|
|
25
|
+
GH_PAT: ${{ secrets.GH_PAT }}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Submit packages to Packagist
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
repo_urls:
|
|
7
|
+
description: |
|
|
8
|
+
JSON array of GitHub repo URLs to submit, e.g.
|
|
9
|
+
["https://github.com/org/repo1","https://github.com/org/repo2"]
|
|
10
|
+
Leave blank to use the default list in the test file.
|
|
11
|
+
required: false
|
|
12
|
+
type: string
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
submit:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Setup Node.js
|
|
23
|
+
uses: actions/setup-node@v4
|
|
24
|
+
with:
|
|
25
|
+
node-version: "20"
|
|
26
|
+
cache: "npm"
|
|
27
|
+
|
|
28
|
+
- name: Install dependencies
|
|
29
|
+
run: npm ci
|
|
30
|
+
|
|
31
|
+
- name: Install Playwright browsers
|
|
32
|
+
run: npx playwright install chromium --with-deps
|
|
33
|
+
|
|
34
|
+
- name: Write Packagist session to file
|
|
35
|
+
run: echo '${{ secrets.PACKAGIST_COOKIES }}' > /tmp/packagist-auth.json
|
|
36
|
+
|
|
37
|
+
- name: Run Packagist submission tests
|
|
38
|
+
env:
|
|
39
|
+
PLAYWRIGHT_STORAGE_STATE: /tmp/packagist-auth.json
|
|
40
|
+
REPO_URLS_JSON: ${{ github.event.inputs.repo_urls }}
|
|
41
|
+
run: npm test
|
|
42
|
+
|
|
43
|
+
- name: Upload results artifact
|
|
44
|
+
if: always()
|
|
45
|
+
uses: actions/upload-artifact@v4
|
|
46
|
+
with:
|
|
47
|
+
name: packagist-submitted
|
|
48
|
+
path: |
|
|
49
|
+
packagist-submitted.json
|
|
50
|
+
packagist-results.json
|
|
51
|
+
if-no-files-found: ignore
|
package/LICENSE
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
PROPRIETARY SOFTWARE LICENSE
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2026 Brian Farley & Devin Schumacher / SERP APPS. All Rights Reserved.
|
|
4
|
+
|
|
5
|
+
NOTICE: This software and all associated source code, documentation, and
|
|
6
|
+
related files (collectively, the "Software") are the exclusive property of
|
|
7
|
+
Brian Farley & Devin Schumacher / SERP APPS.
|
|
8
|
+
|
|
9
|
+
PERMISSIONS AND RESTRICTIONS
|
|
10
|
+
|
|
11
|
+
1. VIEWING ONLY
|
|
12
|
+
Permission is hereby granted to view the source code of this Software
|
|
13
|
+
solely for personal, non-commercial reference purposes.
|
|
14
|
+
|
|
15
|
+
2. NO COPYING
|
|
16
|
+
You may not reproduce, duplicate, or copy any portion of this Software,
|
|
17
|
+
in whole or in part, in any form or by any means.
|
|
18
|
+
|
|
19
|
+
3. NO MODIFICATION
|
|
20
|
+
You may not modify, adapt, alter, translate, decompile, disassemble,
|
|
21
|
+
reverse engineer, or create derivative works based on this Software.
|
|
22
|
+
|
|
23
|
+
4. NO DISTRIBUTION
|
|
24
|
+
You may not distribute, sublicense, lease, sell, resell, transfer,
|
|
25
|
+
publish, or otherwise make available this Software or any portion
|
|
26
|
+
thereof to any third party.
|
|
27
|
+
|
|
28
|
+
5. NO COMMERCIAL USE
|
|
29
|
+
You may not use this Software, or any portion thereof, for any
|
|
30
|
+
commercial purpose without prior written permission from the copyright
|
|
31
|
+
holder.
|
|
32
|
+
|
|
33
|
+
6. NO FORKING
|
|
34
|
+
Forking this repository on GitHub or any other platform does not grant
|
|
35
|
+
you any rights beyond those explicitly stated in this license. Any fork
|
|
36
|
+
remains subject to all restrictions herein.
|
|
37
|
+
|
|
38
|
+
WRITTEN PERMISSION
|
|
39
|
+
|
|
40
|
+
Any use of this Software beyond what is expressly permitted in Section 1
|
|
41
|
+
above requires prior written permission from the copyright holder. Requests
|
|
42
|
+
may be directed to: help@serp.co
|
|
43
|
+
|
|
44
|
+
ENFORCEMENT
|
|
45
|
+
|
|
46
|
+
Unauthorized use, reproduction, modification, or distribution of this
|
|
47
|
+
Software may result in civil and criminal penalties. The copyright holder
|
|
48
|
+
reserves the right to pursue all available legal remedies for any violation
|
|
49
|
+
of this license.
|
|
50
|
+
|
|
51
|
+
DISCLAIMER
|
|
52
|
+
|
|
53
|
+
THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
54
|
+
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
55
|
+
FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
56
|
+
THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY,
|
|
57
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF,
|
|
58
|
+
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
59
|
+
SOFTWARE.
|
|
60
|
+
|
|
61
|
+
For licensing inquiries: help@serp.co
|
package/README.md
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# Circle Downloader (Browser Extension)
|
|
2
|
+
|
|
3
|
+
> Browser extension that adds a download button to Circle.so community pages — detects videos from Circle's native player, Tella, Loom, Vimeo, YouTube, and Wistia, and saves them as MP4 for offline viewing.
|
|
4
|
+
|
|
5
|
+
A browser extension that downloads videos from Circle.so communities, Tella.tv recordings, Loom videos, and embedded content from YouTube, Vimeo, and Wistia — directly to your computer as MP4 files. No external software needed. 3 free downloads included.
|
|
6
|
+
|
|
7
|
+
- Save entire Circle classrooms and course content for unlimited offline access anytime, anywhere
|
|
8
|
+
- Protect your educational investment by downloading all materials before courses expire or disappear
|
|
9
|
+
- Create a personal library of video lectures, coaching calls, and resources that you own forever
|
|
10
|
+
- Never lose access to paid courses again — backup everything before platforms shut down or remove content
|
|
11
|
+
|
|
12
|
+
<a href="https://www.youtube.com/watch?v=_8XKKHj0eLs" target="_blank">
|
|
13
|
+
<img src="https://raw.githubusercontent.com/devinschumacher/uploads/refs/heads/main/images/how-to-download-circle-so-videos-for-free-hls-m3u8-streams.jpg" width="700px">
|
|
14
|
+
</a>
|
|
15
|
+
|
|
16
|
+
## Links
|
|
17
|
+
|
|
18
|
+
- :rocket: Get it here: [Circle Downloader](https://serp.ly/circle-downloader)
|
|
19
|
+
- :new: Latest release: [GitHub Releases](https://github.com/serpapps/circle-downloader/releases/latest)
|
|
20
|
+
- :question: Help center: [SERP Help](https://help.serp.co/en/)
|
|
21
|
+
- :beetle: Report bugs: [GitHub Issues](https://github.com/serpapps/circle-downloader/issues)
|
|
22
|
+
- :bulb: Request features: [Feature Requests](https://github.com/serpapps/circle-downloader/issues)
|
|
23
|
+
|
|
24
|
+
## Table of Contents
|
|
25
|
+
|
|
26
|
+
- [Why Circle Downloader](#why-circle-downloader)
|
|
27
|
+
- [Features](#features)
|
|
28
|
+
- [How It Works](#how-it-works)
|
|
29
|
+
- [Supported Platforms](#supported-platforms)
|
|
30
|
+
- [Videos](#videos)
|
|
31
|
+
- [Trial & Access](#trial--access)
|
|
32
|
+
- [Installation Instructions](#installation-instructions)
|
|
33
|
+
- [Downloading Member-Only Content](#downloading-member-only-content)
|
|
34
|
+
- [Frequently Asked Questions](#frequently-asked-questions)
|
|
35
|
+
- [Troubleshooting](#troubleshooting)
|
|
36
|
+
- [License](#license)
|
|
37
|
+
- [Related](#related)
|
|
38
|
+
|
|
39
|
+
## Why Circle Downloader
|
|
40
|
+
|
|
41
|
+
Circle.so has no native download button. Tella recordings expire. Loom auto-deletes older videos on free plans. Course platforms embed videos from multiple sources with no unified download option.
|
|
42
|
+
|
|
43
|
+
Circle Downloader handles all of them in one extension — detecting videos across 7+ platforms and converting HLS/DASH streams to standard MP4 files directly in your browser. Open a lesson or post with a video, click the extension icon, pick your quality, and it saves as MP4.
|
|
44
|
+
|
|
45
|
+
## Features
|
|
46
|
+
|
|
47
|
+
- **Multi-platform detection** — Circle.so, Tella.tv, Loom.com, YouTube, Vimeo, Wistia, and generic embedded players
|
|
48
|
+
- **Finds hidden embeds** — detects players buried inside Circle.so web components
|
|
49
|
+
- **Stream-to-MP4 conversion** — converts HLS/DASH streaming video to downloadable MP4 in-browser
|
|
50
|
+
- **Quality selector** — all available resolutions per platform with bitrate and estimated file size
|
|
51
|
+
- **Concurrent downloads** — up to 3 simultaneous downloads with real-time progress, speed, and cancel
|
|
52
|
+
- **Batch download queue** — add multiple lessons and process them automatically
|
|
53
|
+
- **YouTube URL display** — one-click yt-dlp copy for Mac and Windows
|
|
54
|
+
- **Right-click context menu** — quick downloads without opening the popup
|
|
55
|
+
- **Auto-organized storage** — saves to a Circle Downloader subfolder in Downloads
|
|
56
|
+
- **Desktop notifications** — alerts when downloads complete or fail
|
|
57
|
+
- **Original quality preserved** — no re-encoding, no watermarks, no quality loss
|
|
58
|
+
- **Privacy-first** — all processing on-device, zero tracking, no data sent to external servers
|
|
59
|
+
- **100% privacy-friendly** — no tracking or data collection
|
|
60
|
+
- 1-on-1 support via our community
|
|
61
|
+
|
|
62
|
+
### Supported Platforms & Pages
|
|
63
|
+
|
|
64
|
+
| Content Type | Circle Native | YouTube | Vimeo | Wistia | Loom | Tella |
|
|
65
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
66
|
+
| Course Lessons | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
67
|
+
| Community Posts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
68
|
+
| Coaching Calls | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
69
|
+
| Member-Only Content | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
70
|
+
|
|
71
|
+
### Supported Browsers
|
|
72
|
+
|
|
73
|
+
Chrome, Edge, Brave, Opera, Firefox, Whale, and Yandex — on Windows, macOS, and Linux.
|
|
74
|
+
|
|
75
|
+
### Supported Formats
|
|
76
|
+
|
|
77
|
+
- **Input:** Circle.so, Tella.tv, Loom.com, YouTube, Vimeo, Wistia, and generic embedded players
|
|
78
|
+
- **Output:** MP4
|
|
79
|
+
|
|
80
|
+
## How It Works
|
|
81
|
+
|
|
82
|
+
1. **Install** — Add SERP Circle Downloader to your browser
|
|
83
|
+
2. **Navigate** — Go to a Circle.so lesson, Tella recording, Loom video, or any page with embedded video
|
|
84
|
+
3. **Play** — Start the video so the extension can detect the stream
|
|
85
|
+
4. **Download** — Click the extension icon, pick your quality, and hit Download — saved as MP4
|
|
86
|
+
|
|
87
|
+
## Videos
|
|
88
|
+
|
|
89
|
+
<a href="https://www.youtube.com/watch?v=_8XKKHj0eLs" target="_blank">
|
|
90
|
+
<img src="https://raw.githubusercontent.com/devinschumacher/uploads/refs/heads/main/images/how-to-download-circle-so-videos-for-free-hls-m3u8-streams.jpg" width="700px">
|
|
91
|
+
</a>
|
|
92
|
+
|
|
93
|
+
## Trial & Access
|
|
94
|
+
|
|
95
|
+
- Includes **3 free downloads** after email sign-in (OTP verification)
|
|
96
|
+
- No credit card required for the free trial
|
|
97
|
+
- Unlimited downloads available with a license
|
|
98
|
+
|
|
99
|
+
## Installation Instructions
|
|
100
|
+
|
|
101
|
+
Each release has its own specific installation instructions to make it easier to upgrade, or rollback, to different versions.
|
|
102
|
+
You can find the installation instructions for the specific version in the release:
|
|
103
|
+
|
|
104
|
+
- <https://github.com/serpapps/circle-downloader/releases>
|
|
105
|
+
|
|
106
|
+
## Downloading Member-Only Content
|
|
107
|
+
|
|
108
|
+
The Circle Downloader extension respects your existing Circle login and permissions. If you can view a post in your community — whether it's public, member-only, or restricted — the extension can download it using your authentication.
|
|
109
|
+
|
|
110
|
+
**Key Points:**
|
|
111
|
+
- Your existing Circle login is used automatically in the background
|
|
112
|
+
- No separate passwords or credentials needed
|
|
113
|
+
- Works for private communities, restricted posts, and member-exclusive lessons
|
|
114
|
+
- Downloads happen entirely on your device with no data sent to third parties
|
|
115
|
+
|
|
116
|
+
## Frequently Asked Questions
|
|
117
|
+
|
|
118
|
+
### Q: What sites does this extension support?
|
|
119
|
+
|
|
120
|
+
A: Circle.so (and Circle.com), Tella.tv, Loom.com, YouTube.com, Vimeo.com, and Wistia.com. It also detects generic embedded video players on other sites.
|
|
121
|
+
|
|
122
|
+
### Q: Does this work on native Circle videos?
|
|
123
|
+
|
|
124
|
+
A: Yes.
|
|
125
|
+
|
|
126
|
+
### Q: Does this work on 2+ hour long videos?
|
|
127
|
+
|
|
128
|
+
A: Yes.
|
|
129
|
+
|
|
130
|
+
### Q: Does this work on Loom/Tella videos embedded in Circle?
|
|
131
|
+
|
|
132
|
+
A: Yes.
|
|
133
|
+
|
|
134
|
+
### Q: Can I download multiple videos at once?
|
|
135
|
+
|
|
136
|
+
A: Yes. The extension supports up to 3 concurrent downloads with individual progress tracking. Additional videos are added to an automatic queue.
|
|
137
|
+
|
|
138
|
+
### Q: What quality options are available?
|
|
139
|
+
|
|
140
|
+
A: The extension detects all available resolutions from the source platform and lists them in the quality selector, sorted highest to lowest. Each option shows resolution, bitrate, and estimated file size.
|
|
141
|
+
|
|
142
|
+
### Q: Does downloading preserve the original quality?
|
|
143
|
+
|
|
144
|
+
A: Yes. For adaptive streams (HLS/DASH), the extension downloads segments and merges them into a single MP4 without re-encoding. Direct MP4 uploads are saved at full quality instantly.
|
|
145
|
+
|
|
146
|
+
### Q: Where are my downloads saved?
|
|
147
|
+
|
|
148
|
+
A: Videos automatically save to a Circle Downloader subfolder inside your browser's default Downloads directory. You can also set a custom default download location.
|
|
149
|
+
|
|
150
|
+
### Q: Can I download member-only or private content?
|
|
151
|
+
|
|
152
|
+
A: Yes. If you can view the post in Circle, the extension can download it using your existing Circle login. Authentication happens automatically in the background.
|
|
153
|
+
|
|
154
|
+
### Q: Why isn't the extension finding my video?
|
|
155
|
+
|
|
156
|
+
A: Press play on the video first. The extension needs the stream to start before detection works. If issues persist, refresh the page and try again.
|
|
157
|
+
|
|
158
|
+
### Q: Is there a free trial?
|
|
159
|
+
|
|
160
|
+
A: Yes — 3 free downloads after email sign-in. No credit card required. Unlimited downloads available with a license.
|
|
161
|
+
|
|
162
|
+
### Q: Is my data safe?
|
|
163
|
+
|
|
164
|
+
A: Yes. All video processing happens entirely in your browser. No video data is sent to external servers. Your Circle login credentials are never shared.
|
|
165
|
+
|
|
166
|
+
## Troubleshooting
|
|
167
|
+
|
|
168
|
+
### Videos Not Detecting
|
|
169
|
+
|
|
170
|
+
1. Refresh the Circle post page
|
|
171
|
+
2. Press play on the video first — the extension needs the stream active
|
|
172
|
+
3. Make sure you're logged into your Circle community
|
|
173
|
+
4. Try clearing browser cache and reloading
|
|
174
|
+
5. Check that JavaScript is enabled in your browser
|
|
175
|
+
6. Disable browser extensions that might interfere (ad blockers, etc.)
|
|
176
|
+
|
|
177
|
+
### Download Failures
|
|
178
|
+
|
|
179
|
+
1. Check your internet connection stability
|
|
180
|
+
2. Try downloading in a lower quality
|
|
181
|
+
3. Reduce concurrent downloads to 1
|
|
182
|
+
4. Ensure you have sufficient disk space
|
|
183
|
+
5. Try a different browser to rule out browser-specific issues
|
|
184
|
+
|
|
185
|
+
### Authentication Issues
|
|
186
|
+
|
|
187
|
+
1. Make sure you're logged into Circle in your browser
|
|
188
|
+
2. Refresh the page and try again
|
|
189
|
+
3. Check that cookies are enabled
|
|
190
|
+
4. Log out and log back into Circle
|
|
191
|
+
5. Clear browser cookies for circle.so and try again
|
|
192
|
+
|
|
193
|
+
### File Playback Issues
|
|
194
|
+
|
|
195
|
+
1. Try a different video player (VLC, Windows Media Player, QuickTime)
|
|
196
|
+
2. Check file format — should be .mp4
|
|
197
|
+
3. Ensure download completed fully (check file size)
|
|
198
|
+
4. Update your video player to the latest version
|
|
199
|
+
5. Try re-downloading the video
|
|
200
|
+
|
|
201
|
+
## License
|
|
202
|
+
|
|
203
|
+
This repository is distributed under the proprietary SERP Apps license in the [LICENSE](LICENSE) file. Review that file before copying, modifying, or redistributing any part of this project.
|
|
204
|
+
|
|
205
|
+
## About
|
|
206
|
+
|
|
207
|
+
Circle.so is a community platform for creators, educators, and businesses to host courses, coaching programs, and member communities. However, like many course platforms, they don't provide a way to download the videos that you (the actual users) pay for access to — or even offer an offline viewing option.
|
|
208
|
+
|
|
209
|
+
So we created a way for you to download your Circle.so community videos even if you're not technically inclined.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Related
|
|
214
|
+
|
|
215
|
+
- [Circle Downloader](https://github.com/serpapps/circle-downloader)
|
|
216
|
+
- [How to download circle videos for free](https://gist.github.com/devinschumacher/5910965cbff1e563e120dbd2df06d4ba)
|
package/composer.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "serpapps/circle-downloader",
|
|
3
|
+
"type": "library",
|
|
4
|
+
"description": "Download Circle course videos to save offline for convenient viewing and content backup",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"circle-downloader",
|
|
7
|
+
"circle-so-video-downloader",
|
|
8
|
+
"circle-video-downloader",
|
|
9
|
+
"browser-extension",
|
|
10
|
+
"course-video-downloader"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://github.com/serpapps/circle-downloader",
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"authors": [
|
|
15
|
+
{
|
|
16
|
+
"name": "SERP Apps",
|
|
17
|
+
"homepage": "https://github.com/serpapps",
|
|
18
|
+
"role": "Developer"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"require": {
|
|
22
|
+
"php": ">=7.4"
|
|
23
|
+
}
|
|
24
|
+
}
|
package/data/readme.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": 12,
|
|
3
|
+
"created_at": "2025-01-23T00:00:00Z",
|
|
4
|
+
"seo_title": "Circle Downloader - Free Content Download Tool",
|
|
5
|
+
"seo_description": null,
|
|
6
|
+
"product_page_url": "https://store.serp.co/product-details/product/circle-downloader",
|
|
7
|
+
"purchase_url": "https://serp.ly/circle-downloader",
|
|
8
|
+
"store_product_id": null,
|
|
9
|
+
"name": "Circle Downloader",
|
|
10
|
+
"tagline": "Download Circle community content including posts, videos, and course materials",
|
|
11
|
+
"featured_image": "https://raw.githubusercontent.com/serpapps/circle-downloader/assets/images/circle-downloader.jpg",
|
|
12
|
+
"featured_image_gif": "https://raw.githubusercontent.com/serpapps/circle-downloader/assets/images/circle-downloader.gif",
|
|
13
|
+
"github_repo_url": "https://github.com/serpapps/circle-downloader",
|
|
14
|
+
"github_repo_tags": [
|
|
15
|
+
"circle-downloader"
|
|
16
|
+
],
|
|
17
|
+
"github_gist_url": null,
|
|
18
|
+
"features": [
|
|
19
|
+
"Stream-to-file conversion",
|
|
20
|
+
"HD quality downloads",
|
|
21
|
+
"Batch download support",
|
|
22
|
+
"Resume interrupted downloads",
|
|
23
|
+
"No watermarks",
|
|
24
|
+
"Content extraction"
|
|
25
|
+
],
|
|
26
|
+
"chrome_web_store_url": null,
|
|
27
|
+
"description": "Circle Downloader is a powerful tool that helps you download content from Circle instantly without ads or popups. Built with modern technologies, it provides a seamless experience for downloading and managing content.",
|
|
28
|
+
"product_video": null,
|
|
29
|
+
"related_videos": null,
|
|
30
|
+
"changelog": null,
|
|
31
|
+
"version_number": 1,
|
|
32
|
+
"updated_at": "2025-01-23T00:00:00Z",
|
|
33
|
+
"troubleshooting_instructions": [],
|
|
34
|
+
"installation_instructions": "1. Clone the repository: git clone https://github.com/serpapps/circle-downloader\n2. Install dependencies\n3. Configure settings\n4. Run the application",
|
|
35
|
+
"usage_instructions": [
|
|
36
|
+
"Open the application",
|
|
37
|
+
"Enter the URL of the content you want to download",
|
|
38
|
+
"Select your preferred quality and format",
|
|
39
|
+
"Click download to start the process",
|
|
40
|
+
"Files will be saved to your specified directory"
|
|
41
|
+
],
|
|
42
|
+
"faqs": null,
|
|
43
|
+
"supported_operating_systems": [
|
|
44
|
+
"windows",
|
|
45
|
+
"macos",
|
|
46
|
+
"linux"
|
|
47
|
+
],
|
|
48
|
+
"status": "live",
|
|
49
|
+
"technologies": [
|
|
50
|
+
"Python",
|
|
51
|
+
"JavaScript",
|
|
52
|
+
"Node.js",
|
|
53
|
+
"Automation"
|
|
54
|
+
],
|
|
55
|
+
"serpco_product_page_link": "https://serp.co/products/circle-downloader/reviews/",
|
|
56
|
+
"serpai_product_page_link": "https://serp.ai/products/circle-downloader/reviews/",
|
|
57
|
+
"file_formats": null,
|
|
58
|
+
"categories": [
|
|
59
|
+
"community site"
|
|
60
|
+
],
|
|
61
|
+
"extraction_targets": null,
|
|
62
|
+
"content_medium": null,
|
|
63
|
+
"discovery_source": null,
|
|
64
|
+
"related_articles": null,
|
|
65
|
+
"related_gists": null,
|
|
66
|
+
"funding_links_github": [
|
|
67
|
+
"devinschumacher"
|
|
68
|
+
],
|
|
69
|
+
"funding_links_liberapay": [
|
|
70
|
+
"devinschumacher"
|
|
71
|
+
],
|
|
72
|
+
"funding_links_opencollective": [
|
|
73
|
+
"devinschumacher"
|
|
74
|
+
],
|
|
75
|
+
"funding_links_custom": [
|
|
76
|
+
"https://serpapps.github.io/circle-downloader",
|
|
77
|
+
"https://devinschumacher.com/circle-downloader",
|
|
78
|
+
"https://serp.co/products/circle-downloader/",
|
|
79
|
+
"https://github.com/sponsors/devinschumacher"
|
|
80
|
+
],
|
|
81
|
+
"keywords": [
|
|
82
|
+
"circle downloader"
|
|
83
|
+
]
|
|
84
|
+
}
|
package/images/.gitkeep
ADDED
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<svg width="798" height="494" viewBox="0 0 798 494" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect width="798" height="494" fill="#1f1f1f"/>
|
|
3
|
+
<rect x="0" y="0" width="798" height="36" fill="#263238"/>
|
|
4
|
+
<rect x="0" y="36" width="798" height="28" fill="#2f3a3d"/>
|
|
5
|
+
<rect x="0" y="64" width="798" height="72" fill="#d8d8d8"/>
|
|
6
|
+
<rect x="0" y="144" width="798" height="60" fill="#3c3a3a"/>
|
|
7
|
+
<rect x="0" y="212" width="798" height="62" fill="#2c2c2c"/>
|
|
8
|
+
<rect x="0" y="279" width="798" height="43" fill="#171717"/>
|
|
9
|
+
<rect x="0" y="323" width="798" height="43" fill="#191919"/>
|
|
10
|
+
<rect x="0" y="367" width="798" height="43" fill="#1b1b1b"/>
|
|
11
|
+
<rect x="0" y="411" width="798" height="83" fill="#242424"/>
|
|
12
|
+
|
|
13
|
+
<rect x="0" y="135" width="798" height="9" fill="#0e0e0e"/>
|
|
14
|
+
<rect x="0" y="204" width="798" height="8" fill="#0e0e0e"/>
|
|
15
|
+
<rect x="0" y="274" width="798" height="5" fill="#2d2d2d"/>
|
|
16
|
+
|
|
17
|
+
<rect x="-7" y="87" width="67" height="39" rx="19.5" fill="#c7d9df"/>
|
|
18
|
+
<text x="27" y="110" text-anchor="middle" fill="#14303A" font-family="Arial, sans-serif" font-size="14">Cancel</text>
|
|
19
|
+
|
|
20
|
+
<circle cx="19" cy="173" r="13" fill="#5b5b5b"/>
|
|
21
|
+
<rect x="31" y="165" width="142" height="15" rx="7.5" fill="#d8d8d8" fill-opacity="0.95"/>
|
|
22
|
+
<text x="31" y="178" fill="#efefef" font-family="Arial, sans-serif" font-size="16">Search mail</text>
|
|
23
|
+
|
|
24
|
+
<circle cx="30" cy="301" r="10" fill="#121212" stroke="#6a6a6a" stroke-width="1.5"/>
|
|
25
|
+
<path d="M26 301L29 304L34 297" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
26
|
+
<path d="M47 295L47 307" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round"/>
|
|
27
|
+
<path d="M42 301H52" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round"/>
|
|
28
|
+
<polygon points="79,294 86,301 79,308" fill="#9d9d9d"/>
|
|
29
|
+
<path d="M103 293C106 296 106 306 103 309" stroke="#8c8c8c" stroke-width="3" stroke-linecap="round"/>
|
|
30
|
+
<circle cx="120" cy="301" r="3" fill="#a5a5a5"/>
|
|
31
|
+
<circle cx="120" cy="292" r="3" fill="#a5a5a5"/>
|
|
32
|
+
<circle cx="120" cy="310" r="3" fill="#a5a5a5"/>
|
|
33
|
+
|
|
34
|
+
<circle cx="30" cy="345" r="10" fill="#121212" stroke="#6a6a6a" stroke-width="1.5"/>
|
|
35
|
+
<path d="M26 345L29 348L34 341" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
36
|
+
<path d="M47 339L47 351" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round"/>
|
|
37
|
+
<polygon points="79,338 86,345 79,352" fill="#9d9d9d"/>
|
|
38
|
+
<text x="104" y="349" fill="#bcbcbc" font-family="Arial, sans-serif" font-size="14">noreply</text>
|
|
39
|
+
<text x="305" y="349" fill="#d7d7d7" font-family="Arial, sans-serif" font-size="15">Your SERP sign-in code - Enter this code to sign in:</text>
|
|
40
|
+
<text x="716" y="349" fill="#bdbdbd" font-family="Arial, sans-serif" font-size="15">895575</text>
|
|
41
|
+
|
|
42
|
+
<circle cx="30" cy="388" r="10" fill="#121212" stroke="#6a6a6a" stroke-width="1.5"/>
|
|
43
|
+
<path d="M26 388L29 391L34 384" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
44
|
+
<path d="M47 382L47 394" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round"/>
|
|
45
|
+
<text x="57" y="392" fill="#bcbcbc" font-family="Arial, sans-serif" font-size="14">'Chrome Web Store'</text>
|
|
46
|
+
<text x="305" y="392" fill="#cfcfcf" font-family="Arial, sans-serif" font-size="15">Chrome Web Store: Rejection notification for Downloader for</text>
|
|
47
|
+
|
|
48
|
+
<circle cx="30" cy="432" r="10" fill="#121212" stroke="#6a6a6a" stroke-width="1.5"/>
|
|
49
|
+
<path d="M26 432L29 435L34 428" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
50
|
+
<path d="M47 426L47 438" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round"/>
|
|
51
|
+
<text x="57" y="436" fill="#bcbcbc" font-family="Arial, sans-serif" font-size="14">Chrome Web Store</text>
|
|
52
|
+
<text x="305" y="436" fill="#cfcfcf" font-family="Arial, sans-serif" font-size="15">Chrome Web Store: Rejection notification for Downloader for</text>
|
|
53
|
+
|
|
54
|
+
<circle cx="30" cy="476" r="10" fill="#121212" stroke="#6a6a6a" stroke-width="1.5"/>
|
|
55
|
+
<path d="M26 476L29 479L34 472" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
56
|
+
<path d="M47 470L47 482" stroke="#f5f5f5" stroke-width="2" stroke-linecap="round"/>
|
|
57
|
+
<text x="57" y="480" fill="#bcbcbc" font-family="Arial, sans-serif" font-size="14">Adammataafa - SERP</text>
|
|
58
|
+
<text x="305" y="480" fill="#cfcfcf" font-family="Arial, sans-serif" font-size="15">Re: Sure no worries! Let us know if you have any other issues</text>
|
|
59
|
+
|
|
60
|
+
<line x1="583" y1="194" x2="742" y2="305" stroke="#ff1d1d" stroke-width="3"/>
|
|
61
|
+
<polygon points="742,305 726,301 734,289" fill="#ff1d1d"/>
|
|
62
|
+
</svg>
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
// placeholder
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@serpdownloaders/circle-downloader",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "circle-downloader",
|
|
5
|
+
"keywords": ["circle-downloader", "automation"],
|
|
6
|
+
"homepage": "https://serp.ly/circle-downloader",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/serpapps/circle-downloader.git"
|
|
10
|
+
},
|
|
11
|
+
"author": {
|
|
12
|
+
"name": "Devin Schumacher",
|
|
13
|
+
"url": "https://devinschumacher.com"
|
|
14
|
+
},
|
|
15
|
+
"contributors": [
|
|
16
|
+
{"name":"Devin Schumacher","url":"https://devinschumacher.com"},
|
|
17
|
+
{"name":"Devin Schumacher","url":"https://youtube.com/@devinschumacher"},
|
|
18
|
+
{"name":"Devin Schumacher","url":"https://github.com/devinschumacher"},
|
|
19
|
+
{"name":"Devin Schumacher","url":"https://gist.github.com/devinschumacher"},
|
|
20
|
+
{"name":"SERP Apps","url":"https://github.com/serpapps"},
|
|
21
|
+
{"name":"SERP Downloaders","url":"https://github.com/serpdownloaders"}
|
|
22
|
+
],
|
|
23
|
+
"license": "UNLICENSED",
|
|
24
|
+
"private": false,
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
}
|
|
28
|
+
}
|