Download Dailymotion videos from episode pages or direct links — CLI, Python API, and browser UI
Project description
dailymotionx
Download Dailymotion videos from episode pages or direct links — via CLI, Python API, or a local browser UI.
Designed for sites like myanime.live that embed Dailymotion players, but works with any page that contains a Dailymotion player URL, as well as direct dailymotion.com and dai.ly links.
Features
- 🌐 Browser UI — launch a beautiful local web app (
dailymotion ui), no terminal intimidation - ⌨️ Interactive CLI — guided prompts for URL and resolution using
questionary+rich - 🔗 Episode page support — paste a myanime.live (or similar) URL and the Dailymotion embed is extracted automatically
- 📺 All Dailymotion URL formats — embed, player, watch, short link
- 🎞️ Merged MP4 output — video + audio merged to a single
.mp4viaffmpeg - 📊 Real-time progress — animated progress bar in the browser UI; rich progress in CLI
- 🔔 yt-dlp update alerts — notifies you if a newer yt-dlp is on PyPI (never auto-updates silently)
- 🩺 Doctor command — check all dependencies at a glance
- 🖥️ Cross-platform — Windows, macOS, Linux; browser impersonation via
curl-cffi - 🐍 Python API — import and use as a library in your own scripts
Requirements
| Requirement | Notes |
|---|---|
| Python ≥ 3.10 | |
ffmpeg |
Must be on PATH — used for audio/video merge |
yt-dlp |
Installed automatically as a dependency |
Installing ffmpeg
Linux (Debian/Ubuntu)
sudo apt update && sudo apt install -y ffmpeg
macOS
brew install ffmpeg
Windows
winget install Gyan.FFmpeg
Or download from ffmpeg.org.
Installation
pip install dailymotionx
The dailymotion command will be available immediately after install.
Quick Start
Browser UI (recommended for beginners)
dailymotion ui
Opens a local web page automatically. Paste your URL, pick a resolution, click Download. That's it.
Interactive CLI
dailymotion
The CLI will prompt you for the URL and resolution.
One-liner
dailymotion "https://myanime.live/some-episode-page/" --resolution 720
CLI Reference
dailymotion download
dailymotion [download] [URL] [OPTIONS]
The download subcommand is the default — you can omit it entirely.
| Option | Default | Description |
|---|---|---|
URL |
(interactive prompt) | Episode page URL or direct Dailymotion URL |
-r, --resolution |
720 |
Target resolution: 360, 480, 720, 1080, best |
-o, --output-dir |
~/Downloads |
Directory to save the MP4 |
-c, --concurrency |
12 |
Number of parallel fragment downloads |
--timeout |
35 |
HTTP timeout in seconds |
--non-interactive |
False |
Fail instead of prompting for missing inputs |
Examples:
# Interactive (prompts for URL and resolution)
dailymotion
# Episode page URL
dailymotion "https://myanime.live/2026/04/19/battle-through-the-heavens-season-5-episode-195-english-sub/"
# Direct Dailymotion link
dailymotion "https://www.dailymotion.com/video/k4YiCNzUwtjazkFAmg2" -r 1080
# Save to specific folder, non-interactive
dailymotion "https://dai.ly/k4YiCNzUwtjazkFAmg2" -r best -o ~/Videos --non-interactive
dailymotion ui
dailymotion ui [--port PORT] [--no-browser]
Starts a local HTTP server and opens the browser UI automatically.
| Option | Default | Description |
|---|---|---|
--port |
0 (auto) |
Port to listen on |
--no-browser |
False |
Don't open the browser automatically |
The UI features:
- Real-time animated progress bar with phase indicators (Resolving → Video → Audio → Merging → Done)
- Live speed and ETA display
- Collapsible detailed log
- yt-dlp update banner if a newer version is on PyPI
- ffmpeg missing warning with install instructions
dailymotion doctor
dailymotion doctor [--upgrade-ytdlp]
Checks all runtime dependencies and prints their status:
╭────────────── Doctor ──────────────╮
│ Dependency check results │
╰────────────────────────────────────╯
- yt-dlp: OK (available)
- rich: OK (available)
- questionary:OK (available)
- curl-cffi: OK (available)
- ffmpeg: OK (available)
yt-dlp is up to date.
| Option | Description |
|---|---|
--upgrade-ytdlp |
Run pip install --upgrade yt-dlp during this check |
yt-dlp update notifications
dailymotionx checks PyPI for a newer version of yt-dlp at startup and prints a one-line notice if one is found. It never installs updates silently.
yt-dlp update available (2026.3.17 → 2026.6.1). Run: pip install --upgrade yt-dlp
Use dailymotion doctor --upgrade-ytdlp when you're ready to upgrade.
Supported URL Formats
| Format | Example |
|---|---|
| myanime.live episode page | https://myanime.live/2026/.../episode-name/ |
| Any page with embedded Dailymotion | https://example.com/episode |
| Dailymotion watch link | https://www.dailymotion.com/video/k4Yi... |
| Dailymotion embed | https://www.dailymotion.com/embed/video/k4Yi... |
| Dailymotion geo player | https://geo.dailymotion.com/player.html?video=k4Yi... |
| Short link | https://dai.ly/k4Yi... |
Python API
from pathlib import Path
from dailymotionx import DownloadRequest, download_episode
request = DownloadRequest(
episode_url="https://myanime.live/2026/04/19/battle-through-the-heavens-s5-ep195-english-sub/",
resolution="720",
output_dir=Path.home() / "Downloads",
concurrency=12,
timeout_seconds=35,
)
result = download_episode(request)
print(f"Saved to: {result.output_file}")
Resolve only (no download)
from dailymotionx import resolve_episode_page, resolve_input_url
# From an episode page
dm_url = resolve_episode_page("https://myanime.live/some-episode/")
print(dm_url) # https://geo.dailymotion.com/player.html?video=...
# From any supported URL (episode page or direct DM link)
dm_url = resolve_input_url("https://www.dailymotion.com/video/abc123")
print(dm_url) # https://geo.dailymotion.com/player.html?video=abc123
Using progress hooks
def my_hook(d: dict) -> None:
if d["status"] == "downloading":
pct = d.get("downloaded_bytes", 0) / (d.get("total_bytes") or 1) * 100
print(f"\r{pct:.1f}%", end="", flush=True)
result = download_episode(request, progress_hooks=[my_hook])
Output Files
Files are saved as:
{title} [{video_id}].mp4
Filenames are sanitised for cross-platform compatibility (restrictfilenames, windowsfilenames).
Output directory priority:
--output-dir/output_dirargument~/Downloads(if writable)- Current working directory
Dependency Notes
| Package | Role |
|---|---|
yt-dlp |
Video extraction and download engine |
curl-cffi |
Browser-impersonating HTTP client (cross-platform TLS fingerprinting) |
rich |
Beautiful terminal output |
questionary |
Interactive CLI prompts |
ffmpeg (system) |
Audio/video stream merging (must be installed separately) |
curl-cffi enables browser TLS impersonation on all platforms — no manual setup needed beyond pip install dailymotionx.
Development
git clone https://github.com/shyamdarshanam/embed-downloader
cd embed-downloader
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
Run tests:
pytest
Lint:
ruff check src/
Type check:
mypy src/dailymotionx/
Build package:
python -m build
twine check dist/*
Publish to PyPI:
twine upload dist/*
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
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 dailymotionx-0.2.1.tar.gz.
File metadata
- Download URL: dailymotionx-0.2.1.tar.gz
- Upload date:
- Size: 30.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7a691eca8d5e61e1d93c13b3f0b9211e35b6bae449adb366beeb0c6127af7fc
|
|
| MD5 |
887cbf02361c1e090fddb38912f3e509
|
|
| BLAKE2b-256 |
2369007b105ffb08120279bd343eafa1a09fcfef9561f1f69e972abea76c111b
|
File details
Details for the file dailymotionx-0.2.1-py3-none-any.whl.
File metadata
- Download URL: dailymotionx-0.2.1-py3-none-any.whl
- Upload date:
- Size: 26.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f51249826104ecd5a9488ecacc25fded45e45ef8659d88bba697b9b3236ca9e6
|
|
| MD5 |
0ff8f7fc3cdb57be5268b7924c73d835
|
|
| BLAKE2b-256 |
1a044f5f907fd7c00af2f9f025e7b4b7dbd9cf75132738f7432c3980bd24b2cc
|