yaydl

Crates.io

yet another youtube (and more) down loader

% yaydl "https://www.youtube.com/watch?v=jNQXAC9IVRw"

How? What? Why?

% yaydl --help

Features

Currently supported sites

There is an easy way to add more supported sites, see below for details.

Non-features

The list of features is deliberately kept short:

Missing features (patches are welcome)

How to install

From the source code

Install Rust (e.g. with rustup), then:

using Fossil:

% fossil clone https://code.rosaelefanten.org/yaydl
% cd yaydl
% cargo build --release

using Git:

% git clone https://github.com/dertuxmalwieder/yaydl
% cd yaydl
% cargo build --release

From Cargo

% cargo install yaydl

From your package manager

pkgsrc (with pkg_add):

% pkg_add yaydl

pkgsrc (with pkgin):

% pkgin install yaydl

Other package managers:

How to use the web driver (very beta, at your own risk!)

For some video sites, yaydl needs to be able to parse a JavaScript on them. For this, it needs to spawn a headless web browser. It requires Chrome or Firefox to be available on your system as of now.

  1. Install and run ChromeDriver or geckodriver for your platform.
  2. Tell yaydl that you have a web driver running: yaydl --webdriver <port> .... (Both drivers use different defaults and options, please consult their command-line help.)
  3. In theory, it should be possible to use more sites with yaydl now. :-)

How to contribute code

  1. Read and agree to the Code of ~~Conduct~~ Merit.
  2. Implicitly agree to the LICENSE. Nobody reads those. I don't either.
  3. Find out if anyone has filed a GitHub Issue or even sent a Pull Request yet. Act accordingly.
  4. Send me a patch, either via e-mail (yaydl at tuxproject dot de), on the IRC or as a GitHub Pull Request. Note that GitHub only provides a mirror, so you'd double my work if you choose the latter. :-)

If you do that well (and regularly) enough, I'll probably grant you commit access to the upstream Fossil repository.

Add support for new sites

  1. Implement definitions::SiteDefinition as handlers/<YourSite>.rs.
  2. Push the new handler to the inventory: inventory::submit! { &YourSiteHandler as &dyn SiteDefinition }
  3. Add the new module to handlers.rs.
  4. Optionally, add new requirements to Cargo.toml.
  5. Send me a patch, preferably with an example. (I cannot know all sites.)

Minimal example that does nothing

```rust // handlers/noop.rs

use anyhow::Result; use crate::definitions::SiteDefinition;

struct NoopExampleHandler; impl SiteDefinition for NoopExampleHandler { fn canhandleurl<'a>(&'a self, url: &'a str, webdriver_port: u16) -> bool { // Return true here, if can be covered by this handler. // Note that yaydl will skip all other handlers then. true }

fn does_video_exist<'a>(&'a self, url: &'a str, webdriver_port: u16) -> Result<bool> {
    // Return true here, if the video exists.
    // The webdriver port can be 0 if it is not required.
    Ok(false)
}

fn find_video_title<'a>(&'a self, url: &'a str, webdriver_port: u16) -> Result<String> {
    // Return the video title from <url> here.
    // The webdriver port can be 0 if it is not required.
    Ok("".to_string())
}

fn find_video_direct_url<'a>(&'a self, url: &'a str, webdriver_port: u16, onlyaudio: bool) -> Result<String> {
    // Return the direct download URL of the video (or its audio version) here.
    // The webdriver port can be 0 if it is not required.
    Ok("".to_string())
}

fn find_video_file_extension<'a>(&'a self, url: &'a str, webdriver_port: u16, onlyaudio: bool) -> Result<String> {
    // Return the designated file extension of the video (or audio) file here.
    // The webdriver port can be 0 if it is not required.
    Ok("mp4".to_string())
}

fn display_name<'a>(&'a self) -> String {
    // For cosmetics, this is the display name of this handler.
    "NoopExample"
}

fn web_driver_required<'a>(&'a self) -> bool {
    // Return true here, if the implementation requires a web driver to be running.
    false
}

}

// Push the site definition to the list of known handlers: inventory::submit! { &NoopExampleHandler as &dyn SiteDefinition } ```

Fix some bugs or add new features

  1. Do so.
  2. Send me a patch.

Donations

Writing this software and keeping it available is eating some of the time which most people would spend with their friends. Naturally, I absolutely accept financial compensation.

Thank you.

Contact