]> jfr.im git - yt-dlp.git/commitdiff
[cleanup] Misc
authorpukkandan <redacted>
Fri, 17 Feb 2023 12:22:22 +0000 (17:52 +0530)
committerpukkandan <redacted>
Fri, 17 Feb 2023 12:22:22 +0000 (17:52 +0530)
Closes #5897

26 files changed:
.github/ISSUE_TEMPLATE/1_broken_site.yml
.github/ISSUE_TEMPLATE/2_site_support_request.yml
.github/ISSUE_TEMPLATE/3_site_feature_request.yml
.github/ISSUE_TEMPLATE/4_bug_report.yml
.github/ISSUE_TEMPLATE/5_feature_request.yml
.github/ISSUE_TEMPLATE/6_question.yml
.github/ISSUE_TEMPLATE_tmpl/1_broken_site.yml
.github/ISSUE_TEMPLATE_tmpl/2_site_support_request.yml
.github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.yml
.github/ISSUE_TEMPLATE_tmpl/4_bug_report.yml
.github/ISSUE_TEMPLATE_tmpl/5_feature_request.yml
.github/ISSUE_TEMPLATE_tmpl/6_question.yml
.github/PULL_REQUEST_TEMPLATE.md
CONTRIBUTORS
Collaborators.md
README.md
devscripts/make_issue_template.py
yt_dlp/YoutubeDL.py
yt_dlp/cache.py
yt_dlp/extractor/amazonminitv.py
yt_dlp/extractor/embedly.py
yt_dlp/extractor/radiko.py
yt_dlp/extractor/youtube.py
yt_dlp/options.py
yt_dlp/postprocessor/metadataparser.py
yt_dlp/utils.py

index d116cd7c67a33d546309ce05cf9e64617c112ca4..2237665e33a8bc04f0321ff01ed56e3f4a6905f9 100644 (file)
@@ -7,7 +7,7 @@ body:
       label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE
       description: Fill all fields even if you think it is irrelevant for the issue
       options:
-        - label: I understand that I will be **blocked** if I remove or skip any mandatory\* field
+        - label: I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field
           required: true
   - type: checkboxes
     id: checklist
@@ -24,7 +24,7 @@ body:
           required: true
         - label: I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 2bbf93a9399887d2f227bfeebe98a01b7041fdb7..0e2940d861b2d64f2e50ecb51230eadf20d4362d 100644 (file)
@@ -7,7 +7,7 @@ body:
       label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE
       description: Fill all fields even if you think it is irrelevant for the issue
       options:
-        - label: I understand that I will be **blocked** if I remove or skip any mandatory\* field
+        - label: I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field
           required: true
   - type: checkboxes
     id: checklist
@@ -24,7 +24,7 @@ body:
           required: true
         - label: I've checked that none of provided URLs [violate any copyrights](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#is-the-website-primarily-used-for-piracy) or contain any [DRM](https://en.wikipedia.org/wiki/Digital_rights_management) to the best of my knowledge
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index d1d3514f2212516946c29ff1d714d312d9ca1661..92501be2ef404429c5d534766e998f875d6f9d6d 100644 (file)
@@ -7,7 +7,7 @@ body:
       label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE
       description: Fill all fields even if you think it is irrelevant for the issue
       options:
-        - label: I understand that I will be **blocked** if I remove or skip any mandatory\* field
+        - label: I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field
           required: true
   - type: checkboxes
     id: checklist
@@ -22,7 +22,7 @@ body:
           required: true
         - label: I've checked that all provided URLs are playable in a browser with the same IP and same login details
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 8c851a945b10f5c2dda8e1bc9d6c0680bc247ebc..bdfc0efb8632f1bdad2ae35de1a6592d68e7a572 100644 (file)
@@ -7,7 +7,7 @@ body:
       label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE
       description: Fill all fields even if you think it is irrelevant for the issue
       options:
-        - label: I understand that I will be **blocked** if I remove or skip any mandatory\* field
+        - label: I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field
           required: true
   - type: checkboxes
     id: checklist
@@ -24,7 +24,7 @@ body:
           required: true
         - label: I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 444df3c32115be51c0b04c9a5ee7152975ef7341..c9e3aba38fd885ee76133e883bb486103126d232 100644 (file)
@@ -7,7 +7,7 @@ body:
       label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE
       description: Fill all fields even if you think it is irrelevant for the issue
       options:
-        - label: I understand that I will be **blocked** if I remove or skip any mandatory\* field
+        - label: I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field
           required: true
   - type: checkboxes
     id: checklist
@@ -22,7 +22,7 @@ body:
           required: true
         - label: I've verified that I'm running yt-dlp version **2023.01.06** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 997278f21fea1ee8b37537a5fc05a74728ace745..fe6a4ee3fb1780f1ac5ff905f9efb289c77ee6c1 100644 (file)
@@ -7,7 +7,7 @@ body:
       label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE
       description: Fill all fields even if you think it is irrelevant for the issue
       options:
-        - label: I understand that I will be **blocked** if I remove or skip any mandatory\* field
+        - label: I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field
           required: true
   - type: markdown
     attributes:
@@ -28,7 +28,7 @@ body:
           required: true
         - label: I've verified that I'm running yt-dlp version **2023.01.06** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar questions **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar questions **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index e1b1e51380642ff0cfc449fa8b0448ac3b1595b2..85900e92e21bed2c65ed91ad70f10b22a20b5b52 100644 (file)
@@ -18,7 +18,7 @@ body:
           required: true
         - label: I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 12a1c65987467c197cb071884785e486de063a72..75d62e7bb24bc4c414612f313149d67c2dc6f39f 100644 (file)
@@ -18,7 +18,7 @@ body:
           required: true
         - label: I've checked that none of provided URLs [violate any copyrights](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#is-the-website-primarily-used-for-piracy) or contain any [DRM](https://en.wikipedia.org/wiki/Digital_rights_management) to the best of my knowledge
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 2b46650f7089f69a2adddcefe612d474be72b52b..18b30f57831ce762173a532b6cd4533bf9de1810 100644 (file)
@@ -16,7 +16,7 @@ body:
           required: true
         - label: I've checked that all provided URLs are playable in a browser with the same IP and same login details
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 377efbe3386cd034e90f54a35df82efae1f29e0c..90f59e70b0c7aafae39672d2d74d8f9142b34596 100644 (file)
@@ -18,7 +18,7 @@ body:
           required: true
         - label: I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/yt-dlp/yt-dlp/wiki/FAQ#video-url-contains-an-ampersand--and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 8bbc5d733f639a9646b9bd224636dc0b216e9aeb..ef3bb226939889924c1a9e8e8fca21339d5140e4 100644 (file)
@@ -16,7 +16,7 @@ body:
           required: true
         - label: I've verified that I'm running yt-dlp version **%(version)s** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index ee09e82a38509812f6c8650d65350fc767c8e836..4bef82d5afd536ab55a53c5d414ceb996122da1c 100644 (file)
@@ -22,7 +22,7 @@ body:
           required: true
         - label: I've verified that I'm running yt-dlp version **%(version)s** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
           required: true
-        - label: I've searched the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar questions **including closed ones**. DO NOT post duplicates
+        - label: I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar questions **including closed ones**. DO NOT post duplicates
           required: true
         - label: I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
           required: true
index 7c271565ff2f2c99979eb55e051bb199451180de..c4d3e812e2e4fab6a42d0bdeaeecdbf85e58ffdc 100644 (file)
@@ -30,7 +30,7 @@ ### Before submitting a *pull request* make sure you have:
 - [ ] [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) 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 all of the following options that apply:
 - [ ] 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)
 
index 18fd70e4de27f06fc71021eb38004ba247082df6..e3b95e2f38430154f0b60130ef0953c47c41d611 100644 (file)
@@ -4,6 +4,7 @@ coletdjnz/colethedj (collaborator)
 Ashish0804 (collaborator)
 nao20010128nao/Lesmiscore (collaborator)
 bashonly (collaborator)
+Grub4K (collaborator)
 h-h-h-h
 pauldubois98
 nixxo
@@ -319,7 +320,6 @@ columndeeply
 DoubleCouponDay
 Fabi019
 GautamMKGarg
-Grub4K
 itachi-19
 jeroenj
 josanabr
index 3bce437c9baa7eb98772ecb3c258596bf06f7ae1..fe2a7f4b437974a4fcaf6cb5e713d6715d903146 100644 (file)
@@ -8,6 +8,7 @@ # Collaborators
 ## [pukkandan](https://github.com/pukkandan)
 
 [![ko-fi](https://img.shields.io/badge/_-Ko--fi-red.svg?logo=kofi&labelColor=555555&style=for-the-badge)](https://ko-fi.com/pukkandan)
+[![gh-sponsor](https://img.shields.io/badge/_-Github-red.svg?logo=github&labelColor=555555&style=for-the-badge)](https://github.com/sponsors/pukkandan)
 
 * Owner of the fork
 
@@ -25,8 +26,9 @@ ## [shirt](https://github.com/shirt-dev)
 
 ## [coletdjnz](https://github.com/coletdjnz)
 
-[![gh-sponsor](https://img.shields.io/badge/_-Sponsor-red.svg?logo=githubsponsors&labelColor=555555&style=for-the-badge)](https://github.com/sponsors/coletdjnz)
+[![gh-sponsor](https://img.shields.io/badge/_-Github-red.svg?logo=github&labelColor=555555&style=for-the-badge)](https://github.com/sponsors/coletdjnz)
 
+* Improved plugin architecture
 * YouTube improvements including: age-gate bypass, private playlists, multiple-clients (to avoid throttling) and a lot of under-the-hood improvements
 * Added support for new websites YoutubeWebArchive, MainStreaming, PRX, nzherald, Mediaklikk, StarTV etc
 * Improved/fixed support for Patreon, panopto, gfycat, itv, pbs, SouthParkDE etc
index 07c74d6c32ae603685ab2684f71a74a2e36f0742..29a6c06fdd99c486a26baa76db1b259300805c00 100644 (file)
--- a/README.md
+++ b/README.md
@@ -788,7 +788,7 @@ ## Workarounds:
     --prefer-insecure               Use an unencrypted connection to retrieve
                                     information about the video (Currently
                                     supported only for YouTube)
-    --add-header FIELD:VALUE        Specify a custom HTTP header and its value,
+    --add-headers FIELD:VALUE       Specify a custom HTTP header and its value,
                                     separated by a colon ":". You can use this
                                     option multiple times
     --bidi-workaround               Work around terminals that lack
@@ -1511,7 +1511,7 @@ ## Sorting Formats
  - `source`: The preference of the source
  - `proto`: Protocol used for download (`https`/`ftps` > `http`/`ftp` > `m3u8_native`/`m3u8` > `http_dash_segments`> `websocket_frag` > `mms`/`rtsp` > `f4f`/`f4m`)
  - `vcodec`: Video Codec (`av01` > `vp9.2` > `vp9` > `h265` > `h264` > `vp8` > `h263` > `theora` > other)
- - `acodec`: Audio Codec (`flac`/`alac` > `wav`/`aiff` > `opus` > `vorbis` > `aac` > `mp4a` > `mp3` `ac4` > > `eac3` > `ac3` > `dts` > other)
+ - `acodec`: Audio Codec (`flac`/`alac` > `wav`/`aiff` > `opus` > `vorbis` > `aac` > `mp4a` > `mp3` > `ac4` > `eac3` > `ac3` > `dts` > other)
  - `codec`: Equivalent to `vcodec,acodec`
  - `vext`: Video Extension (`mp4` > `mov` > `webm` > `flv` > other). If `--prefer-free-formats` is used, `webm` is preferred.
  - `aext`: Audio Extension (`m4a` > `aac` > `mp3` > `ogg` > `opus` > `webm` > other). If `--prefer-free-formats` is used, the order changes to `ogg` > `opus` > `webm` > `mp3` > `m4a` > `aac`
@@ -1741,6 +1741,8 @@ # EXTRACTOR ARGUMENTS
 
 Some extractors accept additional arguments which can be passed using `--extractor-args KEY:ARGS`. `ARGS` is a `;` (semicolon) separated string of `ARG=VAL1,VAL2`. E.g. `--extractor-args "youtube:player-client=android_embedded,web;include_live_dash" --extractor-args "funimation:version=uncut"`
 
+Note: In CLI, `ARG` can use `-` instead of `_`; e.g. `youtube:player-client"` becomes `youtube:player_client"`
+
 The following extractors use this feature:
 
 #### youtube
@@ -1887,7 +1889,7 @@ # EMBEDDING YT-DLP
     ydl.download(URLS)
 ```
 
-Most likely, you'll want to use various options. For a list of options available, have a look at [`yt_dlp/YoutubeDL.py`](yt_dlp/YoutubeDL.py#L180).
+Most likely, you'll want to use various options. For a list of options available, have a look at [`yt_dlp/YoutubeDL.py`](yt_dlp/YoutubeDL.py#L184).
 
 **Tip**: If you are porting your code from youtube-dl to yt-dlp, one important point to look out for is that we do not guarantee the return value of `YoutubeDL.extract_info` to be json serializable, or even be a dictionary. It will be dictionary-like, but if you want to ensure it is a serializable dictionary, pass it through `YoutubeDL.sanitize_info` as shown in the [example below](#extracting-information)
 
index fd964c6c6573e27964aa82b3949638b4afef7f2d..1ee00f2b89725ed2e85a840491dce50490995b3e 100644 (file)
@@ -58,7 +58,7 @@
       label: DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE
       description: Fill all fields even if you think it is irrelevant for the issue
       options:
-        - label: I understand that I will be **blocked** if I remove or skip any mandatory\\* field
+        - label: I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\\* field
           required: true
 '''.strip()
 
index 4e5c40b589444a263dc9657028193b2d520c83f1..d6c5ce769f34619edd57c60a01b404c04a3df2e0 100644 (file)
@@ -3665,6 +3665,7 @@ def simplified_codec(f, field):
                 format_field(f, 'asr', '\t%s', func=format_decimal_suffix),
                 join_nonempty(
                     self._format_out('UNSUPPORTED', 'light red') if f.get('ext') in ('f4f', 'f4m') else None,
+                    self._format_out('DRM', 'light red') if f.get('has_drm') else None,
                     format_field(f, 'language', '[%s]'),
                     join_nonempty(format_field(f, 'format_note'),
                                   format_field(f, 'container', ignore=(None, f.get('ext'))),
@@ -3764,12 +3765,13 @@ def get_encoding(stream):
         source = detect_variant()
         if VARIANT not in (None, 'pip'):
             source += '*'
+        klass = type(self)
         write_debug(join_nonempty(
             f'{"yt-dlp" if REPOSITORY == "yt-dlp/yt-dlp" else REPOSITORY} version',
             __version__,
             f'[{RELEASE_GIT_HEAD}]' if RELEASE_GIT_HEAD else '',
             '' if source == 'unknown' else f'({source})',
-            '' if _IN_CLI else 'API',
+            '' if _IN_CLI else 'API' if klass == YoutubeDL else f'API:{self.__module__}.{klass.__qualname__}',
             delim=' '))
 
         if not _IN_CLI:
index f8344fe77a957f7e12e42acc451932aa4e948527..9dd4f2f25b91a114cfb2ead8949e8fae654e8b69 100644 (file)
@@ -1,5 +1,4 @@
 import contextlib
-import errno
 import json
 import os
 import re
index 7309968537adf872303f95283463ae6b104c8190..b57d985d10a4d2b1f60a70627b270eb16ab056d2 100644 (file)
@@ -191,7 +191,7 @@ def _real_extract(self, url):
 class AmazonMiniTVSeasonIE(AmazonMiniTVBaseIE):
     IE_NAME = 'amazonminitv:season'
     _VALID_URL = r'amazonminitv:season:(?:amzn1\.dv\.gti\.)?(?P<id>[a-f0-9-]+)'
-    IE_DESC = 'Amazon MiniTV Series, "minitv:season:" prefix'
+    IE_DESC = 'Amazon MiniTV Season, "minitv:season:" prefix'
     _TESTS = [{
         'url': 'amazonminitv:season:amzn1.dv.gti.0aa996eb-6a1b-4886-a342-387fbd2f1db0',
         'playlist_mincount': 6,
@@ -250,6 +250,7 @@ def _real_extract(self, url):
 class AmazonMiniTVSeriesIE(AmazonMiniTVBaseIE):
     IE_NAME = 'amazonminitv:series'
     _VALID_URL = r'amazonminitv:series:(?:amzn1\.dv\.gti\.)?(?P<id>[a-f0-9-]+)'
+    IE_DESC = 'Amazon MiniTV Series, "minitv:series:" prefix'
     _TESTS = [{
         'url': 'amazonminitv:series:amzn1.dv.gti.56521d46-b040-4fd5-872e-3e70476a04b0',
         'playlist_mincount': 3,
index 1b58fca60f3e908f76c011811194a3d5b623a4be..458aaa0a08acd8e469a03a2c1c6852896c9385b1 100644 (file)
@@ -61,6 +61,35 @@ class EmbedlyIE(InfoExtractor):
         'only_matching': True,
     }]
 
+    _WEBPAGE_TESTS = [{
+        'url': 'http://www.permacultureetc.com/2022/12/comment-greffer-facilement-les-arbres-fruitiers.html',
+        'info_dict': {
+            'id': 'pfUK_ADTvgY',
+            'ext': 'mp4',
+            'title': 'Comment greffer facilement les arbres fruitiers ? (mois par mois)',
+            'description': 'md5:d3a876995e522f138aabb48e040bfb4c',
+            'view_count': int,
+            'upload_date': '20221210',
+            'comment_count': int,
+            'live_status': 'not_live',
+            'channel_id': 'UCsM4_jihNFYe4CtSkXvDR-Q',
+            'channel_follower_count': int,
+            'tags': ['permaculture', 'jardinage', 'dekarz', 'autonomie', 'greffe', 'fruitiers', 'arbres', 'jardin forêt', 'forêt comestible', 'damien'],
+            'playable_in_embed': True,
+            'uploader': 'permaculture agroécologie etc...',
+            'channel': 'permaculture agroécologie etc...',
+            'thumbnail': 'https://i.ytimg.com/vi/pfUK_ADTvgY/sddefault.jpg',
+            'duration': 1526,
+            'channel_url': 'https://www.youtube.com/channel/UCsM4_jihNFYe4CtSkXvDR-Q',
+            'age_limit': 0,
+            'uploader_id': 'permacultureetc',
+            'like_count': int,
+            'uploader_url': 'http://www.youtube.com/user/permacultureetc',
+            'categories': ['Education'],
+            'availability': 'public',
+        },
+    }]
+
     @classmethod
     def _extract_from_webpage(cls, url, webpage):
         # Bypass "ie=cls" and suitable check
index 43eecba5f6cd6e34aa903fa5dfb2ce944bc34813..7fdf782831815370acab114b82f7f49c03f3c0d2 100644 (file)
@@ -133,9 +133,9 @@ def _extract_formats(self, video_id, station, is_onair, ft, cursor, auth_token,
                     'X-Radiko-AreaId': area_id,
                     'X-Radiko-AuthToken': auth_token,
                 })
-            not_preferred = is_onair and not pcu.startswith(self._HOSTS_FOR_LIVE) or (not is_onair and (pcu.startswith(self._HOSTS_FOR_TIME_FREE_FFMPEG_UNSUPPORTED) or pcu.startswith(self._HOSTS_FOR_LIVE)))
             for sf in subformats:
-                if not_preferred:
+                if (is_onair ^ pcu.startswith(self._HOSTS_FOR_LIVE)) or (
+                        not is_onair and pcu.startswith(self._HOSTS_FOR_TIME_FREE_FFMPEG_UNSUPPORTED)):
                     sf['preference'] = -100
                     sf['format_note'] = 'not preferred'
                 if not is_onair and url_attrib['timefree'] == '1' and time_to_skip:
index d891d92a38c07ae45e1d61269d3a5f9550b04d90..be82bc6899cfb28df5810cad112bf66bfe5985fe 100644 (file)
@@ -4459,19 +4459,6 @@ def wrapper(self, url):
             return info_dict
         return wrapper
 
-    def _extract_channel_id(self, webpage):
-        channel_id = self._html_search_meta(
-            'channelId', webpage, 'channel id', default=None)
-        if channel_id:
-            return channel_id
-        channel_url = self._html_search_meta(
-            ('og:url', 'al:ios:url', 'al:android:url', 'al:web:url',
-             'twitter:url', 'twitter:app:url:iphone', 'twitter:app:url:ipad',
-             'twitter:app:url:googleplay'), webpage, 'channel url')
-        return self._search_regex(
-            r'https?://(?:www\.)?youtube\.com/channel/([^/?#&])+',
-            channel_url, 'channel id')
-
     @staticmethod
     def _extract_basic_item_renderer(item):
         # Modified from _extract_grid_item_renderer
index 68a3aecc40c50a61312246e5f228463b7231e69c..fd60ff55f2c8215f0a9892bbbd82467bf88366f9 100644 (file)
@@ -1031,7 +1031,7 @@ def _alias_callback(option, opt_str, value, parser, opts, nargs):
         metavar='URL', dest='referer', default=None,
         help=optparse.SUPPRESS_HELP)
     workarounds.add_option(
-        '--add-header',
+        '--add-headers',
         metavar='FIELD:VALUE', dest='headers', default={}, type='str',
         action='callback', callback=_dict_from_options_callback,
         callback_kwargs={'multiple_keys': False},
index f574f23300e0cb7ba822cdc597e197b04614ca61..1d6054294eaaa4d80374950e099c83f191631768 100644 (file)
@@ -1,7 +1,7 @@
 import re
 
 from .common import PostProcessor
-from ..utils import Namespace, filter_dict
+from ..utils import Namespace, filter_dict, function_with_repr
 
 
 class MetadataParserPP(PostProcessor):
@@ -60,6 +60,7 @@ def run(self, info):
             f(info)
         return [], info
 
+    @function_with_repr
     def interpretter(self, inp, out):
         def f(info):
             data_to_parse = self._downloader.evaluate_outtmpl(template, info)
@@ -76,6 +77,7 @@ def f(info):
         out_re = re.compile(self.format_to_regex(out))
         return f
 
+    @function_with_repr
     def replacer(self, field, search, replace):
         def f(info):
             val = info.get(field)
index 736468aefad34a36b511f330c14b1c6533939e3b..9eb9495a0362c0cea649985979fdf81b9ab639da 100644 (file)
@@ -3650,7 +3650,8 @@ def get_compatible_ext(*, vcodecs, acodecs, vexts, aexts, preferences=None):
         },
     }
 
-    sanitize_codec = functools.partial(try_get, getter=lambda x: x[0].split('.')[0].replace('0', ''))
+    sanitize_codec = functools.partial(
+        try_get, getter=lambda x: x[0].split('.')[0].replace('0', '').lower())
     vcodec, acodec = sanitize_codec(vcodecs), sanitize_codec(acodecs)
 
     for ext in preferences or COMPATIBLE_CODECS.keys():
@@ -3915,7 +3916,7 @@ def __eq__(self, other):
                 and self.chapters == other.chapters and self.ranges == other.ranges)
 
     def __repr__(self):
-        return f'{type(self).__name__}({self.chapters}, {self.ranges})'
+        return f'{__name__}.{type(self).__name__}({self.chapters}, {self.ranges})'
 
 
 def parse_dfxp_time_expr(time_expr):
@@ -6018,6 +6019,18 @@ def __get__(self, _, cls):
         return self._cache[cls]
 
 
+class function_with_repr:
+    def __init__(self, func):
+        functools.update_wrapper(self, func)
+        self.func = func
+
+    def __call__(self, *args, **kwargs):
+        return self.func(*args, **kwargs)
+
+    def __repr__(self):
+        return f'{self.func.__module__}.{self.func.__qualname__}'
+
+
 class Namespace(types.SimpleNamespace):
     """Immutable namespace"""