{"id":13596043,"url":"https://github.com/dertuxmalwieder/yaydl","last_synced_at":"2026-04-04T04:25:20.568Z","repository":{"id":38884044,"uuid":"311121621","full_name":"dertuxmalwieder/yaydl","owner":"dertuxmalwieder","description":"yet another youtube down loader (Git mirror)","archived":false,"fork":false,"pushed_at":"2025-02-04T01:00:25.000Z","size":326,"stargazers_count":290,"open_issues_count":1,"forks_count":18,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-02-04T02:18:37.093Z","etag":null,"topics":["download","rust","video","vimeo","vivo","voe","youtube"],"latest_commit_sha":null,"homepage":"https://code.rosaelefanten.org/yaydl","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dertuxmalwieder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["dertuxmalwieder"],"liberapay":"Cthulhux","custom":["https://paypal.me/GebtmireuerGeld"]}},"created_at":"2020-11-08T17:54:56.000Z","updated_at":"2025-02-04T01:00:28.000Z","dependencies_parsed_at":"2025-01-22T02:18:17.493Z","dependency_job_id":"8d33e77f-2350-4808-a0ce-860d0cc5a5f5","html_url":"https://github.com/dertuxmalwieder/yaydl","commit_stats":null,"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dertuxmalwieder%2Fyaydl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dertuxmalwieder%2Fyaydl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dertuxmalwieder%2Fyaydl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dertuxmalwieder%2Fyaydl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dertuxmalwieder","download_url":"https://codeload.github.com/dertuxmalwieder/yaydl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248049853,"owners_count":21039281,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["download","rust","video","vimeo","vivo","voe","youtube"],"created_at":"2024-08-01T16:02:05.836Z","updated_at":"2026-04-04T04:25:20.562Z","avatar_url":"https://github.com/dertuxmalwieder.png","language":"Rust","funding_links":["https://github.com/sponsors/dertuxmalwieder","https://liberapay.com/Cthulhux","https://paypal.me/GebtmireuerGeld","https://paypal.me/gebtmireuergeld","https://liberapay.com/Cthulhux/donate"],"categories":["Applications","应用程序 Applications","Rust","HarmonyOS"],"sub_categories":["Video","视频 Video","Windows Manager"],"readme":"# yaydl\n\n[![Crates.io](https://img.shields.io/crates/v/yaydl)](https://crates.io/crates/yaydl)\n\n**y**et **a**nother **y**outube *(and more)* **d**own **l**oader\n\n    % yaydl \"https://www.youtube.com/watch?v=jNQXAC9IVRw\"\n\n## How? What? Why?\n\n    % yaydl --help\n\n# Features\n\n* Can download videos.\n* Can optionally keep only the audio part of them.\n* Could convert the resulting file to something else (requires the `ffmpeg` binary).\n* Comes as a single binary (once compiled) - take it everywhere on your thumbdrive, no Python cruft required.\n\n## Currently supported sites\n\n* invidious (most of them) · porndoe.com · pr0gramm.com · spankbang.com · Vidoza · Vimeo · vivo.sx · voe.sx · watchdirty.to · xhamster.com · YouTube\n* (Hopefully) Most sites that use a KT/KVS5 player widget\n* Also, direct downloads for `.mp4` and `.mpg` files.\n\nThere is an easy way to add more supported sites, see below for details.\n\n## Non-features\n\nThe list of features is deliberately kept short:\n\n* No output quality choice. `yaydl` assumes that you have a large hard drive and your internet connection is good enough, or else you would stream, not download.\n* No complex filters. This is a downloading tool.\n* No image file support. Videos only.\n\n## How to install\n\n### Prebuilt Windows binaries\n\nAvailable on [cdn.tuxproject.de](https://cdn.tuxproject.de/projects/yaydl/).\n\n### From the source code\n\nInstall Rust (e.g. with [rustup](https://rustup.rs)), then:\n\n**using Fossil:**\n\n    % fossil clone https://code.rosaelefanten.org/yaydl\n    % cd yaydl\n    % cargo build --release\n\n**using Git:**\n\n    % git clone https://github.com/dertuxmalwieder/yaydl\n    % cd yaydl\n    % cargo build --release\n\n### From Cargo\n\n    % cargo install yaydl\n\n### From your package manager\n\n`pkgsrc` (with `pkg_add`):\n\n    % pkg_add yaydl\n\n`pkgsrc` (with `pkgin`):\n\n    % pkgin install yaydl\n\n`xbps-install` on Void Linux:\n\n    % xbps-install yaydl\n\nOther package managers:\n\n* Nobody has provided any other packages for `yaydl` yet. You can help!\n\n# How to use the web driver (very beta, at your own risk!)\n\nFor some video sites, `yaydl` needs to be able to parse a JavaScript on them. For this, it needs to be able to spawn a headless web browser. It requires Google Chrome, Microsoft Edge or Mozilla Firefox to be installed and running on your system.\n\n1. Install and run [ChromeDriver](https://chromedriver.chromium.org) (if you use Chrome), the *typically* named [Microsoft Edge WebDriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/) (if you use Edge) or [geckodriver](https://github.com/mozilla/geckodriver/releases) (if you use Firefox) for your platform.\n2. Tell `yaydl` that you have a web driver running: `yaydl --webdriver \u003cport\u003e \u003cvideo URL\u003e`. (The drivers usually run on port 4444 or 9515, please consult their documentation if you are not sure.)\n   *Hint:* If you need this feature regularly, you can also use the environment variable `YAYDL_WEBDRIVER_PORT` to set the port number for all further requests.\n3. In theory, it should be possible to use more sites with `yaydl` now. :-)\n\n# How to set the default Invidious instance\n\nFor rather obvious reasons, including (but not limited to) the fact that Google tries to choke third-party clients, `yaydl` has been using Invidious as a wrapper since version 0.13.0. Now sometimes, the default instance hard-coded into `src/handlers/youtube.rs` *will* fail to work properly. You can use the environment variable `YAYDL_INVIDIOUS_INSTANCE` to change that: Just set it to the URI (including \"https://\") of [any other instance](https://docs.invidious.io/instances/).\n\n# How to contribute code\n\n1. Read and agree to the [Code of ~~Conduct~~ Merit](CODE_OF_CONDUCT.md).\n2. Implicitly agree to the [LICENSE](LICENSE). Nobody reads those. I don't either.\n3. Find out if anyone has filed a GitHub Issue or even sent a Pull Request yet. Act accordingly.\n4. 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. :-)\n\nIf you do that well (and regularly) enough, I'll probably grant you commit access to the upstream Fossil repository.\n\n### Add support for new sites\n\n1. Implement `definitions::SiteDefinition` as `handlers/\u003cYourSite\u003e.rs`.\n2. Push the new handler to the inventory: `inventory::submit! {  \u0026YourSiteHandler as \u0026dyn SiteDefinition }`\n3. Add the new module to `handlers.rs`.\n4. Optionally, add new requirements to `Cargo.toml`.\n5. Send me a patch, preferably with an example. (I cannot know all sites.)\n\n#### Minimal example that does nothing\n\n```rust\n// handlers/noop.rs\n\nuse anyhow::Result;\n\nuse crate::definitions::SiteDefinition;\nuse crate::VIDEO;\n\nstruct NoopExampleHandler;\nimpl SiteDefinition for NoopExampleHandler {\n    // Parameters sent to the handler by yaydl:\n    // - url:            The video page's URL.\n    // - webdriver_port: The port that runs the WebDriver client.\n    //                   Defaults to 0 if there is no WebDriver configured.\n    // - onlyaudio:      true if only the audio part of the video should be\n    //                   kept, else false.\n    fn can_handle_url\u003c'a\u003e(\u0026'a self, video: \u0026mut VIDEO, url: \u0026'a str, webdriver_port: u16) -\u003e Result\u003cbool\u003e {\n        // Return true here if \u003curl\u003e can be covered by this handler.\n        // Note that yaydl will skip all other handlers unless does_video_exist() is false.\n        Ok(true)\n    }\n\n    fn does_video_exist\u003c'a\u003e(\u0026'a self, video: \u0026'a mut VIDEO, url: \u0026'a str, webdriver_port: u16) -\u003e Result\u003cbool\u003e {\n        // Return true here, if the video exists.\n        // If it's false, yaydl will try the next matching handler.\n        Ok(false)\n    }\n\n    fn is_playlist\u003c'a\u003e(\u0026'a self, url: \u0026'a str, webdriver_port: u16) -\u003e Result\u003cbool\u003e {\n    \t// Return true here, if the download link is a playlist.\n    \tOk(false)\n    }\n\n    fn find_video_title\u003c'a\u003e(\u0026'a self, video: \u0026'a mut VIDEO, url: \u0026'a str, webdriver_port: u16) -\u003e Result\u003cString\u003e {\n        // Return the video title from \u003curl\u003e here.\n        Ok(\"\".to_string())\n    }\n\n    fn find_video_direct_url\u003c'a\u003e(\u0026'a self, video: \u0026'a mut VIDEO, url: \u0026'a str, webdriver_port: u16, onlyaudio: bool) -\u003e Result\u003cString\u003e {\n        // Return the direct download URL of the video (or its audio version) here.\n        // Exception: If is_playlist() is true, return the playlist URL here instead.\n        Ok(\"\".to_string())\n    }\n\n    fn find_video_file_extension\u003c'a\u003e(\u0026'a self, video: \u0026'a mut VIDEO, url: \u0026'a str, webdriver_port: u16, onlyaudio: bool) -\u003e Result\u003cString\u003e {\n        // Return the designated file extension of the video (or audio) file here.\n        Ok(\"mp4\".to_string())\n    }\n\n    fn display_name\u003c'a\u003e(\u0026'a self) -\u003e String {\n        // For cosmetics, this is the display name of this handler.\n        \"NoopExample\"\n    }\n\n    fn web_driver_required\u003c'a\u003e(\u0026'a self) -\u003e bool {\n        // Return true here, if the implementation requires a web driver to be running.\n        false\n    }\n}\n\n// Push the site definition to the list of known handlers:\ninventory::submit! {\n    \u0026NoopExampleHandler as \u0026dyn SiteDefinition\n}\n```\n\n### Fix some bugs or add new features\n\n1. Do so.\n2. Send me a patch.\n\n## Donations\n\nWriting 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.\n\n* PayPal: [GebtmireuerGeld](https://paypal.me/gebtmireuergeld)\n* Liberapay: [Cthulhux](https://liberapay.com/Cthulhux/donate)\n\nThank you.\n\n## Contact\n\n* Twitter: [@tux0r](https://twitter.com/tux0r)\n* Mastodon: [@tux0r@layer8.space](https://layer8.space/@tux0r)\n* Forum: [DonationCoder.com](https://www.donationcoder.com/forum/index.php?topic=50691.0)\n* IRC: `irc.oftc.net/yaydl`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdertuxmalwieder%2Fyaydl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdertuxmalwieder%2Fyaydl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdertuxmalwieder%2Fyaydl/lists"}