Overview
Batch downloads allow you to download all videos from a YouTube playlist or all episodes from a Spotify podcast show with a single API call. Tornado automatically extracts all URLs and creates individual jobs for each — there is no separate batch endpoint, this triggers automatically off theurl you send to POST /jobs.
Batch downloads are supported for:
- YouTube Playlists (
list=PL..., and channel-uploads/UU.../course-styleOL...playlists) - Spotify Shows (podcast episodes)
How It Works
1
Submit Show URL
Send a Spotify show URL to the
/jobs endpoint2
Episode Extraction
Tornado extracts all episode URLs from the show (can take 30-120 seconds for large shows)
3
Batch Creation
A batch job is created with individual jobs for each episode
4
Parallel Processing
Episodes are downloaded in parallel for maximum speed
5
Progress Tracking
Track overall progress via the batch status endpoint
Create a Batch
YouTube Playlist
Spotify Show
Batch Response
The response shape depends on the source. Spotify shows return episode metadata:Spotify Show
total_videos and video_jobs (no episodes/total_episodes/paused):
YouTube Playlist
Check Batch Status
Poll the batch endpoint for progress:Response
Batch Status Values
Paused Mode (Rename Before Download)
Create a batch in paused mode to review and rename episodes before downloading:1. Create Paused Batch
2. Rename Episodes (Optional)
3. Start the Batch
Batch Webhook
When a batch completes (all episodes done), a webhook is sent:The batch webhook fires once when all episodes are done (completed + failed + skipped = total), not for each individual episode. Skipped episodes (e.g. audio-only episodes with Widevine DRM) count toward the
failed_episodes counter. The status field is "completed" if all succeeded, or "finished" if some failed.Folder Structure
All episodes are saved with the folder prefix you specify:Python Example
Skipped Episodes
Some Spotify episodes are audio-only and protected by Widevine DRM — they have no video stream available. These episodes are automatically skipped instead of failing with retries:- Job status is set to
Skipped(notFailed) - A
job_skippedwebhook is sent for each skipped episode - Skipped episodes count toward the batch
failedcounter for completion tracking - Skipped jobs are classified as warnings, not errors
job_skipped webhooks.
