Top Related Projects
Command-line program to download videos from YouTube.com and other video sites
A feature-rich command-line audio/video downloader
:arrow_double_down: Dumb downloader that scrapes the web
Command-line program to download image galleries and collections from several image hosting sites
aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
Quick Overview
Lux is a fast and simple video downloader written in Go. It supports downloading videos from various websites including YouTube, Bilibili, Instagram, and more. Lux aims to provide an easy-to-use command-line interface for downloading videos from multiple sources.
Pros
- Supports a wide range of video hosting platforms
- Fast download speeds due to Go implementation
- Simple and intuitive command-line interface
- Actively maintained and regularly updated
Cons
- Limited GUI options (primarily command-line based)
- May require additional dependencies for some video formats
- Not as feature-rich as some other video downloaders
- Potential legal concerns depending on usage and jurisdiction
Code Examples
- Download a single video:
package main
import "github.com/iawia002/lux/extractors"
func main() {
url := "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
extractors.Extract(url, extractors.Options{})
}
- Download multiple videos:
package main
import "github.com/iawia002/lux/extractors"
func main() {
urls := []string{
"https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"https://www.youtube.com/watch?v=9bZkp7q19f0",
}
for _, url := range urls {
extractors.Extract(url, extractors.Options{})
}
}
- Download with custom options:
package main
import "github.com/iawia002/lux/extractors"
func main() {
url := "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
options := extractors.Options{
OutputPath: "/custom/path",
InfoOnly: true,
Stream: "720p",
}
extractors.Extract(url, options)
}
Getting Started
To use Lux in your Go project, first install it:
go get -u github.com/iawia002/lux
Then, import and use it in your Go code:
package main
import (
"github.com/iawia002/lux/extractors"
)
func main() {
url := "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
extractors.Extract(url, extractors.Options{})
}
Run your Go program, and Lux will download the video to the current directory.
Competitor Comparisons
Command-line program to download videos from YouTube.com and other video sites
Pros of youtube-dl
- More extensive support for various websites and platforms
- Larger community and more frequent updates
- More comprehensive documentation and usage examples
Cons of youtube-dl
- Slower download speeds compared to lux
- More complex command-line interface for basic usage
- Larger codebase, which can make it harder to maintain and contribute to
Code Comparison
youtube-dl:
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=dQw4w9WgXcQ'])
lux:
lux.New().Download("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
The code comparison shows that lux offers a simpler API for basic usage, requiring fewer lines of code to achieve the same result. However, youtube-dl provides more granular control over download options and post-processing, which can be beneficial for advanced users or specific use cases.
A feature-rich command-line audio/video downloader
Pros of yt-dlp
- More actively maintained with frequent updates
- Supports a wider range of websites and video platforms
- Offers advanced features like sponsorblock integration and video quality selection
Cons of yt-dlp
- More complex command-line interface, potentially overwhelming for beginners
- Larger codebase, which may result in slower execution for simple tasks
Code Comparison
yt-dlp:
ydl_opts = {'format': 'bestaudio/best'}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=dQw4w9WgXcQ'])
lux:
lux.New().Download("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
yt-dlp offers more configuration options out of the box, while lux provides a simpler API for basic downloads. yt-dlp is written in Python, making it easier for many developers to contribute and extend, whereas lux is written in Go, which may offer better performance for certain tasks.
Both tools serve similar purposes but cater to different user needs. yt-dlp is more feature-rich and versatile, while lux focuses on simplicity and ease of use for common video download scenarios.
:arrow_double_down: Dumb downloader that scrapes the web
Pros of you-get
- More extensive support for video platforms (1000+)
- Longer development history and larger community
- Built-in GUI for easier use by non-technical users
Cons of you-get
- Less frequent updates and maintenance
- Slower download speeds compared to lux
- More complex installation process for some users
Code Comparison
you-get:
def download_urls(urls, **kwargs):
for url in urls:
download(url, **kwargs)
def download(url, **kwargs):
# ... (implementation details)
lux:
func Download(urls []string, option Options) error {
for _, url := range urls {
err := extractors.Extract(url, option)
if err != nil {
return err
}
}
return nil
}
Both projects aim to download videos from various platforms, but they differ in implementation languages and structure. you-get is written in Python, while lux is written in Go. The lux code appears more concise and uses a single function for downloading, whereas you-get separates the functionality into two functions.
you-get offers broader platform support and a longer history, making it more suitable for users needing extensive compatibility. lux, being newer and written in Go, may provide better performance and is more appropriate for users prioritizing speed and simplicity.
Command-line program to download image galleries and collections from several image hosting sites
Pros of gallery-dl
- Supports a wider range of websites and platforms (over 100)
- More actively maintained with frequent updates
- Offers extensive configuration options and customization
Cons of gallery-dl
- Command-line interface only, lacking a graphical user interface
- Steeper learning curve for beginners due to its extensive features
- Slower download speeds compared to lux in some cases
Code Comparison
gallery-dl:
import gallery_dl
gallery_dl.download("https://example.com/gallery")
lux:
package main
import "github.com/iawia002/lux"
func main() {
lux.Download("https://example.com/video")
}
Key Differences
- gallery-dl focuses on image galleries and supports a broader range of websites
- lux primarily targets video downloads from popular platforms
- gallery-dl is written in Python, while lux is written in Go
- lux offers a simpler interface for basic usage, while gallery-dl provides more advanced features
Use Cases
gallery-dl is better suited for:
- Downloading image galleries from various sources
- Users who need extensive customization options
lux is more appropriate for:
- Quick and easy video downloads from popular platforms
- Users who prefer a simpler interface and faster execution
Both tools have their strengths, and the choice depends on the specific requirements of the user and the type of content they want to download.
aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
Pros of aria2
- More mature and widely-used project with extensive documentation
- Supports a broader range of protocols (HTTP/HTTPS, FTP, SFTP, BitTorrent, and Metalink)
- Offers advanced features like multi-connection downloads and segmented file transfers
Cons of aria2
- Primarily focused on downloading, lacking video extraction capabilities
- Command-line interface may be less user-friendly for some users
- Requires more configuration for optimal performance
Code Comparison
aria2:
int DownloadEngine::run(void)
{
while(!commands_.empty() || !routineCommands_.empty()) {
if(sigHandler_->getSignals().empty()) {
executeCommand();
} else {
// ...
}
}
return 0;
}
lux:
func (d *Downloader) Download(ctx context.Context) error {
if err := d.prepare(); err != nil {
return err
}
if d.stream.Size > 0 {
d.bar = progressBar(d.stream.Size)
}
// ...
}
The code snippets show the core download logic for each project. aria2 uses C++ and focuses on managing multiple commands, while lux is written in Go and emphasizes a more straightforward download process with progress tracking.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Lux
Let there be Lux!
ð¾ Lux is a fast and simple video downloader built with Go.
- Installation
- Getting Started
- Supported Sites
- Known issues
- Contributing
- Authors
- Similar projects
- License
Installation
Prerequisites
The following dependencies are required and must be installed separately.
Note: FFmpeg does not affect the download, only affects the final file merge.
Install via go install
To install Lux, use go install
, or download the binary file from Releases page.
$ go install github.com/iawia002/lux@latest
Homebrew (macOS only)
For macOS users, you can install lux
via:
$ brew install lux
Arch Linux
For Arch Users AUR package is available.
Void Linux
For Void linux users, you can install lux
via:
$ xbps-install -S lux
Scoop on Windows
$ scoop install lux
Chocolatey on Windows
$ choco install lux
Cask on Windows/macOS/Linux
$ cask install github.com/iawia002/lux
Getting Started
Usage:
lux [OPTIONS] URL [URL...]
Download a video
$ lux "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
Site: YouTube youtube.com
Title: Rick Astley - Never Gonna Give You Up (Video)
Type: video
Stream:
[248] -------------------
Quality: 1080p video/webm; codecs="vp9"
Size: 63.93 MiB (67038963 Bytes)
# download with: lux -f 248 ...
41.88 MiB / 63.93 MiB [=================>-------------] 65.51% 4.22 MiB/s 00m05s
The -i
option displays all available quality of video without downloading.
$ lux -i "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
Site: YouTube youtube.com
Title: Rick Astley - Never Gonna Give You Up (Video)
Type: video
Streams: # All available quality
[248] -------------------
Quality: 1080p video/webm; codecs="vp9"
Size: 49.29 MiB (51687554 Bytes)
# download with: lux -f 248 ...
[137] -------------------
Quality: 1080p video/mp4; codecs="avc1.640028"
Size: 43.45 MiB (45564306 Bytes)
# download with: lux -f 137 ...
[398] -------------------
Quality: 720p video/mp4; codecs="av01.0.05M.08"
Size: 37.12 MiB (38926432 Bytes)
# download with: lux -f 398 ...
[136] -------------------
Quality: 720p video/mp4; codecs="avc1.4d401f"
Size: 31.34 MiB (32867324 Bytes)
# download with: lux -f 136 ...
[247] -------------------
Quality: 720p video/webm; codecs="vp9"
Size: 31.03 MiB (32536181 Bytes)
# download with: lux -f 247 ...
Use lux -f stream "URL"
to download a specific stream listed in the output of -i
option.
Download anything else
If Lux is provided the URL of a specific resource, then it will be downloaded directly:
$ lux "https://img9.bcyimg.com/drawer/15294/post/1799t/1f5a87801a0711e898b12b640777720f.jpg"
lux doesn't support this URL right now, but it will try to download it directly
Site: Universal
Title: 1f5a87801a0711e898b12b640777720f
Type: image/jpeg
Stream:
[default] -------------------
Size: 1.00 MiB (1051042 Bytes)
# download with: lux -f default "URL"
1.00 MiB / 1.00 MiB [===================================] 100.00% 1.21 MiB/s 0s
Download playlist
The -p
option downloads an entire playlist instead of a single video.
$ lux -i -p "https://www.bilibili.com/bangumi/play/ep198061"
Site: åå©åå© bilibili.com
Title: Doctor X 第åå£ï¼ç¬¬ä¸é
Type: video
Streams: # All available quality
[default] -------------------
Quality: é«æ¸
1080P
Size: 845.66 MiB (886738354 Bytes)
# download with: lux -f default "URL"
Site: åå©åå© bilibili.com
Title: Doctor X 第åå£ï¼ç¬¬äºé
Type: video
Streams: # All available quality
[default] -------------------
Quality: é«æ¸
1080P
Size: 930.71 MiB (975919195 Bytes)
# download with: lux -f default "URL"
......
You can use the -start
, -end
or -items
option to specify the download range of the list:
-start
Playlist video to start at (default 1)
-end
Playlist video to end at
-items
Playlist video items to download. Separated by commas like: 1,5,6,8-10
For bilibili playlists only:
-eto
File name of each bilibili episode doesn't include the playlist title
Multiple inputs
You can also download multiple URLs at once:
$ lux -i "https://www.bilibili.com/video/av21877586" "https://www.bilibili.com/video/av21990740"
Site: åå©åå© bilibili.com
Title: ãèæºä¼äºãçå°èåç13éåéMADãæç°å¨ä»ä¹é½ä¸æ³å¹²,æ´ä¸æ³ç14éã
Type: video
Streams: # All available quality
[default] -------------------
Quality: é«æ¸
1080P
Size: 51.88 MiB (54403767 Bytes)
# download with: lux -f default "URL"
Site: åå©åå© bilibili.com
Title: ãèæäºãçå°èåï¼ï¼ï¼å½å®¶éåéMAD-å½çæçbgmåèµ·ï¼ç¼æ³ªä»è¸é¢æ»ä¸
Type: video
Streams: # All available quality
[default] -------------------
Quality: é«æ¸
1080P
Size: 77.63 MiB (81404093 Bytes)
# download with: lux -f default "URL"
These URLs will be downloaded one by one.
You can also use the -F
option to read URLs from file:
$ lux -F ~/Desktop/u.txt
Site: å¾®å weibo.com
Title: å¨Googleï¼æ们设计ä»ä¹ï¼ via@éå¤
Type: video
Stream:
[default] -------------------
Size: 19.19 MiB (20118196 Bytes)
# download with: lux -f default "URL"
19.19 MiB / 19.19 MiB [=================================] 100.00% 9.69 MiB/s 1s
......
You can use the -start
, -end
or -items
option to specify the download range of the list:
-start
File line to start at (default 1)
-end
File line to end at
-items
File lines to download. Separated by commas like: 1,5,6,8-10
Resume a download
Ctrl+C interrupts a download.
A temporary .download
file is kept in the output directory. If lux
is ran with the same arguments, then the download progress will resume from the last session.
Auto retry
lux will auto retry when the download failed, you can specify the retry times by -retry
option (default is 100).
Cookies
Cookies can be provided to lux
with the -c
option if they are required for accessing the video.
Cookies can be the following format or Netscape Cookie format:
name=value; name2=value2; ...
Cookies can be a string or a text file, supply cookies in one of the two following ways.
As a string:
$ lux -c "name=value; name2=value2" "https://www.bilibili.com/video/av20203945"
As a text file:
$ lux -c cookies.txt "https://www.bilibili.com/video/av20203945"
Proxy
You can set the HTTP/SOCKS5 proxy using environment variables:
$ HTTP_PROXY="http://127.0.0.1:1087/" lux -i "https://www.youtube.com/watch?v=Gnbch2osEeo"
$ HTTP_PROXY="socks5://127.0.0.1:1080/" lux -i "https://www.youtube.com/watch?v=Gnbch2osEeo"
Multi-Thread
Use --multi-thread
or -m
multiple threads to download single video.
Use --thread
or -n
option to set the number of download threads(default is 10).
Note: If the video has multi fragment, the number of actual download threads will increase.
For example:
- If
-n
is set to 10, and the video has 2 fragments, then 20 threads will actually be used.- If the video has 20 fragments, only 10 fragments are downloaded in the same time, the actual threads count is 100.
Special Tips: Use too many threads in mgtv download will cause HTTP 403 error, we recommend setting the number of threads to 1.
Short link
bilibili
You can just use av
or ep
number to download bilibili's video:
$ lux -i ep198381 av21877586
Site: åå©åå© bilibili.com
Title: çå¦å°çº¢å¨ï¼ç¬¬79è¯ åå½å
¬ä¸»çåè´§æ¬è²
Type: video
Streams: # All available quality
[default] -------------------
Quality: é«æ¸
1080P
Size: 485.23 MiB (508798478 Bytes)
# download with: lux -f default "URL"
Site: åå©åå© bilibili.com
Title: ãèæºä¼äºãçå°èåç13éåéMADãæç°å¨ä»ä¹é½ä¸æ³å¹²,æ´ä¸æ³ç14éã
Type: video
Streams: # All available quality
[default] -------------------
Quality: é«æ¸
1080P
Size: 51.88 MiB (54403767 Bytes)
# download with: lux -f default "URL"
Use specified Referrer
A Referrer can be used for the request with the -r
option:
$ lux -r "https://www.bilibili.com/video/av20383055/" "http://cn-scnc1-dx.acgvideo.com/"
Specify the output path and name
The -o
option sets the path, and -O
option sets the name of the downloaded file:
$ lux -o ../ -O "hello" "https://example.com"
Debug Mode
The -d
option outputs network request messages:
$ lux -i -d "http://www.bilibili.com/video/av20088587"
URL: http://www.bilibili.com/video/av20088587
Method: GET
Headers: http.Header{
"Referer": {"http://www.bilibili.com/video/av20088587"},
"Accept": {"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"},
"Accept-Charset": {"UTF-8,*;q=0.5"},
"Accept-Encoding": {"gzip,deflate,sdch"},
"Accept-Language": {"en-US,en;q=0.8"},
"User-Agent": {"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"},
}
Status Code: 200
URL: https://interface.bilibili.com/v2/playurl?appkey=84956560bc028eb7&cid=32782944&otype=json&qn=116&quality=116&type=&sign=fb2e3f261fec398652f96d358517e535
Method: GET
Headers: http.Header{
"Accept-Charset": {"UTF-8,*;q=0.5"},
"Accept-Encoding": {"gzip,deflate,sdch"},
"Accept-Language": {"en-US,en;q=0.8"},
"User-Agent": {"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36"},
"Referer": {"https://interface.bilibili.com/v2/playurl?appkey=84956560bc028eb7&cid=32782944&otype=json&qn=116&quality=116&type=&sign=fb2e3f261fec398652f96d358517e535"},
"Accept": {"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"},
}
Status Code: 200
Site: åå©åå© bilibili.com
Title: çæ²¹å¨åçé¥æ§å¥¥è¿ªR8è·èµé
Type: video
Streams: # All available quality
[default] -------------------
Quality: é«æ¸
1080P
Size: 64.38 MiB (67504795 Bytes)
# download with: lux -f default "URL"
Reuse extracted data
The -j
option will print the extracted data in JSON format.
$ lux -j "https://www.bilibili.com/video/av20203945"
{
"site": "åå©åå© bilibili.com",
"title": "ã2018æå¹´ç¥ååãç¸éday by day",
"type": "video",
"streams": {
"15": {
"urls": [
{
"url": "...",
"size": 18355205,
"ext": "flv"
}
],
"quality": "æµç
360P",
"size": 18355205
},
"32": {
"urls": [
{
"url": "...",
"size": 40058632,
"ext": "flv"
}
],
"quality": "æ¸
æ° 480P",
"size": 40058632
},
"64": {
"urls": [
{
"url": "...",
"size": 82691087,
"ext": "flv"
}
],
"quality": "é«æ¸
720P",
"size": 82691087
},
"80": {
"urls": [
{
"url": "...",
"size": 121735559,
"ext": "flv"
}
],
"quality": "é«æ¸
1080P",
"size": 121735559
}
}
}
Options
-i Information only
-F string
URLs file path
-d Debug mode
-j Print extracted data
-s Minimum outputs
-v Show version
Download:
-f string
Select specific stream to download
-p Download playlist
-n int
The number of download thread (only works for multiple-parts video) (default 10)
-c string
Cookie
-r string
Use specified Referrer
-cs int
HTTP chunk size for downloading (in MB) (default 1)
Network:
-retry int
How many times to retry when the download failed (default 10)
Playlist:
-start int
Playlist video to start at (default 1)
-end int
Playlist video to end at
-items string
Playlist video items to download. Separated by commas like: 1,5,6,8-10
Filesystem:
-o string
Specify the output path
-O string
Specify the output file name
Subtitle:
-C Download captions
Youku:
-ccode string
Youku ccode (default "0502")
-ckey string
Youku ckey (default "7B19C0AB12633B22E7FE81271162026020570708D6CC189E4924503C49D243A0DE6CD84A766832C2C99898FC5ED31F3709BB3CDD82C96492E721BDD381735026")
-password string
Youku password
aria2:
Note: If you use aria2 to download, you need to merge the multi-part videos yourself.
-aria2
Use Aria2 RPC to download
-aria2addr string
Aria2 Address (default "localhost:6800")
-aria2method string
Aria2 Method (default "http")
-aria2token string
Aria2 RPC Token
Supported Sites
Known issues
ä¼é ·
ä¼é
·ç ccode
ç»å¸¸ååå¯¼è´ lux ä¸å¯ç¨ï¼å¦æä½ ç¥éææ°çå¯ç¨ç ccode
ï¼å¯ä»¥ç´æ¥ä½¿ç¨ lux -ccode ...
èä¸ç¨çå¾
lux æ´æ°ï¼å½ç¶ï¼ä¹æ¬¢è¿ä½ ç»æ们æä¸ä¸ª Pull request æ¥æ´æ°é»è®¤ç ccode
ï¼
æ好æ¯æ¯æ¬¡ä¸è½½é½é带ç»å½è¿ç Cookie 以é¿å
é¨å ccode
çé®é¢
西ç/头æ¡è§é¢
西ç/头æ¡è§é¢å¿ 须带 Cookie æè½ä¸è½½æåï¼è¥¿çå头æ¡å¯å ±ç¨è¥¿çè§é¢ç Cookieï¼Cookie çæææå¯è½è¾çï¼ä¸è½½å¤±è´¥å°±æ´æ° Cookie å°è¯ï¼
$ lux -c "msToken=yoEh0-qLUq4obZ8Sfxsem_CxCo9R3NM6ViTrWaRcM1...; ttwid=1%7C..." "https://m.toutiao.com/is/iYbTfJ79/"
Contributing
Lux is an open source project and built on the top of open-source projects. Check out the Contributing Guide to get started.
Authors
Code with â¤ï¸ by iawia002 and lovely contributors
Similar projects
License
MIT
Copyright (c) 2018-present, iawia002
Top Related Projects
Command-line program to download videos from YouTube.com and other video sites
A feature-rich command-line audio/video downloader
:arrow_double_down: Dumb downloader that scrapes the web
Command-line program to download image galleries and collections from several image hosting sites
aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot