Skip to content

Instantly share code, notes, and snippets.

@devinschumacher
Last active December 10, 2025 22:46
Show Gist options
  • Select an option

  • Save devinschumacher/5910965cbff1e563e120dbd2df06d4ba to your computer and use it in GitHub Desktop.

Select an option

Save devinschumacher/5910965cbff1e563e120dbd2df06d4ba to your computer and use it in GitHub Desktop.
How to Download Circle.so Videos for Free (using yt-dlp)

How to Download Circle.so Videos for Free (HLS m3u8 Streams) - using yt-dlp

Circle.so hosts course videos using HLS streaming, where video data is split into .ts segments and controlled by a .m3u8 playlist file.

This guide shows you how to download, optimize, and auto-name Circle Academy videos with a single command on macOS.

๐Ÿ’ก Tip: Donโ€™t want to do this manually?

Try the Circle Video Downloader โ€” it automatically detects and saves circle.so videos in one click. Or check out the code repository


๐Ÿ” Step 1 โ€” Identify the Stream Type

  1. Open Developer Tools โ†’ Network in your browser.
  2. Filter by m3u8.
  3. Youโ€™ll see URLs like:
https://cdn-media.circle.so/.../playlist.m3u8

or

https://cdn-media.circle.so/.../playlist_1.m3u8

โœ… Use the playlist.m3u8 file (the master manifest).


โš™๏ธ Step 2 โ€” Copy the Universal Command Template

This is your reusable one-liner template.
It handles download, metadata optimization, and QuickLook thumbnail compatibility.

yt-dlp -o "%(title)s.%(ext)s" "<PASTE_M3U8_URL_HERE>"   --exec 'ffmpeg -y -i "{}" -movflags +faststart -pix_fmt yuv420p -c copy "{}_fixed.mp4" && mv "{}_fixed.mp4" "{}"'

๐Ÿ’ก Keep this saved somewhere โ€” youโ€™ll just swap out the placeholder each time.


๐Ÿš€ Step 3 โ€” Replace the Placeholder URL and Run It

  1. Go back to DevTools and copy your actual .m3u8 link.
  2. Replace <PASTE_M3U8_URL_HERE> in the command with your real link.
  3. Paste it into Terminal and hit Enter.

โœ… It will automatically:

  • Download all .ts segments and merge them.
  • Dynamically name the file based on video metadata.
  • Add faststart and pixel formatting for Finder previews.
  • Replace the original file with the optimized one.

๐Ÿง  Step 4 โ€” What Each Flag Does

Flag Purpose
-o "%(title)s.%(ext)s" Dynamically name the file based on metadata.
--exec 'ffmpeg ...' Run ffmpeg automatically after download.
-movflags +faststart Moves metadata to the start of file for instant playback.
-pix_fmt yuv420p Ensures Finder and QuickLook compatibility.
-c copy No re-encoding (lossless).

๐Ÿงฉ Troubleshooting

Issue Cause Fix
Token expired Circleโ€™s CDN tokens expire quickly. Refresh the page and grab a fresh .m3u8 link.
No title metadata Some Circle embeds omit titles. yt-dlp will fallback to a timestamp-based filename.
No thumbnail still macOS caching delay. Run qlmanage -r cache to refresh Finder previews.

โœ… Summary

  • Find the .m3u8 link under Network โ†’ Media.
  • Use the master playlist.m3u8, not the _1.m3u8 variant.
  • Copy the template command from Step 2.
  • Replace the placeholder URL in Step 3.
  • Youโ€™ll get a Finder-previewable .mp4 auto-named and ready to use.

๐Ÿ’ก Tip: Prefer a one-click solution?
Use the Circle Video Downloader to automatically detect, download, and merge Circle.so course videos without touching the command line.

Related

@dscherpenhuizen-cmd
Copy link

dscherpenhuizen-cmd commented Dec 10, 2025

I have found a much easier way:

  1. Search the video you want to download, right click and choose "Inspect".
  2. In Elements find <media-theme template=โ€ฆ, in that url search for downloadurl="https://assets-v2.circle.so/{video-id}"
  3. Paste https://assets-v2.circle.so/{video-id} in a new window, it automatically wants a save location.
  4. Save it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment