mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2026-01-17 12:21:52 +00:00
Compare commits
265 Commits
2021.05.20
...
2021.08.02
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ccf351a87 | ||
|
|
28dff70b51 | ||
|
|
1aebc0f79e | ||
|
|
cf87314d4e | ||
|
|
1bd3639f69 | ||
|
|
68f5867cf0 | ||
|
|
605cad0be7 | ||
|
|
0855702f3f | ||
|
|
e8384376c0 | ||
|
|
e7e94f2a5c | ||
|
|
a46a815b05 | ||
|
|
96fccc101f | ||
|
|
dbf5416a20 | ||
|
|
d74a58a186 | ||
|
|
f5510afef0 | ||
|
|
e4f0275711 | ||
|
|
e0f2b4b47d | ||
|
|
eca330cb88 | ||
|
|
d24734daea | ||
|
|
d9e6e9481e | ||
|
|
3619f78d2c | ||
|
|
65c2fde23f | ||
|
|
000c15a4ca | ||
|
|
9275f62cf8 | ||
|
|
6552469433 | ||
|
|
11cc45718c | ||
|
|
fe07e2c69f | ||
|
|
89ce723edd | ||
|
|
45d1f15725 | ||
|
|
a318f59d14 | ||
|
|
7d1eb38af1 | ||
|
|
901130bbcf | ||
|
|
c0bc527bca | ||
|
|
2a9c6dcd22 | ||
|
|
5a1fc62b41 | ||
|
|
b4c055bac2 | ||
|
|
ea05b3020d | ||
|
|
9536bc072d | ||
|
|
8242bf220d | ||
|
|
4bfa401d40 | ||
|
|
0222620725 | ||
|
|
1fe3c4c27e | ||
|
|
f703a88055 | ||
|
|
a353beba83 | ||
|
|
052e135029 | ||
|
|
cb89cfc14b | ||
|
|
060ac76257 | ||
|
|
063c409dfb | ||
|
|
767b02a99b | ||
|
|
f45e6c1126 | ||
|
|
3944e7af92 | ||
|
|
ad34b2951e | ||
|
|
c8fa48fd94 | ||
|
|
2fd226f6a7 | ||
|
|
3ba7740dd8 | ||
|
|
29b208f6f9 | ||
|
|
e4d666d27b | ||
|
|
245524e6a3 | ||
|
|
9c0d7f4951 | ||
|
|
e37d0efbd9 | ||
|
|
c926c9541f | ||
|
|
982ee69a74 | ||
|
|
7ea6541124 | ||
|
|
ae30b84072 | ||
|
|
cc9d1493c6 | ||
|
|
f6755419d1 | ||
|
|
145bd631c5 | ||
|
|
b35496d825 | ||
|
|
352d63fdb5 | ||
|
|
11f9be0912 | ||
|
|
c84aeac6b5 | ||
|
|
50fed816dd | ||
|
|
a1a7907bc0 | ||
|
|
d61fc64618 | ||
|
|
6586bca9b9 | ||
|
|
da503b7a52 | ||
|
|
7c365c2109 | ||
|
|
3f698246b2 | ||
|
|
cca80fe611 | ||
|
|
c634ad2a3c | ||
|
|
8f3343809e | ||
|
|
0ba692acc8 | ||
|
|
d9488f69c1 | ||
|
|
dce8743677 | ||
|
|
5520aa2dc9 | ||
|
|
8d9b902243 | ||
|
|
fe93e2c4cf | ||
|
|
314ee30548 | ||
|
|
34917076ad | ||
|
|
ccc7795ca3 | ||
|
|
da1c94ee45 | ||
|
|
3b297919e0 | ||
|
|
47193e0298 | ||
|
|
49bd8c66d3 | ||
|
|
182b6ae8a6 | ||
|
|
c843e68588 | ||
|
|
198f7ea89e | ||
|
|
c888ffb95a | ||
|
|
9752433221 | ||
|
|
f0ff9979c6 | ||
|
|
501dd1ad55 | ||
|
|
75722b037d | ||
|
|
2d6659b9ea | ||
|
|
c5370857b3 | ||
|
|
00034c146a | ||
|
|
325ebc1703 | ||
|
|
7dde84f3c9 | ||
|
|
6606817a86 | ||
|
|
73d829c144 | ||
|
|
60bdb7bd9e | ||
|
|
4bb6b02f93 | ||
|
|
b5ac45b197 | ||
|
|
38a40c9e16 | ||
|
|
a8bf9b4dc1 | ||
|
|
51f8a31d65 | ||
|
|
be05d5cff1 | ||
|
|
30d569d2ac | ||
|
|
08625e4125 | ||
|
|
3acf6d3856 | ||
|
|
46890374f7 | ||
|
|
60755938b3 | ||
|
|
723d44b92b | ||
|
|
bc97cdae67 | ||
|
|
e010672ab5 | ||
|
|
169dbde946 | ||
|
|
17f0eb66b8 | ||
|
|
981052c9c6 | ||
|
|
b1e60d1806 | ||
|
|
6b6c16ca6c | ||
|
|
f6745c4980 | ||
|
|
109dd3b237 | ||
|
|
c2603313b1 | ||
|
|
1e79316e20 | ||
|
|
45261e063b | ||
|
|
49c258e18d | ||
|
|
d3f62c1967 | ||
|
|
5d3a0e794b | ||
|
|
125728b038 | ||
|
|
15a4fd53d3 | ||
|
|
4513a41a72 | ||
|
|
6033d9808d | ||
|
|
bd4d1ea398 | ||
|
|
8e897ed283 | ||
|
|
412cce82b0 | ||
|
|
d534c4520b | ||
|
|
2b18a8c590 | ||
|
|
dac8b87b0c | ||
|
|
6aecd87106 | ||
|
|
ed807c1837 | ||
|
|
29f63c9672 | ||
|
|
9fc0de5796 | ||
|
|
c60ee3a218 | ||
|
|
8a77e5e6bc | ||
|
|
51d9739f80 | ||
|
|
4c7853de14 | ||
|
|
e6779b9400 | ||
|
|
e36d50c5dd | ||
|
|
ff0f78e1fe | ||
|
|
7e067091e8 | ||
|
|
f89b3e2d7a | ||
|
|
fd7cfb6444 | ||
|
|
4e6767b5f2 | ||
|
|
9fea350f0d | ||
|
|
e858a9d6d3 | ||
|
|
7e87e27c52 | ||
|
|
d0fb4bd16f | ||
|
|
3fd4c2a543 | ||
|
|
cdb19aa4c2 | ||
|
|
4d85fbbdbb | ||
|
|
551f93885e | ||
|
|
8326b00aab | ||
|
|
b0249bcaf0 | ||
|
|
21cd8fae49 | ||
|
|
45db527fa6 | ||
|
|
28419ca2c8 | ||
|
|
8ba8714880 | ||
|
|
187986a857 | ||
|
|
4ba001080f | ||
|
|
1974e99f4b | ||
|
|
0181adefc6 | ||
|
|
fd3c633d26 | ||
|
|
0d47c278d1 | ||
|
|
385a27fad1 | ||
|
|
5c6542ce69 | ||
|
|
639f1cea92 | ||
|
|
b5c5d84f60 | ||
|
|
aa75e51f99 | ||
|
|
884ce9d05d | ||
|
|
3b1fe47d84 | ||
|
|
ed64ce5905 | ||
|
|
76a264ac9e | ||
|
|
324ad82006 | ||
|
|
beb982bead | ||
|
|
e88396f123 | ||
|
|
46358f647d | ||
|
|
bd99f6e648 | ||
|
|
ecb5419149 | ||
|
|
cf59cd4dcd | ||
|
|
56ce9eb832 | ||
|
|
89ee4cf8ae | ||
|
|
87ea7dfc04 | ||
|
|
eb0f9d6838 | ||
|
|
d3d8d8184a | ||
|
|
e85a39717a | ||
|
|
f2cd7060fc | ||
|
|
752cda3880 | ||
|
|
9d83ad93d0 | ||
|
|
cc52de4356 | ||
|
|
14b17a551f | ||
|
|
2ec1759f9d | ||
|
|
e2efe599aa | ||
|
|
5e1dba8ed6 | ||
|
|
bea742222f | ||
|
|
e06ca6ddac | ||
|
|
eb03899192 | ||
|
|
3de7c2ce9a | ||
|
|
bc6b9bcd65 | ||
|
|
6e6390321c | ||
|
|
4040428efc | ||
|
|
cc1dfc9373 | ||
|
|
14eb1ee1cb | ||
|
|
879e7199bb | ||
|
|
d89da64b1d | ||
|
|
5dcd8e1d88 | ||
|
|
10bb7e51e8 | ||
|
|
b0089e8992 | ||
|
|
a3ed14cbaf | ||
|
|
9dee4df559 | ||
|
|
adddc50cbf | ||
|
|
46c43ffc9d | ||
|
|
37a3bb66a7 | ||
|
|
337e0c62f8 | ||
|
|
885cc0b75c | ||
|
|
46953e7e6e | ||
|
|
ae8f99e648 | ||
|
|
077c476276 | ||
|
|
835a1478b4 | ||
|
|
120fe5134a | ||
|
|
56a8fb4f77 | ||
|
|
55575225b4 | ||
|
|
483336e79e | ||
|
|
c77495e3a4 | ||
|
|
65af1839c6 | ||
|
|
177877c544 | ||
|
|
b25522ba52 | ||
|
|
c19bc311cb | ||
|
|
5435dcf96e | ||
|
|
f17c702270 | ||
|
|
3907333c5d | ||
|
|
acdecdfaef | ||
|
|
09d18ad07e | ||
|
|
bc516a3f3c | ||
|
|
9572eaaa11 | ||
|
|
18e674b4f6 | ||
|
|
8d68ab98a7 | ||
|
|
135e6b93f4 | ||
|
|
13a49340ed | ||
|
|
81a23040eb | ||
|
|
857f63136d | ||
|
|
a927acb1ec | ||
|
|
09f1580e2d | ||
|
|
cd59e22191 | ||
|
|
7237fdc6ce | ||
|
|
0fdf490d33 | ||
|
|
b73612a254 |
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -1 +1,4 @@
|
|||||||
|
* text=auto
|
||||||
|
|
||||||
Makefile* text whitespace=-tab-in-indent
|
Makefile* text whitespace=-tab-in-indent
|
||||||
|
*.sh text eol=lf
|
||||||
|
|||||||
13
.github/FUNDING.yml
vendored
Normal file
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
patreon: # Replace with a single Patreon username
|
||||||
|
open_collective: # Replace with a single Open Collective username
|
||||||
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
liberapay: # Replace with a single Liberapay username
|
||||||
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
|
otechie: # Replace with a single Otechie username
|
||||||
|
|
||||||
|
custom: ['https://github.com/yt-dlp/yt-dlp/blob/master/Collaborators.md']
|
||||||
8
.github/ISSUE_TEMPLATE/1_broken_site.md
vendored
8
.github/ISSUE_TEMPLATE/1_broken_site.md
vendored
@@ -21,7 +21,7 @@ assignees: ''
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
||||||
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.05.11. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.07.24. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
||||||
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
|
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
|
||||||
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in https://github.com/yt-dlp/yt-dlp.
|
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in https://github.com/yt-dlp/yt-dlp.
|
||||||
- Search the bugtracker for similar issues: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar issues: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
||||||
@@ -29,7 +29,7 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] I'm reporting a broken site support
|
- [ ] I'm reporting a broken site support
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.05.11**
|
- [ ] I've verified that I'm running yt-dlp version **2021.07.24**
|
||||||
- [ ] I've checked that all provided URLs are alive and playable in a browser
|
- [ ] I've checked that all provided URLs are alive and playable in a browser
|
||||||
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
|
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
|
||||||
- [ ] I've searched the bugtracker for similar issues including closed ones
|
- [ ] I've searched the bugtracker for similar issues including closed ones
|
||||||
@@ -42,9 +42,9 @@ Provide the complete verbose output of yt-dlp that clearly demonstrates the prob
|
|||||||
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
||||||
[debug] System config: []
|
[debug] System config: []
|
||||||
[debug] User config: []
|
[debug] User config: []
|
||||||
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKc']
|
||||||
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
||||||
[debug] yt-dlp version 2021.05.11
|
[debug] yt-dlp version 2021.07.24
|
||||||
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
||||||
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
||||||
[debug] Proxy map: {}
|
[debug] Proxy map: {}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ assignees: ''
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
||||||
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.05.11. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.07.24. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
||||||
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
|
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
|
||||||
- Make sure that site you are requesting is not dedicated to copyright infringement, see https://github.com/yt-dlp/yt-dlp. yt-dlp does not support such sites. In order for site support request to be accepted all provided example URLs should not violate any copyrights.
|
- Make sure that site you are requesting is not dedicated to copyright infringement, see https://github.com/yt-dlp/yt-dlp. yt-dlp does not support such sites. In order for site support request to be accepted all provided example URLs should not violate any copyrights.
|
||||||
- Search the bugtracker for similar site support requests: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar site support requests: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
||||||
@@ -29,7 +29,7 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] I'm reporting a new site support request
|
- [ ] I'm reporting a new site support request
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.05.11**
|
- [ ] I've verified that I'm running yt-dlp version **2021.07.24**
|
||||||
- [ ] I've checked that all provided URLs are alive and playable in a browser
|
- [ ] I've checked that all provided URLs are alive and playable in a browser
|
||||||
- [ ] I've checked that none of provided URLs violate any copyrights
|
- [ ] I've checked that none of provided URLs violate any copyrights
|
||||||
- [ ] I've searched the bugtracker for similar site support requests including closed ones
|
- [ ] I've searched the bugtracker for similar site support requests including closed ones
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ assignees: ''
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
||||||
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.05.11. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.07.24. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
||||||
- Search the bugtracker for similar site feature requests: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar site feature requests: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
||||||
- Finally, put x into all relevant boxes like this [x] (Dont forget to delete the empty space)
|
- Finally, put x into all relevant boxes like this [x] (Dont forget to delete the empty space)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] I'm reporting a site feature request
|
- [ ] I'm reporting a site feature request
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.05.11**
|
- [ ] I've verified that I'm running yt-dlp version **2021.07.24**
|
||||||
- [ ] I've searched the bugtracker for similar site feature requests including closed ones
|
- [ ] I've searched the bugtracker for similar site feature requests including closed ones
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
8
.github/ISSUE_TEMPLATE/4_bug_report.md
vendored
8
.github/ISSUE_TEMPLATE/4_bug_report.md
vendored
@@ -21,7 +21,7 @@ assignees: ''
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
||||||
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.05.11. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.07.24. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
||||||
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
|
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
|
||||||
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in https://github.com/yt-dlp/yt-dlp.
|
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in https://github.com/yt-dlp/yt-dlp.
|
||||||
- Search the bugtracker for similar issues: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar issues: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
||||||
@@ -30,7 +30,7 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] I'm reporting a broken site support issue
|
- [ ] I'm reporting a broken site support issue
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.05.11**
|
- [ ] I've verified that I'm running yt-dlp version **2021.07.24**
|
||||||
- [ ] I've checked that all provided URLs are alive and playable in a browser
|
- [ ] I've checked that all provided URLs are alive and playable in a browser
|
||||||
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
|
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
|
||||||
- [ ] I've searched the bugtracker for similar bug reports including closed ones
|
- [ ] I've searched the bugtracker for similar bug reports including closed ones
|
||||||
@@ -44,9 +44,9 @@ Provide the complete verbose output of yt-dlp that clearly demonstrates the prob
|
|||||||
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
||||||
[debug] System config: []
|
[debug] System config: []
|
||||||
[debug] User config: []
|
[debug] User config: []
|
||||||
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKc']
|
||||||
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
||||||
[debug] yt-dlp version 2021.05.11
|
[debug] yt-dlp version 2021.07.24
|
||||||
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
||||||
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
||||||
[debug] Proxy map: {}
|
[debug] Proxy map: {}
|
||||||
|
|||||||
4
.github/ISSUE_TEMPLATE/5_feature_request.md
vendored
4
.github/ISSUE_TEMPLATE/5_feature_request.md
vendored
@@ -21,13 +21,13 @@ assignees: ''
|
|||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
||||||
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.05.11. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
- First of, make sure you are using the latest version of yt-dlp. Run `yt-dlp --version` and ensure your version is 2021.07.24. If it's not, see https://github.com/yt-dlp/yt-dlp on how to update. Issues with outdated version will be REJECTED.
|
||||||
- Search the bugtracker for similar feature requests: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar feature requests: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
||||||
- Finally, put x into all relevant boxes like this [x] (Dont forget to delete the empty space)
|
- Finally, put x into all relevant boxes like this [x] (Dont forget to delete the empty space)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] I'm reporting a feature request
|
- [ ] I'm reporting a feature request
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.05.11**
|
- [ ] I've verified that I'm running yt-dlp version **2021.07.24**
|
||||||
- [ ] I've searched the bugtracker for similar feature requests including closed ones
|
- [ ] I've searched the bugtracker for similar feature requests including closed ones
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md
vendored
2
.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md
vendored
@@ -42,7 +42,7 @@ Provide the complete verbose output of yt-dlp that clearly demonstrates the prob
|
|||||||
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
||||||
[debug] System config: []
|
[debug] System config: []
|
||||||
[debug] User config: []
|
[debug] User config: []
|
||||||
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKc']
|
||||||
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
||||||
[debug] yt-dlp version %(version)s
|
[debug] yt-dlp version %(version)s
|
||||||
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md
vendored
2
.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md
vendored
@@ -44,7 +44,7 @@ Provide the complete verbose output of yt-dlp that clearly demonstrates the prob
|
|||||||
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
Add the `-v` flag to your command line you run yt-dlp with (`yt-dlp -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
|
||||||
[debug] System config: []
|
[debug] System config: []
|
||||||
[debug] User config: []
|
[debug] User config: []
|
||||||
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKc']
|
||||||
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
||||||
[debug] yt-dlp version %(version)s
|
[debug] yt-dlp version %(version)s
|
||||||
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
||||||
|
|||||||
31
.github/banner.svg
vendored
Normal file
31
.github/banner.svg
vendored
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 24 KiB |
108
.github/workflows/build.yml
vendored
108
.github/workflows/build.yml
vendored
@@ -7,13 +7,13 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build_unix:
|
build_unix:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
ytdlp_version: ${{ steps.bump_version.outputs.ytdlp_version }}
|
ytdlp_version: ${{ steps.bump_version.outputs.ytdlp_version }}
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
sha2_unix: ${{ steps.sha2_file.outputs.sha2_unix }}
|
sha256_unix: ${{ steps.sha256_file.outputs.sha256_unix }}
|
||||||
|
sha512_unix: ${{ steps.sha512_file.outputs.sha512_unix }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
@@ -29,7 +29,7 @@ jobs:
|
|||||||
- name: Print version
|
- name: Print version
|
||||||
run: echo "${{ steps.bump_version.outputs.ytdlp_version }}"
|
run: echo "${{ steps.bump_version.outputs.ytdlp_version }}"
|
||||||
- name: Run Make
|
- name: Run Make
|
||||||
run: make
|
run: make all tar
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
id: create_release
|
id: create_release
|
||||||
uses: actions/create-release@v1
|
uses: actions/create-release@v1
|
||||||
@@ -44,7 +44,7 @@ jobs:
|
|||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
- name: Upload yt-dlp Unix binary
|
- name: Upload yt-dlp Unix binary
|
||||||
id: upload-release-asset
|
id: upload-release-asset
|
||||||
uses: actions/upload-release-asset@v1
|
uses: actions/upload-release-asset@v1
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -53,9 +53,21 @@ jobs:
|
|||||||
asset_path: ./yt-dlp
|
asset_path: ./yt-dlp
|
||||||
asset_name: yt-dlp
|
asset_name: yt-dlp
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
|
- name: Upload Source tar
|
||||||
|
uses: actions/upload-release-asset@v1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
|
asset_path: ./yt-dlp.tar.gz
|
||||||
|
asset_name: yt-dlp.tar.gz
|
||||||
|
asset_content_type: application/gzip
|
||||||
- name: Get SHA2-256SUMS for yt-dlp
|
- name: Get SHA2-256SUMS for yt-dlp
|
||||||
id: sha2_file
|
id: sha256_file
|
||||||
run: echo "::set-output name=sha2_unix::$(sha256sum yt-dlp | awk '{print $1}')"
|
run: echo "::set-output name=sha256_unix::$(sha256sum yt-dlp | awk '{print $1}')"
|
||||||
|
- name: Get SHA2-512SUMS for yt-dlp
|
||||||
|
id: sha512_file
|
||||||
|
run: echo "::set-output name=sha512_unix::$(sha512sum yt-dlp | awk '{print $1}')"
|
||||||
- name: Install dependencies for pypi
|
- name: Install dependencies for pypi
|
||||||
env:
|
env:
|
||||||
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||||
@@ -74,24 +86,24 @@ jobs:
|
|||||||
twine upload dist/*
|
twine upload dist/*
|
||||||
|
|
||||||
build_windows:
|
build_windows:
|
||||||
|
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
needs: build_unix
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
sha2_windows: ${{ steps.sha2_file_win.outputs.sha2_windows }}
|
sha256_windows: ${{ steps.sha256_file_win.outputs.sha256_windows }}
|
||||||
|
sha512_windows: ${{ steps.sha512_file_win.outputs.sha512_windows }}
|
||||||
needs: build_unix
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Set up Python
|
# 3.8 is used for Win7 support
|
||||||
|
- name: Set up Python 3.8
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v2
|
||||||
with:
|
with:
|
||||||
python-version: '3.8'
|
python-version: '3.8'
|
||||||
- name: Upgrade pip and enable wheel support
|
- name: Upgrade pip and enable wheel support
|
||||||
run: python -m pip install --upgrade pip setuptools wheel
|
run: python -m pip install --upgrade pip setuptools wheel
|
||||||
- name: Install Requirements
|
- name: Install Requirements
|
||||||
run: pip install pyinstaller mutagen pycryptodome
|
run: pip install pyinstaller mutagen pycryptodome websockets
|
||||||
- name: Bump version
|
- name: Bump version
|
||||||
id: bump_version
|
id: bump_version
|
||||||
run: python devscripts/update-version.py
|
run: python devscripts/update-version.py
|
||||||
@@ -110,29 +122,32 @@ jobs:
|
|||||||
asset_name: yt-dlp.exe
|
asset_name: yt-dlp.exe
|
||||||
asset_content_type: application/vnd.microsoft.portable-executable
|
asset_content_type: application/vnd.microsoft.portable-executable
|
||||||
- name: Get SHA2-256SUMS for yt-dlp.exe
|
- name: Get SHA2-256SUMS for yt-dlp.exe
|
||||||
id: sha2_file_win
|
id: sha256_file_win
|
||||||
run: echo "::set-output name=sha2_windows::$((Get-FileHash dist\yt-dlp.exe -Algorithm SHA256).Hash.ToLower())"
|
run: echo "::set-output name=sha256_windows::$((Get-FileHash dist\yt-dlp.exe -Algorithm SHA256).Hash.ToLower())"
|
||||||
|
- name: Get SHA2-512SUMS for yt-dlp.exe
|
||||||
|
id: sha512_file_win
|
||||||
|
run: echo "::set-output name=sha512_windows::$((Get-FileHash dist\yt-dlp.exe -Algorithm SHA512).Hash.ToLower())"
|
||||||
|
|
||||||
build_windows32:
|
build_windows32:
|
||||||
|
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
needs: [build_unix, build_windows]
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
sha2_windows32: ${{ steps.sha2_file_win32.outputs.sha2_windows32 }}
|
sha256_windows32: ${{ steps.sha256_file_win32.outputs.sha256_windows32 }}
|
||||||
|
sha512_windows32: ${{ steps.sha512_file_win32.outputs.sha512_windows32 }}
|
||||||
needs: [build_unix, build_windows]
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Set up Python 3.4.4 32-Bit
|
# 3.7 is used for Vista support. See https://github.com/yt-dlp/yt-dlp/issues/390
|
||||||
|
- name: Set up Python 3.7 32-Bit
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v2
|
||||||
with:
|
with:
|
||||||
python-version: '3.4.4'
|
python-version: '3.7'
|
||||||
architecture: 'x86'
|
architecture: 'x86'
|
||||||
- name: Upgrade pip and enable wheel support
|
- name: Upgrade pip and enable wheel support
|
||||||
run: python -m pip install pip==19.1.1 setuptools==43.0.0 wheel==0.33.6
|
run: python -m pip install --upgrade pip setuptools wheel
|
||||||
- name: Install Requirements for 32 Bit
|
- name: Install Requirements
|
||||||
run: pip install pyinstaller==3.5 mutagen==1.42.0 pycryptodome==3.9.4
|
run: pip install pyinstaller mutagen pycryptodome websockets
|
||||||
- name: Bump version
|
- name: Bump version
|
||||||
id: bump_version
|
id: bump_version
|
||||||
run: python devscripts/update-version.py
|
run: python devscripts/update-version.py
|
||||||
@@ -151,20 +166,28 @@ jobs:
|
|||||||
asset_name: yt-dlp_x86.exe
|
asset_name: yt-dlp_x86.exe
|
||||||
asset_content_type: application/vnd.microsoft.portable-executable
|
asset_content_type: application/vnd.microsoft.portable-executable
|
||||||
- name: Get SHA2-256SUMS for yt-dlp_x86.exe
|
- name: Get SHA2-256SUMS for yt-dlp_x86.exe
|
||||||
id: sha2_file_win32
|
id: sha256_file_win32
|
||||||
run: echo "::set-output name=sha2_windows32::$((Get-FileHash dist\yt-dlp_x86.exe -Algorithm SHA256).Hash.ToLower())"
|
run: echo "::set-output name=sha256_windows32::$((Get-FileHash dist\yt-dlp_x86.exe -Algorithm SHA256).Hash.ToLower())"
|
||||||
|
- name: Get SHA2-512SUMS for yt-dlp_x86.exe
|
||||||
|
id: sha512_file_win32
|
||||||
|
run: echo "::set-output name=sha512_windows32::$((Get-FileHash dist\yt-dlp_x86.exe -Algorithm SHA512).Hash.ToLower())"
|
||||||
|
|
||||||
|
finish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_unix, build_windows, build_windows32]
|
||||||
|
|
||||||
|
steps:
|
||||||
- name: Make SHA2-256SUMS file
|
- name: Make SHA2-256SUMS file
|
||||||
env:
|
env:
|
||||||
SHA2_WINDOWS: ${{ needs.build_windows.outputs.sha2_windows }}
|
SHA256_WINDOWS: ${{ needs.build_windows.outputs.sha256_windows }}
|
||||||
SHA2_WINDOWS32: ${{ steps.sha2_file_win32.outputs.sha2_windows32 }}
|
SHA256_WINDOWS32: ${{ needs.build_windows32.outputs.sha256_windows32 }}
|
||||||
SHA2_UNIX: ${{ needs.build_unix.outputs.sha2_unix }}
|
SHA256_UNIX: ${{ needs.build_unix.outputs.sha256_unix }}
|
||||||
YTDLP_VERSION: ${{ needs.build_unix.outputs.ytdlp_version }}
|
YTDLP_VERSION: ${{ needs.build_unix.outputs.ytdlp_version }}
|
||||||
run: |
|
run: |
|
||||||
echo "version:${env:YTDLP_VERSION}" >> SHA2-256SUMS
|
echo "version:${{ env.YTDLP_VERSION }}" >> SHA2-256SUMS
|
||||||
echo "yt-dlp.exe:${env:SHA2_WINDOWS}" >> SHA2-256SUMS
|
echo "yt-dlp.exe:${{ env.SHA256_WINDOWS }}" >> SHA2-256SUMS
|
||||||
echo "yt-dlp_x86.exe:${env:SHA2_WINDOWS32}" >> SHA2-256SUMS
|
echo "yt-dlp_x86.exe:${{ env.SHA256_WINDOWS32 }}" >> SHA2-256SUMS
|
||||||
echo "yt-dlp:${env:SHA2_UNIX}" >> SHA2-256SUMS
|
echo "yt-dlp:${{ env.SHA256_UNIX }}" >> SHA2-256SUMS
|
||||||
|
|
||||||
- name: Upload 256SUMS file
|
- name: Upload 256SUMS file
|
||||||
id: upload-sums
|
id: upload-sums
|
||||||
uses: actions/upload-release-asset@v1
|
uses: actions/upload-release-asset@v1
|
||||||
@@ -175,3 +198,22 @@ jobs:
|
|||||||
asset_path: ./SHA2-256SUMS
|
asset_path: ./SHA2-256SUMS
|
||||||
asset_name: SHA2-256SUMS
|
asset_name: SHA2-256SUMS
|
||||||
asset_content_type: text/plain
|
asset_content_type: text/plain
|
||||||
|
- name: Make SHA2-512SUMS file
|
||||||
|
env:
|
||||||
|
SHA512_WINDOWS: ${{ needs.build_windows.outputs.sha512_windows }}
|
||||||
|
SHA512_WINDOWS32: ${{ needs.build_windows32.outputs.sha512_windows32 }}
|
||||||
|
SHA512_UNIX: ${{ needs.build_unix.outputs.sha512_unix }}
|
||||||
|
run: |
|
||||||
|
echo "${{ env.SHA512_WINDOWS }} yt-dlp.exe" >> SHA2-512SUMS
|
||||||
|
echo "${{ env.SHA512_WINDOWS32 }} yt-dlp_x86.exe" >> SHA2-512SUMS
|
||||||
|
echo "${{ env.SHA512_UNIX }} yt-dlp" >> SHA2-512SUMS
|
||||||
|
- name: Upload 512SUMS file
|
||||||
|
id: upload-512sums
|
||||||
|
uses: actions/upload-release-asset@v1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
upload_url: ${{ needs.build_unix.outputs.upload_url }}
|
||||||
|
asset_path: ./SHA2-512SUMS
|
||||||
|
asset_name: SHA2-512SUMS
|
||||||
|
asset_content_type: text/plain
|
||||||
|
|||||||
46
.github/workflows/core.yml
vendored
46
.github/workflows/core.yml
vendored
@@ -9,53 +9,23 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-18.04]
|
os: [ubuntu-18.04]
|
||||||
# TODO: python 2.6
|
# py3.9 is in quick-test
|
||||||
python-version: [2.7, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, pypy-2.7, pypy-3.6, pypy-3.7]
|
python-version: [3.7, 3.8, 3.10-dev, pypy-3.6, pypy-3.7]
|
||||||
python-impl: [cpython]
|
|
||||||
ytdl-test-set: [core]
|
|
||||||
run-tests-ext: [sh]
|
run-tests-ext: [sh]
|
||||||
include:
|
include:
|
||||||
# python 3.2 is only available on windows via setup-python
|
# atleast one of the tests must be in windows
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
python-version: 3.2
|
python-version: 3.6
|
||||||
python-impl: cpython
|
|
||||||
ytdl-test-set: core
|
|
||||||
run-tests-ext: bat
|
run-tests-ext: bat
|
||||||
# jython
|
|
||||||
- os: ubuntu-latest
|
|
||||||
python-impl: jython
|
|
||||||
ytdl-test-set: core
|
|
||||||
run-tests-ext: sh
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v2
|
||||||
if: ${{ matrix.python-impl == 'cpython' }}
|
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Set up Java 8
|
- name: Install pytest
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
run: pip install pytest
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 8
|
|
||||||
- name: Install Jython
|
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
|
||||||
run: |
|
|
||||||
wget https://repo1.maven.org/maven2/org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar -O jython-installer.jar
|
|
||||||
java -jar jython-installer.jar -s -d "$HOME/jython"
|
|
||||||
echo "$HOME/jython/bin" >> $GITHUB_PATH
|
|
||||||
- name: Install nose
|
|
||||||
if: ${{ matrix.python-impl != 'jython' }}
|
|
||||||
run: pip install nose
|
|
||||||
- name: Install nose (Jython)
|
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
|
||||||
# Working around deprecation of support for non-SNI clients at PyPI CDN (see https://status.python.org/incidents/hzmjhqsdjqgb)
|
|
||||||
run: |
|
|
||||||
wget https://files.pythonhosted.org/packages/99/4f/13fb671119e65c4dce97c60e67d3fd9e6f7f809f2b307e2611f4701205cb/nose-1.3.7-py2-none-any.whl
|
|
||||||
pip install nose-1.3.7-py2-none-any.whl
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
continue-on-error: ${{ matrix.ytdl-test-set == 'download' || matrix.python-impl == 'jython' }}
|
continue-on-error: False
|
||||||
env:
|
run: ./devscripts/run_tests.${{ matrix.run-tests-ext }} core
|
||||||
YTDL_TEST_SET: ${{ matrix.ytdl-test-set }}
|
|
||||||
run: ./devscripts/run_tests.${{ matrix.run-tests-ext }}
|
|
||||||
# Linter is in quick-test
|
# Linter is in quick-test
|
||||||
|
|||||||
44
.github/workflows/download.yml
vendored
44
.github/workflows/download.yml
vendored
@@ -9,52 +9,20 @@ jobs:
|
|||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-18.04]
|
os: [ubuntu-18.04]
|
||||||
# TODO: python 2.6
|
python-version: [3.7, 3.8, 3.9, 3.10-dev, pypy-3.6, pypy-3.7]
|
||||||
python-version: [2.7, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, pypy-2.7, pypy-3.6, pypy-3.7]
|
|
||||||
python-impl: [cpython]
|
|
||||||
ytdl-test-set: [download]
|
|
||||||
run-tests-ext: [sh]
|
run-tests-ext: [sh]
|
||||||
include:
|
include:
|
||||||
# python 3.2 is only available on windows via setup-python
|
|
||||||
- os: windows-latest
|
- os: windows-latest
|
||||||
python-version: 3.2
|
python-version: 3.6
|
||||||
python-impl: cpython
|
|
||||||
ytdl-test-set: download
|
|
||||||
run-tests-ext: bat
|
run-tests-ext: bat
|
||||||
# jython - disable for now since it takes too long to complete
|
|
||||||
# - os: ubuntu-latest
|
|
||||||
# python-impl: jython
|
|
||||||
# ytdl-test-set: download
|
|
||||||
# run-tests-ext: sh
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v2
|
||||||
if: ${{ matrix.python-impl == 'cpython' }}
|
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Set up Java 8
|
- name: Install pytest
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
run: pip install pytest
|
||||||
uses: actions/setup-java@v1
|
|
||||||
with:
|
|
||||||
java-version: 8
|
|
||||||
- name: Install Jython
|
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
|
||||||
run: |
|
|
||||||
wget https://repo1.maven.org/maven2/org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar -O jython-installer.jar
|
|
||||||
java -jar jython-installer.jar -s -d "$HOME/jython"
|
|
||||||
echo "$HOME/jython/bin" >> $GITHUB_PATH
|
|
||||||
- name: Install nose
|
|
||||||
if: ${{ matrix.python-impl != 'jython' }}
|
|
||||||
run: pip install nose
|
|
||||||
- name: Install nose (Jython)
|
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
|
||||||
# Working around deprecation of support for non-SNI clients at PyPI CDN (see https://status.python.org/incidents/hzmjhqsdjqgb)
|
|
||||||
run: |
|
|
||||||
wget https://files.pythonhosted.org/packages/99/4f/13fb671119e65c4dce97c60e67d3fd9e6f7f809f2b307e2611f4701205cb/nose-1.3.7-py2-none-any.whl
|
|
||||||
pip install nose-1.3.7-py2-none-any.whl
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
continue-on-error: ${{ matrix.ytdl-test-set == 'download' || matrix.python-impl == 'jython' }}
|
continue-on-error: true
|
||||||
env:
|
run: ./devscripts/run_tests.${{ matrix.run-tests-ext }} download
|
||||||
YTDL_TEST_SET: ${{ matrix.ytdl-test-set }}
|
|
||||||
run: ./devscripts/run_tests.${{ matrix.run-tests-ext }}
|
|
||||||
|
|||||||
10
.github/workflows/quick-test.yml
vendored
10
.github/workflows/quick-test.yml
vendored
@@ -11,12 +11,10 @@ jobs:
|
|||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v2
|
||||||
with:
|
with:
|
||||||
python-version: 3.9
|
python-version: 3.9
|
||||||
- name: Install nose
|
- name: Install test requirements
|
||||||
run: pip install nose
|
run: pip install pytest pycryptodome
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
env:
|
run: ./devscripts/run_tests.sh core
|
||||||
YTDL_TEST_SET: core
|
|
||||||
run: ./devscripts/run_tests.sh
|
|
||||||
flake8:
|
flake8:
|
||||||
name: Linter
|
name: Linter
|
||||||
if: "!contains(github.event.head_commit.message, 'ci skip all')"
|
if: "!contains(github.event.head_commit.message, 'ci skip all')"
|
||||||
@@ -30,4 +28,4 @@ jobs:
|
|||||||
- name: Install flake8
|
- name: Install flake8
|
||||||
run: pip install flake8
|
run: pip install flake8
|
||||||
- name: Run flake8
|
- name: Run flake8
|
||||||
run: flake8 .
|
run: flake8 .
|
||||||
|
|||||||
88
.gitignore
vendored
88
.gitignore
vendored
@@ -1,6 +1,51 @@
|
|||||||
|
# Config
|
||||||
|
*.conf
|
||||||
|
*.spec
|
||||||
|
cookies
|
||||||
|
cookies.txt
|
||||||
|
|
||||||
|
# Downloaded
|
||||||
|
*.srt
|
||||||
|
*.ttml
|
||||||
|
*.sbv
|
||||||
|
*.vtt
|
||||||
|
*.flv
|
||||||
|
*.mp4
|
||||||
|
*.m4a
|
||||||
|
*.m4v
|
||||||
|
*.mp3
|
||||||
|
*.3gp
|
||||||
|
*.webm
|
||||||
|
*.wav
|
||||||
|
*.ape
|
||||||
|
*.mkv
|
||||||
|
*.swf
|
||||||
|
*.part
|
||||||
|
*.part-*
|
||||||
|
*.ytdl
|
||||||
|
*.dump
|
||||||
|
*.frag
|
||||||
|
*.frag.urls
|
||||||
|
*.aria2
|
||||||
|
*.swp
|
||||||
|
*.ogg
|
||||||
|
*.opus
|
||||||
|
*.info.json
|
||||||
|
*.live_chat.json
|
||||||
|
*.jpg
|
||||||
|
*.jpeg
|
||||||
|
*.png
|
||||||
|
*.webp
|
||||||
|
*.annotations.xml
|
||||||
|
*.description
|
||||||
|
|
||||||
|
# Allow config/media files in testdata
|
||||||
|
!test/testdata/**
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
*.pyc
|
*.pyc
|
||||||
*.pyo
|
*.pyo
|
||||||
|
.pytest_cache
|
||||||
wine-py2exe/
|
wine-py2exe/
|
||||||
py2exe.log
|
py2exe.log
|
||||||
build/
|
build/
|
||||||
@@ -35,6 +80,7 @@ README.txt
|
|||||||
*.tar.gz
|
*.tar.gz
|
||||||
*.zsh
|
*.zsh
|
||||||
*.spec
|
*.spec
|
||||||
|
test/testdata/player-*.js
|
||||||
|
|
||||||
# Binary
|
# Binary
|
||||||
/youtube-dl
|
/youtube-dl
|
||||||
@@ -43,48 +89,6 @@ README.txt
|
|||||||
yt-dlp.zip
|
yt-dlp.zip
|
||||||
*.exe
|
*.exe
|
||||||
|
|
||||||
# Downloaded
|
|
||||||
*.srt
|
|
||||||
*.ttml
|
|
||||||
*.sbv
|
|
||||||
*.vtt
|
|
||||||
*.flv
|
|
||||||
*.mp4
|
|
||||||
*.m4a
|
|
||||||
*.m4v
|
|
||||||
*.mp3
|
|
||||||
*.3gp
|
|
||||||
*.webm
|
|
||||||
*.wav
|
|
||||||
*.ape
|
|
||||||
*.mkv
|
|
||||||
*.swf
|
|
||||||
*.part
|
|
||||||
*.part-*
|
|
||||||
*.ytdl
|
|
||||||
*.dump
|
|
||||||
*.frag
|
|
||||||
*.frag.urls
|
|
||||||
*.aria2
|
|
||||||
*.swp
|
|
||||||
*.ogg
|
|
||||||
*.opus
|
|
||||||
*.info.json
|
|
||||||
*.live_chat.json
|
|
||||||
*.jpg
|
|
||||||
*.png
|
|
||||||
*.webp
|
|
||||||
*.annotations.xml
|
|
||||||
*.description
|
|
||||||
|
|
||||||
# Config
|
|
||||||
*.conf
|
|
||||||
*.spec
|
|
||||||
cookies
|
|
||||||
cookies.txt
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Text Editor / IDE
|
# Text Editor / IDE
|
||||||
.idea
|
.idea
|
||||||
*.iml
|
*.iml
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
$ youtube-dl -v <your command line>
|
$ youtube-dl -v <your command line>
|
||||||
[debug] System config: []
|
[debug] System config: []
|
||||||
[debug] User config: []
|
[debug] User config: []
|
||||||
[debug] Command-line args: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKcj']
|
[debug] Command-line args: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKc']
|
||||||
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
||||||
[debug] youtube-dl version 2015.12.06
|
[debug] youtube-dl version 2015.12.06
|
||||||
[debug] Git HEAD: 135392e
|
[debug] Git HEAD: 135392e
|
||||||
@@ -81,16 +81,17 @@ To run the test, simply invoke your favorite test runner, or execute a test file
|
|||||||
python -m unittest discover
|
python -m unittest discover
|
||||||
python test/test_download.py
|
python test/test_download.py
|
||||||
nosetests
|
nosetests
|
||||||
|
pytest
|
||||||
|
|
||||||
See item 6 of [new extractor tutorial](#adding-support-for-a-new-site) for how to run extractor specific test cases.
|
See item 6 of [new extractor tutorial](#adding-support-for-a-new-site) for how to run extractor specific test cases.
|
||||||
|
|
||||||
If you want to create a build of youtube-dl yourself, you'll need
|
If you want to create a build of youtube-dl yourself, you'll need
|
||||||
|
|
||||||
* python
|
* python3
|
||||||
* make (only GNU make is supported)
|
* make (only GNU make is supported)
|
||||||
* pandoc
|
* pandoc
|
||||||
* zip
|
* zip
|
||||||
* nosetests
|
* pytest
|
||||||
|
|
||||||
### Adding support for a new site
|
### Adding support for a new site
|
||||||
|
|
||||||
|
|||||||
29
CONTRIBUTORS
29
CONTRIBUTORS
@@ -1,6 +1,7 @@
|
|||||||
pukkandan (owner)
|
pukkandan (owner)
|
||||||
shirt-dev (collaborator)
|
shirt-dev (collaborator)
|
||||||
colethedj (collaborator)
|
coletdjnz/colethedj (collaborator)
|
||||||
|
Ashish0804 (collaborator)
|
||||||
h-h-h-h
|
h-h-h-h
|
||||||
pauldubois98
|
pauldubois98
|
||||||
nixxo
|
nixxo
|
||||||
@@ -20,11 +21,9 @@ FelixFrog
|
|||||||
Zocker1999NET
|
Zocker1999NET
|
||||||
nao20010128nao
|
nao20010128nao
|
||||||
kurumigi
|
kurumigi
|
||||||
tsukumi
|
|
||||||
bbepis
|
bbepis
|
||||||
animelover1984
|
animelover1984
|
||||||
Pccode66
|
Pccode66
|
||||||
Ashish0804
|
|
||||||
RobinD42
|
RobinD42
|
||||||
hseg
|
hseg
|
||||||
DennyDai
|
DennyDai
|
||||||
@@ -44,3 +43,27 @@ Lamieur
|
|||||||
tsukumijima
|
tsukumijima
|
||||||
Hadi0609
|
Hadi0609
|
||||||
b5eff52
|
b5eff52
|
||||||
|
craftingmod
|
||||||
|
tpikonen
|
||||||
|
tripulse
|
||||||
|
king-millez
|
||||||
|
alex-gedeon
|
||||||
|
hhirtz
|
||||||
|
louie-github
|
||||||
|
MinePlayersPE
|
||||||
|
olifre
|
||||||
|
rhsmachine/zenerdi0de
|
||||||
|
nihil-admirari
|
||||||
|
krichbanana
|
||||||
|
ohmybahgosh
|
||||||
|
nyuszika7h
|
||||||
|
blackjack4494
|
||||||
|
pyx
|
||||||
|
TpmKranz
|
||||||
|
mzbaulhaque
|
||||||
|
zackmark29
|
||||||
|
mbway
|
||||||
|
zerodytrash
|
||||||
|
wesnm
|
||||||
|
pento
|
||||||
|
rigstot
|
||||||
|
|||||||
385
Changelog.md
385
Changelog.md
@@ -10,7 +10,7 @@
|
|||||||
* Commit to master as `Release <version>`
|
* Commit to master as `Release <version>`
|
||||||
* Push to origin/release using `git push origin master:release`
|
* Push to origin/release using `git push origin master:release`
|
||||||
build task will now run
|
build task will now run
|
||||||
* Update version.py using devscripts\update-version.py
|
* Update version.py using `devscripts\update-version.py`
|
||||||
* Run `make issuetemplates`
|
* Run `make issuetemplates`
|
||||||
* Commit to master as `[version] update :ci skip all`
|
* Commit to master as `[version] update :ci skip all`
|
||||||
* Push to origin/master
|
* Push to origin/master
|
||||||
@@ -19,6 +19,325 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.08.02
|
||||||
|
|
||||||
|
* Add logo, banner and donate links
|
||||||
|
* Expand and escape environment variables correctly in output template
|
||||||
|
* Add format types `j` (json), `l` (comma delimited list), `q` (quoted for terminal) in output template
|
||||||
|
* [downloader] Allow streaming some unmerged formats to stdout using ffmpeg
|
||||||
|
* [youtube] **Age-gate bypass**
|
||||||
|
* Add `agegate` clients by [pukkandan](https://github.com/pukkandan), [MinePlayersPE](https://github.com/MinePlayersPE)
|
||||||
|
* Add `thirdParty` to agegate clients to bypass more videos
|
||||||
|
* Simplify client definitions, expose `embedded` clients
|
||||||
|
* Improve age-gate detection by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* Fix default global API key by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* Add `creator` clients for age-gate bypass using unverified accounts by [zerodytrash](https://github.com/zerodytrash), [coletdjnz](https://github.com/coletdjnz), [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [adobepass] Add MSO Sling TV by [wesnm](https://github.com/wesnm)
|
||||||
|
* [CBS] Add ParamountPlusSeriesIE by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [dplay] Add `ScienceChannelIE` by [Sipherdrakon](https://github.com/Sipherdrakon)
|
||||||
|
* [UtreonIE] Add extractor by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [youtube] Add `mweb` client by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [youtube] Add `player_client=all`
|
||||||
|
* [youtube] Force `hl=en` for comments by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [youtube] Fix format sorting when using alternate clients
|
||||||
|
* [youtube] Misc cleanup by [pukkandan](https://github.com/pukkandan), [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [youtube] Extract SAPISID only once
|
||||||
|
* [CBS] Add fallback by [llacb47](https://github.com/llacb47), [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [Hotstar] Support cookies by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [HotStarSeriesIE] Fix regex by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [bilibili] Improve `_VALID_URL`
|
||||||
|
* [mediaset] Fix extraction by [nixxo](https://github.com/nixxo)
|
||||||
|
* [Mxplayer] Add h265 formats by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [RCTIPlus] Remove PhantomJS dependency by [MinePlayersPE](https://github.com/MinePlayersPE)
|
||||||
|
* [tenplay] Add MA15+ age limit by [pento](https://github.com/pento)
|
||||||
|
* [vidio] Fix login error detection by [MinePlayersPE](https://github.com/MinePlayersPE)
|
||||||
|
* [vimeo] Better extraction of original file by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [generic] Support KVS player (replaces ThisVidIE) by [rigstot](https://github.com/rigstot)
|
||||||
|
* Add compat-option `no-clean-infojson`
|
||||||
|
* Remove `asr` appearing twice in `-F`
|
||||||
|
* Set `home:` as the default key for `-P`
|
||||||
|
* [utils] Fix slicing of reversed `LazyList`
|
||||||
|
* [FormatSort] Fix bug for audio with unknown codec
|
||||||
|
* [test:download] Support testing with `ignore_no_formats_error`
|
||||||
|
* [cleanup] Refactor some code
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.07.24
|
||||||
|
|
||||||
|
* [youtube:tab] Extract video duration early
|
||||||
|
* [downloader] Pass `info_dict` to `progress_hook`s
|
||||||
|
* [youtube] Fix age-gated videos for API clients when cookies are supplied by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [youtube] Disable `get_video_info` age-gate workaround - This endpoint seems to be completely dead
|
||||||
|
* [youtube] Try all clients even if age-gated
|
||||||
|
* [youtube] Fix subtitles only being extracted from the first client
|
||||||
|
* [youtube] Simplify `_get_text`
|
||||||
|
* [cookies] bugfix for microsoft edge on macOS
|
||||||
|
* [cookies] Handle `sqlite` `ImportError` gracefully by [mbway](https://github.com/mbway)
|
||||||
|
* [cookies] Handle errors when importing `keyring`
|
||||||
|
|
||||||
|
### 2021.07.21
|
||||||
|
|
||||||
|
* **Add option `--cookies-from-browser`** to load cookies from a browser by [mbway](https://github.com/mbway)
|
||||||
|
* Usage: `--cookies-from-browser BROWSER[:PROFILE_NAME_OR_PATH]`
|
||||||
|
* Also added `--no-cookies-from-browser`
|
||||||
|
* To decrypt chromium cookies, `keyring` is needed for UNIX and `pycryptodome` for Windows
|
||||||
|
* Add option `--exec-before-download`
|
||||||
|
* Add field `live_status`
|
||||||
|
* [FFmpegMetadata] Add language of each stream and some refactoring
|
||||||
|
* [douyin] Add extractor by [pukkandan](https://github.com/pukkandan), [pyx](https://github.com/pyx)
|
||||||
|
* [pornflip] Add extractor by [mzbaulhaque](https://github.com/mzbaulhaque)
|
||||||
|
* **[youtube] Extract data from multiple clients** by [pukkandan](https://github.com/pukkandan), [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* `player_client` now accepts multiple clients
|
||||||
|
* Default `player_client` = `android,web`
|
||||||
|
* This uses twice as many requests, but avoids throttling for most videos while also not losing any formats
|
||||||
|
* Music clients can be specifically requested and is enabled by default if `music.youtube.com`
|
||||||
|
* Added `player_client=ios` (Known issue: formats from ios are not sorted correctly)
|
||||||
|
* Add age-gate bypass for android and ios clients
|
||||||
|
* [youtube] Extract more thumbnails
|
||||||
|
* The thumbnail URLs are hard-coded and their actual existence is tested lazily
|
||||||
|
* Added option `--no-check-formats` to not test them
|
||||||
|
* [youtube] Misc fixes
|
||||||
|
* Improve extraction of livestream metadata by [pukkandan](https://github.com/pukkandan), [krichbanana](https://github.com/krichbanana)
|
||||||
|
* Hide live dash formats since they can't be downloaded anyway
|
||||||
|
* Fix authentication when using multiple accounts by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* Fix controversial videos when requested via API by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* Fix session index extraction and headers for non-web player clients by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* Make `--extractor-retries` work for more errors
|
||||||
|
* Fix sorting of 3gp format
|
||||||
|
* Sanity check `chapters` (and refactor related code)
|
||||||
|
* Make `parse_time_text` and `_extract_chapters` non-fatal
|
||||||
|
* Misc cleanup and bug fixes by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [youtube:tab] Fix channels tab
|
||||||
|
* [youtube:tab] Extract playlist availability by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* **[youtube:comments] Move comment extraction to new API** by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* Adds extractor-args `comment_sort` (`top`/`new`), `max_comments`, `max_comment_depth`
|
||||||
|
* [youtube:comments] Fix `is_favorited`, improve `like_count` parsing by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [BravoTV] Improve metadata extraction by [kevinoconnor7](https://github.com/kevinoconnor7)
|
||||||
|
* [crunchyroll:playlist] Force http
|
||||||
|
* [yahoo:gyao:player] Relax `_VALID_URL` by [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
|
* [nebula] Authentication via tokens from cookie jar by [hheimbuerger](https://github.com/hheimbuerger), [TpmKranz](https://github.com/TpmKranz)
|
||||||
|
* [RTP] Fix extraction and add subtitles by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [viki] Rewrite extractors and add extractor-arg `video_types` to `vikichannel` by [zackmark29](https://github.com/zackmark29), [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [vlive] Extract thumbnail directly in addition to the one from Naver
|
||||||
|
* [generic] Extract previously missed subtitles by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [generic] Extract everything in the SMIL manifest and detect discarded subtitles by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [embedthumbnail] Fix `_get_thumbnail_resolution`
|
||||||
|
* [metadatafromfield] Do not detect numbers as field names
|
||||||
|
* Fix selectors `all`, `mergeall` and add tests
|
||||||
|
* Errors in playlist extraction should obey `--ignore-errors`
|
||||||
|
* Fix bug where `original_url` was not propagated when `_type`=`url`
|
||||||
|
* Revert "Merge webm formats into mkv if thumbnails are to be embedded (#173)"
|
||||||
|
* This was wrongly checking for `write_thumbnail`
|
||||||
|
* Improve `extractor_args` parsing
|
||||||
|
* Rename `NOTE` in `-F` to `MORE INFO` since it's often confused to be the same as `format_note`
|
||||||
|
* Add `only_once` param for `write_debug` and `report_warning`
|
||||||
|
* [extractor] Allow extracting multiple groups in `_search_regex` by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [utils] Improve `traverse_obj`
|
||||||
|
* [utils] Add `variadic`
|
||||||
|
* [utils] Improve `js_to_json` comment regex by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [webtt] Fix timestamps
|
||||||
|
* [compat] Remove unnecessary code
|
||||||
|
* [docs] fix default of multistreams
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.07.07
|
||||||
|
|
||||||
|
* Merge youtube-dl: Upto [commit/a803582](https://github.com/ytdl-org/youtube-dl/commit/a8035827177d6b59aca03bd717acb6a9bdd75ada)
|
||||||
|
* Add `--extractor-args` to pass some extractor-specific arguments. See [readme](https://github.com/yt-dlp/yt-dlp#extractor-arguments)
|
||||||
|
* Add extractor option `skip` for `youtube`. Eg: `--extractor-args youtube:skip=hls,dash`
|
||||||
|
* Deprecates `--youtube-skip-dash-manifest`, `--youtube-skip-hls-manifest`, `--youtube-include-dash-manifest`, `--youtube-include-hls-manifest`
|
||||||
|
* Allow `--list...` options to work with `--print`, `--quiet` and other `--list...` options
|
||||||
|
* [youtube] Use `player` API for additional video extraction requests by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* **Fixes youtube premium music** (format 141) extraction
|
||||||
|
* Adds extractor option `player_client` = `web`/`android`
|
||||||
|
* **`--extractor-args youtube:player_client=android` works around the throttling** for the time-being
|
||||||
|
* Adds extractor option `player_skip=config`
|
||||||
|
* Adds age-gate fallback using embedded client
|
||||||
|
* [youtube] Choose correct Live chat API for upcoming streams by [krichbanana](https://github.com/krichbanana)
|
||||||
|
* [youtube] Fix subtitle names for age-gated videos
|
||||||
|
* [youtube:comments] Fix error handling and add `itct` to params by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [youtube_live_chat] Fix download with cookies by [siikamiika](https://github.com/siikamiika)
|
||||||
|
* [youtube_live_chat] use `clickTrackingParams` by [siikamiika](https://github.com/siikamiika)
|
||||||
|
* [Funimation] Rewrite extractor
|
||||||
|
* Add `FunimationShowIE` by [Mevious](https://github.com/Mevious)
|
||||||
|
* **Treat the different versions of an episode as different formats of a single video**
|
||||||
|
* This changes the video `id` and will break break existing archives
|
||||||
|
* Compat option `seperate-video-versions` to fall back to old behavior including using the old video ids
|
||||||
|
* Support direct `/player/` URL
|
||||||
|
* Extractor options `language` and `version` to pre-select them during extraction
|
||||||
|
* These options may be removed in the future if we can extract all formats without additional network requests
|
||||||
|
* Do not rely on these for format selection and use `-f` filters instead
|
||||||
|
* [AdobePass] Add Spectrum MSO by [kevinoconnor7](https://github.com/kevinoconnor7), [ohmybahgosh](https://github.com/ohmybahgosh)
|
||||||
|
* [facebook] Extract description and fix title
|
||||||
|
* [fancode] Fix extraction, support live and allow login with refresh token by [zenerdi0de](https://github.com/zenerdi0de)
|
||||||
|
* [plutotv] Improve `_VALID_URL`
|
||||||
|
* [RCTIPlus] Add extractor by [MinePlayersPE](https://github.com/MinePlayersPE)
|
||||||
|
* [Soundcloud] Allow login using oauth token by [blackjack4494](https://github.com/blackjack4494)
|
||||||
|
* [TBS] Support livestreams by [llacb47](https://github.com/llacb47)
|
||||||
|
* [videa] Fix extraction by [nyuszika7h](https://github.com/nyuszika7h)
|
||||||
|
* [yahoo] Fix extraction by [llacb47](https://github.com/llacb47), [pukkandan](https://github.com/pukkandan)
|
||||||
|
* Process videos when using `--ignore-no-formats-error` by [krichbanana](https://github.com/krichbanana)
|
||||||
|
* Fix `--throttled-rate` when using `--load-info-json`
|
||||||
|
* Fix `--flat-playlist` when entry has no `ie_key`
|
||||||
|
* Fix `check_formats` catching `ExtractorError` instead of `DownloadError`
|
||||||
|
* Fix deprecated option `--list-formats-old`
|
||||||
|
* [downloader/ffmpeg] Fix `--ppa` when using simultaneous download
|
||||||
|
* [extractor] Prevent unnecessary download of hls manifests and refactor `hls_split_discontinuity`
|
||||||
|
* [fragment] Handle status of download and errors in threads correctly; and minor refactoring
|
||||||
|
* [thumbnailsconvertor] Treat `jpeg` as `jpg`
|
||||||
|
* [utils] Fix issues with `LazyList` reversal
|
||||||
|
* [extractor] Allow extractors to set their own login hint
|
||||||
|
* [cleanup] Simplify format selector code with `LazyList` and `yield from`
|
||||||
|
* [cleanup] Clean `extractor.common._merge_subtitles` signature
|
||||||
|
* [cleanup] Fix some typos
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.06.23
|
||||||
|
|
||||||
|
* Merge youtube-dl: Upto [commit/379f52a](https://github.com/ytdl-org/youtube-dl/commit/379f52a4954013767219d25099cce9e0f9401961)
|
||||||
|
* **Add option `--throttled-rate`** below which video data is re-extracted
|
||||||
|
* [fragment] **Merge during download for `-N`**, and refactor `hls`/`dash`
|
||||||
|
* [websockets] Add `WebSocketFragmentFD` by [nao20010128nao](https://github.com/nao20010128nao), [pukkandan](https://github.com/pukkandan)
|
||||||
|
* Allow `images` formats in addition to video/audio
|
||||||
|
* [downloader/mhtml] Add new downloader for slideshows/storyboards by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [youtube] Temporary **fix for age-gate**
|
||||||
|
* [youtube] Support ongoing live chat by [siikamiika](https://github.com/siikamiika)
|
||||||
|
* [youtube] Improve SAPISID cookie handling by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [youtube] Login is not needed for `:ytrec`
|
||||||
|
* [youtube] Non-fatal alert reporting for unavailable videos page by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* [twitcasting] Websocket support by [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
|
* [mediasite] Extract slides by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [funimation] Extract subtitles
|
||||||
|
* [pornhub] Extract `cast`
|
||||||
|
* [hotstar] Use server time for authentication instead of local time
|
||||||
|
* [EmbedThumbnail] Fix for already downloaded thumbnail
|
||||||
|
* [EmbedThumbnail] Add compat-option `embed-thumbnail-atomicparsley`
|
||||||
|
* Expand `--check-formats` to thumbnails
|
||||||
|
* Fix id sanitization in filenames
|
||||||
|
* Skip fixup of existing files and add `--fixup force` to force it
|
||||||
|
* Better error handling of syntax errors in `-f`
|
||||||
|
* Use `NamedTemporaryFile` for `--check-formats`
|
||||||
|
* [aria2c] Lower `--min-split-size` for HTTP downloads
|
||||||
|
* [options] Rename `--add-metadata` to `--embed-metadata`
|
||||||
|
* [utils] Improve `LazyList` and add tests
|
||||||
|
* [build] Build Windows x86 version with py3.7 and remove redundant tests by [pukkandan](https://github.com/pukkandan), [shirt](https://github.com/shirt-dev)
|
||||||
|
* [docs] Clarify that `--embed-metadata` embeds chapter markers
|
||||||
|
* [cleanup] Refactor fixup
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.06.09
|
||||||
|
|
||||||
|
* Fix bug where `%(field)d` in filename template throws error
|
||||||
|
* Improve offset parsing in outtmpl
|
||||||
|
* [test] More rigorous tests for `prepare_filename`
|
||||||
|
|
||||||
|
### 2021.06.08
|
||||||
|
|
||||||
|
* Remove support for obsolete Python versions: Only 3.6+ is now supported
|
||||||
|
* Merge youtube-dl: Upto [commit/c2350ca](https://github.com/ytdl-org/youtube-dl/commit/c2350cac243ba1ec1586fe85b0d62d1b700047a2)
|
||||||
|
* [hls] Fix decryption for multithreaded downloader
|
||||||
|
* [extractor] Fix pre-checking archive for some extractors
|
||||||
|
* [extractor] Fix FourCC fallback when parsing ISM by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [twitcasting] Add TwitCastingUserIE, TwitCastingLiveIE by [pukkandan](https://github.com/pukkandan), [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
|
* [vidio] Add VidioPremierIE and VidioLiveIE by [MinePlayersPE](Https://github.com/MinePlayersPE)
|
||||||
|
* [viki] Fix extraction from [ytdl-org/youtube-dl@59e583f](https://github.com/ytdl-org/youtube-dl/commit/59e583f7e8530ca92776c866897d895c072e2a82)
|
||||||
|
* [youtube] Support shorts URL
|
||||||
|
* [zoom] Extract transcripts as subtitles
|
||||||
|
* Add field `original_url` with the user-inputted URL
|
||||||
|
* Fix and refactor `prepare_outtmpl`
|
||||||
|
* Make more fields available for `--print` when used with `--flat-playlist`
|
||||||
|
* [utils] Generalize `traverse_dict` to `traverse_obj`
|
||||||
|
* [downloader/ffmpeg] Hide FFmpeg banner unless in verbose mode by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [build] Release `yt-dlp.tar.gz`
|
||||||
|
* [build,update] Add GNU-style SHA512 and prepare updater for simlar SHA256 by [nihil-admirari](https://github.com/nihil-admirari)
|
||||||
|
* [pyinst] Show Python version in exe metadata by [nihil-admirari](https://github.com/nihil-admirari)
|
||||||
|
* [docs] Improve documentation of dependencies
|
||||||
|
* [cleanup] Mark unused files
|
||||||
|
* [cleanup] Point all shebang to `python3` by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [cleanup] Remove duplicate file `trovolive.py`
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.06.01
|
||||||
|
|
||||||
|
* Merge youtube-dl: Upto [commit/d495292](https://github.com/ytdl-org/youtube-dl/commit/d495292852b6c2f1bd58bc2141ff2b0265c952cf)
|
||||||
|
* Pre-check archive and filters during playlist extraction
|
||||||
|
* Handle Basic Auth `user:pass` in URLs by [hhirtz](https://github.com/hhirtz) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [archiveorg] Add YoutubeWebArchiveIE by [coletdjnz](https://github.com/coletdjnz) and [alex-gedeon](https://github.com/alex-gedeon)
|
||||||
|
* [fancode] Add extractor by [rhsmachine](https://github.com/rhsmachine)
|
||||||
|
* [patreon] Support vimeo embeds by [rhsmachine](https://github.com/rhsmachine)
|
||||||
|
* [Saitosan] Add new extractor by [llacb47](https://github.com/llacb47)
|
||||||
|
* [ShemarooMe] Add extractor by [Ashish0804](https://github.com/Ashish0804) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [telemundo] Add extractor by [king-millez](https://github.com/king-millez)
|
||||||
|
* [SonyLIV] Add SonyLIVSeriesIE and subtitle support by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [Hotstar] Add HotStarSeriesIE by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [Voot] Add VootSeriesIE by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [vidio] Support login and premium videos by [MinePlayersPE](https://github.com/MinePlayersPE)
|
||||||
|
* [fragment] When using `-N`, do not keep the fragment content in memory
|
||||||
|
* [ffmpeg] Download and merge in a single step if possible
|
||||||
|
* [ThumbnailsConvertor] Support conversion to `png` and make it the default by [louie-github](https://github.com/louie-github)
|
||||||
|
* [VideoConvertor] Generalize with remuxer and allow conditional recoding
|
||||||
|
* [EmbedThumbnail] Embed in `mp4`/`m4a` using mutagen by [tripulse](https://github.com/tripulse) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [EmbedThumbnail] Embed if any thumbnail was downloaded, not just the best
|
||||||
|
* [EmbedThumbnail] Correctly escape filename
|
||||||
|
* [update] replace self without launching a subprocess in windows
|
||||||
|
* [update] Block further update for unsupported systems
|
||||||
|
* Refactor `__process_playlist` by creating `LazyList`
|
||||||
|
* Write messages to `stderr` when both `quiet` and `verbose`
|
||||||
|
* Sanitize and sort playlist thumbnails
|
||||||
|
* Remove `None` values from `info.json`
|
||||||
|
* [extractor] Always prefer native hls downloader by default
|
||||||
|
* [extractor] Skip subtitles without URI in m3u8 manifests by [hheimbuerger](https://github.com/hheimbuerger)
|
||||||
|
* [extractor] Functions to parse `socket.io` response as `json` by [pukkandan](https://github.com/pukkandan) and [llacb47](https://github.com/llacb47)
|
||||||
|
* [extractor] Allow `note=False` when extracting manifests
|
||||||
|
* [utils] Escape URLs in `sanitized_Request`, not `sanitize_url`
|
||||||
|
* [hls] Disable external downloader for `webtt`
|
||||||
|
* [youtube] `/live` URLs should raise error if channel is not live
|
||||||
|
* [youtube] Bug fixes
|
||||||
|
* [zee5] Fix m3u8 formats' extension
|
||||||
|
* [ard] Allow URLs without `-` before id by [olifre](https://github.com/olifre)
|
||||||
|
* [cleanup] `YoutubeDL._match_entry`
|
||||||
|
* [cleanup] Refactor updater
|
||||||
|
* [cleanup] Refactor ffmpeg convertors
|
||||||
|
* [cleanup] setup.py
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.05.20
|
||||||
|
|
||||||
|
* **Youtube improvements**:
|
||||||
|
* Support youtube music `MP`, `VL` and `browse` pages
|
||||||
|
* Extract more formats for youtube music by [craftingmod](https://github.com/craftingmod), [coletdjnz](https://github.com/coletdjnz) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* Extract multiple subtitles in same language by [pukkandan](https://github.com/pukkandan) and [tpikonen](https://github.com/tpikonen)
|
||||||
|
* Redirect channels that doesn't have a `videos` tab to their `UU` playlists
|
||||||
|
* Support in-channel search
|
||||||
|
* Sort audio-only formats correctly
|
||||||
|
* Always extract `maxresdefault` thumbnail
|
||||||
|
* Extract audio language
|
||||||
|
* Add subtitle language names by [nixxo](https://github.com/nixxo) and [tpikonen](https://github.com/tpikonen)
|
||||||
|
* Show alerts only from the final webpage
|
||||||
|
* Add `html5=1` param to `get_video_info` page requests by [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
* Better message when login required
|
||||||
|
* **Add option `--print`**: to print any field/template
|
||||||
|
* Deprecates: `--get-description`, `--get-duration`, `--get-filename`, `--get-format`, `--get-id`, `--get-thumbnail`, `--get-title`, `--get-url`
|
||||||
|
* Field `additional_urls` to download additional videos from metadata using [`--parse-metadata`](https://github.com/yt-dlp/yt-dlp#modifying-metadata)
|
||||||
|
* Merge youtube-dl: Upto [commit/dfbbe29](https://github.com/ytdl-org/youtube-dl/commit/dfbbe2902fc67f0f93ee47a8077c148055c67a9b)
|
||||||
|
* Write thumbnail of playlist and add `pl_thumbnail` outtmpl key
|
||||||
|
* [embedthumbnail] Add `flac` support and refactor `mutagen` code by [pukkandan](https://github.com/pukkandan) and [tripulse](https://github.com/tripulse)
|
||||||
|
* [audius:artist] Add extractor by [king-millez](https://github.com/king-millez)
|
||||||
|
* [parlview] Add extractor by [king-millez](https://github.com/king-millez)
|
||||||
|
* [tenplay] Fix extractor by [king-millez](https://github.com/king-millez)
|
||||||
|
* [rmcdecouverte] Generalize `_VALID_URL`
|
||||||
|
* Add compat-option `no-attach-infojson`
|
||||||
|
* Add field `name` for subtitles
|
||||||
|
* Ensure `post_extract` and `pre_process` only run once
|
||||||
|
* Fix `--check-formats` when there is network error
|
||||||
|
* Standardize `write_debug` and `get_param`
|
||||||
|
* [options] Alias `--write-comments`, `--no-write-comments`
|
||||||
|
* [options] Refactor callbacks
|
||||||
|
* [test:download] Only extract enough videos for `playlist_mincount`
|
||||||
|
* [extractor] bugfix for when `compat_opts` is not given
|
||||||
|
* [build] Fix x86 build by [shirt](https://github.com/shirt-dev)
|
||||||
|
* [cleanup] code formatting, youtube tests and readme
|
||||||
|
|
||||||
### 2021.05.11
|
### 2021.05.11
|
||||||
* **Deprecate support for python versions < 3.6**
|
* **Deprecate support for python versions < 3.6**
|
||||||
* **Subtitle extraction from manifests** by [fstirlitz](https://github.com/fstirlitz). See [be6202f](https://github.com/yt-dlp/yt-dlp/commit/be6202f12b97858b9d716e608394b51065d0419f) for details
|
* **Subtitle extraction from manifests** by [fstirlitz](https://github.com/fstirlitz). See [be6202f](https://github.com/yt-dlp/yt-dlp/commit/be6202f12b97858b9d716e608394b51065d0419f) for details
|
||||||
@@ -92,11 +411,11 @@
|
|||||||
* [TubiTv] Add TubiTvShowIE by [Ashish0804](https://github.com/Ashish0804)
|
* [TubiTv] Add TubiTvShowIE by [Ashish0804](https://github.com/Ashish0804)
|
||||||
* [twitcasting] Fix extractor
|
* [twitcasting] Fix extractor
|
||||||
* [viu:ott] Fix extractor and support series by [lkho](https://github.com/lkho) and [pukkandan](https://github.com/pukkandan)
|
* [viu:ott] Fix extractor and support series by [lkho](https://github.com/lkho) and [pukkandan](https://github.com/pukkandan)
|
||||||
* [youtube:tab] Show unavailable videos in playlists by [colethedj](https://github.com/colethedj)
|
* [youtube:tab] Show unavailable videos in playlists by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube:tab] Reload with unavailable videos for all playlists
|
* [youtube:tab] Reload with unavailable videos for all playlists
|
||||||
* [youtube] Ignore invalid stretch ratio
|
* [youtube] Ignore invalid stretch ratio
|
||||||
* [youtube] Improve channel syncid extraction to support ytcfg by [colethedj](https://github.com/colethedj)
|
* [youtube] Improve channel syncid extraction to support ytcfg by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube] Standardize API calls for tabs, mixes and search by [colethedj](https://github.com/colethedj)
|
* [youtube] Standardize API calls for tabs, mixes and search by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube] Bugfix in `_extract_ytcfg`
|
* [youtube] Bugfix in `_extract_ytcfg`
|
||||||
* [mildom:user:vod] Download only necessary amount of pages
|
* [mildom:user:vod] Download only necessary amount of pages
|
||||||
* [mildom] Remove proxy completely by [fstirlitz](https://github.com/fstirlitz)
|
* [mildom] Remove proxy completely by [fstirlitz](https://github.com/fstirlitz)
|
||||||
@@ -108,8 +427,8 @@
|
|||||||
* Improve the yt-dlp.sh script by [fstirlitz](https://github.com/fstirlitz)
|
* Improve the yt-dlp.sh script by [fstirlitz](https://github.com/fstirlitz)
|
||||||
* [lazy_extractor] Do not load plugins
|
* [lazy_extractor] Do not load plugins
|
||||||
* [ci] Disable fail-fast
|
* [ci] Disable fail-fast
|
||||||
* [documentation] Clarify which deprecated options still work
|
* [docs] Clarify which deprecated options still work
|
||||||
* [documentation] Fix typos
|
* [docs] Fix typos
|
||||||
|
|
||||||
|
|
||||||
### 2021.04.11
|
### 2021.04.11
|
||||||
@@ -126,17 +445,17 @@
|
|||||||
* [nitter] Fix extraction of reply tweets and update instance list by [B0pol](https://github.com/B0pol)
|
* [nitter] Fix extraction of reply tweets and update instance list by [B0pol](https://github.com/B0pol)
|
||||||
* [nitter] Fix thumbnails by [B0pol](https://github.com/B0pol)
|
* [nitter] Fix thumbnails by [B0pol](https://github.com/B0pol)
|
||||||
* [youtube] Fix thumbnail URL
|
* [youtube] Fix thumbnail URL
|
||||||
* [youtube] Parse API parameters from initial webpage by [colethedj](https://github.com/colethedj)
|
* [youtube] Parse API parameters from initial webpage by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube] Extract comments' approximate timestamp by [colethedj](https://github.com/colethedj)
|
* [youtube] Extract comments' approximate timestamp by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube] Fix alert extraction
|
* [youtube] Fix alert extraction
|
||||||
* [bilibili] Fix uploader
|
* [bilibili] Fix uploader
|
||||||
* [utils] Add `datetime_from_str` and `datetime_add_months` by [colethedj](https://github.com/colethedj)
|
* [utils] Add `datetime_from_str` and `datetime_add_months` by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* Run some `postprocessors` before actual download
|
* Run some `postprocessors` before actual download
|
||||||
* Improve argument parsing for `-P`, `-o`, `-S`
|
* Improve argument parsing for `-P`, `-o`, `-S`
|
||||||
* Fix some `m3u8` not obeying `--allow-unplayable-formats`
|
* Fix some `m3u8` not obeying `--allow-unplayable-formats`
|
||||||
* Fix default of `dynamic_mpd`
|
* Fix default of `dynamic_mpd`
|
||||||
* Deprecate `--all-formats`, `--include-ads`, `--hls-prefer-native`, `--hls-prefer-ffmpeg`
|
* Deprecate `--all-formats`, `--include-ads`, `--hls-prefer-native`, `--hls-prefer-ffmpeg`
|
||||||
* [documentation] Improvements
|
* [docs] Improvements
|
||||||
|
|
||||||
### 2021.04.03
|
### 2021.04.03
|
||||||
* Merge youtube-dl: Upto [commit/654b4f4](https://github.com/ytdl-org/youtube-dl/commit/654b4f4ff2718f38b3182c1188c5d569c14cc70a)
|
* Merge youtube-dl: Upto [commit/654b4f4](https://github.com/ytdl-org/youtube-dl/commit/654b4f4ff2718f38b3182c1188c5d569c14cc70a)
|
||||||
@@ -147,10 +466,10 @@
|
|||||||
* [mildom] Update extractor with current proxy by [nao20010128nao](https://github.com/nao20010128nao)
|
* [mildom] Update extractor with current proxy by [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
* [ard:mediathek] Fix video id extraction
|
* [ard:mediathek] Fix video id extraction
|
||||||
* [generic] Detect Invidious' link element
|
* [generic] Detect Invidious' link element
|
||||||
* [youtube] Show premium state in `availability` by [colethedj](https://github.com/colethedj)
|
* [youtube] Show premium state in `availability` by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [viewsource] Add extractor to handle `view-source:`
|
* [viewsource] Add extractor to handle `view-source:`
|
||||||
* [sponskrub] Run before embedding thumbnail
|
* [sponskrub] Run before embedding thumbnail
|
||||||
* [documentation] Improve `--parse-metadata` documentation
|
* [docs] Improve `--parse-metadata` documentation
|
||||||
|
|
||||||
|
|
||||||
### 2021.03.24.1
|
### 2021.03.24.1
|
||||||
@@ -182,8 +501,8 @@
|
|||||||
* Use headers and cookies when downloading subtitles by [damianoamatruda](https://github.com/damianoamatruda)
|
* Use headers and cookies when downloading subtitles by [damianoamatruda](https://github.com/damianoamatruda)
|
||||||
* Parse resolution in info dictionary by [damianoamatruda](https://github.com/damianoamatruda)
|
* Parse resolution in info dictionary by [damianoamatruda](https://github.com/damianoamatruda)
|
||||||
* More consistent warning messages by [damianoamatruda](https://github.com/damianoamatruda) and [pukkandan](https://github.com/pukkandan)
|
* More consistent warning messages by [damianoamatruda](https://github.com/damianoamatruda) and [pukkandan](https://github.com/pukkandan)
|
||||||
* [documentation] Add deprecated options and aliases in readme
|
* [docs] Add deprecated options and aliases in readme
|
||||||
* [documentation] Fix some minor mistakes
|
* [docs] Fix some minor mistakes
|
||||||
|
|
||||||
* [niconico] Partial fix adapted from [animelover1984/youtube-dl@b5eff52](https://github.com/animelover1984/youtube-dl/commit/b5eff52dd9ed5565672ea1694b38c9296db3fade) (login and smile formats still don't work)
|
* [niconico] Partial fix adapted from [animelover1984/youtube-dl@b5eff52](https://github.com/animelover1984/youtube-dl/commit/b5eff52dd9ed5565672ea1694b38c9296db3fade) (login and smile formats still don't work)
|
||||||
* [niconico] Add user extractor by [animelover1984](https://github.com/animelover1984)
|
* [niconico] Add user extractor by [animelover1984](https://github.com/animelover1984)
|
||||||
@@ -192,7 +511,7 @@
|
|||||||
* [stitcher] Merge from youtube-dl by [nixxo](https://github.com/nixxo)
|
* [stitcher] Merge from youtube-dl by [nixxo](https://github.com/nixxo)
|
||||||
* [rcs] Improved extraction by [nixxo](https://github.com/nixxo)
|
* [rcs] Improved extraction by [nixxo](https://github.com/nixxo)
|
||||||
* [linuxacadamy] Improve regex
|
* [linuxacadamy] Improve regex
|
||||||
* [youtube] Show if video is `private`, `unlisted` etc in info (`availability`) by [colethedj](https://github.com/colethedj) and [pukkandan](https://github.com/pukkandan)
|
* [youtube] Show if video is `private`, `unlisted` etc in info (`availability`) by [coletdjnz](https://github.com/coletdjnz) and [pukkandan](https://github.com/pukkandan)
|
||||||
* [youtube] bugfix for channel playlist extraction
|
* [youtube] bugfix for channel playlist extraction
|
||||||
* [nbc] Improve metadata extraction by [2ShedsJackson](https://github.com/2ShedsJackson)
|
* [nbc] Improve metadata extraction by [2ShedsJackson](https://github.com/2ShedsJackson)
|
||||||
|
|
||||||
@@ -209,15 +528,15 @@
|
|||||||
* [wimtv] Add extractor by [nixxo](https://github.com/nixxo)
|
* [wimtv] Add extractor by [nixxo](https://github.com/nixxo)
|
||||||
* [mtv] Add mtv.it and extract series metadata by [nixxo](https://github.com/nixxo)
|
* [mtv] Add mtv.it and extract series metadata by [nixxo](https://github.com/nixxo)
|
||||||
* [pluto.tv] Add extractor by [kevinoconnor7](https://github.com/kevinoconnor7)
|
* [pluto.tv] Add extractor by [kevinoconnor7](https://github.com/kevinoconnor7)
|
||||||
* [youtube] Rewrite comment extraction by [colethedj](https://github.com/colethedj)
|
* [youtube] Rewrite comment extraction by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [embedthumbnail] Set mtime correctly
|
* [embedthumbnail] Set mtime correctly
|
||||||
* Refactor some postprocessor/downloader code by [pukkandan](https://github.com/pukkandan) and [shirt](https://github.com/shirt-dev)
|
* Refactor some postprocessor/downloader code by [pukkandan](https://github.com/pukkandan) and [shirt](https://github.com/shirt-dev)
|
||||||
|
|
||||||
|
|
||||||
### 2021.03.07
|
### 2021.03.07
|
||||||
* [youtube] Fix history, mixes, community pages and trending by [pukkandan](https://github.com/pukkandan) and [colethedj](https://github.com/colethedj)
|
* [youtube] Fix history, mixes, community pages and trending by [pukkandan](https://github.com/pukkandan) and [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube] Fix private feeds/playlists on multi-channel accounts by [colethedj](https://github.com/colethedj)
|
* [youtube] Fix private feeds/playlists on multi-channel accounts by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube] Extract alerts from continuation by [colethedj](https://github.com/colethedj)
|
* [youtube] Extract alerts from continuation by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [cbs] Add support for ParamountPlus by [shirt](https://github.com/shirt-dev)
|
* [cbs] Add support for ParamountPlus by [shirt](https://github.com/shirt-dev)
|
||||||
* [mxplayer] Rewrite extractor with show support by [pukkandan](https://github.com/pukkandan) and [Ashish0804](https://github.com/Ashish0804)
|
* [mxplayer] Rewrite extractor with show support by [pukkandan](https://github.com/pukkandan) and [Ashish0804](https://github.com/Ashish0804)
|
||||||
* [gedi] Improvements from youtube-dl by [nixxo](https://github.com/nixxo)
|
* [gedi] Improvements from youtube-dl by [nixxo](https://github.com/nixxo)
|
||||||
@@ -229,7 +548,7 @@
|
|||||||
* [downloader] Fix bug for `ffmpeg`/`httpie`
|
* [downloader] Fix bug for `ffmpeg`/`httpie`
|
||||||
* [update] Fix updater removing the executable bit on some UNIX distros
|
* [update] Fix updater removing the executable bit on some UNIX distros
|
||||||
* [update] Fix current build hash for UNIX
|
* [update] Fix current build hash for UNIX
|
||||||
* [documentation] Include wget/curl/aria2c install instructions for Unix by [Ashish0804](https://github.com/Ashish0804)
|
* [docs] Include wget/curl/aria2c install instructions for Unix by [Ashish0804](https://github.com/Ashish0804)
|
||||||
* Fix some videos downloading with `m3u8` extension
|
* Fix some videos downloading with `m3u8` extension
|
||||||
* Remove "fixup is ignored" warning when fixup wasn't passed by user
|
* Remove "fixup is ignored" warning when fixup wasn't passed by user
|
||||||
|
|
||||||
@@ -238,7 +557,7 @@
|
|||||||
* [build] Fix bug
|
* [build] Fix bug
|
||||||
|
|
||||||
### 2021.03.03
|
### 2021.03.03
|
||||||
* [youtube] Use new browse API for continuation page extraction by [colethedj](https://github.com/colethedj) and [pukkandan](https://github.com/pukkandan)
|
* [youtube] Use new browse API for continuation page extraction by [coletdjnz](https://github.com/coletdjnz) and [pukkandan](https://github.com/pukkandan)
|
||||||
* Fix HLS playlist downloading by [shirt](https://github.com/shirt-dev)
|
* Fix HLS playlist downloading by [shirt](https://github.com/shirt-dev)
|
||||||
* Merge youtube-dl: Upto [2021.03.03](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.03.03)
|
* Merge youtube-dl: Upto [2021.03.03](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.03.03)
|
||||||
* [mtv] Fix extractor
|
* [mtv] Fix extractor
|
||||||
@@ -286,7 +605,7 @@
|
|||||||
* [ffmpeg] Allow passing custom arguments before -i using `--ppa "ffmpeg_i1:ARGS"` syntax
|
* [ffmpeg] Allow passing custom arguments before -i using `--ppa "ffmpeg_i1:ARGS"` syntax
|
||||||
* Fix `--windows-filenames` removing `/` from UNIX paths
|
* Fix `--windows-filenames` removing `/` from UNIX paths
|
||||||
* [hls] Show warning if pycryptodome is not found
|
* [hls] Show warning if pycryptodome is not found
|
||||||
* [documentation] Improvements
|
* [docs] Improvements
|
||||||
* Fix documentation of `Extractor Options`
|
* Fix documentation of `Extractor Options`
|
||||||
* Document `all` in format selection
|
* Document `all` in format selection
|
||||||
* Document `playable_in_embed` in output templates
|
* Document `playable_in_embed` in output templates
|
||||||
@@ -314,12 +633,12 @@
|
|||||||
* Exclude `vcruntime140.dll` from UPX by [jbruchon](https://github.com/jbruchon)
|
* Exclude `vcruntime140.dll` from UPX by [jbruchon](https://github.com/jbruchon)
|
||||||
* Set version number based on UTC time, not local time
|
* Set version number based on UTC time, not local time
|
||||||
* Publish on PyPi only if token is set
|
* Publish on PyPi only if token is set
|
||||||
* [documentation] Better document `--prefer-free-formats` and add `--no-prefer-free-format`
|
* [docs] Better document `--prefer-free-formats` and add `--no-prefer-free-format`
|
||||||
|
|
||||||
|
|
||||||
### 2021.02.15
|
### 2021.02.15
|
||||||
* Merge youtube-dl: Upto [2021.02.10](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.02.10) (except archive.org)
|
* Merge youtube-dl: Upto [2021.02.10](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.02.10) (except archive.org)
|
||||||
* [niconico] Improved extraction and support encrypted/SMILE movies by [kurumigi](https://github.com/kurumigi), [tsukumi](https://github.com/tsukumi), [bbepis](https://github.com/bbepis), [pukkandan](https://github.com/pukkandan)
|
* [niconico] Improved extraction and support encrypted/SMILE movies by [kurumigi](https://github.com/kurumigi), [tsukumijima](https://github.com/tsukumijima), [bbepis](https://github.com/bbepis), [pukkandan](https://github.com/pukkandan)
|
||||||
* Fix HLS AES-128 with multiple keys in external downloaders by [shirt](https://github.com/shirt-dev)
|
* Fix HLS AES-128 with multiple keys in external downloaders by [shirt](https://github.com/shirt-dev)
|
||||||
* [youtube_live_chat] Fix by using POST API by [siikamiika](https://github.com/siikamiika)
|
* [youtube_live_chat] Fix by using POST API by [siikamiika](https://github.com/siikamiika)
|
||||||
* [rumble] Add support for video page
|
* [rumble] Add support for video page
|
||||||
@@ -357,7 +676,7 @@
|
|||||||
* [movefiles] Fix compatibility with python2
|
* [movefiles] Fix compatibility with python2
|
||||||
* [remuxvideo] Fix validation of conditional remux
|
* [remuxvideo] Fix validation of conditional remux
|
||||||
* [sponskrub] Don't raise error when the video does not exist
|
* [sponskrub] Don't raise error when the video does not exist
|
||||||
* [documentation] Crypto is an optional dependency
|
* [docs] Crypto is an optional dependency
|
||||||
|
|
||||||
|
|
||||||
### 2021.02.04
|
### 2021.02.04
|
||||||
@@ -418,10 +737,10 @@
|
|||||||
* Merge youtube-dl: Upto [2021.01.24](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.01.16)
|
* Merge youtube-dl: Upto [2021.01.24](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.01.16)
|
||||||
* Plugin support ([documentation](https://github.com/yt-dlp/yt-dlp#plugins))
|
* Plugin support ([documentation](https://github.com/yt-dlp/yt-dlp#plugins))
|
||||||
* **Multiple paths**: New option `-P`/`--paths` to give different paths for different types of files
|
* **Multiple paths**: New option `-P`/`--paths` to give different paths for different types of files
|
||||||
* The syntax is `-P "type:path" -P "type:path"` ([documentation](https://github.com/yt-dlp/yt-dlp#:~:text=-P,%20--paths%20TYPE:PATH))
|
* The syntax is `-P "type:path" -P "type:path"`
|
||||||
* Valid types are: home, temp, description, annotation, subtitle, infojson, thumbnail
|
* Valid types are: home, temp, description, annotation, subtitle, infojson, thumbnail
|
||||||
* Additionally, configuration file is taken from home directory or current directory ([documentation](https://github.com/yt-dlp/yt-dlp#:~:text=Home%20Configuration))
|
* Additionally, configuration file is taken from home directory or current directory
|
||||||
* Allow passing different arguments to different external downloaders ([documentation](https://github.com/yt-dlp/yt-dlp#:~:text=--downloader-args%20NAME:ARGS))
|
* Allow passing different arguments to different external downloaders
|
||||||
* [mildom] Add extractor by [nao20010128nao](https://github.com/nao20010128nao)
|
* [mildom] Add extractor by [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
* Warn when using old style `--external-downloader-args` and `--post-processor-args`
|
* Warn when using old style `--external-downloader-args` and `--post-processor-args`
|
||||||
* Fix `--no-overwrite` when using `--write-link`
|
* Fix `--no-overwrite` when using `--write-link`
|
||||||
@@ -456,9 +775,9 @@
|
|||||||
* [roosterteeth.com] Fix for bonus episodes by [Zocker1999NET](https://github.com/Zocker1999NET)
|
* [roosterteeth.com] Fix for bonus episodes by [Zocker1999NET](https://github.com/Zocker1999NET)
|
||||||
* [tiktok] Fix for when share_info is empty
|
* [tiktok] Fix for when share_info is empty
|
||||||
* [EmbedThumbnail] Fix bug due to incorrect function name
|
* [EmbedThumbnail] Fix bug due to incorrect function name
|
||||||
* [documentation] Changed sponskrub links to point to [yt-dlp/SponSkrub](https://github.com/yt-dlp/SponSkrub) since I am now providing both linux and windows releases
|
* [docs] Changed sponskrub links to point to [yt-dlp/SponSkrub](https://github.com/yt-dlp/SponSkrub) since I am now providing both linux and windows releases
|
||||||
* [documentation] Change all links to correctly point to new fork URL
|
* [docs] Change all links to correctly point to new fork URL
|
||||||
* [documentation] Fixes typos
|
* [docs] Fixes typos
|
||||||
|
|
||||||
|
|
||||||
### 2021.01.12
|
### 2021.01.12
|
||||||
@@ -554,7 +873,7 @@
|
|||||||
* Redirect channel home to /video
|
* Redirect channel home to /video
|
||||||
* Print youtube's warning message
|
* Print youtube's warning message
|
||||||
* Handle Multiple pages for feeds better
|
* Handle Multiple pages for feeds better
|
||||||
* [youtube] Fix ytsearch not returning results sometimes due to promoted content by [colethedj](https://github.com/colethedj)
|
* [youtube] Fix ytsearch not returning results sometimes due to promoted content by [coletdjnz](https://github.com/coletdjnz)
|
||||||
* [youtube] Temporary fix for automatic captions - disable json3 by [blackjack4494](https://github.com/blackjack4494)
|
* [youtube] Temporary fix for automatic captions - disable json3 by [blackjack4494](https://github.com/blackjack4494)
|
||||||
* Add --break-on-existing by [gergesh](https://github.com/gergesh)
|
* Add --break-on-existing by [gergesh](https://github.com/gergesh)
|
||||||
* Pre-check video IDs in the archive before downloading by [pukkandan](https://github.com/pukkandan)
|
* Pre-check video IDs in the archive before downloading by [pukkandan](https://github.com/pukkandan)
|
||||||
@@ -573,4 +892,4 @@
|
|||||||
* [generic] Extract embedded youtube and twitter videos by [diegorodriguezv](https://github.com/diegorodriguezv)
|
* [generic] Extract embedded youtube and twitter videos by [diegorodriguezv](https://github.com/diegorodriguezv)
|
||||||
* [ffmpeg] Ensure all streams are copied by [pukkandan](https://github.com/pukkandan)
|
* [ffmpeg] Ensure all streams are copied by [pukkandan](https://github.com/pukkandan)
|
||||||
* [embedthumbnail] Fix for os.rename error by [pukkandan](https://github.com/pukkandan)
|
* [embedthumbnail] Fix for os.rename error by [pukkandan](https://github.com/pukkandan)
|
||||||
* make_win.bat: don't use UPX to pack vcruntime140.dll by [jbruchon](https://github.com/jbruchon)
|
* make_win.bat: don't use UPX to pack vcruntime140.dll by [jbruchon](https://github.com/jbruchon)
|
||||||
|
|||||||
37
Collaborators.md
Normal file
37
Collaborators.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Collaborators
|
||||||
|
|
||||||
|
This is a list of the collaborators of the project and their major contributions. See the [Changelog](Changelog.md) for more details.
|
||||||
|
|
||||||
|
You can also find lists of all [contributors of yt-dlp](CONTRIBUTORS) and [authors of youtube-dl](https://github.com/ytdl-org/youtube-dl/blob/master/AUTHORS)
|
||||||
|
|
||||||
|
|
||||||
|
## [pukkandan](https://github.com/pukkandan)
|
||||||
|
|
||||||
|
[](https://ko-fi.com/pukkandan)
|
||||||
|
|
||||||
|
* Owner of the fork
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [shirt](https://github.com/shirt-dev)
|
||||||
|
|
||||||
|
* Multithreading (`-N`) and aria2c support for fragment downloads
|
||||||
|
* Support for media initialization and discontinuity in HLS
|
||||||
|
* The self-updater (`-U`)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [coletdjnz](https://github.com/coletdjnz)
|
||||||
|
|
||||||
|
[](https://github.com/sponsors/coletdjnz)
|
||||||
|
|
||||||
|
* YouTube improvements including: age-gate bypass, private playlists, multiple-clients (to avoid throttling) and a lot of under-the-hood improvements
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
|
||||||
|
[](https://ko-fi.com/ashish0804)
|
||||||
|
|
||||||
|
* Added support for new websites Zee5, MXPlayer, DiscoveryPlusIndia, ShemarooMe, Utreon etc
|
||||||
|
* Added playlist/series downloads for TubiTv, SonyLIV, Voot, HotStar etc
|
||||||
19
Makefile
19
Makefile
@@ -13,7 +13,7 @@ pypi-files: AUTHORS Changelog.md LICENSE README.md README.txt supportedsites com
|
|||||||
.PHONY: all clean install test tar pypi-files completions ot offlinetest codetest supportedsites
|
.PHONY: all clean install test tar pypi-files completions ot offlinetest codetest supportedsites
|
||||||
|
|
||||||
clean-test:
|
clean-test:
|
||||||
rm -rf *.dump *.part* *.ytdl *.info.json *.mp4 *.m4a *.flv *.mp3 *.avi *.mkv *.webm *.3gp *.wav *.ape *.swf *.jpg *.png *.frag *.frag.urls *.frag.aria2
|
rm -rf *.dump *.part* *.ytdl *.info.json *.mp4 *.m4a *.flv *.mp3 *.avi *.mkv *.webm *.3gp *.wav *.ape *.swf *.jpg *.png *.frag *.frag.urls *.frag.aria2 test/testdata/player-*.js
|
||||||
clean-dist:
|
clean-dist:
|
||||||
rm -rf yt-dlp.1.temp.md yt-dlp.1 README.txt MANIFEST build/ dist/ .coverage cover/ yt-dlp.tar.gz completions/ yt_dlp/extractor/lazy_extractors.py *.spec CONTRIBUTING.md.tmp yt-dlp yt-dlp.exe yt_dlp.egg-info/ AUTHORS .mailmap
|
rm -rf yt-dlp.1.temp.md yt-dlp.1 README.txt MANIFEST build/ dist/ .coverage cover/ yt-dlp.tar.gz completions/ yt_dlp/extractor/lazy_extractors.py *.spec CONTRIBUTING.md.tmp yt-dlp yt-dlp.exe yt_dlp.egg-info/ AUTHORS .mailmap
|
||||||
clean-cache:
|
clean-cache:
|
||||||
@@ -25,6 +25,7 @@ completion-zsh: completions/zsh/_yt-dlp
|
|||||||
lazy-extractors: yt_dlp/extractor/lazy_extractors.py
|
lazy-extractors: yt_dlp/extractor/lazy_extractors.py
|
||||||
|
|
||||||
PREFIX ?= /usr/local
|
PREFIX ?= /usr/local
|
||||||
|
DESTDIR ?= .
|
||||||
BINDIR ?= $(PREFIX)/bin
|
BINDIR ?= $(PREFIX)/bin
|
||||||
MANDIR ?= $(PREFIX)/man
|
MANDIR ?= $(PREFIX)/man
|
||||||
SHAREDIR ?= $(PREFIX)/share
|
SHAREDIR ?= $(PREFIX)/share
|
||||||
@@ -48,23 +49,11 @@ codetest:
|
|||||||
flake8 .
|
flake8 .
|
||||||
|
|
||||||
test:
|
test:
|
||||||
#nosetests --with-coverage --cover-package=yt_dlp --cover-html --verbose --processes 4 test
|
$(PYTHON) -m pytest
|
||||||
nosetests --verbose test
|
|
||||||
$(MAKE) codetest
|
$(MAKE) codetest
|
||||||
|
|
||||||
# Keep this list in sync with devscripts/run_tests.sh
|
|
||||||
offlinetest: codetest
|
offlinetest: codetest
|
||||||
$(PYTHON) -m nose --verbose test \
|
$(PYTHON) -m pytest -k "not download"
|
||||||
--exclude test_age_restriction.py \
|
|
||||||
--exclude test_download.py \
|
|
||||||
--exclude test_iqiyi_sdk_interpreter.py \
|
|
||||||
--exclude test_overwrites.py \
|
|
||||||
--exclude test_socks.py \
|
|
||||||
--exclude test_subtitles.py \
|
|
||||||
--exclude test_write_annotations.py \
|
|
||||||
--exclude test_youtube_lists.py \
|
|
||||||
--exclude test_youtube_signature.py \
|
|
||||||
--exclude test_post_hooks.py
|
|
||||||
|
|
||||||
yt-dlp: yt_dlp/*.py yt_dlp/*/*.py
|
yt-dlp: yt_dlp/*.py yt_dlp/*/*.py
|
||||||
mkdir -p zip
|
mkdir -p zip
|
||||||
|
|||||||
248
README.md
248
README.md
@@ -1,17 +1,16 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
# YT-DLP
|
[](#readme)
|
||||||
A command-line program to download videos from YouTube and many other [video platforms](supportedsites.md)
|
|
||||||
|
|
||||||
<!-- GHA doesn't have for-the-badge style
|
[](https://github.com/yt-dlp/yt-dlp/releases/latest)
|
||||||
[](https://github.com/yt-dlp/yt-dlp/actions)
|
[](https://github.com/yt-dlp/yt-dlp/actions)
|
||||||
-->
|
[](LICENSE)
|
||||||
[](https://github.com/yt-dlp/yt-dlp/releases/latest)
|
[](Collaborators.md)
|
||||||
[](LICENSE)
|
[](supportedsites.md)
|
||||||
|
[](https://discord.gg/H5MNcFW63r)
|
||||||
[](https://yt-dlp.readthedocs.io)
|
[](https://yt-dlp.readthedocs.io)
|
||||||
[](https://discord.gg/H5MNcFW63r)
|
|
||||||
[](https://github.com/yt-dlp/yt-dlp/commits)
|
[](https://github.com/yt-dlp/yt-dlp/commits)
|
||||||
[](https://github.com/yt-dlp/yt-dlp/commits)
|
[](https://github.com/yt-dlp/yt-dlp/commits)
|
||||||
[](https://github.com/yt-dlp/yt-dlp/releases/latest)
|
[](https://github.com/yt-dlp/yt-dlp/releases/latest)
|
||||||
[](https://pypi.org/project/yt-dlp)
|
[](https://pypi.org/project/yt-dlp)
|
||||||
|
|
||||||
@@ -22,8 +21,8 @@ yt-dlp is a [youtube-dl](https://github.com/ytdl-org/youtube-dl) fork based on t
|
|||||||
* [NEW FEATURES](#new-features)
|
* [NEW FEATURES](#new-features)
|
||||||
* [Differences in default behavior](#differences-in-default-behavior)
|
* [Differences in default behavior](#differences-in-default-behavior)
|
||||||
* [INSTALLATION](#installation)
|
* [INSTALLATION](#installation)
|
||||||
* [Dependencies](#dependencies)
|
|
||||||
* [Update](#update)
|
* [Update](#update)
|
||||||
|
* [Dependencies](#dependencies)
|
||||||
* [Compile](#compile)
|
* [Compile](#compile)
|
||||||
* [USAGE AND OPTIONS](#usage-and-options)
|
* [USAGE AND OPTIONS](#usage-and-options)
|
||||||
* [General Options](#general-options)
|
* [General Options](#general-options)
|
||||||
@@ -53,6 +52,7 @@ yt-dlp is a [youtube-dl](https://github.com/ytdl-org/youtube-dl) fork based on t
|
|||||||
* [Format Selection examples](#format-selection-examples)
|
* [Format Selection examples](#format-selection-examples)
|
||||||
* [MODIFYING METADATA](#modifying-metadata)
|
* [MODIFYING METADATA](#modifying-metadata)
|
||||||
* [Modifying metadata examples](#modifying-metadata-examples)
|
* [Modifying metadata examples](#modifying-metadata-examples)
|
||||||
|
* [EXTRACTOR ARGUMENTS](#extractor-arguments)
|
||||||
* [PLUGINS](#plugins)
|
* [PLUGINS](#plugins)
|
||||||
* [DEPRECATED OPTIONS](#deprecated-options)
|
* [DEPRECATED OPTIONS](#deprecated-options)
|
||||||
* [MORE](#more)
|
* [MORE](#more)
|
||||||
@@ -66,15 +66,21 @@ The major new features from the latest release of [blackjack4494/yt-dlc](https:/
|
|||||||
|
|
||||||
* **[Format Sorting](#sorting-formats)**: The default format sorting options have been changed so that higher resolution and better codecs will be now preferred instead of simply using larger bitrate. Furthermore, you can now specify the sort order using `-S`. This allows for much easier format selection that what is possible by simply using `--format` ([examples](#format-selection-examples))
|
* **[Format Sorting](#sorting-formats)**: The default format sorting options have been changed so that higher resolution and better codecs will be now preferred instead of simply using larger bitrate. Furthermore, you can now specify the sort order using `-S`. This allows for much easier format selection that what is possible by simply using `--format` ([examples](#format-selection-examples))
|
||||||
|
|
||||||
* **Merged with youtube-dl [commit/a726009](https://github.com/ytdl-org/youtube-dl/commit/a7260099873acc6dc7d76cafad2f6b139087afd0)**: (v2021.04.26) You get all the latest features and patches of [youtube-dl](https://github.com/ytdl-org/youtube-dl) in addition to all the features of [youtube-dlc](https://github.com/blackjack4494/yt-dlc)
|
* **Merged with youtube-dl [commit/379f52a](https://github.com/ytdl-org/youtube-dl/commit/379f52a4954013767219d25099cce9e0f9401961)**: (v2021.06.06) You get all the latest features and patches of [youtube-dl](https://github.com/ytdl-org/youtube-dl) in addition to all the features of [youtube-dlc](https://github.com/blackjack4494/yt-dlc)
|
||||||
|
|
||||||
* **Merged with animelover1984/youtube-dl**: You get most of the features and improvements from [animelover1984/youtube-dl](https://github.com/animelover1984/youtube-dl) including `--get-comments`, `BiliBiliSearch`, `BilibiliChannel`, Embedding thumbnail in mp4/ogg/opus, playlist infojson etc. Note that the NicoNico improvements are not available. See [#31](https://github.com/yt-dlp/yt-dlp/pull/31) for details.
|
* **Merged with animelover1984/youtube-dl**: You get most of the features and improvements from [animelover1984/youtube-dl](https://github.com/animelover1984/youtube-dl) including `--write-comments`, `BiliBiliSearch`, `BilibiliChannel`, Embedding thumbnail in mp4/ogg/opus, playlist infojson etc. Note that the NicoNico improvements are not available. See [#31](https://github.com/yt-dlp/yt-dlp/pull/31) for details.
|
||||||
|
|
||||||
* **Youtube improvements**:
|
* **Youtube improvements**:
|
||||||
* All Youtube Feeds (`:ytfav`, `:ytwatchlater`, `:ytsubs`, `:ythistory`, `:ytrec`) works and supports downloading multiple pages of content
|
* All Feeds (`:ytfav`, `:ytwatchlater`, `:ytsubs`, `:ythistory`, `:ytrec`) and private playlists supports downloading multiple pages of content
|
||||||
* Youtube search (`ytsearch:`, `ytsearchdate:`) along with Search URLs work
|
* Search (`ytsearch:`, `ytsearchdate:`), search URLs and in-channel search works
|
||||||
* Youtube mixes supports downloading multiple pages of content
|
* Mixes supports downloading multiple pages of content
|
||||||
|
* Most (but not all) age-gated content can be downloaded without cookies
|
||||||
|
* Partial workaround for throttling issue
|
||||||
* Redirect channel's home URL automatically to `/video` to preserve the old behaviour
|
* Redirect channel's home URL automatically to `/video` to preserve the old behaviour
|
||||||
|
* `255kbps` audio is extracted from youtube music if premium cookies are given
|
||||||
|
* Youtube music Albums, channels etc can be downloaded
|
||||||
|
|
||||||
|
* **Cookies from browser**: Cookies can be automatically extracted from all major web browsers using `--cookies-from-browser BROWSER[:PROFILE]`
|
||||||
|
|
||||||
* **Split video by chapters**: Videos can be split into multiple files based on chapters using `--split-chapters`
|
* **Split video by chapters**: Videos can be split into multiple files based on chapters using `--split-chapters`
|
||||||
|
|
||||||
@@ -82,11 +88,11 @@ The major new features from the latest release of [blackjack4494/yt-dlc](https:/
|
|||||||
|
|
||||||
* **Aria2c with HLS/DASH**: You can use `aria2c` as the external downloader for DASH(mpd) and HLS(m3u8) formats
|
* **Aria2c with HLS/DASH**: You can use `aria2c` as the external downloader for DASH(mpd) and HLS(m3u8) formats
|
||||||
|
|
||||||
* **New extractors**: AnimeLab, Philo MSO, Rcs, Gedi, bitwave.tv, mildom, audius, zee5, mtv.it, wimtv, pluto.tv, niconico users, discoveryplus.in, mediathek, NFHSNetwork, nebula, ukcolumn, whowatch, MxplayerShow
|
* **New extractors**: AnimeLab, Philo MSO, Spectrum MSO, SlingTV MSO, Rcs, Gedi, bitwave.tv, mildom, audius, zee5, mtv.it, wimtv, pluto.tv, niconico users, discoveryplus.in, mediathek, NFHSNetwork, nebula, ukcolumn, whowatch, MxplayerShow, parlview (au), YoutubeWebArchive, fancode, Saitosan, ShemarooMe, telemundo, VootSeries, SonyLIVSeries, HotstarSeries, VidioPremier, VidioLive, RCTIPlus, TBS Live, douyin, pornflip, ParamountPlusSeries, ScienceChannel, Utreon
|
||||||
|
|
||||||
* **Fixed extractors**: archive.org, roosterteeth.com, skyit, instagram, itv, SouthparkDe, spreaker, Vlive, akamai, ina, rumble, tennistv, amcnetworks, la7 podcasts, linuxacadamy, nitter, twitcasting, viu, crackle, curiositystream, mediasite, rmcdecouverte, sonyliv, tubi
|
* **Fixed/improved extractors**: archive.org, roosterteeth.com, skyit, instagram, itv, SouthparkDe, spreaker, Vlive, akamai, ina, rumble, tennistv, amcnetworks, la7 podcasts, linuxacadamy, nitter, twitcasting, viu, crackle, curiositystream, mediasite, rmcdecouverte, sonyliv, tubi, tenplay, patreon, videa, yahoo, BravoTV, crunchyroll playlist, RTP, viki, Hotstar, vidio, vimeo, mediaset, Mxplayer
|
||||||
|
|
||||||
* **Subtitle extraction from manifests**: Subtitles can be extracted from streaming media manifests. See [be6202f12b97858b9d716e608394b51065d0419f](https://github.com/yt-dlp/yt-dlp/commit/be6202f12b97858b9d716e608394b51065d0419f) for details
|
* **Subtitle extraction from manifests**: Subtitles can be extracted from streaming media manifests. See [commit/be6202f](https://github.com/yt-dlp/yt-dlp/commit/be6202f12b97858b9d716e608394b51065d0419f) for details
|
||||||
|
|
||||||
* **Multiple paths and output templates**: You can give different [output templates](#output-template) and download paths for different types of files. You can also set a temporary path where intermediary files are downloaded to using `--paths` (`-P`)
|
* **Multiple paths and output templates**: You can give different [output templates](#output-template) and download paths for different types of files. You can also set a temporary path where intermediary files are downloaded to using `--paths` (`-P`)
|
||||||
|
|
||||||
@@ -117,7 +123,7 @@ Some of yt-dlp's default options are different from that of youtube-dl and youtu
|
|||||||
* The options `--id`, `--auto-number` (`-A`), `--title` (`-t`) and `--literal` (`-l`), no longer work. See [removed options](#Removed) for details
|
* The options `--id`, `--auto-number` (`-A`), `--title` (`-t`) and `--literal` (`-l`), no longer work. See [removed options](#Removed) for details
|
||||||
* `avconv` is not supported as as an alternative to `ffmpeg`
|
* `avconv` is not supported as as an alternative to `ffmpeg`
|
||||||
* The default [output template](#output-template) is `%(title)s [%(id)s].%(ext)s`. There is no real reason for this change. This was changed before yt-dlp was ever made public and now there are no plans to change it back to `%(title)s.%(id)s.%(ext)s`. Instead, you may use `--compat-options filename`
|
* The default [output template](#output-template) is `%(title)s [%(id)s].%(ext)s`. There is no real reason for this change. This was changed before yt-dlp was ever made public and now there are no plans to change it back to `%(title)s.%(id)s.%(ext)s`. Instead, you may use `--compat-options filename`
|
||||||
* The default [format sorting](sorting-formats) is different from youtube-dl and prefers higher resolution and better codecs rather than higher bitrates. You can use the `--format-sort` option to change this to any order you prefer, or use `--compat-options format-sort` to use youtube-dl's sorting order
|
* The default [format sorting](#sorting-formats) is different from youtube-dl and prefers higher resolution and better codecs rather than higher bitrates. You can use the `--format-sort` option to change this to any order you prefer, or use `--compat-options format-sort` to use youtube-dl's sorting order
|
||||||
* The default format selector is `bv*+ba/b`. This means that if a combined video + audio format that is better than the best video-only format is found, the former will be prefered. Use `-f bv+ba/b` or `--compat-options format-spec` to revert this
|
* The default format selector is `bv*+ba/b`. This means that if a combined video + audio format that is better than the best video-only format is found, the former will be prefered. Use `-f bv+ba/b` or `--compat-options format-spec` to revert this
|
||||||
* Unlike youtube-dlc, yt-dlp does not allow merging multiple audio/video streams into one file by default (since this conflicts with the use of `-f bv*+ba`). If needed, this feature must be enabled using `--audio-multistreams` and `--video-multistreams`. You can also use `--compat-options multistreams` to enable both
|
* Unlike youtube-dlc, yt-dlp does not allow merging multiple audio/video streams into one file by default (since this conflicts with the use of `-f bv*+ba`). If needed, this feature must be enabled using `--audio-multistreams` and `--video-multistreams`. You can also use `--compat-options multistreams` to enable both
|
||||||
* `--ignore-errors` is enabled by default. Use `--abort-on-error` or `--compat-options abort-on-error` to abort on errors instead
|
* `--ignore-errors` is enabled by default. Use `--abort-on-error` or `--compat-options abort-on-error` to abort on errors instead
|
||||||
@@ -125,9 +131,13 @@ Some of yt-dlp's default options are different from that of youtube-dl and youtu
|
|||||||
* `--add-metadata` attaches the `infojson` to `mkv` files in addition to writing the metadata when used with `--write-infojson`. Use `--compat-options no-attach-info-json` to revert this
|
* `--add-metadata` attaches the `infojson` to `mkv` files in addition to writing the metadata when used with `--write-infojson`. Use `--compat-options no-attach-info-json` to revert this
|
||||||
* `playlist_index` behaves differently when used with options like `--playlist-reverse` and `--playlist-items`. See [#302](https://github.com/yt-dlp/yt-dlp/issues/302) for details. You can use `--compat-options playlist-index` if you want to keep the earlier behavior
|
* `playlist_index` behaves differently when used with options like `--playlist-reverse` and `--playlist-items`. See [#302](https://github.com/yt-dlp/yt-dlp/issues/302) for details. You can use `--compat-options playlist-index` if you want to keep the earlier behavior
|
||||||
* The output of `-F` is listed in a new format. Use `--compat-options list-formats` to revert this
|
* The output of `-F` is listed in a new format. Use `--compat-options list-formats` to revert this
|
||||||
|
* All *experiences* of a funimation episode are considered as a single video. This behavior breaks existing archives. Use `--compat-options seperate-video-versions` to extract information from only the default player
|
||||||
* Youtube live chat (if available) is considered as a subtitle. Use `--sub-langs all,-live_chat` to download all subtitles except live chat. You can also use `--compat-options no-live-chat` to prevent live chat from downloading
|
* Youtube live chat (if available) is considered as a subtitle. Use `--sub-langs all,-live_chat` to download all subtitles except live chat. You can also use `--compat-options no-live-chat` to prevent live chat from downloading
|
||||||
* Youtube channel URLs are automatically redirected to `/video`. Either append a `/featured` to the URL or use `--compat-options no-youtube-channel-redirect` to download only the videos in the home page
|
* Youtube channel URLs are automatically redirected to `/video`. Append a `/featured` to the URL to download only the videos in the home page. If the channel does not have a videos tab, we try to download the equivalent `UU` playlist instead. Also, `/live` URLs raise an error if there are no live videos instead of silently downloading the entire channel. You may use `--compat-options no-youtube-channel-redirect` to revert all these redirections
|
||||||
* Unavailable videos are also listed for youtube playlists. Use `--compat-options no-youtube-unavailable-videos` to remove this
|
* Unavailable videos are also listed for youtube playlists. Use `--compat-options no-youtube-unavailable-videos` to remove this
|
||||||
|
* If `ffmpeg` is used as the downloader, the downloading and merging of formats happen in a single step when possible. Use `--compat-options no-direct-merge` to revert this
|
||||||
|
* Thumbnail embedding in `mp4` is done with mutagen if possible. Use `--compat-options embed-thumbnail-atomicparsley` to force the use of AtomicParsley instead
|
||||||
|
* Some private fields such as filenames are removed by default from the infojson. Use `--no-clean-infojson` or `--compat-options no-clean-infojson` to revert this
|
||||||
|
|
||||||
For ease of use, a few more compat options are available:
|
For ease of use, a few more compat options are available:
|
||||||
* `--compat-options all`: Use all compat options
|
* `--compat-options all`: Use all compat options
|
||||||
@@ -163,23 +173,39 @@ sudo aria2c https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o
|
|||||||
sudo chmod a+rx /usr/local/bin/yt-dlp
|
sudo chmod a+rx /usr/local/bin/yt-dlp
|
||||||
```
|
```
|
||||||
|
|
||||||
### DEPENDENCIES
|
|
||||||
Python versions 3.6+ (CPython and PyPy) are officially supported. Other versions and implementations may or maynot work correctly.
|
|
||||||
|
|
||||||
On windows, [Microsoft Visual C++ 2010 Redistributable Package (x86)](https://www.microsoft.com/en-us/download/details.aspx?id=26999) is also necessary to run yt-dlp. You probably already have this, but if the executable throws an error due to missing `MSVCR100.dll` you need to install it.
|
|
||||||
|
|
||||||
Although there are no other required dependencies, `ffmpeg` and `ffprobe` are highly recommended. Other optional dependencies are `sponskrub`, `AtomicParsley`, `mutagen`, `pycryptodome`, `phantomjs` and any of the supported external downloaders. Note that the windows releases are already built with the python interpreter, mutagen and pycryptodome included.
|
|
||||||
|
|
||||||
### UPDATE
|
### UPDATE
|
||||||
You can use `yt-dlp -U` to update if you are using the provided release.
|
You can use `yt-dlp -U` to update if you are using the provided release.
|
||||||
If you are using `pip`, simply re-run the same command that was used to install the program.
|
If you are using `pip`, simply re-run the same command that was used to install the program.
|
||||||
|
|
||||||
|
### DEPENDENCIES
|
||||||
|
Python versions 3.6+ (CPython and PyPy) are supported. Other versions and implementations may or may not work correctly.
|
||||||
|
|
||||||
|
<!-- https://www.microsoft.com/en-us/download/details.aspx?id=26999 -->
|
||||||
|
On windows, [Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)](https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe) is also necessary to run yt-dlp. You probably already have this, but if the executable throws an error due to missing `MSVCR100.dll` you need to install it manually.
|
||||||
|
|
||||||
|
While all the other dependancies are optional, `ffmpeg` and `ffprobe` are highly recommended
|
||||||
|
* [**ffmpeg** and **ffprobe**](https://www.ffmpeg.org) - Required for [merging seperate video and audio files](#format-selection) as well as for various [post-processing](#post-processing-options) tasks. Licence [depends on the build](https://www.ffmpeg.org/legal.html)
|
||||||
|
* [**sponskrub**](https://github.com/faissaloo/SponSkrub) - For using the [sponskrub options](#sponskrub-sponsorblock-options). Licenced under [GPLv3+](https://github.com/faissaloo/SponSkrub/blob/master/LICENCE.md)
|
||||||
|
* [**mutagen**](https://github.com/quodlibet/mutagen) - For embedding thumbnail in certain formats. Licenced under [GPLv2+](https://github.com/quodlibet/mutagen/blob/master/COPYING)
|
||||||
|
* [**pycryptodome**](https://github.com/Legrandin/pycryptodome) - For decrypting various data. Licenced under [BSD2](https://github.com/Legrandin/pycryptodome/blob/master/LICENSE.rst)
|
||||||
|
* [**websockets**](https://github.com/aaugustin/websockets) - For downloading over websocket. Licenced under [BSD3](https://github.com/aaugustin/websockets/blob/main/LICENSE)
|
||||||
|
* [**keyring**](https://github.com/jaraco/keyring) - For decrypting cookies of chromium-based browsers on Linux. Licenced under [MIT](https://github.com/jaraco/keyring/blob/main/LICENSE)
|
||||||
|
* [**AtomicParsley**](https://github.com/wez/atomicparsley) - For embedding thumbnail in mp4/m4a if mutagen is not present. Licenced under [GPLv2+](https://github.com/wez/atomicparsley/blob/master/COPYING)
|
||||||
|
* [**rtmpdump**](http://rtmpdump.mplayerhq.hu) - For downloading `rtmp` streams. ffmpeg will be used as a fallback. Licenced under [GPLv2+](http://rtmpdump.mplayerhq.hu)
|
||||||
|
* [**mplayer**](http://mplayerhq.hu/design7/info.html) or [**mpv**](https://mpv.io) - For downloading `rstp` streams. ffmpeg will be used as a fallback. Licenced under [GPLv2+](https://github.com/mpv-player/mpv/blob/master/Copyright)
|
||||||
|
* [**phantomjs**](https://github.com/ariya/phantomjs) - Used in extractors where javascript needs to be run. Licenced under [BSD3](https://github.com/ariya/phantomjs/blob/master/LICENSE.BSD)
|
||||||
|
* Any external downloader that you want to use with `--downloader`
|
||||||
|
|
||||||
|
To use or redistribute the dependencies, you must agree to their respective licensing terms.
|
||||||
|
|
||||||
|
Note that the windows releases are already built with the python interpreter, mutagen, pycryptodome and websockets included.
|
||||||
|
|
||||||
### COMPILE
|
### COMPILE
|
||||||
|
|
||||||
**For Windows**:
|
**For Windows**:
|
||||||
To build the Windows executable, you must have pyinstaller (and optionally mutagen and pycryptodome)
|
To build the Windows executable, you must have pyinstaller (and optionally mutagen, pycryptodome, websockets)
|
||||||
|
|
||||||
python3 -m pip install --upgrade pyinstaller mutagen pycryptodome
|
python3 -m pip install --upgrade pyinstaller mutagen pycryptodome websockets
|
||||||
|
|
||||||
Once you have all the necessary dependencies installed, just run `py pyinst.py`. The executable will be built for the same architecture (32/64 bit) as the python used to build it.
|
Once you have all the necessary dependencies installed, just run `py pyinst.py`. The executable will be built for the same architecture (32/64 bit) as the python used to build it.
|
||||||
|
|
||||||
@@ -190,7 +216,7 @@ You can also build the executable without any version info or metadata by using:
|
|||||||
Note that pyinstaller [does not support](https://github.com/pyinstaller/pyinstaller#requirements-and-tested-platforms) Python installed from the Windows store without using a virtual environment
|
Note that pyinstaller [does not support](https://github.com/pyinstaller/pyinstaller#requirements-and-tested-platforms) Python installed from the Windows store without using a virtual environment
|
||||||
|
|
||||||
**For Unix**:
|
**For Unix**:
|
||||||
You will need the required build tools: `python`, `make` (GNU), `pandoc`, `zip`, `nosetests`
|
You will need the required build tools: `python`, `make` (GNU), `pandoc`, `zip`, `pytest`
|
||||||
Then simply run `make`. You can also run `make yt-dlp` instead to compile only the binary without updating any of the additional files
|
Then simply run `make`. You can also run `make yt-dlp` instead to compile only the binary without updating any of the additional files
|
||||||
|
|
||||||
**Note**: In either platform, `devscripts\update-version.py` can be used to automatically update the version number
|
**Note**: In either platform, `devscripts\update-version.py` can be used to automatically update the version number
|
||||||
@@ -355,6 +381,9 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
(default is 1)
|
(default is 1)
|
||||||
-r, --limit-rate RATE Maximum download rate in bytes per second
|
-r, --limit-rate RATE Maximum download rate in bytes per second
|
||||||
(e.g. 50K or 4.2M)
|
(e.g. 50K or 4.2M)
|
||||||
|
--throttled-rate RATE Minimum download rate in bytes per second
|
||||||
|
below which throttling is assumed and the
|
||||||
|
video data is re-extracted (e.g. 100K)
|
||||||
-R, --retries RETRIES Number of retries (default is 10), or
|
-R, --retries RETRIES Number of retries (default is 10), or
|
||||||
"infinite"
|
"infinite"
|
||||||
--fragment-retries RETRIES Number of retries for a fragment (default
|
--fragment-retries RETRIES Number of retries for a fragment (default
|
||||||
@@ -411,7 +440,8 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
--downloader-args NAME:ARGS Give these arguments to the external
|
--downloader-args NAME:ARGS Give these arguments to the external
|
||||||
downloader. Specify the downloader name and
|
downloader. Specify the downloader name and
|
||||||
the arguments separated by a colon ":". You
|
the arguments separated by a colon ":". You
|
||||||
can use this option multiple times
|
can use this option multiple times to give
|
||||||
|
different arguments to different downloaders
|
||||||
(Alias: --external-downloader-args)
|
(Alias: --external-downloader-args)
|
||||||
|
|
||||||
## Filesystem Options:
|
## Filesystem Options:
|
||||||
@@ -419,17 +449,17 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
stdin), one URL per line. Lines starting
|
stdin), one URL per line. Lines starting
|
||||||
with '#', ';' or ']' are considered as
|
with '#', ';' or ']' are considered as
|
||||||
comments and ignored
|
comments and ignored
|
||||||
-P, --paths TYPES:PATH The paths where the files should be
|
-P, --paths [TYPES:]PATH The paths where the files should be
|
||||||
downloaded. Specify the type of file and
|
downloaded. Specify the type of file and
|
||||||
the path separated by a colon ":". All the
|
the path separated by a colon ":". All the
|
||||||
same types as --output are supported.
|
same types as --output are supported.
|
||||||
Additionally, you can also provide "home"
|
Additionally, you can also provide "home"
|
||||||
and "temp" paths. All intermediary files
|
(default) and "temp" paths. All
|
||||||
are first downloaded to the temp path and
|
intermediary files are first downloaded to
|
||||||
then the final files are moved over to the
|
the temp path and then the final files are
|
||||||
home path after download is finished. This
|
moved over to the home path after download
|
||||||
option is ignored if --output is an
|
is finished. This option is ignored if
|
||||||
absolute path
|
--output is an absolute path
|
||||||
-o, --output [TYPES:]TEMPLATE Output filename template; see "OUTPUT
|
-o, --output [TYPES:]TEMPLATE Output filename template; see "OUTPUT
|
||||||
TEMPLATE" for details
|
TEMPLATE" for details
|
||||||
--output-na-placeholder TEXT Placeholder value for unavailable meta
|
--output-na-placeholder TEXT Placeholder value for unavailable meta
|
||||||
@@ -495,15 +525,24 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
option)
|
option)
|
||||||
--cookies FILE File to read cookies from and dump cookie
|
--cookies FILE File to read cookies from and dump cookie
|
||||||
jar in
|
jar in
|
||||||
--no-cookies Do not read/dump cookies (default)
|
--no-cookies Do not read/dump cookies from/to file
|
||||||
|
(default)
|
||||||
|
--cookies-from-browser BROWSER[:PROFILE]
|
||||||
|
Load cookies from a user profile of the
|
||||||
|
given web browser. Currently supported
|
||||||
|
browsers are: brave|chrome|chromium|edge|fi
|
||||||
|
refox|opera|safari|vivaldi. You can specify
|
||||||
|
the user profile name or directory using
|
||||||
|
"BROWSER:PROFILE_NAME" or
|
||||||
|
"BROWSER:PROFILE_PATH". If no profile is
|
||||||
|
given, the most recently accessed one is
|
||||||
|
used
|
||||||
|
--no-cookies-from-browser Do not load cookies from browser (default)
|
||||||
--cache-dir DIR Location in the filesystem where youtube-dl
|
--cache-dir DIR Location in the filesystem where youtube-dl
|
||||||
can store some downloaded information
|
can store some downloaded information (such
|
||||||
permanently. By default
|
as client ids and signatures) permanently.
|
||||||
$XDG_CACHE_HOME/youtube-dl or
|
By default $XDG_CACHE_HOME/youtube-dl or
|
||||||
~/.cache/youtube-dl . At the moment, only
|
~/.cache/youtube-dl
|
||||||
YouTube player files (for videos with
|
|
||||||
obfuscated signatures) are cached, but that
|
|
||||||
may change
|
|
||||||
--no-cache-dir Disable filesystem caching
|
--no-cache-dir Disable filesystem caching
|
||||||
--rm-cache-dir Delete all filesystem cache files
|
--rm-cache-dir Delete all filesystem cache files
|
||||||
|
|
||||||
@@ -616,7 +655,9 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
--no-prefer-free-formats Don't give any special preference to free
|
--no-prefer-free-formats Don't give any special preference to free
|
||||||
containers (default)
|
containers (default)
|
||||||
--check-formats Check that the formats selected are
|
--check-formats Check that the formats selected are
|
||||||
actually downloadable (Experimental)
|
actually downloadable
|
||||||
|
--no-check-formats Do not check that the formats selected are
|
||||||
|
actually downloadable
|
||||||
-F, --list-formats List all available formats of requested
|
-F, --list-formats List all available formats of requested
|
||||||
videos
|
videos
|
||||||
--merge-output-format FORMAT If a merge is required (e.g.
|
--merge-output-format FORMAT If a merge is required (e.g.
|
||||||
@@ -668,10 +709,10 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
## Post-Processing Options:
|
## Post-Processing Options:
|
||||||
-x, --extract-audio Convert video files to audio-only files
|
-x, --extract-audio Convert video files to audio-only files
|
||||||
(requires ffmpeg and ffprobe)
|
(requires ffmpeg and ffprobe)
|
||||||
--audio-format FORMAT Specify audio format: "best", "aac",
|
--audio-format FORMAT Specify audio format to convert the audio
|
||||||
"flac", "mp3", "m4a", "opus", "vorbis", or
|
to when -x is used. Currently supported
|
||||||
"wav"; "best" by default; No effect without
|
formats are: best (default) or one of
|
||||||
-x
|
aac|flac|mp3|m4a|opus|vorbis|wav
|
||||||
--audio-quality QUALITY Specify ffmpeg audio quality, insert a
|
--audio-quality QUALITY Specify ffmpeg audio quality, insert a
|
||||||
value between 0 (better) and 9 (worse) for
|
value between 0 (better) and 9 (worse) for
|
||||||
VBR or a specific bitrate like 128K
|
VBR or a specific bitrate like 128K
|
||||||
@@ -681,12 +722,12 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
|webm|mov|avi|mp3|mka|m4a|ogg|opus). If
|
|webm|mov|avi|mp3|mka|m4a|ogg|opus). If
|
||||||
target container does not support the
|
target container does not support the
|
||||||
video/audio codec, remuxing will fail. You
|
video/audio codec, remuxing will fail. You
|
||||||
can specify multiple rules; eg.
|
can specify multiple rules; Eg.
|
||||||
"aac>m4a/mov>mp4/mkv" will remux aac to
|
"aac>m4a/mov>mp4/mkv" will remux aac to
|
||||||
m4a, mov to mp4 and anything else to mkv.
|
m4a, mov to mp4 and anything else to mkv.
|
||||||
--recode-video FORMAT Re-encode the video into another format if
|
--recode-video FORMAT Re-encode the video into another format if
|
||||||
re-encoding is necessary. The supported
|
re-encoding is necessary. The syntax and
|
||||||
formats are the same as --remux-video
|
supported formats are the same as --remux-video
|
||||||
--postprocessor-args NAME:ARGS Give these arguments to the postprocessors.
|
--postprocessor-args NAME:ARGS Give these arguments to the postprocessors.
|
||||||
Specify the postprocessor/executable name
|
Specify the postprocessor/executable name
|
||||||
and the arguments separated by a colon ":"
|
and the arguments separated by a colon ":"
|
||||||
@@ -696,7 +737,8 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
Metadata, EmbedSubtitle, EmbedThumbnail,
|
Metadata, EmbedSubtitle, EmbedThumbnail,
|
||||||
SubtitlesConvertor, ThumbnailsConvertor,
|
SubtitlesConvertor, ThumbnailsConvertor,
|
||||||
VideoRemuxer, VideoConvertor, SponSkrub,
|
VideoRemuxer, VideoConvertor, SponSkrub,
|
||||||
FixupStretched, FixupM4a and FixupM3u8. The
|
FixupStretched, FixupM4a, FixupM3u8,
|
||||||
|
FixupTimestamp and FixupDuration. The
|
||||||
supported executables are: AtomicParsley,
|
supported executables are: AtomicParsley,
|
||||||
FFmpeg, FFprobe, and SponSkrub. You can
|
FFmpeg, FFprobe, and SponSkrub. You can
|
||||||
also specify "PP+EXE:ARGS" to give the
|
also specify "PP+EXE:ARGS" to give the
|
||||||
@@ -720,10 +762,13 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
--embed-subs Embed subtitles in the video (only for mp4,
|
--embed-subs Embed subtitles in the video (only for mp4,
|
||||||
webm and mkv videos)
|
webm and mkv videos)
|
||||||
--no-embed-subs Do not embed subtitles (default)
|
--no-embed-subs Do not embed subtitles (default)
|
||||||
--embed-thumbnail Embed thumbnail in the audio as cover art
|
--embed-thumbnail Embed thumbnail in the video as cover art
|
||||||
--no-embed-thumbnail Do not embed thumbnail (default)
|
--no-embed-thumbnail Do not embed thumbnail (default)
|
||||||
--add-metadata Write metadata to the video file
|
--embed-metadata Embed metadata including chapter markers
|
||||||
--no-add-metadata Do not write metadata (default)
|
(if supported by the format) to the video
|
||||||
|
file (Alias: --add-metadata)
|
||||||
|
--no-embed-metadata Do not write metadata (default)
|
||||||
|
(Alias: --no-add-metadata)
|
||||||
--parse-metadata FROM:TO Parse additional metadata like title/artist
|
--parse-metadata FROM:TO Parse additional metadata like title/artist
|
||||||
from other fields; see "MODIFYING METADATA"
|
from other fields; see "MODIFYING METADATA"
|
||||||
for details
|
for details
|
||||||
@@ -733,7 +778,8 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
file. One of never (do nothing), warn (only
|
file. One of never (do nothing), warn (only
|
||||||
emit a warning), detect_or_warn (the
|
emit a warning), detect_or_warn (the
|
||||||
default; fix file if we can, warn
|
default; fix file if we can, warn
|
||||||
otherwise)
|
otherwise), force (try fixing even if file
|
||||||
|
already exists
|
||||||
--ffmpeg-location PATH Location of the ffmpeg binary; either the
|
--ffmpeg-location PATH Location of the ffmpeg binary; either the
|
||||||
path to the binary or its containing
|
path to the binary or its containing
|
||||||
directory
|
directory
|
||||||
@@ -744,13 +790,16 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
command. An additional field "filepath"
|
command. An additional field "filepath"
|
||||||
that contains the final path of the
|
that contains the final path of the
|
||||||
downloaded file is also available. If no
|
downloaded file is also available. If no
|
||||||
fields are passed, "%(filepath)s" is
|
fields are passed, %(filepath)q is appended
|
||||||
appended to the end of the command
|
to the end of the command
|
||||||
|
--exec-before-download CMD Execute a command before the actual
|
||||||
|
download. The syntax is the same as --exec
|
||||||
|
but "filepath" is not available
|
||||||
--convert-subs FORMAT Convert the subtitles to another format
|
--convert-subs FORMAT Convert the subtitles to another format
|
||||||
(currently supported: srt|ass|vtt|lrc)
|
(currently supported: srt|vtt|ass|lrc)
|
||||||
(Alias: --convert-subtitles)
|
(Alias: --convert-subtitles)
|
||||||
--convert-thumbnails FORMAT Convert the thumbnails to another format
|
--convert-thumbnails FORMAT Convert the thumbnails to another format
|
||||||
(currently supported: jpg)
|
(currently supported: jpg|png)
|
||||||
--split-chapters Split video into multiple files based on
|
--split-chapters Split video into multiple files based on
|
||||||
internal chapters. The "chapter:" prefix
|
internal chapters. The "chapter:" prefix
|
||||||
can be used with "--paths" and "--output"
|
can be used with "--paths" and "--output"
|
||||||
@@ -792,18 +841,10 @@ Then simply run `make`. You can also run `make yt-dlp` instead to compile only t
|
|||||||
--no-hls-split-discontinuity Do not split HLS playlists to different
|
--no-hls-split-discontinuity Do not split HLS playlists to different
|
||||||
formats at discontinuities such as ad
|
formats at discontinuities such as ad
|
||||||
breaks (default)
|
breaks (default)
|
||||||
--youtube-include-dash-manifest Download the DASH manifests and related
|
--extractor-args KEY:ARGS Pass these arguments to the extractor. See
|
||||||
data on YouTube videos (default)
|
"EXTRACTOR ARGUMENTS" for details. You can
|
||||||
(Alias: --no-youtube-skip-dash-manifest)
|
use this option multiple times to give
|
||||||
--youtube-skip-dash-manifest Do not download the DASH manifests and
|
arguments for different extractors
|
||||||
related data on YouTube videos
|
|
||||||
(Alias: --no-youtube-include-dash-manifest)
|
|
||||||
--youtube-include-hls-manifest Download the HLS manifests and related data
|
|
||||||
on YouTube videos (default)
|
|
||||||
(Alias: --no-youtube-skip-hls-manifest)
|
|
||||||
--youtube-skip-hls-manifest Do not download the HLS manifests and
|
|
||||||
related data on YouTube videos
|
|
||||||
(Alias: --no-youtube-include-hls-manifest)
|
|
||||||
|
|
||||||
# CONFIGURATION
|
# CONFIGURATION
|
||||||
|
|
||||||
@@ -878,10 +919,11 @@ The simplest usage of `-o` is not to set any template arguments when downloading
|
|||||||
It may however also contain special sequences that will be replaced when downloading each video. The special sequences may be formatted according to [python string formatting operations](https://docs.python.org/2/library/stdtypes.html#string-formatting). For example, `%(NAME)s` or `%(NAME)05d`. To clarify, that is a percent symbol followed by a name in parentheses, followed by formatting operations.
|
It may however also contain special sequences that will be replaced when downloading each video. The special sequences may be formatted according to [python string formatting operations](https://docs.python.org/2/library/stdtypes.html#string-formatting). For example, `%(NAME)s` or `%(NAME)05d`. To clarify, that is a percent symbol followed by a name in parentheses, followed by formatting operations.
|
||||||
|
|
||||||
The field names themselves (the part inside the parenthesis) can also have some special formatting:
|
The field names themselves (the part inside the parenthesis) can also have some special formatting:
|
||||||
1. **Object traversal**: The dictionaries and lists available in metadata can be traversed by using a `.` (dot) separator. You can also do python slicing using `:`. Eg: `%(tags.0)s`, `%(subtitles.en.-1.ext)`, `%(id.3:7:-1)s`. Note that the fields that become available using this method are not listed below. Use `-j` to see such fields
|
1. **Object traversal**: The dictionaries and lists available in metadata can be traversed by using a `.` (dot) separator. You can also do python slicing using `:`. Eg: `%(tags.0)s`, `%(subtitles.en.-1.ext)`, `%(id.3:7:-1)s`, `%(formats.:.format_id)s`. Note that all the fields that become available using this method are not listed below. Use `-j` to see such fields
|
||||||
1. **Addition**: Addition and subtraction of numeric fields can be done using `+` and `-` respectively. Eg: `%(playlist_index+10)03d`, `%(n_entries+1-playlist_index)d`
|
1. **Addition**: Addition and subtraction of numeric fields can be done using `+` and `-` respectively. Eg: `%(playlist_index+10)03d`, `%(n_entries+1-playlist_index)d`
|
||||||
1. **Date/time Formatting**: Date/time fields can be formatted according to [strftime formatting](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes) by specifying it separated from the field name using a `>`. Eg: `%(duration>%H-%M-%S)s`, `%(upload_date>%Y-%m-%d)s`, `%(epoch-3600>%H-%M-%S)s`
|
1. **Date/time Formatting**: Date/time fields can be formatted according to [strftime formatting](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes) by specifying it separated from the field name using a `>`. Eg: `%(duration>%H-%M-%S)s`, `%(upload_date>%Y-%m-%d)s`, `%(epoch-3600>%H-%M-%S)s`
|
||||||
1. **Default**: A default value can be specified for when the field is empty using a `|` seperator. This overrides `--output-na-template`. Eg: `%(uploader|Unknown)s`
|
1. **Default**: A default value can be specified for when the field is empty using a `|` seperator. This overrides `--output-na-template`. Eg: `%(uploader|Unknown)s`
|
||||||
|
1. **More Conversions**: In addition to the normal format types `diouxXeEfFgGcrs`, `j`, `l`, `q` can be used for converting to **j**son, a comma seperated **l**ist and a string **q**uoted for the terminal respectively
|
||||||
|
|
||||||
To summarize, the general syntax for a field is:
|
To summarize, the general syntax for a field is:
|
||||||
```
|
```
|
||||||
@@ -918,6 +960,7 @@ The available fields are:
|
|||||||
- `average_rating` (numeric): Average rating give by users, the scale used depends on the webpage
|
- `average_rating` (numeric): Average rating give by users, the scale used depends on the webpage
|
||||||
- `comment_count` (numeric): Number of comments on the video (For some extractors, comments are only downloaded at the end, and so this field cannot be used)
|
- `comment_count` (numeric): Number of comments on the video (For some extractors, comments are only downloaded at the end, and so this field cannot be used)
|
||||||
- `age_limit` (numeric): Age restriction for the video (years)
|
- `age_limit` (numeric): Age restriction for the video (years)
|
||||||
|
- `live_status` (string): One of 'is_live', 'was_live', 'upcoming', 'not_live'
|
||||||
- `is_live` (boolean): Whether this video is a live stream or a fixed-length video
|
- `is_live` (boolean): Whether this video is a live stream or a fixed-length video
|
||||||
- `was_live` (boolean): Whether this video was originally a live stream
|
- `was_live` (boolean): Whether this video was originally a live stream
|
||||||
- `playable_in_embed` (string): Whether this video is allowed to play in embedded players on other sites
|
- `playable_in_embed` (string): Whether this video is allowed to play in embedded players on other sites
|
||||||
@@ -951,6 +994,8 @@ The available fields are:
|
|||||||
- `playlist_title` (string): Playlist title
|
- `playlist_title` (string): Playlist title
|
||||||
- `playlist_uploader` (string): Full name of the playlist uploader
|
- `playlist_uploader` (string): Full name of the playlist uploader
|
||||||
- `playlist_uploader_id` (string): Nickname or id of the playlist uploader
|
- `playlist_uploader_id` (string): Nickname or id of the playlist uploader
|
||||||
|
- `webpage_url` (string): A URL to the video webpage which if given to yt-dlp should allow to get the same result again
|
||||||
|
- `original_url` (string): The URL given by the user (or same as `webpage_url` for playlist entries)
|
||||||
|
|
||||||
Available for the video that belongs to some logical chapter or section:
|
Available for the video that belongs to some logical chapter or section:
|
||||||
|
|
||||||
@@ -995,7 +1040,7 @@ Available only when used in `--print`:
|
|||||||
|
|
||||||
Each aforementioned sequence when referenced in an output template will be replaced by the actual value corresponding to the sequence name. Note that some of the sequences are not guaranteed to be present since they depend on the metadata obtained by a particular extractor. Such sequences will be replaced with placeholder value provided with `--output-na-placeholder` (`NA` by default).
|
Each aforementioned sequence when referenced in an output template will be replaced by the actual value corresponding to the sequence name. Note that some of the sequences are not guaranteed to be present since they depend on the metadata obtained by a particular extractor. Such sequences will be replaced with placeholder value provided with `--output-na-placeholder` (`NA` by default).
|
||||||
|
|
||||||
For example for `-o %(title)s-%(id)s.%(ext)s` and an mp4 video with title `yt-dlp test video` and id `BaW_jenozKcj`, this will result in a `yt-dlp test video-BaW_jenozKcj.mp4` file created in the current directory.
|
For example for `-o %(title)s-%(id)s.%(ext)s` and an mp4 video with title `yt-dlp test video` and id `BaW_jenozKc`, this will result in a `yt-dlp test video-BaW_jenozKc.mp4` file created in the current directory.
|
||||||
|
|
||||||
For numeric sequences you can use numeric related formatting, for example, `%(view_count)05d` will result in a string with view count padded with zeros up to 5 characters, like in `00042`.
|
For numeric sequences you can use numeric related formatting, for example, `%(view_count)05d` will result in a string with view count padded with zeros up to 5 characters, like in `00042`.
|
||||||
|
|
||||||
@@ -1079,7 +1124,7 @@ If you want to download multiple videos and they don't have the same formats ava
|
|||||||
|
|
||||||
If you want to download several formats of the same video use a comma as a separator, e.g. `-f 22,17,18` will download all these three formats, of course if they are available. Or a more sophisticated example combined with the precedence feature: `-f 136/137/mp4/bestvideo,140/m4a/bestaudio`.
|
If you want to download several formats of the same video use a comma as a separator, e.g. `-f 22,17,18` will download all these three formats, of course if they are available. Or a more sophisticated example combined with the precedence feature: `-f 136/137/mp4/bestvideo,140/m4a/bestaudio`.
|
||||||
|
|
||||||
You can merge the video and audio of multiple formats into a single file using `-f <format1>+<format2>+...` (requires ffmpeg installed), for example `-f bestvideo+bestaudio` will download the best video-only format, the best audio-only format and mux them together with ffmpeg. If `--no-video-multistreams` is used, all formats with a video stream except the first one are ignored. Similarly, if `--no-audio-multistreams` is used, all formats with an audio stream except the first one are ignored. For example, `-f bestvideo+best+bestaudio` will download and merge all 3 given formats. The resulting file will have 2 video streams and 2 audio streams. But `-f bestvideo+best+bestaudio --no-video-multistreams` will download and merge only `bestvideo` and `bestaudio`. `best` is ignored since another format containing a video stream (`bestvideo`) has already been selected. The order of the formats is therefore important. `-f best+bestaudio --no-audio-multistreams` will download and merge both formats while `-f bestaudio+best --no-audio-multistreams` will ignore `best` and download only `bestaudio`.
|
You can merge the video and audio of multiple formats into a single file using `-f <format1>+<format2>+...` (requires ffmpeg installed), for example `-f bestvideo+bestaudio` will download the best video-only format, the best audio-only format and mux them together with ffmpeg. Unless `--video-multistreams` is used, all formats with a video stream except the first one are ignored. Similarly, unless `--audio-multistreams` is used, all formats with an audio stream except the first one are ignored. For example, `-f bestvideo+best+bestaudio --video-multistreams --audio-multistreams` will download and merge all 3 given formats. The resulting file will have 2 video streams and 2 audio streams. But `-f bestvideo+best+bestaudio --no-video-multistreams` will download and merge only `bestvideo` and `bestaudio`. `best` is ignored since another format containing a video stream (`bestvideo`) has already been selected. The order of the formats is therefore important. `-f best+bestaudio --no-audio-multistreams` will download and merge both formats while `-f bestaudio+best --no-audio-multistreams` will ignore `best` and download only `bestaudio`.
|
||||||
|
|
||||||
## Filtering Formats
|
## Filtering Formats
|
||||||
|
|
||||||
@@ -1124,7 +1169,7 @@ You can change the criteria for being considered the `best` by using `-S` (`--fo
|
|||||||
- `lang`: Language preference as given by the extractor
|
- `lang`: Language preference as given by the extractor
|
||||||
- `quality`: The quality of the format as given by the extractor
|
- `quality`: The quality of the format as given by the extractor
|
||||||
- `source`: Preference of the source as given by the extractor
|
- `source`: Preference of the source as given by the extractor
|
||||||
- `proto`: Protocol used for download (`https`/`ftps` > `http`/`ftp` > `m3u8_native` > `m3u8` > `http_dash_segments` > other > `mms`/`rtsp` > unknown > `f4f`/`f4m`)
|
- `proto`: Protocol used for download (`https`/`ftps` > `http`/`ftp` > `m3u8_native`/`m3u8` > `http_dash_segments`> `websocket_frag` > other > `mms`/`rtsp` > unknown > `f4f`/`f4m`)
|
||||||
- `vcodec`: Video Codec (`av01` > `vp9.2` > `vp9` > `h265` > `h264` > `vp8` > `h263` > `theora` > other > unknown)
|
- `vcodec`: Video Codec (`av01` > `vp9.2` > `vp9` > `h265` > `h264` > `vp8` > `h263` > `theora` > other > unknown)
|
||||||
- `acodec`: Audio Codec (`opus` > `vorbis` > `aac` > `mp4a` > `mp3` > `ac3` > `dts` > other > unknown)
|
- `acodec`: Audio Codec (`opus` > `vorbis` > `aac` > `mp4a` > `mp3` > `ac3` > `dts` > other > unknown)
|
||||||
- `codec`: Equivalent to `vcodec,acodec`
|
- `codec`: Equivalent to `vcodec,acodec`
|
||||||
@@ -1305,6 +1350,29 @@ $ yt-dlp --parse-metadata 'description:(?s)(?P<meta_comment>.+)' --add-metadata
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# EXTRACTOR ARGUMENTS
|
||||||
|
|
||||||
|
Some extractors accept additional arguments which can be passed using `--extractor-args KEY:ARGS`. `ARGS` is a `;` (semicolon) seperated string of `ARG=VAL1,VAL2`. Eg: `--extractor-args "youtube:skip=dash,hls;player_client=android" --extractor-args "funimation:version=uncut"`
|
||||||
|
|
||||||
|
The following extractors use this feature:
|
||||||
|
* **youtube**
|
||||||
|
* `skip`: `hls` or `dash` (or both) to skip download of the respective manifests
|
||||||
|
* `player_client`: Clients to extract video data from. The main clients are `web`, `android`, `ios`, `mweb`. These also have `_music`, `_embedded`, `_agegate`, and `_creator` variants (Eg: `web_embedded`) (`mweb` has only `_agegate`). By default, `android,web` is used, but the agegate and creator variants are added as required for age-gated videos. Similarly the music variants are added for `music.youtube.com` urls. You can also use `all` to use all the clients
|
||||||
|
* `player_skip`: `configs` - skip any requests for client configs and use defaults
|
||||||
|
* `comment_sort`: `top` or `new` (default) - choose comment sorting mode (on YouTube's side).
|
||||||
|
* `max_comments`: maximum amount of comments to download (default all).
|
||||||
|
* `max_comment_depth`: maximum depth for nested comments. YouTube supports depths 1 or 2 (default).
|
||||||
|
|
||||||
|
* **funimation**
|
||||||
|
* `language`: Languages to extract. Eg: `funimation:language=english,japanese`
|
||||||
|
* `version`: The video version to extract - `uncut` or `simulcast`
|
||||||
|
|
||||||
|
* **vikiChannel**
|
||||||
|
* `video_types`: Types of videos to download - one or more of `episodes`, `movies`, `clips`, `trailers`
|
||||||
|
|
||||||
|
NOTE: These options may be changed/removed in the future without concern for backward compatibility
|
||||||
|
|
||||||
|
|
||||||
# PLUGINS
|
# PLUGINS
|
||||||
|
|
||||||
Plugins are loaded from `<root-dir>/ytdlp_plugins/<type>/__init__.py`. Currently only `extractor` plugins are supported. Support for `downloader` and `postprocessor` plugins may be added in the future. See [ytdlp_plugins](ytdlp_plugins) for example.
|
Plugins are loaded from `<root-dir>/ytdlp_plugins/<type>/__init__.py`. Currently only `extractor` plugins are supported. Support for `downloader` and `postprocessor` plugins may be added in the future. See [ytdlp_plugins](ytdlp_plugins) for example.
|
||||||
@@ -1315,8 +1383,8 @@ Plugins are loaded from `<root-dir>/ytdlp_plugins/<type>/__init__.py`. Currently
|
|||||||
|
|
||||||
These are all the deprecated options and the current alternative to achieve the same effect
|
These are all the deprecated options and the current alternative to achieve the same effect
|
||||||
|
|
||||||
#### Not recommended
|
#### Redundant options
|
||||||
While these options still work, their use is not recommended since there are other alternatives to achieve the same
|
While these options are redundant, they are still expected to be used due to their ease of use
|
||||||
|
|
||||||
--get-description --print description
|
--get-description --print description
|
||||||
--get-duration --print duration_string
|
--get-duration --print duration_string
|
||||||
@@ -1326,6 +1394,11 @@ While these options still work, their use is not recommended since there are oth
|
|||||||
--get-thumbnail --print thumbnail
|
--get-thumbnail --print thumbnail
|
||||||
-e, --get-title --print title
|
-e, --get-title --print title
|
||||||
-g, --get-url --print urls
|
-g, --get-url --print urls
|
||||||
|
|
||||||
|
|
||||||
|
#### Not recommended
|
||||||
|
While these options still work, their use is not recommended since there are other alternatives to achieve the same
|
||||||
|
|
||||||
--all-formats -f all
|
--all-formats -f all
|
||||||
--all-subs --sub-langs all --write-subs
|
--all-subs --sub-langs all --write-subs
|
||||||
--autonumber-size NUMBER Use string formatting. Eg: %(autonumber)03d
|
--autonumber-size NUMBER Use string formatting. Eg: %(autonumber)03d
|
||||||
@@ -1336,8 +1409,17 @@ While these options still work, their use is not recommended since there are oth
|
|||||||
--list-formats-old --compat-options list-formats (Alias: --no-list-formats-as-table)
|
--list-formats-old --compat-options list-formats (Alias: --no-list-formats-as-table)
|
||||||
--list-formats-as-table --compat-options -list-formats [Default] (Alias: --no-list-formats-old)
|
--list-formats-as-table --compat-options -list-formats [Default] (Alias: --no-list-formats-old)
|
||||||
--sponskrub-args ARGS --ppa "sponskrub:ARGS"
|
--sponskrub-args ARGS --ppa "sponskrub:ARGS"
|
||||||
--test Used by developers for testing extractors. Not intended for the end user
|
--youtube-skip-dash-manifest --extractor-args "youtube:skip=dash" (Alias: --no-youtube-include-dash-manifest)
|
||||||
--youtube-print-sig-code Used for testing youtube signatures
|
--youtube-skip-hls-manifest --extractor-args "youtube:skip=hls" (Alias: --no-youtube-include-hls-manifest)
|
||||||
|
--youtube-include-dash-manifest Default (Alias: --no-youtube-skip-dash-manifest)
|
||||||
|
--youtube-include-hls-manifest Default (Alias: --no-youtube-skip-hls-manifest)
|
||||||
|
|
||||||
|
|
||||||
|
#### Developer options
|
||||||
|
These options are not intended to be used by the end-user
|
||||||
|
|
||||||
|
--test For testing extractors
|
||||||
|
--youtube-print-sig-code For testing youtube signatures
|
||||||
|
|
||||||
|
|
||||||
#### Old aliases
|
#### Old aliases
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# UNUSED
|
||||||
|
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB |
@@ -1,6 +1,6 @@
|
|||||||
# Unused
|
# Unused
|
||||||
|
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import optparse
|
import optparse
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import codecs
|
import codecs
|
||||||
|
|||||||
0
devscripts/gh-pages/add-version.py → devscripts/gh-pages.unused/add-version.py
Executable file → Normal file
0
devscripts/gh-pages/add-version.py → devscripts/gh-pages.unused/add-version.py
Executable file → Normal file
0
devscripts/gh-pages/generate-download.py → devscripts/gh-pages.unused/generate-download.py
Executable file → Normal file
0
devscripts/gh-pages/generate-download.py → devscripts/gh-pages.unused/generate-download.py
Executable file → Normal file
0
devscripts/gh-pages/sign-versions.py → devscripts/gh-pages.unused/sign-versions.py
Executable file → Normal file
0
devscripts/gh-pages/sign-versions.py → devscripts/gh-pages.unused/sign-versions.py
Executable file → Normal file
2
devscripts/gh-pages/update-copyright.py → devscripts/gh-pages.unused/update-copyright.py
Executable file → Normal file
2
devscripts/gh-pages/update-copyright.py → devscripts/gh-pages.unused/update-copyright.py
Executable file → Normal file
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import with_statement, unicode_literals
|
from __future__ import with_statement, unicode_literals
|
||||||
0
devscripts/gh-pages/update-feed.py → devscripts/gh-pages.unused/update-feed.py
Executable file → Normal file
0
devscripts/gh-pages/update-feed.py → devscripts/gh-pages.unused/update-feed.py
Executable file → Normal file
0
devscripts/gh-pages/update-sites.py → devscripts/gh-pages.unused/update-sites.py
Executable file → Normal file
0
devscripts/gh-pages/update-sites.py → devscripts/gh-pages.unused/update-sites.py
Executable file → Normal file
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|||||||
BIN
devscripts/logo.ico
Normal file
BIN
devscripts/logo.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
# import io
|
# import io
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals, print_function
|
from __future__ import unicode_literals, print_function
|
||||||
|
|
||||||
from inspect import getsource
|
from inspect import getsource
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# yt-dlp --help | make_readme.py
|
||||||
|
# This must be run in a console of correct width
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# Unused
|
# Unused
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# IMPORTANT: the following assumptions are made
|
# IMPORTANT: the following assumptions are made
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
|
@setlocal
|
||||||
@echo off
|
@echo off
|
||||||
|
cd /d %~dp0..
|
||||||
|
|
||||||
rem Keep this list in sync with the `offlinetest` target in Makefile
|
if ["%~1"]==[""] (
|
||||||
set DOWNLOAD_TESTS="age_restriction^|download^|iqiyi_sdk_interpreter^|socks^|subtitles^|write_annotations^|youtube_lists^|youtube_signature^|post_hooks"
|
set "test_set="
|
||||||
|
) else if ["%~1"]==["core"] (
|
||||||
if "%YTDL_TEST_SET%" == "core" (
|
set "test_set=-k "not download""
|
||||||
set test_set="-I test_("%DOWNLOAD_TESTS%")\.py"
|
) else if ["%~1"]==["download"] (
|
||||||
set multiprocess_args=""
|
set "test_set=-k download"
|
||||||
) else if "%YTDL_TEST_SET%" == "download" (
|
|
||||||
set test_set="-I test_(?!"%DOWNLOAD_TESTS%").+\.py"
|
|
||||||
set multiprocess_args="--processes=4 --process-timeout=540"
|
|
||||||
) else (
|
) else (
|
||||||
echo YTDL_TEST_SET is not set or invalid
|
echo.Invalid test type "%~1". Use "core" ^| "download"
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
nosetests test --verbose %test_set:"=% %multiprocess_args:"=%
|
pytest %test_set%
|
||||||
|
|||||||
@@ -1,22 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/sh
|
||||||
|
|
||||||
# Keep this list in sync with the `offlinetest` target in Makefile
|
if [ -z $1 ]; then
|
||||||
DOWNLOAD_TESTS="age_restriction|download|iqiyi_sdk_interpreter|overwrites|socks|subtitles|write_annotations|youtube_lists|youtube_signature|post_hooks"
|
test_set='test'
|
||||||
|
elif [ $1 = 'core' ]; then
|
||||||
|
test_set='not download'
|
||||||
|
elif [ $1 = 'download' ]; then
|
||||||
|
test_set='download'
|
||||||
|
else
|
||||||
|
echo 'Invalid test type "'$1'". Use "core" | "download"'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
test_set=""
|
echo python3 -m pytest -k $test_set
|
||||||
multiprocess_args=""
|
python3 -m pytest -k "$test_set"
|
||||||
|
|
||||||
case "$YTDL_TEST_SET" in
|
|
||||||
core)
|
|
||||||
test_set="-I test_($DOWNLOAD_TESTS)\.py"
|
|
||||||
;;
|
|
||||||
download)
|
|
||||||
test_set="-I test_(?!$DOWNLOAD_TESTS).+\.py"
|
|
||||||
multiprocess_args="--processes=4 --process-timeout=540"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
break
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
nosetests test --verbose $test_set $multiprocess_args
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Unused
|
# Unused
|
||||||
|
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
# import urllib.request
|
# import urllib.request
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# UNUSED
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Run with as parameter a setup.py that works in the current directory
|
# Run with as parameter a setup.py that works in the current directory
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|||||||
5
docs/Collaborators.md
Normal file
5
docs/Collaborators.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
orphan: true
|
||||||
|
---
|
||||||
|
```{include} ../Collaborators.md
|
||||||
|
```
|
||||||
22
pyinst.py
22
pyinst.py
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
@@ -6,6 +6,7 @@ import sys
|
|||||||
# import os
|
# import os
|
||||||
import platform
|
import platform
|
||||||
|
|
||||||
|
from PyInstaller.utils.hooks import collect_submodules
|
||||||
from PyInstaller.utils.win32.versioninfo import (
|
from PyInstaller.utils.win32.versioninfo import (
|
||||||
VarStruct, VarFileInfo, StringStruct, StringTable,
|
VarStruct, VarFileInfo, StringStruct, StringTable,
|
||||||
StringFileInfo, FixedFileInfo, VSVersionInfo, SetVersion,
|
StringFileInfo, FixedFileInfo, VSVersionInfo, SetVersion,
|
||||||
@@ -17,7 +18,7 @@ assert arch in ('32', '64')
|
|||||||
print('Building %sbit version' % arch)
|
print('Building %sbit version' % arch)
|
||||||
_x86 = '_x86' if arch == '32' else ''
|
_x86 = '_x86' if arch == '32' else ''
|
||||||
|
|
||||||
FILE_DESCRIPTION = 'Media Downloader%s' % (' (32 Bit)' if _x86 else '')
|
FILE_DESCRIPTION = 'yt-dlp%s' % (' (32 Bit)' if _x86 else '')
|
||||||
|
|
||||||
# root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
# root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
||||||
# print('Changing working directory to %s' % root_dir)
|
# print('Changing working directory to %s' % root_dir)
|
||||||
@@ -58,22 +59,23 @@ VERSION_FILE = VSVersionInfo(
|
|||||||
),
|
),
|
||||||
StringStruct('OriginalFilename', 'yt-dlp%s.exe' % _x86),
|
StringStruct('OriginalFilename', 'yt-dlp%s.exe' % _x86),
|
||||||
StringStruct('ProductName', 'yt-dlp%s' % _x86),
|
StringStruct('ProductName', 'yt-dlp%s' % _x86),
|
||||||
StringStruct('ProductVersion', '%s%s' % (VERSION, _x86)),
|
StringStruct(
|
||||||
|
'ProductVersion',
|
||||||
|
'%s%s on Python %s' % (VERSION, _x86, platform.python_version())),
|
||||||
])]),
|
])]),
|
||||||
VarFileInfo([VarStruct('Translation', [0, 1200])])
|
VarFileInfo([VarStruct('Translation', [0, 1200])])
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dependancies = ['Crypto', 'mutagen'] + collect_submodules('websockets')
|
||||||
|
excluded_modules = ['test', 'ytdlp_plugins', 'youtube-dl', 'youtube-dlc']
|
||||||
|
|
||||||
PyInstaller.__main__.run([
|
PyInstaller.__main__.run([
|
||||||
'--name=yt-dlp%s' % _x86,
|
'--name=yt-dlp%s' % _x86,
|
||||||
'--onefile',
|
'--onefile',
|
||||||
'--icon=devscripts/cloud.ico',
|
'--icon=devscripts/logo.ico',
|
||||||
'--exclude-module=youtube_dl',
|
*[f'--exclude-module={module}' for module in excluded_modules],
|
||||||
'--exclude-module=youtube_dlc',
|
*[f'--hidden-import={module}' for module in dependancies],
|
||||||
'--exclude-module=test',
|
|
||||||
'--exclude-module=ytdlp_plugins',
|
|
||||||
'--hidden-import=mutagen',
|
|
||||||
'--hidden-import=Crypto',
|
|
||||||
'--upx-exclude=vcruntime140.dll',
|
'--upx-exclude=vcruntime140.dll',
|
||||||
'yt_dlp/__main__.py',
|
'yt_dlp/__main__.py',
|
||||||
])
|
])
|
||||||
|
|||||||
4
pytest.ini
Normal file
4
pytest.ini
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
[pytest]
|
||||||
|
addopts = -ra -v --strict-markers
|
||||||
|
markers =
|
||||||
|
download
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
mutagen
|
mutagen
|
||||||
pycryptodome
|
pycryptodome
|
||||||
|
websockets
|
||||||
|
|||||||
75
setup.py
75
setup.py
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from setuptools import setup, Command, find_packages
|
from setuptools import setup, Command, find_packages
|
||||||
@@ -9,45 +9,44 @@ from distutils.spawn import spawn
|
|||||||
|
|
||||||
|
|
||||||
# Get the version from yt_dlp/version.py without importing the package
|
# Get the version from yt_dlp/version.py without importing the package
|
||||||
exec(compile(open('yt_dlp/version.py').read(),
|
exec(compile(open('yt_dlp/version.py').read(), 'yt_dlp/version.py', 'exec'))
|
||||||
'yt_dlp/version.py', 'exec'))
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION = 'Command-line program to download videos from YouTube.com and many other other video platforms.'
|
DESCRIPTION = 'Command-line program to download videos from YouTube.com and many other other video platforms.'
|
||||||
|
|
||||||
LONG_DESCRIPTION = '\n\n'.join((
|
LONG_DESCRIPTION = '\n\n'.join((
|
||||||
'Official repository: <https://github.com/yt-dlp/yt-dlp>',
|
'Official repository: <https://github.com/yt-dlp/yt-dlp>',
|
||||||
'**PS**: Many links in this document will not work since this is a copy of the README.md from Github',
|
'**PS**: Some links in this document will not work since this is a copy of the README.md from Github',
|
||||||
open('README.md', 'r', encoding='utf-8').read()))
|
open('README.md', 'r', encoding='utf-8').read()))
|
||||||
|
|
||||||
REQUIREMENTS = ['mutagen', 'pycryptodome']
|
REQUIREMENTS = ['mutagen', 'pycryptodome', 'websockets']
|
||||||
|
|
||||||
|
if sys.argv[1:2] == ['py2exe']:
|
||||||
|
raise NotImplementedError('py2exe is not currently supported; instead, use "pyinst.py" to build with pyinstaller')
|
||||||
|
|
||||||
|
|
||||||
if len(sys.argv) >= 2 and sys.argv[1] == 'py2exe':
|
files_spec = [
|
||||||
print('inv')
|
('share/bash-completion/completions', ['completions/bash/yt-dlp']),
|
||||||
else:
|
('share/zsh/site-functions', ['completions/zsh/_yt-dlp']),
|
||||||
files_spec = [
|
('share/fish/vendor_completions.d', ['completions/fish/yt-dlp.fish']),
|
||||||
('share/bash-completion/completions', ['completions/bash/yt-dlp']),
|
('share/doc/yt_dlp', ['README.txt']),
|
||||||
('share/zsh/site-functions', ['completions/zsh/_yt-dlp']),
|
('share/man/man1', ['yt-dlp.1'])
|
||||||
('share/fish/vendor_completions.d', ['completions/fish/yt-dlp.fish']),
|
]
|
||||||
('share/doc/yt_dlp', ['README.txt']),
|
root = os.path.dirname(os.path.abspath(__file__))
|
||||||
('share/man/man1', ['yt-dlp.1'])
|
data_files = []
|
||||||
]
|
for dirname, files in files_spec:
|
||||||
root = os.path.dirname(os.path.abspath(__file__))
|
resfiles = []
|
||||||
data_files = []
|
for fn in files:
|
||||||
for dirname, files in files_spec:
|
if not os.path.exists(fn):
|
||||||
resfiles = []
|
warnings.warn('Skipping file %s since it is not present. Try running `make pypi-files` first' % fn)
|
||||||
for fn in files:
|
else:
|
||||||
if not os.path.exists(fn):
|
resfiles.append(fn)
|
||||||
warnings.warn('Skipping file %s since it is not present. Try running `make pypi-files` first.' % fn)
|
data_files.append((dirname, resfiles))
|
||||||
else:
|
|
||||||
resfiles.append(fn)
|
|
||||||
data_files.append((dirname, resfiles))
|
|
||||||
|
|
||||||
params = {
|
params = {
|
||||||
'data_files': data_files,
|
'data_files': data_files,
|
||||||
}
|
}
|
||||||
params['entry_points'] = {'console_scripts': ['yt-dlp = yt_dlp:main']}
|
params['entry_points'] = {'console_scripts': ['yt-dlp = yt_dlp:main']}
|
||||||
|
|
||||||
|
|
||||||
class build_lazy_extractors(Command):
|
class build_lazy_extractors(Command):
|
||||||
@@ -61,10 +60,8 @@ class build_lazy_extractors(Command):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
spawn(
|
spawn([sys.executable, 'devscripts/make_lazy_extractors.py', 'yt_dlp/extractor/lazy_extractors.py'],
|
||||||
[sys.executable, 'devscripts/make_lazy_extractors.py', 'yt_dlp/extractor/lazy_extractors.py'],
|
dry_run=self.dry_run)
|
||||||
dry_run=self.dry_run,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
packages = find_packages(exclude=('youtube_dl', 'test', 'ytdlp_plugins'))
|
packages = find_packages(exclude=('youtube_dl', 'test', 'ytdlp_plugins'))
|
||||||
@@ -91,26 +88,16 @@ setup(
|
|||||||
'Development Status :: 5 - Production/Stable',
|
'Development Status :: 5 - Production/Stable',
|
||||||
'Environment :: Console',
|
'Environment :: Console',
|
||||||
'Programming Language :: Python',
|
'Programming Language :: Python',
|
||||||
'Programming Language :: Python :: 2',
|
|
||||||
'Programming Language :: Python :: 2.6',
|
|
||||||
'Programming Language :: Python :: 2.7',
|
|
||||||
'Programming Language :: Python :: 3',
|
|
||||||
'Programming Language :: Python :: 3.2',
|
|
||||||
'Programming Language :: Python :: 3.3',
|
|
||||||
'Programming Language :: Python :: 3.4',
|
|
||||||
'Programming Language :: Python :: 3.5',
|
|
||||||
'Programming Language :: Python :: 3.6',
|
'Programming Language :: Python :: 3.6',
|
||||||
'Programming Language :: Python :: 3.7',
|
'Programming Language :: Python :: 3.7',
|
||||||
'Programming Language :: Python :: 3.8',
|
'Programming Language :: Python :: 3.8',
|
||||||
'Programming Language :: Python :: Implementation',
|
'Programming Language :: Python :: Implementation',
|
||||||
'Programming Language :: Python :: Implementation :: CPython',
|
'Programming Language :: Python :: Implementation :: CPython',
|
||||||
'Programming Language :: Python :: Implementation :: IronPython',
|
|
||||||
'Programming Language :: Python :: Implementation :: Jython',
|
|
||||||
'Programming Language :: Python :: Implementation :: PyPy',
|
'Programming Language :: Python :: Implementation :: PyPy',
|
||||||
'License :: Public Domain',
|
'License :: Public Domain',
|
||||||
'Operating System :: OS Independent',
|
'Operating System :: OS Independent',
|
||||||
],
|
],
|
||||||
python_requires='>=2.6',
|
python_requires='>=3.6',
|
||||||
|
|
||||||
cmdclass={'build_lazy_extractors': build_lazy_extractors},
|
cmdclass={'build_lazy_extractors': build_lazy_extractors},
|
||||||
**params
|
**params
|
||||||
|
|||||||
@@ -82,6 +82,7 @@
|
|||||||
- **audiomack**
|
- **audiomack**
|
||||||
- **audiomack:album**
|
- **audiomack:album**
|
||||||
- **Audius**: Audius.co
|
- **Audius**: Audius.co
|
||||||
|
- **audius:artist**: Audius.co profile/artist pages
|
||||||
- **audius:playlist**: Audius.co playlists
|
- **audius:playlist**: Audius.co playlists
|
||||||
- **audius:track**: Audius track ID or API link. Prepend with "audius:"
|
- **audius:track**: Audius track ID or API link. Prepend with "audius:"
|
||||||
- **AWAAN**
|
- **AWAAN**
|
||||||
@@ -224,8 +225,7 @@
|
|||||||
- **Culturebox**
|
- **Culturebox**
|
||||||
- **CultureUnplugged**
|
- **CultureUnplugged**
|
||||||
- **curiositystream**
|
- **curiositystream**
|
||||||
- **curiositystream:collections**
|
- **curiositystream:collection**
|
||||||
- **curiositystream:series**
|
|
||||||
- **CWTV**
|
- **CWTV**
|
||||||
- **DagelijkseKost**: dagelijksekost.een.be
|
- **DagelijkseKost**: dagelijksekost.een.be
|
||||||
- **DailyMail**
|
- **DailyMail**
|
||||||
@@ -259,6 +259,7 @@
|
|||||||
- **dlive:vod**
|
- **dlive:vod**
|
||||||
- **DoodStream**
|
- **DoodStream**
|
||||||
- **Dotsub**
|
- **Dotsub**
|
||||||
|
- **Douyin**
|
||||||
- **DouyuShow**
|
- **DouyuShow**
|
||||||
- **DouyuTV**: 斗鱼
|
- **DouyuTV**: 斗鱼
|
||||||
- **DPlay**
|
- **DPlay**
|
||||||
@@ -306,6 +307,8 @@
|
|||||||
- **EyedoTV**
|
- **EyedoTV**
|
||||||
- **facebook**
|
- **facebook**
|
||||||
- **FacebookPluginsVideo**
|
- **FacebookPluginsVideo**
|
||||||
|
- **fancode:live**
|
||||||
|
- **fancode:vod**
|
||||||
- **faz.net**
|
- **faz.net**
|
||||||
- **fc2**
|
- **fc2**
|
||||||
- **fc2:embed**
|
- **fc2:embed**
|
||||||
@@ -342,6 +345,8 @@
|
|||||||
- **FrontendMastersLesson**
|
- **FrontendMastersLesson**
|
||||||
- **FujiTVFODPlus7**
|
- **FujiTVFODPlus7**
|
||||||
- **Funimation**
|
- **Funimation**
|
||||||
|
- **funimation:page**
|
||||||
|
- **funimation:show**
|
||||||
- **Funk**
|
- **Funk**
|
||||||
- **Fusion**
|
- **Fusion**
|
||||||
- **Fux**
|
- **Fux**
|
||||||
@@ -391,6 +396,7 @@
|
|||||||
- **HotNewHipHop**
|
- **HotNewHipHop**
|
||||||
- **hotstar**
|
- **hotstar**
|
||||||
- **hotstar:playlist**
|
- **hotstar:playlist**
|
||||||
|
- **hotstar:series**
|
||||||
- **Howcast**
|
- **Howcast**
|
||||||
- **HowStuffWorks**
|
- **HowStuffWorks**
|
||||||
- **hrfernsehen**
|
- **hrfernsehen**
|
||||||
@@ -494,8 +500,6 @@
|
|||||||
- **LinuxAcademy**
|
- **LinuxAcademy**
|
||||||
- **LiTV**
|
- **LiTV**
|
||||||
- **LiveJournal**
|
- **LiveJournal**
|
||||||
- **LiveLeak**
|
|
||||||
- **LiveLeakEmbed**
|
|
||||||
- **livestream**
|
- **livestream**
|
||||||
- **livestream:original**
|
- **livestream:original**
|
||||||
- **LnkGo**
|
- **LnkGo**
|
||||||
@@ -724,7 +728,9 @@
|
|||||||
- **PalcoMP3:video**
|
- **PalcoMP3:video**
|
||||||
- **pandora.tv**: 판도라TV
|
- **pandora.tv**: 판도라TV
|
||||||
- **ParamountNetwork**
|
- **ParamountNetwork**
|
||||||
|
- **ParamountPlusSeries**
|
||||||
- **parliamentlive.tv**: UK parliament videos
|
- **parliamentlive.tv**: UK parliament videos
|
||||||
|
- **Parlview**
|
||||||
- **Patreon**
|
- **Patreon**
|
||||||
- **pbs**: Public Broadcasting Service (PBS) and member stations: PBS: Public Broadcasting Service, APT - Alabama Public Television (WBIQ), GPB/Georgia Public Broadcasting (WGTV), Mississippi Public Broadcasting (WMPN), Nashville Public Television (WNPT), WFSU-TV (WFSU), WSRE (WSRE), WTCI (WTCI), WPBA/Channel 30 (WPBA), Alaska Public Media (KAKM), Arizona PBS (KAET), KNME-TV/Channel 5 (KNME), Vegas PBS (KLVX), AETN/ARKANSAS ETV NETWORK (KETS), KET (WKLE), WKNO/Channel 10 (WKNO), LPB/LOUISIANA PUBLIC BROADCASTING (WLPB), OETA (KETA), Ozarks Public Television (KOZK), WSIU Public Broadcasting (WSIU), KEET TV (KEET), KIXE/Channel 9 (KIXE), KPBS San Diego (KPBS), KQED (KQED), KVIE Public Television (KVIE), PBS SoCal/KOCE (KOCE), ValleyPBS (KVPT), CONNECTICUT PUBLIC TELEVISION (WEDH), KNPB Channel 5 (KNPB), SOPTV (KSYS), Rocky Mountain PBS (KRMA), KENW-TV3 (KENW), KUED Channel 7 (KUED), Wyoming PBS (KCWC), Colorado Public Television / KBDI 12 (KBDI), KBYU-TV (KBYU), Thirteen/WNET New York (WNET), WGBH/Channel 2 (WGBH), WGBY (WGBY), NJTV Public Media NJ (WNJT), WLIW21 (WLIW), mpt/Maryland Public Television (WMPB), WETA Television and Radio (WETA), WHYY (WHYY), PBS 39 (WLVT), WVPT - Your Source for PBS and More! (WVPT), Howard University Television (WHUT), WEDU PBS (WEDU), WGCU Public Media (WGCU), WPBT2 (WPBT), WUCF TV (WUCF), WUFT/Channel 5 (WUFT), WXEL/Channel 42 (WXEL), WLRN/Channel 17 (WLRN), WUSF Public Broadcasting (WUSF), ETV (WRLK), UNC-TV (WUNC), PBS Hawaii - Oceanic Cable Channel 10 (KHET), Idaho Public Television (KAID), KSPS (KSPS), OPB (KOPB), KWSU/Channel 10 & KTNW/Channel 31 (KWSU), WILL-TV (WILL), Network Knowledge - WSEC/Springfield (WSEC), WTTW11 (WTTW), Iowa Public Television/IPTV (KDIN), Nine Network (KETC), PBS39 Fort Wayne (WFWA), WFYI Indianapolis (WFYI), Milwaukee Public Television (WMVS), WNIN (WNIN), WNIT Public Television (WNIT), WPT (WPNE), WVUT/Channel 22 (WVUT), WEIU/Channel 51 (WEIU), WQPT-TV (WQPT), WYCC PBS Chicago (WYCC), WIPB-TV (WIPB), WTIU (WTIU), CET (WCET), ThinkTVNetwork (WPTD), WBGU-TV (WBGU), WGVU TV (WGVU), NET1 (KUON), Pioneer Public Television (KWCM), SDPB Television (KUSD), TPT (KTCA), KSMQ (KSMQ), KPTS/Channel 8 (KPTS), KTWU/Channel 11 (KTWU), East Tennessee PBS (WSJK), WCTE-TV (WCTE), WLJT, Channel 11 (WLJT), WOSU TV (WOSU), WOUB/WOUC (WOUB), WVPB (WVPB), WKYU-PBS (WKYU), KERA 13 (KERA), MPBN (WCBB), Mountain Lake PBS (WCFE), NHPTV (WENH), Vermont PBS (WETK), witf (WITF), WQED Multimedia (WQED), WMHT Educational Telecommunications (WMHT), Q-TV (WDCQ), WTVS Detroit Public TV (WTVS), CMU Public Television (WCMU), WKAR-TV (WKAR), WNMU-TV Public TV 13 (WNMU), WDSE - WRPT (WDSE), WGTE TV (WGTE), Lakeland Public Television (KAWE), KMOS-TV - Channels 6.1, 6.2 and 6.3 (KMOS), MontanaPBS (KUSM), KRWG/Channel 22 (KRWG), KACV (KACV), KCOS/Channel 13 (KCOS), WCNY/Channel 24 (WCNY), WNED (WNED), WPBS (WPBS), WSKG Public TV (WSKG), WXXI (WXXI), WPSU (WPSU), WVIA Public Media Studios (WVIA), WTVI (WTVI), Western Reserve PBS (WNEO), WVIZ/PBS ideastream (WVIZ), KCTS 9 (KCTS), Basin PBS (KPBT), KUHT / Channel 8 (KUHT), KLRN (KLRN), KLRU (KLRU), WTJX Channel 12 (WTJX), WCVE PBS (WCVE), KBTC Public Television (KBTC)
|
- **pbs**: Public Broadcasting Service (PBS) and member stations: PBS: Public Broadcasting Service, APT - Alabama Public Television (WBIQ), GPB/Georgia Public Broadcasting (WGTV), Mississippi Public Broadcasting (WMPN), Nashville Public Television (WNPT), WFSU-TV (WFSU), WSRE (WSRE), WTCI (WTCI), WPBA/Channel 30 (WPBA), Alaska Public Media (KAKM), Arizona PBS (KAET), KNME-TV/Channel 5 (KNME), Vegas PBS (KLVX), AETN/ARKANSAS ETV NETWORK (KETS), KET (WKLE), WKNO/Channel 10 (WKNO), LPB/LOUISIANA PUBLIC BROADCASTING (WLPB), OETA (KETA), Ozarks Public Television (KOZK), WSIU Public Broadcasting (WSIU), KEET TV (KEET), KIXE/Channel 9 (KIXE), KPBS San Diego (KPBS), KQED (KQED), KVIE Public Television (KVIE), PBS SoCal/KOCE (KOCE), ValleyPBS (KVPT), CONNECTICUT PUBLIC TELEVISION (WEDH), KNPB Channel 5 (KNPB), SOPTV (KSYS), Rocky Mountain PBS (KRMA), KENW-TV3 (KENW), KUED Channel 7 (KUED), Wyoming PBS (KCWC), Colorado Public Television / KBDI 12 (KBDI), KBYU-TV (KBYU), Thirteen/WNET New York (WNET), WGBH/Channel 2 (WGBH), WGBY (WGBY), NJTV Public Media NJ (WNJT), WLIW21 (WLIW), mpt/Maryland Public Television (WMPB), WETA Television and Radio (WETA), WHYY (WHYY), PBS 39 (WLVT), WVPT - Your Source for PBS and More! (WVPT), Howard University Television (WHUT), WEDU PBS (WEDU), WGCU Public Media (WGCU), WPBT2 (WPBT), WUCF TV (WUCF), WUFT/Channel 5 (WUFT), WXEL/Channel 42 (WXEL), WLRN/Channel 17 (WLRN), WUSF Public Broadcasting (WUSF), ETV (WRLK), UNC-TV (WUNC), PBS Hawaii - Oceanic Cable Channel 10 (KHET), Idaho Public Television (KAID), KSPS (KSPS), OPB (KOPB), KWSU/Channel 10 & KTNW/Channel 31 (KWSU), WILL-TV (WILL), Network Knowledge - WSEC/Springfield (WSEC), WTTW11 (WTTW), Iowa Public Television/IPTV (KDIN), Nine Network (KETC), PBS39 Fort Wayne (WFWA), WFYI Indianapolis (WFYI), Milwaukee Public Television (WMVS), WNIN (WNIN), WNIT Public Television (WNIT), WPT (WPNE), WVUT/Channel 22 (WVUT), WEIU/Channel 51 (WEIU), WQPT-TV (WQPT), WYCC PBS Chicago (WYCC), WIPB-TV (WIPB), WTIU (WTIU), CET (WCET), ThinkTVNetwork (WPTD), WBGU-TV (WBGU), WGVU TV (WGVU), NET1 (KUON), Pioneer Public Television (KWCM), SDPB Television (KUSD), TPT (KTCA), KSMQ (KSMQ), KPTS/Channel 8 (KPTS), KTWU/Channel 11 (KTWU), East Tennessee PBS (WSJK), WCTE-TV (WCTE), WLJT, Channel 11 (WLJT), WOSU TV (WOSU), WOUB/WOUC (WOUB), WVPB (WVPB), WKYU-PBS (WKYU), KERA 13 (KERA), MPBN (WCBB), Mountain Lake PBS (WCFE), NHPTV (WENH), Vermont PBS (WETK), witf (WITF), WQED Multimedia (WQED), WMHT Educational Telecommunications (WMHT), Q-TV (WDCQ), WTVS Detroit Public TV (WTVS), CMU Public Television (WCMU), WKAR-TV (WKAR), WNMU-TV Public TV 13 (WNMU), WDSE - WRPT (WDSE), WGTE TV (WGTE), Lakeland Public Television (KAWE), KMOS-TV - Channels 6.1, 6.2 and 6.3 (KMOS), MontanaPBS (KUSM), KRWG/Channel 22 (KRWG), KACV (KACV), KCOS/Channel 13 (KCOS), WCNY/Channel 24 (WCNY), WNED (WNED), WPBS (WPBS), WSKG Public TV (WSKG), WXXI (WXXI), WPSU (WPSU), WVIA Public Media Studios (WVIA), WTVI (WTVI), Western Reserve PBS (WNEO), WVIZ/PBS ideastream (WVIZ), KCTS 9 (KCTS), Basin PBS (KPBT), KUHT / Channel 8 (KUHT), KLRN (KLRN), KLRU (KLRU), WTJX Channel 12 (WTJX), WCVE PBS (WCVE), KBTC Public Television (KBTC)
|
||||||
- **PearVideo**
|
- **PearVideo**
|
||||||
@@ -748,6 +754,7 @@
|
|||||||
- **play.fm**
|
- **play.fm**
|
||||||
- **player.sky.it**
|
- **player.sky.it**
|
||||||
- **PlayPlusTV**
|
- **PlayPlusTV**
|
||||||
|
- **PlayStuff**
|
||||||
- **PlaysTV**
|
- **PlaysTV**
|
||||||
- **Playtvak**: Playtvak.cz, iDNES.cz and Lidovky.cz
|
- **Playtvak**: Playtvak.cz, iDNES.cz and Lidovky.cz
|
||||||
- **Playvid**
|
- **Playvid**
|
||||||
@@ -764,6 +771,7 @@
|
|||||||
- **PopcornTV**
|
- **PopcornTV**
|
||||||
- **PornCom**
|
- **PornCom**
|
||||||
- **PornerBros**
|
- **PornerBros**
|
||||||
|
- **PornFlip**
|
||||||
- **PornHd**
|
- **PornHd**
|
||||||
- **PornHub**: PornHub and Thumbzilla
|
- **PornHub**: PornHub and Thumbzilla
|
||||||
- **PornHubPagedVideoList**
|
- **PornHubPagedVideoList**
|
||||||
@@ -806,6 +814,8 @@
|
|||||||
- **RCS**
|
- **RCS**
|
||||||
- **RCSEmbeds**
|
- **RCSEmbeds**
|
||||||
- **RCSVarious**
|
- **RCSVarious**
|
||||||
|
- **RCTIPlus**
|
||||||
|
- **RCTIPlusSeries**
|
||||||
- **RDS**: RDS.ca
|
- **RDS**: RDS.ca
|
||||||
- **RedBull**
|
- **RedBull**
|
||||||
- **RedBullEmbed**
|
- **RedBullEmbed**
|
||||||
@@ -856,6 +866,7 @@
|
|||||||
- **safari**: safaribooksonline.com online video
|
- **safari**: safaribooksonline.com online video
|
||||||
- **safari:api**
|
- **safari:api**
|
||||||
- **safari:course**: safaribooksonline.com online courses
|
- **safari:course**: safaribooksonline.com online courses
|
||||||
|
- **Saitosan**
|
||||||
- **SAKTV**
|
- **SAKTV**
|
||||||
- **SaltTV**
|
- **SaltTV**
|
||||||
- **SampleFocus**
|
- **SampleFocus**
|
||||||
@@ -863,6 +874,7 @@
|
|||||||
- **savefrom.net**
|
- **savefrom.net**
|
||||||
- **SBS**: sbs.com.au
|
- **SBS**: sbs.com.au
|
||||||
- **schooltv**
|
- **schooltv**
|
||||||
|
- **ScienceChannel**
|
||||||
- **screen.yahoo:search**: Yahoo screen search
|
- **screen.yahoo:search**: Yahoo screen search
|
||||||
- **Screencast**
|
- **Screencast**
|
||||||
- **ScreencastOMatic**
|
- **ScreencastOMatic**
|
||||||
@@ -880,6 +892,7 @@
|
|||||||
- **Shahid**
|
- **Shahid**
|
||||||
- **ShahidShow**
|
- **ShahidShow**
|
||||||
- **Shared**: shared.sx
|
- **Shared**: shared.sx
|
||||||
|
- **ShemarooMe**
|
||||||
- **ShowRoomLive**
|
- **ShowRoomLive**
|
||||||
- **simplecast**
|
- **simplecast**
|
||||||
- **simplecast:episode**
|
- **simplecast:episode**
|
||||||
@@ -899,6 +912,7 @@
|
|||||||
- **Snotr**
|
- **Snotr**
|
||||||
- **Sohu**
|
- **Sohu**
|
||||||
- **SonyLIV**
|
- **SonyLIV**
|
||||||
|
- **SonyLIVSeries**
|
||||||
- **soundcloud**
|
- **soundcloud**
|
||||||
- **soundcloud:playlist**
|
- **soundcloud:playlist**
|
||||||
- **soundcloud:search**: Soundcloud search
|
- **soundcloud:search**: Soundcloud search
|
||||||
@@ -977,6 +991,7 @@
|
|||||||
- **Telecinco**: telecinco.es, cuatro.com and mediaset.es
|
- **Telecinco**: telecinco.es, cuatro.com and mediaset.es
|
||||||
- **Telegraaf**
|
- **Telegraaf**
|
||||||
- **TeleMB**
|
- **TeleMB**
|
||||||
|
- **Telemundo**
|
||||||
- **TeleQuebec**
|
- **TeleQuebec**
|
||||||
- **TeleQuebecEmission**
|
- **TeleQuebecEmission**
|
||||||
- **TeleQuebecLive**
|
- **TeleQuebecLive**
|
||||||
@@ -998,7 +1013,6 @@
|
|||||||
- **ThisAmericanLife**
|
- **ThisAmericanLife**
|
||||||
- **ThisAV**
|
- **ThisAV**
|
||||||
- **ThisOldHouse**
|
- **ThisOldHouse**
|
||||||
- **ThisVid**
|
|
||||||
- **TikTok**
|
- **TikTok**
|
||||||
- **tinypic**: tinypic.com videos
|
- **tinypic**: tinypic.com videos
|
||||||
- **TMZ**
|
- **TMZ**
|
||||||
@@ -1060,6 +1074,8 @@
|
|||||||
- **TVPlayHome**
|
- **TVPlayHome**
|
||||||
- **Tweakers**
|
- **Tweakers**
|
||||||
- **TwitCasting**
|
- **TwitCasting**
|
||||||
|
- **TwitCastingLive**
|
||||||
|
- **TwitCastingUser**
|
||||||
- **twitch:clips**
|
- **twitch:clips**
|
||||||
- **twitch:stream**
|
- **twitch:stream**
|
||||||
- **twitch:vod**
|
- **twitch:vod**
|
||||||
@@ -1093,6 +1109,7 @@
|
|||||||
- **ustream:channel**
|
- **ustream:channel**
|
||||||
- **ustudio**
|
- **ustudio**
|
||||||
- **ustudio:embed**
|
- **ustudio:embed**
|
||||||
|
- **Utreon**
|
||||||
- **Varzesh3**
|
- **Varzesh3**
|
||||||
- **Vbox7**
|
- **Vbox7**
|
||||||
- **VeeHD**
|
- **VeeHD**
|
||||||
@@ -1121,6 +1138,8 @@
|
|||||||
- **videomore:video**
|
- **videomore:video**
|
||||||
- **VideoPress**
|
- **VideoPress**
|
||||||
- **Vidio**
|
- **Vidio**
|
||||||
|
- **VidioLive**
|
||||||
|
- **VidioPremier**
|
||||||
- **VidLii**
|
- **VidLii**
|
||||||
- **vidme**
|
- **vidme**
|
||||||
- **vidme:user**
|
- **vidme:user**
|
||||||
@@ -1160,6 +1179,7 @@
|
|||||||
- **VODPlatform**
|
- **VODPlatform**
|
||||||
- **VoiceRepublic**
|
- **VoiceRepublic**
|
||||||
- **Voot**
|
- **Voot**
|
||||||
|
- **VootSeries**
|
||||||
- **VoxMedia**
|
- **VoxMedia**
|
||||||
- **VoxMediaVolume**
|
- **VoxMediaVolume**
|
||||||
- **vpro**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl
|
- **vpro**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl
|
||||||
@@ -1189,6 +1209,7 @@
|
|||||||
- **wdr:mobile**
|
- **wdr:mobile**
|
||||||
- **WDRElefant**
|
- **WDRElefant**
|
||||||
- **WDRPage**
|
- **WDRPage**
|
||||||
|
- **web.archive:youtube**: web.archive.org saved youtube videos
|
||||||
- **Webcaster**
|
- **Webcaster**
|
||||||
- **WebcasterFeed**
|
- **WebcasterFeed**
|
||||||
- **WebOfStories**
|
- **WebOfStories**
|
||||||
|
|||||||
@@ -22,6 +22,14 @@ from yt_dlp.utils import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if "pytest" in sys.modules:
|
||||||
|
import pytest
|
||||||
|
is_download_test = pytest.mark.download
|
||||||
|
else:
|
||||||
|
def is_download_test(testClass):
|
||||||
|
return testClass
|
||||||
|
|
||||||
|
|
||||||
def get_params(override=None):
|
def get_params(override=None):
|
||||||
PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||||
"parameters.json")
|
"parameters.json")
|
||||||
@@ -190,7 +198,10 @@ def expect_info_dict(self, got_dict, expected_dict):
|
|||||||
expect_dict(self, got_dict, expected_dict)
|
expect_dict(self, got_dict, expected_dict)
|
||||||
# Check for the presence of mandatory fields
|
# Check for the presence of mandatory fields
|
||||||
if got_dict.get('_type') not in ('playlist', 'multi_video'):
|
if got_dict.get('_type') not in ('playlist', 'multi_video'):
|
||||||
for key in ('id', 'url', 'title', 'ext'):
|
mandatory_fields = ['id', 'title']
|
||||||
|
if expected_dict.get('ext'):
|
||||||
|
mandatory_fields.extend(('url', 'ext'))
|
||||||
|
for key in mandatory_fields:
|
||||||
self.assertTrue(got_dict.get(key), 'Missing mandatory field %s' % key)
|
self.assertTrue(got_dict.get(key), 'Missing mandatory field %s' % key)
|
||||||
# Check for mandatory fields that are automatically set by YoutubeDL
|
# Check for mandatory fields that are automatically set by YoutubeDL
|
||||||
for key in ['webpage_url', 'extractor', 'extractor_key']:
|
for key in ['webpage_url', 'extractor', 'extractor_key']:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"check_formats": false,
|
||||||
"consoletitle": false,
|
"consoletitle": false,
|
||||||
"continuedl": true,
|
"continuedl": true,
|
||||||
"forcedescription": false,
|
"forcedescription": false,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
@@ -10,14 +10,15 @@ import unittest
|
|||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
import json
|
||||||
|
|
||||||
from test.helper import FakeYDL, assertRegexpMatches
|
from test.helper import FakeYDL, assertRegexpMatches
|
||||||
from yt_dlp import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from yt_dlp.compat import compat_str, compat_urllib_error
|
from yt_dlp.compat import compat_os_name, compat_setenv, compat_str, compat_urllib_error
|
||||||
from yt_dlp.extractor import YoutubeIE
|
from yt_dlp.extractor import YoutubeIE
|
||||||
from yt_dlp.extractor.common import InfoExtractor
|
from yt_dlp.extractor.common import InfoExtractor
|
||||||
from yt_dlp.postprocessor.common import PostProcessor
|
from yt_dlp.postprocessor.common import PostProcessor
|
||||||
from yt_dlp.utils import ExtractorError, match_filter_func
|
from yt_dlp.utils import ExtractorError, int_or_none, match_filter_func
|
||||||
|
|
||||||
TEST_URL = 'http://localhost/sample.mp4'
|
TEST_URL = 'http://localhost/sample.mp4'
|
||||||
|
|
||||||
@@ -35,6 +36,9 @@ class YDL(FakeYDL):
|
|||||||
def to_screen(self, msg):
|
def to_screen(self, msg):
|
||||||
self.msgs.append(msg)
|
self.msgs.append(msg)
|
||||||
|
|
||||||
|
def dl(self, *args, **kwargs):
|
||||||
|
assert False, 'Downloader must not be invoked for test_YoutubeDL'
|
||||||
|
|
||||||
|
|
||||||
def _make_result(formats, **kwargs):
|
def _make_result(formats, **kwargs):
|
||||||
res = {
|
res = {
|
||||||
@@ -117,35 +121,24 @@ class TestFormatSelection(unittest.TestCase):
|
|||||||
]
|
]
|
||||||
info_dict = _make_result(formats)
|
info_dict = _make_result(formats)
|
||||||
|
|
||||||
ydl = YDL({'format': '20/47'})
|
def test(inp, *expected, multi=False):
|
||||||
ydl.process_ie_result(info_dict.copy())
|
ydl = YDL({
|
||||||
downloaded = ydl.downloaded_info_dicts[0]
|
'format': inp,
|
||||||
self.assertEqual(downloaded['format_id'], '47')
|
'allow_multiple_video_streams': multi,
|
||||||
|
'allow_multiple_audio_streams': multi,
|
||||||
|
})
|
||||||
|
ydl.process_ie_result(info_dict.copy())
|
||||||
|
downloaded = map(lambda x: x['format_id'], ydl.downloaded_info_dicts)
|
||||||
|
self.assertEqual(list(downloaded), list(expected))
|
||||||
|
|
||||||
ydl = YDL({'format': '20/71/worst'})
|
test('20/47', '47')
|
||||||
ydl.process_ie_result(info_dict.copy())
|
test('20/71/worst', '35')
|
||||||
downloaded = ydl.downloaded_info_dicts[0]
|
test(None, '2')
|
||||||
self.assertEqual(downloaded['format_id'], '35')
|
test('webm/mp4', '47')
|
||||||
|
test('3gp/40/mp4', '35')
|
||||||
ydl = YDL()
|
test('example-with-dashes', 'example-with-dashes')
|
||||||
ydl.process_ie_result(info_dict.copy())
|
test('all', '35', 'example-with-dashes', '45', '47', '2') # Order doesn't actually matter for this
|
||||||
downloaded = ydl.downloaded_info_dicts[0]
|
test('mergeall', '2+47+45+example-with-dashes+35', multi=True)
|
||||||
self.assertEqual(downloaded['format_id'], '2')
|
|
||||||
|
|
||||||
ydl = YDL({'format': 'webm/mp4'})
|
|
||||||
ydl.process_ie_result(info_dict.copy())
|
|
||||||
downloaded = ydl.downloaded_info_dicts[0]
|
|
||||||
self.assertEqual(downloaded['format_id'], '47')
|
|
||||||
|
|
||||||
ydl = YDL({'format': '3gp/40/mp4'})
|
|
||||||
ydl.process_ie_result(info_dict.copy())
|
|
||||||
downloaded = ydl.downloaded_info_dicts[0]
|
|
||||||
self.assertEqual(downloaded['format_id'], '35')
|
|
||||||
|
|
||||||
ydl = YDL({'format': 'example-with-dashes'})
|
|
||||||
ydl.process_ie_result(info_dict.copy())
|
|
||||||
downloaded = ydl.downloaded_info_dicts[0]
|
|
||||||
self.assertEqual(downloaded['format_id'], 'example-with-dashes')
|
|
||||||
|
|
||||||
def test_format_selection_audio(self):
|
def test_format_selection_audio(self):
|
||||||
formats = [
|
formats = [
|
||||||
@@ -461,14 +454,13 @@ class TestFormatSelection(unittest.TestCase):
|
|||||||
|
|
||||||
def test_invalid_format_specs(self):
|
def test_invalid_format_specs(self):
|
||||||
def assert_syntax_error(format_spec):
|
def assert_syntax_error(format_spec):
|
||||||
ydl = YDL({'format': format_spec})
|
self.assertRaises(SyntaxError, YDL, {'format': format_spec})
|
||||||
info_dict = _make_result([{'format_id': 'foo', 'url': TEST_URL}])
|
|
||||||
self.assertRaises(SyntaxError, ydl.process_ie_result, info_dict)
|
|
||||||
|
|
||||||
assert_syntax_error('bestvideo,,best')
|
assert_syntax_error('bestvideo,,best')
|
||||||
assert_syntax_error('+bestaudio')
|
assert_syntax_error('+bestaudio')
|
||||||
assert_syntax_error('bestvideo+')
|
assert_syntax_error('bestvideo+')
|
||||||
assert_syntax_error('/')
|
assert_syntax_error('/')
|
||||||
|
assert_syntax_error('[720<height]')
|
||||||
|
|
||||||
def test_format_filtering(self):
|
def test_format_filtering(self):
|
||||||
formats = [
|
formats = [
|
||||||
@@ -648,56 +640,155 @@ class TestYoutubeDL(unittest.TestCase):
|
|||||||
self.assertEqual(test_dict['extractor'], 'Foo')
|
self.assertEqual(test_dict['extractor'], 'Foo')
|
||||||
self.assertEqual(test_dict['playlist'], 'funny videos')
|
self.assertEqual(test_dict['playlist'], 'funny videos')
|
||||||
|
|
||||||
def test_prepare_filename(self):
|
outtmpl_info = {
|
||||||
info = {
|
'id': '1234',
|
||||||
'id': '1234',
|
'ext': 'mp4',
|
||||||
'ext': 'mp4',
|
'width': None,
|
||||||
'width': None,
|
'height': 1080,
|
||||||
'height': 1080,
|
'title1': '$PATH',
|
||||||
'title1': '$PATH',
|
'title2': '%PATH%',
|
||||||
'title2': '%PATH%',
|
'title3': 'foo/bar\\test',
|
||||||
'timestamp': 1618488000,
|
'title4': 'foo "bar" test',
|
||||||
'formats': [{'id': 'id1'}, {'id': 'id2'}]
|
'timestamp': 1618488000,
|
||||||
}
|
'duration': 100000,
|
||||||
|
'playlist_index': 1,
|
||||||
|
'_last_playlist_index': 100,
|
||||||
|
'n_entries': 10,
|
||||||
|
'formats': [{'id': 'id1'}, {'id': 'id2'}, {'id': 'id3'}]
|
||||||
|
}
|
||||||
|
|
||||||
def fname(templ, na_placeholder='NA'):
|
def test_prepare_outtmpl_and_filename(self):
|
||||||
params = {'outtmpl': templ}
|
def test(tmpl, expected, *, info=None, **params):
|
||||||
if na_placeholder != 'NA':
|
params['outtmpl'] = tmpl
|
||||||
params['outtmpl_na_placeholder'] = na_placeholder
|
|
||||||
ydl = YoutubeDL(params)
|
ydl = YoutubeDL(params)
|
||||||
return ydl.prepare_filename(info)
|
ydl._num_downloads = 1
|
||||||
self.assertEqual(fname('%(id)s.%(ext)s'), '1234.mp4')
|
self.assertEqual(ydl.validate_outtmpl(tmpl), None)
|
||||||
self.assertEqual(fname('%(id)s-%(width)s.%(ext)s'), '1234-NA.mp4')
|
|
||||||
NA_TEST_OUTTMPL = '%(uploader_date)s-%(width)d-%(id)s.%(ext)s'
|
outtmpl, tmpl_dict = ydl.prepare_outtmpl(tmpl, info or self.outtmpl_info)
|
||||||
# Replace missing fields with 'NA' by default
|
out = ydl.escape_outtmpl(outtmpl) % tmpl_dict
|
||||||
self.assertEqual(fname(NA_TEST_OUTTMPL), 'NA-NA-1234.mp4')
|
fname = ydl.prepare_filename(info or self.outtmpl_info)
|
||||||
# Or by provided placeholder
|
|
||||||
self.assertEqual(fname(NA_TEST_OUTTMPL, na_placeholder='none'), 'none-none-1234.mp4')
|
if callable(expected):
|
||||||
self.assertEqual(fname(NA_TEST_OUTTMPL, na_placeholder=''), '--1234.mp4')
|
self.assertTrue(expected(out))
|
||||||
self.assertEqual(fname('%(height)s.%(ext)s'), '1080.mp4')
|
self.assertTrue(expected(fname))
|
||||||
self.assertEqual(fname('%(height)d.%(ext)s'), '1080.mp4')
|
elif isinstance(expected, str):
|
||||||
self.assertEqual(fname('%(height)6d.%(ext)s'), ' 1080.mp4')
|
self.assertEqual(out, expected)
|
||||||
self.assertEqual(fname('%(height)-6d.%(ext)s'), '1080 .mp4')
|
self.assertEqual(fname, expected)
|
||||||
self.assertEqual(fname('%(height)06d.%(ext)s'), '001080.mp4')
|
else:
|
||||||
self.assertEqual(fname('%(height) 06d.%(ext)s'), ' 01080.mp4')
|
self.assertEqual(out, expected[0])
|
||||||
self.assertEqual(fname('%(height) 06d.%(ext)s'), ' 01080.mp4')
|
self.assertEqual(fname, expected[1])
|
||||||
self.assertEqual(fname('%(height)0 6d.%(ext)s'), ' 01080.mp4')
|
|
||||||
self.assertEqual(fname('%(height)0 6d.%(ext)s'), ' 01080.mp4')
|
# Auto-generated fields
|
||||||
self.assertEqual(fname('%(height) 0 6d.%(ext)s'), ' 01080.mp4')
|
test('%(id)s.%(ext)s', '1234.mp4')
|
||||||
self.assertEqual(fname('%%'), '%')
|
test('%(duration_string)s', ('27:46:40', '27-46-40'))
|
||||||
self.assertEqual(fname('%%%%'), '%%')
|
test('%(epoch)d', int_or_none)
|
||||||
self.assertEqual(fname('%%(height)06d.%(ext)s'), '%(height)06d.mp4')
|
test('%(resolution)s', '1080p')
|
||||||
self.assertEqual(fname('%(width)06d.%(ext)s'), 'NA.mp4')
|
test('%(playlist_index)s', '001')
|
||||||
self.assertEqual(fname('%(width)06d.%%(ext)s'), 'NA.%(ext)s')
|
test('%(autonumber)s', '00001')
|
||||||
self.assertEqual(fname('%%(width)06d.%(ext)s'), '%(width)06d.mp4')
|
test('%(autonumber+2)03d', '005', autonumber_start=3)
|
||||||
self.assertEqual(fname('Hello %(title1)s'), 'Hello $PATH')
|
test('%(autonumber)s', '001', autonumber_size=3)
|
||||||
self.assertEqual(fname('Hello %(title2)s'), 'Hello %PATH%')
|
|
||||||
self.assertEqual(fname('%(timestamp+-1000>%H-%M-%S)s'), '11-43-20')
|
# Escaping %
|
||||||
self.assertEqual(fname('%(id+1)05d'), '01235')
|
test('%', '%')
|
||||||
self.assertEqual(fname('%(width+100)05d'), 'NA')
|
test('%%', '%')
|
||||||
self.assertEqual(fname('%(formats.0)s').replace("u", ""), "{'id' - 'id1'}")
|
test('%%%%', '%%')
|
||||||
self.assertEqual(fname('%(formats.-1.id)s'), 'id2')
|
test('%s', '%s')
|
||||||
self.assertEqual(fname('%(formats.2)s'), 'NA')
|
test('%%%s', '%%s')
|
||||||
|
test('%d', '%d')
|
||||||
|
test('%abc%', '%abc%')
|
||||||
|
test('%%(width)06d.%(ext)s', '%(width)06d.mp4')
|
||||||
|
test('%%%(height)s', '%1080')
|
||||||
|
test('%(width)06d.%(ext)s', 'NA.mp4')
|
||||||
|
test('%(width)06d.%%(ext)s', 'NA.%(ext)s')
|
||||||
|
test('%%(width)06d.%(ext)s', '%(width)06d.mp4')
|
||||||
|
|
||||||
|
# ID sanitization
|
||||||
|
test('%(id)s', '_abcd', info={'id': '_abcd'})
|
||||||
|
test('%(some_id)s', '_abcd', info={'some_id': '_abcd'})
|
||||||
|
test('%(formats.0.id)s', '_abcd', info={'formats': [{'id': '_abcd'}]})
|
||||||
|
test('%(id)s', '-abcd', info={'id': '-abcd'})
|
||||||
|
test('%(id)s', '.abcd', info={'id': '.abcd'})
|
||||||
|
test('%(id)s', 'ab__cd', info={'id': 'ab__cd'})
|
||||||
|
test('%(id)s', ('ab:cd', 'ab -cd'), info={'id': 'ab:cd'})
|
||||||
|
|
||||||
|
# Invalid templates
|
||||||
|
self.assertTrue(isinstance(YoutubeDL.validate_outtmpl('%(title)'), ValueError))
|
||||||
|
test('%(invalid@tmpl|def)s', 'none', outtmpl_na_placeholder='none')
|
||||||
|
test('%()s', 'NA')
|
||||||
|
|
||||||
|
# NA placeholder
|
||||||
|
NA_TEST_OUTTMPL = '%(uploader_date)s-%(width)d-%(x|def)s-%(id)s.%(ext)s'
|
||||||
|
test(NA_TEST_OUTTMPL, 'NA-NA-def-1234.mp4')
|
||||||
|
test(NA_TEST_OUTTMPL, 'none-none-def-1234.mp4', outtmpl_na_placeholder='none')
|
||||||
|
test(NA_TEST_OUTTMPL, '--def-1234.mp4', outtmpl_na_placeholder='')
|
||||||
|
|
||||||
|
# String formatting
|
||||||
|
FMT_TEST_OUTTMPL = '%%(height)%s.%%(ext)s'
|
||||||
|
test(FMT_TEST_OUTTMPL % 's', '1080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % 'd', '1080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % '6d', ' 1080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % '-6d', '1080 .mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % '06d', '001080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % ' 06d', ' 01080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % ' 06d', ' 01080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % '0 6d', ' 01080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % '0 6d', ' 01080.mp4')
|
||||||
|
test(FMT_TEST_OUTTMPL % ' 0 6d', ' 01080.mp4')
|
||||||
|
|
||||||
|
# Type casting
|
||||||
|
test('%(id)d', '1234')
|
||||||
|
test('%(height)c', '1')
|
||||||
|
test('%(ext)c', 'm')
|
||||||
|
test('%(id)d %(id)r', "1234 '1234'")
|
||||||
|
test('%(id)r %(height)r', "'1234' 1080")
|
||||||
|
test('%(ext)s-%(ext|def)d', 'mp4-def')
|
||||||
|
test('%(width|0)04d', '0000')
|
||||||
|
test('a%(width|)d', 'a', outtmpl_na_placeholder='none')
|
||||||
|
|
||||||
|
FORMATS = self.outtmpl_info['formats']
|
||||||
|
sanitize = lambda x: x.replace(':', ' -').replace('"', "'")
|
||||||
|
|
||||||
|
# Custom type casting
|
||||||
|
test('%(formats.:.id)l', 'id1, id2, id3')
|
||||||
|
test('%(ext)l', 'mp4')
|
||||||
|
test('%(formats.:.id) 15l', ' id1, id2, id3')
|
||||||
|
test('%(formats)j', (json.dumps(FORMATS), sanitize(json.dumps(FORMATS))))
|
||||||
|
if compat_os_name == 'nt':
|
||||||
|
test('%(title4)q', ('"foo \\"bar\\" test"', "'foo _'bar_' test'"))
|
||||||
|
else:
|
||||||
|
test('%(title4)q', ('\'foo "bar" test\'', "'foo 'bar' test'"))
|
||||||
|
|
||||||
|
# Internal formatting
|
||||||
|
test('%(timestamp-1000>%H-%M-%S)s', '11-43-20')
|
||||||
|
test('%(title|%)s %(title|%%)s', '% %%')
|
||||||
|
test('%(id+1-height+3)05d', '00158')
|
||||||
|
test('%(width+100)05d', 'NA')
|
||||||
|
test('%(formats.0) 15s', ('% 15s' % FORMATS[0], '% 15s' % sanitize(str(FORMATS[0]))))
|
||||||
|
test('%(formats.0)r', (repr(FORMATS[0]), sanitize(repr(FORMATS[0]))))
|
||||||
|
test('%(height.0)03d', '001')
|
||||||
|
test('%(-height.0)04d', '-001')
|
||||||
|
test('%(formats.-1.id)s', FORMATS[-1]['id'])
|
||||||
|
test('%(formats.0.id.-1)d', FORMATS[0]['id'][-1])
|
||||||
|
test('%(formats.3)s', 'NA')
|
||||||
|
test('%(formats.:2:-1)r', repr(FORMATS[:2:-1]))
|
||||||
|
test('%(formats.0.id.-1+id)f', '1235.000000')
|
||||||
|
test('%(formats.0.id.-1+formats.1.id.-1)d', '3')
|
||||||
|
|
||||||
|
# Empty filename
|
||||||
|
test('%(foo|)s-%(bar|)s.%(ext)s', '-.mp4')
|
||||||
|
# test('%(foo|)s.%(ext)s', ('.mp4', '_.mp4')) # fixme
|
||||||
|
# test('%(foo|)s', ('', '_')) # fixme
|
||||||
|
|
||||||
|
# Environment variable expansion for prepare_filename
|
||||||
|
compat_setenv('__yt_dlp_var', 'expanded')
|
||||||
|
envvar = '%__yt_dlp_var%' if compat_os_name == 'nt' else '$__yt_dlp_var'
|
||||||
|
test(envvar, (envvar, 'expanded'))
|
||||||
|
|
||||||
|
# Path expansion and escaping
|
||||||
|
test('Hello %(title1)s', 'Hello $PATH')
|
||||||
|
test('Hello %(title2)s', 'Hello %PATH%')
|
||||||
|
test('%(title3)s', ('foo/bar\\test', 'foo_bar_test'))
|
||||||
|
test('folder/%(title3)s', ('folder/foo/bar\\test', 'folder%sfoo_bar_test' % os.path.sep))
|
||||||
|
|
||||||
def test_format_note(self):
|
def test_format_note(self):
|
||||||
ydl = YoutubeDL()
|
ydl = YoutubeDL()
|
||||||
@@ -756,7 +847,7 @@ class TestYoutubeDL(unittest.TestCase):
|
|||||||
def process_info(self, info_dict):
|
def process_info(self, info_dict):
|
||||||
super(YDL, self).process_info(info_dict)
|
super(YDL, self).process_info(info_dict)
|
||||||
|
|
||||||
def _match_entry(self, info_dict, incomplete):
|
def _match_entry(self, info_dict, incomplete=False):
|
||||||
res = super(FilterYDL, self)._match_entry(info_dict, incomplete)
|
res = super(FilterYDL, self)._match_entry(info_dict, incomplete)
|
||||||
if res is None:
|
if res is None:
|
||||||
self.downloaded_info_dicts.append(info_dict)
|
self.downloaded_info_dicts.append(info_dict)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
# Allow direct execution
|
# Allow direct execution
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
# Allow direct execution
|
# Allow direct execution
|
||||||
@@ -7,8 +7,7 @@ import sys
|
|||||||
import unittest
|
import unittest
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
from test.helper import try_rm
|
from test.helper import try_rm, is_download_test
|
||||||
|
|
||||||
|
|
||||||
from yt_dlp import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
|
|
||||||
@@ -32,6 +31,7 @@ def _download_restricted(url, filename, age):
|
|||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestAgeRestriction(unittest.TestCase):
|
class TestAgeRestriction(unittest.TestCase):
|
||||||
def _assert_restricted(self, url, filename, age, old_age=None):
|
def _assert_restricted(self, url, filename, age, old_age=None):
|
||||||
self.assertTrue(_download_restricted(url, filename, old_age))
|
self.assertTrue(_download_restricted(url, filename, old_age))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|||||||
96
test/test_cookies.py
Normal file
96
test/test_cookies.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import unittest
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
|
from yt_dlp import cookies
|
||||||
|
from yt_dlp.cookies import (
|
||||||
|
CRYPTO_AVAILABLE,
|
||||||
|
LinuxChromeCookieDecryptor,
|
||||||
|
MacChromeCookieDecryptor,
|
||||||
|
WindowsChromeCookieDecryptor,
|
||||||
|
YDLLogger,
|
||||||
|
parse_safari_cookies,
|
||||||
|
pbkdf2_sha1,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class MonkeyPatch:
|
||||||
|
def __init__(self, module, temporary_values):
|
||||||
|
self._module = module
|
||||||
|
self._temporary_values = temporary_values
|
||||||
|
self._backup_values = {}
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
for name, temp_value in self._temporary_values.items():
|
||||||
|
self._backup_values[name] = getattr(self._module, name)
|
||||||
|
setattr(self._module, name, temp_value)
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
for name, backup_value in self._backup_values.items():
|
||||||
|
setattr(self._module, name, backup_value)
|
||||||
|
|
||||||
|
|
||||||
|
class TestCookies(unittest.TestCase):
|
||||||
|
def test_chrome_cookie_decryptor_linux_derive_key(self):
|
||||||
|
key = LinuxChromeCookieDecryptor.derive_key(b'abc')
|
||||||
|
self.assertEqual(key, b'7\xa1\xec\xd4m\xfcA\xc7\xb19Z\xd0\x19\xdcM\x17')
|
||||||
|
|
||||||
|
def test_chrome_cookie_decryptor_mac_derive_key(self):
|
||||||
|
key = MacChromeCookieDecryptor.derive_key(b'abc')
|
||||||
|
self.assertEqual(key, b'Y\xe2\xc0\xd0P\xf6\xf4\xe1l\xc1\x8cQ\xcb|\xcdY')
|
||||||
|
|
||||||
|
def test_chrome_cookie_decryptor_linux_v10(self):
|
||||||
|
with MonkeyPatch(cookies, {'_get_linux_keyring_password': lambda *args, **kwargs: b''}):
|
||||||
|
encrypted_value = b'v10\xccW%\xcd\xe6\xe6\x9fM" \xa7\xb0\xca\xe4\x07\xd6'
|
||||||
|
value = 'USD'
|
||||||
|
decryptor = LinuxChromeCookieDecryptor('Chrome', YDLLogger())
|
||||||
|
self.assertEqual(decryptor.decrypt(encrypted_value), value)
|
||||||
|
|
||||||
|
def test_chrome_cookie_decryptor_linux_v11(self):
|
||||||
|
with MonkeyPatch(cookies, {'_get_linux_keyring_password': lambda *args, **kwargs: b'',
|
||||||
|
'KEYRING_AVAILABLE': True}):
|
||||||
|
encrypted_value = b'v11#\x81\x10>`w\x8f)\xc0\xb2\xc1\r\xf4\x1al\xdd\x93\xfd\xf8\xf8N\xf2\xa9\x83\xf1\xe9o\x0elVQd'
|
||||||
|
value = 'tz=Europe.London'
|
||||||
|
decryptor = LinuxChromeCookieDecryptor('Chrome', YDLLogger())
|
||||||
|
self.assertEqual(decryptor.decrypt(encrypted_value), value)
|
||||||
|
|
||||||
|
@unittest.skipIf(not CRYPTO_AVAILABLE, 'cryptography library not available')
|
||||||
|
def test_chrome_cookie_decryptor_windows_v10(self):
|
||||||
|
with MonkeyPatch(cookies, {
|
||||||
|
'_get_windows_v10_key': lambda *args, **kwargs: b'Y\xef\xad\xad\xeerp\xf0Y\xe6\x9b\x12\xc2<z\x16]\n\xbb\xb8\xcb\xd7\x9bA\xc3\x14e\x99{\xd6\xf4&'
|
||||||
|
}):
|
||||||
|
encrypted_value = b'v10T\xb8\xf3\xb8\x01\xa7TtcV\xfc\x88\xb8\xb8\xef\x05\xb5\xfd\x18\xc90\x009\xab\xb1\x893\x85)\x87\xe1\xa9-\xa3\xad='
|
||||||
|
value = '32101439'
|
||||||
|
decryptor = WindowsChromeCookieDecryptor('', YDLLogger())
|
||||||
|
self.assertEqual(decryptor.decrypt(encrypted_value), value)
|
||||||
|
|
||||||
|
def test_chrome_cookie_decryptor_mac_v10(self):
|
||||||
|
with MonkeyPatch(cookies, {'_get_mac_keyring_password': lambda *args, **kwargs: b'6eIDUdtKAacvlHwBVwvg/Q=='}):
|
||||||
|
encrypted_value = b'v10\xb3\xbe\xad\xa1[\x9fC\xa1\x98\xe0\x9a\x01\xd9\xcf\xbfc'
|
||||||
|
value = '2021-06-01-22'
|
||||||
|
decryptor = MacChromeCookieDecryptor('', YDLLogger())
|
||||||
|
self.assertEqual(decryptor.decrypt(encrypted_value), value)
|
||||||
|
|
||||||
|
def test_safari_cookie_parsing(self):
|
||||||
|
cookies = \
|
||||||
|
b'cook\x00\x00\x00\x01\x00\x00\x00i\x00\x00\x01\x00\x01\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00Y' \
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x008\x00\x00\x00B\x00\x00\x00F\x00\x00\x00H' \
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x03\xa5>\xc3A\x00\x00\x80\xc3\x07:\xc3A' \
|
||||||
|
b'localhost\x00foo\x00/\x00test%20%3Bcookie\x00\x00\x00\x054\x07\x17 \x05\x00\x00\x00Kbplist00\xd1\x01' \
|
||||||
|
b'\x02_\x10\x18NSHTTPCookieAcceptPolicy\x10\x02\x08\x0b&\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00' \
|
||||||
|
b'\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00('
|
||||||
|
|
||||||
|
jar = parse_safari_cookies(cookies)
|
||||||
|
self.assertEqual(len(jar), 1)
|
||||||
|
cookie = list(jar)[0]
|
||||||
|
self.assertEqual(cookie.domain, 'localhost')
|
||||||
|
self.assertEqual(cookie.port, None)
|
||||||
|
self.assertEqual(cookie.path, '/')
|
||||||
|
self.assertEqual(cookie.name, 'foo')
|
||||||
|
self.assertEqual(cookie.value, 'test%20%3Bcookie')
|
||||||
|
self.assertFalse(cookie.secure)
|
||||||
|
expected_expiration = datetime(2021, 6, 18, 21, 39, 19, tzinfo=timezone.utc)
|
||||||
|
self.assertEqual(cookie.expires, int(expected_expiration.timestamp()))
|
||||||
|
|
||||||
|
def test_pbkdf2_sha1(self):
|
||||||
|
key = pbkdf2_sha1(b'peanuts', b' ' * 16, 1, 16)
|
||||||
|
self.assertEqual(key, b'g\xe1\x8e\x0fQ\x1c\x9b\xf3\xc9`!\xaa\x90\xd9\xd34')
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
@@ -10,12 +10,13 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
|
|
||||||
from test.helper import (
|
from test.helper import (
|
||||||
assertGreaterEqual,
|
assertGreaterEqual,
|
||||||
|
expect_info_dict,
|
||||||
expect_warnings,
|
expect_warnings,
|
||||||
get_params,
|
get_params,
|
||||||
gettestcases,
|
gettestcases,
|
||||||
expect_info_dict,
|
is_download_test,
|
||||||
try_rm,
|
|
||||||
report_warning,
|
report_warning,
|
||||||
|
try_rm,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -64,6 +65,7 @@ def _file_md5(fn):
|
|||||||
defs = gettestcases()
|
defs = gettestcases()
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestDownload(unittest.TestCase):
|
class TestDownload(unittest.TestCase):
|
||||||
# Parallel testing in nosetests. See
|
# Parallel testing in nosetests. See
|
||||||
# http://nose.readthedocs.org/en/latest/doc_tests/test_multiprocess/multiprocess.html
|
# http://nose.readthedocs.org/en/latest/doc_tests/test_multiprocess/multiprocess.html
|
||||||
@@ -106,8 +108,13 @@ def generator(test_case, tname):
|
|||||||
|
|
||||||
for tc in test_cases:
|
for tc in test_cases:
|
||||||
info_dict = tc.get('info_dict', {})
|
info_dict = tc.get('info_dict', {})
|
||||||
if not (info_dict.get('id') and info_dict.get('ext')):
|
params = tc.get('params', {})
|
||||||
raise Exception('Test definition incorrect. The output file cannot be known. Are both \'id\' and \'ext\' keys present?')
|
if not info_dict.get('id'):
|
||||||
|
raise Exception('Test definition incorrect. \'id\' key is not present')
|
||||||
|
elif not info_dict.get('ext'):
|
||||||
|
if params.get('skip_download') and params.get('ignore_no_formats_error'):
|
||||||
|
continue
|
||||||
|
raise Exception('Test definition incorrect. The output file cannot be known. \'ext\' key is not present')
|
||||||
|
|
||||||
if 'skip' in test_case:
|
if 'skip' in test_case:
|
||||||
print_skipping(test_case['skip'])
|
print_skipping(test_case['skip'])
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ import sys
|
|||||||
import unittest
|
import unittest
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
from test.helper import FakeYDL
|
from test.helper import FakeYDL, is_download_test
|
||||||
from yt_dlp.extractor import IqiyiIE
|
from yt_dlp.extractor import IqiyiIE
|
||||||
|
|
||||||
|
|
||||||
@@ -31,6 +31,7 @@ class WarningLogger(object):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestIqiyiSDKInterpreter(unittest.TestCase):
|
class TestIqiyiSDKInterpreter(unittest.TestCase):
|
||||||
def test_iqiyi_sdk_interpreter(self):
|
def test_iqiyi_sdk_interpreter(self):
|
||||||
'''
|
'''
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@ import sys
|
|||||||
import unittest
|
import unittest
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
from test.helper import get_params, try_rm
|
from test.helper import get_params, try_rm, is_download_test
|
||||||
import yt_dlp.YoutubeDL
|
import yt_dlp.YoutubeDL
|
||||||
from yt_dlp.utils import DownloadError
|
from yt_dlp.utils import DownloadError
|
||||||
|
|
||||||
@@ -22,6 +22,7 @@ TEST_ID = 'gr51aVj-mLg'
|
|||||||
EXPECTED_NAME = 'gr51aVj-mLg'
|
EXPECTED_NAME = 'gr51aVj-mLg'
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestPostHooks(unittest.TestCase):
|
class TestPostHooks(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.stored_name_1 = None
|
self.stored_name_1 = None
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
@@ -8,7 +8,14 @@ import sys
|
|||||||
import unittest
|
import unittest
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
from yt_dlp.postprocessor import MetadataFromFieldPP, MetadataFromTitlePP
|
from yt_dlp import YoutubeDL
|
||||||
|
from yt_dlp.compat import compat_shlex_quote
|
||||||
|
from yt_dlp.postprocessor import (
|
||||||
|
ExecAfterDownloadPP,
|
||||||
|
FFmpegThumbnailsConvertorPP,
|
||||||
|
MetadataFromFieldPP,
|
||||||
|
MetadataFromTitlePP,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestMetadataFromField(unittest.TestCase):
|
class TestMetadataFromField(unittest.TestCase):
|
||||||
@@ -30,3 +37,35 @@ class TestMetadataFromTitle(unittest.TestCase):
|
|||||||
def test_format_to_regex(self):
|
def test_format_to_regex(self):
|
||||||
pp = MetadataFromTitlePP(None, '%(title)s - %(artist)s')
|
pp = MetadataFromTitlePP(None, '%(title)s - %(artist)s')
|
||||||
self.assertEqual(pp._titleregex, r'(?P<title>.+)\ \-\ (?P<artist>.+)')
|
self.assertEqual(pp._titleregex, r'(?P<title>.+)\ \-\ (?P<artist>.+)')
|
||||||
|
|
||||||
|
|
||||||
|
class TestConvertThumbnail(unittest.TestCase):
|
||||||
|
def test_escaping(self):
|
||||||
|
pp = FFmpegThumbnailsConvertorPP()
|
||||||
|
if not pp.available:
|
||||||
|
print('Skipping: ffmpeg not found')
|
||||||
|
return
|
||||||
|
|
||||||
|
file = 'test/testdata/thumbnails/foo %d bar/foo_%d.{}'
|
||||||
|
tests = (('webp', 'png'), ('png', 'jpg'))
|
||||||
|
|
||||||
|
for inp, out in tests:
|
||||||
|
out_file = file.format(out)
|
||||||
|
if os.path.exists(out_file):
|
||||||
|
os.remove(out_file)
|
||||||
|
pp.convert_thumbnail(file.format(inp), out)
|
||||||
|
assert os.path.exists(out_file)
|
||||||
|
|
||||||
|
for _, out in tests:
|
||||||
|
os.remove(file.format(out))
|
||||||
|
|
||||||
|
|
||||||
|
class TestExecAfterDownload(unittest.TestCase):
|
||||||
|
def test_parse_cmd(self):
|
||||||
|
pp = ExecAfterDownloadPP(YoutubeDL(), '')
|
||||||
|
info = {'filepath': 'file name'}
|
||||||
|
quoted_filepath = compat_shlex_quote(info['filepath'])
|
||||||
|
|
||||||
|
self.assertEqual(pp.parse_cmd('echo', info), 'echo %s' % quoted_filepath)
|
||||||
|
self.assertEqual(pp.parse_cmd('echo.{}', info), 'echo.%s' % quoted_filepath)
|
||||||
|
self.assertEqual(pp.parse_cmd('echo "%(filepath)s"', info), 'echo "%s"' % info['filepath'])
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
@@ -14,6 +14,7 @@ import subprocess
|
|||||||
from test.helper import (
|
from test.helper import (
|
||||||
FakeYDL,
|
FakeYDL,
|
||||||
get_params,
|
get_params,
|
||||||
|
is_download_test,
|
||||||
)
|
)
|
||||||
from yt_dlp.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_str,
|
compat_str,
|
||||||
@@ -21,6 +22,7 @@ from yt_dlp.compat import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestMultipleSocks(unittest.TestCase):
|
class TestMultipleSocks(unittest.TestCase):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _check_params(attrs):
|
def _check_params(attrs):
|
||||||
@@ -76,6 +78,7 @@ class TestMultipleSocks(unittest.TestCase):
|
|||||||
params['secondary_server_ip'])
|
params['secondary_server_ip'])
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestSocks(unittest.TestCase):
|
class TestSocks(unittest.TestCase):
|
||||||
_SKIP_SOCKS_TEST = True
|
_SKIP_SOCKS_TEST = True
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
# Allow direct execution
|
# Allow direct execution
|
||||||
@@ -7,7 +7,7 @@ import sys
|
|||||||
import unittest
|
import unittest
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
from test.helper import FakeYDL, md5
|
from test.helper import FakeYDL, md5, is_download_test
|
||||||
|
|
||||||
|
|
||||||
from yt_dlp.extractor import (
|
from yt_dlp.extractor import (
|
||||||
@@ -30,6 +30,7 @@ from yt_dlp.extractor import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class BaseTestSubtitles(unittest.TestCase):
|
class BaseTestSubtitles(unittest.TestCase):
|
||||||
url = None
|
url = None
|
||||||
IE = None
|
IE = None
|
||||||
@@ -55,6 +56,7 @@ class BaseTestSubtitles(unittest.TestCase):
|
|||||||
return dict((l, sub_info['data']) for l, sub_info in subtitles.items())
|
return dict((l, sub_info['data']) for l, sub_info in subtitles.items())
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestYoutubeSubtitles(BaseTestSubtitles):
|
class TestYoutubeSubtitles(BaseTestSubtitles):
|
||||||
url = 'QRS8MkLhQmM'
|
url = 'QRS8MkLhQmM'
|
||||||
IE = YoutubeIE
|
IE = YoutubeIE
|
||||||
@@ -111,6 +113,7 @@ class TestYoutubeSubtitles(BaseTestSubtitles):
|
|||||||
self.assertFalse(subtitles)
|
self.assertFalse(subtitles)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestDailymotionSubtitles(BaseTestSubtitles):
|
class TestDailymotionSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.dailymotion.com/video/xczg00'
|
url = 'http://www.dailymotion.com/video/xczg00'
|
||||||
IE = DailymotionIE
|
IE = DailymotionIE
|
||||||
@@ -134,6 +137,7 @@ class TestDailymotionSubtitles(BaseTestSubtitles):
|
|||||||
self.assertFalse(subtitles)
|
self.assertFalse(subtitles)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestTedSubtitles(BaseTestSubtitles):
|
class TestTedSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html'
|
url = 'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html'
|
||||||
IE = TEDIE
|
IE = TEDIE
|
||||||
@@ -149,6 +153,7 @@ class TestTedSubtitles(BaseTestSubtitles):
|
|||||||
self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
|
self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestVimeoSubtitles(BaseTestSubtitles):
|
class TestVimeoSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://vimeo.com/76979871'
|
url = 'http://vimeo.com/76979871'
|
||||||
IE = VimeoIE
|
IE = VimeoIE
|
||||||
@@ -170,6 +175,7 @@ class TestVimeoSubtitles(BaseTestSubtitles):
|
|||||||
self.assertFalse(subtitles)
|
self.assertFalse(subtitles)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestWallaSubtitles(BaseTestSubtitles):
|
class TestWallaSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://vod.walla.co.il/movie/2705958/the-yes-men'
|
url = 'http://vod.walla.co.il/movie/2705958/the-yes-men'
|
||||||
IE = WallaIE
|
IE = WallaIE
|
||||||
@@ -191,6 +197,7 @@ class TestWallaSubtitles(BaseTestSubtitles):
|
|||||||
self.assertFalse(subtitles)
|
self.assertFalse(subtitles)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestCeskaTelevizeSubtitles(BaseTestSubtitles):
|
class TestCeskaTelevizeSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.ceskatelevize.cz/ivysilani/10600540290-u6-uzasny-svet-techniky'
|
url = 'http://www.ceskatelevize.cz/ivysilani/10600540290-u6-uzasny-svet-techniky'
|
||||||
IE = CeskaTelevizeIE
|
IE = CeskaTelevizeIE
|
||||||
@@ -212,6 +219,7 @@ class TestCeskaTelevizeSubtitles(BaseTestSubtitles):
|
|||||||
self.assertFalse(subtitles)
|
self.assertFalse(subtitles)
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestLyndaSubtitles(BaseTestSubtitles):
|
class TestLyndaSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.lynda.com/Bootstrap-tutorials/Using-exercise-files/110885/114408-4.html'
|
url = 'http://www.lynda.com/Bootstrap-tutorials/Using-exercise-files/110885/114408-4.html'
|
||||||
IE = LyndaIE
|
IE = LyndaIE
|
||||||
@@ -224,6 +232,7 @@ class TestLyndaSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['en']), '09bbe67222259bed60deaa26997d73a7')
|
self.assertEqual(md5(subtitles['en']), '09bbe67222259bed60deaa26997d73a7')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestNPOSubtitles(BaseTestSubtitles):
|
class TestNPOSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.npo.nl/nos-journaal/28-08-2014/POW_00722860'
|
url = 'http://www.npo.nl/nos-journaal/28-08-2014/POW_00722860'
|
||||||
IE = NPOIE
|
IE = NPOIE
|
||||||
@@ -236,6 +245,7 @@ class TestNPOSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['nl']), 'fc6435027572b63fb4ab143abd5ad3f4')
|
self.assertEqual(md5(subtitles['nl']), 'fc6435027572b63fb4ab143abd5ad3f4')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestMTVSubtitles(BaseTestSubtitles):
|
class TestMTVSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.cc.com/video-clips/p63lk0/adam-devine-s-house-party-chasing-white-swans'
|
url = 'http://www.cc.com/video-clips/p63lk0/adam-devine-s-house-party-chasing-white-swans'
|
||||||
IE = ComedyCentralIE
|
IE = ComedyCentralIE
|
||||||
@@ -251,6 +261,7 @@ class TestMTVSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['en']), '78206b8d8a0cfa9da64dc026eea48961')
|
self.assertEqual(md5(subtitles['en']), '78206b8d8a0cfa9da64dc026eea48961')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestNRKSubtitles(BaseTestSubtitles):
|
class TestNRKSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://tv.nrk.no/serie/ikke-gjoer-dette-hjemme/DMPV73000411/sesong-2/episode-1'
|
url = 'http://tv.nrk.no/serie/ikke-gjoer-dette-hjemme/DMPV73000411/sesong-2/episode-1'
|
||||||
IE = NRKTVIE
|
IE = NRKTVIE
|
||||||
@@ -263,6 +274,7 @@ class TestNRKSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['no']), '544fa917d3197fcbee64634559221cc2')
|
self.assertEqual(md5(subtitles['no']), '544fa917d3197fcbee64634559221cc2')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestRaiPlaySubtitles(BaseTestSubtitles):
|
class TestRaiPlaySubtitles(BaseTestSubtitles):
|
||||||
IE = RaiPlayIE
|
IE = RaiPlayIE
|
||||||
|
|
||||||
@@ -283,6 +295,7 @@ class TestRaiPlaySubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['it']), '4b3264186fbb103508abe5311cfcb9cd')
|
self.assertEqual(md5(subtitles['it']), '4b3264186fbb103508abe5311cfcb9cd')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestVikiSubtitles(BaseTestSubtitles):
|
class TestVikiSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.viki.com/videos/1060846v-punch-episode-18'
|
url = 'http://www.viki.com/videos/1060846v-punch-episode-18'
|
||||||
IE = VikiIE
|
IE = VikiIE
|
||||||
@@ -295,6 +308,7 @@ class TestVikiSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['en']), '53cb083a5914b2d84ef1ab67b880d18a')
|
self.assertEqual(md5(subtitles['en']), '53cb083a5914b2d84ef1ab67b880d18a')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestThePlatformSubtitles(BaseTestSubtitles):
|
class TestThePlatformSubtitles(BaseTestSubtitles):
|
||||||
# from http://www.3playmedia.com/services-features/tools/integrations/theplatform/
|
# from http://www.3playmedia.com/services-features/tools/integrations/theplatform/
|
||||||
# (see http://theplatform.com/about/partners/type/subtitles-closed-captioning/)
|
# (see http://theplatform.com/about/partners/type/subtitles-closed-captioning/)
|
||||||
@@ -309,6 +323,7 @@ class TestThePlatformSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['en']), '97e7670cbae3c4d26ae8bcc7fdd78d4b')
|
self.assertEqual(md5(subtitles['en']), '97e7670cbae3c4d26ae8bcc7fdd78d4b')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestThePlatformFeedSubtitles(BaseTestSubtitles):
|
class TestThePlatformFeedSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://feed.theplatform.com/f/7wvmTC/msnbc_video-p-test?form=json&pretty=true&range=-40&byGuid=n_hardball_5biden_140207'
|
url = 'http://feed.theplatform.com/f/7wvmTC/msnbc_video-p-test?form=json&pretty=true&range=-40&byGuid=n_hardball_5biden_140207'
|
||||||
IE = ThePlatformFeedIE
|
IE = ThePlatformFeedIE
|
||||||
@@ -321,6 +336,7 @@ class TestThePlatformFeedSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['en']), '48649a22e82b2da21c9a67a395eedade')
|
self.assertEqual(md5(subtitles['en']), '48649a22e82b2da21c9a67a395eedade')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestRtveSubtitles(BaseTestSubtitles):
|
class TestRtveSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.rtve.es/alacarta/videos/los-misterios-de-laura/misterios-laura-capitulo-32-misterio-del-numero-17-2-parte/2428621/'
|
url = 'http://www.rtve.es/alacarta/videos/los-misterios-de-laura/misterios-laura-capitulo-32-misterio-del-numero-17-2-parte/2428621/'
|
||||||
IE = RTVEALaCartaIE
|
IE = RTVEALaCartaIE
|
||||||
@@ -335,6 +351,7 @@ class TestRtveSubtitles(BaseTestSubtitles):
|
|||||||
self.assertEqual(md5(subtitles['es']), '69e70cae2d40574fb7316f31d6eb7fca')
|
self.assertEqual(md5(subtitles['es']), '69e70cae2d40574fb7316f31d6eb7fca')
|
||||||
|
|
||||||
|
|
||||||
|
@is_download_test
|
||||||
class TestDemocracynowSubtitles(BaseTestSubtitles):
|
class TestDemocracynowSubtitles(BaseTestSubtitles):
|
||||||
url = 'http://www.democracynow.org/shows/2015/7/3'
|
url = 'http://www.democracynow.org/shows/2015/7/3'
|
||||||
IE = DemocracynowIE
|
IE = DemocracynowIE
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
# Allow direct execution
|
# Allow direct execution
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
@@ -12,6 +12,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
|
|
||||||
# Various small unit tests
|
# Various small unit tests
|
||||||
import io
|
import io
|
||||||
|
import itertools
|
||||||
import json
|
import json
|
||||||
import xml.etree.ElementTree
|
import xml.etree.ElementTree
|
||||||
|
|
||||||
@@ -66,6 +67,7 @@ from yt_dlp.utils import (
|
|||||||
sanitize_filename,
|
sanitize_filename,
|
||||||
sanitize_path,
|
sanitize_path,
|
||||||
sanitize_url,
|
sanitize_url,
|
||||||
|
sanitized_Request,
|
||||||
expand_path,
|
expand_path,
|
||||||
prepend_extension,
|
prepend_extension,
|
||||||
replace_extension,
|
replace_extension,
|
||||||
@@ -107,6 +109,7 @@ from yt_dlp.utils import (
|
|||||||
cli_bool_option,
|
cli_bool_option,
|
||||||
parse_codecs,
|
parse_codecs,
|
||||||
iri_to_uri,
|
iri_to_uri,
|
||||||
|
LazyList,
|
||||||
)
|
)
|
||||||
from yt_dlp.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_chr,
|
compat_chr,
|
||||||
@@ -125,6 +128,7 @@ class TestUtil(unittest.TestCase):
|
|||||||
self.assertTrue(timeconvert('bougrg') is None)
|
self.assertTrue(timeconvert('bougrg') is None)
|
||||||
|
|
||||||
def test_sanitize_filename(self):
|
def test_sanitize_filename(self):
|
||||||
|
self.assertEqual(sanitize_filename(''), '')
|
||||||
self.assertEqual(sanitize_filename('abc'), 'abc')
|
self.assertEqual(sanitize_filename('abc'), 'abc')
|
||||||
self.assertEqual(sanitize_filename('abc_d-e'), 'abc_d-e')
|
self.assertEqual(sanitize_filename('abc_d-e'), 'abc_d-e')
|
||||||
|
|
||||||
@@ -238,6 +242,16 @@ class TestUtil(unittest.TestCase):
|
|||||||
self.assertEqual(sanitize_url('httpss://foo.bar'), 'https://foo.bar')
|
self.assertEqual(sanitize_url('httpss://foo.bar'), 'https://foo.bar')
|
||||||
self.assertEqual(sanitize_url('rmtps://foo.bar'), 'rtmps://foo.bar')
|
self.assertEqual(sanitize_url('rmtps://foo.bar'), 'rtmps://foo.bar')
|
||||||
self.assertEqual(sanitize_url('https://foo.bar'), 'https://foo.bar')
|
self.assertEqual(sanitize_url('https://foo.bar'), 'https://foo.bar')
|
||||||
|
self.assertEqual(sanitize_url('foo bar'), 'foo bar')
|
||||||
|
|
||||||
|
def test_extract_basic_auth(self):
|
||||||
|
auth_header = lambda url: sanitized_Request(url).get_header('Authorization')
|
||||||
|
self.assertFalse(auth_header('http://foo.bar'))
|
||||||
|
self.assertFalse(auth_header('http://:foo.bar'))
|
||||||
|
self.assertEqual(auth_header('http://@foo.bar'), 'Basic Og==')
|
||||||
|
self.assertEqual(auth_header('http://:pass@foo.bar'), 'Basic OnBhc3M=')
|
||||||
|
self.assertEqual(auth_header('http://user:@foo.bar'), 'Basic dXNlcjo=')
|
||||||
|
self.assertEqual(auth_header('http://user:pass@foo.bar'), 'Basic dXNlcjpwYXNz')
|
||||||
|
|
||||||
def test_expand_path(self):
|
def test_expand_path(self):
|
||||||
def env(var):
|
def env(var):
|
||||||
@@ -1040,6 +1054,9 @@ class TestUtil(unittest.TestCase):
|
|||||||
on = js_to_json('{ "040": "040" }')
|
on = js_to_json('{ "040": "040" }')
|
||||||
self.assertEqual(json.loads(on), {'040': '040'})
|
self.assertEqual(json.loads(on), {'040': '040'})
|
||||||
|
|
||||||
|
on = js_to_json('[1,//{},\n2]')
|
||||||
|
self.assertEqual(json.loads(on), [1, 2])
|
||||||
|
|
||||||
def test_js_to_json_malformed(self):
|
def test_js_to_json_malformed(self):
|
||||||
self.assertEqual(js_to_json('42a1'), '42"a1"')
|
self.assertEqual(js_to_json('42a1'), '42"a1"')
|
||||||
self.assertEqual(js_to_json('42a-1'), '42"a"-1')
|
self.assertEqual(js_to_json('42a-1'), '42"a"-1')
|
||||||
@@ -1513,6 +1530,51 @@ Line 1
|
|||||||
self.assertEqual(clean_podcast_url('https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW7835899191.mp3'), 'https://traffic.megaphone.fm/HSW7835899191.mp3')
|
self.assertEqual(clean_podcast_url('https://www.podtrac.com/pts/redirect.mp3/chtbl.com/track/5899E/traffic.megaphone.fm/HSW7835899191.mp3'), 'https://traffic.megaphone.fm/HSW7835899191.mp3')
|
||||||
self.assertEqual(clean_podcast_url('https://play.podtrac.com/npr-344098539/edge1.pod.npr.org/anon.npr-podcasts/podcast/npr/waitwait/2020/10/20201003_waitwait_wwdtmpodcast201003-015621a5-f035-4eca-a9a1-7c118d90bc3c.mp3'), 'https://edge1.pod.npr.org/anon.npr-podcasts/podcast/npr/waitwait/2020/10/20201003_waitwait_wwdtmpodcast201003-015621a5-f035-4eca-a9a1-7c118d90bc3c.mp3')
|
self.assertEqual(clean_podcast_url('https://play.podtrac.com/npr-344098539/edge1.pod.npr.org/anon.npr-podcasts/podcast/npr/waitwait/2020/10/20201003_waitwait_wwdtmpodcast201003-015621a5-f035-4eca-a9a1-7c118d90bc3c.mp3'), 'https://edge1.pod.npr.org/anon.npr-podcasts/podcast/npr/waitwait/2020/10/20201003_waitwait_wwdtmpodcast201003-015621a5-f035-4eca-a9a1-7c118d90bc3c.mp3')
|
||||||
|
|
||||||
|
def test_LazyList(self):
|
||||||
|
it = list(range(10))
|
||||||
|
|
||||||
|
self.assertEqual(list(LazyList(it)), it)
|
||||||
|
self.assertEqual(LazyList(it).exhaust(), it)
|
||||||
|
self.assertEqual(LazyList(it)[5], it[5])
|
||||||
|
|
||||||
|
self.assertEqual(LazyList(it)[5:], it[5:])
|
||||||
|
self.assertEqual(LazyList(it)[:5], it[:5])
|
||||||
|
self.assertEqual(LazyList(it)[::2], it[::2])
|
||||||
|
self.assertEqual(LazyList(it)[1::2], it[1::2])
|
||||||
|
self.assertEqual(LazyList(it)[5::-1], it[5::-1])
|
||||||
|
self.assertEqual(LazyList(it)[6:2:-2], it[6:2:-2])
|
||||||
|
self.assertEqual(LazyList(it)[::-1], it[::-1])
|
||||||
|
|
||||||
|
self.assertTrue(LazyList(it))
|
||||||
|
self.assertFalse(LazyList(range(0)))
|
||||||
|
self.assertEqual(len(LazyList(it)), len(it))
|
||||||
|
self.assertEqual(repr(LazyList(it)), repr(it))
|
||||||
|
self.assertEqual(str(LazyList(it)), str(it))
|
||||||
|
|
||||||
|
self.assertEqual(list(LazyList(it).reverse()), it[::-1])
|
||||||
|
self.assertEqual(list(LazyList(it).reverse()[1:3:7]), it[::-1][1:3:7])
|
||||||
|
self.assertEqual(list(LazyList(it).reverse()[::-1]), it)
|
||||||
|
|
||||||
|
def test_LazyList_laziness(self):
|
||||||
|
|
||||||
|
def test(ll, idx, val, cache):
|
||||||
|
self.assertEqual(ll[idx], val)
|
||||||
|
self.assertEqual(getattr(ll, '_LazyList__cache'), list(cache))
|
||||||
|
|
||||||
|
ll = LazyList(range(10))
|
||||||
|
test(ll, 0, 0, range(1))
|
||||||
|
test(ll, 5, 5, range(6))
|
||||||
|
test(ll, -3, 7, range(10))
|
||||||
|
|
||||||
|
ll = LazyList(range(10)).reverse()
|
||||||
|
test(ll, -1, 0, range(1))
|
||||||
|
test(ll, 3, 6, range(10))
|
||||||
|
|
||||||
|
ll = LazyList(itertools.count())
|
||||||
|
test(ll, 10, 10, range(11))
|
||||||
|
ll.reverse()
|
||||||
|
test(ll, -15, 14, range(15))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user