Skip to content

Instantly share code, notes, and snippets.

@devinschumacher
Last active November 7, 2025 06:30
Show Gist options
  • Save devinschumacher/5910965cbff1e563e120dbd2df06d4ba to your computer and use it in GitHub Desktop.
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.

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