mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2025-12-08 23:22:49 +01:00
Compare commits
388 Commits
2021.02.19
...
2021.06.01
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
5014558ab9 | ||
|
|
28b0eb0f65 | ||
|
|
95131b2176 | ||
|
|
2305e2e5c9 | ||
|
|
00ae27690d | ||
|
|
9d5d4d64f8 | ||
|
|
98784ef8d6 | ||
|
|
d3fc8074a4 | ||
|
|
9c2b75b561 | ||
|
|
856bb8f99d | ||
|
|
af32f40bf5 | ||
|
|
4ec82a72bb | ||
|
|
07cce701de | ||
|
|
74e001af1d | ||
|
|
ff2751ac9c | ||
|
|
abcdd12b26 | ||
|
|
18db754858 | ||
|
|
fe03a6cdc8 | ||
|
|
cd684175ad | ||
|
|
da692b7920 | ||
|
|
95c01b6c16 | ||
|
|
6911e11edd | ||
|
|
5112f26a60 | ||
|
|
a06916d98e | ||
|
|
681de68e9d | ||
|
|
7aee40c13c | ||
|
|
9297939ec3 | ||
|
|
774d79cc4c | ||
|
|
2412044c90 | ||
|
|
120916dac2 | ||
|
|
fe346461ff | ||
|
|
d2a1fad968 | ||
|
|
0fb983f62d | ||
|
|
53c18592d3 | ||
|
|
e632bce2e4 | ||
|
|
0760b0a7e2 | ||
|
|
d908aa636a | ||
|
|
3d89341b47 | ||
|
|
d8ec40b39f | ||
|
|
4171221823 | ||
|
|
eaeca38fc4 | ||
|
|
fac988053f | ||
|
|
61241abbb0 | ||
|
|
53ed7066ab | ||
|
|
a61f4b287b | ||
|
|
486fb17975 | ||
|
|
2f567473c6 | ||
|
|
000ee7ef34 | ||
|
|
41d1cca328 | ||
|
|
717297545b | ||
|
|
e8e738406a | ||
|
|
e625be0d10 | ||
|
|
12e73423f1 | ||
|
|
7700b37f39 | ||
|
|
c28cfda81f | ||
|
|
848887eb7a | ||
|
|
3158150cb7 | ||
|
|
6ef6bcbd6b | ||
|
|
06425e9621 | ||
|
|
4d224a3022 | ||
|
|
f59ae58163 | ||
|
|
0d1bb027aa | ||
|
|
4cd0a709aa | ||
|
|
1815d1028b | ||
|
|
0fa9a1e236 | ||
|
|
eb55bad5a0 | ||
|
|
cc0ec3e161 | ||
|
|
80185155a1 | ||
|
|
c755f1901f | ||
|
|
68b91dc905 | ||
|
|
88f06afc0c | ||
|
|
40078a55e2 | ||
|
|
d2558234cf | ||
|
|
f5fa042c82 | ||
|
|
07e4a40a9a | ||
|
|
e28f1c0ae8 | ||
|
|
ef39f8600a | ||
|
|
2291dbce2a | ||
|
|
58f197b76c | ||
|
|
895b0931e5 | ||
|
|
1ad047d0f7 | ||
|
|
be6202f12b | ||
|
|
e8f834cd8d | ||
|
|
e0e624ca7f | ||
|
|
ec4f374c05 | ||
|
|
c811e8d8bd | ||
|
|
b2cd5da460 | ||
|
|
2de3b21e05 | ||
|
|
4bed436371 | ||
|
|
efe9dba595 | ||
|
|
47f4203dd3 | ||
|
|
015c10aeec | ||
|
|
a00d781b73 | ||
|
|
0c541b563f | ||
|
|
64a5cf7929 | ||
|
|
7a450a3b1c | ||
|
|
7de27caf16 | ||
|
|
c26326c1be | ||
|
|
66a1b8643a | ||
|
|
15828bcf25 | ||
|
|
333217f43e | ||
|
|
4a2f19abbd | ||
|
|
5fbcebed8c | ||
|
|
becdc7f82c | ||
|
|
73b9088a1c | ||
|
|
f6a1d69a87 | ||
|
|
fd76a14259 | ||
|
|
171e59edd4 | ||
|
|
a0c3b2d5cf | ||
|
|
19bb39202d | ||
|
|
d4553567d2 | ||
|
|
4d49884c58 | ||
|
|
5873d4ccdd | ||
|
|
db9a564b6a | ||
|
|
c72967d5de | ||
|
|
598d185db1 | ||
|
|
b982cbdd0e | ||
|
|
6a04a74e8b | ||
|
|
88728713c8 | ||
|
|
6b1d8c1e30 | ||
|
|
87c3d06271 | ||
|
|
915f911e36 | ||
|
|
cf9d6cfb0c | ||
|
|
bbed5763f1 | ||
|
|
ca0b91b39e | ||
|
|
0cf0571560 | ||
|
|
e58c22a0f6 | ||
|
|
e4bdd3377d | ||
|
|
0b2e9d2c30 | ||
|
|
1bdae7d312 | ||
|
|
a471f21da6 | ||
|
|
6efb071135 | ||
|
|
f4536226c1 | ||
|
|
a439a3a45c | ||
|
|
26e2805c3f | ||
|
|
3b4775e021 | ||
|
|
ab406a1c0e | ||
|
|
a3faeb7de4 | ||
|
|
8c54a3051d | ||
|
|
c32b0aab8a | ||
|
|
3097d9e512 | ||
|
|
c1df120eda | ||
|
|
2cff495997 | ||
|
|
d0491a1ebe | ||
|
|
b9d68c199b | ||
|
|
155510fe81 | ||
|
|
201c145953 | ||
|
|
5d34200268 | ||
|
|
b7da73eb19 | ||
|
|
6a39ee13f7 | ||
|
|
33245766ab | ||
|
|
358de58c4d | ||
|
|
a7191c6f57 | ||
|
|
baa5873942 | ||
|
|
c6ce815461 | ||
|
|
79360d99d3 | ||
|
|
46fff7105e | ||
|
|
72e1fe969f | ||
|
|
b5be6dd504 | ||
|
|
8ea3f7b909 | ||
|
|
921b76cab8 | ||
|
|
a31953b0e6 | ||
|
|
54670cf084 | ||
|
|
a0f30f194a | ||
|
|
b31fdeedfd | ||
|
|
8fa43c73d8 | ||
|
|
56d868dbb7 | ||
|
|
f4f751af40 | ||
|
|
1988fab7e3 | ||
|
|
9de3ea3126 | ||
|
|
e01d6aa435 | ||
|
|
f7ad71607d | ||
|
|
68379de561 | ||
|
|
d9aa233295 | ||
|
|
f37468c41f | ||
|
|
52a8a1e1b9 | ||
|
|
d818eb7473 | ||
|
|
f8d4ad9ab0 | ||
|
|
3ffc7c89b0 | ||
|
|
f1823403b0 | ||
|
|
384fb069ec | ||
|
|
a4ddaf231e | ||
|
|
7e60c06925 | ||
|
|
d92f5d5a90 | ||
|
|
9e62f283ff | ||
|
|
c24ce07a84 | ||
|
|
de6758128e | ||
|
|
73d4343e39 | ||
|
|
57d104424f | ||
|
|
02aabd45d0 | ||
|
|
39ed931e53 | ||
|
|
b28f8d244a | ||
|
|
73cd218f5a | ||
|
|
84601bb72b | ||
|
|
54df8fc5b2 | ||
|
|
5d39972ed0 | ||
|
|
0481374e1d | ||
|
|
eff635394a | ||
|
|
df0c81513e | ||
|
|
3f6a90eb63 | ||
|
|
b050d210df | ||
|
|
f4e4be19f0 | ||
|
|
cce889b900 | ||
|
|
a6ae61a4c2 | ||
|
|
b23b9eefd9 | ||
|
|
a2f0b0c672 | ||
|
|
b704fc1a68 | ||
|
|
a3affbe6a0 | ||
|
|
1418a0437f | ||
|
|
143db31d48 | ||
|
|
3700c7ef10 | ||
|
|
498f560638 | ||
|
|
394dcd4486 | ||
|
|
83b20a970d | ||
|
|
e1feb88fdf | ||
|
|
389b9dbbcc | ||
|
|
a7f347d9c9 | ||
|
|
421a459573 | ||
|
|
c224251aad | ||
|
|
037cc66ec8 | ||
|
|
9160a0c6a2 | ||
|
|
5c5fae6d2f | ||
|
|
c1d3a4a8f0 | ||
|
|
adc74b3c6d | ||
|
|
beb4b92a66 | ||
|
|
cd9b384cc3 | ||
|
|
4d971a16b8 | ||
|
|
3561530776 | ||
|
|
4690688658 | ||
|
|
fe845284c4 | ||
|
|
2b3bf01c90 | ||
|
|
23c1a66730 | ||
|
|
dd18a58cb1 | ||
|
|
a94bfd6cfe | ||
|
|
a515a78dd3 | ||
|
|
e167860ce7 | ||
|
|
75d43ca080 | ||
|
|
5226731e2d | ||
|
|
dcf64d43e0 | ||
|
|
e3c076970e | ||
|
|
7978e172f3 | ||
|
|
605d299f83 | ||
|
|
18c1f04362 | ||
|
|
e4beae703d | ||
|
|
d034ab669c | ||
|
|
5aeefbd633 | ||
|
|
597c18665e | ||
|
|
10db0d2f57 | ||
|
|
7275535116 | ||
|
|
a1c5d2ca64 | ||
|
|
ca87974543 | ||
|
|
e92caff5d5 | ||
|
|
ea3a012d2a | ||
|
|
5b8917fb52 | ||
|
|
8eec0120a2 | ||
|
|
4cf1e5d2f9 | ||
|
|
0a473f2f0f | ||
|
|
e4edeb6226 | ||
|
|
d488e254d9 | ||
|
|
d7009caa03 | ||
|
|
54759df586 | ||
|
|
605b684c2d | ||
|
|
994443d24d | ||
|
|
c5640c4508 | ||
|
|
1f52a09e2e | ||
|
|
fc21af505c | ||
|
|
015f3b3120 | ||
|
|
5ba4a0b69c | ||
|
|
0852947fcc | ||
|
|
99594a11ce | ||
|
|
2be71994c0 | ||
|
|
26fe8ffed0 | ||
|
|
feee67ae88 | ||
|
|
1caaf92d47 | ||
|
|
d069eca7a3 | ||
|
|
f3eaa8dd1c | ||
|
|
9e631877f8 | ||
|
|
36147a63e3 | ||
|
|
57db6a87ef | ||
|
|
cd7c66cf01 | ||
|
|
2c736b4f61 | ||
|
|
c4a508ab31 | ||
|
|
7815e55572 | ||
|
|
162e6f0000 | ||
|
|
a8278ababd | ||
|
|
bd9ed42387 | ||
|
|
5f7514957f | ||
|
|
3721515bde | ||
|
|
a5c5623470 | ||
|
|
c705177da2 | ||
|
|
d6e51845b7 | ||
|
|
da7f321e93 | ||
|
|
097b056c5a | ||
|
|
f3b737ed19 | ||
|
|
ee1e05581e | ||
|
|
ec5e77c558 | ||
|
|
b3b30a4bca | ||
|
|
5372545ddb | ||
|
|
5ef7d9bdd8 | ||
|
|
62bff2c170 | ||
|
|
f0884c8b3f | ||
|
|
277d6ff5f2 | ||
|
|
1cf376f55a | ||
|
|
7f7de7f94d | ||
|
|
86878b6cd9 | ||
|
|
b3d1242534 | ||
|
|
9bd2020476 | ||
|
|
ed9b7e3dd3 | ||
|
|
c552ae8838 | ||
|
|
31a5e037a7 | ||
|
|
3638226215 | ||
|
|
14fdfea973 | ||
|
|
b45d4e4a8e | ||
|
|
3e39273418 | ||
|
|
b965087396 | ||
|
|
359d6d8650 | ||
|
|
0e0040519b | ||
|
|
127d075955 | ||
|
|
bce8cbb089 | ||
|
|
aae273ded8 | ||
|
|
c74d1aa340 | ||
|
|
7c60c33efe | ||
|
|
0744a815b7 | ||
|
|
7a5c1cfe93 | ||
|
|
c4218ac3f1 | ||
|
|
a17417e8ca | ||
|
|
5b1ecbb327 | ||
|
|
e409895f13 | ||
|
|
310c2ed2c6 | ||
|
|
c8d83a22ef | ||
|
|
b1bb77d75f | ||
|
|
389e2956a7 | ||
|
|
da6dcbad7d | ||
|
|
6cfda0582b | ||
|
|
f76ede8ee4 | ||
|
|
e094cec18c | ||
|
|
d9524b89b7 | ||
|
|
ad68b9f07f |
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Makefile* text whitespace=-tab-in-indent
|
||||||
16
.github/ISSUE_TEMPLATE/1_broken_site.md
vendored
16
.github/ISSUE_TEMPLATE/1_broken_site.md
vendored
@@ -20,16 +20,16 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is 2021.02.16. If it's not, see https://github.com/pukkandan/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.05.20. 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/pukkandan/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/pukkandan/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar issues: 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 broken site support
|
- [ ] I'm reporting a broken site support
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.02.16**
|
- [ ] I've verified that I'm running yt-dlp version **2021.05.20**
|
||||||
- [ ] 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
|
||||||
@@ -38,13 +38,13 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
## Verbose log
|
## Verbose log
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Provide the complete verbose output of youtube-dlc that clearly demonstrates the problem.
|
Provide the complete verbose output of yt-dlp that clearly demonstrates the problem.
|
||||||
Add the `-v` flag to your command line you run youtube-dlc with (`youtube-dlc -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_jenozKcj']
|
||||||
[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.02.16
|
[debug] yt-dlp version 2021.05.20
|
||||||
[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: {}
|
||||||
|
|||||||
10
.github/ISSUE_TEMPLATE/2_site_support_request.md
vendored
10
.github/ISSUE_TEMPLATE/2_site_support_request.md
vendored
@@ -20,16 +20,16 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is 2021.02.16. If it's not, see https://github.com/pukkandan/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.05.20. 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/pukkandan/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/pukkandan/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.
|
||||||
- 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 new site support request
|
- [ ] I'm reporting a new site support request
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.02.16**
|
- [ ] I've verified that I'm running yt-dlp version **2021.05.20**
|
||||||
- [ ] 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
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is 2021.02.16. If it's not, see https://github.com/pukkandan/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.05.20. 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/pukkandan/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.02.16**
|
- [ ] I've verified that I'm running yt-dlp version **2021.05.20**
|
||||||
- [ ] 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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
18
.github/ISSUE_TEMPLATE/4_bug_report.md
vendored
18
.github/ISSUE_TEMPLATE/4_bug_report.md
vendored
@@ -20,17 +20,17 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is 2021.02.16. If it's not, see https://github.com/pukkandan/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.05.20. 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/pukkandan/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/pukkandan/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar issues: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
||||||
- Read bugs section in FAQ: https://github.com/pukkandan/yt-dlp
|
- Read bugs section in FAQ: https://github.com/yt-dlp/yt-dlp
|
||||||
- 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 broken site support issue
|
- [ ] I'm reporting a broken site support issue
|
||||||
- [ ] I've verified that I'm running yt-dlp version **2021.02.16**
|
- [ ] I've verified that I'm running yt-dlp version **2021.05.20**
|
||||||
- [ ] 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
|
||||||
@@ -40,13 +40,13 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
## Verbose log
|
## Verbose log
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Provide the complete verbose output of youtube-dlc that clearly demonstrates the problem.
|
Provide the complete verbose output of yt-dlp that clearly demonstrates the problem.
|
||||||
Add the `-v` flag to your command line you run youtube-dlc with (`youtube-dlc -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_jenozKcj']
|
||||||
[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.02.16
|
[debug] yt-dlp version 2021.05.20
|
||||||
[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: {}
|
||||||
|
|||||||
8
.github/ISSUE_TEMPLATE/5_feature_request.md
vendored
8
.github/ISSUE_TEMPLATE/5_feature_request.md
vendored
@@ -20,14 +20,14 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is 2021.02.16. If it's not, see https://github.com/pukkandan/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.05.20. 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/pukkandan/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.02.16**
|
- [ ] I've verified that I'm running yt-dlp version **2021.05.20**
|
||||||
- [ ] I've searched the bugtracker for similar feature requests including closed ones
|
- [ ] I've searched the bugtracker for similar feature requests including closed ones
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
8
.github/ISSUE_TEMPLATE/6_question.md
vendored
8
.github/ISSUE_TEMPLATE/6_question.md
vendored
@@ -20,9 +20,9 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of yt-dlp:
|
||||||
- Look through the README (https://github.com/pukkandan/yt-dlp) and FAQ (https://github.com/pukkandan/yt-dlp) for similar questions
|
- Look through the README (https://github.com/yt-dlp/yt-dlp) and FAQ (https://github.com/yt-dlp/yt-dlp) for similar questions
|
||||||
- Search the bugtracker for similar questions: https://github.com/blackjack4494/yt-dlc
|
- Search the bugtracker for similar questions: https://github.com/yt-dlp/yt-dlp
|
||||||
- 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)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
## Question
|
## Question
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Ask your question in an arbitrary form. Please make sure it's worded well enough to be understood, see https://github.com/blackjack4494/yt-dlc.
|
Ask your question in an arbitrary form. Please make sure it's worded well enough to be understood, see https://github.com/yt-dlp/yt-dlp.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
WRITE QUESTION HERE
|
WRITE QUESTION HERE
|
||||||
|
|||||||
12
.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md
vendored
12
.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md
vendored
@@ -20,11 +20,11 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is %(version)s. If it's not, see https://github.com/pukkandan/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 %(version)s. 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/pukkandan/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/pukkandan/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar issues: 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)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@@ -38,8 +38,8 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
## Verbose log
|
## Verbose log
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Provide the complete verbose output of youtube-dlc that clearly demonstrates the problem.
|
Provide the complete verbose output of yt-dlp that clearly demonstrates the problem.
|
||||||
Add the `-v` flag to your command line you run youtube-dlc with (`youtube-dlc -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_jenozKcj']
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is %(version)s. If it's not, see https://github.com/pukkandan/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 %(version)s. 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/pukkandan/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/pukkandan/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.
|
||||||
- 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)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is %(version)s. If it's not, see https://github.com/pukkandan/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 %(version)s. 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/pukkandan/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)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
14
.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md
vendored
14
.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md
vendored
@@ -20,12 +20,12 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is %(version)s. If it's not, see https://github.com/pukkandan/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 %(version)s. 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/pukkandan/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/pukkandan/yt-dlp. DO NOT post duplicates.
|
- Search the bugtracker for similar issues: https://github.com/yt-dlp/yt-dlp. DO NOT post duplicates.
|
||||||
- Read bugs section in FAQ: https://github.com/pukkandan/yt-dlp
|
- Read bugs section in FAQ: https://github.com/yt-dlp/yt-dlp
|
||||||
- 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)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
@@ -40,8 +40,8 @@ Carefully read and work through this check list in order to prevent the most com
|
|||||||
## Verbose log
|
## Verbose log
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Provide the complete verbose output of youtube-dlc that clearly demonstrates the problem.
|
Provide the complete verbose output of yt-dlp that clearly demonstrates the problem.
|
||||||
Add the `-v` flag to your command line you run youtube-dlc with (`youtube-dlc -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_jenozKcj']
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ assignees: ''
|
|||||||
## Checklist
|
## Checklist
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dlc:
|
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 `youtube-dlc --version` and ensure your version is %(version)s. If it's not, see https://github.com/pukkandan/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 %(version)s. 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/pukkandan/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)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
|||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
### Before submitting a *pull request* make sure you have:
|
### Before submitting a *pull request* make sure you have:
|
||||||
- [ ] At least skimmed through [adding new extractor tutorial](https://github.com/ytdl-org/youtube-dl#adding-support-for-a-new-site) and [youtube-dl coding conventions](https://github.com/ytdl-org/youtube-dl#youtube-dl-coding-conventions) sections
|
- [ ] At least skimmed through [adding new extractor tutorial](https://github.com/ytdl-org/youtube-dl#adding-support-for-a-new-site) and [youtube-dl coding conventions](https://github.com/ytdl-org/youtube-dl#youtube-dl-coding-conventions) sections
|
||||||
- [ ] [Searched](https://github.com/pukkandan/yt-dlp/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests
|
- [ ] [Searched](https://github.com/yt-dlp/yt-dlp/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests
|
||||||
- [ ] Checked the code with [flake8](https://pypi.python.org/pypi/flake8)
|
- [ ] Checked the code with [flake8](https://pypi.python.org/pypi/flake8)
|
||||||
|
|
||||||
### In order to be accepted and merged into youtube-dl each piece of code must be in public domain or released under [Unlicense](http://unlicense.org/). Check one of the following options:
|
### In order to be accepted and merged into youtube-dl each piece of code must be in public domain or released under [Unlicense](http://unlicense.org/). Check one of the following options:
|
||||||
|
|||||||
54
.github/workflows/build.yml
vendored
54
.github/workflows/build.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
ytdlc_version: ${{ steps.bump_version.outputs.ytdlc_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 }}
|
sha2_unix: ${{ steps.sha2_file.outputs.sha2_unix }}
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ jobs:
|
|||||||
id: bump_version
|
id: bump_version
|
||||||
run: python devscripts/update-version.py
|
run: python devscripts/update-version.py
|
||||||
- name: Print version
|
- name: Print version
|
||||||
run: echo "${{ steps.bump_version.outputs.ytdlc_version }}"
|
run: echo "${{ steps.bump_version.outputs.ytdlp_version }}"
|
||||||
- name: Run Make
|
- name: Run Make
|
||||||
run: make
|
run: make
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
@@ -36,26 +36,26 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ steps.bump_version.outputs.ytdlc_version }}
|
tag_name: ${{ steps.bump_version.outputs.ytdlp_version }}
|
||||||
release_name: yt-dlp ${{ steps.bump_version.outputs.ytdlc_version }}
|
release_name: yt-dlp ${{ steps.bump_version.outputs.ytdlp_version }}
|
||||||
body: |
|
body: |
|
||||||
Changelog:
|
Changelog:
|
||||||
PLACEHOLDER
|
PLACEHOLDER
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
- name: Upload youtube-dlc 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 }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
asset_path: ./youtube-dlc
|
asset_path: ./yt-dlp
|
||||||
asset_name: youtube-dlc
|
asset_name: yt-dlp
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
- name: Get SHA2-256SUMS for youtube-dlc
|
- name: Get SHA2-256SUMS for yt-dlp
|
||||||
id: sha2_file
|
id: sha2_file
|
||||||
run: echo "::set-output name=sha2_unix::$(sha256sum youtube-dlc | awk '{print $1}')"
|
run: echo "::set-output name=sha2_unix::$(sha256sum 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 }}
|
||||||
@@ -96,22 +96,22 @@ jobs:
|
|||||||
id: bump_version
|
id: bump_version
|
||||||
run: python devscripts/update-version.py
|
run: python devscripts/update-version.py
|
||||||
- name: Print version
|
- name: Print version
|
||||||
run: echo "${{ steps.bump_version.outputs.ytdlc_version }}"
|
run: echo "${{ steps.bump_version.outputs.ytdlp_version }}"
|
||||||
- name: Run PyInstaller Script
|
- name: Run PyInstaller Script
|
||||||
run: python pyinst.py 64
|
run: python pyinst.py 64
|
||||||
- name: Upload youtube-dlc.exe Windows binary
|
- name: Upload yt-dlp.exe Windows binary
|
||||||
id: upload-release-windows
|
id: upload-release-windows
|
||||||
uses: actions/upload-release-asset@v1
|
uses: actions/upload-release-asset@v1
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ needs.build_unix.outputs.upload_url }}
|
upload_url: ${{ needs.build_unix.outputs.upload_url }}
|
||||||
asset_path: ./dist/youtube-dlc.exe
|
asset_path: ./dist/yt-dlp.exe
|
||||||
asset_name: youtube-dlc.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 youtube-dlc.exe
|
- name: Get SHA2-256SUMS for yt-dlp.exe
|
||||||
id: sha2_file_win
|
id: sha2_file_win
|
||||||
run: echo "::set-output name=sha2_windows::$((Get-FileHash dist\youtube-dlc.exe -Algorithm SHA256).Hash.ToLower())"
|
run: echo "::set-output name=sha2_windows::$((Get-FileHash dist\yt-dlp.exe -Algorithm SHA256).Hash.ToLower())"
|
||||||
|
|
||||||
build_windows32:
|
build_windows32:
|
||||||
|
|
||||||
@@ -132,38 +132,38 @@ jobs:
|
|||||||
- 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 pip==19.1.1 setuptools==43.0.0 wheel==0.33.6
|
||||||
- name: Install Requirements for 32 Bit
|
- name: Install Requirements for 32 Bit
|
||||||
run: pip install pyinstaller==3.5 mutagen==1.42.0 pycryptodome==3.9.4
|
run: pip install pyinstaller==3.5 mutagen==1.42.0 pycryptodome==3.9.4 pefile==2019.4.18
|
||||||
- name: Bump version
|
- name: Bump version
|
||||||
id: bump_version
|
id: bump_version
|
||||||
run: python devscripts/update-version.py
|
run: python devscripts/update-version.py
|
||||||
- name: Print version
|
- name: Print version
|
||||||
run: echo "${{ steps.bump_version.outputs.ytdlc_version }}"
|
run: echo "${{ steps.bump_version.outputs.ytdlp_version }}"
|
||||||
- name: Run PyInstaller Script for 32 Bit
|
- name: Run PyInstaller Script for 32 Bit
|
||||||
run: python pyinst.py 32
|
run: python pyinst.py 32
|
||||||
- name: Upload Executable youtube-dlc_x86.exe
|
- name: Upload Executable yt-dlp_x86.exe
|
||||||
id: upload-release-windows32
|
id: upload-release-windows32
|
||||||
uses: actions/upload-release-asset@v1
|
uses: actions/upload-release-asset@v1
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ needs.build_unix.outputs.upload_url }}
|
upload_url: ${{ needs.build_unix.outputs.upload_url }}
|
||||||
asset_path: ./dist/youtube-dlc_x86.exe
|
asset_path: ./dist/yt-dlp_x86.exe
|
||||||
asset_name: youtube-dlc_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 youtube-dlc_x86.exe
|
- name: Get SHA2-256SUMS for yt-dlp_x86.exe
|
||||||
id: sha2_file_win32
|
id: sha2_file_win32
|
||||||
run: echo "::set-output name=sha2_windows32::$((Get-FileHash dist\youtube-dlc_x86.exe -Algorithm SHA256).Hash.ToLower())"
|
run: echo "::set-output name=sha2_windows32::$((Get-FileHash dist\yt-dlp_x86.exe -Algorithm SHA256).Hash.ToLower())"
|
||||||
- name: Make SHA2-256SUMS file
|
- name: Make SHA2-256SUMS file
|
||||||
env:
|
env:
|
||||||
SHA2_WINDOWS: ${{ needs.build_windows.outputs.sha2_windows }}
|
SHA2_WINDOWS: ${{ needs.build_windows.outputs.sha2_windows }}
|
||||||
SHA2_WINDOWS32: ${{ steps.sha2_file_win32.outputs.sha2_windows32 }}
|
SHA2_WINDOWS32: ${{ steps.sha2_file_win32.outputs.sha2_windows32 }}
|
||||||
SHA2_UNIX: ${{ needs.build_unix.outputs.sha2_unix }}
|
SHA2_UNIX: ${{ needs.build_unix.outputs.sha2_unix }}
|
||||||
YTDLC_VERSION: ${{ needs.build_unix.outputs.ytdlc_version }}
|
YTDLP_VERSION: ${{ needs.build_unix.outputs.ytdlp_version }}
|
||||||
run: |
|
run: |
|
||||||
echo "version:${env:YTDLC_VERSION}" >> SHA2-256SUMS
|
echo "version:${env:YTDLP_VERSION}" >> SHA2-256SUMS
|
||||||
echo "youtube-dlc.exe:${env:SHA2_WINDOWS}" >> SHA2-256SUMS
|
echo "yt-dlp.exe:${env:SHA2_WINDOWS}" >> SHA2-256SUMS
|
||||||
echo "youtube-dlc_x86.exe:${env:SHA2_WINDOWS32}" >> SHA2-256SUMS
|
echo "yt-dlp_x86.exe:${env:SHA2_WINDOWS32}" >> SHA2-256SUMS
|
||||||
echo "youtube-dlc:${env:SHA2_UNIX}" >> SHA2-256SUMS
|
echo "yt-dlp:${env:SHA2_UNIX}" >> SHA2-256SUMS
|
||||||
|
|
||||||
- name: Upload 256SUMS file
|
- name: Upload 256SUMS file
|
||||||
id: upload-sums
|
id: upload-sums
|
||||||
|
|||||||
13
.github/workflows/core.yml
vendored
13
.github/workflows/core.yml
vendored
@@ -3,10 +3,10 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
name: Core Tests
|
name: Core Tests
|
||||||
if: "!contains(github.event.head_commit.message, 'ci skip all')"
|
if: "!contains(github.event.head_commit.message, 'ci skip')"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-18.04]
|
os: [ubuntu-18.04]
|
||||||
# TODO: python 2.6
|
# TODO: python 2.6
|
||||||
@@ -41,11 +41,18 @@ jobs:
|
|||||||
- name: Install Jython
|
- name: Install Jython
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
if: ${{ matrix.python-impl == 'jython' }}
|
||||||
run: |
|
run: |
|
||||||
wget http://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar -O jython-installer.jar
|
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"
|
java -jar jython-installer.jar -s -d "$HOME/jython"
|
||||||
echo "$HOME/jython/bin" >> $GITHUB_PATH
|
echo "$HOME/jython/bin" >> $GITHUB_PATH
|
||||||
- name: Install nose
|
- name: Install nose
|
||||||
|
if: ${{ matrix.python-impl != 'jython' }}
|
||||||
run: pip install nose
|
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: ${{ matrix.ytdl-test-set == 'download' || matrix.python-impl == 'jython' }}
|
||||||
env:
|
env:
|
||||||
|
|||||||
11
.github/workflows/download.yml
vendored
11
.github/workflows/download.yml
vendored
@@ -3,7 +3,7 @@ on: [push, pull_request]
|
|||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
name: Download Tests
|
name: Download Tests
|
||||||
if: "!contains(github.event.head_commit.message, 'ci skip dl') && !contains(github.event.head_commit.message, 'ci skip all')"
|
if: "contains(github.event.head_commit.message, 'ci run dl')"
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
@@ -41,11 +41,18 @@ jobs:
|
|||||||
- name: Install Jython
|
- name: Install Jython
|
||||||
if: ${{ matrix.python-impl == 'jython' }}
|
if: ${{ matrix.python-impl == 'jython' }}
|
||||||
run: |
|
run: |
|
||||||
wget http://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar -O jython-installer.jar
|
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"
|
java -jar jython-installer.jar -s -d "$HOME/jython"
|
||||||
echo "$HOME/jython/bin" >> $GITHUB_PATH
|
echo "$HOME/jython/bin" >> $GITHUB_PATH
|
||||||
- name: Install nose
|
- name: Install nose
|
||||||
|
if: ${{ matrix.python-impl != 'jython' }}
|
||||||
run: pip install nose
|
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: ${{ matrix.ytdl-test-set == 'download' || matrix.python-impl == 'jython' }}
|
||||||
env:
|
env:
|
||||||
|
|||||||
96
.gitignore
vendored
96
.gitignore
vendored
@@ -1,3 +1,46 @@
|
|||||||
|
# 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
|
||||||
|
*.png
|
||||||
|
*.webp
|
||||||
|
*.annotations.xml
|
||||||
|
*.description
|
||||||
|
|
||||||
|
# Allow config/media files in testdata
|
||||||
|
!test/testdata/**
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
*.pyc
|
*.pyc
|
||||||
*.pyo
|
*.pyo
|
||||||
@@ -8,6 +51,7 @@ dist/
|
|||||||
zip/
|
zip/
|
||||||
tmp/
|
tmp/
|
||||||
venv/
|
venv/
|
||||||
|
completions/
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
*~
|
*~
|
||||||
@@ -24,7 +68,9 @@ updates_key.pem
|
|||||||
*.class
|
*.class
|
||||||
|
|
||||||
# Generated
|
# Generated
|
||||||
|
AUTHORS
|
||||||
README.txt
|
README.txt
|
||||||
|
.mailmap
|
||||||
*.1
|
*.1
|
||||||
*.bash-completion
|
*.bash-completion
|
||||||
*.fish
|
*.fish
|
||||||
@@ -34,57 +80,17 @@ README.txt
|
|||||||
*.spec
|
*.spec
|
||||||
|
|
||||||
# Binary
|
# Binary
|
||||||
youtube-dl
|
/youtube-dl
|
||||||
youtube-dlc
|
/youtube-dlc
|
||||||
youtube-dlc.zip
|
/yt-dlp
|
||||||
|
yt-dlp.zip
|
||||||
*.exe
|
*.exe
|
||||||
|
|
||||||
# Downloaded
|
|
||||||
*.srt
|
|
||||||
*.ttml
|
|
||||||
*.sbv
|
|
||||||
*.vtt
|
|
||||||
*.flv
|
|
||||||
*.mp4
|
|
||||||
*.m4a
|
|
||||||
*.m4v
|
|
||||||
*.mp3
|
|
||||||
*.3gp
|
|
||||||
*.wav
|
|
||||||
*.ape
|
|
||||||
*.mkv
|
|
||||||
*.swf
|
|
||||||
*.part
|
|
||||||
*.ytdl
|
|
||||||
*.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
|
||||||
.vscode
|
.vscode
|
||||||
*.sublime-workspace
|
*.sublime-*
|
||||||
*.sublime-project
|
|
||||||
!yt-dlp.sublime-project
|
|
||||||
|
|
||||||
# Lazy extractors
|
# Lazy extractors
|
||||||
*/extractor/lazy_extractors.py
|
*/extractor/lazy_extractors.py
|
||||||
|
|||||||
22
.readthedocs.yml
Normal file
22
.readthedocs.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# .readthedocs.yaml
|
||||||
|
# Read the Docs configuration file
|
||||||
|
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||||
|
|
||||||
|
# Required
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
# Build documentation in the docs/ directory with Sphinx
|
||||||
|
sphinx:
|
||||||
|
configuration: docs/conf.py
|
||||||
|
|
||||||
|
# Optionally build your docs in additional formats such as PDF
|
||||||
|
formats:
|
||||||
|
- epub
|
||||||
|
- pdf
|
||||||
|
- htmlzip
|
||||||
|
|
||||||
|
# Optionally set the version of Python and requirements required to build your docs
|
||||||
|
python:
|
||||||
|
version: 3
|
||||||
|
install:
|
||||||
|
- requirements: docs/requirements.txt
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
language: python
|
|
||||||
python:
|
|
||||||
- "2.6"
|
|
||||||
- "2.7"
|
|
||||||
- "3.2"
|
|
||||||
- "3.3"
|
|
||||||
- "3.4"
|
|
||||||
- "3.5"
|
|
||||||
- "3.6"
|
|
||||||
- "pypy"
|
|
||||||
- "pypy3"
|
|
||||||
dist: trusty
|
|
||||||
env:
|
|
||||||
- YTDL_TEST_SET=core
|
|
||||||
jobs:
|
|
||||||
include:
|
|
||||||
- python: 3.7
|
|
||||||
dist: xenial
|
|
||||||
env: YTDL_TEST_SET=core
|
|
||||||
- python: 3.8
|
|
||||||
dist: xenial
|
|
||||||
env: YTDL_TEST_SET=core
|
|
||||||
- python: 3.8-dev
|
|
||||||
dist: xenial
|
|
||||||
env: YTDL_TEST_SET=core
|
|
||||||
- env: JYTHON=true; YTDL_TEST_SET=core
|
|
||||||
- name: flake8
|
|
||||||
python: 3.8
|
|
||||||
dist: xenial
|
|
||||||
install: pip install flake8
|
|
||||||
script: flake8 .
|
|
||||||
fast_finish: true
|
|
||||||
allow_failures:
|
|
||||||
- env: YTDL_TEST_SET=download
|
|
||||||
- env: JYTHON=true; YTDL_TEST_SET=core
|
|
||||||
before_install:
|
|
||||||
- if [ "$JYTHON" == "true" ]; then ./devscripts/install_jython.sh; export PATH="$HOME/jython/bin:$PATH"; fi
|
|
||||||
script: ./devscripts/run_tests.sh
|
|
||||||
29
CONTRIBUTORS
29
CONTRIBUTORS
@@ -1,4 +1,6 @@
|
|||||||
pukkandan (owner)
|
pukkandan (owner)
|
||||||
|
shirt-dev (collaborator)
|
||||||
|
colethedj (collaborator)
|
||||||
h-h-h-h
|
h-h-h-h
|
||||||
pauldubois98
|
pauldubois98
|
||||||
nixxo
|
nixxo
|
||||||
@@ -17,7 +19,32 @@ alxnull
|
|||||||
FelixFrog
|
FelixFrog
|
||||||
Zocker1999NET
|
Zocker1999NET
|
||||||
nao20010128nao
|
nao20010128nao
|
||||||
shirt-dev
|
|
||||||
kurumigi
|
kurumigi
|
||||||
tsukumi
|
tsukumi
|
||||||
bbepis
|
bbepis
|
||||||
|
animelover1984
|
||||||
|
Pccode66
|
||||||
|
Ashish0804
|
||||||
|
RobinD42
|
||||||
|
hseg
|
||||||
|
DennyDai
|
||||||
|
codeasashu
|
||||||
|
teesid
|
||||||
|
kevinoconnor7
|
||||||
|
damianoamatruda
|
||||||
|
2ShedsJackson
|
||||||
|
CXwudi
|
||||||
|
xtkoba
|
||||||
|
llacb47
|
||||||
|
hheimbuerger
|
||||||
|
B0pol
|
||||||
|
lkho
|
||||||
|
fstirlitz
|
||||||
|
Lamieur
|
||||||
|
tsukumijima
|
||||||
|
Hadi0609
|
||||||
|
b5eff52
|
||||||
|
craftingmod
|
||||||
|
tpikonen
|
||||||
|
tripulse
|
||||||
|
king-millez
|
||||||
|
|||||||
443
Changelog.md
443
Changelog.md
@@ -5,10 +5,12 @@
|
|||||||
|
|
||||||
* Run `make doc`
|
* Run `make doc`
|
||||||
* Update Changelog.md and CONTRIBUTORS
|
* Update Changelog.md and CONTRIBUTORS
|
||||||
* Change "Merged with youtube-dl" version in Readme.md if needed
|
* Change "Merged with ytdl" version in Readme.md if needed
|
||||||
|
* Add new/fixed extractors in "new features" section of Readme.md
|
||||||
* Commit to master as `Release <version>`
|
* Commit to master as `Release <version>`
|
||||||
* Push to origin/release - build task will now run
|
* Push to origin/release using `git push origin master:release`
|
||||||
* Update version.py using devscripts\update-version.py
|
build task will now run
|
||||||
|
* 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
|
||||||
@@ -17,8 +19,362 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
### 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 [colethedj](https://github.com/colethedj) and [alex-gedeon](https://github.com/alex-gedeon)
|
||||||
|
* [fancode] Add extractor by [rmsmachine](https://github.com/rmsmachine)
|
||||||
|
* [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), [colethedj](https://github.com/colethedj) 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 [colethedj](https://github.com/colethedj)
|
||||||
|
* 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
|
||||||
|
* **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
|
||||||
|
* **Improve output template:**
|
||||||
|
* Allow slicing lists/strings using `field.start:end:step`
|
||||||
|
* A field can also be used as offset like `field1+num+field2`
|
||||||
|
* A default value can be given using `field|default`
|
||||||
|
* Prevent invalid fields from causing errors
|
||||||
|
* **Merge youtube-dl**: Upto [commit/a726009](https://github.com/ytdl-org/youtube-dl/commit/a7260099873acc6dc7d76cafad2f6b139087afd0)
|
||||||
|
* **Remove options** `-l`, `-t`, `-A` completely and disable `--auto-number`, `--title`, `--literal`, `--id`
|
||||||
|
* [Plugins] Prioritize plugins over standard extractors and prevent plugins from overwriting the standard extractor classes
|
||||||
|
* [downloader] Fix `quiet` and `to_stderr`
|
||||||
|
* [fragment] Ensure the file is closed on error
|
||||||
|
* [fragment] Make sure first segment is not skipped
|
||||||
|
* [aria2c] Fix whitespace being stripped off
|
||||||
|
* [embedthumbnail] Fix bug where jpeg thumbnails were converted again
|
||||||
|
* [FormatSort] Fix for when some formats have quality and others don't
|
||||||
|
* [utils] Add `network_exceptions`
|
||||||
|
* [utils] Escape URL while sanitizing
|
||||||
|
* [ukcolumn] Add Extractor
|
||||||
|
* [whowatch] Add extractor by [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
|
* [CBS] Improve `_VALID_URL` to support movies
|
||||||
|
* [crackle] Improve extraction
|
||||||
|
* [curiositystream] Fix collections
|
||||||
|
* [francetvinfo] Improve video id extraction
|
||||||
|
* [generic] Respect the encoding in manifest
|
||||||
|
* [limelight] Obey `allow_unplayable_formats`
|
||||||
|
* [mediasite] Generalize URL pattern by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [mxplayer] Add MxplayerShowIE by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [nebula] Move to nebula.app by [Lamieur](https://github.com/Lamieur)
|
||||||
|
* [niconico] Fix HLS formats by [CXwudi](https://github.com/CXwudi), [tsukumijima](https://github.com/tsukumijima), [nao20010128nao](https://github.com/nao20010128nao) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [niconico] Fix title and thumbnail extraction by [CXwudi](https://github.com/CXwudi)
|
||||||
|
* [plutotv] Extract subtitles from manifests
|
||||||
|
* [plutotv] Fix format extraction for some urls
|
||||||
|
* [rmcdecouverte] Improve `_VALID_URL`
|
||||||
|
* [sonyliv] Fix `title` and `series` extraction by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [tubi] Raise "no video formats" error when video url is empty
|
||||||
|
* [youtube:tab] Detect playlists inside community posts
|
||||||
|
* [youtube] Add `oembed` to reserved names
|
||||||
|
* [zee5] Fix extraction for some URLs by [Hadi0609](https://github.com/Hadi0609)
|
||||||
|
* [zee5] Fix py2 compatibility
|
||||||
|
* Fix `playlist_index` and add `playlist_autonumber`. See [#302](https://github.com/yt-dlp/yt-dlp/issues/302) for details
|
||||||
|
* Add experimental option `--check-formats` to test the URLs before format selection
|
||||||
|
* Option `--compat-options` to revert [some of yt-dlp's changes](https://github.com/yt-dlp/yt-dlp#differences-in-default-behavior)
|
||||||
|
* Deprecates `--list-formats-as-table`, `--list-formats-old`
|
||||||
|
* Fix number of digits in `%(playlist_index)s`
|
||||||
|
* Fix case sensitivity of format selector
|
||||||
|
* Revert "[core] be able to hand over id and title using url_result"
|
||||||
|
* Do not strip out whitespaces in `-o` and `-P`
|
||||||
|
* Fix `preload_download_archive` writing verbose message to `stdout`
|
||||||
|
* Move option warnings to `YoutubeDL`so that they obey `--no-warnings` and can output colors
|
||||||
|
* Py2 compatibility for `FileNotFoundError`
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.04.22
|
||||||
|
* **Improve output template:**
|
||||||
|
* Objects can be traversed like `%(field.key1.key2)s`
|
||||||
|
* An offset can be added to numeric fields as `%(field+N)s`
|
||||||
|
* Deprecates `--autonumber-start`
|
||||||
|
* **Improve `--sub-langs`:**
|
||||||
|
* Treat `--sub-langs` entries as regex
|
||||||
|
* `all` can be used to refer to all the subtitles
|
||||||
|
* language codes can be prefixed with `-` to exclude it
|
||||||
|
* Deprecates `--all-subs`
|
||||||
|
* Add option `--ignore-no-formats-error` to ignore the "no video format" and similar errors
|
||||||
|
* Add option `--skip-playlist-after-errors` to skip the rest of a playlist after a given number of errors are encountered
|
||||||
|
* Merge youtube-dl: Upto [commit/7e8b3f9](https://github.com/ytdl-org/youtube-dl/commit/7e8b3f9439ebefb3a3a4e5da9c0bd2b595976438)
|
||||||
|
* [downloader] Fix bug in downloader selection
|
||||||
|
* [BilibiliChannel] Fix pagination by [nao20010128nao](https://github.com/nao20010128nao) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [rai] Add support for http formats by [nixxo](https://github.com/nixxo)
|
||||||
|
* [TubiTv] Add TubiTvShowIE by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [twitcasting] Fix extractor
|
||||||
|
* [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] Reload with unavailable videos for all playlists
|
||||||
|
* [youtube] Ignore invalid stretch ratio
|
||||||
|
* [youtube] Improve channel syncid extraction to support ytcfg by [colethedj](https://github.com/colethedj)
|
||||||
|
* [youtube] Standardize API calls for tabs, mixes and search by [colethedj](https://github.com/colethedj)
|
||||||
|
* [youtube] Bugfix in `_extract_ytcfg`
|
||||||
|
* [mildom:user:vod] Download only necessary amount of pages
|
||||||
|
* [mildom] Remove proxy completely by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [go] Fix `_VALID_URL`
|
||||||
|
* [MetadataFromField] Improve regex and add tests
|
||||||
|
* [Exec] Ensure backward compatibility when the command contains `%`
|
||||||
|
* [extractor] Fix inconsistent use of `report_warning`
|
||||||
|
* Ensure `mergeall` selects best format when multistreams are disabled
|
||||||
|
* Improve the yt-dlp.sh script by [fstirlitz](https://github.com/fstirlitz)
|
||||||
|
* [lazy_extractor] Do not load plugins
|
||||||
|
* [ci] Disable fail-fast
|
||||||
|
* [documentation] Clarify which deprecated options still work
|
||||||
|
* [documentation] Fix typos
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.04.11
|
||||||
|
* Add option `--convert-thumbnails` (only jpg currently supported)
|
||||||
|
* Format selector `mergeall` to download and merge all formats
|
||||||
|
* Pass any field to `--exec` using similar syntax to output template
|
||||||
|
* Choose downloader for each protocol using `--downloader PROTO:NAME`
|
||||||
|
* Alias `--downloader` for `--external-downloader`
|
||||||
|
* Added `native` as an option for the downloader
|
||||||
|
* Merge youtube-dl: Upto [commit/4fb25ff](https://github.com/ytdl-org/youtube-dl/commit/4fb25ff5a3be5206bb72e5c4046715b1529fb2c7) (except vimeo)
|
||||||
|
* [DiscoveryPlusIndia] Add DiscoveryPlusIndiaShowIE by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* [NFHSNetwork] Add extractor by [llacb47](https://github.com/llacb47)
|
||||||
|
* [nebula] Add extractor (watchnebula.com) by [hheimbuerger](https://github.com/hheimbuerger)
|
||||||
|
* [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)
|
||||||
|
* [youtube] Fix thumbnail URL
|
||||||
|
* [youtube] Parse API parameters from initial webpage by [colethedj](https://github.com/colethedj)
|
||||||
|
* [youtube] Extract comments' approximate timestamp by [colethedj](https://github.com/colethedj)
|
||||||
|
* [youtube] Fix alert extraction
|
||||||
|
* [bilibili] Fix uploader
|
||||||
|
* [utils] Add `datetime_from_str` and `datetime_add_months` by [colethedj](https://github.com/colethedj)
|
||||||
|
* Run some `postprocessors` before actual download
|
||||||
|
* Improve argument parsing for `-P`, `-o`, `-S`
|
||||||
|
* Fix some `m3u8` not obeying `--allow-unplayable-formats`
|
||||||
|
* Fix default of `dynamic_mpd`
|
||||||
|
* Deprecate `--all-formats`, `--include-ads`, `--hls-prefer-native`, `--hls-prefer-ffmpeg`
|
||||||
|
* [documentation] Improvements
|
||||||
|
|
||||||
|
### 2021.04.03
|
||||||
|
* Merge youtube-dl: Upto [commit/654b4f4](https://github.com/ytdl-org/youtube-dl/commit/654b4f4ff2718f38b3182c1188c5d569c14cc70a)
|
||||||
|
* Ability to set a specific field in the file's metadata using `--parse-metadata`
|
||||||
|
* Ability to select n'th best format like `-f bv*.2`
|
||||||
|
* [DiscoveryPlus] Add discoveryplus.in
|
||||||
|
* [la7] Add podcasts and podcast playlists by [nixxo](https://github.com/nixxo)
|
||||||
|
* [mildom] Update extractor with current proxy by [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
|
* [ard:mediathek] Fix video id extraction
|
||||||
|
* [generic] Detect Invidious' link element
|
||||||
|
* [youtube] Show premium state in `availability` by [colethedj](https://github.com/colethedj)
|
||||||
|
* [viewsource] Add extractor to handle `view-source:`
|
||||||
|
* [sponskrub] Run before embedding thumbnail
|
||||||
|
* [documentation] Improve `--parse-metadata` documentation
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.03.24.1
|
||||||
|
* Revert [commit/8562218](https://github.com/ytdl-org/youtube-dl/commit/8562218350a79d4709da8593bb0c538aa0824acf)
|
||||||
|
|
||||||
|
### 2021.03.24
|
||||||
|
* Merge youtube-dl: Upto 2021.03.25 ([commit/8562218](https://github.com/ytdl-org/youtube-dl/commit/8562218350a79d4709da8593bb0c538aa0824acf))
|
||||||
|
* Parse metadata from multiple fields using `--parse-metadata`
|
||||||
|
* Ability to load playlist infojson using `--load-info-json`
|
||||||
|
* Write current epoch to infojson when using `--no-clean-infojson`
|
||||||
|
* [youtube_live_chat] fix bug when trying to set cookies
|
||||||
|
* [niconico] Fix for when logged in by [CXwudi](https://github.com/CXwudi) and [xtkoba](https://github.com/xtkoba)
|
||||||
|
* [linuxacadamy] Fix login
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.03.21
|
||||||
|
* Merge youtube-dl: Upto [commit/7e79ba7](https://github.com/ytdl-org/youtube-dl/commit/7e79ba7dd6e6649dd2ce3a74004b2044f2182881)
|
||||||
|
* Option `--no-clean-infojson` to keep private keys in the infojson
|
||||||
|
* [aria2c] Support retry/abort unavailable fragments by [damianoamatruda](https://github.com/damianoamatruda)
|
||||||
|
* [aria2c] Better default arguments
|
||||||
|
* [movefiles] Fix bugs and make more robust
|
||||||
|
* [formatSort] Fix `quality` being ignored
|
||||||
|
* [splitchapters] Fix for older ffmpeg
|
||||||
|
* [sponskrub] Pass proxy to sponskrub
|
||||||
|
* Make sure `post_hook` gets the final filename
|
||||||
|
* Recursively remove any private keys from infojson
|
||||||
|
* Embed video URL metadata inside `mp4` by [damianoamatruda](https://github.com/damianoamatruda) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* Merge `webm` formats into `mkv` if thumbnails are to be embedded 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)
|
||||||
|
* More consistent warning messages by [damianoamatruda](https://github.com/damianoamatruda) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [documentation] Add deprecated options and aliases in readme
|
||||||
|
* [documentation] 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] Add user extractor by [animelover1984](https://github.com/animelover1984)
|
||||||
|
* [bilibili] Add anthology support by [animelover1984](https://github.com/animelover1984)
|
||||||
|
* [amcnetworks] Fix extractor by [2ShedsJackson](https://github.com/2ShedsJackson)
|
||||||
|
* [stitcher] Merge from youtube-dl by [nixxo](https://github.com/nixxo)
|
||||||
|
* [rcs] Improved extraction by [nixxo](https://github.com/nixxo)
|
||||||
|
* [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] bugfix for channel playlist extraction
|
||||||
|
* [nbc] Improve metadata extraction by [2ShedsJackson](https://github.com/2ShedsJackson)
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.03.15
|
||||||
|
* **Split video by chapters**: using option `--split-chapters`
|
||||||
|
* The output file of the split files can be set with `-o`/`-P` using the prefix `chapter:`
|
||||||
|
* Additional keys `section_title`, `section_number`, `section_start`, `section_end` are available in the output template
|
||||||
|
* **Parallel fragment downloads** by [shirt](https://github.com/shirt-dev)
|
||||||
|
* Use option `--concurrent-fragments` (`-N`) to set the number of threads (default 1)
|
||||||
|
* Merge youtube-dl: Upto [commit/3be0980](https://github.com/ytdl-org/youtube-dl/commit/3be098010f667b14075e3dfad1e74e5e2becc8ea)
|
||||||
|
* [zee5] Add Show Extractor by [Ashish0804](https://github.com/Ashish0804) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [rai] fix drm check [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)
|
||||||
|
* [pluto.tv] Add extractor by [kevinoconnor7](https://github.com/kevinoconnor7)
|
||||||
|
* [youtube] Rewrite comment extraction by [colethedj](https://github.com/colethedj)
|
||||||
|
* [embedthumbnail] Set mtime correctly
|
||||||
|
* Refactor some postprocessor/downloader code by [pukkandan](https://github.com/pukkandan) and [shirt](https://github.com/shirt-dev)
|
||||||
|
|
||||||
|
|
||||||
|
### 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 private feeds/playlists on multi-channel accounts by [colethedj](https://github.com/colethedj)
|
||||||
|
* [youtube] Extract alerts from continuation by [colethedj](https://github.com/colethedj)
|
||||||
|
* [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)
|
||||||
|
* [gedi] Improvements from youtube-dl by [nixxo](https://github.com/nixxo)
|
||||||
|
* [vimeo] Fix videos with password by [teesid](https://github.com/teesid)
|
||||||
|
* [lbry] Support `lbry://` url by [nixxo](https://github.com/nixxo)
|
||||||
|
* [bilibili] Change `Accept` header by [pukkandan](https://github.com/pukkandan) and [animelover1984](https://github.com/animelover1984)
|
||||||
|
* [trovo] Pass origin header
|
||||||
|
* [rai] Check for DRM by [nixxo](https://github.com/nixxo)
|
||||||
|
* [downloader] Fix bug for `ffmpeg`/`httpie`
|
||||||
|
* [update] Fix updater removing the executable bit on some UNIX distros
|
||||||
|
* [update] Fix current build hash for UNIX
|
||||||
|
* [documentation] Include wget/curl/aria2c install instructions for Unix by [Ashish0804](https://github.com/Ashish0804)
|
||||||
|
* Fix some videos downloading with `m3u8` extension
|
||||||
|
* Remove "fixup is ignored" warning when fixup wasn't passed by user
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.03.03.2
|
||||||
|
* [build] Fix bug
|
||||||
|
|
||||||
|
### 2021.03.03
|
||||||
|
* [youtube] Use new browse API for continuation page extraction by [colethedj](https://github.com/colethedj) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* 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)
|
||||||
|
* [mtv] Fix extractor
|
||||||
|
* [nick] Fix extractor by [DennyDai](https://github.com/DennyDai)
|
||||||
|
* [mxplayer] Add new extractor by [codeasashu](https://github.com/codeasashu)
|
||||||
|
* [youtube] Throw error when `--extractor-retries` are exhausted
|
||||||
|
* Reduce default of `--extractor-retries` to 3
|
||||||
|
* Fix packaging bugs by [hseg](https://github.com/hseg)
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.03.01
|
||||||
|
* Allow specifying path in `--external-downloader`
|
||||||
|
* Add option `--sleep-requests` to sleep b/w requests
|
||||||
|
* Add option `--extractor-retries` to retry on known extractor errors
|
||||||
|
* Extract comments only when needed
|
||||||
|
* `--get-comments` doesn't imply `--write-info-json` if `-J`, `-j` or `--print-json` are used
|
||||||
|
* Fix `get_executable_path` by [shirt](https://github.com/shirt-dev)
|
||||||
|
* [youtube] Retry on more known errors than just HTTP-5xx
|
||||||
|
* [youtube] Fix inconsistent `webpage_url`
|
||||||
|
* [tennistv] Fix format sorting
|
||||||
|
* [bilibiliaudio] Recognize the file as audio-only
|
||||||
|
* [hrfensehen] Fix wrong import
|
||||||
|
* [viki] Fix viki play pass authentication by [RobinD42](https://github.com/RobinD42)
|
||||||
|
* [readthedocs] Improvements by [shirt](https://github.com/shirt-dev)
|
||||||
|
* [hls] Fix bug with m3u8 format extraction
|
||||||
|
* [hls] Enable `--hls-use-mpegts` by default when downloading live-streams
|
||||||
|
* [embedthumbnail] Fix bug with deleting original thumbnail
|
||||||
|
* [build] Fix completion paths, zsh pip completion install by [hseg](https://github.com/hseg)
|
||||||
|
* [ci] Disable download tests unless specifically invoked
|
||||||
|
* Cleanup some code and fix typos
|
||||||
|
|
||||||
|
|
||||||
|
### 2021.02.24
|
||||||
|
* Moved project to an organization [yt-dlp](https://github.com/yt-dlp)
|
||||||
|
* **Completely changed project name to yt-dlp** by [Pccode66](https://github.com/Pccode66) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* Also, `youtube-dlc` config files are no longer loaded
|
||||||
|
* Merge youtube-dl: Upto [commit/4460329](https://github.com/ytdl-org/youtube-dl/commit/44603290e5002153f3ebad6230cc73aef42cc2cd) (except tmz, gedi)
|
||||||
|
* [Readthedocs](https://yt-dlp.readthedocs.io) support by [shirt](https://github.com/shirt-dev)
|
||||||
|
* [youtube] Show if video was a live stream in info (`was_live`)
|
||||||
|
* [Zee5] Add new extractor by [Ashish0804](https://github.com/Ashish0804) and [pukkandan](https://github.com/pukkandan)
|
||||||
|
* [jwplatform] Add support for `hyland.com`
|
||||||
|
* [tennistv] Fix extractor
|
||||||
|
* [hls] Support media initialization by [shirt](https://github.com/shirt-dev)
|
||||||
|
* [hls] Added options `--hls-split-discontinuity` to better support media discontinuity by [shirt](https://github.com/shirt-dev)
|
||||||
|
* [ffmpeg] Allow passing custom arguments before -i using `--ppa "ffmpeg_i1:ARGS"` syntax
|
||||||
|
* Fix `--windows-filenames` removing `/` from UNIX paths
|
||||||
|
* [hls] Show warning if pycryptodome is not found
|
||||||
|
* [documentation] Improvements
|
||||||
|
* Fix documentation of `Extractor Options`
|
||||||
|
* Document `all` in format selection
|
||||||
|
* Document `playable_in_embed` in output templates
|
||||||
|
|
||||||
|
|
||||||
### 2021.02.19
|
### 2021.02.19
|
||||||
* **Merge youtube-dl:** Upto [commit/cf2dbec](https://github.com/ytdl-org/youtube-dl/commit/cf2dbec6301177a1fddf72862de05fa912d9869d) (except kakao)
|
* Merge youtube-dl: Upto [commit/cf2dbec](https://github.com/ytdl-org/youtube-dl/commit/cf2dbec6301177a1fddf72862de05fa912d9869d) (except kakao)
|
||||||
* [viki] Fix extractor
|
* [viki] Fix extractor
|
||||||
* [niconico] Extract `channel` and `channel_id` by [kurumigi](https://github.com/kurumigi)
|
* [niconico] Extract `channel` and `channel_id` by [kurumigi](https://github.com/kurumigi)
|
||||||
* [youtube] Multiple page support for hashtag URLs
|
* [youtube] Multiple page support for hashtag URLs
|
||||||
@@ -43,7 +399,7 @@
|
|||||||
|
|
||||||
|
|
||||||
### 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), [tsukumi](https://github.com/tsukumi), [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)
|
||||||
@@ -86,7 +442,7 @@
|
|||||||
|
|
||||||
|
|
||||||
### 2021.02.04
|
### 2021.02.04
|
||||||
* **Merge youtube-dl:** Upto [2021.02.04.1](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.02.04.1)
|
* Merge youtube-dl: Upto [2021.02.04.1](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.02.04.1)
|
||||||
* **Date/time formatting in output template:**
|
* **Date/time formatting in output template:**
|
||||||
* You can use [`strftime`](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes) to format date/time fields. Example: `%(upload_date>%Y-%m-%d)s`
|
* You can use [`strftime`](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes) to format date/time fields. Example: `%(upload_date>%Y-%m-%d)s`
|
||||||
* **Multiple output templates:**
|
* **Multiple output templates:**
|
||||||
@@ -140,13 +496,13 @@
|
|||||||
|
|
||||||
|
|
||||||
### 2021.01.24
|
### 2021.01.24
|
||||||
* **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/pukkandan/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/pukkandan/yt-dlp#:~:text=-P,%20--paths%20TYPE:PATH))
|
* The syntax is `-P "type:path" -P "type:path"` ([documentation](https://github.com/yt-dlp/yt-dlp#:~:text=-P,%20--paths%20TYPE: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/pukkandan/yt-dlp#:~:text=Home%20Configuration))
|
* Additionally, configuration file is taken from home directory or current directory ([documentation](https://github.com/yt-dlp/yt-dlp#:~:text=Home%20Configuration))
|
||||||
* Allow passing different arguments to different external downloaders ([documentation](https://github.com/pukkandan/yt-dlp#:~:text=--downloader-args%20NAME:ARGS))
|
* Allow passing different arguments to different external downloaders ([documentation](https://github.com/yt-dlp/yt-dlp#:~:text=--downloader-args%20NAME:ARGS))
|
||||||
* [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`
|
||||||
@@ -169,10 +525,10 @@
|
|||||||
|
|
||||||
|
|
||||||
### 2021.01.16
|
### 2021.01.16
|
||||||
* **Merge youtube-dl:** Upto [2021.01.16](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.01.16)
|
* Merge youtube-dl: Upto [2021.01.16](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.01.16)
|
||||||
* **Configuration files:**
|
* **Configuration files:**
|
||||||
* Portable configuration file: `./yt-dlp.conf`
|
* Portable configuration file: `./yt-dlp.conf`
|
||||||
* Allow the configuration files to be named `yt-dlp` instead of `youtube-dlc`. See [this](https://github.com/pukkandan/yt-dlp#configuration) for details
|
* Allow the configuration files to be named `yt-dlp` instead of `youtube-dlc`. See [this](https://github.com/yt-dlp/yt-dlp#configuration) for details
|
||||||
* Add PyPI release
|
* Add PyPI release
|
||||||
|
|
||||||
|
|
||||||
@@ -181,7 +537,7 @@
|
|||||||
* [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 [pukkandan/sponskrub](https://github.com/pukkandan/SponSkrub) since I am now providing both linux and windows releases
|
* [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
|
||||||
* [documentation] Change all links to correctly point to new fork URL
|
* [documentation] Change all links to correctly point to new fork URL
|
||||||
* [documentation] Fixes typos
|
* [documentation] Fixes typos
|
||||||
|
|
||||||
@@ -199,7 +555,7 @@
|
|||||||
* [archive.org] Fix extractor and add support for audio and playlists by [wporr](https://github.com/wporr)
|
* [archive.org] Fix extractor and add support for audio and playlists by [wporr](https://github.com/wporr)
|
||||||
* [Animelab] Added by [mariuszskon](https://github.com/mariuszskon)
|
* [Animelab] Added by [mariuszskon](https://github.com/mariuszskon)
|
||||||
* [youtube:search] Fix view_count by [ohnonot](https://github.com/ohnonot)
|
* [youtube:search] Fix view_count by [ohnonot](https://github.com/ohnonot)
|
||||||
* [youtube] Show if video is embeddable in info
|
* [youtube] Show if video is embeddable in info (`playable_in_embed`)
|
||||||
* Update version badge automatically in README
|
* Update version badge automatically in README
|
||||||
* Enable `test_youtube_search_matching`
|
* Enable `test_youtube_search_matching`
|
||||||
* Create `to_screen` and similar functions in postprocessor/common
|
* Create `to_screen` and similar functions in postprocessor/common
|
||||||
@@ -215,9 +571,8 @@
|
|||||||
|
|
||||||
|
|
||||||
### 2021.01.08
|
### 2021.01.08
|
||||||
* **Merge youtube-dl:** Upto [2021.01.08](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.01.08)
|
* Merge youtube-dl: Upto [2021.01.08](https://github.com/ytdl-org/youtube-dl/releases/tag/2021.01.08) except stitcher ([1](https://github.com/ytdl-org/youtube-dl/commit/bb38a1215718cdf36d73ff0a7830a64cd9fa37cc), [2](https://github.com/ytdl-org/youtube-dl/commit/a563c97c5cddf55f8989ed7ea8314ef78e30107f))
|
||||||
* Extractor stitcher ([1](https://github.com/ytdl-org/youtube-dl/commit/bb38a1215718cdf36d73ff0a7830a64cd9fa37cc), [2](https://github.com/ytdl-org/youtube-dl/commit/a563c97c5cddf55f8989ed7ea8314ef78e30107f)) have not been merged
|
* Moved changelog to separate file
|
||||||
* Moved changelog to seperate file
|
|
||||||
|
|
||||||
|
|
||||||
### 2021.01.07-1
|
### 2021.01.07-1
|
||||||
@@ -255,8 +610,8 @@
|
|||||||
* Changed video format sorting to show video only files and video+audio files together.
|
* Changed video format sorting to show video only files and video+audio files together.
|
||||||
* Added `--video-multistreams`, `--no-video-multistreams`, `--audio-multistreams`, `--no-audio-multistreams`
|
* Added `--video-multistreams`, `--no-video-multistreams`, `--audio-multistreams`, `--no-audio-multistreams`
|
||||||
* Added `b`,`w`,`v`,`a` as alias for `best`, `worst`, `video` and `audio` respectively
|
* Added `b`,`w`,`v`,`a` as alias for `best`, `worst`, `video` and `audio` respectively
|
||||||
* **Shortcut Options:** Added `--write-link`, `--write-url-link`, `--write-webloc-link`, `--write-desktop-link` by [h-h-h-h](https://github.com/h-h-h-h) - See [Internet Shortcut Options](README.md#internet-shortcut-options) for details
|
* Shortcut Options: Added `--write-link`, `--write-url-link`, `--write-webloc-link`, `--write-desktop-link` by [h-h-h-h](https://github.com/h-h-h-h) - See [Internet Shortcut Options](README.md#internet-shortcut-options) for details
|
||||||
* **Sponskrub integration:** Added `--sponskrub`, `--sponskrub-cut`, `--sponskrub-force`, `--sponskrub-location`, `--sponskrub-args` - See [SponSkrub Options](README.md#sponskrub-options-sponsorblock) for details
|
* **Sponskrub integration:** Added `--sponskrub`, `--sponskrub-cut`, `--sponskrub-force`, `--sponskrub-location`, `--sponskrub-args` - See [SponSkrub Options](README.md#sponskrub-sponsorblock-options) for details
|
||||||
* Added `--force-download-archive` (`--force-write-archive`) by [h-h-h-h](https://github.com/h-h-h-h)
|
* Added `--force-download-archive` (`--force-write-archive`) by [h-h-h-h](https://github.com/h-h-h-h)
|
||||||
* Added `--list-formats-as-table`, `--list-formats-old`
|
* Added `--list-formats-as-table`, `--list-formats-old`
|
||||||
* **Negative Options:** Makes it possible to negate most boolean options by adding a `no-` to the switch. Usefull when you want to reverse an option that is defined in a config file
|
* **Negative Options:** Makes it possible to negate most boolean options by adding a `no-` to the switch. Usefull when you want to reverse an option that is defined in a config file
|
||||||
@@ -265,36 +620,38 @@
|
|||||||
* Relaxed validation for format filters so that any arbitrary field can be used
|
* Relaxed validation for format filters so that any arbitrary field can be used
|
||||||
* Fix for embedding thumbnail in mp3 by [pauldubois98](https://github.com/pauldubois98) ([ytdl-org/youtube-dl#21569](https://github.com/ytdl-org/youtube-dl/pull/21569))
|
* Fix for embedding thumbnail in mp3 by [pauldubois98](https://github.com/pauldubois98) ([ytdl-org/youtube-dl#21569](https://github.com/ytdl-org/youtube-dl/pull/21569))
|
||||||
* Make Twitch Video ID output from Playlist and VOD extractor same. This is only a temporary fix
|
* Make Twitch Video ID output from Playlist and VOD extractor same. This is only a temporary fix
|
||||||
* **Merge youtube-dl:** Upto [2021.01.03](https://github.com/ytdl-org/youtube-dl/commit/8e953dcbb10a1a42f4e12e4e132657cb0100a1f8) - See [blackjack4494/yt-dlc#280](https://github.com/blackjack4494/yt-dlc/pull/280) for details
|
* Merge youtube-dl: Upto [2021.01.03](https://github.com/ytdl-org/youtube-dl/commit/8e953dcbb10a1a42f4e12e4e132657cb0100a1f8) - See [blackjack4494/yt-dlc#280](https://github.com/blackjack4494/yt-dlc/pull/280) for details
|
||||||
* Extractors [tiktok](https://github.com/ytdl-org/youtube-dl/commit/fb626c05867deab04425bad0c0b16b55473841a2) and [hotstar](https://github.com/ytdl-org/youtube-dl/commit/bb38a1215718cdf36d73ff0a7830a64cd9fa37cc) have not been merged
|
* Extractors [tiktok](https://github.com/ytdl-org/youtube-dl/commit/fb626c05867deab04425bad0c0b16b55473841a2) and [hotstar](https://github.com/ytdl-org/youtube-dl/commit/bb38a1215718cdf36d73ff0a7830a64cd9fa37cc) have not been merged
|
||||||
* Cleaned up the fork for public use
|
* Cleaned up the fork for public use
|
||||||
|
|
||||||
|
|
||||||
|
**PS**: All uncredited changes above this point are authored by [pukkandan](https://github.com/pukkandan)
|
||||||
|
|
||||||
### Unreleased changes in [blackjack4494/yt-dlc](https://github.com/blackjack4494/yt-dlc)
|
### Unreleased changes in [blackjack4494/yt-dlc](https://github.com/blackjack4494/yt-dlc)
|
||||||
* Updated to youtube-dl release 2020.11.26
|
* Updated to youtube-dl release 2020.11.26 by [pukkandan](https://github.com/pukkandan)
|
||||||
* [youtube]
|
* Youtube improvements by [pukkandan](https://github.com/pukkandan)
|
||||||
* Implemented all Youtube Feeds (ytfav, ytwatchlater, ytsubs, ythistory, ytrec) and SearchURL
|
* Implemented all Youtube Feeds (ytfav, ytwatchlater, ytsubs, ythistory, ytrec) and SearchURL
|
||||||
* Fix ytsearch not returning results sometimes due to promoted content
|
|
||||||
* Temporary fix for automatic captions - disable json3
|
|
||||||
* Fix some improper Youtube URLs
|
* Fix some improper Youtube URLs
|
||||||
* Redirect channel home to /video
|
* Redirect channel home to /video
|
||||||
* Print youtube's warning message
|
* Print youtube's warning message
|
||||||
* Multiple pages are handled better for feeds
|
* Handle Multiple pages for feeds better
|
||||||
|
* [youtube] Fix ytsearch not returning results sometimes due to promoted content by [colethedj](https://github.com/colethedj)
|
||||||
|
* [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
|
* Pre-check video IDs in the archive before downloading by [pukkandan](https://github.com/pukkandan)
|
||||||
* [bitwave.tv] New extractor
|
* [bitwave.tv] New extractor by [lorpus](https://github.com/lorpus)
|
||||||
* [Gedi] Add extractor
|
* [Gedi] Add extractor by [nixxo](https://github.com/nixxo)
|
||||||
* [Rcs] Add new extractor
|
* [Rcs] Add new extractor by [nixxo](https://github.com/nixxo)
|
||||||
* [skyit] Add support for multiple Sky Italia website and removed old skyitalia extractor
|
* [skyit] New skyitalia extractor by [nixxo](https://github.com/nixxo)
|
||||||
* [france.tv] Fix thumbnail URL
|
* [france.tv] Fix thumbnail URL by [renalid](https://github.com/renalid)
|
||||||
* [ina] support mobile links
|
* [ina] support mobile links by [B0pol](https://github.com/B0pol)
|
||||||
* [instagram] Fix extractor
|
* [instagram] Fix thumbnail extractor by [nao20010128nao](https://github.com/nao20010128nao)
|
||||||
* [itv] BTCC new pages' URL update (articles instead of races)
|
* [SouthparkDe] Support for English URLs by [xypwn](https://github.com/xypwn)
|
||||||
* [SouthparkDe] Support for English URLs
|
* [spreaker] fix SpreakerShowIE test URL by [pukkandan](https://github.com/pukkandan)
|
||||||
* [spreaker] fix SpreakerShowIE test URL
|
* [Vlive] Fix playlist handling when downloading a channel by [kyuyeunk](https://github.com/kyuyeunk)
|
||||||
* [Vlive] Fix playlist handling when downloading a channel
|
* [tmz] Fix extractor by [diegorodriguezv](https://github.com/diegorodriguezv)
|
||||||
* [generic] Detect embedded bitchute videos
|
* [generic] Detect embedded bitchute videos by [pukkandan](https://github.com/pukkandan)
|
||||||
* [generic] Extract embedded youtube and twitter videos
|
* [generic] Extract embedded youtube and twitter videos by [diegorodriguezv](https://github.com/diegorodriguezv)
|
||||||
* [ffmpeg] Ensure all streams are copied
|
* [ffmpeg] Ensure all streams are copied by [pukkandan](https://github.com/pukkandan)
|
||||||
* Fix for os.rename error when embedding thumbnail to video in a different drive
|
* [embedthumbnail] Fix for os.rename error by [pukkandan](https://github.com/pukkandan)
|
||||||
* make_win.bat: don't use UPX to pack vcruntime140.dll
|
* make_win.bat: don't use UPX to pack vcruntime140.dll by [jbruchon](https://github.com/jbruchon)
|
||||||
|
|||||||
14
MANIFEST.in
14
MANIFEST.in
@@ -1,9 +1,9 @@
|
|||||||
include README.md
|
|
||||||
include LICENSE
|
|
||||||
include AUTHORS
|
include AUTHORS
|
||||||
include ChangeLog
|
include Changelog.md
|
||||||
include youtube-dlc.bash-completion
|
include LICENSE
|
||||||
include youtube-dlc.fish
|
include README.md
|
||||||
include youtube-dlc.1
|
include completions/*/*
|
||||||
recursive-include docs Makefile conf.py *.rst
|
include supportedsites.md
|
||||||
|
include yt-dlp.1
|
||||||
|
recursive-include devscripts *
|
||||||
recursive-include test *
|
recursive-include test *
|
||||||
|
|||||||
129
Makefile
129
Makefile
@@ -1,12 +1,28 @@
|
|||||||
all: youtube-dlc doc man
|
all: yt-dlp doc pypi-files
|
||||||
|
clean: clean-test clean-dist clean-cache
|
||||||
|
completions: completion-bash completion-fish completion-zsh
|
||||||
doc: README.md CONTRIBUTING.md issuetemplates supportedsites
|
doc: README.md CONTRIBUTING.md issuetemplates supportedsites
|
||||||
man: README.txt youtube-dlc.1 youtube-dlc.bash-completion youtube-dlc.zsh youtube-dlc.fish
|
ot: offlinetest
|
||||||
|
tar: yt-dlp.tar.gz
|
||||||
|
|
||||||
|
# Keep this list in sync with MANIFEST.in
|
||||||
|
# intended use: when building a source distribution,
|
||||||
|
# make pypi-files && python setup.py sdist
|
||||||
|
pypi-files: AUTHORS Changelog.md LICENSE README.md README.txt supportedsites completions yt-dlp.1 devscripts/* test/*
|
||||||
|
|
||||||
clean:
|
.PHONY: all clean install test tar pypi-files completions ot offlinetest codetest supportedsites
|
||||||
rm -rf youtube-dlc.1.temp.md youtube-dlc.1 youtube-dlc.bash-completion README.txt MANIFEST build/ dist/ .coverage cover/ youtube-dlc.tar.gz youtube-dlc.zsh youtube-dlc.fish youtube_dlc/extractor/lazy_extractors.py *.dump *.part* *.ytdl *.info.json *.mp4 *.m4a *.flv *.mp3 *.avi *.mkv *.webm *.3gp *.wav *.ape *.swf *.jpg *.png *.spec *.frag *.frag.urls *.frag.aria2 CONTRIBUTING.md.tmp youtube-dlc youtube-dlc.exe
|
|
||||||
find . -name "*.pyc" -delete
|
clean-test:
|
||||||
find . -name "*.class" -delete
|
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
|
||||||
|
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
|
||||||
|
clean-cache:
|
||||||
|
find . -name "*.pyc" -o -name "*.class" -delete
|
||||||
|
|
||||||
|
completion-bash: completions/bash/yt-dlp
|
||||||
|
completion-fish: completions/fish/yt-dlp.fish
|
||||||
|
completion-zsh: completions/zsh/_yt-dlp
|
||||||
|
lazy-extractors: yt_dlp/extractor/lazy_extractors.py
|
||||||
|
|
||||||
PREFIX ?= /usr/local
|
PREFIX ?= /usr/local
|
||||||
BINDIR ?= $(PREFIX)/bin
|
BINDIR ?= $(PREFIX)/bin
|
||||||
@@ -21,28 +37,21 @@ SYSCONFDIR = $(shell if [ $(PREFIX) = /usr -o $(PREFIX) = /usr/local ]; then ech
|
|||||||
# set markdown input format to "markdown-smart" for pandoc version 2 and to "markdown" for pandoc prior to version 2
|
# set markdown input format to "markdown-smart" for pandoc version 2 and to "markdown" for pandoc prior to version 2
|
||||||
MARKDOWN = $(shell if [ `pandoc -v | head -n1 | cut -d" " -f2 | head -c1` = "2" ]; then echo markdown-smart; else echo markdown; fi)
|
MARKDOWN = $(shell if [ `pandoc -v | head -n1 | cut -d" " -f2 | head -c1` = "2" ]; then echo markdown-smart; else echo markdown; fi)
|
||||||
|
|
||||||
install: youtube-dlc youtube-dlc.1 youtube-dlc.bash-completion youtube-dlc.zsh youtube-dlc.fish
|
install: yt-dlp yt-dlp.1 completions
|
||||||
install -d $(DESTDIR)$(BINDIR)
|
install -Dm755 yt-dlp $(DESTDIR)$(BINDIR)
|
||||||
install -m 755 youtube-dlc $(DESTDIR)$(BINDIR)
|
install -Dm644 yt-dlp.1 $(DESTDIR)$(MANDIR)/man1
|
||||||
install -d $(DESTDIR)$(MANDIR)/man1
|
install -Dm644 completions/bash/yt-dlp $(DESTDIR)$(SHAREDIR)/bash-completion/completions/yt-dlp
|
||||||
install -m 644 youtube-dlc.1 $(DESTDIR)$(MANDIR)/man1
|
install -Dm644 completions/zsh/_yt-dlp $(DESTDIR)$(SHAREDIR)/zsh/site-functions/_yt-dlp
|
||||||
install -d $(DESTDIR)$(SYSCONFDIR)/bash_completion.d
|
install -Dm644 completions/fish/yt-dlp.fish $(DESTDIR)$(SHAREDIR)/fish/vendor_completions.d/yt-dlp.fish
|
||||||
install -m 644 youtube-dlc.bash-completion $(DESTDIR)$(SYSCONFDIR)/bash_completion.d/youtube-dlc
|
|
||||||
install -d $(DESTDIR)$(SHAREDIR)/zsh/site-functions
|
|
||||||
install -m 644 youtube-dlc.zsh $(DESTDIR)$(SHAREDIR)/zsh/site-functions/_youtube-dlc
|
|
||||||
install -d $(DESTDIR)$(SYSCONFDIR)/fish/completions
|
|
||||||
install -m 644 youtube-dlc.fish $(DESTDIR)$(SYSCONFDIR)/fish/completions/youtube-dlc.fish
|
|
||||||
|
|
||||||
codetest:
|
codetest:
|
||||||
flake8 .
|
flake8 .
|
||||||
|
|
||||||
test:
|
test:
|
||||||
#nosetests --with-coverage --cover-package=youtube_dlc --cover-html --verbose --processes 4 test
|
#nosetests --with-coverage --cover-package=yt_dlp --cover-html --verbose --processes 4 test
|
||||||
nosetests --verbose test
|
nosetests --verbose test
|
||||||
$(MAKE) codetest
|
$(MAKE) codetest
|
||||||
|
|
||||||
ot: offlinetest
|
|
||||||
|
|
||||||
# Keep this list in sync with devscripts/run_tests.sh
|
# Keep this list in sync with devscripts/run_tests.sh
|
||||||
offlinetest: codetest
|
offlinetest: codetest
|
||||||
$(PYTHON) -m nose --verbose test \
|
$(PYTHON) -m nose --verbose test \
|
||||||
@@ -57,34 +66,28 @@ offlinetest: codetest
|
|||||||
--exclude test_youtube_signature.py \
|
--exclude test_youtube_signature.py \
|
||||||
--exclude test_post_hooks.py
|
--exclude test_post_hooks.py
|
||||||
|
|
||||||
tar: youtube-dlc.tar.gz
|
yt-dlp: yt_dlp/*.py yt_dlp/*/*.py
|
||||||
|
|
||||||
.PHONY: all clean install test tar bash-completion pypi-files zsh-completion fish-completion ot offlinetest codetest supportedsites
|
|
||||||
|
|
||||||
pypi-files: youtube-dlc.bash-completion README.txt youtube-dlc.1 youtube-dlc.fish
|
|
||||||
|
|
||||||
youtube-dlc: youtube_dlc/*.py youtube_dlc/*/*.py
|
|
||||||
mkdir -p zip
|
mkdir -p zip
|
||||||
for d in youtube_dlc youtube_dlc/downloader youtube_dlc/extractor youtube_dlc/postprocessor ; do \
|
for d in yt_dlp yt_dlp/downloader yt_dlp/extractor yt_dlp/postprocessor ; do \
|
||||||
mkdir -p zip/$$d ;\
|
mkdir -p zip/$$d ;\
|
||||||
cp -pPR $$d/*.py zip/$$d/ ;\
|
cp -pPR $$d/*.py zip/$$d/ ;\
|
||||||
done
|
done
|
||||||
touch -t 200001010101 zip/youtube_dlc/*.py zip/youtube_dlc/*/*.py
|
touch -t 200001010101 zip/yt_dlp/*.py zip/yt_dlp/*/*.py
|
||||||
mv zip/youtube_dlc/__main__.py zip/
|
mv zip/yt_dlp/__main__.py zip/
|
||||||
cd zip ; zip -q ../youtube-dlc youtube_dlc/*.py youtube_dlc/*/*.py __main__.py
|
cd zip ; zip -q ../yt-dlp yt_dlp/*.py yt_dlp/*/*.py __main__.py
|
||||||
rm -rf zip
|
rm -rf zip
|
||||||
echo '#!$(PYTHON)' > youtube-dlc
|
echo '#!$(PYTHON)' > yt-dlp
|
||||||
cat youtube-dlc.zip >> youtube-dlc
|
cat yt-dlp.zip >> yt-dlp
|
||||||
rm youtube-dlc.zip
|
rm yt-dlp.zip
|
||||||
chmod a+x youtube-dlc
|
chmod a+x yt-dlp
|
||||||
|
|
||||||
README.md: youtube_dlc/*.py youtube_dlc/*/*.py
|
README.md: yt_dlp/*.py yt_dlp/*/*.py
|
||||||
COLUMNS=80 $(PYTHON) youtube_dlc/__main__.py --help | $(PYTHON) devscripts/make_readme.py
|
COLUMNS=80 $(PYTHON) yt_dlp/__main__.py --help | $(PYTHON) devscripts/make_readme.py
|
||||||
|
|
||||||
CONTRIBUTING.md: README.md
|
CONTRIBUTING.md: README.md
|
||||||
$(PYTHON) devscripts/make_contributing.py README.md CONTRIBUTING.md
|
$(PYTHON) devscripts/make_contributing.py README.md CONTRIBUTING.md
|
||||||
|
|
||||||
issuetemplates: devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/1_broken_site.md .github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md .github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md .github/ISSUE_TEMPLATE_tmpl/4_bug_report.md .github/ISSUE_TEMPLATE_tmpl/5_feature_request.md youtube_dlc/version.py
|
issuetemplates: devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/1_broken_site.md .github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md .github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md .github/ISSUE_TEMPLATE_tmpl/4_bug_report.md .github/ISSUE_TEMPLATE_tmpl/5_feature_request.md yt_dlp/version.py
|
||||||
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/1_broken_site.md .github/ISSUE_TEMPLATE/1_broken_site.md
|
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/1_broken_site.md .github/ISSUE_TEMPLATE/1_broken_site.md
|
||||||
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md .github/ISSUE_TEMPLATE/2_site_support_request.md
|
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md .github/ISSUE_TEMPLATE/2_site_support_request.md
|
||||||
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md .github/ISSUE_TEMPLATE/3_site_feature_request.md
|
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md .github/ISSUE_TEMPLATE/3_site_feature_request.md
|
||||||
@@ -92,39 +95,34 @@ issuetemplates: devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/1_
|
|||||||
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/5_feature_request.md .github/ISSUE_TEMPLATE/5_feature_request.md
|
$(PYTHON) devscripts/make_issue_template.py .github/ISSUE_TEMPLATE_tmpl/5_feature_request.md .github/ISSUE_TEMPLATE/5_feature_request.md
|
||||||
|
|
||||||
supportedsites:
|
supportedsites:
|
||||||
$(PYTHON) devscripts/make_supportedsites.py docs/supportedsites.md
|
$(PYTHON) devscripts/make_supportedsites.py supportedsites.md
|
||||||
|
|
||||||
README.txt: README.md
|
README.txt: README.md
|
||||||
pandoc -f $(MARKDOWN) -t plain README.md -o README.txt
|
pandoc -f $(MARKDOWN) -t plain README.md -o README.txt
|
||||||
|
|
||||||
youtube-dlc.1: README.md
|
yt-dlp.1: README.md
|
||||||
$(PYTHON) devscripts/prepare_manpage.py youtube-dlc.1.temp.md
|
$(PYTHON) devscripts/prepare_manpage.py yt-dlp.1.temp.md
|
||||||
pandoc -s -f $(MARKDOWN) -t man youtube-dlc.1.temp.md -o youtube-dlc.1
|
pandoc -s -f $(MARKDOWN) -t man yt-dlp.1.temp.md -o yt-dlp.1
|
||||||
rm -f youtube-dlc.1.temp.md
|
rm -f yt-dlp.1.temp.md
|
||||||
|
|
||||||
youtube-dlc.bash-completion: youtube_dlc/*.py youtube_dlc/*/*.py devscripts/bash-completion.in
|
completions/bash/yt-dlp: yt_dlp/*.py yt_dlp/*/*.py devscripts/bash-completion.in
|
||||||
|
mkdir -p completions/bash
|
||||||
$(PYTHON) devscripts/bash-completion.py
|
$(PYTHON) devscripts/bash-completion.py
|
||||||
|
|
||||||
bash-completion: youtube-dlc.bash-completion
|
completions/zsh/_yt-dlp: yt_dlp/*.py yt_dlp/*/*.py devscripts/zsh-completion.in
|
||||||
|
mkdir -p completions/zsh
|
||||||
youtube-dlc.zsh: youtube_dlc/*.py youtube_dlc/*/*.py devscripts/zsh-completion.in
|
|
||||||
$(PYTHON) devscripts/zsh-completion.py
|
$(PYTHON) devscripts/zsh-completion.py
|
||||||
|
|
||||||
zsh-completion: youtube-dlc.zsh
|
completions/fish/yt-dlp.fish: yt_dlp/*.py yt_dlp/*/*.py devscripts/fish-completion.in
|
||||||
|
mkdir -p completions/fish
|
||||||
youtube-dlc.fish: youtube_dlc/*.py youtube_dlc/*/*.py devscripts/fish-completion.in
|
|
||||||
$(PYTHON) devscripts/fish-completion.py
|
$(PYTHON) devscripts/fish-completion.py
|
||||||
|
|
||||||
fish-completion: youtube-dlc.fish
|
_EXTRACTOR_FILES = $(shell find yt_dlp/extractor -iname '*.py' -and -not -iname 'lazy_extractors.py')
|
||||||
|
yt_dlp/extractor/lazy_extractors.py: devscripts/make_lazy_extractors.py devscripts/lazy_load_template.py $(_EXTRACTOR_FILES)
|
||||||
lazy-extractors: youtube_dlc/extractor/lazy_extractors.py
|
|
||||||
|
|
||||||
_EXTRACTOR_FILES = $(shell find youtube_dlc/extractor -iname '*.py' -and -not -iname 'lazy_extractors.py')
|
|
||||||
youtube_dlc/extractor/lazy_extractors.py: devscripts/make_lazy_extractors.py devscripts/lazy_load_template.py $(_EXTRACTOR_FILES)
|
|
||||||
$(PYTHON) devscripts/make_lazy_extractors.py $@
|
$(PYTHON) devscripts/make_lazy_extractors.py $@
|
||||||
|
|
||||||
youtube-dlc.tar.gz: youtube-dlc README.md README.txt youtube-dlc.1 youtube-dlc.bash-completion youtube-dlc.zsh youtube-dlc.fish ChangeLog AUTHORS
|
yt-dlp.tar.gz: README.md yt-dlp.1 completions Changelog.md AUTHORS
|
||||||
@tar -czf youtube-dlc.tar.gz --transform "s|^|youtube-dlc/|" --owner 0 --group 0 \
|
@tar -czf $(DESTDIR)/yt-dlp.tar.gz --transform "s|^|yt-dlp/|" --owner 0 --group 0 \
|
||||||
--exclude '*.DS_Store' \
|
--exclude '*.DS_Store' \
|
||||||
--exclude '*.kate-swp' \
|
--exclude '*.kate-swp' \
|
||||||
--exclude '*.pyc' \
|
--exclude '*.pyc' \
|
||||||
@@ -134,8 +132,13 @@ youtube-dlc.tar.gz: youtube-dlc README.md README.txt youtube-dlc.1 youtube-dlc.b
|
|||||||
--exclude '.git' \
|
--exclude '.git' \
|
||||||
--exclude 'docs/_build' \
|
--exclude 'docs/_build' \
|
||||||
-- \
|
-- \
|
||||||
bin devscripts test youtube_dlc docs \
|
devscripts test \
|
||||||
ChangeLog AUTHORS LICENSE README.md README.txt \
|
Changelog.md AUTHORS LICENSE README.md supportedsites.md \
|
||||||
Makefile MANIFEST.in youtube-dlc.1 youtube-dlc.bash-completion \
|
Makefile MANIFEST.in yt-dlp.1 completions \
|
||||||
youtube-dlc.zsh youtube-dlc.fish setup.py setup.cfg \
|
setup.py setup.cfg yt-dlp
|
||||||
youtube-dlc
|
|
||||||
|
AUTHORS: .mailmap
|
||||||
|
git shortlog -s -n | cut -f2 | sort > AUTHORS
|
||||||
|
|
||||||
|
.mailmap:
|
||||||
|
git shortlog -s -e -n | awk '!(out[$$NF]++) { $$1="";sub(/^[ \t]+/,""); print}' > .mailmap
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
__youtube_dlc()
|
__yt_dlp()
|
||||||
{
|
{
|
||||||
local cur prev opts fileopts diropts keywords
|
local cur prev opts fileopts diropts keywords
|
||||||
COMPREPLY=()
|
COMPREPLY=()
|
||||||
@@ -26,4 +26,4 @@ __youtube_dlc()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
complete -F __youtube_dlc youtube-dlc
|
complete -F __yt_dlp yt-dlp
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ from os.path import dirname as dirn
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
|
sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
|
||||||
import youtube_dlc
|
import yt_dlp
|
||||||
|
|
||||||
BASH_COMPLETION_FILE = "youtube-dlc.bash-completion"
|
BASH_COMPLETION_FILE = "completions/bash/yt-dlp"
|
||||||
BASH_COMPLETION_TEMPLATE = "devscripts/bash-completion.in"
|
BASH_COMPLETION_TEMPLATE = "devscripts/bash-completion.in"
|
||||||
|
|
||||||
|
|
||||||
@@ -26,5 +26,5 @@ def build_completion(opt_parser):
|
|||||||
f.write(filled_template)
|
f.write(filled_template)
|
||||||
|
|
||||||
|
|
||||||
parser = youtube_dlc.parseOpts()[0]
|
parser = yt_dlp.parseOpts()[0]
|
||||||
build_completion(parser)
|
build_completion(parser)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import traceback
|
|||||||
import os.path
|
import os.path
|
||||||
|
|
||||||
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 youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_input,
|
compat_input,
|
||||||
compat_http_server,
|
compat_http_server,
|
||||||
compat_str,
|
compat_str,
|
||||||
@@ -325,7 +325,7 @@ class YoutubeDLBuilder(object):
|
|||||||
authorizedUsers = ['fraca7', 'phihag', 'rg3', 'FiloSottile', 'ytdl-org']
|
authorizedUsers = ['fraca7', 'phihag', 'rg3', 'FiloSottile', 'ytdl-org']
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
if self.repoName != 'youtube-dlc':
|
if self.repoName != 'yt-dlp':
|
||||||
raise BuildError('Invalid repository "%s"' % self.repoName)
|
raise BuildError('Invalid repository "%s"' % self.repoName)
|
||||||
if self.user not in self.authorizedUsers:
|
if self.user not in self.authorizedUsers:
|
||||||
raise HTTPError('Unauthorized user "%s"' % self.user, 401)
|
raise HTTPError('Unauthorized user "%s"' % self.user, 401)
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ import sys
|
|||||||
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 gettestcases
|
from test.helper import gettestcases
|
||||||
from youtube_dlc.utils import compat_urllib_parse_urlparse
|
from yt_dlp.utils import compat_urllib_parse_urlparse
|
||||||
from youtube_dlc.utils import compat_urllib_request
|
from yt_dlp.utils import compat_urllib_request
|
||||||
|
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
METHOD = 'LIST'
|
METHOD = 'LIST'
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ import sys
|
|||||||
|
|
||||||
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 youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_basestring,
|
compat_basestring,
|
||||||
compat_getpass,
|
compat_getpass,
|
||||||
compat_print,
|
compat_print,
|
||||||
compat_urllib_request,
|
compat_urllib_request,
|
||||||
)
|
)
|
||||||
from youtube_dlc.utils import (
|
from yt_dlp.utils import (
|
||||||
make_HTTPS_handler,
|
make_HTTPS_handler,
|
||||||
sanitized_Request,
|
sanitized_Request,
|
||||||
)
|
)
|
||||||
@@ -100,7 +100,7 @@ def main():
|
|||||||
releaser = GitHubReleaser()
|
releaser = GitHubReleaser()
|
||||||
|
|
||||||
new_release = releaser.create_release(
|
new_release = releaser.create_release(
|
||||||
version, name='youtube-dlc %s' % version, body=body)
|
version, name='yt-dlp %s' % version, body=body)
|
||||||
release_id = new_release['id']
|
release_id = new_release['id']
|
||||||
|
|
||||||
for asset in os.listdir(build_path):
|
for asset in os.listdir(build_path):
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
{{commands}}
|
{{commands}}
|
||||||
|
|
||||||
|
|
||||||
complete --command youtube-dlc --arguments ":ytfavorites :ytrecommended :ytsubscriptions :ytwatchlater :ythistory"
|
complete --command yt-dlp --arguments ":ytfavorites :ytrecommended :ytsubscriptions :ytwatchlater :ythistory"
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ from os.path import dirname as dirn
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
|
sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
|
||||||
import youtube_dlc
|
import yt_dlp
|
||||||
from youtube_dlc.utils import shell_quote
|
from yt_dlp.utils import shell_quote
|
||||||
|
|
||||||
FISH_COMPLETION_FILE = 'youtube-dlc.fish'
|
FISH_COMPLETION_FILE = 'completions/fish/yt-dlp.fish'
|
||||||
FISH_COMPLETION_TEMPLATE = 'devscripts/fish-completion.in'
|
FISH_COMPLETION_TEMPLATE = 'devscripts/fish-completion.in'
|
||||||
|
|
||||||
EXTRA_ARGS = {
|
EXTRA_ARGS = {
|
||||||
@@ -31,7 +31,7 @@ def build_completion(opt_parser):
|
|||||||
for group in opt_parser.option_groups:
|
for group in opt_parser.option_groups:
|
||||||
for option in group.option_list:
|
for option in group.option_list:
|
||||||
long_option = option.get_opt_string().strip('-')
|
long_option = option.get_opt_string().strip('-')
|
||||||
complete_cmd = ['complete', '--command', 'youtube-dlc', '--long-option', long_option]
|
complete_cmd = ['complete', '--command', 'yt-dlp', '--long-option', long_option]
|
||||||
if option._short_opts:
|
if option._short_opts:
|
||||||
complete_cmd += ['--short-option', option._short_opts[0].strip('-')]
|
complete_cmd += ['--short-option', option._short_opts[0].strip('-')]
|
||||||
if option.help != optparse.SUPPRESS_HELP:
|
if option.help != optparse.SUPPRESS_HELP:
|
||||||
@@ -46,5 +46,5 @@ def build_completion(opt_parser):
|
|||||||
f.write(filled_template)
|
f.write(filled_template)
|
||||||
|
|
||||||
|
|
||||||
parser = youtube_dlc.parseOpts()[0]
|
parser = yt_dlp.parseOpts()[0]
|
||||||
build_completion(parser)
|
build_completion(parser)
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
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 youtube_dlc.utils import intlist_to_bytes
|
from yt_dlp.utils import intlist_to_bytes
|
||||||
from youtube_dlc.aes import aes_encrypt, key_expansion
|
from yt_dlp.aes import aes_encrypt, key_expansion
|
||||||
|
|
||||||
secret_msg = b'Secret message goes here'
|
secret_msg = b'Secret message goes here'
|
||||||
|
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ if 'signature' in versions_info:
|
|||||||
new_version = {}
|
new_version = {}
|
||||||
|
|
||||||
filenames = {
|
filenames = {
|
||||||
'bin': 'youtube-dlc',
|
'bin': 'yt-dlp',
|
||||||
'exe': 'youtube-dlc.exe',
|
'exe': 'yt-dlp.exe',
|
||||||
'tar': 'youtube-dlc-%s.tar.gz' % version}
|
'tar': 'yt-dlp-%s.tar.gz' % version}
|
||||||
build_dir = os.path.join('..', '..', 'build', version)
|
build_dir = os.path.join('..', '..', 'build', version)
|
||||||
for key, filename in filenames.items():
|
for key, filename in filenames.items():
|
||||||
url = 'https://yt-dl.org/downloads/%s/%s' % (version, filename)
|
url = 'https://yt-dl.org/downloads/%s/%s' % (version, filename)
|
||||||
|
|||||||
@@ -11,24 +11,24 @@ atom_template = textwrap.dedent("""\
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<feed xmlns="http://www.w3.org/2005/Atom">
|
<feed xmlns="http://www.w3.org/2005/Atom">
|
||||||
<link rel="self" href="http://ytdl-org.github.io/youtube-dl/update/releases.atom" />
|
<link rel="self" href="http://ytdl-org.github.io/youtube-dl/update/releases.atom" />
|
||||||
<title>youtube-dlc releases</title>
|
<title>yt-dlp releases</title>
|
||||||
<id>https://yt-dl.org/feed/youtube-dlc-updates-feed</id>
|
<id>https://yt-dl.org/feed/yt-dlp-updates-feed</id>
|
||||||
<updated>@TIMESTAMP@</updated>
|
<updated>@TIMESTAMP@</updated>
|
||||||
@ENTRIES@
|
@ENTRIES@
|
||||||
</feed>""")
|
</feed>""")
|
||||||
|
|
||||||
entry_template = textwrap.dedent("""
|
entry_template = textwrap.dedent("""
|
||||||
<entry>
|
<entry>
|
||||||
<id>https://yt-dl.org/feed/youtube-dlc-updates-feed/youtube-dlc-@VERSION@</id>
|
<id>https://yt-dl.org/feed/yt-dlp-updates-feed/yt-dlp-@VERSION@</id>
|
||||||
<title>New version @VERSION@</title>
|
<title>New version @VERSION@</title>
|
||||||
<link href="http://ytdl-org.github.io/youtube-dlc" />
|
<link href="http://ytdl-org.github.io/yt-dlp" />
|
||||||
<content type="xhtml">
|
<content type="xhtml">
|
||||||
<div xmlns="http://www.w3.org/1999/xhtml">
|
<div xmlns="http://www.w3.org/1999/xhtml">
|
||||||
Downloads available at <a href="https://yt-dl.org/downloads/@VERSION@/">https://yt-dl.org/downloads/@VERSION@/</a>
|
Downloads available at <a href="https://yt-dl.org/downloads/@VERSION@/">https://yt-dl.org/downloads/@VERSION@/</a>
|
||||||
</div>
|
</div>
|
||||||
</content>
|
</content>
|
||||||
<author>
|
<author>
|
||||||
<name>The youtube-dlc maintainers</name>
|
<name>The yt-dlp maintainers</name>
|
||||||
</author>
|
</author>
|
||||||
<updated>@TIMESTAMP@</updated>
|
<updated>@TIMESTAMP@</updated>
|
||||||
</entry>
|
</entry>
|
||||||
|
|||||||
@@ -5,10 +5,10 @@ import sys
|
|||||||
import os
|
import os
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
# We must be able to import youtube_dlc
|
# We must be able to import yt_dlp
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
||||||
|
|
||||||
import youtube_dlc
|
import yt_dlp
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@@ -16,7 +16,7 @@ def main():
|
|||||||
template = tmplf.read()
|
template = tmplf.read()
|
||||||
|
|
||||||
ie_htmls = []
|
ie_htmls = []
|
||||||
for ie in youtube_dlc.list_extractors(age_limit=None):
|
for ie in yt_dlp.list_extractors(age_limit=None):
|
||||||
ie_html = '<b>{}</b>'.format(ie.IE_NAME)
|
ie_html = '<b>{}</b>'.format(ie.IE_NAME)
|
||||||
ie_desc = getattr(ie, 'IE_DESC', None)
|
ie_desc = getattr(ie, 'IE_DESC', None)
|
||||||
if ie_desc is False:
|
if ie_desc is False:
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ def main():
|
|||||||
bug_text = re.search( """
|
bug_text = re.search( """
|
||||||
# r'(?s)#\s*BUGS\s*[^\n]*\s*(.*?)#\s*COPYRIGHT', readme).group(1)
|
# r'(?s)#\s*BUGS\s*[^\n]*\s*(.*?)#\s*COPYRIGHT', readme).group(1)
|
||||||
# dev_text = re.search(
|
# dev_text = re.search(
|
||||||
# r'(?s)(#\s*DEVELOPER INSTRUCTIONS.*?)#\s*EMBEDDING youtube-dlc',
|
# r'(?s)(#\s*DEVELOPER INSTRUCTIONS.*?)#\s*EMBEDDING yt-dlp',
|
||||||
""" readme).group(1)
|
""" readme).group(1)
|
||||||
|
|
||||||
out = bug_text + dev_text
|
out = bug_text + dev_text
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ def main():
|
|||||||
with io.open(infile, encoding='utf-8') as inf:
|
with io.open(infile, encoding='utf-8') as inf:
|
||||||
issue_template_tmpl = inf.read()
|
issue_template_tmpl = inf.read()
|
||||||
|
|
||||||
# Get the version from youtube_dlc/version.py without importing the package
|
# Get the version from yt_dlp/version.py without importing the package
|
||||||
exec(compile(open('youtube_dlc/version.py').read(),
|
exec(compile(open('yt_dlp/version.py').read(),
|
||||||
'youtube_dlc/version.py', 'exec'))
|
'yt_dlp/version.py', 'exec'))
|
||||||
|
|
||||||
out = issue_template_tmpl % {'version': locals()['__version__']}
|
out = issue_template_tmpl % {'version': locals()['__version__']}
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,13 @@ lazy_extractors_filename = sys.argv[1]
|
|||||||
if os.path.exists(lazy_extractors_filename):
|
if os.path.exists(lazy_extractors_filename):
|
||||||
os.remove(lazy_extractors_filename)
|
os.remove(lazy_extractors_filename)
|
||||||
|
|
||||||
from youtube_dlc.extractor import _ALL_CLASSES
|
# Block plugins from loading
|
||||||
from youtube_dlc.extractor.common import InfoExtractor, SearchInfoExtractor
|
os.rename('ytdlp_plugins', 'ytdlp_plugins_blocked')
|
||||||
|
|
||||||
|
from yt_dlp.extractor import _ALL_CLASSES
|
||||||
|
from yt_dlp.extractor.common import InfoExtractor, SearchInfoExtractor
|
||||||
|
|
||||||
|
os.rename('ytdlp_plugins_blocked', 'ytdlp_plugins')
|
||||||
|
|
||||||
with open('devscripts/lazy_load_template.py', 'rt') as f:
|
with open('devscripts/lazy_load_template.py', 'rt') as f:
|
||||||
module_template = f.read()
|
module_template = f.read()
|
||||||
|
|||||||
@@ -7,10 +7,10 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
# Import youtube_dlc
|
# Import yt_dlp
|
||||||
ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
|
ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
|
||||||
sys.path.insert(0, ROOT_DIR)
|
sys.path.insert(0, ROOT_DIR)
|
||||||
import youtube_dlc
|
import yt_dlp
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@@ -33,7 +33,7 @@ def main():
|
|||||||
ie_md += ' (Currently broken)'
|
ie_md += ' (Currently broken)'
|
||||||
yield ie_md
|
yield ie_md
|
||||||
|
|
||||||
ies = sorted(youtube_dlc.gen_extractors(), key=lambda i: i.IE_NAME.lower())
|
ies = sorted(yt_dlp.gen_extractors(), key=lambda i: i.IE_NAME.lower())
|
||||||
out = '# Supported sites\n' + ''.join(
|
out = '# Supported sites\n' + ''.join(
|
||||||
' - ' + md + '\n'
|
' - ' + md + '\n'
|
||||||
for md in gen_ies_md(ies))
|
for md in gen_ies_md(ies))
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import re
|
|||||||
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
README_FILE = os.path.join(ROOT_DIR, 'README.md')
|
README_FILE = os.path.join(ROOT_DIR, 'README.md')
|
||||||
|
|
||||||
PREFIX = r'''%youtube-dlc(1)
|
PREFIX = r'''%yt-dlp(1)
|
||||||
|
|
||||||
# NAME
|
# NAME
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ youtube\-dl \- download videos from youtube.com or other video platforms
|
|||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
|
|
||||||
**youtube-dlc** \[OPTIONS\] URL [URL...]
|
**yt-dlp** \[OPTIONS\] URL [URL...]
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ def main():
|
|||||||
readme = f.read()
|
readme = f.read()
|
||||||
|
|
||||||
readme = re.sub(r'(?s)^.*?(?=# DESCRIPTION)', '', readme)
|
readme = re.sub(r'(?s)^.*?(?=# DESCRIPTION)', '', readme)
|
||||||
readme = re.sub(r'\s+youtube-dlc \[OPTIONS\] URL \[URL\.\.\.\]', '', readme)
|
readme = re.sub(r'\s+yt-dlp \[OPTIONS\] URL \[URL\.\.\.\]', '', readme)
|
||||||
readme = PREFIX + readme
|
readme = PREFIX + readme
|
||||||
|
|
||||||
readme = filter_options(readme)
|
readme = filter_options(readme)
|
||||||
|
|||||||
@@ -54,14 +54,14 @@ fi
|
|||||||
|
|
||||||
if [ ! -z "`git tag | grep "$version"`" ]; then echo 'ERROR: version already present'; exit 1; fi
|
if [ ! -z "`git tag | grep "$version"`" ]; then echo 'ERROR: version already present'; exit 1; fi
|
||||||
if [ ! -z "`git status --porcelain | grep -v CHANGELOG`" ]; then echo 'ERROR: the working directory is not clean; commit or stash changes'; exit 1; fi
|
if [ ! -z "`git status --porcelain | grep -v CHANGELOG`" ]; then echo 'ERROR: the working directory is not clean; commit or stash changes'; exit 1; fi
|
||||||
useless_files=$(find youtube_dlc -type f -not -name '*.py')
|
useless_files=$(find yt_dlp -type f -not -name '*.py')
|
||||||
if [ ! -z "$useless_files" ]; then echo "ERROR: Non-.py files in youtube_dlc: $useless_files"; exit 1; fi
|
if [ ! -z "$useless_files" ]; then echo "ERROR: Non-.py files in yt_dlp: $useless_files"; exit 1; fi
|
||||||
if [ ! -f "updates_key.pem" ]; then echo 'ERROR: updates_key.pem missing'; exit 1; fi
|
if [ ! -f "updates_key.pem" ]; then echo 'ERROR: updates_key.pem missing'; exit 1; fi
|
||||||
if ! type pandoc >/dev/null 2>/dev/null; then echo 'ERROR: pandoc is missing'; exit 1; fi
|
if ! type pandoc >/dev/null 2>/dev/null; then echo 'ERROR: pandoc is missing'; exit 1; fi
|
||||||
if ! python3 -c 'import rsa' 2>/dev/null; then echo 'ERROR: python3-rsa is missing'; exit 1; fi
|
if ! python3 -c 'import rsa' 2>/dev/null; then echo 'ERROR: python3-rsa is missing'; exit 1; fi
|
||||||
if ! python3 -c 'import wheel' 2>/dev/null; then echo 'ERROR: wheel is missing'; exit 1; fi
|
if ! python3 -c 'import wheel' 2>/dev/null; then echo 'ERROR: wheel is missing'; exit 1; fi
|
||||||
|
|
||||||
read -p "Is ChangeLog up to date? (y/n) " -n 1
|
read -p "Is Changelog up to date? (y/n) " -n 1
|
||||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1; fi
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1; fi
|
||||||
|
|
||||||
/bin/echo -e "\n### First of all, testing..."
|
/bin/echo -e "\n### First of all, testing..."
|
||||||
@@ -69,18 +69,18 @@ make clean
|
|||||||
if $skip_tests ; then
|
if $skip_tests ; then
|
||||||
echo 'SKIPPING TESTS'
|
echo 'SKIPPING TESTS'
|
||||||
else
|
else
|
||||||
nosetests --verbose --with-coverage --cover-package=youtube_dlc --cover-html test --stop || exit 1
|
nosetests --verbose --with-coverage --cover-package=yt_dlp --cover-html test --stop || exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
/bin/echo -e "\n### Changing version in version.py..."
|
/bin/echo -e "\n### Changing version in version.py..."
|
||||||
sed -i "s/__version__ = '.*'/__version__ = '$version'/" youtube_dlc/version.py
|
sed -i "s/__version__ = '.*'/__version__ = '$version'/" yt_dlp/version.py
|
||||||
|
|
||||||
/bin/echo -e "\n### Changing version in ChangeLog..."
|
/bin/echo -e "\n### Changing version in Changelog..."
|
||||||
sed -i "s/<unreleased>/$version/" ChangeLog
|
sed -i "s/<unreleased>/$version/" Changelog.md
|
||||||
|
|
||||||
/bin/echo -e "\n### Committing documentation, templates and youtube_dlc/version.py..."
|
/bin/echo -e "\n### Committing documentation, templates and yt_dlp/version.py..."
|
||||||
make README.md CONTRIBUTING.md issuetemplates supportedsites
|
make README.md CONTRIBUTING.md issuetemplates supportedsites
|
||||||
git add README.md CONTRIBUTING.md .github/ISSUE_TEMPLATE/1_broken_site.md .github/ISSUE_TEMPLATE/2_site_support_request.md .github/ISSUE_TEMPLATE/3_site_feature_request.md .github/ISSUE_TEMPLATE/4_bug_report.md .github/ISSUE_TEMPLATE/5_feature_request.md .github/ISSUE_TEMPLATE/6_question.md docs/supportedsites.md youtube_dlc/version.py ChangeLog
|
git add README.md CONTRIBUTING.md .github/ISSUE_TEMPLATE/1_broken_site.md .github/ISSUE_TEMPLATE/2_site_support_request.md .github/ISSUE_TEMPLATE/3_site_feature_request.md .github/ISSUE_TEMPLATE/4_bug_report.md .github/ISSUE_TEMPLATE/5_feature_request.md .github/ISSUE_TEMPLATE/6_question.md docs/supportedsites.md yt_dlp/version.py Changelog.md
|
||||||
git commit $gpg_sign_commits -m "release $version"
|
git commit $gpg_sign_commits -m "release $version"
|
||||||
|
|
||||||
/bin/echo -e "\n### Now tagging, signing and pushing..."
|
/bin/echo -e "\n### Now tagging, signing and pushing..."
|
||||||
@@ -95,13 +95,13 @@ git push origin "$version"
|
|||||||
|
|
||||||
/bin/echo -e "\n### OK, now it is time to build the binaries..."
|
/bin/echo -e "\n### OK, now it is time to build the binaries..."
|
||||||
REV=$(git rev-parse HEAD)
|
REV=$(git rev-parse HEAD)
|
||||||
make youtube-dlc youtube-dlc.tar.gz
|
make yt-dlp yt-dlp.tar.gz
|
||||||
read -p "VM running? (y/n) " -n 1
|
read -p "VM running? (y/n) " -n 1
|
||||||
wget "http://$buildserver/build/ytdl-org/youtube-dl/youtube-dlc.exe?rev=$REV" -O youtube-dlc.exe
|
wget "http://$buildserver/build/ytdl-org/youtube-dl/yt-dlp.exe?rev=$REV" -O yt-dlp.exe
|
||||||
mkdir -p "build/$version"
|
mkdir -p "build/$version"
|
||||||
mv youtube-dlc youtube-dlc.exe "build/$version"
|
mv yt-dlp yt-dlp.exe "build/$version"
|
||||||
mv youtube-dlc.tar.gz "build/$version/youtube-dlc-$version.tar.gz"
|
mv yt-dlp.tar.gz "build/$version/yt-dlp-$version.tar.gz"
|
||||||
RELEASE_FILES="youtube-dlc youtube-dlc.exe youtube-dlc-$version.tar.gz"
|
RELEASE_FILES="yt-dlp yt-dlp.exe yt-dlp-$version.tar.gz"
|
||||||
(cd build/$version/ && md5sum $RELEASE_FILES > MD5SUMS)
|
(cd build/$version/ && md5sum $RELEASE_FILES > MD5SUMS)
|
||||||
(cd build/$version/ && sha1sum $RELEASE_FILES > SHA1SUMS)
|
(cd build/$version/ && sha1sum $RELEASE_FILES > SHA1SUMS)
|
||||||
(cd build/$version/ && sha256sum $RELEASE_FILES > SHA2-256SUMS)
|
(cd build/$version/ && sha256sum $RELEASE_FILES > SHA2-256SUMS)
|
||||||
@@ -111,7 +111,7 @@ RELEASE_FILES="youtube-dlc youtube-dlc.exe youtube-dlc-$version.tar.gz"
|
|||||||
for f in $RELEASE_FILES; do gpg --passphrase-repeat 5 --detach-sig "build/$version/$f"; done
|
for f in $RELEASE_FILES; do gpg --passphrase-repeat 5 --detach-sig "build/$version/$f"; done
|
||||||
|
|
||||||
ROOT=$(pwd)
|
ROOT=$(pwd)
|
||||||
python devscripts/create-github-release.py ChangeLog $version "$ROOT/build/$version"
|
python devscripts/create-github-release.py Changelog.md $version "$ROOT/build/$version"
|
||||||
|
|
||||||
ssh ytdl@yt-dl.org "sh html/update_latest.sh $version"
|
ssh ytdl@yt-dl.org "sh html/update_latest.sh $version"
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ import sys
|
|||||||
|
|
||||||
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 youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_print,
|
compat_print,
|
||||||
compat_urllib_request,
|
compat_urllib_request,
|
||||||
)
|
)
|
||||||
from youtube_dlc.utils import format_bytes
|
from yt_dlp.utils import format_bytes
|
||||||
|
|
||||||
|
|
||||||
def format_size(bytes):
|
def format_size(bytes):
|
||||||
@@ -38,9 +38,9 @@ for page in itertools.count(1):
|
|||||||
asset_name = asset['name']
|
asset_name = asset['name']
|
||||||
total_bytes += asset['download_count'] * asset['size']
|
total_bytes += asset['download_count'] * asset['size']
|
||||||
if all(not re.match(p, asset_name) for p in (
|
if all(not re.match(p, asset_name) for p in (
|
||||||
r'^youtube-dlc$',
|
r'^yt-dlp$',
|
||||||
r'^youtube-dlc-\d{4}\.\d{2}\.\d{2}(?:\.\d+)?\.tar\.gz$',
|
r'^yt-dlp-\d{4}\.\d{2}\.\d{2}(?:\.\d+)?\.tar\.gz$',
|
||||||
r'^youtube-dlc\.exe$')):
|
r'^yt-dlp\.exe$')):
|
||||||
continue
|
continue
|
||||||
compat_print(
|
compat_print(
|
||||||
' %s size: %s downloads: %d'
|
' %s size: %s downloads: %d'
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from datetime import datetime
|
|||||||
# response = urllib.request.urlopen('https://blackjack4494.github.io/youtube-dlc/update/LATEST_VERSION')
|
# response = urllib.request.urlopen('https://blackjack4494.github.io/youtube-dlc/update/LATEST_VERSION')
|
||||||
# old_version = response.read().decode('utf-8')
|
# old_version = response.read().decode('utf-8')
|
||||||
|
|
||||||
exec(compile(open('youtube_dlc/version.py').read(), 'youtube_dlc/version.py', 'exec'))
|
exec(compile(open('yt_dlp/version.py').read(), 'yt_dlp/version.py', 'exec'))
|
||||||
old_version = locals()['__version__']
|
old_version = locals()['__version__']
|
||||||
|
|
||||||
old_version_list = old_version.split(".", 4)
|
old_version_list = old_version.split(".", 4)
|
||||||
@@ -19,13 +19,13 @@ rev = str(int(old_rev or 0) + 1) if old_ver == ver else ''
|
|||||||
VERSION = '.'.join((ver, rev)) if rev else ver
|
VERSION = '.'.join((ver, rev)) if rev else ver
|
||||||
# VERSION_LIST = [(int(v) for v in ver.split(".") + [rev or 0])]
|
# VERSION_LIST = [(int(v) for v in ver.split(".") + [rev or 0])]
|
||||||
|
|
||||||
print('::set-output name=ytdlc_version::' + VERSION)
|
print('::set-output name=ytdlp_version::' + VERSION)
|
||||||
|
|
||||||
file_version_py = open('youtube_dlc/version.py', 'rt')
|
file_version_py = open('yt_dlp/version.py', 'rt')
|
||||||
data = file_version_py.read()
|
data = file_version_py.read()
|
||||||
data = data.replace(old_version, VERSION)
|
data = data.replace(old_version, VERSION)
|
||||||
file_version_py.close()
|
file_version_py.close()
|
||||||
|
|
||||||
file_version_py = open('youtube_dlc/version.py', 'wt')
|
file_version_py = open('yt_dlp/version.py', 'wt')
|
||||||
file_version_py.write(data)
|
file_version_py.write(data)
|
||||||
file_version_py.close()
|
file_version_py.close()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#compdef youtube-dlc
|
#compdef yt-dlp
|
||||||
|
|
||||||
__youtube_dlc() {
|
__yt_dlp() {
|
||||||
local curcontext="$curcontext" fileopts diropts cur prev
|
local curcontext="$curcontext" fileopts diropts cur prev
|
||||||
typeset -A opt_args
|
typeset -A opt_args
|
||||||
fileopts="{{fileopts}}"
|
fileopts="{{fileopts}}"
|
||||||
@@ -27,4 +27,4 @@ __youtube_dlc() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
__youtube_dlc
|
__yt_dlp
|
||||||
@@ -6,9 +6,9 @@ from os.path import dirname as dirn
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
|
sys.path.insert(0, dirn(dirn((os.path.abspath(__file__)))))
|
||||||
import youtube_dlc
|
import yt_dlp
|
||||||
|
|
||||||
ZSH_COMPLETION_FILE = "youtube-dlc.zsh"
|
ZSH_COMPLETION_FILE = "completions/zsh/_yt-dlp"
|
||||||
ZSH_COMPLETION_TEMPLATE = "devscripts/zsh-completion.in"
|
ZSH_COMPLETION_TEMPLATE = "devscripts/zsh-completion.in"
|
||||||
|
|
||||||
|
|
||||||
@@ -45,5 +45,5 @@ def build_completion(opt_parser):
|
|||||||
f.write(template)
|
f.write(template)
|
||||||
|
|
||||||
|
|
||||||
parser = youtube_dlc.parseOpts()[0]
|
parser = yt_dlp.parseOpts()[0]
|
||||||
build_completion(parser)
|
build_completion(parser)
|
||||||
|
|||||||
5
docs/Changelog.md
Normal file
5
docs/Changelog.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
orphan: true
|
||||||
|
---
|
||||||
|
```{include} ../Changelog.md
|
||||||
|
```
|
||||||
6
docs/LICENSE.md
Normal file
6
docs/LICENSE.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
orphan: true
|
||||||
|
---
|
||||||
|
# LICENSE
|
||||||
|
```{include} ../LICENSE
|
||||||
|
```
|
||||||
@@ -85,17 +85,17 @@ qthelp:
|
|||||||
@echo
|
@echo
|
||||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/youtube-dlc.qhcp"
|
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/yt-dlp.qhcp"
|
||||||
@echo "To view the help file:"
|
@echo "To view the help file:"
|
||||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/youtube-dlc.qhc"
|
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/yt-dlp.qhc"
|
||||||
|
|
||||||
devhelp:
|
devhelp:
|
||||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||||
@echo
|
@echo
|
||||||
@echo "Build finished."
|
@echo "Build finished."
|
||||||
@echo "To view the help file:"
|
@echo "To view the help file:"
|
||||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/youtube-dlc"
|
@echo "# mkdir -p $$HOME/.local/share/devhelp/yt-dlp"
|
||||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/youtube-dlc"
|
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/yt-dlp"
|
||||||
@echo "# devhelp"
|
@echo "# devhelp"
|
||||||
|
|
||||||
epub:
|
epub:
|
||||||
|
|||||||
2
docs/README.md
Normal file
2
docs/README.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
```{include} ../README.md
|
||||||
|
```
|
||||||
45
docs/conf.py
45
docs/conf.py
@@ -1,21 +1,12 @@
|
|||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
#
|
#
|
||||||
# youtube-dlc documentation build configuration file, created by
|
# yt-dlp documentation build configuration file
|
||||||
# sphinx-quickstart on Fri Mar 14 21:05:43 2014.
|
|
||||||
#
|
|
||||||
# This file is execfile()d with the current directory set to its
|
|
||||||
# containing dir.
|
|
||||||
#
|
|
||||||
# Note that not all possible configuration values are present in this
|
|
||||||
# autogenerated file.
|
|
||||||
#
|
|
||||||
# All configuration values have a default; values that are commented out
|
|
||||||
# serve to show the default.
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
# Allows to import youtube_dlc
|
|
||||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
# Allows to import yt-dlp
|
||||||
|
sys.path.insert(0, os.path.abspath('..'))
|
||||||
|
|
||||||
# -- General configuration ------------------------------------------------
|
# -- General configuration ------------------------------------------------
|
||||||
|
|
||||||
@@ -23,28 +14,26 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
# ones.
|
# ones.
|
||||||
extensions = [
|
extensions = [
|
||||||
'sphinx.ext.autodoc',
|
'myst_parser',
|
||||||
]
|
]
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
templates_path = ['_templates']
|
templates_path = ['_templates']
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The master toctree document.
|
# The master toctree document.
|
||||||
master_doc = 'index'
|
master_doc = 'README'
|
||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = u'youtube-dlc'
|
project = u'yt-dlp'
|
||||||
copyright = u'2014, Ricardo Garcia Gonzalez'
|
author = u'yt-dlp'
|
||||||
|
copyright = u'UNLICENSE'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
from youtube_dlc.version import __version__
|
from yt_dlp.version import __version__
|
||||||
version = __version__
|
version = __version__
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = version
|
release = version
|
||||||
@@ -62,10 +51,18 @@ pygments_style = 'sphinx'
|
|||||||
# a list of builtin themes.
|
# a list of builtin themes.
|
||||||
html_theme = 'default'
|
html_theme = 'default'
|
||||||
|
|
||||||
|
# Disable highlights
|
||||||
|
highlight_language = 'none'
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
html_static_path = ['_static']
|
# html_static_path = ['_static']
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Enable heading anchors
|
||||||
htmlhelp_basename = 'youtube-dlcdoc'
|
myst_heading_anchors = 4
|
||||||
|
|
||||||
|
# Suppress heading warnings
|
||||||
|
suppress_warnings = [
|
||||||
|
'myst.header',
|
||||||
|
]
|
||||||
|
|||||||
31
docs/faq.md
31
docs/faq.md
@@ -1,31 +0,0 @@
|
|||||||
- Q: How to redirect to another extractor?
|
|
||||||
- A:
|
|
||||||
- Most simple using only `url_result`
|
|
||||||
```
|
|
||||||
# get proper url first if needed.
|
|
||||||
return self.url_result(url)
|
|
||||||
```
|
|
||||||
- Using `_request_webpage` and `to_screen` in addition
|
|
||||||
```
|
|
||||||
urlh = self._request_webpage(
|
|
||||||
url, id, note='Downloading redirect page')
|
|
||||||
url = urlh.geturl()
|
|
||||||
self.to_screen('Following redirect: %s' % url)
|
|
||||||
return self.url_result(url)
|
|
||||||
```
|
|
||||||
- Using `return` construction
|
|
||||||
```
|
|
||||||
return {
|
|
||||||
'_type': 'url_transparent',
|
|
||||||
'url': url,
|
|
||||||
'ie_key': ExampleIE.ie_key(),
|
|
||||||
'id': id,
|
|
||||||
}
|
|
||||||
# Alternative if extractor supports internal uri like kaltura
|
|
||||||
return {
|
|
||||||
'_type': 'url_transparent',
|
|
||||||
'url': 'kaltura:%s:%s' % (partner_id, kaltura_id),
|
|
||||||
'ie_key': KalturaIE.ie_key(),
|
|
||||||
'id': id,
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
Welcome to youtube-dlc's documentation!
|
|
||||||
======================================
|
|
||||||
|
|
||||||
*youtube-dlc* is a command-line program to download videos from YouTube.com and more sites.
|
|
||||||
It can also be used in Python code.
|
|
||||||
|
|
||||||
Developer guide
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This section contains information for using *youtube-dlc* from Python programs.
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
module_guide
|
|
||||||
|
|
||||||
Indices and tables
|
|
||||||
==================
|
|
||||||
|
|
||||||
* :ref:`genindex`
|
|
||||||
* :ref:`modindex`
|
|
||||||
* :ref:`search`
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
Using the ``youtube_dlc`` module
|
|
||||||
===============================
|
|
||||||
|
|
||||||
When using the ``youtube_dlc`` module, you start by creating an instance of :class:`YoutubeDL` and adding all the available extractors:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> from youtube_dlc import YoutubeDL
|
|
||||||
>>> ydl = YoutubeDL()
|
|
||||||
>>> ydl.add_default_info_extractors()
|
|
||||||
|
|
||||||
Extracting video information
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
You use the :meth:`YoutubeDL.extract_info` method for getting the video information, which returns a dictionary:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> info = ydl.extract_info('http://www.youtube.com/watch?v=BaW_jenozKc', download=False)
|
|
||||||
[youtube] Setting language
|
|
||||||
[youtube] BaW_jenozKc: Downloading webpage
|
|
||||||
[youtube] BaW_jenozKc: Downloading video info webpage
|
|
||||||
[youtube] BaW_jenozKc: Extracting video information
|
|
||||||
>>> info['title']
|
|
||||||
'youtube-dlc test video "\'/\\ä↭𝕐'
|
|
||||||
>>> info['height'], info['width']
|
|
||||||
(720, 1280)
|
|
||||||
|
|
||||||
If you want to download or play the video you can get its url:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> info['url']
|
|
||||||
'https://...'
|
|
||||||
|
|
||||||
Extracting playlist information
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
The playlist information is extracted in a similar way, but the dictionary is a bit different:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> playlist = ydl.extract_info('http://www.ted.com/playlists/13/open_source_open_world', download=False)
|
|
||||||
[TED] open_source_open_world: Downloading playlist webpage
|
|
||||||
...
|
|
||||||
>>> playlist['title']
|
|
||||||
'Open-source, open world'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
You can access the videos in the playlist with the ``entries`` field:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
>>> for video in playlist['entries']:
|
|
||||||
... print('Video #%d: %s' % (video['playlist_index'], video['title']))
|
|
||||||
|
|
||||||
Video #1: How Arduino is open-sourcing imagination
|
|
||||||
Video #2: The year open data went worldwide
|
|
||||||
Video #3: Massive-scale online collaboration
|
|
||||||
Video #4: The art of asking
|
|
||||||
Video #5: How cognitive surplus will change the world
|
|
||||||
Video #6: The birth of Wikipedia
|
|
||||||
Video #7: Coding a better government
|
|
||||||
Video #8: The era of open innovation
|
|
||||||
Video #9: The currency of the new economy is trust
|
|
||||||
|
|
||||||
1
docs/requirements.txt
Normal file
1
docs/requirements.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
myst-parser
|
||||||
File diff suppressed because it is too large
Load Diff
6
docs/ytdlp_plugins.md
Normal file
6
docs/ytdlp_plugins.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
orphan: true
|
||||||
|
---
|
||||||
|
# ytdlp_plugins
|
||||||
|
|
||||||
|
See [https://github.com/yt-dlp/yt-dlp/tree/master/ytdlp_plugins](https://github.com/yt-dlp/yt-dlp/tree/master/ytdlp_plugins).
|
||||||
23
pyinst.py
23
pyinst.py
@@ -17,13 +17,13 @@ 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)
|
||||||
# os.chdir(root_dir)
|
# os.chdir(root_dir)
|
||||||
|
|
||||||
exec(compile(open('youtube_dlc/version.py').read(), 'youtube_dlc/version.py', 'exec'))
|
exec(compile(open('yt_dlp/version.py').read(), 'yt_dlp/version.py', 'exec'))
|
||||||
VERSION = locals()['__version__']
|
VERSION = locals()['__version__']
|
||||||
|
|
||||||
VERSION_LIST = VERSION.split('.')
|
VERSION_LIST = VERSION.split('.')
|
||||||
@@ -47,17 +47,17 @@ VERSION_FILE = VSVersionInfo(
|
|||||||
StringFileInfo([
|
StringFileInfo([
|
||||||
StringTable(
|
StringTable(
|
||||||
'040904B0', [
|
'040904B0', [
|
||||||
StringStruct('Comments', 'Youtube-dlc%s Command Line Interface.' % _x86),
|
StringStruct('Comments', 'yt-dlp%s Command Line Interface.' % _x86),
|
||||||
StringStruct('CompanyName', 'https://github.com/pukkandan/yt-dlp'),
|
StringStruct('CompanyName', 'https://github.com/yt-dlp'),
|
||||||
StringStruct('FileDescription', FILE_DESCRIPTION),
|
StringStruct('FileDescription', FILE_DESCRIPTION),
|
||||||
StringStruct('FileVersion', VERSION),
|
StringStruct('FileVersion', VERSION),
|
||||||
StringStruct('InternalName', 'youtube-dlc%s' % _x86),
|
StringStruct('InternalName', 'yt-dlp%s' % _x86),
|
||||||
StringStruct(
|
StringStruct(
|
||||||
'LegalCopyright',
|
'LegalCopyright',
|
||||||
'pukkandan@gmail.com | UNLICENSE',
|
'pukkandan.ytdlp@gmail.com | UNLICENSE',
|
||||||
),
|
),
|
||||||
StringStruct('OriginalFilename', 'youtube-dlc%s.exe' % _x86),
|
StringStruct('OriginalFilename', 'yt-dlp%s.exe' % _x86),
|
||||||
StringStruct('ProductName', 'Youtube-dlc%s' % _x86),
|
StringStruct('ProductName', 'yt-dlp%s' % _x86),
|
||||||
StringStruct('ProductVersion', '%s%s' % (VERSION, _x86)),
|
StringStruct('ProductVersion', '%s%s' % (VERSION, _x86)),
|
||||||
])]),
|
])]),
|
||||||
VarFileInfo([VarStruct('Translation', [0, 1200])])
|
VarFileInfo([VarStruct('Translation', [0, 1200])])
|
||||||
@@ -65,15 +65,16 @@ VERSION_FILE = VSVersionInfo(
|
|||||||
)
|
)
|
||||||
|
|
||||||
PyInstaller.__main__.run([
|
PyInstaller.__main__.run([
|
||||||
'--name=youtube-dlc%s' % _x86,
|
'--name=yt-dlp%s' % _x86,
|
||||||
'--onefile',
|
'--onefile',
|
||||||
'--icon=devscripts/cloud.ico',
|
'--icon=devscripts/cloud.ico',
|
||||||
'--exclude-module=youtube_dl',
|
'--exclude-module=youtube_dl',
|
||||||
|
'--exclude-module=youtube_dlc',
|
||||||
'--exclude-module=test',
|
'--exclude-module=test',
|
||||||
'--exclude-module=ytdlp_plugins',
|
'--exclude-module=ytdlp_plugins',
|
||||||
'--hidden-import=mutagen',
|
'--hidden-import=mutagen',
|
||||||
'--hidden-import=Crypto',
|
'--hidden-import=Crypto',
|
||||||
'--upx-exclude=vcruntime140.dll',
|
'--upx-exclude=vcruntime140.dll',
|
||||||
'youtube_dlc/__main__.py',
|
'yt_dlp/__main__.py',
|
||||||
])
|
])
|
||||||
SetVersion('dist/youtube-dlc%s.exe' % _x86, VERSION_FILE)
|
SetVersion('dist/yt-dlp%s.exe' % _x86, VERSION_FILE)
|
||||||
|
|||||||
@@ -2,5 +2,5 @@
|
|||||||
universal = True
|
universal = True
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
exclude = youtube_dlc/extractor/__init__.py,devscripts/buildserver.py,devscripts/lazy_load_template.py,devscripts/make_issue_template.py,setup.py,build,.git,venv,devscripts/create-github-release.py,devscripts/release.sh,devscripts/show-downloads-statistics.py
|
exclude = yt_dlp/extractor/__init__.py,devscripts/buildserver.py,devscripts/lazy_load_template.py,devscripts/make_issue_template.py,setup.py,build,.git,venv,devscripts/create-github-release.py,devscripts/release.sh,devscripts/show-downloads-statistics.py
|
||||||
ignore = E402,E501,E731,E741,W503
|
ignore = E402,E501,E731,E741,W503
|
||||||
112
setup.py
112
setup.py
@@ -8,45 +8,45 @@ import sys
|
|||||||
from distutils.spawn import spawn
|
from distutils.spawn import spawn
|
||||||
|
|
||||||
|
|
||||||
# Get the version from youtube_dlc/version.py without importing the package
|
# Get the version from yt_dlp/version.py without importing the package
|
||||||
exec(compile(open('youtube_dlc/version.py').read(),
|
exec(compile(open('yt_dlp/version.py').read(), 'yt_dlp/version.py', 'exec'))
|
||||||
'youtube_dlc/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/pukkandan/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']
|
||||||
|
|
||||||
|
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':
|
|
||||||
print("inv")
|
files_spec = [
|
||||||
else:
|
('share/bash-completion/completions', ['completions/bash/yt-dlp']),
|
||||||
files_spec = [
|
('share/zsh/site-functions', ['completions/zsh/_yt-dlp']),
|
||||||
('etc/bash_completion.d', ['youtube-dlc.bash-completion']),
|
('share/fish/vendor_completions.d', ['completions/fish/yt-dlp.fish']),
|
||||||
('etc/fish/completions', ['youtube-dlc.fish']),
|
('share/doc/yt_dlp', ['README.txt']),
|
||||||
('share/doc/youtube_dlc', ['README.txt']),
|
('share/man/man1', ['yt-dlp.1'])
|
||||||
('share/man/man1', ['youtube-dlc.1'])
|
]
|
||||||
]
|
root = os.path.dirname(os.path.abspath(__file__))
|
||||||
root = os.path.dirname(os.path.abspath(__file__))
|
data_files = []
|
||||||
data_files = []
|
for dirname, files in files_spec:
|
||||||
for dirname, files in files_spec:
|
|
||||||
resfiles = []
|
resfiles = []
|
||||||
for fn in files:
|
for fn in files:
|
||||||
if not os.path.exists(fn):
|
if not os.path.exists(fn):
|
||||||
warnings.warn('Skipping file %s since it is not present. Type make to build all automatically generated files.' % fn)
|
warnings.warn('Skipping file %s since it is not present. Try running `make pypi-files` first' % fn)
|
||||||
else:
|
else:
|
||||||
resfiles.append(fn)
|
resfiles.append(fn)
|
||||||
data_files.append((dirname, resfiles))
|
data_files.append((dirname, resfiles))
|
||||||
|
|
||||||
params = {
|
params = {
|
||||||
'data_files': data_files,
|
'data_files': data_files,
|
||||||
}
|
}
|
||||||
params['entry_points'] = {'console_scripts': ['youtube-dlc = youtube_dlc:main']}
|
params['entry_points'] = {'console_scripts': ['yt-dlp = yt_dlp:main']}
|
||||||
|
|
||||||
|
|
||||||
class build_lazy_extractors(Command):
|
class build_lazy_extractors(Command):
|
||||||
@@ -60,54 +60,52 @@ 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', 'youtube_dlc/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'))
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="yt-dlp",
|
name='yt-dlp',
|
||||||
version=__version__,
|
version=__version__,
|
||||||
maintainer="pukkandan",
|
maintainer='pukkandan',
|
||||||
maintainer_email="pukkandan@gmail.com",
|
maintainer_email='pukkandan.ytdlp@gmail.com',
|
||||||
description=DESCRIPTION,
|
description=DESCRIPTION,
|
||||||
long_description=LONG_DESCRIPTION,
|
long_description=LONG_DESCRIPTION,
|
||||||
long_description_content_type="text/markdown",
|
long_description_content_type='text/markdown',
|
||||||
url="https://github.com/pukkandan/yt-dlp",
|
url='https://github.com/yt-dlp/yt-dlp',
|
||||||
packages=packages,
|
packages=packages,
|
||||||
install_requires=REQUIREMENTS,
|
install_requires=REQUIREMENTS,
|
||||||
project_urls={
|
project_urls={
|
||||||
'Documentation': 'https://github.com/pukkandan/yt-dlp#yt-dlp',
|
'Documentation': 'https://yt-dlp.readthedocs.io',
|
||||||
'Source': 'https://github.com/pukkandan/yt-dlp',
|
'Source': 'https://github.com/yt-dlp/yt-dlp',
|
||||||
'Tracker': 'https://github.com/pukkandan/yt-dlp/issues',
|
'Tracker': 'https://github.com/yt-dlp/yt-dlp/issues',
|
||||||
#'Funding': 'https://donate.pypi.org',
|
#'Funding': 'https://donate.pypi.org',
|
||||||
},
|
},
|
||||||
classifiers=[
|
classifiers=[
|
||||||
"Topic :: Multimedia :: Video",
|
'Topic :: Multimedia :: Video',
|
||||||
"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',
|
||||||
"Programming Language :: Python :: 2.6",
|
'Programming Language :: Python :: 2.6',
|
||||||
"Programming Language :: Python :: 2.7",
|
'Programming Language :: Python :: 2.7',
|
||||||
"Programming Language :: Python :: 3",
|
'Programming Language :: Python :: 3',
|
||||||
"Programming Language :: Python :: 3.2",
|
'Programming Language :: Python :: 3.2',
|
||||||
"Programming Language :: Python :: 3.3",
|
'Programming Language :: Python :: 3.3',
|
||||||
"Programming Language :: Python :: 3.4",
|
'Programming Language :: Python :: 3.4',
|
||||||
"Programming Language :: Python :: 3.5",
|
'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 :: IronPython',
|
||||||
"Programming Language :: Python :: Implementation :: Jython",
|
'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='>=2.6',
|
||||||
|
|
||||||
|
|||||||
1287
supportedsites.md
Normal file
1287
supportedsites.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,13 +10,13 @@ import types
|
|||||||
import ssl
|
import ssl
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import youtube_dlc.extractor
|
import yt_dlp.extractor
|
||||||
from youtube_dlc import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_os_name,
|
compat_os_name,
|
||||||
compat_str,
|
compat_str,
|
||||||
)
|
)
|
||||||
from youtube_dlc.utils import (
|
from yt_dlp.utils import (
|
||||||
preferredencoding,
|
preferredencoding,
|
||||||
write_string,
|
write_string,
|
||||||
)
|
)
|
||||||
@@ -90,7 +90,7 @@ class FakeYDL(YoutubeDL):
|
|||||||
|
|
||||||
|
|
||||||
def gettestcases(include_onlymatching=False):
|
def gettestcases(include_onlymatching=False):
|
||||||
for ie in youtube_dlc.extractor.gen_extractors():
|
for ie in yt_dlp.extractor.gen_extractors():
|
||||||
for tc in ie.get_testcases(include_onlymatching):
|
for tc in ie.get_testcases(include_onlymatching):
|
||||||
yield tc
|
yield tc
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
"noprogress": false,
|
"noprogress": false,
|
||||||
"outtmpl": "%(id)s.%(ext)s",
|
"outtmpl": "%(id)s.%(ext)s",
|
||||||
"password": null,
|
"password": null,
|
||||||
"playlistend": -1,
|
|
||||||
"playliststart": 1,
|
"playliststart": 1,
|
||||||
"prefer_free_formats": false,
|
"prefer_free_formats": false,
|
||||||
"quiet": false,
|
"quiet": false,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -12,12 +12,12 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
import copy
|
import copy
|
||||||
|
|
||||||
from test.helper import FakeYDL, assertRegexpMatches
|
from test.helper import FakeYDL, assertRegexpMatches
|
||||||
from youtube_dlc import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from youtube_dlc.compat import compat_str, compat_urllib_error
|
from yt_dlp.compat import compat_str, compat_urllib_error
|
||||||
from youtube_dlc.extractor import YoutubeIE
|
from yt_dlp.extractor import YoutubeIE
|
||||||
from youtube_dlc.extractor.common import InfoExtractor
|
from yt_dlp.extractor.common import InfoExtractor
|
||||||
from youtube_dlc.postprocessor.common import PostProcessor
|
from yt_dlp.postprocessor.common import PostProcessor
|
||||||
from youtube_dlc.utils import ExtractorError, match_filter_func
|
from yt_dlp.utils import ExtractorError, match_filter_func
|
||||||
|
|
||||||
TEST_URL = 'http://localhost/sample.mp4'
|
TEST_URL = 'http://localhost/sample.mp4'
|
||||||
|
|
||||||
@@ -29,6 +29,7 @@ class YDL(FakeYDL):
|
|||||||
self.msgs = []
|
self.msgs = []
|
||||||
|
|
||||||
def process_info(self, info_dict):
|
def process_info(self, info_dict):
|
||||||
|
info_dict.pop('__original_infodict', None)
|
||||||
self.downloaded_info_dicts.append(info_dict)
|
self.downloaded_info_dicts.append(info_dict)
|
||||||
|
|
||||||
def to_screen(self, msg):
|
def to_screen(self, msg):
|
||||||
@@ -311,8 +312,8 @@ class TestFormatSelection(unittest.TestCase):
|
|||||||
self.assertRaises(ExtractorError, ydl.process_ie_result, info_dict.copy())
|
self.assertRaises(ExtractorError, ydl.process_ie_result, info_dict.copy())
|
||||||
|
|
||||||
def test_youtube_format_selection(self):
|
def test_youtube_format_selection(self):
|
||||||
|
# FIXME: Rewrite in accordance with the new format sorting options
|
||||||
return
|
return
|
||||||
# disabled for now - this needs some changes
|
|
||||||
|
|
||||||
order = [
|
order = [
|
||||||
'38', '37', '46', '22', '45', '35', '44', '18', '34', '43', '6', '5', '17', '36', '13',
|
'38', '37', '46', '22', '45', '35', '44', '18', '34', '43', '6', '5', '17', '36', '13',
|
||||||
@@ -601,6 +602,26 @@ class TestYoutubeDL(unittest.TestCase):
|
|||||||
self.assertTrue(subs)
|
self.assertTrue(subs)
|
||||||
self.assertEqual(set(subs.keys()), set(['es', 'fr']))
|
self.assertEqual(set(subs.keys()), set(['es', 'fr']))
|
||||||
|
|
||||||
|
result = get_info({'writesubtitles': True, 'subtitleslangs': ['all', '-en']})
|
||||||
|
subs = result['requested_subtitles']
|
||||||
|
self.assertTrue(subs)
|
||||||
|
self.assertEqual(set(subs.keys()), set(['es', 'fr']))
|
||||||
|
|
||||||
|
result = get_info({'writesubtitles': True, 'subtitleslangs': ['en', 'fr', '-en']})
|
||||||
|
subs = result['requested_subtitles']
|
||||||
|
self.assertTrue(subs)
|
||||||
|
self.assertEqual(set(subs.keys()), set(['fr']))
|
||||||
|
|
||||||
|
result = get_info({'writesubtitles': True, 'subtitleslangs': ['-en', 'en']})
|
||||||
|
subs = result['requested_subtitles']
|
||||||
|
self.assertTrue(subs)
|
||||||
|
self.assertEqual(set(subs.keys()), set(['en']))
|
||||||
|
|
||||||
|
result = get_info({'writesubtitles': True, 'subtitleslangs': ['e.+']})
|
||||||
|
subs = result['requested_subtitles']
|
||||||
|
self.assertTrue(subs)
|
||||||
|
self.assertEqual(set(subs.keys()), set(['es', 'en']))
|
||||||
|
|
||||||
result = get_info({'writesubtitles': True, 'writeautomaticsub': True, 'subtitleslangs': ['es', 'pt']})
|
result = get_info({'writesubtitles': True, 'writeautomaticsub': True, 'subtitleslangs': ['es', 'pt']})
|
||||||
subs = result['requested_subtitles']
|
subs = result['requested_subtitles']
|
||||||
self.assertTrue(subs)
|
self.assertTrue(subs)
|
||||||
@@ -635,6 +656,8 @@ class TestYoutubeDL(unittest.TestCase):
|
|||||||
'height': 1080,
|
'height': 1080,
|
||||||
'title1': '$PATH',
|
'title1': '$PATH',
|
||||||
'title2': '%PATH%',
|
'title2': '%PATH%',
|
||||||
|
'timestamp': 1618488000,
|
||||||
|
'formats': [{'id': 'id1'}, {'id': 'id2'}]
|
||||||
}
|
}
|
||||||
|
|
||||||
def fname(templ, na_placeholder='NA'):
|
def fname(templ, na_placeholder='NA'):
|
||||||
@@ -651,6 +674,7 @@ class TestYoutubeDL(unittest.TestCase):
|
|||||||
# Or by provided placeholder
|
# Or by provided placeholder
|
||||||
self.assertEqual(fname(NA_TEST_OUTTMPL, na_placeholder='none'), 'none-none-1234.mp4')
|
self.assertEqual(fname(NA_TEST_OUTTMPL, na_placeholder='none'), 'none-none-1234.mp4')
|
||||||
self.assertEqual(fname(NA_TEST_OUTTMPL, na_placeholder=''), '--1234.mp4')
|
self.assertEqual(fname(NA_TEST_OUTTMPL, na_placeholder=''), '--1234.mp4')
|
||||||
|
self.assertEqual(fname('%(height)s.%(ext)s'), '1080.mp4')
|
||||||
self.assertEqual(fname('%(height)d.%(ext)s'), '1080.mp4')
|
self.assertEqual(fname('%(height)d.%(ext)s'), '1080.mp4')
|
||||||
self.assertEqual(fname('%(height)6d.%(ext)s'), ' 1080.mp4')
|
self.assertEqual(fname('%(height)6d.%(ext)s'), ' 1080.mp4')
|
||||||
self.assertEqual(fname('%(height)-6d.%(ext)s'), '1080 .mp4')
|
self.assertEqual(fname('%(height)-6d.%(ext)s'), '1080 .mp4')
|
||||||
@@ -668,6 +692,12 @@ class TestYoutubeDL(unittest.TestCase):
|
|||||||
self.assertEqual(fname('%%(width)06d.%(ext)s'), '%(width)06d.mp4')
|
self.assertEqual(fname('%%(width)06d.%(ext)s'), '%(width)06d.mp4')
|
||||||
self.assertEqual(fname('Hello %(title1)s'), 'Hello $PATH')
|
self.assertEqual(fname('Hello %(title1)s'), 'Hello $PATH')
|
||||||
self.assertEqual(fname('Hello %(title2)s'), 'Hello %PATH%')
|
self.assertEqual(fname('Hello %(title2)s'), 'Hello %PATH%')
|
||||||
|
self.assertEqual(fname('%(timestamp+-1000>%H-%M-%S)s'), '11-43-20')
|
||||||
|
self.assertEqual(fname('%(id+1)05d'), '01235')
|
||||||
|
self.assertEqual(fname('%(width+100)05d'), 'NA')
|
||||||
|
self.assertEqual(fname('%(formats.0)s').replace("u", ""), "{'id' - 'id1'}")
|
||||||
|
self.assertEqual(fname('%(formats.-1.id)s'), 'id2')
|
||||||
|
self.assertEqual(fname('%(formats.2)s'), 'NA')
|
||||||
|
|
||||||
def test_format_note(self):
|
def test_format_note(self):
|
||||||
ydl = YoutubeDL()
|
ydl = YoutubeDL()
|
||||||
@@ -726,7 +756,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)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import tempfile
|
|||||||
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 youtube_dlc.utils import YoutubeDLCookieJar
|
from yt_dlp.utils import YoutubeDLCookieJar
|
||||||
|
|
||||||
|
|
||||||
class TestYoutubeDLCookieJar(unittest.TestCase):
|
class TestYoutubeDLCookieJar(unittest.TestCase):
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ 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 youtube_dlc.aes import aes_decrypt, aes_encrypt, aes_cbc_decrypt, aes_cbc_encrypt, aes_decrypt_text
|
from yt_dlp.aes import aes_decrypt, aes_encrypt, aes_cbc_decrypt, aes_cbc_encrypt, aes_decrypt_text
|
||||||
from youtube_dlc.utils import bytes_to_intlist, intlist_to_bytes
|
from yt_dlp.utils import bytes_to_intlist, intlist_to_bytes
|
||||||
import base64
|
import base64
|
||||||
|
|
||||||
# the encrypted data can be generate with 'devscripts/generate_aes_testdata.py'
|
# the encrypted data can be generate with 'devscripts/generate_aes_testdata.py'
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ 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
|
||||||
|
|
||||||
|
|
||||||
from youtube_dlc import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
|
|
||||||
|
|
||||||
def _download_restricted(url, filename, age):
|
def _download_restricted(url, filename, age):
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
|
|
||||||
from test.helper import gettestcases
|
from test.helper import gettestcases
|
||||||
|
|
||||||
from youtube_dlc.extractor import (
|
from yt_dlp.extractor import (
|
||||||
FacebookIE,
|
FacebookIE,
|
||||||
gen_extractors,
|
gen_extractors,
|
||||||
YoutubeIE,
|
YoutubeIE,
|
||||||
@@ -37,7 +37,6 @@ class TestAllURLsMatching(unittest.TestCase):
|
|||||||
assertPlaylist('PL63F0C78739B09958')
|
assertPlaylist('PL63F0C78739B09958')
|
||||||
assertTab('https://www.youtube.com/AsapSCIENCE')
|
assertTab('https://www.youtube.com/AsapSCIENCE')
|
||||||
assertTab('https://www.youtube.com/embedded')
|
assertTab('https://www.youtube.com/embedded')
|
||||||
assertTab('https://www.youtube.com/feed') # Own channel's home page
|
|
||||||
assertTab('https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0Q')
|
assertTab('https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0Q')
|
||||||
assertTab('https://www.youtube.com/course?list=ECUl4u3cNGP61MdtwGTqZA0MreSaDybji8')
|
assertTab('https://www.youtube.com/course?list=ECUl4u3cNGP61MdtwGTqZA0MreSaDybji8')
|
||||||
assertTab('https://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC')
|
assertTab('https://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC')
|
||||||
@@ -73,15 +72,6 @@ class TestAllURLsMatching(unittest.TestCase):
|
|||||||
self.assertMatch('http://www.youtube.com/results?search_query=making+mustard', ['youtube:search_url'])
|
self.assertMatch('http://www.youtube.com/results?search_query=making+mustard', ['youtube:search_url'])
|
||||||
self.assertMatch('https://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=video', ['youtube:search_url'])
|
self.assertMatch('https://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=video', ['youtube:search_url'])
|
||||||
|
|
||||||
def test_youtube_extract(self):
|
|
||||||
assertExtractId = lambda url, id: self.assertEqual(YoutubeIE.extract_id(url), id)
|
|
||||||
assertExtractId('http://www.youtube.com/watch?&v=BaW_jenozKc', 'BaW_jenozKc')
|
|
||||||
assertExtractId('https://www.youtube.com/watch?&v=BaW_jenozKc', 'BaW_jenozKc')
|
|
||||||
assertExtractId('https://www.youtube.com/watch?feature=player_embedded&v=BaW_jenozKc', 'BaW_jenozKc')
|
|
||||||
assertExtractId('https://www.youtube.com/watch_popup?v=BaW_jenozKc', 'BaW_jenozKc')
|
|
||||||
assertExtractId('http://www.youtube.com/watch?v=BaW_jenozKcsharePLED17F32AD9753930', 'BaW_jenozKc')
|
|
||||||
assertExtractId('BaW_jenozKc', 'BaW_jenozKc')
|
|
||||||
|
|
||||||
def test_facebook_matching(self):
|
def test_facebook_matching(self):
|
||||||
self.assertTrue(FacebookIE.suitable('https://www.facebook.com/Shiniknoh#!/photo.php?v=10153317450565268'))
|
self.assertTrue(FacebookIE.suitable('https://www.facebook.com/Shiniknoh#!/photo.php?v=10153317450565268'))
|
||||||
self.assertTrue(FacebookIE.suitable('https://www.facebook.com/cindyweather?fref=ts#!/photo.php?v=10152183998945793'))
|
self.assertTrue(FacebookIE.suitable('https://www.facebook.com/cindyweather?fref=ts#!/photo.php?v=10152183998945793'))
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
|
|
||||||
|
|
||||||
from test.helper import FakeYDL
|
from test.helper import FakeYDL
|
||||||
from youtube_dlc.cache import Cache
|
from yt_dlp.cache import Cache
|
||||||
|
|
||||||
|
|
||||||
def _is_empty(d):
|
def _is_empty(d):
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ 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 youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_getenv,
|
compat_getenv,
|
||||||
compat_setenv,
|
compat_setenv,
|
||||||
compat_etree_Element,
|
compat_etree_Element,
|
||||||
@@ -30,11 +30,11 @@ from youtube_dlc.compat import (
|
|||||||
class TestCompat(unittest.TestCase):
|
class TestCompat(unittest.TestCase):
|
||||||
def test_compat_getenv(self):
|
def test_compat_getenv(self):
|
||||||
test_str = 'тест'
|
test_str = 'тест'
|
||||||
compat_setenv('youtube_dlc_COMPAT_GETENV', test_str)
|
compat_setenv('yt_dlp_COMPAT_GETENV', test_str)
|
||||||
self.assertEqual(compat_getenv('youtube_dlc_COMPAT_GETENV'), test_str)
|
self.assertEqual(compat_getenv('yt_dlp_COMPAT_GETENV'), test_str)
|
||||||
|
|
||||||
def test_compat_setenv(self):
|
def test_compat_setenv(self):
|
||||||
test_var = 'youtube_dlc_COMPAT_SETENV'
|
test_var = 'yt_dlp_COMPAT_SETENV'
|
||||||
test_str = 'тест'
|
test_str = 'тест'
|
||||||
compat_setenv(test_var, test_str)
|
compat_setenv(test_var, test_str)
|
||||||
compat_getenv(test_var)
|
compat_getenv(test_var)
|
||||||
@@ -48,11 +48,11 @@ class TestCompat(unittest.TestCase):
|
|||||||
compat_setenv('HOME', old_home or '')
|
compat_setenv('HOME', old_home or '')
|
||||||
|
|
||||||
def test_all_present(self):
|
def test_all_present(self):
|
||||||
import youtube_dlc.compat
|
import yt_dlp.compat
|
||||||
all_names = youtube_dlc.compat.__all__
|
all_names = yt_dlp.compat.__all__
|
||||||
present_names = set(filter(
|
present_names = set(filter(
|
||||||
lambda c: '_' in c and not c.startswith('_'),
|
lambda c: '_' in c and not c.startswith('_'),
|
||||||
dir(youtube_dlc.compat))) - set(['unicode_literals'])
|
dir(yt_dlp.compat))) - set(['unicode_literals'])
|
||||||
self.assertEqual(all_names, sorted(present_names))
|
self.assertEqual(all_names, sorted(present_names))
|
||||||
|
|
||||||
def test_compat_urllib_parse_quote(self):
|
def test_compat_urllib_parse_quote(self):
|
||||||
|
|||||||
@@ -24,24 +24,24 @@ import io
|
|||||||
import json
|
import json
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
import youtube_dlc.YoutubeDL
|
import yt_dlp.YoutubeDL
|
||||||
from youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_http_client,
|
compat_http_client,
|
||||||
compat_urllib_error,
|
compat_urllib_error,
|
||||||
compat_HTTPError,
|
compat_HTTPError,
|
||||||
)
|
)
|
||||||
from youtube_dlc.utils import (
|
from yt_dlp.utils import (
|
||||||
DownloadError,
|
DownloadError,
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
format_bytes,
|
format_bytes,
|
||||||
UnavailableVideoError,
|
UnavailableVideoError,
|
||||||
)
|
)
|
||||||
from youtube_dlc.extractor import get_info_extractor
|
from yt_dlp.extractor import get_info_extractor
|
||||||
|
|
||||||
RETRIES = 3
|
RETRIES = 3
|
||||||
|
|
||||||
|
|
||||||
class YoutubeDL(youtube_dlc.YoutubeDL):
|
class YoutubeDL(yt_dlp.YoutubeDL):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.to_stderr = self.to_screen
|
self.to_stderr = self.to_screen
|
||||||
self.processed_info_dicts = []
|
self.processed_info_dicts = []
|
||||||
@@ -92,7 +92,7 @@ class TestDownload(unittest.TestCase):
|
|||||||
def generator(test_case, tname):
|
def generator(test_case, tname):
|
||||||
|
|
||||||
def test_template(self):
|
def test_template(self):
|
||||||
ie = youtube_dlc.extractor.get_info_extractor(test_case['name'])()
|
ie = yt_dlp.extractor.get_info_extractor(test_case['name'])()
|
||||||
other_ies = [get_info_extractor(ie_key)() for ie_key in test_case.get('add_ie', [])]
|
other_ies = [get_info_extractor(ie_key)() for ie_key in test_case.get('add_ie', [])]
|
||||||
is_playlist = any(k.startswith('playlist') for k in test_case)
|
is_playlist = any(k.startswith('playlist') for k in test_case)
|
||||||
test_cases = test_case.get(
|
test_cases = test_case.get(
|
||||||
@@ -121,6 +121,7 @@ def generator(test_case, tname):
|
|||||||
params['outtmpl'] = tname + '_' + params['outtmpl']
|
params['outtmpl'] = tname + '_' + params['outtmpl']
|
||||||
if is_playlist and 'playlist' not in test_case:
|
if is_playlist and 'playlist' not in test_case:
|
||||||
params.setdefault('extract_flat', 'in_playlist')
|
params.setdefault('extract_flat', 'in_playlist')
|
||||||
|
params.setdefault('playlistend', test_case.get('playlist_mincount'))
|
||||||
params.setdefault('skip_download', True)
|
params.setdefault('skip_download', True)
|
||||||
|
|
||||||
ydl = YoutubeDL(params, auto_init=False)
|
ydl = YoutubeDL(params, auto_init=False)
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ 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 http_server_port, try_rm
|
from test.helper import http_server_port, try_rm
|
||||||
from youtube_dlc import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from youtube_dlc.compat import compat_http_server
|
from yt_dlp.compat import compat_http_server
|
||||||
from youtube_dlc.downloader.http import HttpFD
|
from yt_dlp.downloader.http import HttpFD
|
||||||
from youtube_dlc.utils import encodeFilename
|
from yt_dlp.utils import encodeFilename
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
TEST_DIR = os.path.dirname(os.path.abspath(__file__))
|
TEST_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import os
|
|||||||
import subprocess
|
import subprocess
|
||||||
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 youtube_dlc.utils import encodeArgument
|
from yt_dlp.utils import encodeArgument
|
||||||
|
|
||||||
rootDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
rootDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
@@ -23,22 +23,32 @@ except AttributeError:
|
|||||||
|
|
||||||
class TestExecution(unittest.TestCase):
|
class TestExecution(unittest.TestCase):
|
||||||
def test_import(self):
|
def test_import(self):
|
||||||
subprocess.check_call([sys.executable, '-c', 'import youtube_dlc'], cwd=rootDir)
|
subprocess.check_call([sys.executable, '-c', 'import yt_dlp'], cwd=rootDir)
|
||||||
|
|
||||||
def test_module_exec(self):
|
def test_module_exec(self):
|
||||||
if sys.version_info >= (2, 7): # Python 2.6 doesn't support package execution
|
if sys.version_info >= (2, 7): # Python 2.6 doesn't support package execution
|
||||||
subprocess.check_call([sys.executable, '-m', 'youtube_dlc', '--version'], cwd=rootDir, stdout=_DEV_NULL)
|
subprocess.check_call([sys.executable, '-m', 'yt_dlp', '--version'], cwd=rootDir, stdout=_DEV_NULL)
|
||||||
|
|
||||||
def test_main_exec(self):
|
def test_main_exec(self):
|
||||||
subprocess.check_call([sys.executable, 'youtube_dlc/__main__.py', '--version'], cwd=rootDir, stdout=_DEV_NULL)
|
subprocess.check_call([sys.executable, 'yt_dlp/__main__.py', '--version'], cwd=rootDir, stdout=_DEV_NULL)
|
||||||
|
|
||||||
def test_cmdline_umlauts(self):
|
def test_cmdline_umlauts(self):
|
||||||
p = subprocess.Popen(
|
p = subprocess.Popen(
|
||||||
[sys.executable, 'youtube_dlc/__main__.py', encodeArgument('ä'), '--version'],
|
[sys.executable, 'yt_dlp/__main__.py', encodeArgument('ä'), '--version'],
|
||||||
cwd=rootDir, stdout=_DEV_NULL, stderr=subprocess.PIPE)
|
cwd=rootDir, stdout=_DEV_NULL, stderr=subprocess.PIPE)
|
||||||
_, stderr = p.communicate()
|
_, stderr = p.communicate()
|
||||||
self.assertFalse(stderr)
|
self.assertFalse(stderr)
|
||||||
|
|
||||||
|
def test_lazy_extractors(self):
|
||||||
|
try:
|
||||||
|
subprocess.check_call([sys.executable, 'devscripts/make_lazy_extractors.py', 'yt_dlp/extractor/lazy_extractors.py'], cwd=rootDir, stdout=_DEV_NULL)
|
||||||
|
subprocess.check_call([sys.executable, 'test/test_all_urls.py'], cwd=rootDir, stdout=_DEV_NULL)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
os.remove('yt_dlp/extractor/lazy_extractors.py')
|
||||||
|
except (IOError, OSError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ 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 http_server_port
|
from test.helper import http_server_port
|
||||||
from youtube_dlc import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from youtube_dlc.compat import compat_http_server, compat_urllib_request
|
from yt_dlp.compat import compat_http_server, compat_urllib_request
|
||||||
import ssl
|
import ssl
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ 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
|
||||||
from youtube_dlc.extractor import IqiyiIE
|
from yt_dlp.extractor import IqiyiIE
|
||||||
|
|
||||||
|
|
||||||
class IqiyiIEWithCredentials(IqiyiIE):
|
class IqiyiIEWithCredentials(IqiyiIE):
|
||||||
|
|||||||
@@ -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 youtube_dlc.jsinterp import JSInterpreter
|
from yt_dlp.jsinterp import JSInterpreter
|
||||||
|
|
||||||
|
|
||||||
class TestJSInterpreter(unittest.TestCase):
|
class TestJSInterpreter(unittest.TestCase):
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ 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 youtube_dlc.extractor import (
|
from yt_dlp.extractor import (
|
||||||
gen_extractors,
|
gen_extractors,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 youtube_dlc.options import _hide_login_info
|
from yt_dlp.options import _hide_login_info
|
||||||
|
|
||||||
|
|
||||||
class TestOptions(unittest.TestCase):
|
class TestOptions(unittest.TestCase):
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class TestOverwrites(unittest.TestCase):
|
|||||||
def test_default_overwrites(self):
|
def test_default_overwrites(self):
|
||||||
outp = subprocess.Popen(
|
outp = subprocess.Popen(
|
||||||
[
|
[
|
||||||
sys.executable, 'youtube_dlc/__main__.py',
|
sys.executable, 'yt_dlp/__main__.py',
|
||||||
'-o', 'test.webm',
|
'-o', 'test.webm',
|
||||||
'https://www.youtube.com/watch?v=jNQXAC9IVRw'
|
'https://www.youtube.com/watch?v=jNQXAC9IVRw'
|
||||||
], cwd=root_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
], cwd=root_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
@@ -35,7 +35,7 @@ class TestOverwrites(unittest.TestCase):
|
|||||||
def test_yes_overwrites(self):
|
def test_yes_overwrites(self):
|
||||||
outp = subprocess.Popen(
|
outp = subprocess.Popen(
|
||||||
[
|
[
|
||||||
sys.executable, 'youtube_dlc/__main__.py', '--yes-overwrites',
|
sys.executable, 'yt_dlp/__main__.py', '--yes-overwrites',
|
||||||
'-o', 'test.webm',
|
'-o', 'test.webm',
|
||||||
'https://www.youtube.com/watch?v=jNQXAC9IVRw'
|
'https://www.youtube.com/watch?v=jNQXAC9IVRw'
|
||||||
], cwd=root_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
], cwd=root_dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ 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
|
||||||
import youtube_dlc.YoutubeDL
|
import yt_dlp.YoutubeDL
|
||||||
from youtube_dlc.utils import DownloadError
|
from yt_dlp.utils import DownloadError
|
||||||
|
|
||||||
|
|
||||||
class YoutubeDL(youtube_dlc.YoutubeDL):
|
class YoutubeDL(yt_dlp.YoutubeDL):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(YoutubeDL, self).__init__(*args, **kwargs)
|
super(YoutubeDL, self).__init__(*args, **kwargs)
|
||||||
self.to_stderr = self.to_screen
|
self.to_stderr = self.to_screen
|
||||||
|
|||||||
@@ -8,16 +8,50 @@ 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 youtube_dlc.postprocessor import MetadataFromFieldPP, MetadataFromTitlePP
|
from yt_dlp.postprocessor import (
|
||||||
|
FFmpegThumbnailsConvertorPP,
|
||||||
|
MetadataFromFieldPP,
|
||||||
|
MetadataFromTitlePP,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestMetadataFromField(unittest.TestCase):
|
class TestMetadataFromField(unittest.TestCase):
|
||||||
def test_format_to_regex(self):
|
def test_format_to_regex(self):
|
||||||
pp = MetadataFromFieldPP(None, ['title:%(title)s - %(artist)s'])
|
pp = MetadataFromFieldPP(None, ['title:%(title)s - %(artist)s'])
|
||||||
self.assertEqual(pp._data[0]['regex'], r'(?P<title>[^\r\n]+)\ \-\ (?P<artist>[^\r\n]+)')
|
self.assertEqual(pp._data[0]['regex'], r'(?P<title>.+)\ \-\ (?P<artist>.+)')
|
||||||
|
|
||||||
|
def test_field_to_outtmpl(self):
|
||||||
|
pp = MetadataFromFieldPP(None, ['title:%(title)s : %(artist)s'])
|
||||||
|
self.assertEqual(pp._data[0]['tmpl'], '%(title)s')
|
||||||
|
|
||||||
|
def test_in_out_seperation(self):
|
||||||
|
pp = MetadataFromFieldPP(None, ['%(title)s \\: %(artist)s:%(title)s : %(artist)s'])
|
||||||
|
self.assertEqual(pp._data[0]['in'], '%(title)s : %(artist)s')
|
||||||
|
self.assertEqual(pp._data[0]['out'], '%(title)s : %(artist)s')
|
||||||
|
|
||||||
|
|
||||||
class TestMetadataFromTitle(unittest.TestCase):
|
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>[^\r\n]+)\ \-\ (?P<artist>[^\r\n]+)')
|
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))
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from test.helper import (
|
|||||||
FakeYDL,
|
FakeYDL,
|
||||||
get_params,
|
get_params,
|
||||||
)
|
)
|
||||||
from youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_str,
|
compat_str,
|
||||||
compat_urllib_request,
|
compat_urllib_request,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ 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
|
||||||
|
|
||||||
|
|
||||||
from youtube_dlc.extractor import (
|
from yt_dlp.extractor import (
|
||||||
YoutubeIE,
|
YoutubeIE,
|
||||||
DailymotionIE,
|
DailymotionIE,
|
||||||
TEDIE,
|
TEDIE,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import json
|
|||||||
import re
|
import re
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from youtube_dlc.swfinterp import SWFInterpreter
|
from yt_dlp.swfinterp import SWFInterpreter
|
||||||
|
|
||||||
|
|
||||||
TEST_DIR = os.path.join(
|
TEST_DIR = os.path.join(
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
|
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from youtube_dlc.update import rsa_verify
|
from yt_dlp.update import rsa_verify
|
||||||
|
|
||||||
|
|
||||||
class TestUpdate(unittest.TestCase):
|
class TestUpdate(unittest.TestCase):
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import io
|
|||||||
import json
|
import json
|
||||||
import xml.etree.ElementTree
|
import xml.etree.ElementTree
|
||||||
|
|
||||||
from youtube_dlc.utils import (
|
from yt_dlp.utils import (
|
||||||
age_restricted,
|
age_restricted,
|
||||||
args_to_str,
|
args_to_str,
|
||||||
encode_base_n,
|
encode_base_n,
|
||||||
@@ -23,6 +23,7 @@ from youtube_dlc.utils import (
|
|||||||
clean_html,
|
clean_html,
|
||||||
clean_podcast_url,
|
clean_podcast_url,
|
||||||
date_from_str,
|
date_from_str,
|
||||||
|
datetime_from_str,
|
||||||
DateRange,
|
DateRange,
|
||||||
detect_exe_version,
|
detect_exe_version,
|
||||||
determine_ext,
|
determine_ext,
|
||||||
@@ -65,6 +66,7 @@ from youtube_dlc.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,7 +109,7 @@ from youtube_dlc.utils import (
|
|||||||
parse_codecs,
|
parse_codecs,
|
||||||
iri_to_uri,
|
iri_to_uri,
|
||||||
)
|
)
|
||||||
from youtube_dlc.compat import (
|
from yt_dlp.compat import (
|
||||||
compat_chr,
|
compat_chr,
|
||||||
compat_etree_fromstring,
|
compat_etree_fromstring,
|
||||||
compat_getenv,
|
compat_getenv,
|
||||||
@@ -237,17 +239,27 @@ 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):
|
||||||
return '%{0}%'.format(var) if sys.platform == 'win32' else '${0}'.format(var)
|
return '%{0}%'.format(var) if sys.platform == 'win32' else '${0}'.format(var)
|
||||||
|
|
||||||
compat_setenv('youtube_dlc_EXPATH_PATH', 'expanded')
|
compat_setenv('yt_dlp_EXPATH_PATH', 'expanded')
|
||||||
self.assertEqual(expand_path(env('youtube_dlc_EXPATH_PATH')), 'expanded')
|
self.assertEqual(expand_path(env('yt_dlp_EXPATH_PATH')), 'expanded')
|
||||||
self.assertEqual(expand_path(env('HOME')), compat_getenv('HOME'))
|
self.assertEqual(expand_path(env('HOME')), compat_getenv('HOME'))
|
||||||
self.assertEqual(expand_path('~'), compat_getenv('HOME'))
|
self.assertEqual(expand_path('~'), compat_getenv('HOME'))
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
expand_path('~/%s' % env('youtube_dlc_EXPATH_PATH')),
|
expand_path('~/%s' % env('yt_dlp_EXPATH_PATH')),
|
||||||
'%s/expanded' % compat_getenv('HOME'))
|
'%s/expanded' % compat_getenv('HOME'))
|
||||||
|
|
||||||
def test_prepend_extension(self):
|
def test_prepend_extension(self):
|
||||||
@@ -311,8 +323,18 @@ class TestUtil(unittest.TestCase):
|
|||||||
self.assertEqual(date_from_str('yesterday'), date_from_str('now-1day'))
|
self.assertEqual(date_from_str('yesterday'), date_from_str('now-1day'))
|
||||||
self.assertEqual(date_from_str('now+7day'), date_from_str('now+1week'))
|
self.assertEqual(date_from_str('now+7day'), date_from_str('now+1week'))
|
||||||
self.assertEqual(date_from_str('now+14day'), date_from_str('now+2week'))
|
self.assertEqual(date_from_str('now+14day'), date_from_str('now+2week'))
|
||||||
self.assertEqual(date_from_str('now+365day'), date_from_str('now+1year'))
|
self.assertEqual(date_from_str('20200229+365day'), date_from_str('20200229+1year'))
|
||||||
self.assertEqual(date_from_str('now+30day'), date_from_str('now+1month'))
|
self.assertEqual(date_from_str('20210131+28day'), date_from_str('20210131+1month'))
|
||||||
|
|
||||||
|
def test_datetime_from_str(self):
|
||||||
|
self.assertEqual(datetime_from_str('yesterday', precision='day'), datetime_from_str('now-1day', precision='auto'))
|
||||||
|
self.assertEqual(datetime_from_str('now+7day', precision='day'), datetime_from_str('now+1week', precision='auto'))
|
||||||
|
self.assertEqual(datetime_from_str('now+14day', precision='day'), datetime_from_str('now+2week', precision='auto'))
|
||||||
|
self.assertEqual(datetime_from_str('20200229+365day', precision='day'), datetime_from_str('20200229+1year', precision='auto'))
|
||||||
|
self.assertEqual(datetime_from_str('20210131+28day', precision='day'), datetime_from_str('20210131+1month', precision='auto'))
|
||||||
|
self.assertEqual(datetime_from_str('20210131+59day', precision='day'), datetime_from_str('20210131+2month', precision='auto'))
|
||||||
|
self.assertEqual(datetime_from_str('now+1day', precision='hour'), datetime_from_str('now+24hours', precision='auto'))
|
||||||
|
self.assertEqual(datetime_from_str('now+23hours', precision='hour'), datetime_from_str('now+23hours', precision='auto'))
|
||||||
|
|
||||||
def test_daterange(self):
|
def test_daterange(self):
|
||||||
_20century = DateRange("19000101", "20000101")
|
_20century = DateRange("19000101", "20000101")
|
||||||
@@ -1425,8 +1447,8 @@ Line 1
|
|||||||
self.assertEqual(caesar('ebg', 'acegik', -2), 'abc')
|
self.assertEqual(caesar('ebg', 'acegik', -2), 'abc')
|
||||||
|
|
||||||
def test_rot47(self):
|
def test_rot47(self):
|
||||||
self.assertEqual(rot47('youtube-dlc'), r'J@FEF36\5=4')
|
self.assertEqual(rot47('yt-dlp'), r'JE\5=A')
|
||||||
self.assertEqual(rot47('YOUTUBE-DLC'), r'*~&%&qt\s{r')
|
self.assertEqual(rot47('YT-DLP'), r'*%\s{!')
|
||||||
|
|
||||||
def test_urshift(self):
|
def test_urshift(self):
|
||||||
self.assertEqual(urshift(3, 1), 1)
|
self.assertEqual(urshift(3, 1), 1)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class TestVerboseOutput(unittest.TestCase):
|
|||||||
def test_private_info_arg(self):
|
def test_private_info_arg(self):
|
||||||
outp = subprocess.Popen(
|
outp = subprocess.Popen(
|
||||||
[
|
[
|
||||||
sys.executable, 'youtube_dlc/__main__.py', '-v',
|
sys.executable, 'yt_dlp/__main__.py', '-v',
|
||||||
'--username', 'johnsmith@gmail.com',
|
'--username', 'johnsmith@gmail.com',
|
||||||
'--password', 'secret',
|
'--password', 'secret',
|
||||||
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
@@ -30,7 +30,7 @@ class TestVerboseOutput(unittest.TestCase):
|
|||||||
def test_private_info_shortarg(self):
|
def test_private_info_shortarg(self):
|
||||||
outp = subprocess.Popen(
|
outp = subprocess.Popen(
|
||||||
[
|
[
|
||||||
sys.executable, 'youtube_dlc/__main__.py', '-v',
|
sys.executable, 'yt_dlp/__main__.py', '-v',
|
||||||
'-u', 'johnsmith@gmail.com',
|
'-u', 'johnsmith@gmail.com',
|
||||||
'-p', 'secret',
|
'-p', 'secret',
|
||||||
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
@@ -43,7 +43,7 @@ class TestVerboseOutput(unittest.TestCase):
|
|||||||
def test_private_info_eq(self):
|
def test_private_info_eq(self):
|
||||||
outp = subprocess.Popen(
|
outp = subprocess.Popen(
|
||||||
[
|
[
|
||||||
sys.executable, 'youtube_dlc/__main__.py', '-v',
|
sys.executable, 'yt_dlp/__main__.py', '-v',
|
||||||
'--username=johnsmith@gmail.com',
|
'--username=johnsmith@gmail.com',
|
||||||
'--password=secret',
|
'--password=secret',
|
||||||
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
@@ -56,7 +56,7 @@ class TestVerboseOutput(unittest.TestCase):
|
|||||||
def test_private_info_shortarg_eq(self):
|
def test_private_info_shortarg_eq(self):
|
||||||
outp = subprocess.Popen(
|
outp = subprocess.Popen(
|
||||||
[
|
[
|
||||||
sys.executable, 'youtube_dlc/__main__.py', '-v',
|
sys.executable, 'yt_dlp/__main__.py', '-v',
|
||||||
'-u=johnsmith@gmail.com',
|
'-u=johnsmith@gmail.com',
|
||||||
'-p=secret',
|
'-p=secret',
|
||||||
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
], cwd=rootDir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ import io
|
|||||||
|
|
||||||
import xml.etree.ElementTree
|
import xml.etree.ElementTree
|
||||||
|
|
||||||
import youtube_dlc.YoutubeDL
|
import yt_dlp.YoutubeDL
|
||||||
import youtube_dlc.extractor
|
import yt_dlp.extractor
|
||||||
|
|
||||||
|
|
||||||
class YoutubeDL(youtube_dlc.YoutubeDL):
|
class YoutubeDL(yt_dlp.YoutubeDL):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(YoutubeDL, self).__init__(*args, **kwargs)
|
super(YoutubeDL, self).__init__(*args, **kwargs)
|
||||||
self.to_stderr = self.to_screen
|
self.to_stderr = self.to_screen
|
||||||
@@ -45,7 +45,7 @@ class TestAnnotations(unittest.TestCase):
|
|||||||
|
|
||||||
def test_info_json(self):
|
def test_info_json(self):
|
||||||
expected = list(EXPECTED_ANNOTATIONS) # Two annotations could have the same text.
|
expected = list(EXPECTED_ANNOTATIONS) # Two annotations could have the same text.
|
||||||
ie = youtube_dlc.extractor.YoutubeIE()
|
ie = yt_dlp.extractor.YoutubeIE()
|
||||||
ydl = YoutubeDL(params)
|
ydl = YoutubeDL(params)
|
||||||
ydl.add_info_extractor(ie)
|
ydl.add_info_extractor(ie)
|
||||||
ydl.download([TEST_ID])
|
ydl.download([TEST_ID])
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|||||||
from test.helper import FakeYDL
|
from test.helper import FakeYDL
|
||||||
|
|
||||||
|
|
||||||
from youtube_dlc.extractor import (
|
from yt_dlp.extractor import (
|
||||||
YoutubePlaylistIE,
|
YoutubePlaylistIE,
|
||||||
YoutubeTabIE,
|
YoutubeTabIE,
|
||||||
YoutubeIE,
|
YoutubeIE,
|
||||||
|
|||||||
26
test/test_youtube_misc.py
Normal file
26
test/test_youtube_misc.py
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
# Allow direct execution
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
|
|
||||||
|
from yt_dlp.extractor import YoutubeIE
|
||||||
|
|
||||||
|
|
||||||
|
class TestYoutubeMisc(unittest.TestCase):
|
||||||
|
def test_youtube_extract(self):
|
||||||
|
assertExtractId = lambda url, id: self.assertEqual(YoutubeIE.extract_id(url), id)
|
||||||
|
assertExtractId('http://www.youtube.com/watch?&v=BaW_jenozKc', 'BaW_jenozKc')
|
||||||
|
assertExtractId('https://www.youtube.com/watch?&v=BaW_jenozKc', 'BaW_jenozKc')
|
||||||
|
assertExtractId('https://www.youtube.com/watch?feature=player_embedded&v=BaW_jenozKc', 'BaW_jenozKc')
|
||||||
|
assertExtractId('https://www.youtube.com/watch_popup?v=BaW_jenozKc', 'BaW_jenozKc')
|
||||||
|
assertExtractId('http://www.youtube.com/watch?v=BaW_jenozKcsharePLED17F32AD9753930', 'BaW_jenozKc')
|
||||||
|
assertExtractId('BaW_jenozKc', 'BaW_jenozKc')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
@@ -13,8 +13,8 @@ import re
|
|||||||
import string
|
import string
|
||||||
|
|
||||||
from test.helper import FakeYDL
|
from test.helper import FakeYDL
|
||||||
from youtube_dlc.extractor import YoutubeIE
|
from yt_dlp.extractor import YoutubeIE
|
||||||
from youtube_dlc.compat import compat_str, compat_urlretrieve
|
from yt_dlp.compat import compat_str, compat_urlretrieve
|
||||||
|
|
||||||
_TESTS = [
|
_TESTS = [
|
||||||
(
|
(
|
||||||
|
|||||||
988
test/testdata/ism/sintel.Manifest
vendored
Normal file
988
test/testdata/ism/sintel.Manifest
vendored
Normal file
@@ -0,0 +1,988 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Created with Unified Streaming Platform (version=1.10.18-20255) -->
|
||||||
|
<SmoothStreamingMedia
|
||||||
|
MajorVersion="2"
|
||||||
|
MinorVersion="0"
|
||||||
|
TimeScale="10000000"
|
||||||
|
Duration="8880746666">
|
||||||
|
<StreamIndex
|
||||||
|
Type="audio"
|
||||||
|
QualityLevels="1"
|
||||||
|
TimeScale="10000000"
|
||||||
|
Name="audio"
|
||||||
|
Chunks="445"
|
||||||
|
Url="QualityLevels({bitrate})/Fragments(audio={start time})">
|
||||||
|
<QualityLevel
|
||||||
|
Index="0"
|
||||||
|
Bitrate="128001"
|
||||||
|
CodecPrivateData="1190"
|
||||||
|
SamplingRate="48000"
|
||||||
|
Channels="2"
|
||||||
|
BitsPerSample="16"
|
||||||
|
PacketSize="4"
|
||||||
|
AudioTag="255"
|
||||||
|
FourCC="AACL" />
|
||||||
|
<c t="0" d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053333" />
|
||||||
|
<c d="20053334" />
|
||||||
|
<c d="19840000" />
|
||||||
|
<c d="746666" />
|
||||||
|
</StreamIndex>
|
||||||
|
<StreamIndex
|
||||||
|
Type="text"
|
||||||
|
QualityLevels="1"
|
||||||
|
TimeScale="10000000"
|
||||||
|
Language="eng"
|
||||||
|
Subtype="CAPT"
|
||||||
|
Name="textstream_eng"
|
||||||
|
Chunks="11"
|
||||||
|
Url="QualityLevels({bitrate})/Fragments(textstream_eng={start time})">
|
||||||
|
<QualityLevel
|
||||||
|
Index="0"
|
||||||
|
Bitrate="1000"
|
||||||
|
CodecPrivateData=""
|
||||||
|
FourCC="TTML" />
|
||||||
|
<c t="0" d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="600000000" />
|
||||||
|
<c d="240000000" />
|
||||||
|
</StreamIndex>
|
||||||
|
<StreamIndex
|
||||||
|
Type="video"
|
||||||
|
QualityLevels="5"
|
||||||
|
TimeScale="10000000"
|
||||||
|
Name="video"
|
||||||
|
Chunks="444"
|
||||||
|
Url="QualityLevels({bitrate})/Fragments(video={start time})"
|
||||||
|
MaxWidth="1688"
|
||||||
|
MaxHeight="720"
|
||||||
|
DisplayWidth="1689"
|
||||||
|
DisplayHeight="720">
|
||||||
|
<QualityLevel
|
||||||
|
Index="0"
|
||||||
|
Bitrate="100000"
|
||||||
|
CodecPrivateData="00000001674D401FDA0544EFFC2D002CBC40000003004000000C03C60CA80000000168EF32C8"
|
||||||
|
MaxWidth="336"
|
||||||
|
MaxHeight="144"
|
||||||
|
FourCC="AVC1" />
|
||||||
|
<QualityLevel
|
||||||
|
Index="1"
|
||||||
|
Bitrate="326000"
|
||||||
|
CodecPrivateData="00000001674D401FDA0241FE23FFC3BC83BA44000003000400000300C03C60CA800000000168EF32C8"
|
||||||
|
MaxWidth="562"
|
||||||
|
MaxHeight="240"
|
||||||
|
FourCC="AVC1" />
|
||||||
|
<QualityLevel
|
||||||
|
Index="2"
|
||||||
|
Bitrate="698000"
|
||||||
|
CodecPrivateData="00000001674D401FDA0350BFB97FF06AF06AD1000003000100000300300F1832A00000000168EF32C8"
|
||||||
|
MaxWidth="844"
|
||||||
|
MaxHeight="360"
|
||||||
|
FourCC="AVC1" />
|
||||||
|
<QualityLevel
|
||||||
|
Index="3"
|
||||||
|
Bitrate="1493000"
|
||||||
|
CodecPrivateData="00000001674D401FDA011C3DE6FFF0D890D871000003000100000300300F1832A00000000168EF32C8"
|
||||||
|
MaxWidth="1126"
|
||||||
|
MaxHeight="480"
|
||||||
|
FourCC="AVC1" />
|
||||||
|
<QualityLevel
|
||||||
|
Index="4"
|
||||||
|
Bitrate="4482000"
|
||||||
|
CodecPrivateData="00000001674D401FDA01A816F97FFC1ABC1AB440000003004000000C03C60CA80000000168EF32C8"
|
||||||
|
MaxWidth="1688"
|
||||||
|
MaxHeight="720"
|
||||||
|
FourCC="AVC1" />
|
||||||
|
<c t="0" d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
<c d="20000000" />
|
||||||
|
</StreamIndex>
|
||||||
|
</SmoothStreamingMedia>
|
||||||
38
test/testdata/m3u8/bipbop_16x9.m3u8
vendored
Normal file
38
test/testdata/m3u8/bipbop_16x9.m3u8
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#EXTM3U
|
||||||
|
|
||||||
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 1",AUTOSELECT=YES,DEFAULT=YES
|
||||||
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="bipbop_audio",LANGUAGE="eng",NAME="BipBop Audio 2",AUTOSELECT=NO,DEFAULT=NO,URI="alternate_audio_aac/prog_index.m3u8"
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/eng/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English (Forced)",DEFAULT=NO,AUTOSELECT=NO,FORCED=YES,LANGUAGE="en",URI="subtitles/eng_forced/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Français",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="fr",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/fra/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Français (Forced)",DEFAULT=NO,AUTOSELECT=NO,FORCED=YES,LANGUAGE="fr",URI="subtitles/fra_forced/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Español",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="es",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/spa/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Español (Forced)",DEFAULT=NO,AUTOSELECT=NO,FORCED=YES,LANGUAGE="es",URI="subtitles/spa_forced/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="日本語",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="ja",CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog, public.accessibility.describes-music-and-sound",URI="subtitles/jpn/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="日本語 (Forced)",DEFAULT=NO,AUTOSELECT=NO,FORCED=YES,LANGUAGE="ja",URI="subtitles/jpn_forced/prog_index.m3u8"
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:BANDWIDTH=263851,CODECS="mp4a.40.2, avc1.4d400d",RESOLUTION=416x234,AUDIO="bipbop_audio",SUBTITLES="subs"
|
||||||
|
gear1/prog_index.m3u8
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=28451,CODECS="avc1.4d400d",URI="gear1/iframe_index.m3u8"
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:BANDWIDTH=577610,CODECS="mp4a.40.2, avc1.4d401e",RESOLUTION=640x360,AUDIO="bipbop_audio",SUBTITLES="subs"
|
||||||
|
gear2/prog_index.m3u8
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=181534,CODECS="avc1.4d401e",URI="gear2/iframe_index.m3u8"
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:BANDWIDTH=915905,CODECS="mp4a.40.2, avc1.4d401f",RESOLUTION=960x540,AUDIO="bipbop_audio",SUBTITLES="subs"
|
||||||
|
gear3/prog_index.m3u8
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=297056,CODECS="avc1.4d401f",URI="gear3/iframe_index.m3u8"
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:BANDWIDTH=1030138,CODECS="mp4a.40.2, avc1.4d401f",RESOLUTION=1280x720,AUDIO="bipbop_audio",SUBTITLES="subs"
|
||||||
|
gear4/prog_index.m3u8
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=339492,CODECS="avc1.4d401f",URI="gear4/iframe_index.m3u8"
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:BANDWIDTH=1924009,CODECS="mp4a.40.2, avc1.4d401f",RESOLUTION=1920x1080,AUDIO="bipbop_audio",SUBTITLES="subs"
|
||||||
|
gear5/prog_index.m3u8
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=669554,CODECS="avc1.4d401f",URI="gear5/iframe_index.m3u8"
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:BANDWIDTH=41457,CODECS="mp4a.40.2",AUDIO="bipbop_audio",SUBTITLES="subs"
|
||||||
|
gear0/prog_index.m3u8
|
||||||
76
test/testdata/m3u8/img_bipbop_adv_example_fmp4.m3u8
vendored
Normal file
76
test/testdata/m3u8/img_bipbop_adv_example_fmp4.m3u8
vendored
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
#EXTM3U
|
||||||
|
#EXT-X-VERSION:6
|
||||||
|
#EXT-X-INDEPENDENT-SEGMENTS
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=2168183,BANDWIDTH=2177116,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=960x540,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v5/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=7968416,BANDWIDTH=8001098,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v9/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=6170000,BANDWIDTH=6312875,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v8/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=4670769,BANDWIDTH=4943747,CODECS="avc1.64002a,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v7/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3168702,BANDWIDTH=3216424,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v6/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1265132,BANDWIDTH=1268994,CODECS="avc1.64001e,mp4a.40.2",RESOLUTION=768x432,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v4/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=895755,BANDWIDTH=902298,CODECS="avc1.64001e,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v3/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=530721,BANDWIDTH=541052,CODECS="avc1.640015,mp4a.40.2",RESOLUTION=480x270,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud1",SUBTITLES="sub1"
|
||||||
|
v2/prog_index.m3u8
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=2390686,BANDWIDTH=2399619,CODECS="avc1.640020,ac-3",RESOLUTION=960x540,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v5/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=8190919,BANDWIDTH=8223601,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v9/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=6392503,BANDWIDTH=6535378,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v8/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=4893272,BANDWIDTH=5166250,CODECS="avc1.64002a,ac-3",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v7/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3391205,BANDWIDTH=3438927,CODECS="avc1.640020,ac-3",RESOLUTION=1280x720,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v6/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1487635,BANDWIDTH=1491497,CODECS="avc1.64001e,ac-3",RESOLUTION=768x432,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v4/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1118258,BANDWIDTH=1124801,CODECS="avc1.64001e,ac-3",RESOLUTION=640x360,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v3/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=753224,BANDWIDTH=763555,CODECS="avc1.640015,ac-3",RESOLUTION=480x270,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud2",SUBTITLES="sub1"
|
||||||
|
v2/prog_index.m3u8
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=2198686,BANDWIDTH=2207619,CODECS="avc1.640020,ec-3",RESOLUTION=960x540,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v5/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=7998919,BANDWIDTH=8031601,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v9/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=6200503,BANDWIDTH=6343378,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v8/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=4701272,BANDWIDTH=4974250,CODECS="avc1.64002a,ec-3",RESOLUTION=1920x1080,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v7/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=3199205,BANDWIDTH=3246927,CODECS="avc1.640020,ec-3",RESOLUTION=1280x720,FRAME-RATE=60.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v6/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=1295635,BANDWIDTH=1299497,CODECS="avc1.64001e,ec-3",RESOLUTION=768x432,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v4/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=926258,BANDWIDTH=932801,CODECS="avc1.64001e,ec-3",RESOLUTION=640x360,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v3/prog_index.m3u8
|
||||||
|
#EXT-X-STREAM-INF:AVERAGE-BANDWIDTH=561224,BANDWIDTH=571555,CODECS="avc1.640015,ec-3",RESOLUTION=480x270,FRAME-RATE=30.000,CLOSED-CAPTIONS="cc1",AUDIO="aud3",SUBTITLES="sub1"
|
||||||
|
v2/prog_index.m3u8
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=183689,BANDWIDTH=187492,CODECS="avc1.64002a",RESOLUTION=1920x1080,URI="v7/iframe_index.m3u8"
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=132672,BANDWIDTH=136398,CODECS="avc1.640020",RESOLUTION=1280x720,URI="v6/iframe_index.m3u8"
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=97767,BANDWIDTH=101378,CODECS="avc1.640020",RESOLUTION=960x540,URI="v5/iframe_index.m3u8"
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=75722,BANDWIDTH=77818,CODECS="avc1.64001e",RESOLUTION=768x432,URI="v4/iframe_index.m3u8"
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=63522,BANDWIDTH=65091,CODECS="avc1.64001e",RESOLUTION=640x360,URI="v3/iframe_index.m3u8"
|
||||||
|
#EXT-X-I-FRAME-STREAM-INF:AVERAGE-BANDWIDTH=39678,BANDWIDTH=40282,CODECS="avc1.640015",RESOLUTION=480x270,URI="v2/iframe_index.m3u8"
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud1",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="2",URI="a1/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud2",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="6",URI="a2/prog_index.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud3",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="6",URI="a3/prog_index.m3u8"
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS,GROUP-ID="cc1",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,INSTREAM-ID="CC1"
|
||||||
|
|
||||||
|
|
||||||
|
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub1",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,FORCED=NO,URI="s1/en/prog_index.m3u8"
|
||||||
14
test/testdata/m3u8/pluzz_francetv_11507.m3u8
vendored
14
test/testdata/m3u8/pluzz_francetv_11507.m3u8
vendored
@@ -1,14 +0,0 @@
|
|||||||
#EXTM3U
|
|
||||||
|
|
||||||
#EXT-X-VERSION:5
|
|
||||||
|
|
||||||
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Francais",DEFAULT=NO,FORCED=NO,URI="http://replayftv-pmd.francetv.fr/subtitles/2017/16/156589847-1492488987.m3u8",LANGUAGE="fra"
|
|
||||||
|
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="fra",NAME="Francais",DEFAULT=YES, AUTOSELECT=YES
|
|
||||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=180000,RESOLUTION=256x144,CODECS="avc1.66.30, mp4a.40.2"
|
|
||||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_0_av.m3u8?null=0
|
|
||||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=303000,RESOLUTION=320x180,CODECS="avc1.66.30, mp4a.40.2"
|
|
||||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_1_av.m3u8?null=0
|
|
||||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=575000,RESOLUTION=512x288,CODECS="avc1.66.30, mp4a.40.2"
|
|
||||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_2_av.m3u8?null=0
|
|
||||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=831000,RESOLUTION=704x396,CODECS="avc1.77.30, mp4a.40.2"
|
|
||||||
16
test/testdata/m3u8/teamcoco_11995.m3u8
vendored
16
test/testdata/m3u8/teamcoco_11995.m3u8
vendored
@@ -1,16 +0,0 @@
|
|||||||
#EXTM3U
|
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-0",NAME="Default",AUTOSELECT=YES,DEFAULT=YES,URI="hls/CONAN_020217_Highlight_show-audio-160k_v4.m3u8"
|
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-1",NAME="Default",AUTOSELECT=YES,DEFAULT=YES,URI="hls/CONAN_020217_Highlight_show-audio-64k_v4.m3u8"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=37862000,CODECS="avc1.4d001f",URI="hls/CONAN_020217_Highlight_show-2m_iframe.m3u8"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=18750000,CODECS="avc1.4d001e",URI="hls/CONAN_020217_Highlight_show-1m_iframe.m3u8"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=6535000,CODECS="avc1.42001e",URI="hls/CONAN_020217_Highlight_show-400k_iframe.m3u8"
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2374000,RESOLUTION=1024x576,CODECS="avc1.4d001f,mp4a.40.2",AUDIO="audio-0"
|
|
||||||
hls/CONAN_020217_Highlight_show-2m_v4.m3u8
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1205000,RESOLUTION=640x360,CODECS="avc1.4d001e,mp4a.40.2",AUDIO="audio-0"
|
|
||||||
hls/CONAN_020217_Highlight_show-1m_v4.m3u8
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=522000,RESOLUTION=400x224,CODECS="avc1.42001e,mp4a.40.2",AUDIO="audio-0"
|
|
||||||
hls/CONAN_020217_Highlight_show-400k_v4.m3u8
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=413000,RESOLUTION=400x224,CODECS="avc1.42001e,mp4a.40.5",AUDIO="audio-1"
|
|
||||||
hls/CONAN_020217_Highlight_show-400k_v4.m3u8
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=71000,CODECS="mp4a.40.5",AUDIO="audio-1"
|
|
||||||
hls/CONAN_020217_Highlight_show-audio-64k_v4.m3u8
|
|
||||||
28
test/testdata/m3u8/ted_18923.m3u8
vendored
28
test/testdata/m3u8/ted_18923.m3u8
vendored
@@ -1,28 +0,0 @@
|
|||||||
#EXTM3U
|
|
||||||
#EXT-X-VERSION:4
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=1255659,PROGRAM-ID=1,CODECS="avc1.42c01e,mp4a.40.2",RESOLUTION=640x360
|
|
||||||
/videos/BorisHesser_2018S/video/600k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=163154,PROGRAM-ID=1,CODECS="avc1.42c00c,mp4a.40.2",RESOLUTION=320x180
|
|
||||||
/videos/BorisHesser_2018S/video/64k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=481701,PROGRAM-ID=1,CODECS="avc1.42c015,mp4a.40.2",RESOLUTION=512x288
|
|
||||||
/videos/BorisHesser_2018S/video/180k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=769968,PROGRAM-ID=1,CODECS="avc1.42c015,mp4a.40.2",RESOLUTION=512x288
|
|
||||||
/videos/BorisHesser_2018S/video/320k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=984037,PROGRAM-ID=1,CODECS="avc1.42c015,mp4a.40.2",RESOLUTION=512x288
|
|
||||||
/videos/BorisHesser_2018S/video/450k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=1693925,PROGRAM-ID=1,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=853x480
|
|
||||||
/videos/BorisHesser_2018S/video/950k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=2462469,PROGRAM-ID=1,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1280x720
|
|
||||||
/videos/BorisHesser_2018S/video/1500k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
#EXT-X-STREAM-INF:AUDIO="600k",BANDWIDTH=68101,PROGRAM-ID=1,CODECS="mp4a.40.2",DEFAULT=YES
|
|
||||||
/videos/BorisHesser_2018S/audio/600k.m3u8?nobumpers=true&uniqueId=76011e2b
|
|
||||||
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=74298,PROGRAM-ID=1,CODECS="avc1.42c00c",RESOLUTION=320x180,URI="/videos/BorisHesser_2018S/video/64k_iframe.m3u8?nobumpers=true&uniqueId=76011e2b"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=216200,PROGRAM-ID=1,CODECS="avc1.42c015",RESOLUTION=512x288,URI="/videos/BorisHesser_2018S/video/180k_iframe.m3u8?nobumpers=true&uniqueId=76011e2b"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=304717,PROGRAM-ID=1,CODECS="avc1.42c015",RESOLUTION=512x288,URI="/videos/BorisHesser_2018S/video/320k_iframe.m3u8?nobumpers=true&uniqueId=76011e2b"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=350933,PROGRAM-ID=1,CODECS="avc1.42c015",RESOLUTION=512x288,URI="/videos/BorisHesser_2018S/video/450k_iframe.m3u8?nobumpers=true&uniqueId=76011e2b"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=495850,PROGRAM-ID=1,CODECS="avc1.42c01e",RESOLUTION=640x360,URI="/videos/BorisHesser_2018S/video/600k_iframe.m3u8?nobumpers=true&uniqueId=76011e2b"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=810750,PROGRAM-ID=1,CODECS="avc1.4d401f",RESOLUTION=853x480,URI="/videos/BorisHesser_2018S/video/950k_iframe.m3u8?nobumpers=true&uniqueId=76011e2b"
|
|
||||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1273700,PROGRAM-ID=1,CODECS="avc1.640028",RESOLUTION=1280x720,URI="/videos/BorisHesser_2018S/video/1500k_iframe.m3u8?nobumpers=true&uniqueId=76011e2b"
|
|
||||||
|
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="600k",LANGUAGE="en",NAME="Audio",AUTOSELECT=YES,DEFAULT=YES,URI="/videos/BorisHesser_2018S/audio/600k.m3u8?nobumpers=true&uniqueId=76011e2b",BANDWIDTH=614400
|
|
||||||
13
test/testdata/m3u8/toggle_mobile_12211.m3u8
vendored
13
test/testdata/m3u8/toggle_mobile_12211.m3u8
vendored
@@ -1,13 +0,0 @@
|
|||||||
#EXTM3U
|
|
||||||
#EXT-X-VERSION:4
|
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="eng",NAME="English",URI="http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_sa2ntrdg/name/a.mp4/index.m3u8"
|
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="und",NAME="Undefined",URI="http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_r7y0nitg/name/a.mp4/index.m3u8"
|
|
||||||
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=155648,RESOLUTION=320x180,AUDIO="audio"
|
|
||||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_qlk9hlzr/name/a.mp4/index.m3u8
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=502784,RESOLUTION=480x270,AUDIO="audio"
|
|
||||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_oefackmi/name/a.mp4/index.m3u8
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=827392,RESOLUTION=640x360,AUDIO="audio"
|
|
||||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/12/pv/1/flavorId/0_vyg9pj7k/name/a.mp4/index.m3u8
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1396736,RESOLUTION=854x480,AUDIO="audio"
|
|
||||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/12/pv/1/flavorId/0_50n4psvx/name/a.mp4/index.m3u8
|
|
||||||
20
test/testdata/m3u8/twitch_vod.m3u8
vendored
20
test/testdata/m3u8/twitch_vod.m3u8
vendored
@@ -1,20 +0,0 @@
|
|||||||
#EXTM3U
|
|
||||||
#EXT-X-TWITCH-INFO:ORIGIN="s3",CLUSTER="edgecast_vod",REGION="EU",MANIFEST-CLUSTER="edgecast_vod",USER-IP="109.171.17.81"
|
|
||||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="chunked",NAME="Source",AUTOSELECT=YES,DEFAULT=YES
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3214134,CODECS="avc1.100.31,mp4a.40.2",RESOLUTION="1280x720",VIDEO="chunked"
|
|
||||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/chunked/index-muted-HM49I092CC.m3u8
|
|
||||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="high",NAME="High",AUTOSELECT=YES,DEFAULT=YES
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1603789,CODECS="avc1.42C01F,mp4a.40.2",RESOLUTION="1280x720",VIDEO="high"
|
|
||||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/high/index-muted-HM49I092CC.m3u8
|
|
||||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="medium",NAME="Medium",AUTOSELECT=YES,DEFAULT=YES
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=893387,CODECS="avc1.42C01E,mp4a.40.2",RESOLUTION="852x480",VIDEO="medium"
|
|
||||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/medium/index-muted-HM49I092CC.m3u8
|
|
||||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Low",AUTOSELECT=YES,DEFAULT=YES
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=628347,CODECS="avc1.42C01E,mp4a.40.2",RESOLUTION="640x360",VIDEO="low"
|
|
||||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/low/index-muted-HM49I092CC.m3u8
|
|
||||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mobile",NAME="Mobile",AUTOSELECT=YES,DEFAULT=YES
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=280474,CODECS="avc1.42C00D,mp4a.40.2",RESOLUTION="400x226",VIDEO="mobile"
|
|
||||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/mobile/index-muted-HM49I092CC.m3u8
|
|
||||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="audio_only",NAME="Audio Only",AUTOSELECT=NO,DEFAULT=NO
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=182725,CODECS="mp4a.40.2",VIDEO="audio_only"
|
|
||||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/audio_only/index-muted-HM49I092CC.m3u8
|
|
||||||
10
test/testdata/m3u8/vidio.m3u8
vendored
10
test/testdata/m3u8/vidio.m3u8
vendored
@@ -1,10 +0,0 @@
|
|||||||
#EXTM3U
|
|
||||||
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=300000,RESOLUTION=480x270,NAME="270p 3G"
|
|
||||||
https://cdn1-a.production.vidio.static6.com/uploads/165683/dj_ambred-4383-b300.mp4.m3u8
|
|
||||||
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=600000,RESOLUTION=640x360,NAME="360p SD"
|
|
||||||
https://cdn1-a.production.vidio.static6.com/uploads/165683/dj_ambred-4383-b600.mp4.m3u8
|
|
||||||
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1200000,RESOLUTION=1280x720,NAME="720p HD"
|
|
||||||
https://cdn1-a.production.vidio.static6.com/uploads/165683/dj_ambred-4383-b1200.mp4.m3u8
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user