Skip to main content

x-spaces-dl

A powerful command-line tool and Python library for downloading Twitter/X Spaces recordings

PyPI version Python 3.8+ License: MIT

✨ Features

  • 🎙️ Download Twitter/X Spaces recordings (replays)
  • 📦 Batch download multiple spaces from a file
  • 🎵 Multiple output formats (M4A, MP3, AAC, WAV)
  • 📊 Rich metadata embedding (title, host, date, participants)
  • 🔄 Resume interrupted downloads
  • 🚀 Fast downloads with ffmpeg or pure Python fallback
  • 🔐 Guest mode (no login) with automatic fallback to authenticated mode
  • 📈 Beautiful progress bars and detailed logging
  • ⚙️ Highly configurable via CLI or config file
  • 🐍 Use as a library in your Python projects

📥 Installation

pip install x-spaces-dl

From source

git clone https://github.com/w3Abhishek/x-spaces-dl.git
cd x-spaces-dl
pip install -e .

Optional: Install ffmpeg for faster downloads

  • Ubuntu/Debian: sudo apt install ffmpeg
  • macOS: brew install ffmpeg
  • Windows: Download from ffmpeg.org

🚀 Quick Start

Command Line

# Download a space (guest mode)
x-spaces-dl https://x.com/i/spaces/1234567890

# Download with authentication (if guest mode fails)
x-spaces-dl https://x.com/i/spaces/1234567890 --cookies cookies.txt

# Download multiple spaces from a file
x-spaces-dl --batch urls.txt

# Download as MP3 with metadata
x-spaces-dl https://x.com/i/spaces/1234567890 --format mp3 --embed-metadata

# Custom output filename
x-spaces-dl https://x.com/i/spaces/1234567890 -o "my_space.m4a"

# Show space info without downloading
x-spaces-dl https://x.com/i/spaces/1234567890 --info-only

Python Library

from xspacesdl import XSpacesDL

# Initialize downloader
downloader = XSpacesDL()

# Download a space
downloader.download_space(
    "https://x.com/i/spaces/1234567890",
    output_file="space.m4a"
)

# Get space metadata
metadata = downloader.get_space_metadata("https://x.com/i/spaces/1234567890")
print(f"Title: {metadata['title']}")
print(f"Host: {metadata['host']}")

📖 Usage

Basic Commands

# Download with default settings
x-spaces-dl <SPACE_URL>

# Specify output file
x-spaces-dl <SPACE_URL> -o output.m4a

# Use authenticated mode with cookies
x-spaces-dl <SPACE_URL> --cookies cookies.txt

# Force guest mode (no fallback)
x-spaces-dl <SPACE_URL> --guest-only

Batch Download

Create a text file with one URL per line:

https://x.com/i/spaces/1234567890
https://x.com/i/spaces/0987654321
https://x.com/i/spaces/1111111111

Then run:

x-spaces-dl --batch urls.txt

Output Formats

# Convert to MP3
x-spaces-dl <SPACE_URL> --format mp3

# Convert to WAV
x-spaces-dl <SPACE_URL> --format wav

# Keep original M4A
x-spaces-dl <SPACE_URL> --format m4a

Metadata

# Embed metadata (title, host, date)
x-spaces-dl <SPACE_URL> --embed-metadata

# Save metadata to JSON
x-spaces-dl <SPACE_URL> --save-metadata

# Show info only (no download)
x-spaces-dl <SPACE_URL> --info-only

Advanced Options

# Custom output directory
x-spaces-dl <SPACE_URL> --output-dir ~/Downloads/Spaces

# Filename template
x-spaces-dl <SPACE_URL> --template "{date}_{host}_{title}"

# Retry failed downloads
x-spaces-dl <SPACE_URL> --retry 3

# Quiet mode (no output)
x-spaces-dl <SPACE_URL> --quiet

# Verbose mode (detailed logging)
x-spaces-dl <SPACE_URL> --verbose

# Dry run (show what would be downloaded)
x-spaces-dl <SPACE_URL> --dry-run

Configuration File

Create ~/.config/xspacesdl/config.yaml:

output_dir: ~/Downloads/Spaces
format: mp3
embed_metadata: true
cookies_file: ~/cookies.txt
retry_attempts: 3
template: "{date}_{host}_{title}"

Then simply run:

x-spaces-dl <SPACE_URL>

🔐 Authentication

For private spaces or when guest mode fails:

  1. Export cookies from your browser:

    • Install a browser extension like "Get cookies.txt" or "EditThisCookie"
    • Visit twitter.com/x.com and login
    • Export cookies to cookies.txt (Netscape format)
  2. Use cookies with x-spaces-dl:

    x-spaces-dl <SPACE_URL> --cookies cookies.txt
    

🛠️ All CLI Options

x-spaces-dl [OPTIONS] [SPACE_URL]

Options:
  -o, --output TEXT           Output filename
  -d, --output-dir PATH       Output directory
  -b, --batch FILE            Batch download from file
  -f, --format [m4a|mp3|aac|wav]  Output format (default: m4a)
  -c, --cookies FILE          Path to cookies.txt file
  --guest-only                Use guest mode only (no auth fallback)
  --embed-metadata            Embed metadata into audio file
  --save-metadata             Save metadata to JSON file
  --info-only                 Show space info without downloading
  --template TEXT             Filename template
  --retry INTEGER             Retry attempts (default: 3)
  --no-resume                 Disable resume capability
  -q, --quiet                 Quiet mode
  -v, --verbose               Verbose mode
  --dry-run                   Dry run (no actual download)
  --config FILE               Config file path
  --version                   Show version
  --help                      Show this message and exit

📚 Python API

Basic Usage

from xspacesdl import XSpacesDL

# Initialize
dl = XSpacesDL()

# Download a space
dl.download_space("https://x.com/i/spaces/1234567890")

With Authentication

from xspacesdl import XSpacesDL

# Initialize with cookies
dl = XSpacesDL(cookies_file="cookies.txt")

# Download
dl.download_space("https://x.com/i/spaces/1234567890")

Advanced Usage

from xspacesdl import XSpacesDL
from xspacesdl.config import Config

# Custom configuration
config = Config(
    output_dir="./downloads",
    format="mp3",
    embed_metadata=True,
    retry_attempts=5
)

# Initialize with config
dl = XSpacesDL(config=config)

# Get metadata
metadata = dl.get_space_metadata("https://x.com/i/spaces/1234567890")

# Download with custom options
dl.download_space(
    "https://x.com/i/spaces/1234567890",
    output_file="custom_name.mp3",
    format="mp3"
)

Batch Download

from xspacesdl import XSpacesDL

dl = XSpacesDL()

urls = [
    "https://x.com/i/spaces/1234567890",
    "https://x.com/i/spaces/0987654321",
]

for url in urls:
    try:
        dl.download_space(url)
        print(f"✅ Downloaded: {url}")
    except Exception as e:
        print(f"❌ Failed: {url} - {e}")

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Commit your changes (git commit -m 'Add some AmazingFeature')
  4. Push to the branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

📝 License

This project is licensed under the MIT License - see the LICENSE file for details.

⚠️ Disclaimer

This tool is for educational purposes only. Make sure you have the right to download and use the content. Respect Twitter's Terms of Service and content creators' rights.

🙏 Acknowledgments

  • Inspired by yt-dlp
  • Thanks to all contributors

📧 Contact


Made with ❤️ by w3Abhishek

Metadata

Release files for x-spaces-dl 1.0.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for x-spaces-dl 1.0.8
File Size Uploaded
x_spaces_dl-1.0.8.tar.gz 24.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for x-spaces-dl 1.0.8
File Interpreter ABI Platform
x_spaces_dl-1.0.8-py3-none-any.whl Python 3 none any Details

Total release size: 48.4 kB

Release files / x_spaces_dl-1.0.8.tar.gz

Download URL x_spaces_dl-1.0.8.tar.gz
Size 24.2 kB
Tags Source
SHA-256 checksum
How to use checksums
1f856331a33829eef6a15161493bc12ca3d2b5d7403a49e27f75cc3c85608517
BLAKE2b-256 checksum
How to use checksums
453ee6b4379bf90099db9006d1e11b3e53e6ed04ba5baaeb4ed1bacd9c43075d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / x_spaces_dl-1.0.8-py3-none-any.whl

Download URL x_spaces_dl-1.0.8-py3-none-any.whl
Size 24.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e0ddd6ee1a0b274bf1d8bf6a2da93f75f3529f93a518ab919bee6cc98f052c26
BLAKE2b-256 checksum
How to use checksums
0b063918cdb1c1451398e503c4a81a92fbec3ae172ab726eda35e500406fb001
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release history Release notifications | RSS feed

This release

1.0.8 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page