mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-22 02:15:12 +00:00
parent
e1e1ea54ae
commit
0a41f331cc
6 changed files with 51 additions and 26 deletions
19
.github/PULL_REQUEST_TEMPLATE.md
vendored
19
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -1,28 +1,29 @@
|
||||||
## Please follow the guide below
|
<!--
|
||||||
|
# Please follow the guide below
|
||||||
|
|
||||||
- You will be asked some questions, please read them **carefully** and answer honestly
|
- You will be asked some questions, please read them **carefully** and answer honestly
|
||||||
- Put an `x` into all the boxes [ ] relevant to your *pull request* (like that [x])
|
- Put an `x` into all the boxes `[ ]` relevant to your *pull request* (like [x])
|
||||||
- Use *Preview* tab to see how your *pull request* will actually look like
|
- Use *Preview* tab to see how your *pull request* will actually look like
|
||||||
|
|
||||||
---
|
-->
|
||||||
|
|
||||||
### Before submitting a *pull request* make sure you have:
|
### Before submitting a *pull request* make sure you have:
|
||||||
- [ ] At least skimmed through [contributing guidelines](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#developer-instructions) including [yt-dlp coding conventions](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#yt-dlp-coding-conventions)
|
- [ ] At least skimmed through [contributing guidelines](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#developer-instructions) including [yt-dlp coding conventions](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#yt-dlp-coding-conventions)
|
||||||
- [ ] [Searched](https://github.com/yt-dlp/yt-dlp/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests
|
- [ ] [Searched](https://github.com/yt-dlp/yt-dlp/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests
|
||||||
- [ ] Checked the code with [flake8](https://pypi.python.org/pypi/flake8)
|
- [ ] Checked the code with [flake8](https://pypi.python.org/pypi/flake8) and [ran relevant tests](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#developer-instructions)
|
||||||
|
|
||||||
### In order to be accepted and merged into yt-dlp each piece of code must be in public domain or released under [Unlicense](http://unlicense.org/). Check one of the following options:
|
### In order to be accepted and merged into yt-dlp each piece of code must be in public domain or released under [Unlicense](http://unlicense.org/). Check one of the following options:
|
||||||
- [ ] I am the original author of this code and I am willing to release it under [Unlicense](http://unlicense.org/)
|
- [ ] I am the original author of this code and I am willing to release it under [Unlicense](http://unlicense.org/)
|
||||||
- [ ] I am not the original author of this code but it is in public domain or released under [Unlicense](http://unlicense.org/) (provide reliable evidence)
|
- [ ] I am not the original author of this code but it is in public domain or released under [Unlicense](http://unlicense.org/) (provide reliable evidence)
|
||||||
|
|
||||||
### What is the purpose of your *pull request*?
|
### What is the purpose of your *pull request*?
|
||||||
- [ ] Bug fix
|
- [ ] Fix or improvement to an extractor (Make sure to add/update tests)
|
||||||
- [ ] Improvement
|
- [ ] New extractor ([Piracy websites will not be accepted](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#is-the-website-primarily-used-for-piracy))
|
||||||
- [ ] New extractor
|
- [ ] Core bug fix/improvement
|
||||||
- [ ] New feature
|
- [ ] New feature (It is strongly [recommended to open an issue first](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#adding-new-feature-or-making-overarching-changes))
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Description of your *pull request* and other information
|
### Description of your *pull request* and other information
|
||||||
|
|
||||||
Explanation of your *pull request* in arbitrary form goes here. Please make sure the description explains the purpose and effect of your *pull request* and is worded well enough to be understood. Provide as much context and examples as possible.
|
Explanation of your *pull request* in arbitrary form goes here. Please **make sure the description explains the purpose and effect** of your *pull request* and is worded well enough to be understood. Provide as much **context and examples** as possible.
|
||||||
|
|
36
README.md
36
README.md
|
@ -270,7 +270,7 @@ ## DEPENDENCIES
|
||||||
* [**mutagen**](https://github.com/quodlibet/mutagen)\* - For embedding thumbnail in certain formats. Licensed under [GPLv2+](https://github.com/quodlibet/mutagen/blob/master/COPYING)
|
* [**mutagen**](https://github.com/quodlibet/mutagen)\* - For embedding thumbnail in certain formats. Licensed under [GPLv2+](https://github.com/quodlibet/mutagen/blob/master/COPYING)
|
||||||
* [**pycryptodomex**](https://github.com/Legrandin/pycryptodome)\* - For decrypting AES-128 HLS streams and various other data. Licensed under [BSD-2-Clause](https://github.com/Legrandin/pycryptodome/blob/master/LICENSE.rst)
|
* [**pycryptodomex**](https://github.com/Legrandin/pycryptodome)\* - For decrypting AES-128 HLS streams and various other data. Licensed under [BSD-2-Clause](https://github.com/Legrandin/pycryptodome/blob/master/LICENSE.rst)
|
||||||
* [**websockets**](https://github.com/aaugustin/websockets)\* - For downloading over websocket. Licensed under [BSD-3-Clause](https://github.com/aaugustin/websockets/blob/main/LICENSE)
|
* [**websockets**](https://github.com/aaugustin/websockets)\* - For downloading over websocket. Licensed under [BSD-3-Clause](https://github.com/aaugustin/websockets/blob/main/LICENSE)
|
||||||
* [**secretstorage**](https://github.com/mitya57/secretstorage)\* - For accessing the Gnome keyring while decrypting cookies of Chromium-based browsers on Linux. Licensed under [BSD-3-Clause](https://github.com/mitya57/secretstorage/blob/master/LICENSE)
|
* [**secretstorage**](https://github.com/mitya57/secretstorage) - For accessing the Gnome keyring while decrypting cookies of Chromium-based browsers on Linux. Licensed under [BSD-3-Clause](https://github.com/mitya57/secretstorage/blob/master/LICENSE)
|
||||||
* [**brotli**](https://github.com/google/brotli)\* or [**brotlicffi**](https://github.com/python-hyper/brotlicffi) - [Brotli](https://en.wikipedia.org/wiki/Brotli) content encoding support. Both licensed under MIT <sup>[1](https://github.com/google/brotli/blob/master/LICENSE) [2](https://github.com/python-hyper/brotlicffi/blob/master/LICENSE) </sup>
|
* [**brotli**](https://github.com/google/brotli)\* or [**brotlicffi**](https://github.com/python-hyper/brotlicffi) - [Brotli](https://en.wikipedia.org/wiki/Brotli) content encoding support. Both licensed under MIT <sup>[1](https://github.com/google/brotli/blob/master/LICENSE) [2](https://github.com/python-hyper/brotlicffi/blob/master/LICENSE) </sup>
|
||||||
* [**certifi**](https://github.com/certifi/python-certifi)\* - Provides Mozilla's root certificate bundle. Licensed under [MPLv2](https://github.com/certifi/python-certifi/blob/master/LICENSE)
|
* [**certifi**](https://github.com/certifi/python-certifi)\* - Provides Mozilla's root certificate bundle. Licensed under [MPLv2](https://github.com/certifi/python-certifi/blob/master/LICENSE)
|
||||||
* [**AtomicParsley**](https://github.com/wez/atomicparsley) - For embedding thumbnail in mp4/m4a if mutagen/ffmpeg cannot. Licensed under [GPLv2+](https://github.com/wez/atomicparsley/blob/master/COPYING)
|
* [**AtomicParsley**](https://github.com/wez/atomicparsley) - For embedding thumbnail in mp4/m4a if mutagen/ffmpeg cannot. Licensed under [GPLv2+](https://github.com/wez/atomicparsley/blob/master/COPYING)
|
||||||
|
@ -282,7 +282,7 @@ ## DEPENDENCIES
|
||||||
|
|
||||||
To use or redistribute the dependencies, you must agree to their respective licensing terms.
|
To use or redistribute the dependencies, you must agree to their respective licensing terms.
|
||||||
|
|
||||||
The Windows and MacOS standalone release binaries are already built with the python interpreter and all optional python packages (marked with \*) included.
|
The Windows and MacOS standalone release binaries are built with the Python interpreter and the packages marked with \* included.
|
||||||
|
|
||||||
<!-- TODO: ffmpeg has merged this patch. Remove this note once there is new release -->
|
<!-- TODO: ffmpeg has merged this patch. Remove this note once there is new release -->
|
||||||
**Note**: There are some regressions in newer ffmpeg versions that causes various issues when used alongside yt-dlp. Since ffmpeg is such an important dependency, we provide [custom builds](https://github.com/yt-dlp/FFmpeg-Builds#ffmpeg-static-auto-builds) with patches for these issues at [yt-dlp/FFmpeg-Builds](https://github.com/yt-dlp/FFmpeg-Builds). See [the readme](https://github.com/yt-dlp/FFmpeg-Builds#patches-applied) for details on the specific issues solved by these builds
|
**Note**: There are some regressions in newer ffmpeg versions that causes various issues when used alongside yt-dlp. Since ffmpeg is such an important dependency, we provide [custom builds](https://github.com/yt-dlp/FFmpeg-Builds#ffmpeg-static-auto-builds) with patches for these issues at [yt-dlp/FFmpeg-Builds](https://github.com/yt-dlp/FFmpeg-Builds). See [the readme](https://github.com/yt-dlp/FFmpeg-Builds#patches-applied) for details on the specific issues solved by these builds
|
||||||
|
@ -533,10 +533,10 @@ ## Download Options:
|
||||||
(http, ftp, m3u8, dash, rstp, rtmp, mms) to
|
(http, ftp, m3u8, dash, rstp, rtmp, mms) to
|
||||||
use it for. Currently supports native,
|
use it for. Currently supports native,
|
||||||
aria2c, avconv, axel, curl, ffmpeg, httpie,
|
aria2c, avconv, axel, curl, ffmpeg, httpie,
|
||||||
wget (Recommended: aria2c). You can use
|
wget. You can use this option multiple
|
||||||
this option multiple times to set different
|
times to set different downloaders for
|
||||||
downloaders for different protocols. For
|
different protocols. For example,
|
||||||
example, --downloader aria2c --downloader
|
--downloader aria2c --downloader
|
||||||
"dash,m3u8:native" will use aria2c for
|
"dash,m3u8:native" will use aria2c for
|
||||||
http/ftp downloads, and the native
|
http/ftp downloads, and the native
|
||||||
downloader for dash/m3u8 downloads (Alias:
|
downloader for dash/m3u8 downloads (Alias:
|
||||||
|
@ -1801,7 +1801,7 @@ #### Extract audio
|
||||||
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
||||||
|
|
||||||
ydl_opts = {
|
ydl_opts = {
|
||||||
'format': 'm4a/bestaudio/best'
|
'format': 'm4a/bestaudio/best',
|
||||||
# ℹ️ See help(yt_dlp.postprocessor) for a list of available Postprocessors and their arguments
|
# ℹ️ See help(yt_dlp.postprocessor) for a list of available Postprocessors and their arguments
|
||||||
'postprocessors': [{ # Extract audio using ffmpeg
|
'postprocessors': [{ # Extract audio using ffmpeg
|
||||||
'key': 'FFmpegExtractAudio',
|
'key': 'FFmpegExtractAudio',
|
||||||
|
@ -1812,6 +1812,28 @@ #### Extract audio
|
||||||
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
||||||
error_code = ydl.download(URLS)
|
error_code = ydl.download(URLS)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Filter videos
|
||||||
|
|
||||||
|
```python
|
||||||
|
import yt_dlp
|
||||||
|
|
||||||
|
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
||||||
|
|
||||||
|
def longer_than_a_minute(info, *, incomplete):
|
||||||
|
"""Download only videos longer than a minute (or with unknown duration)"""
|
||||||
|
duration = info.get('duration')
|
||||||
|
if duration and duration < 60:
|
||||||
|
return 'The video is too short'
|
||||||
|
|
||||||
|
ydl_opts = {
|
||||||
|
'match_filter': longer_than_a_minute,
|
||||||
|
}
|
||||||
|
|
||||||
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
||||||
|
error_code = ydl.download(URLS)
|
||||||
|
```
|
||||||
|
|
||||||
#### Adding logger and progress hook
|
#### Adding logger and progress hook
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -127,7 +127,7 @@ def run(self):
|
||||||
packages=packages,
|
packages=packages,
|
||||||
install_requires=REQUIREMENTS,
|
install_requires=REQUIREMENTS,
|
||||||
project_urls={
|
project_urls={
|
||||||
'Documentation': 'https://yt-dlp.readthedocs.io',
|
'Documentation': 'https://github.com/yt-dlp/yt-dlp#readme',
|
||||||
'Source': 'https://github.com/yt-dlp/yt-dlp',
|
'Source': 'https://github.com/yt-dlp/yt-dlp',
|
||||||
'Tracker': 'https://github.com/yt-dlp/yt-dlp/issues',
|
'Tracker': 'https://github.com/yt-dlp/yt-dlp/issues',
|
||||||
'Funding': 'https://github.com/yt-dlp/yt-dlp/blob/master/Collaborators.md#collaborators',
|
'Funding': 'https://github.com/yt-dlp/yt-dlp/blob/master/Collaborators.md#collaborators',
|
||||||
|
|
|
@ -409,12 +409,14 @@ class YoutubeDL:
|
||||||
sleep_interval_subtitles: Number of seconds to sleep before each subtitle download
|
sleep_interval_subtitles: Number of seconds to sleep before each subtitle download
|
||||||
listformats: Print an overview of available video formats and exit.
|
listformats: Print an overview of available video formats and exit.
|
||||||
list_thumbnails: Print a table of all thumbnails and exit.
|
list_thumbnails: Print a table of all thumbnails and exit.
|
||||||
match_filter: A function that gets called with the info_dict of
|
match_filter: A function that gets called for every video with the signature
|
||||||
every video.
|
(info_dict, *, incomplete: bool) -> Optional[str]
|
||||||
If it returns a message, the video is ignored.
|
For backward compatibility with youtube-dl, the signature
|
||||||
If it returns None, the video is downloaded.
|
(info_dict) -> Optional[str] is also allowed.
|
||||||
If it returns utils.NO_DEFAULT, the user is interactively
|
- If it returns a message, the video is ignored.
|
||||||
asked whether to download the video.
|
- If it returns None, the video is downloaded.
|
||||||
|
- If it returns utils.NO_DEFAULT, the user is interactively
|
||||||
|
asked whether to download the video.
|
||||||
match_filter_func in utils.py is one example for this.
|
match_filter_func in utils.py is one example for this.
|
||||||
no_color: Do not emit color codes in output.
|
no_color: Do not emit color codes in output.
|
||||||
geo_bypass: Bypass geographic restriction via faking X-Forwarded-For
|
geo_bypass: Bypass geographic restriction via faking X-Forwarded-For
|
||||||
|
|
|
@ -287,7 +287,7 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
|
||||||
# invidious-redirect websites
|
# invidious-redirect websites
|
||||||
r'(?:www\.)?redirect\.invidious\.io',
|
r'(?:www\.)?redirect\.invidious\.io',
|
||||||
r'(?:(?:www|dev)\.)?invidio\.us',
|
r'(?:(?:www|dev)\.)?invidio\.us',
|
||||||
# Invidious instances taken from https://github.com/iv-org/documentation/blob/master/Invidious-Instances.md
|
# Invidious instances taken from https://github.com/iv-org/documentation/blob/master/docs/instances.md
|
||||||
r'(?:www\.)?invidious\.pussthecat\.org',
|
r'(?:www\.)?invidious\.pussthecat\.org',
|
||||||
r'(?:www\.)?invidious\.zee\.li',
|
r'(?:www\.)?invidious\.zee\.li',
|
||||||
r'(?:www\.)?invidious\.ethibox\.fr',
|
r'(?:www\.)?invidious\.ethibox\.fr',
|
||||||
|
|
|
@ -814,11 +814,11 @@ def _dict_from_options_callback(
|
||||||
}, help=(
|
}, help=(
|
||||||
'Name or path of the external downloader to use (optionally) prefixed by '
|
'Name or path of the external downloader to use (optionally) prefixed by '
|
||||||
'the protocols (http, ftp, m3u8, dash, rstp, rtmp, mms) to use it for. '
|
'the protocols (http, ftp, m3u8, dash, rstp, rtmp, mms) to use it for. '
|
||||||
'Currently supports native, %s (Recommended: aria2c). '
|
f'Currently supports native, {", ".join(list_external_downloaders())}. '
|
||||||
'You can use this option multiple times to set different downloaders for different protocols. '
|
'You can use this option multiple times to set different downloaders for different protocols. '
|
||||||
'For example, --downloader aria2c --downloader "dash,m3u8:native" will use '
|
'For example, --downloader aria2c --downloader "dash,m3u8:native" will use '
|
||||||
'aria2c for http/ftp downloads, and the native downloader for dash/m3u8 downloads '
|
'aria2c for http/ftp downloads, and the native downloader for dash/m3u8 downloads '
|
||||||
'(Alias: --external-downloader)' % ', '.join(list_external_downloaders())))
|
'(Alias: --external-downloader)'))
|
||||||
downloader.add_option(
|
downloader.add_option(
|
||||||
'--downloader-args', '--external-downloader-args',
|
'--downloader-args', '--external-downloader-args',
|
||||||
metavar='NAME:ARGS', dest='external_downloader_args', default={}, type='str',
|
metavar='NAME:ARGS', dest='external_downloader_args', default={}, type='str',
|
||||||
|
|
Loading…
Reference in a new issue