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.
Metadata
Release files for dailymotionx 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dailymotionx-0.2.1.tar.gz | 30.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dailymotionx-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 56.8 kB
Release files / dailymotionx-0.2.1.tar.gz
| Download URL | dailymotionx-0.2.1.tar.gz |
|---|---|
| Size | 30.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b7a691eca8d5e61e1d93c13b3f0b9211e35b6bae449adb366beeb0c6127af7fc
|
|
BLAKE2b-256 checksum How to use checksums |
2369007b105ffb08120279bd343eafa1a09fcfef9561f1f69e972abea76c111b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / dailymotionx-0.2.1-py3-none-any.whl
| Download URL | dailymotionx-0.2.1-py3-none-any.whl |
|---|---|
| Size | 26.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f51249826104ecd5a9488ecacc25fded45e45ef8659d88bba697b9b3236ca9e6
|
|
BLAKE2b-256 checksum How to use checksums |
1a044f5f907fd7c00af2f9f025e7b4b7dbd9cf75132738f7432c3980bd24b2cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|