Skip to main content

EASYDER — CSS-Inspired Video Downloader

""Python 3.8+" (https://img.shields.io/badge/python-3.8+-blue.svg)" (https://www.python.org/downloads/) ""License: MIT" (https://img.shields.io/badge/License-MIT-yellow.svg)" (https://opensource.org/licenses/MIT)

EASYDER is a CSS-inspired video downloader built with yt-dlp + FFmpeg.

Easyder V1.0 focuses on downloading video/audio, extracting metadata, downloading thumbnails, handling playlists, and automatically trying supplied cookie files when a normal request fails.


Features

  • ✅ CSS-inspired dictionary syntax
  • ✅ Video quality selection
  • ✅ Audio-only downloads
  • ✅ 360p, 480p, 720p and 1080p quality stages
  • ✅ Original/best quality selection
  • ✅ Automatic cookie fallback
  • ✅ Multiple supplied cookie files
  • ✅ Playlist downloads
  • ✅ Video metadata extraction
  • ✅ Thumbnail downloading
  • ✅ yt-dlp + FFmpeg based downloading
  • ✅ Download progress display
  • ✅ MP4 output for video downloads

Installation

From PyPI

pip install easyder

From GitHub

git clone https://github.com/ReiZyuki/Easyder.git cd Easyder pip install -e .


Quick Start

from easyder import rz

result = rz( { "video[3]": "video", "title": "title", "creator": "creator", }, url, )

print("Video:", result["video"]) print("Title:", result["title"]) print("Creator:", result["creator"])

The right-side values such as ""video"", ""title"" and ""creator"" are user-defined variable names.


Video Quality

Easyder uses CSS-inspired quality selectors:

"video[0]" "video[1]" "video[2]" "video[3]" "video[4]" "video[5]"

Selector| Quality "video[0]"| Audio only "video[1]"| 360p "video[2]"| 480p "video[3]"| 720p "video[4]"| 1080p "video[5]"| Best/original available quality

Example:

from easyder import rz

result = rz( { "video[4]": "video", }, url, )

print(result["video"])

If the requested quality is unavailable, yt-dlp selects an appropriate available format according to Easyder's format selection rules.


Audio Only

Use "video[0]" for audio:

from easyder import rz

result = rz( { "video[0]": "audio", }, url, )

print(result["audio"])


Metadata

Easyder can extract video metadata without downloading the video.

from easyder import rz

result = rz( { "title": "title", "creator": "creator", "url": "video_url", "views": "views", "likes": "likes", "count": "comments", "time": "duration", "thumbnail": "thumbnail", "formats": "formats", }, url, )

print("Title:", result["title"]) print("Creator:", result["creator"]) print("URL:", result["video_url"]) print("Views:", result["views"]) print("Likes:", result["likes"]) print("Comments:", result["comments"]) print("Duration:", result["duration"]) print("Thumbnail:", result["thumbnail"]) print("Formats:", result["formats"])

Metadata variable names are completely user-defined.

For example:

result = rz( { "title": "MyTitle", "creator": "MyCreator", }, url, )

print(result["MyTitle"]) print(result["MyCreator"])


Thumbnail

Use the "thumbnail" selector to download the video's thumbnail.

from easyder import rz

result = rz( { "thumbnail": "thumb", }, url, )

print(result["thumb"])

The returned value is the path of the downloaded thumbnail.

Default download directory:

/storage/emulated/0/Download/ReiDownloader


Playlist

Playlist syntax:

"playlist": "QUALITY:SKIP:COUNT"

Example:

from easyder import rz

result = rz( { "playlist": "3:5:10", }, playlist_url, )

print(result["videos"])

Meaning:

3 = 720p 5 = skip the first 5 videos 10 = download the next 10 videos

Quality values

Quality| Meaning "0"| Audio "1"| 360p "2"| 480p "3"| 720p "4"| 1080p "5"| Best/original

Example:

result = rz( { "playlist": "4:0:5", }, playlist_url, )

This requests:

1080p Skip 0 Download 5 videos

Downloaded playlist files are returned in:

result["videos"]


Automatic Cookie Fallback

Easyder first attempts the request without cookies.

If the normal request fails, Easyder checks the cookie files supplied through the "Cooki" variable.

from easyder import rz

Cooki = [ "/storage/emulated/0/Download/youtube.txt", "/storage/emulated/0/Download/other.txt", ]

result = rz( { "video[3]": "video", "title": "title", }, url, )

Easyder tests the supplied cookie files one by one and uses the first working cookie.

No cookie filenames are hardcoded by Easyder.


Cookie Variable

The cookie variable name is:

Cooki

It can contain a single path:

Cooki = "/path/to/cookies.txt"

or multiple paths:

Cooki = [ "/path/to/cookies1.txt", "/path/to/cookies2.txt", ]

Easyder does not scan directories for cookie files.


Progress

During downloads Easyder displays progress information similar to:

Downloading: 1080p [Download 50%] [Network 2.0 MB/s] [Mode Video]

The downloader can also receive a progress callback:

from easyder import rz

def progress(percent, network, mode): print(percent, network, mode)

result = rz( { "video[3]": "video", }, url, progress_callback=progress, )

The callback receives:

percent network mode


Custom Variable Names

Easyder does not require fixed output variable names.

For example:

result = rz( { "video[3]": "MyVideo", "title": "MyTitle", "creator": "MyCreator", "thumbnail": "MyThumbnail", }, url, )

Then:

print(result["MyVideo"]) print(result["MyTitle"]) print(result["MyCreator"]) print(result["MyThumbnail"])

This keeps the selector syntax separate from the variable names used by your application.


Complete Example

from easyder import rz

Cooki = [ "/storage/emulated/0/Download/youtube.txt", ]

result = rz( { "video[4]": "video", "title": "title", "creator": "creator", "thumbnail": "thumbnail", "views": "views", "likes": "likes", "time": "duration", }, url, )

print("Video:", result["video"]) print("Title:", result["title"]) print("Creator:", result["creator"]) print("Thumbnail:", result["thumbnail"]) print("Views:", result["views"]) print("Likes:", result["likes"]) print("Duration:", result["duration"])


Selector Reference

Selector| Example value| Description "video[0]"| ""video""| Audio only "video[1]"| ""video""| 360p video "video[2]"| ""video""| 480p video "video[3]"| ""video""| 720p video "video[4]"| ""video""| 1080p video "video[5]"| ""video""| Best/original quality "title"| ""title""| Video title "creator"| ""creator""| Uploader/creator "url"| ""video_url""| Video URL "views"| ""views""| View count "likes"| ""likes""| Like count "count"| ""comments""| Comment count "time"| ""duration""| Duration "thumbnail"| ""thumbnail""| Download thumbnail "formats"| ""formats""| Available formats "playlist"| ""QUALITY:SKIP:COUNT""| Playlist download


Quality Reference

video[0] = Audio only video[1] = 360p video[2] = 480p video[3] = 720p video[4] = 1080p video[5] = Best/original available


Requirements

Easyder uses:

  • Python
  • yt-dlp
  • FFmpeg

FFmpeg is required for media processing and merging separate video/audio streams.


Download Location

The default download directory is:

/storage/emulated/0/Download/ReiDownloader

Videos and thumbnails downloaded by Easyder are stored there.


V1.0 Scope

Easyder V1.0 intentionally focuses on:

Video Audio Thumbnail Metadata Playlist Automatic cookie fallback Progress reporting

Easyder V1.0 does not include:

Gallery / gallery-dl Telegram / TeleBot integration Sender functionality

These features may be considered separately in future versions.


License

MIT License

Metadata

Release files for easyder 0.2.0

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

Source distribution (sdist)

Source distribution for easyder 0.2.0
File Size Uploaded
easyder-0.2.0.tar.gz 13.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for easyder 0.2.0
File Interpreter ABI Platform
easyder-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 23.4 kB

Release files / easyder-0.2.0.tar.gz

Download URL easyder-0.2.0.tar.gz
Size 13.9 kB
Tags Source
SHA-256 checksum
How to use checksums
b1076195b12a3147ce017bc89c74b1a84e5974afdf5408222633e98750b3c6a0
BLAKE2b-256 checksum
How to use checksums
08de5ab7f93c1ad724b34cc583cf8656d17acbc7705f4aa9550246a49b62e2bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release files / easyder-0.2.0-py3-none-any.whl

Download URL easyder-0.2.0-py3-none-any.whl
Size 9.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e4c06707686e3e4f25b7121a421296bd6acf26793c1f62ae664ff67e1e6a7bd4
BLAKE2b-256 checksum
How to use checksums
7ce67c60684a42051116b5bc0ec19747fd6d2112569ff14e22aa376633db20d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release history Release notifications | RSS feed

This release

0.2.0 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