TikTok LIVE stream recorder for Python. Capture any TikTok LIVE stream to MP4 with one command. HLS + FLV support, scheduled records, ffmpeg under the hood. 2026 edition.
Project description
tiktok-live-recorder
Record any TikTok LIVE stream to MP4 in one command.
CLI + Python SDK. HLS + FLV input. Uses ffmpeg under the hood. Schedule, monitor, auto-archive. 2026 edition.
Install
pip install tiktok-live-recorder
ffmpeg must be on PATH:
- Windows: download from https://www.gyan.dev/ffmpeg/builds/ and add
binto PATH. - macOS:
brew install ffmpeg - Linux:
sudo apt install ffmpeg(Debian/Ubuntu) orsudo dnf install ffmpeg(Fedora).
CLI
tiktok-live-recorder streamer_username
No key. No config. Just run it.
tiktok-live-recorder <username> [options]
Options:
-o, --out <file> Output file (default: <username>-<timestamp>.mp4)
-q, --quality <q> origin | FULL_HD1 | HD1 | SD1 | SD2 (default: origin)
-c, --container <ext> mp4 | flv | ts | mkv (default: mp4)
--max <seconds> Stop after N seconds
-v, --verbose Print ffmpeg output
Examples:
# Record at best quality
tiktok-live-recorder streamer
# Cap at 2 hours, save to a named file
tiktok-live-recorder streamer --out 2026-06-07.mp4 --max 7200
# Save as FLV (no remux)
tiktok-live-recorder streamer -q origin -c flv
# Run as a module
python -m tiktok_live_recorder streamer
The CLI exits with code 2 when the user is offline so you can chain it in a watcher script:
while ! tiktok-live-recorder streamer; do sleep 30; done
SDK
Quick start
from tiktok_live_recorder import TikTokLiveRecorder
rec = TikTokLiveRecorder("streamer")
out_file, duration = rec.record(quality="origin")
print(f"Wrote {out_file} ({duration}s)")
Constructor
TikTokLiveRecorder(unique_id, *, endpoint=STREAM_URL_ENDPOINT, api_key="")
| Argument | Type | Default | Description |
|---|---|---|---|
unique_id |
str |
- | TikTok username (with or without @). |
endpoint |
str |
https://api.tik.tools/webcast/stream_url |
Override the URL resolver. |
api_key |
str |
"" |
Optional API key for higher-quality endpoints. |
rec.resolve() -> StreamSources
Return the available HLS / FLV URLs for the user without starting a recording.
sources = rec.resolve()
if not sources.live:
print("offline")
else:
print("HLS origin:", sources.hls.get("origin"))
rec.record(...) -> tuple[str, int]
Capture to disk. Returns (out_file, duration_sec). Resolves when the stream goes offline, max_duration_sec hits, or the user hits Ctrl+C.
| Argument | Type | Default | Description |
|---|---|---|---|
out_file |
`str | None` | <uniqueId>-<timestamp>.mp4 |
quality |
str |
"origin" |
Preferred quality. Falls back to next available. |
container |
str |
"mp4" |
mp4 / flv / ts / mkv. |
ffmpeg_path |
str |
"ffmpeg" |
Override the ffmpeg binary location. |
max_duration_sec |
`int | None` | - |
verbose |
bool |
False |
Print ffmpeg stderr. |
on_segment_start |
Callable[[str], None] |
- | Callback when a new segment file starts. |
on_segment_end |
Callable[[str], None] |
- | Callback when a segment file closes. |
Errors
from tiktok_live_recorder import (
TikTokLiveRecorder,
StreamOfflineError,
FfmpegMissingError,
)
rec = TikTokLiveRecorder("streamer")
try:
rec.record()
except StreamOfflineError:
print("not live")
except FfmpegMissingError:
print("install ffmpeg")
Recipes
Watch + record (poll every 30s)
import time
from tiktok_live_recorder import TikTokLiveRecorder, StreamOfflineError
rec = TikTokLiveRecorder("streamer")
while True:
try:
out_file, duration = rec.record()
print(f"captured {out_file} ({duration}s)")
except StreamOfflineError:
print("offline, retry in 30s")
time.sleep(30)
Batch record multiple creators concurrently
import concurrent.futures
from tiktok_live_recorder import TikTokLiveRecorder, StreamOfflineError
USERNAMES = ["a", "b", "c"]
def record_one(u: str) -> str:
try:
out_file, _ = TikTokLiveRecorder(u).record(out_file=f"{u}.mp4")
return f"{u} -> {out_file}"
except StreamOfflineError:
return f"{u} offline"
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as ex:
for r in ex.map(record_one, USERNAMES):
print(r)
Time-capped clip
from tiktok_live_recorder import TikTokLiveRecorder
rec = TikTokLiveRecorder("streamer")
out_file, _ = rec.record(max_duration_sec=60, out_file="clip.mp4")
Custom ffmpeg pipeline (split into 10-min segments)
import subprocess
from tiktok_live_recorder import TikTokLiveRecorder
sources = TikTokLiveRecorder("streamer").resolve()
input_url = sources.hls.get("origin")
if not input_url:
raise SystemExit("no hls available")
subprocess.run([
"ffmpeg", "-i", input_url,
"-c", "copy",
"-f", "segment",
"-segment_time", "600",
"-reset_timestamps", "1",
"streamer-%03d.mp4",
])
More ready-to-run recipes in examples/.
How it works
- The recorder asks
https://api.tik.tools/webcast/stream_url?uniqueId=Xfor the user's current HLS / FLV URLs. - The server checks live status + returns the URLs as JSON.
- The recorder spawns local
ffmpeg, passes the URL as input, copies the bytes to disk. No re-encoding.
All bandwidth flows directly from TikTok's CDN to your disk - none of it touches our servers. We only handle the lightweight URL resolution.
Compatibility
- Python >= 3.9.
- Works on Windows, macOS, Linux, Docker.
- Requires
ffmpegon PATH.
License
MIT
This is an independent third-party project. Not affiliated with, endorsed by, or in any way officially connected to TikTok or ByteDance Ltd. "TikTok" is a trademark of ByteDance Ltd; the name appears here for search discoverability.
Project details
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 tiktok_live_recorder-1.0.0.tar.gz.
File metadata
- Download URL: tiktok_live_recorder-1.0.0.tar.gz
- Upload date:
- Size: 7.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99007672f2e693d5f2e78abaff5708ec3a0377192339043e14c9e8e5acbf2011
|
|
| MD5 |
bb56dee1b2c6ca4209fa520195744380
|
|
| BLAKE2b-256 |
ba656839cccd19a9dc22aae3986d82e81d0c30fd8ca41bee058e507f7d0a6644
|
File details
Details for the file tiktok_live_recorder-1.0.0-py3-none-any.whl.
File metadata
- Download URL: tiktok_live_recorder-1.0.0-py3-none-any.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
830870779f6b2e02779290a7000cb805462db96eb9f3adf7a8c3f6fc28f2310a
|
|
| MD5 |
8876d5c65d4b7be81dc9581800ad3cd2
|
|
| BLAKE2b-256 |
90d1135a51c3d4c1bc30b553502571d9884bf2b432dc6b8ca79327c77c5a1385
|