From e44fd88c03a947afda685deec901bd5f865559f0 Mon Sep 17 00:00:00 2001 From: Heidel Date: Mon, 26 Jul 2021 04:36:01 +0200 Subject: [PATCH] Revert "Merge remote-tracking branch 'pukkandan/master' into merge-main" This reverts commit 59e6446261f2eba5fd04350edfd5453cb9e28d39. --- .gitattributes | 4 - .github/ISSUE_TEMPLATE/1_broken_site.md | 24 +- .../ISSUE_TEMPLATE/2_site_support_request.md | 12 +- .../ISSUE_TEMPLATE/3_site_feature_request.md | 12 +- .github/ISSUE_TEMPLATE/4_bug_report.md | 28 +- .github/ISSUE_TEMPLATE/5_feature_request.md | 12 +- .github/ISSUE_TEMPLATE/6_question.md | 10 +- .github/ISSUE_TEMPLATE_tmpl/1_broken_site.md | 29 +- .../2_site_support_request.md | 18 +- .../3_site_feature_request.md | 15 +- .github/ISSUE_TEMPLATE_tmpl/4_bug_report.md | 29 +- .../ISSUE_TEMPLATE_tmpl/5_feature_request.md | 16 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/build.yml | 178 +- .github/workflows/core.yml | 31 - .github/workflows/download.yml | 28 - .github/workflows/python-publish.yml.disable | 33 + .github/workflows/quick-test.yml | 31 - .gitignore | 120 +- .readthedocs.yml | 22 - .travis.yml | 38 + AUTHORS | 248 + CONTRIBUTING.md | 7 +- CONTRIBUTORS | 65 - ChangeLog | 5294 +++++++++++++++++ Changelog.md | 852 --- MANIFEST.in | 14 +- Makefile | 148 +- README.md | 1322 ++-- devscripts/bash-completion.in | 4 +- devscripts/bash-completion.py | 8 +- devscripts/buildserver.py | 6 +- devscripts/check-porn.py | 6 +- devscripts/create-github-release.py | 10 +- devscripts/fish-completion.in | 2 +- devscripts/fish-completion.py | 12 +- devscripts/generate_aes_testdata.py | 5 +- .../add-version.py | 6 +- .../generate-download.py | 0 .../sign-versions.py | 0 .../update-copyright.py | 2 +- .../update-feed.py | 10 +- .../update-sites.py | 6 +- devscripts/install_jython.sh | 5 + devscripts/lazy_load_template.py | 1 - devscripts/make_contributing.py | 4 +- devscripts/make_issue_template.py | 8 +- devscripts/make_lazy_extractors.py | 10 +- devscripts/make_readme.py | 15 +- devscripts/make_supportedsites.py | 8 +- devscripts/prepare_manpage.py | 7 +- devscripts/release.sh | 32 +- devscripts/run_tests.bat | 16 - devscripts/run_tests.sh | 33 +- devscripts/show-downloads-statistics.py | 14 +- devscripts/update-version.py | 33 - devscripts/wine-py2exe.sh | 2 - devscripts/zsh-completion.in | 6 +- devscripts/zsh-completion.py | 8 +- docs/Changelog.md | 5 - docs/LICENSE.md | 6 - docs/Makefile | 8 +- docs/README.md | 2 - docs/conf.py | 45 +- docs/faq.md | 31 + docs/index.rst | 23 + docs/module_guide.rst | 67 + docs/requirements.txt | 1 - docs/supportedsites.md | 1184 +++- docs/ytdlp_plugins.md | 6 - make_win.bat | 1 + pyinst.py | 118 +- pyinst32.py | 92 + pytest.ini | 4 - requirements.txt | 3 - scripts/update-version-workflow.py | 44 + scripts/update-version.py | 31 + setup.cfg | 4 +- setup.py | 143 +- supportedsites.md | 1295 ---- test/helper.py | 18 +- test/parameters.json | 74 +- test/{swftests.unused => swftests}/.gitignore | 0 .../ArrayAccess.as | 0 .../ClassCall.as | 0 .../ClassConstruction.as | 0 .../ConstArrayAccess.as | 0 .../ConstantInt.as | 0 .../{swftests.unused => swftests}/DictCall.as | 0 .../EqualsOperator.as | 0 .../LocalVars.as | 0 .../MemberAssignment.as | 0 .../NeOperator.as | 0 .../PrivateCall.as | 0 .../PrivateVoidCall.as | 0 .../StaticAssignment.as | 0 .../StaticRetrieval.as | 0 .../StringBasics.as | 0 .../StringCharCodeAt.as | 0 .../StringConversion.as | 0 test/test_InfoExtractor.py | 1104 ++-- test/test_YoutubeDL.py | 266 +- test/test_YoutubeDLCookieJar.py | 4 +- test/test_aes.py | 7 +- test/test_age_restriction.py | 8 +- test/test_all_urls.py | 26 +- test/test_cache.py | 4 +- test/test_compat.py | 39 +- test/test_cookies.py | 96 - test/test_download.py | 21 +- test/test_downloader_http.py | 10 +- test/test_execution.py | 22 +- test/test_http.py | 6 +- test/test_iqiyi_sdk_interpreter.py | 7 +- test/test_jsinterp.py | 4 +- test/test_netrc.py | 2 +- test/test_options.py | 2 +- test/test_overwrites.py | 52 - test/test_post_hooks.py | 69 - test/test_postprocessors.py | 58 +- test/test_socks.py | 7 +- test/test_subtitles.py | 35 +- ...wfinterp.py.disabled => test_swfinterp.py} | 4 +- ...s.py.disabled => test_unicode_literals.py} | 2 + ...test_update.py.disabled => test_update.py} | 4 +- test/test_utils.py | 126 +- test/test_verbose_output.py | 10 +- test/test_write_annotations.py | 13 +- test/test_youtube_chapters.py | 275 + test/test_youtube_lists.py | 26 +- test/test_youtube_misc.py | 26 - test/test_youtube_signature.py | 47 +- test/testdata/ism/sintel.Manifest | 988 --- test/testdata/m3u8/bipbop_16x9.m3u8 | 38 - .../m3u8/img_bipbop_adv_example_fmp4.m3u8 | 76 - test/testdata/m3u8/pluzz_francetv_11507.m3u8 | 14 + test/testdata/m3u8/teamcoco_11995.m3u8 | 16 + test/testdata/m3u8/ted_18923.m3u8 | 28 + test/testdata/m3u8/toggle_mobile_12211.m3u8 | 13 + test/testdata/m3u8/twitch_vod.m3u8 | 20 + test/testdata/m3u8/vidio.m3u8 | 10 + test/testdata/mpd/subtitles.mpd | 351 -- .../thumbnails/foo %d bar/foo_%d.webp | Bin 3928 -> 0 bytes tox.ini | 4 +- {devscripts => win/icon}/cloud.ico | Bin win/ver.txt | 45 + youtube_dlc/YoutubeDL.py | 2524 ++++++++ {yt_dlp => youtube_dlc}/__init__.py | 399 +- {yt_dlp => youtube_dlc}/__main__.py | 10 +- {yt_dlp => youtube_dlc}/aes.py | 0 {yt_dlp => youtube_dlc}/cache.py | 2 +- youtube_dlc/compat.py | 3050 ++++++++++ youtube_dlc/downloader/__init__.py | 63 + {yt_dlp => youtube_dlc}/downloader/common.py | 45 +- youtube_dlc/downloader/dash.py | 80 + .../downloader/external.py | 221 +- {yt_dlp => youtube_dlc}/downloader/f4m.py | 19 +- .../downloader/fragment.py | 181 +- youtube_dlc/downloader/hls.py | 210 + {yt_dlp => youtube_dlc}/downloader/http.py | 25 +- {yt_dlp => youtube_dlc}/downloader/ism.py | 58 +- {yt_dlp => youtube_dlc}/downloader/rtmp.py | 18 +- {yt_dlp => youtube_dlc}/downloader/rtsp.py | 4 +- youtube_dlc/downloader/youtube_live_chat.py | 97 + {yt_dlp => youtube_dlc}/extractor/__init__.py | 9 +- {yt_dlp => youtube_dlc}/extractor/abc.py | 0 youtube_dlc/extractor/abcnews.py | 148 + {yt_dlp => youtube_dlc}/extractor/abcotvs.py | 0 .../extractor/academicearth.py | 0 youtube_dlc/extractor/acast.py | 135 + youtube_dlc/extractor/adn.py | 207 + .../extractor/adobeconnect.py | 0 .../extractor/adobepass.py | 64 +- {yt_dlp => youtube_dlc}/extractor/adobetv.py | 2 +- .../extractor/adultswim.py | 0 youtube_dlc/extractor/aenetworks.py | 247 + .../extractor/afreecatv.py | 4 +- .../extractor/airmozilla.py | 0 .../extractor/aliexpress.py | 0 youtube_dlc/extractor/aljazeera.py | 33 + {yt_dlp => youtube_dlc}/extractor/allocine.py | 0 .../extractor/alphaporno.py | 0 {yt_dlp => youtube_dlc}/extractor/alura.py | 2 +- {yt_dlp => youtube_dlc}/extractor/amara.py | 0 .../extractor/amcnetworks.py | 108 +- youtube_dlc/extractor/americastestkitchen.py | 82 + {yt_dlp => youtube_dlc}/extractor/amp.py | 3 +- .../extractor/animeondemand.py | 26 +- {yt_dlp => youtube_dlc}/extractor/anvato.py | 106 +- {yt_dlp => youtube_dlc}/extractor/aol.py | 14 +- {yt_dlp => youtube_dlc}/extractor/apa.py | 47 +- {yt_dlp => youtube_dlc}/extractor/aparat.py | 23 +- .../extractor/appleconnect.py | 13 +- .../extractor/appletrailers.py | 2 +- youtube_dlc/extractor/archiveorg.py | 65 + {yt_dlp => youtube_dlc}/extractor/ard.py | 105 +- youtube_dlc/extractor/arkena.py | 133 + {yt_dlp => youtube_dlc}/extractor/arte.py | 5 +- youtube_dlc/extractor/asiancrush.py | 145 + .../extractor/atresplayer.py | 10 +- .../extractor/atttechchannel.py | 0 {yt_dlp => youtube_dlc}/extractor/atvat.py | 0 .../extractor/audimedia.py | 0 .../extractor/audioboom.py | 0 .../extractor/audiomack.py | 0 {yt_dlp => youtube_dlc}/extractor/awaan.py | 4 +- {yt_dlp => youtube_dlc}/extractor/aws.py | 0 {yt_dlp => youtube_dlc}/extractor/azmedien.py | 2 +- {yt_dlp => youtube_dlc}/extractor/baidu.py | 0 {yt_dlp => youtube_dlc}/extractor/bandcamp.py | 4 +- {yt_dlp => youtube_dlc}/extractor/bbc.py | 373 +- youtube_dlc/extractor/beampro.py | 194 + {yt_dlp => youtube_dlc}/extractor/beatport.py | 2 + {yt_dlp => youtube_dlc}/extractor/beeg.py | 0 .../extractor/behindkink.py | 0 .../extractor/bellmedia.py | 0 {yt_dlp => youtube_dlc}/extractor/bet.py | 0 {yt_dlp => youtube_dlc}/extractor/bfi.py | 0 {yt_dlp => youtube_dlc}/extractor/bigflix.py | 0 {yt_dlp => youtube_dlc}/extractor/bild.py | 0 {yt_dlp => youtube_dlc}/extractor/bilibili.py | 281 +- .../extractor/biobiochiletv.py | 0 {yt_dlp => youtube_dlc}/extractor/biqle.py | 0 {yt_dlp => youtube_dlc}/extractor/bitchute.py | 8 - .../extractor/bleacherreport.py | 10 +- {yt_dlp => youtube_dlc}/extractor/blinkx.py | 4 +- .../extractor/bloomberg.py | 0 {yt_dlp => youtube_dlc}/extractor/bokecc.py | 2 +- .../extractor/bostonglobe.py | 0 {yt_dlp => youtube_dlc}/extractor/box.py | 0 {yt_dlp => youtube_dlc}/extractor/bpb.py | 2 +- {yt_dlp => youtube_dlc}/extractor/br.py | 2 +- {yt_dlp => youtube_dlc}/extractor/bravotv.py | 50 +- {yt_dlp => youtube_dlc}/extractor/breakcom.py | 0 .../extractor/brightcove.py | 73 +- .../extractor/businessinsider.py | 0 {yt_dlp => youtube_dlc}/extractor/buzzfeed.py | 0 {yt_dlp => youtube_dlc}/extractor/byutv.py | 14 +- {yt_dlp => youtube_dlc}/extractor/c56.py | 0 {yt_dlp => youtube_dlc}/extractor/camdemy.py | 0 .../extractor/cammodels.py | 2 +- {yt_dlp => youtube_dlc}/extractor/camtube.py | 0 .../extractor/camwithher.py | 0 {yt_dlp => youtube_dlc}/extractor/canalc2.py | 0 .../extractor/canalplus.py | 2 +- {yt_dlp => youtube_dlc}/extractor/canvas.py | 200 +- .../extractor/carambatv.py | 0 .../extractor/cartoonnetwork.py | 0 {yt_dlp => youtube_dlc}/extractor/cbc.py | 0 {yt_dlp => youtube_dlc}/extractor/cbs.py | 22 +- .../extractor/cbsinteractive.py | 0 {yt_dlp => youtube_dlc}/extractor/cbslocal.py | 67 +- {yt_dlp => youtube_dlc}/extractor/cbsnews.py | 2 +- youtube_dlc/extractor/cbssports.py | 38 + {yt_dlp => youtube_dlc}/extractor/ccc.py | 0 {yt_dlp => youtube_dlc}/extractor/ccma.py | 68 +- {yt_dlp => youtube_dlc}/extractor/cctv.py | 2 +- {yt_dlp => youtube_dlc}/extractor/cda.py | 11 +- .../extractor/ceskatelevize.py | 3 +- {yt_dlp => youtube_dlc}/extractor/channel9.py | 6 +- .../extractor/charlierose.py | 0 .../extractor/chaturbate.py | 0 .../extractor/chilloutzone.py | 0 {yt_dlp => youtube_dlc}/extractor/chirbit.py | 0 .../extractor/cinchcast.py | 0 {yt_dlp => youtube_dlc}/extractor/cinemax.py | 0 .../extractor/ciscolive.py | 0 {yt_dlp => youtube_dlc}/extractor/cjsw.py | 0 .../extractor/cliphunter.py | 0 {yt_dlp => youtube_dlc}/extractor/clippit.py | 0 {yt_dlp => youtube_dlc}/extractor/cliprs.py | 0 .../extractor/clipsyndicate.py | 0 .../extractor/closertotruth.py | 0 .../extractor/cloudflarestream.py | 0 {yt_dlp => youtube_dlc}/extractor/cloudy.py | 0 {yt_dlp => youtube_dlc}/extractor/clubic.py | 0 {yt_dlp => youtube_dlc}/extractor/clyp.py | 0 {yt_dlp => youtube_dlc}/extractor/cmt.py | 0 {yt_dlp => youtube_dlc}/extractor/cnbc.py | 0 {yt_dlp => youtube_dlc}/extractor/cnn.py | 5 +- youtube_dlc/extractor/comedycentral.py | 142 + {yt_dlp => youtube_dlc}/extractor/common.py | 1277 ++-- .../extractor/commonmistakes.py | 6 +- .../extractor/commonprotocols.py | 15 - .../extractor/condenast.py | 0 {yt_dlp => youtube_dlc}/extractor/contv.py | 0 {yt_dlp => youtube_dlc}/extractor/corus.py | 2 +- {yt_dlp => youtube_dlc}/extractor/coub.py | 6 +- {yt_dlp => youtube_dlc}/extractor/cracked.py | 0 youtube_dlc/extractor/crackle.py | 200 + .../extractor/crooksandliars.py | 0 .../extractor/crunchyroll.py | 27 +- {yt_dlp => youtube_dlc}/extractor/cspan.py | 48 - {yt_dlp => youtube_dlc}/extractor/ctsnews.py | 0 {yt_dlp => youtube_dlc}/extractor/ctvnews.py | 0 .../extractor/cultureunplugged.py | 0 .../extractor/curiositystream.py | 125 +- {yt_dlp => youtube_dlc}/extractor/cwtv.py | 0 .../extractor/dailymail.py | 0 .../extractor/dailymotion.py | 8 +- {yt_dlp => youtube_dlc}/extractor/daum.py | 2 +- {yt_dlp => youtube_dlc}/extractor/dbtv.py | 0 {yt_dlp => youtube_dlc}/extractor/dctp.py | 0 {yt_dlp => youtube_dlc}/extractor/deezer.py | 4 +- {yt_dlp => youtube_dlc}/extractor/defense.py | 0 .../extractor/democracynow.py | 0 {yt_dlp => youtube_dlc}/extractor/dfb.py | 0 {yt_dlp => youtube_dlc}/extractor/dhm.py | 0 {yt_dlp => youtube_dlc}/extractor/digg.py | 0 {yt_dlp => youtube_dlc}/extractor/digiteka.py | 0 .../extractor/discovery.py | 0 .../extractor/discoverygo.py | 0 .../extractor/discoverynetworks.py | 0 .../extractor/discoveryvr.py | 0 {yt_dlp => youtube_dlc}/extractor/disney.py | 3 +- {yt_dlp => youtube_dlc}/extractor/dispeak.py | 47 +- {yt_dlp => youtube_dlc}/extractor/dlive.py | 0 .../extractor/doodstream.py | 0 {yt_dlp => youtube_dlc}/extractor/dotsub.py | 0 {yt_dlp => youtube_dlc}/extractor/douyutv.py | 0 {yt_dlp => youtube_dlc}/extractor/dplay.py | 188 +- .../extractor/drbonanza.py | 0 {yt_dlp => youtube_dlc}/extractor/dropbox.py | 4 +- {yt_dlp => youtube_dlc}/extractor/drtuber.py | 0 {yt_dlp => youtube_dlc}/extractor/drtv.py | 9 +- {yt_dlp => youtube_dlc}/extractor/dtube.py | 0 {yt_dlp => youtube_dlc}/extractor/duboku.py | 0 {yt_dlp => youtube_dlc}/extractor/dumpert.py | 0 {yt_dlp => youtube_dlc}/extractor/dvtv.py | 0 {yt_dlp => youtube_dlc}/extractor/dw.py | 0 .../extractor/eagleplatform.py | 0 .../extractor/ebaumsworld.py | 0 {yt_dlp => youtube_dlc}/extractor/echomsk.py | 0 {yt_dlp => youtube_dlc}/extractor/egghead.py | 48 +- {yt_dlp => youtube_dlc}/extractor/ehow.py | 0 .../extractor/eighttracks.py | 22 +- .../extractor/einthusan.py | 0 {yt_dlp => youtube_dlc}/extractor/eitb.py | 0 .../extractor/ellentube.py | 0 {yt_dlp => youtube_dlc}/extractor/elonet.py | 82 +- {yt_dlp => youtube_dlc}/extractor/elpais.py | 0 {yt_dlp => youtube_dlc}/extractor/embedly.py | 0 {yt_dlp => youtube_dlc}/extractor/engadget.py | 0 {yt_dlp => youtube_dlc}/extractor/eporner.py | 13 +- .../extractor/eroprofile.py | 21 +- {yt_dlp => youtube_dlc}/extractor/escapist.py | 0 {yt_dlp => youtube_dlc}/extractor/espn.py | 2 +- {yt_dlp => youtube_dlc}/extractor/esri.py | 0 {yt_dlp => youtube_dlc}/extractor/europa.py | 0 .../extractor/everyonesmixtape.py | 0 {yt_dlp => youtube_dlc}/extractor/expotv.py | 0 .../extractor/expressen.py | 0 .../extractor/extractors.py | 333 +- .../extractor/extremetube.py | 0 {yt_dlp => youtube_dlc}/extractor/eyedotv.py | 0 {yt_dlp => youtube_dlc}/extractor/facebook.py | 335 +- {yt_dlp => youtube_dlc}/extractor/faz.py | 0 {yt_dlp => youtube_dlc}/extractor/fc2.py | 0 {yt_dlp => youtube_dlc}/extractor/fczenit.py | 0 {yt_dlp => youtube_dlc}/extractor/filmon.py | 0 {yt_dlp => youtube_dlc}/extractor/filmweb.py | 0 {yt_dlp => youtube_dlc}/extractor/firsttv.py | 2 +- {yt_dlp => youtube_dlc}/extractor/fivemin.py | 0 {yt_dlp => youtube_dlc}/extractor/fivetv.py | 0 {yt_dlp => youtube_dlc}/extractor/flickr.py | 2 +- .../extractor/folketinget.py | 0 .../extractor/footyroom.py | 0 youtube_dlc/extractor/formula1.py | 33 + {yt_dlp => youtube_dlc}/extractor/fourtube.py | 0 {yt_dlp => youtube_dlc}/extractor/fox.py | 0 {yt_dlp => youtube_dlc}/extractor/fox9.py | 0 {yt_dlp => youtube_dlc}/extractor/foxgay.py | 0 {yt_dlp => youtube_dlc}/extractor/foxnews.py | 0 .../extractor/foxsports.py | 0 .../extractor/franceculture.py | 20 +- .../extractor/franceinter.py | 0 {yt_dlp => youtube_dlc}/extractor/francetv.py | 42 +- .../extractor/freesound.py | 0 .../extractor/freespeech.py | 0 .../extractor/freshlive.py | 0 .../extractor/frontendmasters.py | 0 youtube_dlc/extractor/funimation.py | 154 + {yt_dlp => youtube_dlc}/extractor/funk.py | 0 {yt_dlp => youtube_dlc}/extractor/fusion.py | 0 .../extractor/fxnetworks.py | 0 {yt_dlp => youtube_dlc}/extractor/gaia.py | 0 .../extractor/gameinformer.py | 0 youtube_dlc/extractor/gamespot.py | 139 + {yt_dlp => youtube_dlc}/extractor/gamestar.py | 0 {yt_dlp => youtube_dlc}/extractor/gaskrank.py | 0 {yt_dlp => youtube_dlc}/extractor/gazeta.py | 0 {yt_dlp => youtube_dlc}/extractor/gdcvault.py | 99 +- {yt_dlp => youtube_dlc}/extractor/generic.py | 381 +- {yt_dlp => youtube_dlc}/extractor/gfycat.py | 0 .../extractor/giantbomb.py | 0 {yt_dlp => youtube_dlc}/extractor/giga.py | 0 {yt_dlp => youtube_dlc}/extractor/gigya.py | 0 {yt_dlp => youtube_dlc}/extractor/glide.py | 0 {yt_dlp => youtube_dlc}/extractor/globo.py | 2 +- {yt_dlp => youtube_dlc}/extractor/go.py | 86 +- {yt_dlp => youtube_dlc}/extractor/godtube.py | 0 {yt_dlp => youtube_dlc}/extractor/golem.py | 0 .../extractor/googledrive.py | 10 +- youtube_dlc/extractor/googleplus.py | 73 + .../extractor/googlesearch.py | 0 {yt_dlp => youtube_dlc}/extractor/goshgay.py | 0 .../extractor/gputechconf.py | 0 {yt_dlp => youtube_dlc}/extractor/groupon.py | 0 {yt_dlp => youtube_dlc}/extractor/hbo.py | 0 .../extractor/hearthisat.py | 2 +- {yt_dlp => youtube_dlc}/extractor/heise.py | 0 .../extractor/hellporno.py | 0 {yt_dlp => youtube_dlc}/extractor/helsinki.py | 0 .../extractor/hentaistigma.py | 0 {yt_dlp => youtube_dlc}/extractor/hgtv.py | 0 {yt_dlp => youtube_dlc}/extractor/hidive.py | 0 .../extractor/historicfilms.py | 0 {yt_dlp => youtube_dlc}/extractor/hitbox.py | 0 .../extractor/hitrecord.py | 0 {yt_dlp => youtube_dlc}/extractor/hketv.py | 0 .../extractor/hornbunny.py | 0 .../extractor/hotnewhiphop.py | 0 {yt_dlp => youtube_dlc}/extractor/hotstar.py | 70 +- {yt_dlp => youtube_dlc}/extractor/howcast.py | 0 .../extractor/howstuffworks.py | 0 .../extractor/hrfensehen.py | 2 +- {yt_dlp => youtube_dlc}/extractor/hrti.py | 0 {yt_dlp => youtube_dlc}/extractor/huajiao.py | 0 {yt_dlp => youtube_dlc}/extractor/huffpost.py | 0 {yt_dlp => youtube_dlc}/extractor/hungama.py | 0 {yt_dlp => youtube_dlc}/extractor/hypem.py | 0 youtube_dlc/extractor/ign.py | 232 + {yt_dlp => youtube_dlc}/extractor/imdb.py | 0 .../extractor/imggaming.py | 2 +- {yt_dlp => youtube_dlc}/extractor/imgur.py | 6 +- {yt_dlp => youtube_dlc}/extractor/ina.py | 5 +- {yt_dlp => youtube_dlc}/extractor/inc.py | 0 .../extractor/indavideo.py | 0 {yt_dlp => youtube_dlc}/extractor/infoq.py | 0 .../extractor/instagram.py | 153 +- .../extractor/internazionale.py | 0 .../extractor/internetvideoarchive.py | 0 {yt_dlp => youtube_dlc}/extractor/iprima.py | 2 +- {yt_dlp => youtube_dlc}/extractor/iqiyi.py | 4 +- {yt_dlp => youtube_dlc}/extractor/ir90tv.py | 0 youtube_dlc/extractor/itv.py | 312 + {yt_dlp => youtube_dlc}/extractor/ivi.py | 9 +- {yt_dlp => youtube_dlc}/extractor/ivideon.py | 0 {yt_dlp => youtube_dlc}/extractor/iwara.py | 0 {yt_dlp => youtube_dlc}/extractor/izlesene.py | 0 {yt_dlp => youtube_dlc}/extractor/jamendo.py | 74 +- .../extractor/jeuxvideo.py | 0 {yt_dlp => youtube_dlc}/extractor/joj.py | 0 {yt_dlp => youtube_dlc}/extractor/jove.py | 0 .../extractor/jwplatform.py | 11 +- {yt_dlp => youtube_dlc}/extractor/kakao.py | 0 {yt_dlp => youtube_dlc}/extractor/kaltura.py | 16 +- .../extractor/kanalplay.py | 0 {yt_dlp => youtube_dlc}/extractor/kankan.py | 0 .../extractor/karaoketv.py | 0 .../extractor/karrierevideos.py | 0 .../extractor/keezmovies.py | 2 +- youtube_dlc/extractor/ketnet.py | 93 + youtube_dlc/extractor/khanacademy.py | 82 + .../extractor/kickstarter.py | 0 {yt_dlp => youtube_dlc}/extractor/kinja.py | 0 .../extractor/kinopoisk.py | 0 .../extractor/konserthusetplay.py | 0 {yt_dlp => youtube_dlc}/extractor/krasview.py | 0 {yt_dlp => youtube_dlc}/extractor/ku6.py | 0 {yt_dlp => youtube_dlc}/extractor/kusi.py | 0 {yt_dlp => youtube_dlc}/extractor/kuwo.py | 2 +- youtube_dlc/extractor/la7.py | 59 + {yt_dlp => youtube_dlc}/extractor/laola1tv.py | 0 youtube_dlc/extractor/lbry.py | 91 + {yt_dlp => youtube_dlc}/extractor/lci.py | 0 {yt_dlp => youtube_dlc}/extractor/lcp.py | 0 .../extractor/lecture2go.py | 0 {yt_dlp => youtube_dlc}/extractor/lecturio.py | 0 {yt_dlp => youtube_dlc}/extractor/leeco.py | 2 +- {yt_dlp => youtube_dlc}/extractor/lego.py | 0 {yt_dlp => youtube_dlc}/extractor/lemonde.py | 0 {yt_dlp => youtube_dlc}/extractor/lenta.py | 0 .../extractor/libraryofcongress.py | 0 {yt_dlp => youtube_dlc}/extractor/libsyn.py | 0 {yt_dlp => youtube_dlc}/extractor/lifenews.py | 2 +- .../extractor/limelight.py | 11 +- youtube_dlc/extractor/line.py | 90 + {yt_dlp => youtube_dlc}/extractor/linkedin.py | 5 +- youtube_dlc/extractor/linuxacademy.py | 173 + {yt_dlp => youtube_dlc}/extractor/litv.py | 2 +- .../extractor/livejournal.py | 0 youtube_dlc/extractor/liveleak.py | 191 + .../extractor/livestream.py | 2 +- {yt_dlp => youtube_dlc}/extractor/lnkgo.py | 0 .../extractor/localnews8.py | 0 .../extractor/lovehomeporn.py | 0 {yt_dlp => youtube_dlc}/extractor/lrt.py | 0 {yt_dlp => youtube_dlc}/extractor/lynda.py | 2 +- {yt_dlp => youtube_dlc}/extractor/m6.py | 0 .../extractor/magentamusik360.py | 0 {yt_dlp => youtube_dlc}/extractor/mailru.py | 0 {yt_dlp => youtube_dlc}/extractor/malltv.py | 0 .../extractor/mangomolo.py | 0 {yt_dlp => youtube_dlc}/extractor/manyvids.py | 0 {yt_dlp => youtube_dlc}/extractor/markiza.py | 0 .../extractor/massengeschmacktv.py | 2 +- {yt_dlp => youtube_dlc}/extractor/matchtv.py | 0 {yt_dlp => youtube_dlc}/extractor/mdr.py | 77 +- {yt_dlp => youtube_dlc}/extractor/medaltv.py | 24 +- youtube_dlc/extractor/medialaan.py | 269 + {yt_dlp => youtube_dlc}/extractor/mediaset.py | 80 +- .../extractor/mediasite.py | 63 +- {yt_dlp => youtube_dlc}/extractor/medici.py | 0 .../extractor/megaphone.py | 0 {yt_dlp => youtube_dlc}/extractor/meipai.py | 0 {yt_dlp => youtube_dlc}/extractor/melonvod.py | 0 {yt_dlp => youtube_dlc}/extractor/meta.py | 0 {yt_dlp => youtube_dlc}/extractor/metacafe.py | 2 +- .../extractor/metacritic.py | 0 {yt_dlp => youtube_dlc}/extractor/mgoon.py | 0 {yt_dlp => youtube_dlc}/extractor/mgtv.py | 0 {yt_dlp => youtube_dlc}/extractor/miaopai.py | 0 .../extractor/microsoftvirtualacademy.py | 0 .../extractor/ministrygrid.py | 0 {yt_dlp => youtube_dlc}/extractor/minoto.py | 0 {yt_dlp => youtube_dlc}/extractor/miomio.py | 0 {yt_dlp => youtube_dlc}/extractor/mit.py | 0 {yt_dlp => youtube_dlc}/extractor/mitele.py | 49 +- {yt_dlp => youtube_dlc}/extractor/mixcloud.py | 11 +- youtube_dlc/extractor/mlb.py | 120 + {yt_dlp => youtube_dlc}/extractor/mnet.py | 0 {yt_dlp => youtube_dlc}/extractor/moevideo.py | 0 {yt_dlp => youtube_dlc}/extractor/mofosex.py | 0 {yt_dlp => youtube_dlc}/extractor/mojvideo.py | 0 .../extractor/morningstar.py | 0 .../extractor/motherless.py | 45 +- .../extractor/motorsport.py | 0 .../extractor/movieclips.py | 0 .../extractor/moviezine.py | 0 .../extractor/movingimage.py | 0 {yt_dlp => youtube_dlc}/extractor/msn.py | 2 +- {yt_dlp => youtube_dlc}/extractor/mtv.py | 260 +- .../extractor/muenchentv.py | 2 +- {yt_dlp => youtube_dlc}/extractor/mwave.py | 0 .../extractor/mychannels.py | 0 {yt_dlp => youtube_dlc}/extractor/myspace.py | 0 {yt_dlp => youtube_dlc}/extractor/myspass.py | 0 {yt_dlp => youtube_dlc}/extractor/myvi.py | 0 .../extractor/myvideoge.py | 0 .../extractor/myvidster.py | 0 .../extractor/nationalgeographic.py | 0 {yt_dlp => youtube_dlc}/extractor/naver.py | 0 youtube_dlc/extractor/nba.py | 154 + {yt_dlp => youtube_dlc}/extractor/nbc.py | 96 +- {yt_dlp => youtube_dlc}/extractor/ndr.py | 0 {yt_dlp => youtube_dlc}/extractor/ndtv.py | 0 .../extractor/nerdcubed.py | 0 .../extractor/neteasemusic.py | 2 +- {yt_dlp => youtube_dlc}/extractor/netzkino.py | 0 .../extractor/newgrounds.py | 0 {yt_dlp => youtube_dlc}/extractor/newstube.py | 0 .../extractor/nextmedia.py | 0 {yt_dlp => youtube_dlc}/extractor/nexx.py | 0 youtube_dlc/extractor/nfl.py | 231 + youtube_dlc/extractor/nhk.py | 93 + {yt_dlp => youtube_dlc}/extractor/nhl.py | 0 {yt_dlp => youtube_dlc}/extractor/nick.py | 63 +- youtube_dlc/extractor/niconico.py | 470 ++ .../extractor/ninecninemedia.py | 23 +- youtube_dlc/extractor/ninegag.py | 104 + {yt_dlp => youtube_dlc}/extractor/ninenow.py | 2 +- {yt_dlp => youtube_dlc}/extractor/nintendo.py | 0 youtube_dlc/extractor/nitter.py | 167 + .../extractor/njpwworld.py | 54 +- .../extractor/nobelprize.py | 0 {yt_dlp => youtube_dlc}/extractor/noco.py | 2 +- {yt_dlp => youtube_dlc}/extractor/nonktube.py | 0 {yt_dlp => youtube_dlc}/extractor/noovo.py | 0 .../extractor/normalboots.py | 0 {yt_dlp => youtube_dlc}/extractor/nosvideo.py | 0 {yt_dlp => youtube_dlc}/extractor/nova.py | 0 {yt_dlp => youtube_dlc}/extractor/nowness.py | 2 +- {yt_dlp => youtube_dlc}/extractor/noz.py | 0 {yt_dlp => youtube_dlc}/extractor/npo.py | 6 +- {yt_dlp => youtube_dlc}/extractor/npr.py | 0 youtube_dlc/extractor/nrk.py | 795 +++ {yt_dlp => youtube_dlc}/extractor/nrl.py | 0 {yt_dlp => youtube_dlc}/extractor/ntvcojp.py | 0 {yt_dlp => youtube_dlc}/extractor/ntvde.py | 2 +- {yt_dlp => youtube_dlc}/extractor/ntvru.py | 0 {yt_dlp => youtube_dlc}/extractor/nuevo.py | 0 {yt_dlp => youtube_dlc}/extractor/nuvid.py | 0 {yt_dlp => youtube_dlc}/extractor/nytimes.py | 10 +- {yt_dlp => youtube_dlc}/extractor/nzz.py | 0 {yt_dlp => youtube_dlc}/extractor/odatv.py | 0 .../extractor/odnoklassniki.py | 5 +- .../extractor/oktoberfesttv.py | 0 {yt_dlp => youtube_dlc}/extractor/once.py | 0 .../extractor/ondemandkorea.py | 0 {yt_dlp => youtube_dlc}/extractor/onet.py | 2 +- .../extractor/onionstudios.py | 0 {yt_dlp => youtube_dlc}/extractor/ooyala.py | 3 +- {yt_dlp => youtube_dlc}/extractor/openload.py | 3 +- {yt_dlp => youtube_dlc}/extractor/ora.py | 2 +- {yt_dlp => youtube_dlc}/extractor/orf.py | 26 +- .../extractor/outsidetv.py | 0 {yt_dlp => youtube_dlc}/extractor/packtpub.py | 0 .../extractor/pandoratv.py | 0 .../extractor/parliamentliveuk.py | 0 {yt_dlp => youtube_dlc}/extractor/patreon.py | 31 - {yt_dlp => youtube_dlc}/extractor/pbs.py | 0 .../extractor/pearvideo.py | 0 {yt_dlp => youtube_dlc}/extractor/peertube.py | 52 +- {yt_dlp => youtube_dlc}/extractor/people.py | 0 .../extractor/performgroup.py | 0 .../extractor/periscope.py | 8 +- .../extractor/philharmoniedeparis.py | 2 +- youtube_dlc/extractor/phoenix.py | 52 + .../extractor/photobucket.py | 0 {yt_dlp => youtube_dlc}/extractor/picarto.py | 96 +- {yt_dlp => youtube_dlc}/extractor/piksel.py | 109 +- {yt_dlp => youtube_dlc}/extractor/pinkbike.py | 0 .../extractor/pinterest.py | 7 +- {yt_dlp => youtube_dlc}/extractor/pladform.py | 0 {yt_dlp => youtube_dlc}/extractor/platzi.py | 0 {yt_dlp => youtube_dlc}/extractor/playfm.py | 0 .../extractor/playplustv.py | 0 {yt_dlp => youtube_dlc}/extractor/plays.py | 0 {yt_dlp => youtube_dlc}/extractor/playtvak.py | 2 +- {yt_dlp => youtube_dlc}/extractor/playvid.py | 0 {yt_dlp => youtube_dlc}/extractor/playwire.py | 0 .../extractor/pluralsight.py | 8 +- .../extractor/podomatic.py | 0 {yt_dlp => youtube_dlc}/extractor/pokemon.py | 7 +- .../extractor/polskieradio.py | 0 .../extractor/popcorntimes.py | 0 .../extractor/popcorntv.py | 0 {yt_dlp => youtube_dlc}/extractor/porn91.py | 0 {yt_dlp => youtube_dlc}/extractor/porncom.py | 0 {yt_dlp => youtube_dlc}/extractor/pornhd.py | 0 {yt_dlp => youtube_dlc}/extractor/pornhub.py | 324 +- .../extractor/pornotube.py | 0 .../extractor/pornovoisines.py | 0 {yt_dlp => youtube_dlc}/extractor/pornoxo.py | 0 {yt_dlp => youtube_dlc}/extractor/presstv.py | 0 .../extractor/prosiebensat1.py | 2 +- {yt_dlp => youtube_dlc}/extractor/puhutv.py | 0 {yt_dlp => youtube_dlc}/extractor/puls4.py | 0 {yt_dlp => youtube_dlc}/extractor/pyvideo.py | 0 {yt_dlp => youtube_dlc}/extractor/qqmusic.py | 2 +- {yt_dlp => youtube_dlc}/extractor/r7.py | 0 .../extractor/radiobremen.py | 0 .../extractor/radiocanada.py | 0 {yt_dlp => youtube_dlc}/extractor/radiode.py | 0 .../extractor/radiofrance.py | 2 +- .../extractor/radiojavan.py | 0 {yt_dlp => youtube_dlc}/extractor/rai.py | 173 +- .../extractor/raywenderlich.py | 0 .../extractor/rbmaradio.py | 0 {yt_dlp => youtube_dlc}/extractor/rds.py | 18 +- .../extractor/redbulltv.py | 6 +- {yt_dlp => youtube_dlc}/extractor/reddit.py | 37 +- {yt_dlp => youtube_dlc}/extractor/redtube.py | 0 {yt_dlp => youtube_dlc}/extractor/regiotv.py | 0 {yt_dlp => youtube_dlc}/extractor/rentv.py | 0 {yt_dlp => youtube_dlc}/extractor/restudy.py | 0 {yt_dlp => youtube_dlc}/extractor/reuters.py | 0 .../extractor/reverbnation.py | 0 {yt_dlp => youtube_dlc}/extractor/rice.py | 0 .../extractor/rmcdecouverte.py | 26 +- {yt_dlp => youtube_dlc}/extractor/ro220.py | 0 .../extractor/rockstargames.py | 0 .../extractor/roosterteeth.py | 26 +- .../extractor/rottentomatoes.py | 0 {yt_dlp => youtube_dlc}/extractor/roxwel.py | 0 {yt_dlp => youtube_dlc}/extractor/rozhlas.py | 0 {yt_dlp => youtube_dlc}/extractor/rtbf.py | 2 +- {yt_dlp => youtube_dlc}/extractor/rte.py | 0 {yt_dlp => youtube_dlc}/extractor/rtl2.py | 2 +- {yt_dlp => youtube_dlc}/extractor/rtlnl.py | 0 youtube_dlc/extractor/rtp.py | 66 + {yt_dlp => youtube_dlc}/extractor/rts.py | 15 +- {yt_dlp => youtube_dlc}/extractor/rtve.py | 232 +- {yt_dlp => youtube_dlc}/extractor/rtvnh.py | 0 {yt_dlp => youtube_dlc}/extractor/rtvs.py | 0 {yt_dlp => youtube_dlc}/extractor/ruhd.py | 0 {yt_dlp => youtube_dlc}/extractor/rumble.py | 10 - {yt_dlp => youtube_dlc}/extractor/rutube.py | 0 {yt_dlp => youtube_dlc}/extractor/rutv.py | 4 +- {yt_dlp => youtube_dlc}/extractor/ruutu.py | 92 +- {yt_dlp => youtube_dlc}/extractor/ruv.py | 0 {yt_dlp => youtube_dlc}/extractor/safari.py | 0 {yt_dlp => youtube_dlc}/extractor/sapo.py | 0 {yt_dlp => youtube_dlc}/extractor/savefrom.py | 0 {yt_dlp => youtube_dlc}/extractor/sbs.py | 16 +- .../extractor/screencast.py | 0 youtube_dlc/extractor/screencastomatic.py | 37 + .../extractor/scrippsnetworks.py | 0 {yt_dlp => youtube_dlc}/extractor/scte.py | 0 {yt_dlp => youtube_dlc}/extractor/seeker.py | 0 .../extractor/senateisvp.py | 0 .../extractor/sendtonews.py | 4 +- {yt_dlp => youtube_dlc}/extractor/servus.py | 0 .../extractor/sevenplus.py | 32 +- {yt_dlp => youtube_dlc}/extractor/sexu.py | 0 .../extractor/seznamzpravy.py | 0 {yt_dlp => youtube_dlc}/extractor/shahid.py | 30 +- {yt_dlp => youtube_dlc}/extractor/shared.py | 9 +- .../extractor/showroomlive.py | 0 {yt_dlp => youtube_dlc}/extractor/sina.py | 6 +- {yt_dlp => youtube_dlc}/extractor/sixplay.py | 0 youtube_dlc/extractor/sky.py | 70 + youtube_dlc/extractor/skyitalia.py | 123 + .../extractor/skylinewebcams.py | 0 .../extractor/skynewsarabia.py | 0 .../extractor/slideshare.py | 0 .../extractor/slideslive.py | 56 +- {yt_dlp => youtube_dlc}/extractor/slutload.py | 0 youtube_dlc/extractor/smotri.py | 416 ++ {yt_dlp => youtube_dlc}/extractor/snotr.py | 0 {yt_dlp => youtube_dlc}/extractor/sohu.py | 2 +- youtube_dlc/extractor/sonyliv.py | 40 + .../extractor/soundcloud.py | 59 +- .../extractor/soundgasm.py | 0 .../extractor/southpark.py | 18 +- .../extractor/spankbang.py | 38 +- .../extractor/spankwire.py | 2 +- {yt_dlp => youtube_dlc}/extractor/spiegel.py | 0 .../extractor/spiegeltv.py | 0 {yt_dlp => youtube_dlc}/extractor/spike.py | 31 +- {yt_dlp => youtube_dlc}/extractor/sport5.py | 0 {yt_dlp => youtube_dlc}/extractor/sportbox.py | 0 youtube_dlc/extractor/sportdeutschland.py | 82 + {yt_dlp => youtube_dlc}/extractor/spreaker.py | 0 .../extractor/springboardplatform.py | 0 youtube_dlc/extractor/sprout.py | 52 + youtube_dlc/extractor/srgssr.py | 192 + .../extractor/srmediathek.py | 0 .../extractor/stanfordoc.py | 0 {yt_dlp => youtube_dlc}/extractor/steam.py | 2 +- youtube_dlc/extractor/stitcher.py | 81 + youtube_dlc/extractor/storyfire.py | 255 + .../extractor/streamable.py | 0 .../extractor/streamcloud.py | 4 +- {yt_dlp => youtube_dlc}/extractor/streamcz.py | 0 youtube_dlc/extractor/streetvoice.py | 49 + youtube_dlc/extractor/stretchinternet.py | 32 + {yt_dlp => youtube_dlc}/extractor/stv.py | 42 +- {yt_dlp => youtube_dlc}/extractor/sunporno.py | 0 .../extractor/sverigesradio.py | 0 {yt_dlp => youtube_dlc}/extractor/svt.py | 29 +- .../extractor/swrmediathek.py | 0 {yt_dlp => youtube_dlc}/extractor/syfy.py | 0 {yt_dlp => youtube_dlc}/extractor/sztvhu.py | 0 .../extractor/tagesschau.py | 0 {yt_dlp => youtube_dlc}/extractor/tass.py | 0 .../extractor/tastytrade.py | 0 {yt_dlp => youtube_dlc}/extractor/tbs.py | 9 +- .../extractor/tdslifeway.py | 0 .../extractor/teachable.py | 4 +- .../extractor/teachertube.py | 0 .../extractor/teachingchannel.py | 0 {yt_dlp => youtube_dlc}/extractor/teamcoco.py | 0 .../extractor/teamtreehouse.py | 0 .../extractor/techtalks.py | 0 {yt_dlp => youtube_dlc}/extractor/ted.py | 24 +- {yt_dlp => youtube_dlc}/extractor/tele13.py | 2 +- {yt_dlp => youtube_dlc}/extractor/tele5.py | 0 .../extractor/telebruxelles.py | 0 .../extractor/telecinco.py | 77 +- .../extractor/telegraaf.py | 0 {yt_dlp => youtube_dlc}/extractor/telemb.py | 2 +- .../extractor/telequebec.py | 160 +- {yt_dlp => youtube_dlc}/extractor/teletask.py | 0 .../extractor/telewebion.py | 0 {yt_dlp => youtube_dlc}/extractor/tennistv.py | 10 +- youtube_dlc/extractor/tenplay.py | 58 + {yt_dlp => youtube_dlc}/extractor/testurl.py | 0 youtube_dlc/extractor/tf1.py | 92 + {yt_dlp => youtube_dlc}/extractor/tfo.py | 0 .../extractor/theintercept.py | 0 .../extractor/theplatform.py | 3 - {yt_dlp => youtube_dlc}/extractor/thescene.py | 0 {yt_dlp => youtube_dlc}/extractor/thestar.py | 0 {yt_dlp => youtube_dlc}/extractor/thesun.py | 0 .../extractor/theweatherchannel.py | 43 +- .../extractor/thisamericanlife.py | 0 {yt_dlp => youtube_dlc}/extractor/thisav.py | 0 .../extractor/thisoldhouse.py | 0 {yt_dlp => youtube_dlc}/extractor/thisvid.py | 0 youtube_dlc/extractor/threeqsdn.py | 142 + {yt_dlp => youtube_dlc}/extractor/tiktok.py | 11 +- {yt_dlp => youtube_dlc}/extractor/tinypic.py | 0 youtube_dlc/extractor/tmz.py | 56 + {yt_dlp => youtube_dlc}/extractor/tnaflix.py | 0 {yt_dlp => youtube_dlc}/extractor/toggle.py | 112 +- {yt_dlp => youtube_dlc}/extractor/tonline.py | 0 .../extractor/toongoggles.py | 0 {yt_dlp => youtube_dlc}/extractor/toutv.py | 2 +- {yt_dlp => youtube_dlc}/extractor/toypics.py | 0 .../extractor/traileraddict.py | 0 .../extractor/trilulilu.py | 0 {yt_dlp => youtube_dlc}/extractor/trunews.py | 0 {yt_dlp => youtube_dlc}/extractor/trutv.py | 0 {yt_dlp => youtube_dlc}/extractor/tube8.py | 0 {yt_dlp => youtube_dlc}/extractor/tubitv.py | 57 +- {yt_dlp => youtube_dlc}/extractor/tudou.py | 0 {yt_dlp => youtube_dlc}/extractor/tumblr.py | 0 {yt_dlp => youtube_dlc}/extractor/tunein.py | 0 {yt_dlp => youtube_dlc}/extractor/tunepk.py | 0 {yt_dlp => youtube_dlc}/extractor/turbo.py | 0 {yt_dlp => youtube_dlc}/extractor/turner.py | 49 +- {yt_dlp => youtube_dlc}/extractor/tv2.py | 84 +- {yt_dlp => youtube_dlc}/extractor/tv2dk.py | 17 +- {yt_dlp => youtube_dlc}/extractor/tv2hu.py | 0 {yt_dlp => youtube_dlc}/extractor/tv4.py | 37 +- .../extractor/tv5mondeplus.py | 0 youtube_dlc/extractor/tva.py | 57 + .../extractor/tvanouvelles.py | 0 {yt_dlp => youtube_dlc}/extractor/tvc.py | 0 {yt_dlp => youtube_dlc}/extractor/tvigle.py | 0 {yt_dlp => youtube_dlc}/extractor/tvland.py | 0 {yt_dlp => youtube_dlc}/extractor/tvn24.py | 0 {yt_dlp => youtube_dlc}/extractor/tvnet.py | 0 {yt_dlp => youtube_dlc}/extractor/tvnoe.py | 0 {yt_dlp => youtube_dlc}/extractor/tvnow.py | 2 +- {yt_dlp => youtube_dlc}/extractor/tvp.py | 0 {yt_dlp => youtube_dlc}/extractor/tvplay.py | 93 +- {yt_dlp => youtube_dlc}/extractor/tvplayer.py | 0 {yt_dlp => youtube_dlc}/extractor/tweakers.py | 0 .../extractor/twentyfourvideo.py | 0 .../extractor/twentymin.py | 0 .../extractor/twentythreevideo.py | 0 youtube_dlc/extractor/twitcasting.py | 81 + {yt_dlp => youtube_dlc}/extractor/twitch.py | 266 +- {yt_dlp => youtube_dlc}/extractor/twitter.py | 135 +- {yt_dlp => youtube_dlc}/extractor/udemy.py | 4 +- {yt_dlp => youtube_dlc}/extractor/udn.py | 0 {yt_dlp => youtube_dlc}/extractor/ufctv.py | 0 {yt_dlp => youtube_dlc}/extractor/uktvplay.py | 11 +- {yt_dlp => youtube_dlc}/extractor/umg.py | 10 +- {yt_dlp => youtube_dlc}/extractor/unistra.py | 0 {yt_dlp => youtube_dlc}/extractor/unity.py | 0 {yt_dlp => youtube_dlc}/extractor/uol.py | 1 + {yt_dlp => youtube_dlc}/extractor/uplynk.py | 3 +- {yt_dlp => youtube_dlc}/extractor/urort.py | 2 +- {yt_dlp => youtube_dlc}/extractor/urplay.py | 17 +- .../extractor/usanetwork.py | 0 {yt_dlp => youtube_dlc}/extractor/usatoday.py | 0 {yt_dlp => youtube_dlc}/extractor/ustream.py | 2 +- {yt_dlp => youtube_dlc}/extractor/ustudio.py | 0 {yt_dlp => youtube_dlc}/extractor/varzesh3.py | 0 {yt_dlp => youtube_dlc}/extractor/vbox7.py | 0 {yt_dlp => youtube_dlc}/extractor/veehd.py | 0 {yt_dlp => youtube_dlc}/extractor/veoh.py | 0 {yt_dlp => youtube_dlc}/extractor/vesti.py | 0 {yt_dlp => youtube_dlc}/extractor/vevo.py | 0 {yt_dlp => youtube_dlc}/extractor/vgtv.py | 6 - {yt_dlp => youtube_dlc}/extractor/vh1.py | 0 {yt_dlp => youtube_dlc}/extractor/vice.py | 0 {yt_dlp => youtube_dlc}/extractor/vidbit.py | 0 {yt_dlp => youtube_dlc}/extractor/viddler.py | 0 {yt_dlp => youtube_dlc}/extractor/videa.py | 98 +- .../extractor/videodetective.py | 0 .../extractor/videofyme.py | 0 .../extractor/videomore.py | 246 +- .../extractor/videopress.py | 26 +- youtube_dlc/extractor/vidio.py | 77 + {yt_dlp => youtube_dlc}/extractor/vidlii.py | 0 {yt_dlp => youtube_dlc}/extractor/vidme.py | 1 - {yt_dlp => youtube_dlc}/extractor/vidzi.py | 2 +- {yt_dlp => youtube_dlc}/extractor/vier.py | 0 {yt_dlp => youtube_dlc}/extractor/viewlift.py | 2 +- {yt_dlp => youtube_dlc}/extractor/viidea.py | 0 youtube_dlc/extractor/viki.py | 437 ++ {yt_dlp => youtube_dlc}/extractor/vimeo.py | 220 +- {yt_dlp => youtube_dlc}/extractor/vimple.py | 0 {yt_dlp => youtube_dlc}/extractor/vine.py | 0 {yt_dlp => youtube_dlc}/extractor/viqeo.py | 0 {yt_dlp => youtube_dlc}/extractor/viu.py | 151 +- {yt_dlp => youtube_dlc}/extractor/vk.py | 11 - {yt_dlp => youtube_dlc}/extractor/vlive.py | 78 +- .../extractor/vodlocker.py | 0 {yt_dlp => youtube_dlc}/extractor/vodpl.py | 0 .../extractor/vodplatform.py | 0 .../extractor/voicerepublic.py | 0 {yt_dlp => youtube_dlc}/extractor/voot.py | 58 +- {yt_dlp => youtube_dlc}/extractor/voxmedia.py | 26 +- {yt_dlp => youtube_dlc}/extractor/vrak.py | 0 {yt_dlp => youtube_dlc}/extractor/vrt.py | 0 {yt_dlp => youtube_dlc}/extractor/vrv.py | 0 {yt_dlp => youtube_dlc}/extractor/vshare.py | 0 {yt_dlp => youtube_dlc}/extractor/vube.py | 7 +- {yt_dlp => youtube_dlc}/extractor/vuclip.py | 0 youtube_dlc/extractor/vvvvid.py | 158 + .../extractor/vyborymos.py | 0 {yt_dlp => youtube_dlc}/extractor/vzaar.py | 2 +- {yt_dlp => youtube_dlc}/extractor/wakanim.py | 13 +- {yt_dlp => youtube_dlc}/extractor/walla.py | 0 .../extractor/washingtonpost.py | 101 +- youtube_dlc/extractor/wat.py | 157 + {yt_dlp => youtube_dlc}/extractor/watchbox.py | 0 .../extractor/watchindianporn.py | 0 {yt_dlp => youtube_dlc}/extractor/wdr.py | 35 +- .../extractor/webcaster.py | 0 .../extractor/webofstories.py | 0 {yt_dlp => youtube_dlc}/extractor/weibo.py | 0 {yt_dlp => youtube_dlc}/extractor/weiqitv.py | 0 {yt_dlp => youtube_dlc}/extractor/wistia.py | 161 +- .../extractor/worldstarhiphop.py | 0 {yt_dlp => youtube_dlc}/extractor/wsj.py | 0 {yt_dlp => youtube_dlc}/extractor/wwe.py | 0 {yt_dlp => youtube_dlc}/extractor/xbef.py | 0 .../extractor/xboxclips.py | 43 +- .../extractor/xfileshare.py | 8 - {yt_dlp => youtube_dlc}/extractor/xhamster.py | 78 +- {yt_dlp => youtube_dlc}/extractor/xiami.py | 0 {yt_dlp => youtube_dlc}/extractor/ximalaya.py | 0 {yt_dlp => youtube_dlc}/extractor/xminus.py | 0 {yt_dlp => youtube_dlc}/extractor/xnxx.py | 2 +- {yt_dlp => youtube_dlc}/extractor/xstream.py | 2 +- {yt_dlp => youtube_dlc}/extractor/xtube.py | 51 +- {yt_dlp => youtube_dlc}/extractor/xuite.py | 0 {yt_dlp => youtube_dlc}/extractor/xvideos.py | 0 .../extractor/xxxymovies.py | 0 {yt_dlp => youtube_dlc}/extractor/yahoo.py | 109 +- youtube_dlc/extractor/yandexdisk.py | 118 + youtube_dlc/extractor/yandexmusic.py | 313 + youtube_dlc/extractor/yandexvideo.py | 104 + {yt_dlp => youtube_dlc}/extractor/yapfiles.py | 0 {yt_dlp => youtube_dlc}/extractor/yesjapan.py | 0 .../extractor/yinyuetai.py | 0 {yt_dlp => youtube_dlc}/extractor/ynet.py | 0 {yt_dlp => youtube_dlc}/extractor/youjizz.py | 0 {yt_dlp => youtube_dlc}/extractor/youku.py | 4 +- {yt_dlp => youtube_dlc}/extractor/younow.py | 0 {yt_dlp => youtube_dlc}/extractor/youporn.py | 118 +- {yt_dlp => youtube_dlc}/extractor/yourporn.py | 0 .../extractor/yourupload.py | 0 youtube_dlc/extractor/youtube.py | 3716 ++++++++++++ {yt_dlp => youtube_dlc}/extractor/zapiks.py | 0 {yt_dlp => youtube_dlc}/extractor/zaq1.py | 0 {yt_dlp => youtube_dlc}/extractor/zattoo.py | 2 +- {yt_dlp => youtube_dlc}/extractor/zdf.py | 206 +- youtube_dlc/extractor/zingmp3.py | 143 + youtube_dlc/extractor/zoom.py | 82 + {yt_dlp => youtube_dlc}/extractor/zype.py | 13 +- {yt_dlp => youtube_dlc}/jsinterp.py | 0 youtube_dlc/options.py | 950 +++ .../postprocessor/__init__.py | 20 +- youtube_dlc/postprocessor/common.py | 69 + youtube_dlc/postprocessor/embedthumbnail.py | 145 + .../postprocessor/execafterdownload.py | 31 + .../postprocessor/ffmpeg.py | 562 +- .../postprocessor/metadatafromtitle.py | 48 + .../postprocessor/xattrpp.py | 11 +- {yt_dlp => youtube_dlc}/socks.py | 0 .../swfinterp.py | 0 youtube_dlc/update.py | 210 + {yt_dlp => youtube_dlc}/utils.py | 748 +-- {yt_dlp => youtube_dlc}/version.py | 2 +- yt-dlp.cmd | 1 - yt-dlp.sh | 2 - yt_dlp/YoutubeDL.py | 3317 ----------- yt_dlp/compat.py | 256 - yt_dlp/cookies.py | 755 --- yt_dlp/downloader/__init__.py | 111 - yt_dlp/downloader/dash.py | 62 - yt_dlp/downloader/hls.py | 324 - yt_dlp/downloader/mhtml.py | 202 - yt_dlp/downloader/niconico.py | 55 - yt_dlp/downloader/websocket.py | 59 - yt_dlp/downloader/youtube_live_chat.py | 236 - yt_dlp/extractor/abcnews.py | 158 - yt_dlp/extractor/acast.py | 126 - yt_dlp/extractor/adn.py | 269 - yt_dlp/extractor/aenetworks.py | 342 -- yt_dlp/extractor/aljazeera.py | 56 - yt_dlp/extractor/americastestkitchen.py | 159 - yt_dlp/extractor/animelab.py | 285 - .../anvato_token_generator/__init__.py | 7 - .../anvato_token_generator/common.py | 6 - .../extractor/anvato_token_generator/nfl.py | 30 - yt_dlp/extractor/applepodcasts.py | 62 - yt_dlp/extractor/archiveorg.py | 419 -- yt_dlp/extractor/arcpublishing.py | 169 - yt_dlp/extractor/arkena.py | 163 - yt_dlp/extractor/arnes.py | 101 - yt_dlp/extractor/asiancrush.py | 200 - yt_dlp/extractor/audius.py | 275 - yt_dlp/extractor/bandaichannel.py | 37 - yt_dlp/extractor/bfmtv.py | 103 - yt_dlp/extractor/bibeltv.py | 30 - yt_dlp/extractor/bitwave.py | 61 - yt_dlp/extractor/bongacams.py | 60 - yt_dlp/extractor/cbssports.py | 113 - yt_dlp/extractor/comedycentral.py | 51 - yt_dlp/extractor/crackle.py | 245 - yt_dlp/extractor/ctv.py | 52 - yt_dlp/extractor/discoveryplusindia.py | 100 - yt_dlp/extractor/douyin.py | 145 - yt_dlp/extractor/dreisat.py | 43 - yt_dlp/extractor/fancode.py | 187 - yt_dlp/extractor/formula1.py | 27 - yt_dlp/extractor/fujitv.py | 35 - yt_dlp/extractor/funimation.py | 326 - yt_dlp/extractor/gamespot.py | 79 - yt_dlp/extractor/gedidigital.py | 210 - yt_dlp/extractor/googlepodcasts.py | 88 - yt_dlp/extractor/ign.py | 257 - yt_dlp/extractor/iheart.py | 97 - yt_dlp/extractor/itv.py | 195 - yt_dlp/extractor/ketnet.py | 72 - yt_dlp/extractor/khanacademy.py | 107 - yt_dlp/extractor/la7.py | 203 - yt_dlp/extractor/lbry.py | 288 - yt_dlp/extractor/line.py | 229 - yt_dlp/extractor/linuxacademy.py | 253 - yt_dlp/extractor/maoritv.py | 31 - yt_dlp/extractor/medialaan.py | 114 - yt_dlp/extractor/mildom.py | 259 - yt_dlp/extractor/minds.py | 196 - yt_dlp/extractor/mlb.py | 267 - yt_dlp/extractor/mxplayer.py | 171 - yt_dlp/extractor/nba.py | 428 -- yt_dlp/extractor/nebula.py | 238 - yt_dlp/extractor/nfhsnetwork.py | 144 - yt_dlp/extractor/nfl.py | 160 - yt_dlp/extractor/nhk.py | 178 - yt_dlp/extractor/niconico.py | 698 --- yt_dlp/extractor/ninegag.py | 130 - yt_dlp/extractor/nitter.py | 228 - yt_dlp/extractor/nrk.py | 873 --- yt_dlp/extractor/palcomp3.py | 148 - yt_dlp/extractor/parlview.py | 68 - yt_dlp/extractor/phoenix.py | 133 - yt_dlp/extractor/playstuff.py | 65 - yt_dlp/extractor/plutotv.py | 179 - yt_dlp/extractor/pornflip.py | 82 - yt_dlp/extractor/rcs.py | 427 -- yt_dlp/extractor/rcti.py | 242 - yt_dlp/extractor/rtp.py | 100 - yt_dlp/extractor/saitosan.py | 78 - yt_dlp/extractor/samplefocus.py | 100 - yt_dlp/extractor/screencastomatic.py | 51 - yt_dlp/extractor/shemaroome.py | 76 - yt_dlp/extractor/simplecast.py | 160 - yt_dlp/extractor/sky.py | 131 - yt_dlp/extractor/skyit.py | 239 - yt_dlp/extractor/sonyliv.py | 162 - yt_dlp/extractor/sportdeutschland.py | 105 - yt_dlp/extractor/spotify.py | 156 - yt_dlp/extractor/sprout.py | 64 - yt_dlp/extractor/srgssr.py | 256 - yt_dlp/extractor/stitcher.py | 144 - yt_dlp/extractor/storyfire.py | 151 - yt_dlp/extractor/streetvoice.py | 100 - yt_dlp/extractor/stretchinternet.py | 37 - yt_dlp/extractor/telemundo.py | 58 - yt_dlp/extractor/tenplay.py | 89 - yt_dlp/extractor/tf1.py | 87 - yt_dlp/extractor/threeqsdn.py | 166 - yt_dlp/extractor/tmz.py | 157 - yt_dlp/extractor/trovo.py | 196 - yt_dlp/extractor/trovolive.py | 0 yt_dlp/extractor/tv5unis.py | 121 - yt_dlp/extractor/tva.py | 88 - yt_dlp/extractor/tver.py | 61 - yt_dlp/extractor/twitcasting.py | 196 - yt_dlp/extractor/ukcolumn.py | 72 - yt_dlp/extractor/utreon.py | 85 - yt_dlp/extractor/vidio.py | 287 - yt_dlp/extractor/viki.py | 365 -- yt_dlp/extractor/vtm.py | 62 - yt_dlp/extractor/vvvvid.py | 284 - yt_dlp/extractor/wat.py | 112 - yt_dlp/extractor/whowatch.py | 99 - yt_dlp/extractor/wimtv.py | 163 - yt_dlp/extractor/yandexdisk.py | 147 - yt_dlp/extractor/yandexmusic.py | 459 -- yt_dlp/extractor/yandexvideo.py | 144 - yt_dlp/extractor/youtube.py | 4679 --------------- yt_dlp/extractor/zee5.py | 205 - yt_dlp/extractor/zhihu.py | 69 - yt_dlp/extractor/zingmp3.py | 160 - yt_dlp/extractor/zoom.py | 78 - yt_dlp/options.py | 1503 ----- yt_dlp/postprocessor/common.py | 128 - yt_dlp/postprocessor/embedthumbnail.py | 236 - yt_dlp/postprocessor/execafterdownload.py | 40 - yt_dlp/postprocessor/metadatafromfield.py | 74 - .../postprocessor/movefilesafterdownload.py | 54 - yt_dlp/postprocessor/sponskrub.py | 96 - yt_dlp/update.py | 252 - yt_dlp/webvtt.py | 377 -- ytdlp_plugins/extractor/__init__.py | 3 - ytdlp_plugins/extractor/sample.py | 18 - 1098 files changed, 33659 insertions(+), 47570 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .github/workflows/core.yml delete mode 100644 .github/workflows/download.yml create mode 100644 .github/workflows/python-publish.yml.disable delete mode 100644 .github/workflows/quick-test.yml delete mode 100644 .readthedocs.yml create mode 100644 .travis.yml create mode 100644 AUTHORS delete mode 100644 CONTRIBUTORS create mode 100644 ChangeLog delete mode 100644 Changelog.md rename devscripts/{gh-pages.unused => gh-pages}/add-version.py (91%) mode change 100644 => 100755 rename devscripts/{gh-pages.unused => gh-pages}/generate-download.py (100%) mode change 100644 => 100755 rename devscripts/{gh-pages.unused => gh-pages}/sign-versions.py (100%) mode change 100644 => 100755 rename devscripts/{gh-pages.unused => gh-pages}/update-copyright.py (96%) mode change 100644 => 100755 rename devscripts/{gh-pages.unused => gh-pages}/update-feed.py (86%) mode change 100644 => 100755 rename devscripts/{gh-pages.unused => gh-pages}/update-sites.py (88%) mode change 100644 => 100755 create mode 100755 devscripts/install_jython.sh delete mode 100644 devscripts/run_tests.bat delete mode 100644 devscripts/update-version.py delete mode 100644 docs/Changelog.md delete mode 100644 docs/LICENSE.md delete mode 100644 docs/README.md create mode 100644 docs/faq.md create mode 100644 docs/index.rst create mode 100644 docs/module_guide.rst delete mode 100644 docs/requirements.txt delete mode 100644 docs/ytdlp_plugins.md create mode 100644 make_win.bat create mode 100644 pyinst32.py delete mode 100644 pytest.ini delete mode 100644 requirements.txt create mode 100644 scripts/update-version-workflow.py create mode 100644 scripts/update-version.py delete mode 100644 supportedsites.md rename test/{swftests.unused => swftests}/.gitignore (100%) rename test/{swftests.unused => swftests}/ArrayAccess.as (100%) rename test/{swftests.unused => swftests}/ClassCall.as (100%) rename test/{swftests.unused => swftests}/ClassConstruction.as (100%) rename test/{swftests.unused => swftests}/ConstArrayAccess.as (100%) rename test/{swftests.unused => swftests}/ConstantInt.as (100%) rename test/{swftests.unused => swftests}/DictCall.as (100%) rename test/{swftests.unused => swftests}/EqualsOperator.as (100%) rename test/{swftests.unused => swftests}/LocalVars.as (100%) rename test/{swftests.unused => swftests}/MemberAssignment.as (100%) rename test/{swftests.unused => swftests}/NeOperator.as (100%) rename test/{swftests.unused => swftests}/PrivateCall.as (100%) rename test/{swftests.unused => swftests}/PrivateVoidCall.as (100%) rename test/{swftests.unused => swftests}/StaticAssignment.as (100%) rename test/{swftests.unused => swftests}/StaticRetrieval.as (100%) rename test/{swftests.unused => swftests}/StringBasics.as (100%) rename test/{swftests.unused => swftests}/StringCharCodeAt.as (100%) rename test/{swftests.unused => swftests}/StringConversion.as (100%) delete mode 100644 test/test_cookies.py delete mode 100644 test/test_overwrites.py delete mode 100644 test/test_post_hooks.py rename test/{test_swfinterp.py.disabled => test_swfinterp.py} (96%) rename test/{test_unicode_literals.py.disabled => test_unicode_literals.py} (98%) rename test/{test_update.py.disabled => test_update.py} (94%) create mode 100644 test/test_youtube_chapters.py delete mode 100644 test/test_youtube_misc.py delete mode 100644 test/testdata/ism/sintel.Manifest delete mode 100644 test/testdata/m3u8/bipbop_16x9.m3u8 delete mode 100644 test/testdata/m3u8/img_bipbop_adv_example_fmp4.m3u8 create mode 100644 test/testdata/m3u8/pluzz_francetv_11507.m3u8 create mode 100644 test/testdata/m3u8/teamcoco_11995.m3u8 create mode 100644 test/testdata/m3u8/ted_18923.m3u8 create mode 100644 test/testdata/m3u8/toggle_mobile_12211.m3u8 create mode 100644 test/testdata/m3u8/twitch_vod.m3u8 create mode 100644 test/testdata/m3u8/vidio.m3u8 delete mode 100644 test/testdata/mpd/subtitles.mpd delete mode 100644 test/testdata/thumbnails/foo %d bar/foo_%d.webp rename {devscripts => win/icon}/cloud.ico (100%) create mode 100644 win/ver.txt create mode 100644 youtube_dlc/YoutubeDL.py rename {yt_dlp => youtube_dlc}/__init__.py (54%) rename {yt_dlp => youtube_dlc}/__main__.py (68%) rename {yt_dlp => youtube_dlc}/aes.py (100%) rename {yt_dlp => youtube_dlc}/cache.py (98%) create mode 100644 youtube_dlc/compat.py create mode 100644 youtube_dlc/downloader/__init__.py rename {yt_dlp => youtube_dlc}/downloader/common.py (91%) create mode 100644 youtube_dlc/downloader/dash.py rename {yt_dlp => youtube_dlc}/downloader/external.py (59%) rename {yt_dlp => youtube_dlc}/downloader/f4m.py (96%) rename {yt_dlp => youtube_dlc}/downloader/fragment.py (56%) create mode 100644 youtube_dlc/downloader/hls.py rename {yt_dlp => youtube_dlc}/downloader/http.py (94%) rename {yt_dlp => youtube_dlc}/downloader/ism.py (85%) rename {yt_dlp => youtube_dlc}/downloader/rtmp.py (95%) rename {yt_dlp => youtube_dlc}/downloader/rtsp.py (94%) create mode 100644 youtube_dlc/downloader/youtube_live_chat.py rename {yt_dlp => youtube_dlc}/extractor/__init__.py (86%) rename {yt_dlp => youtube_dlc}/extractor/abc.py (100%) create mode 100644 youtube_dlc/extractor/abcnews.py rename {yt_dlp => youtube_dlc}/extractor/abcotvs.py (100%) rename {yt_dlp => youtube_dlc}/extractor/academicearth.py (100%) create mode 100644 youtube_dlc/extractor/acast.py create mode 100644 youtube_dlc/extractor/adn.py rename {yt_dlp => youtube_dlc}/extractor/adobeconnect.py (100%) rename {yt_dlp => youtube_dlc}/extractor/adobepass.py (92%) rename {yt_dlp => youtube_dlc}/extractor/adobetv.py (99%) rename {yt_dlp => youtube_dlc}/extractor/adultswim.py (100%) create mode 100644 youtube_dlc/extractor/aenetworks.py rename {yt_dlp => youtube_dlc}/extractor/afreecatv.py (99%) rename {yt_dlp => youtube_dlc}/extractor/airmozilla.py (100%) rename {yt_dlp => youtube_dlc}/extractor/aliexpress.py (100%) create mode 100644 youtube_dlc/extractor/aljazeera.py rename {yt_dlp => youtube_dlc}/extractor/allocine.py (100%) rename {yt_dlp => youtube_dlc}/extractor/alphaporno.py (100%) rename {yt_dlp => youtube_dlc}/extractor/alura.py (98%) rename {yt_dlp => youtube_dlc}/extractor/amara.py (100%) rename {yt_dlp => youtube_dlc}/extractor/amcnetworks.py (51%) create mode 100644 youtube_dlc/extractor/americastestkitchen.py rename {yt_dlp => youtube_dlc}/extractor/amp.py (96%) rename {yt_dlp => youtube_dlc}/extractor/animeondemand.py (94%) rename {yt_dlp => youtube_dlc}/extractor/anvato.py (74%) rename {yt_dlp => youtube_dlc}/extractor/aol.py (91%) rename {yt_dlp => youtube_dlc}/extractor/apa.py (63%) rename {yt_dlp => youtube_dlc}/extractor/aparat.py (78%) rename {yt_dlp => youtube_dlc}/extractor/appleconnect.py (82%) rename {yt_dlp => youtube_dlc}/extractor/appletrailers.py (99%) create mode 100644 youtube_dlc/extractor/archiveorg.py rename {yt_dlp => youtube_dlc}/extractor/ard.py (84%) create mode 100644 youtube_dlc/extractor/arkena.py rename {yt_dlp => youtube_dlc}/extractor/arte.py (98%) create mode 100644 youtube_dlc/extractor/asiancrush.py rename {yt_dlp => youtube_dlc}/extractor/atresplayer.py (93%) rename {yt_dlp => youtube_dlc}/extractor/atttechchannel.py (100%) rename {yt_dlp => youtube_dlc}/extractor/atvat.py (100%) rename {yt_dlp => youtube_dlc}/extractor/audimedia.py (100%) rename {yt_dlp => youtube_dlc}/extractor/audioboom.py (100%) rename {yt_dlp => youtube_dlc}/extractor/audiomack.py (100%) rename {yt_dlp => youtube_dlc}/extractor/awaan.py (97%) rename {yt_dlp => youtube_dlc}/extractor/aws.py (100%) rename {yt_dlp => youtube_dlc}/extractor/azmedien.py (98%) rename {yt_dlp => youtube_dlc}/extractor/baidu.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bandcamp.py (98%) rename {yt_dlp => youtube_dlc}/extractor/bbc.py (83%) create mode 100644 youtube_dlc/extractor/beampro.py rename {yt_dlp => youtube_dlc}/extractor/beatport.py (97%) rename {yt_dlp => youtube_dlc}/extractor/beeg.py (100%) rename {yt_dlp => youtube_dlc}/extractor/behindkink.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bellmedia.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bet.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bfi.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bigflix.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bild.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bilibili.py (59%) rename {yt_dlp => youtube_dlc}/extractor/biobiochiletv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/biqle.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bitchute.py (95%) rename {yt_dlp => youtube_dlc}/extractor/bleacherreport.py (94%) rename {yt_dlp => youtube_dlc}/extractor/blinkx.py (96%) rename {yt_dlp => youtube_dlc}/extractor/bloomberg.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bokecc.py (97%) rename {yt_dlp => youtube_dlc}/extractor/bostonglobe.py (100%) rename {yt_dlp => youtube_dlc}/extractor/box.py (100%) rename {yt_dlp => youtube_dlc}/extractor/bpb.py (97%) rename {yt_dlp => youtube_dlc}/extractor/br.py (99%) rename {yt_dlp => youtube_dlc}/extractor/bravotv.py (58%) rename {yt_dlp => youtube_dlc}/extractor/breakcom.py (100%) rename {yt_dlp => youtube_dlc}/extractor/brightcove.py (93%) rename {yt_dlp => youtube_dlc}/extractor/businessinsider.py (100%) rename {yt_dlp => youtube_dlc}/extractor/buzzfeed.py (100%) rename {yt_dlp => youtube_dlc}/extractor/byutv.py (88%) rename {yt_dlp => youtube_dlc}/extractor/c56.py (100%) rename {yt_dlp => youtube_dlc}/extractor/camdemy.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cammodels.py (98%) rename {yt_dlp => youtube_dlc}/extractor/camtube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/camwithher.py (100%) rename {yt_dlp => youtube_dlc}/extractor/canalc2.py (100%) rename {yt_dlp => youtube_dlc}/extractor/canalplus.py (98%) rename {yt_dlp => youtube_dlc}/extractor/canvas.py (68%) rename {yt_dlp => youtube_dlc}/extractor/carambatv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cartoonnetwork.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cbc.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cbs.py (81%) rename {yt_dlp => youtube_dlc}/extractor/cbsinteractive.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cbslocal.py (86%) rename {yt_dlp => youtube_dlc}/extractor/cbsnews.py (99%) create mode 100644 youtube_dlc/extractor/cbssports.py rename {yt_dlp => youtube_dlc}/extractor/ccc.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ccma.py (58%) rename {yt_dlp => youtube_dlc}/extractor/cctv.py (99%) rename {yt_dlp => youtube_dlc}/extractor/cda.py (96%) rename {yt_dlp => youtube_dlc}/extractor/ceskatelevize.py (98%) rename {yt_dlp => youtube_dlc}/extractor/channel9.py (99%) rename {yt_dlp => youtube_dlc}/extractor/charlierose.py (100%) rename {yt_dlp => youtube_dlc}/extractor/chaturbate.py (100%) rename {yt_dlp => youtube_dlc}/extractor/chilloutzone.py (100%) rename {yt_dlp => youtube_dlc}/extractor/chirbit.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cinchcast.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cinemax.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ciscolive.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cjsw.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cliphunter.py (100%) rename {yt_dlp => youtube_dlc}/extractor/clippit.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cliprs.py (100%) rename {yt_dlp => youtube_dlc}/extractor/clipsyndicate.py (100%) rename {yt_dlp => youtube_dlc}/extractor/closertotruth.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cloudflarestream.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cloudy.py (100%) rename {yt_dlp => youtube_dlc}/extractor/clubic.py (100%) rename {yt_dlp => youtube_dlc}/extractor/clyp.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cmt.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cnbc.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cnn.py (98%) create mode 100644 youtube_dlc/extractor/comedycentral.py rename {yt_dlp => youtube_dlc}/extractor/common.py (71%) rename {yt_dlp => youtube_dlc}/extractor/commonmistakes.py (89%) rename {yt_dlp => youtube_dlc}/extractor/commonprotocols.py (82%) rename {yt_dlp => youtube_dlc}/extractor/condenast.py (100%) rename {yt_dlp => youtube_dlc}/extractor/contv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/corus.py (98%) rename {yt_dlp => youtube_dlc}/extractor/coub.py (95%) rename {yt_dlp => youtube_dlc}/extractor/cracked.py (100%) create mode 100644 youtube_dlc/extractor/crackle.py rename {yt_dlp => youtube_dlc}/extractor/crooksandliars.py (100%) rename {yt_dlp => youtube_dlc}/extractor/crunchyroll.py (97%) rename {yt_dlp => youtube_dlc}/extractor/cspan.py (77%) rename {yt_dlp => youtube_dlc}/extractor/ctsnews.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ctvnews.py (100%) rename {yt_dlp => youtube_dlc}/extractor/cultureunplugged.py (100%) rename {yt_dlp => youtube_dlc}/extractor/curiositystream.py (51%) rename {yt_dlp => youtube_dlc}/extractor/cwtv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dailymail.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dailymotion.py (98%) rename {yt_dlp => youtube_dlc}/extractor/daum.py (99%) rename {yt_dlp => youtube_dlc}/extractor/dbtv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dctp.py (100%) rename {yt_dlp => youtube_dlc}/extractor/deezer.py (96%) rename {yt_dlp => youtube_dlc}/extractor/defense.py (100%) rename {yt_dlp => youtube_dlc}/extractor/democracynow.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dfb.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dhm.py (100%) rename {yt_dlp => youtube_dlc}/extractor/digg.py (100%) rename {yt_dlp => youtube_dlc}/extractor/digiteka.py (100%) rename {yt_dlp => youtube_dlc}/extractor/discovery.py (100%) rename {yt_dlp => youtube_dlc}/extractor/discoverygo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/discoverynetworks.py (100%) rename {yt_dlp => youtube_dlc}/extractor/discoveryvr.py (100%) rename {yt_dlp => youtube_dlc}/extractor/disney.py (99%) rename {yt_dlp => youtube_dlc}/extractor/dispeak.py (76%) rename {yt_dlp => youtube_dlc}/extractor/dlive.py (100%) rename {yt_dlp => youtube_dlc}/extractor/doodstream.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dotsub.py (100%) rename {yt_dlp => youtube_dlc}/extractor/douyutv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dplay.py (56%) rename {yt_dlp => youtube_dlc}/extractor/drbonanza.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dropbox.py (90%) rename {yt_dlp => youtube_dlc}/extractor/drtuber.py (100%) rename {yt_dlp => youtube_dlc}/extractor/drtv.py (98%) rename {yt_dlp => youtube_dlc}/extractor/dtube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/duboku.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dumpert.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dvtv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/dw.py (100%) rename {yt_dlp => youtube_dlc}/extractor/eagleplatform.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ebaumsworld.py (100%) rename {yt_dlp => youtube_dlc}/extractor/echomsk.py (100%) rename {yt_dlp => youtube_dlc}/extractor/egghead.py (74%) rename {yt_dlp => youtube_dlc}/extractor/ehow.py (100%) rename {yt_dlp => youtube_dlc}/extractor/eighttracks.py (85%) rename {yt_dlp => youtube_dlc}/extractor/einthusan.py (100%) rename {yt_dlp => youtube_dlc}/extractor/eitb.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ellentube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/elonet.py (52%) rename {yt_dlp => youtube_dlc}/extractor/elpais.py (100%) rename {yt_dlp => youtube_dlc}/extractor/embedly.py (100%) rename {yt_dlp => youtube_dlc}/extractor/engadget.py (100%) rename {yt_dlp => youtube_dlc}/extractor/eporner.py (89%) rename {yt_dlp => youtube_dlc}/extractor/eroprofile.py (86%) rename {yt_dlp => youtube_dlc}/extractor/escapist.py (100%) rename {yt_dlp => youtube_dlc}/extractor/espn.py (99%) rename {yt_dlp => youtube_dlc}/extractor/esri.py (100%) rename {yt_dlp => youtube_dlc}/extractor/europa.py (100%) rename {yt_dlp => youtube_dlc}/extractor/everyonesmixtape.py (100%) rename {yt_dlp => youtube_dlc}/extractor/expotv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/expressen.py (100%) rename {yt_dlp => youtube_dlc}/extractor/extractors.py (87%) rename {yt_dlp => youtube_dlc}/extractor/extremetube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/eyedotv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/facebook.py (59%) rename {yt_dlp => youtube_dlc}/extractor/faz.py (100%) rename {yt_dlp => youtube_dlc}/extractor/fc2.py (100%) rename {yt_dlp => youtube_dlc}/extractor/fczenit.py (100%) rename {yt_dlp => youtube_dlc}/extractor/filmon.py (100%) rename {yt_dlp => youtube_dlc}/extractor/filmweb.py (100%) rename {yt_dlp => youtube_dlc}/extractor/firsttv.py (99%) rename {yt_dlp => youtube_dlc}/extractor/fivemin.py (100%) rename {yt_dlp => youtube_dlc}/extractor/fivetv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/flickr.py (98%) rename {yt_dlp => youtube_dlc}/extractor/folketinget.py (100%) rename {yt_dlp => youtube_dlc}/extractor/footyroom.py (100%) create mode 100644 youtube_dlc/extractor/formula1.py rename {yt_dlp => youtube_dlc}/extractor/fourtube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/fox.py (100%) rename {yt_dlp => youtube_dlc}/extractor/fox9.py (100%) rename {yt_dlp => youtube_dlc}/extractor/foxgay.py (100%) rename {yt_dlp => youtube_dlc}/extractor/foxnews.py (100%) rename {yt_dlp => youtube_dlc}/extractor/foxsports.py (100%) rename {yt_dlp => youtube_dlc}/extractor/franceculture.py (74%) rename {yt_dlp => youtube_dlc}/extractor/franceinter.py (100%) rename {yt_dlp => youtube_dlc}/extractor/francetv.py (92%) rename {yt_dlp => youtube_dlc}/extractor/freesound.py (100%) rename {yt_dlp => youtube_dlc}/extractor/freespeech.py (100%) rename {yt_dlp => youtube_dlc}/extractor/freshlive.py (100%) rename {yt_dlp => youtube_dlc}/extractor/frontendmasters.py (100%) create mode 100644 youtube_dlc/extractor/funimation.py rename {yt_dlp => youtube_dlc}/extractor/funk.py (100%) rename {yt_dlp => youtube_dlc}/extractor/fusion.py (100%) rename {yt_dlp => youtube_dlc}/extractor/fxnetworks.py (100%) rename {yt_dlp => youtube_dlc}/extractor/gaia.py (100%) rename {yt_dlp => youtube_dlc}/extractor/gameinformer.py (100%) create mode 100644 youtube_dlc/extractor/gamespot.py rename {yt_dlp => youtube_dlc}/extractor/gamestar.py (100%) rename {yt_dlp => youtube_dlc}/extractor/gaskrank.py (100%) rename {yt_dlp => youtube_dlc}/extractor/gazeta.py (100%) rename {yt_dlp => youtube_dlc}/extractor/gdcvault.py (58%) rename {yt_dlp => youtube_dlc}/extractor/generic.py (92%) rename {yt_dlp => youtube_dlc}/extractor/gfycat.py (100%) rename {yt_dlp => youtube_dlc}/extractor/giantbomb.py (100%) rename {yt_dlp => youtube_dlc}/extractor/giga.py (100%) rename {yt_dlp => youtube_dlc}/extractor/gigya.py (100%) rename {yt_dlp => youtube_dlc}/extractor/glide.py (100%) rename {yt_dlp => youtube_dlc}/extractor/globo.py (99%) rename {yt_dlp => youtube_dlc}/extractor/go.py (77%) rename {yt_dlp => youtube_dlc}/extractor/godtube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/golem.py (100%) rename {yt_dlp => youtube_dlc}/extractor/googledrive.py (95%) create mode 100644 youtube_dlc/extractor/googleplus.py rename {yt_dlp => youtube_dlc}/extractor/googlesearch.py (100%) rename {yt_dlp => youtube_dlc}/extractor/goshgay.py (100%) rename {yt_dlp => youtube_dlc}/extractor/gputechconf.py (100%) rename {yt_dlp => youtube_dlc}/extractor/groupon.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hbo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hearthisat.py (98%) rename {yt_dlp => youtube_dlc}/extractor/heise.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hellporno.py (100%) rename {yt_dlp => youtube_dlc}/extractor/helsinki.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hentaistigma.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hgtv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hidive.py (100%) rename {yt_dlp => youtube_dlc}/extractor/historicfilms.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hitbox.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hitrecord.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hketv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hornbunny.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hotnewhiphop.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hotstar.py (76%) rename {yt_dlp => youtube_dlc}/extractor/howcast.py (100%) rename {yt_dlp => youtube_dlc}/extractor/howstuffworks.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hrfensehen.py (98%) rename {yt_dlp => youtube_dlc}/extractor/hrti.py (100%) rename {yt_dlp => youtube_dlc}/extractor/huajiao.py (100%) rename {yt_dlp => youtube_dlc}/extractor/huffpost.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hungama.py (100%) rename {yt_dlp => youtube_dlc}/extractor/hypem.py (100%) create mode 100644 youtube_dlc/extractor/ign.py rename {yt_dlp => youtube_dlc}/extractor/imdb.py (100%) rename {yt_dlp => youtube_dlc}/extractor/imggaming.py (98%) rename {yt_dlp => youtube_dlc}/extractor/imgur.py (96%) rename {yt_dlp => youtube_dlc}/extractor/ina.py (93%) rename {yt_dlp => youtube_dlc}/extractor/inc.py (100%) rename {yt_dlp => youtube_dlc}/extractor/indavideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/infoq.py (100%) rename {yt_dlp => youtube_dlc}/extractor/instagram.py (72%) rename {yt_dlp => youtube_dlc}/extractor/internazionale.py (100%) rename {yt_dlp => youtube_dlc}/extractor/internetvideoarchive.py (100%) rename {yt_dlp => youtube_dlc}/extractor/iprima.py (98%) rename {yt_dlp => youtube_dlc}/extractor/iqiyi.py (98%) rename {yt_dlp => youtube_dlc}/extractor/ir90tv.py (100%) create mode 100644 youtube_dlc/extractor/itv.py rename {yt_dlp => youtube_dlc}/extractor/ivi.py (97%) rename {yt_dlp => youtube_dlc}/extractor/ivideon.py (100%) rename {yt_dlp => youtube_dlc}/extractor/iwara.py (100%) rename {yt_dlp => youtube_dlc}/extractor/izlesene.py (100%) rename {yt_dlp => youtube_dlc}/extractor/jamendo.py (79%) rename {yt_dlp => youtube_dlc}/extractor/jeuxvideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/joj.py (100%) rename {yt_dlp => youtube_dlc}/extractor/jove.py (100%) rename {yt_dlp => youtube_dlc}/extractor/jwplatform.py (78%) rename {yt_dlp => youtube_dlc}/extractor/kakao.py (100%) rename {yt_dlp => youtube_dlc}/extractor/kaltura.py (98%) rename {yt_dlp => youtube_dlc}/extractor/kanalplay.py (100%) rename {yt_dlp => youtube_dlc}/extractor/kankan.py (100%) rename {yt_dlp => youtube_dlc}/extractor/karaoketv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/karrierevideos.py (100%) rename {yt_dlp => youtube_dlc}/extractor/keezmovies.py (99%) create mode 100644 youtube_dlc/extractor/ketnet.py create mode 100644 youtube_dlc/extractor/khanacademy.py rename {yt_dlp => youtube_dlc}/extractor/kickstarter.py (100%) rename {yt_dlp => youtube_dlc}/extractor/kinja.py (100%) rename {yt_dlp => youtube_dlc}/extractor/kinopoisk.py (100%) rename {yt_dlp => youtube_dlc}/extractor/konserthusetplay.py (100%) rename {yt_dlp => youtube_dlc}/extractor/krasview.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ku6.py (100%) rename {yt_dlp => youtube_dlc}/extractor/kusi.py (100%) rename {yt_dlp => youtube_dlc}/extractor/kuwo.py (99%) create mode 100644 youtube_dlc/extractor/la7.py rename {yt_dlp => youtube_dlc}/extractor/laola1tv.py (100%) create mode 100644 youtube_dlc/extractor/lbry.py rename {yt_dlp => youtube_dlc}/extractor/lci.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lcp.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lecture2go.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lecturio.py (100%) rename {yt_dlp => youtube_dlc}/extractor/leeco.py (99%) rename {yt_dlp => youtube_dlc}/extractor/lego.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lemonde.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lenta.py (100%) rename {yt_dlp => youtube_dlc}/extractor/libraryofcongress.py (100%) rename {yt_dlp => youtube_dlc}/extractor/libsyn.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lifenews.py (99%) rename {yt_dlp => youtube_dlc}/extractor/limelight.py (97%) create mode 100644 youtube_dlc/extractor/line.py rename {yt_dlp => youtube_dlc}/extractor/linkedin.py (96%) create mode 100644 youtube_dlc/extractor/linuxacademy.py rename {yt_dlp => youtube_dlc}/extractor/litv.py (98%) rename {yt_dlp => youtube_dlc}/extractor/livejournal.py (100%) create mode 100644 youtube_dlc/extractor/liveleak.py rename {yt_dlp => youtube_dlc}/extractor/livestream.py (99%) rename {yt_dlp => youtube_dlc}/extractor/lnkgo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/localnews8.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lovehomeporn.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lrt.py (100%) rename {yt_dlp => youtube_dlc}/extractor/lynda.py (99%) rename {yt_dlp => youtube_dlc}/extractor/m6.py (100%) rename {yt_dlp => youtube_dlc}/extractor/magentamusik360.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mailru.py (100%) rename {yt_dlp => youtube_dlc}/extractor/malltv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mangomolo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/manyvids.py (100%) rename {yt_dlp => youtube_dlc}/extractor/markiza.py (100%) rename {yt_dlp => youtube_dlc}/extractor/massengeschmacktv.py (97%) rename {yt_dlp => youtube_dlc}/extractor/matchtv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mdr.py (75%) rename {yt_dlp => youtube_dlc}/extractor/medaltv.py (87%) create mode 100644 youtube_dlc/extractor/medialaan.py rename {yt_dlp => youtube_dlc}/extractor/mediaset.py (73%) rename {yt_dlp => youtube_dlc}/extractor/mediasite.py (85%) rename {yt_dlp => youtube_dlc}/extractor/medici.py (100%) rename {yt_dlp => youtube_dlc}/extractor/megaphone.py (100%) rename {yt_dlp => youtube_dlc}/extractor/meipai.py (100%) rename {yt_dlp => youtube_dlc}/extractor/melonvod.py (100%) rename {yt_dlp => youtube_dlc}/extractor/meta.py (100%) rename {yt_dlp => youtube_dlc}/extractor/metacafe.py (99%) rename {yt_dlp => youtube_dlc}/extractor/metacritic.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mgoon.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mgtv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/miaopai.py (100%) rename {yt_dlp => youtube_dlc}/extractor/microsoftvirtualacademy.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ministrygrid.py (100%) rename {yt_dlp => youtube_dlc}/extractor/minoto.py (100%) rename {yt_dlp => youtube_dlc}/extractor/miomio.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mit.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mitele.py (64%) rename {yt_dlp => youtube_dlc}/extractor/mixcloud.py (95%) create mode 100644 youtube_dlc/extractor/mlb.py rename {yt_dlp => youtube_dlc}/extractor/mnet.py (100%) rename {yt_dlp => youtube_dlc}/extractor/moevideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mofosex.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mojvideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/morningstar.py (100%) rename {yt_dlp => youtube_dlc}/extractor/motherless.py (83%) rename {yt_dlp => youtube_dlc}/extractor/motorsport.py (100%) rename {yt_dlp => youtube_dlc}/extractor/movieclips.py (100%) rename {yt_dlp => youtube_dlc}/extractor/moviezine.py (100%) rename {yt_dlp => youtube_dlc}/extractor/movingimage.py (100%) rename {yt_dlp => youtube_dlc}/extractor/msn.py (99%) rename {yt_dlp => youtube_dlc}/extractor/mtv.py (70%) rename {yt_dlp => youtube_dlc}/extractor/muenchentv.py (97%) rename {yt_dlp => youtube_dlc}/extractor/mwave.py (100%) rename {yt_dlp => youtube_dlc}/extractor/mychannels.py (100%) rename {yt_dlp => youtube_dlc}/extractor/myspace.py (100%) rename {yt_dlp => youtube_dlc}/extractor/myspass.py (100%) rename {yt_dlp => youtube_dlc}/extractor/myvi.py (100%) rename {yt_dlp => youtube_dlc}/extractor/myvideoge.py (100%) rename {yt_dlp => youtube_dlc}/extractor/myvidster.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nationalgeographic.py (100%) rename {yt_dlp => youtube_dlc}/extractor/naver.py (100%) create mode 100644 youtube_dlc/extractor/nba.py rename {yt_dlp => youtube_dlc}/extractor/nbc.py (88%) rename {yt_dlp => youtube_dlc}/extractor/ndr.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ndtv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nerdcubed.py (100%) rename {yt_dlp => youtube_dlc}/extractor/neteasemusic.py (99%) rename {yt_dlp => youtube_dlc}/extractor/netzkino.py (100%) rename {yt_dlp => youtube_dlc}/extractor/newgrounds.py (100%) rename {yt_dlp => youtube_dlc}/extractor/newstube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nextmedia.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nexx.py (100%) create mode 100644 youtube_dlc/extractor/nfl.py create mode 100644 youtube_dlc/extractor/nhk.py rename {yt_dlp => youtube_dlc}/extractor/nhl.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nick.py (72%) create mode 100644 youtube_dlc/extractor/niconico.py rename {yt_dlp => youtube_dlc}/extractor/ninecninemedia.py (86%) create mode 100644 youtube_dlc/extractor/ninegag.py rename {yt_dlp => youtube_dlc}/extractor/ninenow.py (97%) rename {yt_dlp => youtube_dlc}/extractor/nintendo.py (100%) create mode 100644 youtube_dlc/extractor/nitter.py rename {yt_dlp => youtube_dlc}/extractor/njpwworld.py (57%) rename {yt_dlp => youtube_dlc}/extractor/nobelprize.py (100%) rename {yt_dlp => youtube_dlc}/extractor/noco.py (99%) rename {yt_dlp => youtube_dlc}/extractor/nonktube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/noovo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/normalboots.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nosvideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nova.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nowness.py (98%) rename {yt_dlp => youtube_dlc}/extractor/noz.py (100%) rename {yt_dlp => youtube_dlc}/extractor/npo.py (99%) rename {yt_dlp => youtube_dlc}/extractor/npr.py (100%) create mode 100644 youtube_dlc/extractor/nrk.py rename {yt_dlp => youtube_dlc}/extractor/nrl.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ntvcojp.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ntvde.py (98%) rename {yt_dlp => youtube_dlc}/extractor/ntvru.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nuevo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nuvid.py (100%) rename {yt_dlp => youtube_dlc}/extractor/nytimes.py (96%) rename {yt_dlp => youtube_dlc}/extractor/nzz.py (100%) rename {yt_dlp => youtube_dlc}/extractor/odatv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/odnoklassniki.py (97%) rename {yt_dlp => youtube_dlc}/extractor/oktoberfesttv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/once.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ondemandkorea.py (100%) rename {yt_dlp => youtube_dlc}/extractor/onet.py (99%) rename {yt_dlp => youtube_dlc}/extractor/onionstudios.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ooyala.py (99%) rename {yt_dlp => youtube_dlc}/extractor/openload.py (98%) rename {yt_dlp => youtube_dlc}/extractor/ora.py (98%) rename {yt_dlp => youtube_dlc}/extractor/orf.py (95%) rename {yt_dlp => youtube_dlc}/extractor/outsidetv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/packtpub.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pandoratv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/parliamentliveuk.py (100%) rename {yt_dlp => youtube_dlc}/extractor/patreon.py (80%) rename {yt_dlp => youtube_dlc}/extractor/pbs.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pearvideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/peertube.py (94%) rename {yt_dlp => youtube_dlc}/extractor/people.py (100%) rename {yt_dlp => youtube_dlc}/extractor/performgroup.py (100%) rename {yt_dlp => youtube_dlc}/extractor/periscope.py (96%) rename {yt_dlp => youtube_dlc}/extractor/philharmoniedeparis.py (98%) create mode 100644 youtube_dlc/extractor/phoenix.py rename {yt_dlp => youtube_dlc}/extractor/photobucket.py (100%) rename {yt_dlp => youtube_dlc}/extractor/picarto.py (50%) rename {yt_dlp => youtube_dlc}/extractor/piksel.py (60%) rename {yt_dlp => youtube_dlc}/extractor/pinkbike.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pinterest.py (97%) rename {yt_dlp => youtube_dlc}/extractor/pladform.py (100%) rename {yt_dlp => youtube_dlc}/extractor/platzi.py (100%) rename {yt_dlp => youtube_dlc}/extractor/playfm.py (100%) rename {yt_dlp => youtube_dlc}/extractor/playplustv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/plays.py (100%) rename {yt_dlp => youtube_dlc}/extractor/playtvak.py (99%) rename {yt_dlp => youtube_dlc}/extractor/playvid.py (100%) rename {yt_dlp => youtube_dlc}/extractor/playwire.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pluralsight.py (98%) rename {yt_dlp => youtube_dlc}/extractor/podomatic.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pokemon.py (95%) rename {yt_dlp => youtube_dlc}/extractor/polskieradio.py (100%) rename {yt_dlp => youtube_dlc}/extractor/popcorntimes.py (100%) rename {yt_dlp => youtube_dlc}/extractor/popcorntv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/porn91.py (100%) rename {yt_dlp => youtube_dlc}/extractor/porncom.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pornhd.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pornhub.py (66%) rename {yt_dlp => youtube_dlc}/extractor/pornotube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pornovoisines.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pornoxo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/presstv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/prosiebensat1.py (99%) rename {yt_dlp => youtube_dlc}/extractor/puhutv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/puls4.py (100%) rename {yt_dlp => youtube_dlc}/extractor/pyvideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/qqmusic.py (99%) rename {yt_dlp => youtube_dlc}/extractor/r7.py (100%) rename {yt_dlp => youtube_dlc}/extractor/radiobremen.py (100%) rename {yt_dlp => youtube_dlc}/extractor/radiocanada.py (100%) rename {yt_dlp => youtube_dlc}/extractor/radiode.py (100%) rename {yt_dlp => youtube_dlc}/extractor/radiofrance.py (98%) rename {yt_dlp => youtube_dlc}/extractor/radiojavan.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rai.py (73%) rename {yt_dlp => youtube_dlc}/extractor/raywenderlich.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rbmaradio.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rds.py (79%) rename {yt_dlp => youtube_dlc}/extractor/redbulltv.py (98%) rename {yt_dlp => youtube_dlc}/extractor/reddit.py (76%) rename {yt_dlp => youtube_dlc}/extractor/redtube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/regiotv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rentv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/restudy.py (100%) rename {yt_dlp => youtube_dlc}/extractor/reuters.py (100%) rename {yt_dlp => youtube_dlc}/extractor/reverbnation.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rice.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rmcdecouverte.py (63%) rename {yt_dlp => youtube_dlc}/extractor/ro220.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rockstargames.py (100%) rename {yt_dlp => youtube_dlc}/extractor/roosterteeth.py (85%) rename {yt_dlp => youtube_dlc}/extractor/rottentomatoes.py (100%) rename {yt_dlp => youtube_dlc}/extractor/roxwel.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rozhlas.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rtbf.py (98%) rename {yt_dlp => youtube_dlc}/extractor/rte.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rtl2.py (99%) rename {yt_dlp => youtube_dlc}/extractor/rtlnl.py (100%) create mode 100644 youtube_dlc/extractor/rtp.py rename {yt_dlp => youtube_dlc}/extractor/rts.py (93%) rename {yt_dlp => youtube_dlc}/extractor/rtve.py (52%) rename {yt_dlp => youtube_dlc}/extractor/rtvnh.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rtvs.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ruhd.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rumble.py (88%) rename {yt_dlp => youtube_dlc}/extractor/rutube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/rutv.py (98%) rename {yt_dlp => youtube_dlc}/extractor/ruutu.py (62%) rename {yt_dlp => youtube_dlc}/extractor/ruv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/safari.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sapo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/savefrom.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sbs.py (79%) rename {yt_dlp => youtube_dlc}/extractor/screencast.py (100%) create mode 100644 youtube_dlc/extractor/screencastomatic.py rename {yt_dlp => youtube_dlc}/extractor/scrippsnetworks.py (100%) rename {yt_dlp => youtube_dlc}/extractor/scte.py (100%) rename {yt_dlp => youtube_dlc}/extractor/seeker.py (100%) rename {yt_dlp => youtube_dlc}/extractor/senateisvp.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sendtonews.py (94%) rename {yt_dlp => youtube_dlc}/extractor/servus.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sevenplus.py (74%) rename {yt_dlp => youtube_dlc}/extractor/sexu.py (100%) rename {yt_dlp => youtube_dlc}/extractor/seznamzpravy.py (100%) rename {yt_dlp => youtube_dlc}/extractor/shahid.py (84%) rename {yt_dlp => youtube_dlc}/extractor/shared.py (96%) rename {yt_dlp => youtube_dlc}/extractor/showroomlive.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sina.py (96%) rename {yt_dlp => youtube_dlc}/extractor/sixplay.py (100%) create mode 100644 youtube_dlc/extractor/sky.py create mode 100644 youtube_dlc/extractor/skyitalia.py rename {yt_dlp => youtube_dlc}/extractor/skylinewebcams.py (100%) rename {yt_dlp => youtube_dlc}/extractor/skynewsarabia.py (100%) rename {yt_dlp => youtube_dlc}/extractor/slideshare.py (100%) rename {yt_dlp => youtube_dlc}/extractor/slideslive.py (50%) rename {yt_dlp => youtube_dlc}/extractor/slutload.py (100%) create mode 100644 youtube_dlc/extractor/smotri.py rename {yt_dlp => youtube_dlc}/extractor/snotr.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sohu.py (99%) create mode 100644 youtube_dlc/extractor/sonyliv.py rename {yt_dlp => youtube_dlc}/extractor/soundcloud.py (94%) rename {yt_dlp => youtube_dlc}/extractor/soundgasm.py (100%) rename {yt_dlp => youtube_dlc}/extractor/southpark.py (81%) rename {yt_dlp => youtube_dlc}/extractor/spankbang.py (83%) rename {yt_dlp => youtube_dlc}/extractor/spankwire.py (98%) rename {yt_dlp => youtube_dlc}/extractor/spiegel.py (100%) rename {yt_dlp => youtube_dlc}/extractor/spiegeltv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/spike.py (64%) rename {yt_dlp => youtube_dlc}/extractor/sport5.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sportbox.py (100%) create mode 100644 youtube_dlc/extractor/sportdeutschland.py rename {yt_dlp => youtube_dlc}/extractor/spreaker.py (100%) rename {yt_dlp => youtube_dlc}/extractor/springboardplatform.py (100%) create mode 100644 youtube_dlc/extractor/sprout.py create mode 100644 youtube_dlc/extractor/srgssr.py rename {yt_dlp => youtube_dlc}/extractor/srmediathek.py (100%) rename {yt_dlp => youtube_dlc}/extractor/stanfordoc.py (100%) rename {yt_dlp => youtube_dlc}/extractor/steam.py (98%) create mode 100644 youtube_dlc/extractor/stitcher.py create mode 100644 youtube_dlc/extractor/storyfire.py rename {yt_dlp => youtube_dlc}/extractor/streamable.py (100%) rename {yt_dlp => youtube_dlc}/extractor/streamcloud.py (93%) rename {yt_dlp => youtube_dlc}/extractor/streamcz.py (100%) create mode 100644 youtube_dlc/extractor/streetvoice.py create mode 100644 youtube_dlc/extractor/stretchinternet.py rename {yt_dlp => youtube_dlc}/extractor/stv.py (59%) rename {yt_dlp => youtube_dlc}/extractor/sunporno.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sverigesradio.py (100%) rename {yt_dlp => youtube_dlc}/extractor/svt.py (92%) rename {yt_dlp => youtube_dlc}/extractor/swrmediathek.py (100%) rename {yt_dlp => youtube_dlc}/extractor/syfy.py (100%) rename {yt_dlp => youtube_dlc}/extractor/sztvhu.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tagesschau.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tass.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tastytrade.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tbs.py (92%) rename {yt_dlp => youtube_dlc}/extractor/tdslifeway.py (100%) rename {yt_dlp => youtube_dlc}/extractor/teachable.py (98%) rename {yt_dlp => youtube_dlc}/extractor/teachertube.py (100%) rename {yt_dlp => youtube_dlc}/extractor/teachingchannel.py (100%) rename {yt_dlp => youtube_dlc}/extractor/teamcoco.py (100%) rename {yt_dlp => youtube_dlc}/extractor/teamtreehouse.py (100%) rename {yt_dlp => youtube_dlc}/extractor/techtalks.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ted.py (95%) rename {yt_dlp => youtube_dlc}/extractor/tele13.py (98%) rename {yt_dlp => youtube_dlc}/extractor/tele5.py (100%) rename {yt_dlp => youtube_dlc}/extractor/telebruxelles.py (100%) rename {yt_dlp => youtube_dlc}/extractor/telecinco.py (68%) rename {yt_dlp => youtube_dlc}/extractor/telegraaf.py (100%) rename {yt_dlp => youtube_dlc}/extractor/telemb.py (98%) rename {yt_dlp => youtube_dlc}/extractor/telequebec.py (53%) rename {yt_dlp => youtube_dlc}/extractor/teletask.py (100%) rename {yt_dlp => youtube_dlc}/extractor/telewebion.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tennistv.py (92%) create mode 100644 youtube_dlc/extractor/tenplay.py rename {yt_dlp => youtube_dlc}/extractor/testurl.py (100%) create mode 100644 youtube_dlc/extractor/tf1.py rename {yt_dlp => youtube_dlc}/extractor/tfo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/theintercept.py (100%) rename {yt_dlp => youtube_dlc}/extractor/theplatform.py (99%) rename {yt_dlp => youtube_dlc}/extractor/thescene.py (100%) rename {yt_dlp => youtube_dlc}/extractor/thestar.py (100%) rename {yt_dlp => youtube_dlc}/extractor/thesun.py (100%) rename {yt_dlp => youtube_dlc}/extractor/theweatherchannel.py (64%) rename {yt_dlp => youtube_dlc}/extractor/thisamericanlife.py (100%) rename {yt_dlp => youtube_dlc}/extractor/thisav.py (100%) rename {yt_dlp => youtube_dlc}/extractor/thisoldhouse.py (100%) rename {yt_dlp => youtube_dlc}/extractor/thisvid.py (100%) create mode 100644 youtube_dlc/extractor/threeqsdn.py rename {yt_dlp => youtube_dlc}/extractor/tiktok.py (94%) rename {yt_dlp => youtube_dlc}/extractor/tinypic.py (100%) create mode 100644 youtube_dlc/extractor/tmz.py rename {yt_dlp => youtube_dlc}/extractor/tnaflix.py (100%) rename {yt_dlp => youtube_dlc}/extractor/toggle.py (66%) rename {yt_dlp => youtube_dlc}/extractor/tonline.py (100%) rename {yt_dlp => youtube_dlc}/extractor/toongoggles.py (100%) rename {yt_dlp => youtube_dlc}/extractor/toutv.py (97%) rename {yt_dlp => youtube_dlc}/extractor/toypics.py (100%) rename {yt_dlp => youtube_dlc}/extractor/traileraddict.py (100%) rename {yt_dlp => youtube_dlc}/extractor/trilulilu.py (100%) rename {yt_dlp => youtube_dlc}/extractor/trunews.py (100%) rename {yt_dlp => youtube_dlc}/extractor/trutv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tube8.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tubitv.py (58%) rename {yt_dlp => youtube_dlc}/extractor/tudou.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tumblr.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tunein.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tunepk.py (100%) rename {yt_dlp => youtube_dlc}/extractor/turbo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/turner.py (85%) rename {yt_dlp => youtube_dlc}/extractor/tv2.py (71%) rename {yt_dlp => youtube_dlc}/extractor/tv2dk.py (92%) rename {yt_dlp => youtube_dlc}/extractor/tv2hu.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tv4.py (79%) rename {yt_dlp => youtube_dlc}/extractor/tv5mondeplus.py (100%) create mode 100644 youtube_dlc/extractor/tva.py rename {yt_dlp => youtube_dlc}/extractor/tvanouvelles.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvc.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvigle.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvland.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvn24.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvnet.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvnoe.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvnow.py (99%) rename {yt_dlp => youtube_dlc}/extractor/tvp.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tvplay.py (86%) rename {yt_dlp => youtube_dlc}/extractor/tvplayer.py (100%) rename {yt_dlp => youtube_dlc}/extractor/tweakers.py (100%) rename {yt_dlp => youtube_dlc}/extractor/twentyfourvideo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/twentymin.py (100%) rename {yt_dlp => youtube_dlc}/extractor/twentythreevideo.py (100%) create mode 100644 youtube_dlc/extractor/twitcasting.py rename {yt_dlp => youtube_dlc}/extractor/twitch.py (87%) rename {yt_dlp => youtube_dlc}/extractor/twitter.py (87%) rename {yt_dlp => youtube_dlc}/extractor/udemy.py (99%) rename {yt_dlp => youtube_dlc}/extractor/udn.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ufctv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/uktvplay.py (72%) rename {yt_dlp => youtube_dlc}/extractor/umg.py (89%) rename {yt_dlp => youtube_dlc}/extractor/unistra.py (100%) rename {yt_dlp => youtube_dlc}/extractor/unity.py (100%) rename {yt_dlp => youtube_dlc}/extractor/uol.py (99%) rename {yt_dlp => youtube_dlc}/extractor/uplynk.py (96%) rename {yt_dlp => youtube_dlc}/extractor/urort.py (97%) rename {yt_dlp => youtube_dlc}/extractor/urplay.py (82%) rename {yt_dlp => youtube_dlc}/extractor/usanetwork.py (100%) rename {yt_dlp => youtube_dlc}/extractor/usatoday.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ustream.py (98%) rename {yt_dlp => youtube_dlc}/extractor/ustudio.py (100%) rename {yt_dlp => youtube_dlc}/extractor/varzesh3.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vbox7.py (100%) rename {yt_dlp => youtube_dlc}/extractor/veehd.py (100%) rename {yt_dlp => youtube_dlc}/extractor/veoh.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vesti.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vevo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vgtv.py (97%) rename {yt_dlp => youtube_dlc}/extractor/vh1.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vice.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vidbit.py (100%) rename {yt_dlp => youtube_dlc}/extractor/viddler.py (100%) rename {yt_dlp => youtube_dlc}/extractor/videa.py (57%) rename {yt_dlp => youtube_dlc}/extractor/videodetective.py (100%) rename {yt_dlp => youtube_dlc}/extractor/videofyme.py (100%) rename {yt_dlp => youtube_dlc}/extractor/videomore.py (51%) rename {yt_dlp => youtube_dlc}/extractor/videopress.py (74%) create mode 100644 youtube_dlc/extractor/vidio.py rename {yt_dlp => youtube_dlc}/extractor/vidlii.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vidme.py (99%) rename {yt_dlp => youtube_dlc}/extractor/vidzi.py (96%) rename {yt_dlp => youtube_dlc}/extractor/vier.py (100%) rename {yt_dlp => youtube_dlc}/extractor/viewlift.py (99%) rename {yt_dlp => youtube_dlc}/extractor/viidea.py (100%) create mode 100644 youtube_dlc/extractor/viki.py rename {yt_dlp => youtube_dlc}/extractor/vimeo.py (84%) rename {yt_dlp => youtube_dlc}/extractor/vimple.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vine.py (100%) rename {yt_dlp => youtube_dlc}/extractor/viqeo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/viu.py (58%) rename {yt_dlp => youtube_dlc}/extractor/vk.py (98%) rename {yt_dlp => youtube_dlc}/extractor/vlive.py (79%) rename {yt_dlp => youtube_dlc}/extractor/vodlocker.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vodpl.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vodplatform.py (100%) rename {yt_dlp => youtube_dlc}/extractor/voicerepublic.py (100%) rename {yt_dlp => youtube_dlc}/extractor/voot.py (58%) rename {yt_dlp => youtube_dlc}/extractor/voxmedia.py (90%) rename {yt_dlp => youtube_dlc}/extractor/vrak.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vrt.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vrv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vshare.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vube.py (99%) rename {yt_dlp => youtube_dlc}/extractor/vuclip.py (100%) create mode 100644 youtube_dlc/extractor/vvvvid.py rename {yt_dlp => youtube_dlc}/extractor/vyborymos.py (100%) rename {yt_dlp => youtube_dlc}/extractor/vzaar.py (99%) rename {yt_dlp => youtube_dlc}/extractor/wakanim.py (80%) rename {yt_dlp => youtube_dlc}/extractor/walla.py (100%) rename {yt_dlp => youtube_dlc}/extractor/washingtonpost.py (54%) create mode 100644 youtube_dlc/extractor/wat.py rename {yt_dlp => youtube_dlc}/extractor/watchbox.py (100%) rename {yt_dlp => youtube_dlc}/extractor/watchindianporn.py (100%) rename {yt_dlp => youtube_dlc}/extractor/wdr.py (91%) rename {yt_dlp => youtube_dlc}/extractor/webcaster.py (100%) rename {yt_dlp => youtube_dlc}/extractor/webofstories.py (100%) rename {yt_dlp => youtube_dlc}/extractor/weibo.py (100%) rename {yt_dlp => youtube_dlc}/extractor/weiqitv.py (100%) rename {yt_dlp => youtube_dlc}/extractor/wistia.py (69%) rename {yt_dlp => youtube_dlc}/extractor/worldstarhiphop.py (100%) rename {yt_dlp => youtube_dlc}/extractor/wsj.py (100%) rename {yt_dlp => youtube_dlc}/extractor/wwe.py (100%) rename {yt_dlp => youtube_dlc}/extractor/xbef.py (100%) rename {yt_dlp => youtube_dlc}/extractor/xboxclips.py (53%) rename {yt_dlp => youtube_dlc}/extractor/xfileshare.py (96%) rename {yt_dlp => youtube_dlc}/extractor/xhamster.py (79%) rename {yt_dlp => youtube_dlc}/extractor/xiami.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ximalaya.py (100%) rename {yt_dlp => youtube_dlc}/extractor/xminus.py (100%) rename {yt_dlp => youtube_dlc}/extractor/xnxx.py (97%) rename {yt_dlp => youtube_dlc}/extractor/xstream.py (99%) rename {yt_dlp => youtube_dlc}/extractor/xtube.py (77%) rename {yt_dlp => youtube_dlc}/extractor/xuite.py (100%) rename {yt_dlp => youtube_dlc}/extractor/xvideos.py (100%) rename {yt_dlp => youtube_dlc}/extractor/xxxymovies.py (100%) rename {yt_dlp => youtube_dlc}/extractor/yahoo.py (92%) create mode 100644 youtube_dlc/extractor/yandexdisk.py create mode 100644 youtube_dlc/extractor/yandexmusic.py create mode 100644 youtube_dlc/extractor/yandexvideo.py rename {yt_dlp => youtube_dlc}/extractor/yapfiles.py (100%) rename {yt_dlp => youtube_dlc}/extractor/yesjapan.py (100%) rename {yt_dlp => youtube_dlc}/extractor/yinyuetai.py (100%) rename {yt_dlp => youtube_dlc}/extractor/ynet.py (100%) rename {yt_dlp => youtube_dlc}/extractor/youjizz.py (100%) rename {yt_dlp => youtube_dlc}/extractor/youku.py (99%) rename {yt_dlp => youtube_dlc}/extractor/younow.py (100%) rename {yt_dlp => youtube_dlc}/extractor/youporn.py (72%) rename {yt_dlp => youtube_dlc}/extractor/yourporn.py (100%) rename {yt_dlp => youtube_dlc}/extractor/yourupload.py (100%) create mode 100644 youtube_dlc/extractor/youtube.py rename {yt_dlp => youtube_dlc}/extractor/zapiks.py (100%) rename {yt_dlp => youtube_dlc}/extractor/zaq1.py (100%) rename {yt_dlp => youtube_dlc}/extractor/zattoo.py (99%) rename {yt_dlp => youtube_dlc}/extractor/zdf.py (75%) create mode 100644 youtube_dlc/extractor/zingmp3.py create mode 100644 youtube_dlc/extractor/zoom.py rename {yt_dlp => youtube_dlc}/extractor/zype.py (90%) rename {yt_dlp => youtube_dlc}/jsinterp.py (100%) create mode 100644 youtube_dlc/options.py rename {yt_dlp => youtube_dlc}/postprocessor/__init__.py (65%) create mode 100644 youtube_dlc/postprocessor/common.py create mode 100644 youtube_dlc/postprocessor/embedthumbnail.py create mode 100644 youtube_dlc/postprocessor/execafterdownload.py rename {yt_dlp => youtube_dlc}/postprocessor/ffmpeg.py (50%) create mode 100644 youtube_dlc/postprocessor/metadatafromtitle.py rename {yt_dlp => youtube_dlc}/postprocessor/xattrpp.py (90%) rename {yt_dlp => youtube_dlc}/socks.py (100%) rename yt_dlp/swfinterp.py.disabled => youtube_dlc/swfinterp.py (100%) create mode 100644 youtube_dlc/update.py rename {yt_dlp => youtube_dlc}/utils.py (86%) rename {yt_dlp => youtube_dlc}/version.py (58%) delete mode 100644 yt-dlp.cmd delete mode 100755 yt-dlp.sh delete mode 100644 yt_dlp/YoutubeDL.py delete mode 100644 yt_dlp/compat.py delete mode 100644 yt_dlp/cookies.py delete mode 100644 yt_dlp/downloader/__init__.py delete mode 100644 yt_dlp/downloader/dash.py delete mode 100644 yt_dlp/downloader/hls.py delete mode 100644 yt_dlp/downloader/mhtml.py delete mode 100644 yt_dlp/downloader/niconico.py delete mode 100644 yt_dlp/downloader/websocket.py delete mode 100644 yt_dlp/downloader/youtube_live_chat.py delete mode 100644 yt_dlp/extractor/abcnews.py delete mode 100644 yt_dlp/extractor/acast.py delete mode 100644 yt_dlp/extractor/adn.py delete mode 100644 yt_dlp/extractor/aenetworks.py delete mode 100644 yt_dlp/extractor/aljazeera.py delete mode 100644 yt_dlp/extractor/americastestkitchen.py delete mode 100644 yt_dlp/extractor/animelab.py delete mode 100644 yt_dlp/extractor/anvato_token_generator/__init__.py delete mode 100644 yt_dlp/extractor/anvato_token_generator/common.py delete mode 100644 yt_dlp/extractor/anvato_token_generator/nfl.py delete mode 100644 yt_dlp/extractor/applepodcasts.py delete mode 100644 yt_dlp/extractor/archiveorg.py delete mode 100644 yt_dlp/extractor/arcpublishing.py delete mode 100644 yt_dlp/extractor/arkena.py delete mode 100644 yt_dlp/extractor/arnes.py delete mode 100644 yt_dlp/extractor/asiancrush.py delete mode 100644 yt_dlp/extractor/audius.py delete mode 100644 yt_dlp/extractor/bandaichannel.py delete mode 100644 yt_dlp/extractor/bfmtv.py delete mode 100644 yt_dlp/extractor/bibeltv.py delete mode 100644 yt_dlp/extractor/bitwave.py delete mode 100644 yt_dlp/extractor/bongacams.py delete mode 100644 yt_dlp/extractor/cbssports.py delete mode 100644 yt_dlp/extractor/comedycentral.py delete mode 100644 yt_dlp/extractor/crackle.py delete mode 100644 yt_dlp/extractor/ctv.py delete mode 100644 yt_dlp/extractor/discoveryplusindia.py delete mode 100644 yt_dlp/extractor/douyin.py delete mode 100644 yt_dlp/extractor/dreisat.py delete mode 100644 yt_dlp/extractor/fancode.py delete mode 100644 yt_dlp/extractor/formula1.py delete mode 100644 yt_dlp/extractor/fujitv.py delete mode 100644 yt_dlp/extractor/funimation.py delete mode 100644 yt_dlp/extractor/gamespot.py delete mode 100644 yt_dlp/extractor/gedidigital.py delete mode 100644 yt_dlp/extractor/googlepodcasts.py delete mode 100644 yt_dlp/extractor/ign.py delete mode 100644 yt_dlp/extractor/iheart.py delete mode 100644 yt_dlp/extractor/itv.py delete mode 100644 yt_dlp/extractor/ketnet.py delete mode 100644 yt_dlp/extractor/khanacademy.py delete mode 100644 yt_dlp/extractor/la7.py delete mode 100644 yt_dlp/extractor/lbry.py delete mode 100644 yt_dlp/extractor/line.py delete mode 100644 yt_dlp/extractor/linuxacademy.py delete mode 100644 yt_dlp/extractor/maoritv.py delete mode 100644 yt_dlp/extractor/medialaan.py delete mode 100644 yt_dlp/extractor/mildom.py delete mode 100644 yt_dlp/extractor/minds.py delete mode 100644 yt_dlp/extractor/mlb.py delete mode 100644 yt_dlp/extractor/mxplayer.py delete mode 100644 yt_dlp/extractor/nba.py delete mode 100644 yt_dlp/extractor/nebula.py delete mode 100644 yt_dlp/extractor/nfhsnetwork.py delete mode 100644 yt_dlp/extractor/nfl.py delete mode 100644 yt_dlp/extractor/nhk.py delete mode 100644 yt_dlp/extractor/niconico.py delete mode 100644 yt_dlp/extractor/ninegag.py delete mode 100644 yt_dlp/extractor/nitter.py delete mode 100644 yt_dlp/extractor/nrk.py delete mode 100644 yt_dlp/extractor/palcomp3.py delete mode 100644 yt_dlp/extractor/parlview.py delete mode 100644 yt_dlp/extractor/phoenix.py delete mode 100644 yt_dlp/extractor/playstuff.py delete mode 100644 yt_dlp/extractor/plutotv.py delete mode 100644 yt_dlp/extractor/pornflip.py delete mode 100644 yt_dlp/extractor/rcs.py delete mode 100644 yt_dlp/extractor/rcti.py delete mode 100644 yt_dlp/extractor/rtp.py delete mode 100644 yt_dlp/extractor/saitosan.py delete mode 100644 yt_dlp/extractor/samplefocus.py delete mode 100644 yt_dlp/extractor/screencastomatic.py delete mode 100644 yt_dlp/extractor/shemaroome.py delete mode 100644 yt_dlp/extractor/simplecast.py delete mode 100644 yt_dlp/extractor/sky.py delete mode 100644 yt_dlp/extractor/skyit.py delete mode 100644 yt_dlp/extractor/sonyliv.py delete mode 100644 yt_dlp/extractor/sportdeutschland.py delete mode 100644 yt_dlp/extractor/spotify.py delete mode 100644 yt_dlp/extractor/sprout.py delete mode 100644 yt_dlp/extractor/srgssr.py delete mode 100644 yt_dlp/extractor/stitcher.py delete mode 100644 yt_dlp/extractor/storyfire.py delete mode 100644 yt_dlp/extractor/streetvoice.py delete mode 100644 yt_dlp/extractor/stretchinternet.py delete mode 100644 yt_dlp/extractor/telemundo.py delete mode 100644 yt_dlp/extractor/tenplay.py delete mode 100644 yt_dlp/extractor/tf1.py delete mode 100644 yt_dlp/extractor/threeqsdn.py delete mode 100644 yt_dlp/extractor/tmz.py delete mode 100644 yt_dlp/extractor/trovo.py delete mode 100644 yt_dlp/extractor/trovolive.py delete mode 100644 yt_dlp/extractor/tv5unis.py delete mode 100644 yt_dlp/extractor/tva.py delete mode 100644 yt_dlp/extractor/tver.py delete mode 100644 yt_dlp/extractor/twitcasting.py delete mode 100644 yt_dlp/extractor/ukcolumn.py delete mode 100644 yt_dlp/extractor/utreon.py delete mode 100644 yt_dlp/extractor/vidio.py delete mode 100644 yt_dlp/extractor/viki.py delete mode 100644 yt_dlp/extractor/vtm.py delete mode 100644 yt_dlp/extractor/vvvvid.py delete mode 100644 yt_dlp/extractor/wat.py delete mode 100644 yt_dlp/extractor/whowatch.py delete mode 100644 yt_dlp/extractor/wimtv.py delete mode 100644 yt_dlp/extractor/yandexdisk.py delete mode 100644 yt_dlp/extractor/yandexmusic.py delete mode 100644 yt_dlp/extractor/yandexvideo.py delete mode 100644 yt_dlp/extractor/youtube.py delete mode 100644 yt_dlp/extractor/zee5.py delete mode 100644 yt_dlp/extractor/zhihu.py delete mode 100644 yt_dlp/extractor/zingmp3.py delete mode 100644 yt_dlp/extractor/zoom.py delete mode 100644 yt_dlp/options.py delete mode 100644 yt_dlp/postprocessor/common.py delete mode 100644 yt_dlp/postprocessor/embedthumbnail.py delete mode 100644 yt_dlp/postprocessor/execafterdownload.py delete mode 100644 yt_dlp/postprocessor/metadatafromfield.py delete mode 100644 yt_dlp/postprocessor/movefilesafterdownload.py delete mode 100644 yt_dlp/postprocessor/sponskrub.py delete mode 100644 yt_dlp/update.py delete mode 100644 yt_dlp/webvtt.py delete mode 100644 ytdlp_plugins/extractor/__init__.py delete mode 100644 ytdlp_plugins/extractor/sample.py diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 58c855615..000000000 --- a/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -* text=auto - -Makefile* text whitespace=-tab-in-indent -*.sh text eol=lf diff --git a/.github/ISSUE_TEMPLATE/1_broken_site.md b/.github/ISSUE_TEMPLATE/1_broken_site.md index 5dc6b85f3..32c14aa85 100644 --- a/.github/ISSUE_TEMPLATE/1_broken_site.md +++ b/.github/ISSUE_TEMPLATE/1_broken_site.md @@ -20,16 +20,16 @@ assignees: '' ## Checklist - [ ] I'm reporting a broken site support -- [ ] I've verified that I'm running yt-dlp version **2021.07.24** +- [ ] I've verified that I'm running youtube-dlc version **2020.10.31** - [ ] 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 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 ## Description diff --git a/.github/ISSUE_TEMPLATE/2_site_support_request.md b/.github/ISSUE_TEMPLATE/2_site_support_request.md index 54ce076c9..fe1aade05 100644 --- a/.github/ISSUE_TEMPLATE/2_site_support_request.md +++ b/.github/ISSUE_TEMPLATE/2_site_support_request.md @@ -20,16 +20,16 @@ assignees: '' ## Checklist - [ ] I'm reporting a new site support request -- [ ] I've verified that I'm running yt-dlp version **2021.07.24** +- [ ] I've verified that I'm running youtube-dlcc version **2020.10.31** - [ ] 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 searched the bugtracker for similar site support requests including closed ones diff --git a/.github/ISSUE_TEMPLATE/3_site_feature_request.md b/.github/ISSUE_TEMPLATE/3_site_feature_request.md index 76adac9b7..cddb81dda 100644 --- a/.github/ISSUE_TEMPLATE/3_site_feature_request.md +++ b/.github/ISSUE_TEMPLATE/3_site_feature_request.md @@ -20,21 +20,21 @@ assignees: '' ## Checklist - [ ] I'm reporting a site feature request -- [ ] I've verified that I'm running yt-dlp version **2021.07.24** +- [ ] I've verified that I'm running youtube-dlc version **2020.10.31** - [ ] I've searched the bugtracker for similar site feature requests including closed ones ## Description WRITE DESCRIPTION HERE diff --git a/.github/ISSUE_TEMPLATE/4_bug_report.md b/.github/ISSUE_TEMPLATE/4_bug_report.md index f13010b94..920ae8dbc 100644 --- a/.github/ISSUE_TEMPLATE/4_bug_report.md +++ b/.github/ISSUE_TEMPLATE/4_bug_report.md @@ -20,17 +20,17 @@ assignees: '' ## Checklist - [ ] I'm reporting a broken site support issue -- [ ] I've verified that I'm running yt-dlp version **2021.07.24** +- [ ] I've verified that I'm running youtube-dlc version **2020.10.31** - [ ] 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 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 ## Description diff --git a/.github/ISSUE_TEMPLATE/5_feature_request.md b/.github/ISSUE_TEMPLATE/5_feature_request.md index 204e78357..7cc390f58 100644 --- a/.github/ISSUE_TEMPLATE/5_feature_request.md +++ b/.github/ISSUE_TEMPLATE/5_feature_request.md @@ -20,21 +20,21 @@ assignees: '' ## Checklist - [ ] I'm reporting a feature request -- [ ] I've verified that I'm running yt-dlp version **2021.07.24** +- [ ] I've verified that I'm running youtube-dlc version **2020.10.31** - [ ] I've searched the bugtracker for similar feature requests including closed ones ## Description WRITE DESCRIPTION HERE diff --git a/.github/ISSUE_TEMPLATE/6_question.md b/.github/ISSUE_TEMPLATE/6_question.md index dd2857c09..3c3ae0f3b 100644 --- a/.github/ISSUE_TEMPLATE/6_question.md +++ b/.github/ISSUE_TEMPLATE/6_question.md @@ -20,10 +20,10 @@ assignees: '' ## Checklist - [ ] I'm asking a question @@ -34,7 +34,7 @@ Carefully read and work through this check list in order to prevent the most com ## Question WRITE QUESTION HERE diff --git a/.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md b/.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md index 6da13a7b5..3fe4d6968 100644 --- a/.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md +++ b/.github/ISSUE_TEMPLATE_tmpl/1_broken_site.md @@ -1,10 +1,7 @@ --- name: Broken site support about: Report broken or misfunctioning site -title: "[Broken]" -labels: Broken -assignees: '' - +title: '' --- - [ ] I'm reporting a broken site support -- [ ] I've verified that I'm running yt-dlp version **%(version)s** +- [ ] I've verified that I'm running youtube-dlc version **%(version)s** - [ ] 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 searched the bugtracker for similar issues including closed ones @@ -38,13 +35,13 @@ Carefully read and work through this check list in order to prevent the most com ## Verbose log ## Description diff --git a/.github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md b/.github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md index 9e7eb5a20..aad8fa054 100644 --- a/.github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md +++ b/.github/ISSUE_TEMPLATE_tmpl/2_site_support_request.md @@ -1,10 +1,8 @@ --- name: Site support request about: Request support for a new site -title: "[Site Request]" -labels: Request -assignees: '' - +title: '' +labels: 'site-support-request' --- - [ ] I'm reporting a new site support request -- [ ] I've verified that I'm running yt-dlp version **%(version)s** +- [ ] I've verified that I'm running youtube-dlc version **%(version)s** - [ ] 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 searched the bugtracker for similar site support requests including closed ones diff --git a/.github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md b/.github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md index d74b6e279..2fb82f828 100644 --- a/.github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md +++ b/.github/ISSUE_TEMPLATE_tmpl/3_site_feature_request.md @@ -1,10 +1,7 @@ --- name: Site feature request about: Request a new functionality for a site -title: "[Site Request]" -labels: Request -assignees: '' - +title: '' --- - [ ] I'm reporting a site feature request -- [ ] I've verified that I'm running yt-dlp version **%(version)s** +- [ ] I've verified that I'm running youtube-dlc version **%(version)s** - [ ] I've searched the bugtracker for similar site feature requests including closed ones diff --git a/.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md b/.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md index af1774462..b7bebf8ab 100644 --- a/.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md +++ b/.github/ISSUE_TEMPLATE_tmpl/4_bug_report.md @@ -2,9 +2,6 @@ name: Bug report about: Report a bug unrelated to any particular site or extractor title: '' -labels: '' -assignees: '' - --- - [ ] I'm reporting a broken site support issue -- [ ] I've verified that I'm running yt-dlp version **%(version)s** +- [ ] I've verified that I'm running youtube-dlc version **%(version)s** - [ ] 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 searched the bugtracker for similar bug reports including closed ones @@ -40,13 +37,13 @@ Carefully read and work through this check list in order to prevent the most com ## Verbose log ## Description diff --git a/.github/ISSUE_TEMPLATE_tmpl/5_feature_request.md b/.github/ISSUE_TEMPLATE_tmpl/5_feature_request.md index 4a0209db1..99592f79d 100644 --- a/.github/ISSUE_TEMPLATE_tmpl/5_feature_request.md +++ b/.github/ISSUE_TEMPLATE_tmpl/5_feature_request.md @@ -1,10 +1,8 @@ --- name: Feature request about: Request a new functionality unrelated to any particular site or extractor -title: "[Feature Request]" -labels: Request -assignees: '' - +title: '' +labels: 'request' --- - [ ] I'm reporting a feature request -- [ ] I've verified that I'm running yt-dlp version **%(version)s** +- [ ] I've verified that I'm running youtube-dlc version **%(version)s** - [ ] I've searched the bugtracker for similar feature requests including closed ones diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f711701cb..e69b907d8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,7 +8,7 @@ ### 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 -- [ ] [Searched](https://github.com/yt-dlp/yt-dlp/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests +- [ ] [Searched](https://github.com/ytdl-org/youtube-dl/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests - [ ] 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: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a9fa01d54..dd6a95256 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,13 +7,13 @@ on: jobs: build_unix: + runs-on: ubuntu-latest outputs: - ytdlp_version: ${{ steps.bump_version.outputs.ytdlp_version }} + ytdlc_version: ${{ steps.bump_version.outputs.ytdlc_version }} upload_url: ${{ steps.create_release.outputs.upload_url }} - sha256_unix: ${{ steps.sha256_file.outputs.sha256_unix }} - sha512_unix: ${{ steps.sha512_file.outputs.sha512_unix }} + sha2_unix: ${{ steps.sha2_file.outputs.sha2_unix }} steps: - uses: actions/checkout@v2 @@ -25,169 +25,132 @@ jobs: run: sudo apt-get -y install zip pandoc man - name: Bump version id: bump_version - run: python devscripts/update-version.py - - name: Print version - run: echo "${{ steps.bump_version.outputs.ytdlp_version }}" + run: python scripts/update-version-workflow.py + - name: Check the output from My action + run: echo "${{ steps.bump_version.outputs.ytdlc_version }}" - name: Run Make - run: make all tar + run: make - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: ${{ steps.bump_version.outputs.ytdlp_version }} - release_name: yt-dlp ${{ steps.bump_version.outputs.ytdlp_version }} + tag_name: ${{ steps.bump_version.outputs.ytdlc_version }} + release_name: youtube-dlc ${{ steps.bump_version.outputs.ytdlc_version }} body: | Changelog: PLACEHOLDER draft: false prerelease: false - - name: Upload yt-dlp Unix binary - id: upload-release-asset + - name: Upload youtube-dlc Unix binary + id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./yt-dlp - asset_name: yt-dlp + asset_path: ./youtube-dlc + asset_name: youtube-dlc asset_content_type: application/octet-stream - - name: Upload Source tar - uses: actions/upload-release-asset@v1 + - name: Get SHA2-256SUMS for youtube-dlc + id: sha2_file env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./yt-dlp.tar.gz - asset_name: yt-dlp.tar.gz - asset_content_type: application/gzip - - name: Get SHA2-256SUMS for yt-dlp - id: sha256_file - run: echo "::set-output name=sha256_unix::$(sha256sum yt-dlp | awk '{print $1}')" - - name: Get SHA2-512SUMS for yt-dlp - id: sha512_file - run: echo "::set-output name=sha512_unix::$(sha512sum yt-dlp | awk '{print $1}')" + SHA2: ${{ hashFiles('youtube-dlc') }} + run: echo "::set-output name=sha2_unix::$SHA2" - name: Install dependencies for pypi - env: - PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} - if: "env.PYPI_TOKEN != ''" run: | python -m pip install --upgrade pip pip install setuptools wheel twine - - name: Build and publish on pypi + - name: Build and publish env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} - if: "env.TWINE_PASSWORD != ''" + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | rm -rf dist/* python setup.py sdist bdist_wheel twine upload dist/* build_windows: - runs-on: windows-latest - needs: build_unix - outputs: - sha256_windows: ${{ steps.sha256_file_win.outputs.sha256_windows }} - sha512_windows: ${{ steps.sha512_file_win.outputs.sha512_windows }} + runs-on: windows-latest + + needs: build_unix steps: - uses: actions/checkout@v2 - # 3.8 is used for Win7 support - - name: Set up Python 3.8 + - name: Set up Python uses: actions/setup-python@v2 with: python-version: '3.8' - - name: Upgrade pip and enable wheel support - run: python -m pip install --upgrade pip setuptools wheel - name: Install Requirements - run: pip install pyinstaller mutagen pycryptodome websockets + run: pip install pyinstaller - name: Bump version - id: bump_version - run: python devscripts/update-version.py - - name: Print version - run: echo "${{ steps.bump_version.outputs.ytdlp_version }}" + run: python scripts/update-version-workflow.py - name: Run PyInstaller Script - run: python pyinst.py 64 - - name: Upload yt-dlp.exe Windows binary + run: python pyinst.py + - name: Upload youtube-dlc.exe Windows binary id: upload-release-windows uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.build_unix.outputs.upload_url }} - asset_path: ./dist/yt-dlp.exe - asset_name: yt-dlp.exe + asset_path: ./dist/youtube-dlc.exe + asset_name: youtube-dlc.exe asset_content_type: application/vnd.microsoft.portable-executable - - name: Get SHA2-256SUMS for yt-dlp.exe - id: sha256_file_win - run: echo "::set-output name=sha256_windows::$((Get-FileHash dist\yt-dlp.exe -Algorithm SHA256).Hash.ToLower())" - - name: Get SHA2-512SUMS for yt-dlp.exe - id: sha512_file_win - run: echo "::set-output name=sha512_windows::$((Get-FileHash dist\yt-dlp.exe -Algorithm SHA512).Hash.ToLower())" + - name: Get SHA2-256SUMS for youtube-dlc.exe + id: sha2_file_win + env: + SHA2_win: ${{ hashFiles('dist/youtube-dlc.exe') }} + run: echo "::set-output name=sha2_windows::$SHA2_win" build_windows32: - runs-on: windows-latest - needs: [build_unix, build_windows] - outputs: - sha256_windows32: ${{ steps.sha256_file_win32.outputs.sha256_windows32 }} - sha512_windows32: ${{ steps.sha512_file_win32.outputs.sha512_windows32 }} + runs-on: windows-latest + + needs: [build_unix, build_windows] steps: - uses: actions/checkout@v2 - # 3.7 is used for Vista support. See https://github.com/yt-dlp/yt-dlp/issues/390 - - name: Set up Python 3.7 32-Bit + - name: Set up Python 3.4.4 32-Bit uses: actions/setup-python@v2 with: - python-version: '3.7' + python-version: '3.4.4' architecture: 'x86' - - name: Upgrade pip and enable wheel support - run: python -m pip install --upgrade pip setuptools wheel - - name: Install Requirements - run: pip install pyinstaller mutagen pycryptodome websockets + - name: Install Requirements for 32 Bit + run: pip install pyinstaller==3.5 - name: Bump version - id: bump_version - run: python devscripts/update-version.py - - name: Print version - run: echo "${{ steps.bump_version.outputs.ytdlp_version }}" + run: python scripts/update-version-workflow.py - name: Run PyInstaller Script for 32 Bit - run: python pyinst.py 32 - - name: Upload Executable yt-dlp_x86.exe + run: python pyinst32.py + - name: Upload Executable youtube-dlc_x86.exe id: upload-release-windows32 uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.build_unix.outputs.upload_url }} - asset_path: ./dist/yt-dlp_x86.exe - asset_name: yt-dlp_x86.exe + asset_path: ./dist/youtube-dlc_x86.exe + asset_name: youtube-dlc_x86.exe asset_content_type: application/vnd.microsoft.portable-executable - - name: Get SHA2-256SUMS for yt-dlp_x86.exe - id: sha256_file_win32 - run: echo "::set-output name=sha256_windows32::$((Get-FileHash dist\yt-dlp_x86.exe -Algorithm SHA256).Hash.ToLower())" - - name: Get SHA2-512SUMS for yt-dlp_x86.exe - id: sha512_file_win32 - run: echo "::set-output name=sha512_windows32::$((Get-FileHash dist\yt-dlp_x86.exe -Algorithm SHA512).Hash.ToLower())" - - finish: - runs-on: ubuntu-latest - needs: [build_unix, build_windows, build_windows32] - - steps: + - name: Get SHA2-256SUMS for youtube-dlc_x86.exe + id: sha2_file_win32 + env: + SHA2_win32: ${{ hashFiles('dist/youtube-dlc_x86.exe') }} + run: echo "::set-output name=sha2_windows32::$SHA2_win32" - name: Make SHA2-256SUMS file env: - SHA256_WINDOWS: ${{ needs.build_windows.outputs.sha256_windows }} - SHA256_WINDOWS32: ${{ needs.build_windows32.outputs.sha256_windows32 }} - SHA256_UNIX: ${{ needs.build_unix.outputs.sha256_unix }} - YTDLP_VERSION: ${{ needs.build_unix.outputs.ytdlp_version }} + SHA2_WINDOWS: ${{ needs.build_windows.outputs.sha2_windows }} + SHA2_WINDOWS32: ${{ steps.sha2_file_win32.outputs.sha2_windows32 }} + SHA2_UNIX: ${{ needs.build_unix.outputs.sha2_unix }} + YTDLC_VERSION: ${{ needs.build_unix.outputs.ytdlc_version }} run: | - echo "version:${{ env.YTDLP_VERSION }}" >> SHA2-256SUMS - echo "yt-dlp.exe:${{ env.SHA256_WINDOWS }}" >> SHA2-256SUMS - echo "yt-dlp_x86.exe:${{ env.SHA256_WINDOWS32 }}" >> SHA2-256SUMS - echo "yt-dlp:${{ env.SHA256_UNIX }}" >> SHA2-256SUMS + echo "version:${env:YTDLC_VERSION}" >> SHA2-256SUMS + echo "youtube-dlc.exe:${env:SHA2_WINDOWS}" >> SHA2-256SUMS + echo "youtube-dlc_x86.exe:${env:SHA2_WINDOWS32}" >> SHA2-256SUMS + echo "youtube-dlc:${env:SHA2_UNIX}" >> SHA2-256SUMS + - name: Upload 256SUMS file id: upload-sums uses: actions/upload-release-asset@v1 @@ -198,22 +161,3 @@ jobs: asset_path: ./SHA2-256SUMS asset_name: SHA2-256SUMS asset_content_type: text/plain - - name: Make SHA2-512SUMS file - env: - SHA512_WINDOWS: ${{ needs.build_windows.outputs.sha512_windows }} - SHA512_WINDOWS32: ${{ needs.build_windows32.outputs.sha512_windows32 }} - SHA512_UNIX: ${{ needs.build_unix.outputs.sha512_unix }} - run: | - echo "${{ env.SHA512_WINDOWS }} yt-dlp.exe" >> SHA2-512SUMS - echo "${{ env.SHA512_WINDOWS32 }} yt-dlp_x86.exe" >> SHA2-512SUMS - echo "${{ env.SHA512_UNIX }} yt-dlp" >> SHA2-512SUMS - - name: Upload 512SUMS file - id: upload-512sums - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ needs.build_unix.outputs.upload_url }} - asset_path: ./SHA2-512SUMS - asset_name: SHA2-512SUMS - asset_content_type: text/plain diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml deleted file mode 100644 index 4fb65e0c1..000000000 --- a/.github/workflows/core.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Core Tests -on: [push, pull_request] -jobs: - tests: - name: Core Tests - if: "!contains(github.event.head_commit.message, 'ci skip')" - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-18.04] - # py3.9 is in quick-test - python-version: [3.7, 3.8, 3.10-dev, pypy-3.6, pypy-3.7] - run-tests-ext: [sh] - include: - # atleast one of the tests must be in windows - - os: windows-latest - python-version: 3.6 - run-tests-ext: bat - steps: - - uses: actions/checkout@v2 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Install pytest - run: pip install pytest - - name: Run tests - continue-on-error: False - run: ./devscripts/run_tests.${{ matrix.run-tests-ext }} core - # Linter is in quick-test diff --git a/.github/workflows/download.yml b/.github/workflows/download.yml deleted file mode 100644 index dd242fa56..000000000 --- a/.github/workflows/download.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Download Tests -on: [push, pull_request] -jobs: - tests: - name: Download Tests - if: "contains(github.event.head_commit.message, 'ci run dl')" - runs-on: ${{ matrix.os }} - strategy: - fail-fast: true - matrix: - os: [ubuntu-18.04] - python-version: [3.7, 3.8, 3.9, 3.10-dev, pypy-3.6, pypy-3.7] - run-tests-ext: [sh] - include: - - os: windows-latest - python-version: 3.6 - run-tests-ext: bat - steps: - - uses: actions/checkout@v2 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: - python-version: ${{ matrix.python-version }} - - name: Install pytest - run: pip install pytest - - name: Run tests - continue-on-error: true - run: ./devscripts/run_tests.${{ matrix.run-tests-ext }} download diff --git a/.github/workflows/python-publish.yml.disable b/.github/workflows/python-publish.yml.disable new file mode 100644 index 000000000..224a00230 --- /dev/null +++ b/.github/workflows/python-publish.yml.disable @@ -0,0 +1,33 @@ +# This workflows will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +name: Upload Python Package + +on: + push: + branches: + - release + +jobs: + deploy: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + rm -rf dist/* + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/.github/workflows/quick-test.yml b/.github/workflows/quick-test.yml deleted file mode 100644 index 7d409dfc4..000000000 --- a/.github/workflows/quick-test.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Quick Test -on: [push, pull_request] -jobs: - tests: - name: Core Test - if: "!contains(github.event.head_commit.message, 'ci skip all')" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - name: Install test requirements - run: pip install pytest pycryptodome - - name: Run tests - run: ./devscripts/run_tests.sh core - flake8: - name: Linter - if: "!contains(github.event.head_commit.message, 'ci skip all')" - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.9 - - name: Install flake8 - run: pip install flake8 - - name: Run flake8 - run: flake8 . diff --git a/.gitignore b/.gitignore index 7ed34448a..065a14f49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,34 @@ -# Config -*.conf -*.spec -cookies -cookies.txt - -# Downloaded +*.pyc +*.pyo +*.class +*~ +*.DS_Store +wine-py2exe/ +py2exe.log +*.kate-swp +build/ +dist/ +MANIFEST +README.txt +youtube-dl.1 +youtube-dlc.1 +youtube-dl.bash-completion +youtube-dlc.bash-completion +youtube-dl.fish +youtube-dlc.fish +youtube_dl/extractor/lazy_extractors.py +youtube_dlc/extractor/lazy_extractors.py +youtube-dl +youtube-dlc +youtube-dl.exe +youtube-dlc.exe +youtube-dl.tar.gz +youtube-dlc.tar.gz +youtube-dlc.spec +.coverage +cover/ +updates_key.pem +*.egg-info *.srt *.ttml *.sbv @@ -15,90 +39,26 @@ cookies.txt *.m4v *.mp3 *.3gp -*.webm *.wav *.ape *.mkv *.swf *.part -*.part-* *.ytdl -*.dump -*.frag -*.frag.urls -*.aria2 *.swp -*.ogg -*.opus -*.info.json -*.live_chat.json -*.jpg -*.jpeg -*.png -*.webp -*.annotations.xml -*.description - -# Allow config/media files in testdata -!test/testdata/** - -# Python -*.pyc -*.pyo -.pytest_cache -wine-py2exe/ -py2exe.log -build/ -dist/ -zip/ -tmp/ -venv/ -completions/ - -# Misc -*~ -*.DS_Store -*.kate-swp -MANIFEST test/local_parameters.json -.coverage -cover/ -secrets/ -updates_key.pem -*.egg-info .tox -*.class +youtube-dl.zsh +youtube-dlc.zsh -# Generated -AUTHORS -README.txt -.mailmap -*.1 -*.bash-completion -*.fish -*.exe -*.tar.gz -*.zsh -*.spec -test/testdata/player-*.js - -# Binary -/youtube-dl -/youtube-dlc -/yt-dlp -yt-dlp.zip -*.exe - -# Text Editor / IDE +# IntelliJ related files .idea *.iml + +tmp/ +venv/ + +# VS Code related files .vscode -*.sublime-* -# Lazy extractors -*/extractor/lazy_extractors.py - -# Plugins -ytdlp_plugins/extractor/* -!ytdlp_plugins/extractor/__init__.py -!ytdlp_plugins/extractor/sample.py +cookies.txt diff --git a/.readthedocs.yml b/.readthedocs.yml deleted file mode 100644 index 052f7bfca..000000000 --- a/.readthedocs.yml +++ /dev/null @@ -1,22 +0,0 @@ -# .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 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..fb499845e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,38 @@ +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 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..b507cb8df --- /dev/null +++ b/AUTHORS @@ -0,0 +1,248 @@ +Ricardo Garcia Gonzalez +Danny Colligan +Benjamin Johnson +Vasyl' Vavrychuk +Witold Baryluk +Paweł Paprota +Gergely Imreh +Rogério Brito +Philipp Hagemeister +Sören Schulze +Kevin Ngo +Ori Avtalion +shizeeg +Filippo Valsorda +Christian Albrecht +Dave Vasilevsky +Jaime Marquínez Ferrándiz +Jeff Crouse +Osama Khalid +Michael Walter +M. Yasoob Ullah Khalid +Julien Fraichard +Johny Mo Swag +Axel Noack +Albert Kim +Pierre Rudloff +Huarong Huo +Ismael Mejía +Steffan Donal +Andras Elso +Jelle van der Waa +Marcin Cieślak +Anton Larionov +Takuya Tsuchida +Sergey M. +Michael Orlitzky +Chris Gahan +Saimadhav Heblikar +Mike Col +Oleg Prutz +pulpe +Andreas Schmitz +Michael Kaiser +Niklas Laxström +David Triendl +Anthony Weems +David Wagner +Juan C. Olivares +Mattias Harrysson +phaer +Sainyam Kapoor +Nicolas Évrard +Jason Normore +Hoje Lee +Adam Thalhammer +Georg Jähnig +Ralf Haring +Koki Takahashi +Ariset Llerena +Adam Malcontenti-Wilson +Tobias Bell +Naglis Jonaitis +Charles Chen +Hassaan Ali +Dobrosław Żybort +David Fabijan +Sebastian Haas +Alexander Kirk +Erik Johnson +Keith Beckman +Ole Ernst +Aaron McDaniel (mcd1992) +Magnus Kolstad +Hari Padmanaban +Carlos Ramos +5moufl +lenaten +Dennis Scheiba +Damon Timm +winwon +Xavier Beynon +Gabriel Schubiner +xantares +Jan Matějka +Mauroy Sébastien +William Sewell +Dao Hoang Son +Oskar Jauch +Matthew Rayfield +t0mm0 +Tithen-Firion +Zack Fernandes +cryptonaut +Adrian Kretz +Mathias Rav +Petr Kutalek +Will Glynn +Max Reimann +Cédric Luthi +Thijs Vermeir +Joel Leclerc +Christopher Krooss +Ondřej Caletka +Dinesh S +Johan K. Jensen +Yen Chi Hsuan +Enam Mijbah Noor +David Luhmer +Shaya Goldberg +Paul Hartmann +Frans de Jonge +Robin de Rooij +Ryan Schmidt +Leslie P. Polzer +Duncan Keall +Alexander Mamay +Devin J. Pohly +Eduardo Ferro Aldama +Jeff Buchbinder +Amish Bhadeshia +Joram Schrijver +Will W. +Mohammad Teimori Pabandi +Roman Le Négrate +Matthias Küch +Julian Richen +Ping O. +Mister Hat +Peter Ding +jackyzy823 +George Brighton +Remita Amine +Aurélio A. Heckert +Bernhard Minks +sceext +Zach Bruggeman +Tjark Saul +slangangular +Behrouz Abbasi +ngld +nyuszika7h +Shaun Walbridge +Lee Jenkins +Anssi Hannula +Lukáš Lalinský +Qijiang Fan +Rémy Léone +Marco Ferragina +reiv +Muratcan Simsek +Evan Lu +flatgreen +Brian Foley +Vignesh Venkat +Tom Gijselinck +Founder Fang +Andrew Alexeyew +Saso Bezlaj +Erwin de Haan +Jens Wille +Robin Houtevelts +Patrick Griffis +Aidan Rowe +mutantmonkey +Ben Congdon +Kacper Michajłow +José Joaquín Atria +Viťas Strádal +Kagami Hiiragi +Philip Huppert +blahgeek +Kevin Deldycke +inondle +Tomáš Čech +Déstin Reed +Roman Tsiupa +Artur Krysiak +Jakub Adam Wieczorek +Aleksandar Topuzović +Nehal Patel +Rob van Bekkum +Petr Zvoníček +Pratyush Singh +Aleksander Nitecki +Sebastian Blunt +Matěj Cepl +Xie Yanbo +Philip Xu +John Hawkinson +Rich Leeper +Zhong Jianxin +Thor77 +Mattias Wadman +Arjan Verwer +Costy Petrisor +Logan B +Alex Seiler +Vijay Singh +Paul Hartmann +Stephen Chen +Fabian Stahl +Bagira +Odd Stråbø +Philip Herzog +Thomas Christlieb +Marek Rusinowski +Tobias Gruetzmacher +Olivier Bilodeau +Lars Vierbergen +Juanjo Benages +Xiao Di Guan +Thomas Winant +Daniel Twardowski +Jeremie Jarosh +Gerard Rovira +Marvin Ewald +Frédéric Bournival +Timendum +gritstub +Adam Voss +Mike Fährmann +Jan Kundrát +Giuseppe Fabiano +Örn Guðjónsson +Parmjit Virk +Genki Sky +Ľuboš Katrinec +Corey Nicholson +Ashutosh Chaudhary +John Dong +Tatsuyuki Ishi +Daniel Weber +Kay Bouché +Yang Hongbo +Lei Wang +Petr Novák +Leonardo Taccari +Martin Weinelt +Surya Oktafendri +TingPing +Alexandre Macabies +Bastian de Groot +Niklas Haas +András Veres-Szentkirályi +Enes Solak +Nathan Rossi +Thomas van der Berg +Luca Cherubin diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5faf97b10..58ab3a4b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ $ youtube-dl -v [debug] System config: [] [debug] User config: [] -[debug] Command-line args: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKc'] +[debug] Command-line args: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKcj'] [debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251 [debug] youtube-dl version 2015.12.06 [debug] Git HEAD: 135392e @@ -81,17 +81,16 @@ To run the test, simply invoke your favorite test runner, or execute a test file python -m unittest discover python test/test_download.py nosetests - pytest See item 6 of [new extractor tutorial](#adding-support-for-a-new-site) for how to run extractor specific test cases. If you want to create a build of youtube-dl yourself, you'll need -* python3 +* python * make (only GNU make is supported) * pandoc * zip -* pytest +* nosetests ### Adding support for a new site diff --git a/CONTRIBUTORS b/CONTRIBUTORS deleted file mode 100644 index f0d00068c..000000000 --- a/CONTRIBUTORS +++ /dev/null @@ -1,65 +0,0 @@ -pukkandan (owner) -shirt-dev (collaborator) -colethedj (collaborator) -Ashish0804 (collaborator) -h-h-h-h -pauldubois98 -nixxo -GreyAlien502 -kyuyeunk -siikamiika -jbruchon -alexmerkel -glenn-slayden -Unrud -wporr -mariuszskon -ohnonot -samiksome -alxnull -FelixFrog -Zocker1999NET -nao20010128nao -kurumigi -bbepis -animelover1984 -Pccode66 -RobinD42 -hseg -DennyDai -codeasashu -teesid -kevinoconnor7 -damianoamatruda -2ShedsJackson -CXwudi -xtkoba -llacb47 -hheimbuerger -B0pol -lkho -fstirlitz -Lamieur -tsukumijima -Hadi0609 -b5eff52 -craftingmod -tpikonen -tripulse -king-millez -alex-gedeon -hhirtz -louie-github -MinePlayersPE -olifre -rhsmachine/zenerdi0de -nihil-admirari -krichbanana -ohmybahgosh -nyuszika7h -blackjack4494 -pyx -TpmKranz -mzbaulhaque -zackmark29 -mbway diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000..9b52b7bd2 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,5294 @@ +version 2020.09.20 + +Core +* [extractor/common] Relax interaction count extraction in _json_ld ++ [extractor/common] Extract author as uploader for VideoObject in _json_ld +* [downloader/hls] Fix incorrect end byte in Range HTTP header for + media segments with EXT-X-BYTERANGE (#14748, #24512) +* [extractor/common] Handle ssl.CertificateError in _request_webpage (#26601) +* [downloader/http] Improve timeout detection when reading block of data + (#10935) +* [downloader/http] Retry download when urlopen times out (#10935, #26603) + +Extractors +* [redtube] Extend URL regular expression (#26506) +* [twitch] Refactor +* [twitch:stream] Switch to GraphQL and fix reruns (#26535) ++ [telequebec] Add support for brightcove videos (#25833) +* [pornhub] Extract metadata from JSON-LD (#26614) +* [pornhub] Fix view count extraction (#26621, #26614) + + +version 2020.09.14 + +Core ++ [postprocessor/embedthumbnail] Add support for non jpg/png thumbnails + (#25687, #25717) + +Extractors +* [rtlnl] Extend URL regular expression (#26549, #25821) +* [youtube] Fix empty description extraction (#26575, #26006) +* [srgssr] Extend URL regular expression (#26555, #26556, #26578) +* [googledrive] Use redirect URLs for source format (#18877, #23919, #24689, + #26565) +* [svtplay] Fix id extraction (#26576) +* [redbulltv] Improve support for rebull.com TV localized URLs (#22063) ++ [redbulltv] Add support for new redbull.com TV URLs (#22037, #22063) +* [soundcloud:pagedplaylist] Reduce pagination limit (#26557) + + +version 2020.09.06 + +Core ++ [utils] Recognize wav mimetype (#26463) + +Extractors +* [nrktv:episode] Improve video id extraction (#25594, #26369, #26409) +* [youtube] Fix age gate content detection (#26100, #26152, #26311, #26384) +* [youtube:user] Extend URL regular expression (#26443) +* [xhamster] Improve initials regular expression (#26526, #26353) +* [svtplay] Fix video id extraction (#26425, #26428, #26438) +* [twitch] Rework extractors (#12297, #20414, #20604, #21811, #21812, #22979, + #24263, #25010, #25553, #25606) + * Switch to GraphQL + + Add support for collections + + Add support for clips and collections playlists +* [biqle] Improve video ext extraction +* [xhamster] Fix extraction (#26157, #26254) +* [xhamster] Extend URL regular expression (#25789, #25804, #25927)) + + +version 2020.07.28 + +Extractors +* [youtube] Fix sigfunc name extraction (#26134, #26135, #26136, #26137) +* [youtube] Improve description extraction (#25937, #25980) +* [wistia] Restrict embed regular expression (#25969) +* [youtube] Prevent excess HTTP 301 (#25786) ++ [youtube:playlists] Extend URL regular expression (#25810) ++ [bellmedia] Add support for cp24.com clip URLs (#25764) +* [brightcove] Improve embed detection (#25674) + + +version 2020.06.16.1 + +Extractors +* [youtube] Force old layout (#25682, #25683, #25680, #25686) +* [youtube] Fix categories and improve tags extraction + + +version 2020.06.16 + +Extractors +* [youtube] Fix uploader id and uploader URL extraction +* [youtube] Improve view count extraction +* [youtube] Fix upload date extraction (#25677) +* [youtube] Fix thumbnails extraction (#25676) +* [youtube] Fix playlist and feed extraction (#25675) ++ [facebook] Add support for single-video ID links ++ [youtube] Extract chapters from JSON (#24819) ++ [kaltura] Add support for multiple embeds on a webpage (#25523) + + +version 2020.06.06 + +Extractors +* [tele5] Bypass geo restriction ++ [jwplatform] Add support for bypass geo restriction +* [tele5] Prefer jwplatform over nexx (#25533) +* [twitch:stream] Expect 400 and 410 HTTP errors from API +* [twitch:stream] Fix extraction (#25528) +* [twitch] Fix thumbnails extraction (#25531) ++ [twitch] Pass v5 Accept HTTP header (#25531) +* [brightcove] Fix subtitles extraction (#25540) ++ [malltv] Add support for sk.mall.tv (#25445) +* [periscope] Fix untitled broadcasts (#25482) +* [jwplatform] Improve embeds extraction (#25467) + + +version 2020.05.29 + +Core +* [postprocessor/ffmpeg] Embed series metadata with --add-metadata +* [utils] Fix file permissions in write_json_file (#12471, #25122) + +Extractors +* [ard:beta] Extend URL regular expression (#25405) ++ [youtube] Add support for more invidious instances (#25417) +* [giantbomb] Extend URL regular expression (#25222) +* [ard] Improve URL regular expression (#25134, #25198) +* [redtube] Improve formats extraction and extract m3u8 formats (#25311, + #25321) +* [indavideo] Switch to HTTPS for API request (#25191) +* [redtube] Improve title extraction (#25208) +* [vimeo] Improve format extraction and sorting (#25285) +* [soundcloud] Reduce API playlist page limit (#25274) ++ [youtube] Add support for yewtu.be (#25226) +* [mailru] Fix extraction (#24530, #25239) +* [bellator] Fix mgid extraction (#25195) + + +version 2020.05.08 + +Core +* [downloader/http] Request last data block of exact remaining size +* [downloader/http] Finish downloading once received data length matches + expected +* [extractor/common] Use compat_cookiejar_Cookie for _set_cookie to always + ensure cookie name and value are bytestrings on python 2 (#23256, #24776) ++ [compat] Introduce compat_cookiejar_Cookie +* [utils] Improve cookie files support + + Add support for UTF-8 in cookie files + * Skip malformed cookie file entries instead of crashing (invalid entry + length, invalid expires at) + +Extractors +* [youtube] Improve signature cipher extraction (#25187, #25188) +* [iprima] Improve extraction (#25138) +* [uol] Fix extraction (#22007) ++ [orf] Add support for more radio stations (#24938, #24968) +* [dailymotion] Fix typo +- [puhutv] Remove no longer available HTTP formats (#25124) + + +version 2020.05.03 + +Core ++ [extractor/common] Extract multiple JSON-LD entries +* [options] Clarify doc on --exec command (#19087, #24883) +* [extractor/common] Skip malformed ISM manifest XMLs while extracting + ISM formats (#24667) + +Extractors +* [crunchyroll] Fix and improve extraction (#25096, #25060) +* [youtube] Improve player id extraction +* [youtube] Use redirected video id if any (#25063) +* [yahoo] Fix GYAO Player extraction and relax URL regular expression + (#24178, #24778) +* [tvplay] Fix Viafree extraction (#15189, #24473, #24789) +* [tenplay] Relax URL regular expression (#25001) ++ [prosiebensat1] Extract series metadata +* [prosiebensat1] Improve extraction and remove 7tv.de support (#24948) +- [prosiebensat1] Remove 7tv.de support (#24948) +* [youtube] Fix DRM videos detection (#24736) +* [thisoldhouse] Fix video id extraction (#24548, #24549) ++ [soundcloud] Extract AAC format (#19173, #24708) +* [youtube] Skip broken multifeed videos (#24711) +* [nova:embed] Fix extraction (#24700) +* [motherless] Fix extraction (#24699) +* [twitch:clips] Extend URL regular expression (#24290, #24642) +* [tv4] Fix ISM formats extraction (#24667) +* [tele5] Fix extraction (#24553) ++ [mofosex] Add support for generic embeds (#24633) ++ [youporn] Add support for generic embeds ++ [spankwire] Add support for generic embeds (#24633) +* [spankwire] Fix extraction (#18924, #20648) + + +version 2020.03.24 + +Core +- [utils] Revert support for cookie files with spaces used instead of tabs + +Extractors +* [teachable] Update upskillcourses and gns3 domains +* [generic] Look for teachable embeds before wistia ++ [teachable] Extract chapter metadata (#24421) ++ [bilibili] Add support for player.bilibili.com (#24402) ++ [bilibili] Add support for new URL schema with BV ids (#24439, #24442) +* [limelight] Remove disabled API requests (#24255) +* [soundcloud] Fix download URL extraction (#24394) ++ [cbc:watch] Add support for authentication (#19160) +* [hellporno] Fix extraction (#24399) +* [xtube] Fix formats extraction (#24348) +* [ndr] Fix extraction (#24326) +* [nhk] Update m3u8 URL and use native HLS downloader (#24329) +- [nhk] Remove obsolete rtmp formats (#24329) +* [nhk] Relax URL regular expression (#24329) +- [vimeo] Revert fix showcase password protected video extraction (#24224) + + +version 2020.03.08 + +Core ++ [utils] Add support for cookie files with spaces used instead of tabs + +Extractors ++ [pornhub] Add support for pornhubpremium.com (#24288) +- [youtube] Remove outdated code and unnecessary requests +* [youtube] Improve extraction in 429 HTTP error conditions (#24283) +* [nhk] Update API version (#24270) + + +version 2020.03.06 + +Extractors +* [youtube] Fix age-gated videos support without login (#24248) +* [vimeo] Fix showcase password protected video extraction (#24224) +* [pornhub] Improve title extraction (#24184) +* [peertube] Improve extraction (#23657) ++ [servus] Add support for new URL schema (#23475, #23583, #24142) +* [vimeo] Fix subtitles URLs (#24209) + + +version 2020.03.01 + +Core +* [YoutubeDL] Force redirect URL to unicode on python 2 +- [options] Remove duplicate short option -v for --version (#24162) + +Extractors +* [xhamster] Fix extraction (#24205) +* [franceculture] Fix extraction (#24204) ++ [telecinco] Add support for article opening videos +* [telecinco] Fix extraction (#24195) +* [xtube] Fix metadata extraction (#21073, #22455) +* [youjizz] Fix extraction (#24181) +- Remove no longer needed compat_str around geturl +* [pornhd] Fix extraction (#24128) ++ [teachable] Add support for multiple videos per lecture (#24101) ++ [wistia] Add support for multiple generic embeds (#8347, 11385) +* [imdb] Fix extraction (#23443) +* [tv2dk:bornholm:play] Fix extraction (#24076) + + +version 2020.02.16 + +Core +* [YoutubeDL] Fix playlist entry indexing with --playlist-items (#10591, + #10622) +* [update] Fix updating via symlinks (#23991) ++ [compat] Introduce compat_realpath (#23991) + +Extractors ++ [npr] Add support for streams (#24042) ++ [24video] Add support for porn.24video.net (#23779, #23784) +- [jpopsuki] Remove extractor (#23858) +* [nova] Improve extraction (#23690) +* [nova:embed] Improve (#23690) +* [nova:embed] Fix extraction (#23672) ++ [abc:iview] Add support for 720p (#22907, #22921) +* [nytimes] Improve format sorting (#24010) ++ [toggle] Add support for mewatch.sg (#23895, #23930) +* [thisoldhouse] Fix extraction (#23951) ++ [popcorntimes] Add support for popcorntimes.tv (#23949) +* [sportdeutschland] Update to new API +* [twitch:stream] Lowercase channel id for stream request (#23917) +* [tv5mondeplus] Fix extraction (#23907, #23911) +* [tva] Relax URL regular expression (#23903) +* [vimeo] Fix album extraction (#23864) +* [viewlift] Improve extraction + * Fix extraction (#23851) + + Add support for authentication + + Add support for more domains +* [svt] Fix series extraction (#22297) +* [svt] Fix article extraction (#22897, #22919) +* [soundcloud] Imporve private playlist/set tracks extraction (#3707) + + +version 2020.01.24 + +Extractors +* [youtube] Fix sigfunc name extraction (#23819) +* [stretchinternet] Fix extraction (#4319) +* [voicerepublic] Fix extraction +* [azmedien] Fix extraction (#23783) +* [businessinsider] Fix jwplatform id extraction (#22929, #22954) ++ [24video] Add support for 24video.vip (#23753) +* [ivi:compilation] Fix entries extraction (#23770) +* [ard] Improve extraction (#23761) + * Simplify extraction + + Extract age limit and series + * Bypass geo-restriction ++ [nbc] Add support for nbc multi network URLs (#23049) +* [americastestkitchen] Fix extraction +* [zype] Improve extraction + + Extract subtitles (#21258) + + Support URLs with alternative keys/tokens (#21258) + + Extract more metadata +* [orf:tvthek] Improve geo restricted videos detection (#23741) +* [soundcloud] Restore previews extraction (#23739) + + +version 2020.01.15 + +Extractors +* [yourporn] Fix extraction (#21645, #22255, #23459) ++ [canvas] Add support for new API endpoint (#17680, #18629) +* [ndr:base:embed] Improve thumbnails extraction (#23731) ++ [vodplatform] Add support for embed.kwikmotion.com domain ++ [twitter] Add support for promo_video_website cards (#23711) +* [orf:radio] Clean description and improve extraction +* [orf:fm4] Fix extraction (#23599) +* [safari] Fix kaltura session extraction (#23679, #23670) +* [lego] Fix extraction and extract subtitle (#23687) +* [cloudflarestream] Improve extraction + + Add support for bytehighway.net domain + + Add support for signed URLs + + Extract thumbnail +* [naver] Improve extraction + * Improve geo-restriction handling + + Extract automatic captions + + Extract uploader metadata + + Extract VLive HLS formats + * Improve metadata extraction +- [pandatv] Remove extractor (#23630) +* [dctp] Fix format extraction (#23656) ++ [scrippsnetworks] Add support for www.discovery.com videos +* [discovery] Fix anonymous token extraction (#23650) +* [nrktv:seriebase] Fix extraction (#23625, #23537) +* [wistia] Improve format extraction and extract subtitles (#22590) +* [vice] Improve extraction (#23631) +* [redtube] Detect private videos (#23518) + + +version 2020.01.01 + +Extractors +* [brightcove] Invalidate policy key cache on failing requests +* [pornhub] Improve locked videos detection (#22449, #22780) ++ [pornhub] Add support for m3u8 formats +* [pornhub] Fix extraction (#22749, #23082) +* [brightcove] Update policy key on failing requests +* [spankbang] Improve removed video detection (#23423) +* [spankbang] Fix extraction (#23307, #23423, #23444) +* [soundcloud] Automatically update client id on failing requests +* [prosiebensat1] Improve geo restriction handling (#23571) +* [brightcove] Cache brightcove player policy keys +* [teachable] Fail with error message if no video URL found +* [teachable] Improve locked lessons detection (#23528) ++ [scrippsnetworks] Add support for Scripps Networks sites (#19857, #22981) +* [mitele] Fix extraction (#21354, #23456) +* [soundcloud] Update client id (#23516) +* [mailru] Relax URL regular expressions (#23509) + + +version 2019.12.25 + +Core +* [utils] Improve str_to_int ++ [downloader/hls] Add ability to override AES decryption key URL (#17521) + +Extractors +* [mediaset] Fix parse formats (#23508) ++ [tv2dk:bornholm:play] Add support for play.tv2bornholm.dk (#23291) ++ [slideslive] Add support for url and vimeo service names (#23414) +* [slideslive] Fix extraction (#23413) +* [twitch:clips] Fix extraction (#23375) ++ [soundcloud] Add support for token protected embeds (#18954) +* [vk] Improve extraction + * Fix User Videos extraction (#23356) + * Extract all videos for lists with more than 1000 videos (#23356) + + Add support for video albums (#14327, #14492) +- [kontrtube] Remove extractor +- [videopremium] Remove extractor +- [musicplayon] Remove extractor (#9225) ++ [ufctv] Add support for ufcfightpass.imgdge.com and + ufcfightpass.imggaming.com (#23343) ++ [twitch] Extract m3u8 formats frame rate (#23333) ++ [imggaming] Add support for playlists and extract subtitles ++ [ufcarabia] Add support for UFC Arabia (#23312) +* [ufctv] Fix extraction +* [yahoo] Fix gyao brightcove player id (#23303) +* [vzaar] Override AES decryption key URL (#17521) ++ [vzaar] Add support for AES HLS manifests (#17521, #23299) +* [nrl] Fix extraction +* [teachingchannel] Fix extraction +* [nintendo] Fix extraction and partially add support for Nintendo Direct + videos (#4592) ++ [ooyala] Add better fallback values for domain and streams variables ++ [youtube] Add support youtubekids.com (#23272) +* [tv2] Detect DRM protection ++ [tv2] Add support for katsomo.fi and mtv.fi (#10543) +* [tv2] Fix tv2.no article extraction +* [msn] Improve extraction + + Add support for YouTube and NBCSports embeds + + Add support for articles with multiple videos + * Improve AOL embed support + * Improve format extraction +* [abcotvs] Relax URL regular expression and improve metadata extraction + (#18014) +* [channel9] Reduce response size +* [adobetv] Improve extaction + * Use OnDemandPagedList for list extractors + * Reduce show extraction requests + * Extract original video format and subtitles + + Add support for adobe tv embeds + + +version 2019.11.28 + +Core ++ [utils] Add generic caesar cipher and rot47 +* [utils] Handle rd-suffixed day parts in unified_strdate (#23199) + +Extractors +* [vimeo] Improve extraction + * Fix review extraction + * Fix ondemand extraction + * Make password protected player case as an expected error (#22896) + * Simplify channel based extractors code +- [openload] Remove extractor (#11999) +- [verystream] Remove extractor +- [streamango] Remove extractor (#15406) +* [dailymotion] Improve extraction + * Extract http formats included in m3u8 manifest + * Fix user extraction (#3553, #21415) + + Add suport for User Authentication (#11491) + * Fix password protected videos extraction (#23176) + * Respect age limit option and family filter cookie value (#18437) + * Handle video url playlist query param + * Report allowed countries for geo-restricted videos +* [corus] Improve extraction + + Add support for Series Plus, W Network, YTV, ABC Spark, disneychannel.com + and disneylachaine.ca (#20861) + + Add support for self hosted videos (#22075) + * Detect DRM protection (#14910, #9164) +* [vivo] Fix extraction (#22328, #22279) ++ [bitchute] Extract upload date (#22990, #23193) +* [soundcloud] Update client id (#23214) + + +version 2019.11.22 + +Core ++ [extractor/common] Clean jwplayer description HTML tags ++ [extractor/common] Add data, headers and query to all major extract formats + methods + +Extractors +* [chaturbate] Fix extraction (#23010, #23012) ++ [ntvru] Add support for non relative file URLs (#23140) +* [vk] Fix wall audio thumbnails extraction (#23135) +* [ivi] Fix format extraction (#21991) +- [comcarcoff] Remove extractor ++ [drtv] Add support for new URL schema (#23059) ++ [nexx] Add support for Multi Player JS Setup (#23052) ++ [teamcoco] Add support for new videos (#23054) +* [soundcloud] Check if the soundtrack has downloads left (#23045) +* [facebook] Fix posts video data extraction (#22473) +- [addanime] Remove extractor +- [minhateca] Remove extractor +- [daisuki] Remove extractor +* [seeker] Fix extraction +- [revision3] Remove extractors +* [twitch] Fix video comments URL (#18593, #15828) +* [twitter] Improve extraction + + Add support for generic embeds (#22168) + * Always extract http formats for native videos (#14934) + + Add support for Twitter Broadcasts (#21369) + + Extract more metadata + * Improve VMap format extraction + * Unify extraction code for both twitter statuses and cards ++ [twitch] Add support for Clip embed URLs +* [lnkgo] Fix extraction (#16834) +* [mixcloud] Improve extraction + * Improve metadata extraction (#11721) + * Fix playlist extraction (#22378) + * Fix user mixes extraction (#15197, #17865) ++ [kinja] Add support for Kinja embeds (#5756, #11282, #22237, #22384) +* [onionstudios] Fix extraction ++ [hotstar] Pass Referer header to format requests (#22836) +* [dplay] Minimize response size ++ [patreon] Extract uploader_id and filesize +* [patreon] Minimize response size +* [roosterteeth] Fix login request (#16094, #22689) + + +version 2019.11.05 + +Extractors ++ [scte] Add support for learning.scte.org (#22975) ++ [msn] Add support for Vidible and AOL embeds (#22195, #22227) +* [myspass] Fix video URL extraction and improve metadata extraction (#22448) +* [jamendo] Improve extraction + * Fix album extraction (#18564) + * Improve metadata extraction (#18565, #21379) +* [mediaset] Relax URL guid matching (#18352) ++ [mediaset] Extract unprotected M3U and MPD manifests (#17204) +* [telegraaf] Fix extraction ++ [bellmedia] Add support for marilyn.ca videos (#22193) +* [stv] Fix extraction (#22928) +- [iconosquare] Remove extractor +- [keek] Remove extractor +- [gameone] Remove extractor (#21778) +- [flipagram] Remove extractor +- [bambuser] Remove extractor +* [wistia] Reduce embed extraction false positives ++ [wistia] Add support for inline embeds (#22931) +- [go90] Remove extractor +* [kakao] Remove raw request ++ [kakao] Extract format total bitrate +* [daum] Fix VOD and Clip extracton (#15015) +* [kakao] Improve extraction + + Add support for embed URLs + + Add support for Kakao Legacy vid based embed URLs + * Only extract fields used for extraction + * Strip description and extract tags +* [mixcloud] Fix cloudcast data extraction (#22821) +* [yahoo] Improve extraction + + Add support for live streams (#3597, #3779, #22178) + * Bypass cookie consent page for european domains (#16948, #22576) + + Add generic support for embeds (#20332) +* [tv2] Fix and improve extraction (#22787) ++ [tv2dk] Add support for TV2 DK sites +* [onet] Improve extraction … + + Add support for onet100.vod.pl + + Extract m3u8 formats + * Correct audio only format info +* [fox9] Fix extraction + + +version 2019.10.29 + +Core +* [utils] Actualize major IPv4 address blocks per country + +Extractors ++ [go] Add support for abc.com and freeform.com (#22823, #22864) ++ [mtv] Add support for mtvjapan.com +* [mtv] Fix extraction for mtv.de (#22113) +* [videodetective] Fix extraction +* [internetvideoarchive] Fix extraction +* [nbcnews] Fix extraction (#12569, #12576, #21703, #21923) +- [hark] Remove extractor +- [tutv] Remove extractor +- [learnr] Remove extractor +- [macgamestore] Remove extractor +* [la7] Update Kaltura service URL (#22358) +* [thesun] Fix extraction (#16966) +- [makertv] Remove extractor ++ [tenplay] Add support for 10play.com.au (#21446) +* [soundcloud] Improve extraction + * Improve format extraction (#22123) + + Extract uploader_id and uploader_url (#21916) + + Extract all known thumbnails (#19071, #20659) + * Fix extration for private playlists (#20976) + + Add support for playlist embeds (#20976) + * Skip preview formats (#22806) +* [dplay] Improve extraction + + Add support for dplay.fi, dplay.jp and es.dplay.com (#16969) + * Fix it.dplay.com extraction (#22826) + + Extract creator, tags and thumbnails + * Handle playback API call errors ++ [discoverynetworks] Add support for dplay.co.uk +* [vk] Improve extraction + + Add support for Odnoklassniki embeds + + Extract more videos from user lists (#4470) + + Fix wall post audio extraction (#18332) + * Improve error detection (#22568) ++ [odnoklassniki] Add support for embeds +* [puhutv] Improve extraction + * Fix subtitles extraction + * Transform HLS URLs to HTTP URLs + * Improve metadata extraction +* [ceskatelevize] Skip DRM media ++ [facebook] Extract subtitles (#22777) +* [globo] Handle alternative hash signing method + + +version 2019.10.22 + +Core +* [utils] Improve subtitles_filename (#22753) + +Extractors +* [facebook] Bypass download rate limits (#21018) ++ [contv] Add support for contv.com +- [viewster] Remove extractor +* [xfileshare] Improve extractor (#17032, #17906, #18237, #18239) + * Update the list of domains + + Add support for aa-encoded video data + * Improve jwplayer format extraction + + Add support for Clappr sources +* [mangomolo] Fix video format extraction and add support for player URLs +* [audioboom] Improve metadata extraction +* [twitch] Update VOD URL matching (#22395, #22727) +- [mit] Remove support for video.mit.edu (#22403) +- [servingsys] Remove extractor (#22639) +* [dumpert] Fix extraction (#22428, #22564) +* [atresplayer] Fix extraction (#16277, #16716) + + +version 2019.10.16 + +Core +* [extractor/common] Make _is_valid_url more relaxed + +Extractors +* [vimeo] Improve album videos id extraction (#22599) ++ [globo] Extract subtitles (#22713) +* [bokecc] Improve player params extraction (#22638) +* [nexx] Handle result list (#22666) +* [vimeo] Fix VHX embed extraction +* [nbc] Switch to graphql API (#18581, #22693, #22701) +- [vessel] Remove extractor +- [promptfile] Remove extractor (#6239) +* [kaltura] Fix service URL extraction (#22658) +* [kaltura] Fix embed info strip (#22658) +* [globo] Fix format extraction (#20319) +* [redtube] Improve metadata extraction (#22492, #22615) +* [pornhub:uservideos:upload] Fix extraction (#22619) ++ [telequebec:squat] Add support for squat.telequebec.tv (#18503) +- [wimp] Remove extractor (#22088, #22091) ++ [gfycat] Extend URL regular expression (#22225) ++ [chaturbate] Extend URL regular expression (#22309) +* [peertube] Update instances (#22414) ++ [telequebec] Add support for coucou.telequebec.tv (#22482) ++ [xvideos] Extend URL regular expression (#22471) +- [youtube] Remove support for invidious.enkirton.net (#22543) ++ [openload] Add support for oload.monster (#22592) +* [nrktv:seriebase] Fix extraction (#22596) ++ [youtube] Add support for yt.lelux.fi (#22597) +* [orf:tvthek] Make manifest requests non fatal (#22578) +* [teachable] Skip login when already logged in (#22572) +* [viewlift] Improve extraction (#22545) +* [nonktube] Fix extraction (#22544) + + +version 2019.09.28 + +Core +* [YoutubeDL] Honour all --get-* options with --flat-playlist (#22493) + +Extractors +* [vk] Fix extraction (#22522) +* [heise] Fix kaltura embeds extraction (#22514) +* [ted] Check for resources validity and extract subtitled downloads (#22513) ++ [youtube] Add support for + owxfohz4kjyv25fvlqilyxast7inivgiktls3th44jhk3ej3i7ya.b32.i2p (#22292) ++ [nhk] Add support for clips +* [nhk] Fix video extraction (#22249, #22353) +* [byutv] Fix extraction (#22070) ++ [openload] Add support for oload.online (#22304) ++ [youtube] Add support for invidious.drycat.fr (#22451) +* [jwplatfom] Do not match video URLs (#20596, #22148) +* [youtube:playlist] Unescape playlist uploader (#22483) ++ [bilibili] Add support audio albums and songs (#21094) ++ [instagram] Add support for tv URLs ++ [mixcloud] Allow uppercase letters in format URLs (#19280) +* [brightcove] Delegate all supported legacy URLs to new extractor (#11523, + #12842, #13912, #15669, #16303) +* [hotstar] Use native HLS downloader by default ++ [hotstar] Extract more formats (#22323) +* [9now] Fix extraction (#22361) +* [zdf] Bypass geo restriction ++ [tv4] Extract series metadata +* [tv4] Fix extraction (#22443) + + +version 2019.09.12.1 + +Extractors +* [youtube] Remove quality and tbr for itag 43 (#22372) + + +version 2019.09.12 + +Extractors +* [youtube] Quick extraction tempfix (#22367, #22163) + + +version 2019.09.01 + +Core ++ [extractor/generic] Add support for squarespace embeds (#21294, #21802, + #21859) ++ [downloader/external] Respect mtime option for aria2c (#22242) + +Extractors ++ [xhamster:user] Add support for user pages (#16330, #18454) ++ [xhamster] Add support for more domains ++ [verystream] Add support for woof.tube (#22217) ++ [dailymotion] Add support for lequipe.fr (#21328, #22152) ++ [openload] Add support for oload.vip (#22205) ++ [bbccouk] Extend URL regular expression (#19200) ++ [youtube] Add support for invidious.nixnet.xyz and yt.elukerio.org (#22223) +* [safari] Fix authentication (#22161, #22184) +* [usanetwork] Fix extraction (#22105) ++ [einthusan] Add support for einthusan.ca (#22171) +* [youtube] Improve unavailable message extraction (#22117) ++ [piksel] Extract subtitles (#20506) + + +version 2019.08.13 + +Core +* [downloader/fragment] Fix ETA calculation of resumed download (#21992) +* [YoutubeDL] Check annotations availability (#18582) + +Extractors +* [youtube:playlist] Improve flat extraction (#21927) +* [youtube] Fix annotations extraction (#22045) ++ [discovery] Extract series meta field (#21808) +* [youtube] Improve error detection (#16445) +* [vimeo] Fix album extraction (#1933, #15704, #15855, #18967, #21986) ++ [roosterteeth] Add support for watch URLs +* [discovery] Limit video data by show slug (#21980) + + +version 2019.08.02 + +Extractors ++ [tvigle] Add support for HLS and DASH formats (#21967) +* [tvigle] Fix extraction (#21967) ++ [yandexvideo] Add support for DASH formats (#21971) +* [discovery] Use API call for video data extraction (#21808) ++ [mgtv] Extract format_note (#21881) +* [tvn24] Fix metadata extraction (#21833, #21834) +* [dlive] Relax URL regular expression (#21909) ++ [openload] Add support for oload.best (#21913) +* [youtube] Improve metadata extraction for age gate content (#21943) + + +version 2019.07.30 + +Extractors +* [youtube] Fix and improve title and description extraction (#21934) + + +version 2019.07.27 + +Extractors ++ [yahoo:japannews] Add support for yahoo.co.jp (#21698, #21265) ++ [discovery] Add support go.discovery.com URLs +* [youtube:playlist] Relax video regular expression (#21844) +* [generic] Restrict --default-search schemeless URLs detection pattern + (#21842) +* [vrv] Fix CMS signing query extraction (#21809) + + +version 2019.07.16 + +Extractors ++ [asiancrush] Add support for yuyutv.com, midnightpulp.com and cocoro.tv + (#21281, #21290) +* [kaltura] Check source format URL (#21290) +* [ctsnews] Fix YouTube embeds extraction (#21678) ++ [einthusan] Add support for einthusan.com (#21748, #21775) ++ [youtube] Add support for invidious.mastodon.host (#21777) ++ [gfycat] Extend URL regular expression (#21779, #21780) +* [youtube] Restrict is_live extraction (#21782) + + +version 2019.07.14 + +Extractors +* [porn91] Fix extraction (#21312) ++ [yandexmusic] Extract track number and disk number (#21421) ++ [yandexmusic] Add support for multi disk albums (#21420, #21421) +* [lynda] Handle missing subtitles (#20490, #20513) ++ [youtube] Add more invidious instances to URL regular expression (#21694) +* [twitter] Improve uploader id extraction (#21705) +* [spankbang] Fix and improve metadata extraction +* [spankbang] Fix extraction (#21763, #21764) ++ [dlive] Add support for dlive.tv (#18080) ++ [livejournal] Add support for livejournal.com (#21526) +* [roosterteeth] Fix free episode extraction (#16094) +* [dbtv] Fix extraction +* [bellator] Fix extraction +- [rudo] Remove extractor (#18430, #18474) +* [facebook] Fallback to twitter:image meta for thumbnail extraction (#21224) +* [bleacherreport] Fix Bleacher Report CMS extraction +* [espn] Fix fivethirtyeight.com extraction +* [5tv] Relax video URL regular expression and support https URLs +* [youtube] Fix is_live extraction (#21734) +* [youtube] Fix authentication (#11270) + + +version 2019.07.12 + +Core ++ [adobepass] Add support for AT&T U-verse (mso ATT) (#13938, #21016) + +Extractors ++ [mgtv] Pass Referer HTTP header for format URLs (#21726) ++ [beeg] Add support for api/v6 v2 URLs without t argument (#21701) +* [voxmedia:volume] Improvevox embed extraction (#16846) +* [funnyordie] Move extraction to VoxMedia extractor (#16846) +* [gameinformer] Fix extraction (#8895, #15363, #17206) +* [funk] Fix extraction (#17915) +* [packtpub] Relax lesson URL regular expression (#21695) +* [packtpub] Fix extraction (#21268) +* [philharmoniedeparis] Relax URL regular expression (#21672) +* [peertube] Detect embed URLs in generic extraction (#21666) +* [mixer:vod] Relax URL regular expression (#21657, #21658) ++ [lecturio] Add support id based URLs (#21630) ++ [go] Add site info for disneynow (#21613) +* [ted] Restrict info regular expression (#21631) +* [twitch:vod] Actualize m3u8 URL (#21538, #21607) +* [vzaar] Fix videos with empty title (#21606) +* [tvland] Fix extraction (#21384) +* [arte] Clean extractor (#15583, #21614) + + +version 2019.07.02 + +Core ++ [utils] Introduce random_user_agent and use as default User-Agent (#21546) + +Extractors ++ [vevo] Add support for embed.vevo.com URLs (#21565) ++ [openload] Add support for oload.biz (#21574) +* [xiami] Update API base URL (#21575) +* [yourporn] Fix extraction (#21585) ++ [acast] Add support for URLs with episode id (#21444) ++ [dailymotion] Add support for DM.player embeds +* [soundcloud] Update client id + + +version 2019.06.27 + +Extractors ++ [go] Add support for disneynow.com (#21528) +* [mixer:vod] Relax URL regular expression (#21531, #21536) +* [drtv] Relax URL regular expression +* [fusion] Fix extraction (#17775, #21269) +- [nfb] Remove extractor (#21518) ++ [beeg] Add support for api/v6 v2 URLs (#21511) ++ [brightcove:new] Add support for playlists (#21331) ++ [openload] Add support for oload.life (#21495) +* [vimeo:channel,group] Make title extraction non fatal +* [vimeo:likes] Implement extrator in terms of channel extractor (#21493) ++ [pornhub] Add support for more paged video sources ++ [pornhub] Add support for downloading single pages and search pages (#15570) +* [pornhub] Rework extractors (#11922, #16078, #17454, #17936) ++ [youtube] Add another signature function pattern +* [tf1] Fix extraction (#21365, #21372) +* [crunchyroll] Move Accept-Language workaround to video extractor since + it causes playlists not to list any videos +* [crunchyroll:playlist] Fix and relax title extraction (#21291, #21443) + + +version 2019.06.21 + +Core +* [utils] Restrict parse_codecs and add theora as known vcodec (#21381) + +Extractors +* [youtube] Update signature function patterns (#21469, #21476) +* [youtube] Make --write-annotations non fatal (#21452) ++ [sixplay] Add support for rtlmost.hu (#21405) +* [youtube] Hardcode codec metadata for av01 video only formats (#21381) +* [toutv] Update client key (#21370) ++ [biqle] Add support for new embed domain +* [cbs] Improve DRM protected videos detection (#21339) + + +version 2019.06.08 + +Core +* [downloader/common] Improve rate limit (#21301) +* [utils] Improve strip_or_none +* [extractor/common] Strip src attribute for HTML5 entries code (#18485, + #21169) + +Extractors +* [ted] Fix playlist extraction (#20844, #21032) +* [vlive:playlist] Fix video extraction when no playlist is found (#20590) ++ [vlive] Add CH+ support (#16887, #21209) ++ [openload] Add support for oload.website (#21329) ++ [tvnow] Extract HD formats (#21201) ++ [redbulltv] Add support for rrn:content URLs (#21297) +* [youtube] Fix average rating extraction (#21304) ++ [bitchute] Extract HTML5 formats (#21306) +* [cbsnews] Fix extraction (#9659, #15397) +* [vvvvid] Relax URL regular expression (#21299) ++ [prosiebensat1] Add support for new API (#21272) ++ [vrv] Extract adaptive_hls formats (#21243) +* [viki] Switch to HTTPS (#21001) +* [LiveLeak] Check if the original videos exist (#21206, #21208) +* [rtp] Fix extraction (#15099) +* [youtube] Improve DRM protected videos detection (#1774) ++ [srgssrplay] Add support for popupvideoplayer URLs (#21155) ++ [24video] Add support for porno.24video.net (#21194) ++ [24video] Add support for 24video.site (#21193) +- [pornflip] Remove extractor +- [criterion] Remove extractor (#21195) +* [pornhub] Use HTTPS (#21061) +* [bitchute] Fix uploader extraction (#21076) +* [streamcloud] Reduce waiting time to 6 seconds (#21092) +- [novamov] Remove extractors (#21077) ++ [openload] Add support for oload.press (#21135) +* [vivo] Fix extraction (#18906, #19217) + + +version 2019.05.20 + +Core ++ [extractor/common] Move workaround for applying first Set-Cookie header + into a separate _apply_first_set_cookie_header method + +Extractors +* [safari] Fix authentication (#21090) +* [vk] Use _apply_first_set_cookie_header +* [vrt] Fix extraction (#20527) ++ [canvas] Add support for vrtnieuws and sporza site ids and extract + AES HLS formats ++ [vrv] Extract captions (#19238) +* [tele5] Improve video id extraction +* [tele5] Relax URL regular expression (#21020, #21063) +* [svtplay] Update API URL (#21075) ++ [yahoo:gyao] Add X-User-Agent header to dam proxy requests (#21071) + + +version 2019.05.11 + +Core +* [utils] Transliterate "þ" as "th" (#20897) + +Extractors ++ [cloudflarestream] Add support for videodelivery.net (#21049) ++ [byutv] Add support for DVR videos (#20574, #20676) ++ [gfycat] Add support for URLs with tags (#20696, #20731) ++ [openload] Add support for verystream.com (#20701, #20967) +* [youtube] Use sp field value for signature field name (#18841, #18927, + #21028) ++ [yahoo:gyao] Extend URL regular expression (#21008) +* [youtube] Fix channel id extraction (#20982, #21003) ++ [sky] Add support for news.sky.com (#13055) ++ [youtube:entrylistbase] Retry on 5xx HTTP errors (#20965) ++ [francetvinfo] Extend video id extraction (#20619, #20740) +* [4tube] Update token hosts (#20918) +* [hotstar] Move to API v2 (#20931) +* [fox] Fix API error handling under python 2 (#20925) ++ [redbulltv] Extend URL regular expression (#20922) + + +version 2019.04.30 + +Extractors +* [openload] Use real Chrome versions (#20902) +- [youtube] Remove info el for get_video_info request +* [youtube] Improve extraction robustness +- [dramafever] Remove extractor (#20868) +* [adn] Fix subtitle extraction (#12724) ++ [ccc] Extract creator (#20355) ++ [ccc:playlist] Add support for media.ccc.de playlists (#14601, #20355) ++ [sverigesradio] Add support for sverigesradio.se (#18635) ++ [cinemax] Add support for cinemax.com +* [sixplay] Try extracting non-DRM protected manifests (#20849) ++ [youtube] Extract Youtube Music Auto-generated metadata (#20599, #20742) +- [wrzuta] Remove extractor (#20684, #20801) +* [twitch] Prefer source format (#20850) ++ [twitcasting] Add support for private videos (#20843) +* [reddit] Validate thumbnail URL (#20030) +* [yandexmusic] Fix track URL extraction (#20820) + + +version 2019.04.24 + +Extractors +* [youtube] Fix extraction (#20758, #20759, #20761, #20762, #20764, #20766, + #20767, #20769, #20771, #20768, #20770) +* [toutv] Fix extraction and extract series info (#20757) ++ [vrv] Add support for movie listings (#19229) ++ [youtube] Print error when no data is available (#20737) ++ [soundcloud] Add support for new rendition and improve extraction (#20699) ++ [ooyala] Add support for geo verification proxy ++ [nrl] Add support for nrl.com (#15991) ++ [vimeo] Extract live archive source format (#19144) ++ [vimeo] Add support for live streams and improve info extraction (#19144) ++ [ntvcojp] Add support for cu.ntv.co.jp ++ [nhk] Extract RTMPT format ++ [nhk] Add support for audio URLs ++ [udemy] Add another course id extraction pattern (#20491) ++ [openload] Add support for oload.services (#20691) ++ [openload] Add support for openloed.co (#20691, #20693) +* [bravotv] Fix extraction (#19213) + + +version 2019.04.17 + +Extractors +* [openload] Randomize User-Agent (#20688) ++ [openload] Add support for oladblock domains (#20471) +* [adn] Fix subtitle extraction (#12724) ++ [aol] Add support for localized websites ++ [yahoo] Add support GYAO episode URLs ++ [yahoo] Add support for streaming.yahoo.co.jp (#5811, #7098) ++ [yahoo] Add support for gyao.yahoo.co.jp +* [aenetworks] Fix history topic extraction and extract more formats ++ [cbs] Extract smpte and vtt subtitles ++ [streamango] Add support for streamcherry.com (#20592) ++ [yourporn] Add support for sxyprn.com (#20646) +* [mgtv] Fix extraction (#20650) +* [linkedin:learning] Use urljoin for form action URL (#20431) ++ [gdc] Add support for kaltura embeds (#20575) +* [dispeak] Improve mp4 bitrate extraction +* [kaltura] Sanitize embed URLs +* [jwplatfom] Do not match manifest URLs (#20596) +* [aol] Restrict URL regular expression and improve format extraction ++ [tiktok] Add support for new URL schema (#20573) ++ [stv:player] Add support for player.stv.tv (#20586) + + +version 2019.04.07 + +Core ++ [downloader/external] Pass rtmp_conn to ffmpeg + +Extractors ++ [ruutu] Add support for audio podcasts (#20473, #20545) ++ [xvideos] Extract all thumbnails (#20432) ++ [platzi] Add support for platzi.com (#20562) +* [dvtv] Fix extraction (#18514, #19174) ++ [vrv] Add basic support for individual movie links (#19229) ++ [bfi:player] Add support for player.bfi.org.uk (#19235) +* [hbo] Fix extraction and extract subtitles (#14629, #13709) +* [youtube] Extract srv[1-3] subtitle formats (#20566) +* [adultswim] Fix extraction (#18025) +* [teamcoco] Fix extraction and add suport for subdomains (#17099, #20339) +* [adn] Fix subtitle compatibility with ffmpeg +* [adn] Fix extraction and add support for positioning styles (#20549) +* [vk] Use unique video id (#17848) +* [newstube] Fix extraction +* [rtl2] Actualize extraction ++ [adobeconnect] Add support for adobeconnect.com (#20283) ++ [gaia] Add support for authentication (#14605) ++ [mediasite] Add support for dashed ids and named catalogs (#20531) + + +version 2019.04.01 + +Core +* [utils] Improve int_or_none and float_or_none (#20403) +* Check for valid --min-sleep-interval when --max-sleep-interval is specified + (#20435) + +Extractors ++ [weibo] Extend URL regular expression (#20496) ++ [xhamster] Add support for xhamster.one (#20508) ++ [mediasite] Add support for catalogs (#20507) ++ [teamtreehouse] Add support for teamtreehouse.com (#9836) ++ [ina] Add support for audio URLs +* [ina] Improve extraction +* [cwtv] Fix episode number extraction (#20461) +* [npo] Improve DRM detection ++ [pornhub] Add support for DASH formats (#20403) +* [svtplay] Update API endpoint (#20430) + + +version 2019.03.18 + +Core +* [extractor/common] Improve HTML5 entries extraction ++ [utils] Introduce parse_bitrate +* [update] Hide update URLs behind redirect +* [extractor/common] Fix url meta field for unfragmented DASH formats (#20346) + +Extractors ++ [yandexvideo] Add extractor +* [openload] Improve embed detection ++ [corus] Add support for bigbrothercanada.ca (#20357) ++ [orf:radio] Extract series (#20012) ++ [cbc:watch] Add support for gem.cbc.ca (#20251, #20359) +- [anysex] Remove extractor (#19279) ++ [ciscolive] Add support for new URL schema (#20320, #20351) ++ [youtube] Add support for invidiou.sh (#20309) +- [anitube] Remove extractor (#20334) +- [ruleporn] Remove extractor (#15344, #20324) +* [npr] Fix extraction (#10793, #13440) +* [biqle] Fix extraction (#11471, #15313) +* [viddler] Modernize +* [moevideo] Fix extraction +* [primesharetv] Remove extractor +* [hypem] Modernize and extract more metadata (#15320) +* [veoh] Fix extraction +* [escapist] Modernize +- [videomega] Remove extractor (#10108) ++ [beeg] Add support for beeg.porn (#20306) +* [vimeo:review] Improve config url extraction and extract original format + (#20305) +* [fox] Detect geo restriction and authentication errors (#20208) + + +version 2019.03.09 + +Core +* [extractor/common] Use compat_etree_Element ++ [compat] Introduce compat_etree_Element +* [extractor/common] Fallback url to base URL for DASH formats +* [extractor/common] Do not fail on invalid data while parsing F4M manifest + in non fatal mode +* [extractor/common] Return MPD manifest as format's url meta field (#20242) +* [utils] Strip #HttpOnly_ prefix from cookies files (#20219) + +Extractors +* [francetv:site] Relax video id regular expression (#20268) +* [toutv] Detect invalid login error +* [toutv] Fix authentication (#20261) ++ [urplay] Extract timestamp (#20235) ++ [openload] Add support for oload.space (#20246) +* [facebook] Improve uploader extraction (#20250) +* [bbc] Use compat_etree_Element +* [crunchyroll] Use compat_etree_Element +* [npo] Improve ISM extraction +* [rai] Improve extraction (#20253) +* [paramountnetwork] Fix mgid extraction (#20241) +* [libsyn] Improve extraction (#20229) ++ [youtube] Add more invidious instances to URL regular expression (#20228) +* [spankbang] Fix extraction (#20023) +* [espn] Extend URL regular expression (#20013) +* [sixplay] Handle videos with empty assets (#20016) ++ [vimeo] Add support for Vimeo Pro portfolio protected videos (#20070) + + +version 2019.03.01 + +Core ++ [downloader/external] Add support for rate limit and retries for wget +* [downloader/external] Fix infinite retries for curl (#19303) + +Extractors +* [npo] Fix extraction (#20084) +* [francetv:site] Extend video id regex (#20029, #20071) ++ [periscope] Extract width and height (#20015) +* [servus] Fix extraction (#19297) +* [bbccouk] Make subtitles non fatal (#19651) +* [metacafe] Fix family filter bypass (#19287) + + +version 2019.02.18 + +Extractors +* [tvp:website] Fix and improve extraction ++ [tvp] Detect unavailable videos +* [tvp] Fix description extraction and make thumbnail optional ++ [linuxacademy] Add support for linuxacademy.com (#12207) +* [bilibili] Update keys (#19233) +* [udemy] Extend URL regular expressions (#14330, #15883) +* [udemy] Update User-Agent and detect captcha (#14713, #15839, #18126) +* [noovo] Fix extraction (#19230) +* [rai] Relax URL regular expression (#19232) ++ [vshare] Pass Referer to download request (#19205, #19221) ++ [openload] Add support for oload.live (#19222) +* [imgur] Use video id as title fallback (#18590) ++ [twitch] Add new source format detection approach (#19193) +* [tvplayhome] Fix video id extraction (#19190) +* [tvplayhome] Fix episode metadata extraction (#19190) +* [rutube:embed] Fix extraction (#19163) ++ [rutube:embed] Add support private videos (#19163) ++ [soundcloud] Extract more metadata ++ [trunews] Add support for trunews.com (#19153) ++ [linkedin:learning] Extract chapter_number and chapter_id (#19162) + + +version 2019.02.08 + +Core +* [utils] Improve JSON-LD regular expression (#18058) +* [YoutubeDL] Fallback to ie_key of matching extractor while making + download archive id when no explicit ie_key is provided (#19022) + +Extractors ++ [malltv] Add support for mall.tv (#18058, #17856) ++ [spankbang:playlist] Add support for playlists (#19145) +* [spankbang] Extend URL regular expression +* [trutv] Fix extraction (#17336) +* [toutv] Fix authentication (#16398, #18700) +* [pornhub] Fix tags and categories extraction (#13720, #19135) +* [pornhd] Fix formats extraction ++ [pornhd] Extract like count (#19123, #19125) +* [radiocanada] Switch to the new media requests (#19115) ++ [teachable] Add support for courses.workitdaily.com (#18871) +- [vporn] Remove extractor (#16276) ++ [soundcloud:pagedplaylist] Add ie and title to entries (#19022, #19086) ++ [drtuber] Extract duration (#19078) +* [soundcloud] Fix paged playlists extraction, add support for albums and update client id +* [soundcloud] Update client id +* [drtv] Improve preference (#19079) ++ [openload] Add support for openload.pw and oload.pw (#18930) ++ [openload] Add support for oload.info (#19073) +* [crackle] Authorize media detail request (#16931) + + +version 2019.01.30.1 + +Core +* [postprocessor/ffmpeg] Fix avconv processing broken in #19025 (#19067) + + +version 2019.01.30 + +Core +* [postprocessor/ffmpeg] Do not copy Apple TV chapter tracks while embedding + subtitles (#19024, #19042) +* [postprocessor/ffmpeg] Disable "Last message repeated" messages (#19025) + +Extractors +* [yourporn] Fix extraction and extract duration (#18815, #18852, #19061) +* [drtv] Improve extraction (#19039) + + Add support for EncryptedUri videos + + Extract more metadata + * Fix subtitles extraction ++ [fox] Add support for locked videos using cookies (#19060) +* [fox] Fix extraction for free videos (#19060) ++ [zattoo] Add support for tv.salt.ch (#19059) + + +version 2019.01.27 + +Core ++ [extractor/common] Extract season in _json_ld +* [postprocessor/ffmpeg] Fallback to ffmpeg/avconv for audio codec detection + (#681) + +Extractors +* [vice] Fix extraction for locked videos (#16248) ++ [wakanim] Detect DRM protected videos ++ [wakanim] Add support for wakanim.tv (#14374) +* [usatoday] Fix extraction for videos with custom brightcove partner id + (#18990) +* [drtv] Fix extraction (#18989) +* [nhk] Extend URL regular expression (#18968) +* [go] Fix Adobe Pass requests for Disney Now (#18901) ++ [openload] Add support for oload.club (#18969) + + +version 2019.01.24 + +Core +* [YoutubeDL] Fix negation for string operators in format selection (#18961) + + +version 2019.01.23 + +Core +* [utils] Fix urljoin for paths with non-http(s) schemes +* [extractor/common] Improve jwplayer relative URL handling (#18892) ++ [YoutubeDL] Add negation support for string comparisons in format selection + expressions (#18600, #18805) +* [extractor/common] Improve HLS video-only format detection (#18923) + +Extractors +* [crunchyroll] Extend URL regular expression (#18955) +* [pornhub] Bypass scrape detection (#4822, #5930, #7074, #10175, #12722, + #17197, #18338 #18842, #18899) ++ [vrv] Add support for authentication (#14307) +* [videomore:season] Fix extraction +* [videomore] Improve extraction (#18908) ++ [tnaflix] Pass Referer in metadata request (#18925) +* [radiocanada] Relax DRM check (#18608, #18609) +* [vimeo] Fix video password verification for videos protected by + Referer HTTP header ++ [hketv] Add support for hkedcity.net (#18696) ++ [streamango] Add support for fruithosts.net (#18710) ++ [instagram] Add support for tags (#18757) ++ [odnoklassniki] Detect paid videos (#18876) +* [ted] Correct acodec for HTTP formats (#18923) +* [cartoonnetwork] Fix extraction (#15664, #17224) +* [vimeo] Fix extraction for password protected player URLs (#18889) + + +version 2019.01.17 + +Extractors +* [youtube] Extend JS player signature function name regular expressions + (#18890, #18891, #18893) + + +version 2019.01.16 + +Core ++ [test/helper] Add support for maxcount and count collection len checkers +* [downloader/hls] Fix uplynk ad skipping (#18824) +* [postprocessor/ffmpeg] Improve ffmpeg version parsing (#18813) + +Extractors +* [youtube] Skip unsupported adaptive stream type (#18804) ++ [youtube] Extract DASH formats from player response (#18804) +* [funimation] Fix extraction (#14089) +* [skylinewebcams] Fix extraction (#18853) ++ [curiositystream] Add support for non app URLs ++ [bitchute] Check formats (#18833) +* [wistia] Extend URL regular expression (#18823) ++ [playplustv] Add support for playplus.com (#18789) + + +version 2019.01.10 + +Core +* [extractor/common] Use episode name as title in _json_ld ++ [extractor/common] Add support for movies in _json_ld +* [postprocessor/ffmpeg] Embed subtitles with non-standard language codes + (#18765) ++ [utils] Add language codes replaced in 1989 revision of ISO 639 + to ISO639Utils (#18765) + +Extractors +* [youtube] Extract live HLS URL from player response (#18799) ++ [outsidetv] Add support for outsidetv.com (#18774) +* [jwplatform] Use JW Platform Delivery API V2 and add support for more URLs ++ [fox] Add support National Geographic (#17985, #15333, #14698) ++ [playplustv] Add support for playplus.tv (#18789) +* [globo] Set GLBID cookie manually (#17346) ++ [gaia] Add support for gaia.com (#14605) +* [youporn] Fix title and description extraction (#18748) ++ [hungama] Add support for hungama.com (#17402, #18771) +* [dtube] Fix extraction (#18741) +* [tvnow] Fix and rework extractors and prepare for a switch to the new API + (#17245, #18499) +* [carambatv:page] Fix extraction (#18739) + + +version 2019.01.02 + +Extractors +* [discovery] Use geo verification headers (#17838) ++ [packtpub] Add support for subscription.packtpub.com (#18718) +* [yourporn] Fix extraction (#18583) ++ [acast:channel] Add support for play.acast.com (#18587) ++ [extractors] Add missing age limits (#18621) ++ [rmcdecouverte] Add support for live stream +* [rmcdecouverte] Bypass geo restriction +* [rmcdecouverte] Update URL regular expression (#18595, 18697) +* [manyvids] Fix extraction (#18604, #18614) +* [bitchute] Fix extraction (#18567) + + +version 2018.12.31 + +Extractors ++ [bbc] Add support for another embed pattern (#18643) ++ [npo:live] Add support for npostart.nl (#18644) +* [beeg] Fix extraction (#18610, #18626) +* [youtube] Unescape HTML for series (#18641) ++ [youtube] Extract more format metadata +* [youtube] Detect DRM protected videos (#1774) +* [youtube] Relax HTML5 player regular expressions (#18465, #18466) +* [youtube] Extend HTML5 player regular expression (#17516) ++ [liveleak] Add support for another embed type and restore original + format extraction ++ [crackle] Extract ISM and HTTP formats ++ [twitter] Pass Referer with card request (#18579) +* [mediasite] Extend URL regular expression (#18558) ++ [lecturio] Add support for lecturio.de (#18562) ++ [discovery] Add support for Scripps Networks watch domains (#17947) + + +version 2018.12.17 + +Extractors +* [ard:beta] Improve geo restricted videos extraction +* [ard:beta] Fix subtitles extraction +* [ard:beta] Improve extraction robustness +* [ard:beta] Relax URL regular expression (#18441) +* [acast] Add support for embed.acast.com and play.acast.com (#18483) +* [iprima] Relax URL regular expression (#18515, #18540) +* [vrv] Fix initial state extraction (#18553) +* [youtube] Fix mark watched (#18546) ++ [safari] Add support for learning.oreilly.com (#18510) +* [youtube] Fix multifeed extraction (#18531) +* [lecturio] Improve subtitles extraction (#18488) +* [uol] Fix format URL extraction (#18480) ++ [ard:mediathek] Add support for classic.ardmediathek.de (#18473) + + +version 2018.12.09 + +Core +* [YoutubeDL] Keep session cookies in cookie file between runs +* [YoutubeDL] Recognize session cookies with expired set to 0 (#12929) + +Extractors ++ [teachable] Add support for teachable platform sites (#5451, #18150, #18272) ++ [aenetworks] Add support for historyvault.com (#18460) +* [imgur] Improve gallery and album detection and extraction (#9133, #16577, + #17223, #18404) +* [iprima] Relax URL regular expression (#18453) +* [hotstar] Fix video data extraction (#18386) +* [ard:mediathek] Fix title and description extraction (#18349, #18371) +* [xvideos] Switch to HTTPS (#18422, #18427) ++ [lecturio] Add support for lecturio.com (#18405) ++ [nrktv:series] Add support for extra materials +* [nrktv:season,series] Fix extraction (#17159, #17258) +* [nrktv] Relax URL regular expression (#18304, #18387) +* [yourporn] Fix extraction (#18424, #18425) +* [tbs] Fix info extraction (#18403) ++ [gamespot] Add support for review URLs + + +version 2018.12.03 + +Core +* [utils] Fix random_birthday to generate existing dates only (#18284) + +Extractors ++ [tiktok] Add support for tiktok.com (#18108, #18135) +* [pornhub] Use actual URL host for requests (#18359) +* [lynda] Fix authentication (#18158, #18217) +* [gfycat] Update API endpoint (#18333, #18343) ++ [hotstar] Add support for alternative app state layout (#18320) +* [azmedien] Fix extraction (#18334, #18336) ++ [vimeo] Add support for VHX (Vimeo OTT) (#14835) +* [joj] Fix extraction (#18280, #18281) ++ [wistia] Add support for fast.wistia.com (#18287) + + +version 2018.11.23 + +Core ++ [setup.py] Add more relevant classifiers + +Extractors +* [mixcloud] Fallback to hardcoded decryption key (#18016) +* [nbc:news] Fix article extraction (#16194) +* [foxsports] Fix extraction (#17543) +* [loc] Relax regular expression and improve formats extraction ++ [ciscolive] Add support for ciscolive.cisco.com (#17984) +* [nzz] Relax kaltura regex (#18228) +* [sixplay] Fix formats extraction +* [bitchute] Improve title extraction +* [kaltura] Limit requested MediaEntry fields ++ [americastestkitchen] Add support for zype embeds (#18225) ++ [pornhub] Add pornhub.net alias +* [nova:embed] Fix extraction (#18222) + + +version 2018.11.18 + +Extractors ++ [wwe] Extract subtitles ++ [wwe] Add support for playlistst (#14781) ++ [wwe] Add support for wwe.com (#14781, #17450) +* [vk] Detect geo restriction (#17767) +* [openload] Use original host during extraction (#18211) +* [atvat] Fix extraction (#18041) ++ [rte] Add support for new API endpoint (#18206) +* [tnaflixnetwork:embed] Fix extraction (#18205) +* [picarto] Use API and add token support (#16518) ++ [zype] Add support for player.zype.com (#18143) +* [vivo] Fix extraction (#18139) +* [ruutu] Update API endpoint (#18138) + + +version 2018.11.07 + +Extractors ++ [youtube] Add another JS signature function name regex (#18091, #18093, + #18094) +* [facebook] Fix tahoe request (#17171) +* [cliphunter] Fix extraction (#18083) ++ [youtube:playlist] Add support for invidio.us (#18077) +* [zattoo] Arrange API hosts for derived extractors (#18035) ++ [youtube] Add fallback metadata extraction from videoDetails (#18052) + + +version 2018.11.03 + +Core +* [extractor/common] Ensure response handle is not prematurely closed before + it can be read if it matches expected_status (#17195, #17846, #17447) + +Extractors +* [laola1tv:embed] Set correct stream access URL scheme (#16341) ++ [ehftv] Add support for ehftv.com (#15408) +* [azmedien] Adopt to major site redesign (#17745, #17746) ++ [twitcasting] Add support for twitcasting.tv (#17981) +* [orf:tvthek] Fix extraction (#17737, #17956, #18024) ++ [openload] Add support for oload.fun (#18045) +* [njpwworld] Fix authentication (#17427) ++ [linkedin:learning] Add support for linkedin.com/learning (#13545) +* [theplatform] Improve error detection (#13222) +* [cnbc] Simplify extraction (#14280, #17110) ++ [cbnc] Add support for new URL schema (#14193) +* [aparat] Improve extraction and extract more metadata (#17445, #18008) +* [aparat] Fix extraction + + +version 2018.10.29 + +Core ++ [extractor/common] Add validation for JSON-LD URLs + +Extractors ++ [sportbox] Add support for matchtv.ru +* [sportbox] Fix extraction (#17978) +* [screencast] Fix extraction (#14590, #14617, #17990) ++ [openload] Add support for oload.icu ++ [ivi] Add support for ivi.tv +* [crunchyroll] Improve extraction failsafeness (#17991) +* [dailymail] Fix formats extraction (#17976) +* [viewster] Reduce format requests +* [cwtv] Handle API errors (#17905) ++ [rutube] Use geo verification headers (#17897) ++ [brightcove:legacy] Add fallbacks to brightcove:new (#13912) +- [tv3] Remove extractor (#10461, #15339) +* [ted] Fix extraction for HTTP and RTMP formats (#5941, #17572, #17894) ++ [openload] Add support for oload.cc (#17823) ++ [patreon] Extract post_file URL (#17792) +* [patreon] Fix extraction (#14502, #10471) + + +version 2018.10.05 + +Extractors +* [pluralsight] Improve authentication (#17762) +* [dailymotion] Fix extraction (#17699) +* [crunchyroll] Switch to HTTPS for RpcApi (#17749) ++ [philharmoniedeparis] Add support for pad.philharmoniedeparis.fr (#17705) +* [philharmoniedeparis] Fix extraction (#17705) ++ [jamendo] Add support for licensing.jamendo.com (#17724) ++ [openload] Add support for oload.cloud (#17710) +* [pluralsight] Fix subtitles extraction (#17726, #17728) ++ [vimeo] Add another config regular expression (#17690) +* [spike] Fix Paramount Network extraction (#17677) +* [hotstar] Fix extraction (#14694, #14931, #17637) + + +version 2018.09.26 + +Extractors +* [pluralsight] Fix subtitles extraction (#17671) +* [mediaset] Improve embed support (#17668) ++ [youtube] Add support for invidio.us (#17613) ++ [zattoo] Add support for more zattoo platform sites +* [zattoo] Fix extraction (#17175, #17542) + + +version 2018.09.18 + +Core ++ [extractor/common] Introduce channel meta fields + +Extractors +* [adobepass] Don't pollute default headers dict +* [udemy] Don't pollute default headers dict +* [twitch] Don't pollute default headers dict +* [youtube] Don't pollute default query dict (#17593) +* [crunchyroll] Prefer hardsubless formats and formats in locale language +* [vrv] Make format ids deterministic +* [vimeo] Fix ondemand playlist extraction (#14591) ++ [pornhub] Extract upload date (#17574) ++ [porntube] Extract channel meta fields ++ [vimeo] Extract channel meta fields ++ [youtube] Extract channel meta fields (#9676, #12939) +* [porntube] Fix extraction (#17541) +* [asiancrush] Fix extraction (#15630) ++ [twitch:clips] Extend URL regular expression (#17559) ++ [vzaar] Add support for HLS +* [tube8] Fix metadata extraction (#17520) +* [eporner] Extract JSON-LD (#17519) + + +version 2018.09.10 + +Core ++ [utils] Properly recognize AV1 codec (#17506) + +Extractors ++ [iprima] Add support for prima.iprima.cz (#17514) ++ [tele5] Add support for tele5.de (#7805, #7922, #17331, #17414) +* [nbc] Fix extraction of percent encoded URLs (#17374) + + +version 2018.09.08 + +Extractors +* [youtube] Fix extraction (#17457, #17464) ++ [pornhub:uservideos] Add support for new URLs (#17388) +* [iprima] Confirm adult check (#17437) +* [slideslive] Make check for video service name case-insensitive (#17429) +* [radiojavan] Fix extraction (#17151) +* [generic] Skip unsuccessful jwplayer extraction (#16735) + + +version 2018.09.01 + +Core +* [utils] Skip remote IP addresses non matching to source address' IP version + when creating a connection (#13422, #17362) + +Extractors ++ [ard] Add support for one.ard.de (#17397) +* [niconico] Fix extraction on python3 (#17393, #17407) +* [ard] Extract f4m formats +* [crunchyroll] Parse vilos media data (#17343) ++ [ard] Add support for Beta ARD Mediathek ++ [bandcamp] Extract more metadata (#13197) +* [internazionale] Fix extraction of non-available-abroad videos (#17386) + + +version 2018.08.28 + +Extractors ++ [youtube:playlist] Add support for music album playlists (OLAK5uy_ prefix) + (#17361) +* [bitchute] Fix extraction by pass custom User-Agent (#17360) +* [webofstories:playlist] Fix extraction (#16914) ++ [tvplayhome] Add support for new tvplay URLs (#17344) ++ [generic] Allow relative src for videojs embeds (#17324) ++ [xfileshare] Add support for vidto.se (#17317) ++ [vidzi] Add support for vidzi.nu (#17316) ++ [nova:embed] Add support for media.cms.nova.cz (#17282) + + +version 2018.08.22 + +Core +* [utils] Use pure browser header for User-Agent (#17236) + +Extractors ++ [kinopoisk] Add support for kinopoisk.ru (#17283) ++ [yourporn] Add support for yourporn.sexy (#17298) ++ [go] Add support for disneynow.go.com (#16299, #17264) ++ [6play] Add support for play.rtl.hr (#17249) +* [anvato] Fallback to generic API key for access-key-to-API-key lookup + (#16788, #17254) +* [lci] Fix extraction (#17274) +* [bbccouk] Extend id URL regular expression (#17270) +* [cwtv] Fix extraction (#17256) +* [nova] Fix extraction (#17241) ++ [generic] Add support for expressen embeds +* [raywenderlich] Adapt to site redesign (#17225) ++ [redbulltv] Add support redbull.com tv URLs (#17218) ++ [bitchute] Add support for bitchute.com (#14052) ++ [clyp] Add support for token protected media (#17184) +* [imdb] Fix extension extraction (#17167) + + +version 2018.08.04 + +Extractors +* [funk:channel] Improve byChannelAlias extraction (#17142) +* [twitch] Fix authentication (#17024, #17126) +* [twitch:vod] Improve URL regular expression (#17135) +* [watchbox] Fix extraction (#17107) +* [pbs] Fix extraction (#17109) +* [theplatform] Relax URL regular expression (#16181, #17097) ++ [viqeo] Add support for viqeo.tv (#17066) + + +version 2018.07.29 + +Extractors +* [crunchyroll:playlist] Restrict URL regular expression (#17069, #17076) ++ [pornhub] Add support for subtitles (#16924, #17088) +* [ceskatelevize] Use https for API call (#16997, #16999) +* [dailymotion:playlist] Fix extraction (#16894) +* [ted] Improve extraction +* [ted] Fix extraction for videos without nativeDownloads (#16756, #17085) +* [telecinco] Fix extraction (#17080) +* [mitele] Reduce number of requests +* [rai] Return non HTTP relinker URL intact (#17055) +* [vk] Fix extraction for inline only videos (#16923) +* [streamcloud] Fix extraction (#17054) +* [facebook] Fix tahoe player extraction with authentication (#16655) ++ [puhutv] Add support for puhutv.com (#12712, #16010, #16269) + + +version 2018.07.21 + +Core ++ [utils] Introduce url_or_none +* [utils] Allow JSONP without function name (#17028) ++ [extractor/common] Extract DASH and MSS formats from SMIL manifests + +Extractors ++ [bbc] Add support for BBC Radio Play pages (#17022) +* [iwara] Fix download URLs (#17026) +* [vrtnu] Relax title extraction and extract JSON-LD (#17018) ++ [viu] Pass Referer and Origin headers and area id (#16992) ++ [vimeo] Add another config regular expression (#17013) ++ [facebook] Extract view count (#16942) +* [dailymotion] Improve description extraction (#16984) +* [slutload] Fix and improve extraction (#17001) +* [mediaset] Fix extraction (#16977) ++ [theplatform] Add support for theplatform TLD customization (#16977) +* [imgur] Relax URL regular expression (#16987) +* [pornhub] Improve extraction and extract all formats (#12166, #15891, #16262, + #16959) + + +version 2018.07.10 + +Core +* [utils] Share JSON-LD regular expression +* [downloader/dash] Improve error handling (#16927) + +Extractors ++ [nrktv] Add support for new season and serie URL schema ++ [nrktv] Add support for new episode URL schema (#16909) ++ [frontendmasters] Add support for frontendmasters.com (#3661, #16328) +* [funk] Fix extraction (#16918) +* [watchbox] Fix extraction (#16904) +* [dplayit] Sort formats +* [dplayit] Fix extraction (#16901) +* [youtube] Improve login error handling (#13822) + + +version 2018.07.04 + +Core +* [extractor/common] Properly escape % in MPD templates (#16867) +* [extractor/common] Use source URL as Referer for HTML5 entries (16849) +* Prefer ffmpeg over avconv by default (#8622) + +Extractors +* [pluralsight] Switch to graphql (#16889, #16895, #16896, #16899) +* [lynda] Simplify login and improve error capturing (#16891) ++ [go90] Add support for embed URLs (#16873) +* [go90] Detect geo restriction error and pass geo verification headers + (#16874) +* [vlive] Fix live streams extraction (#16871) +* [npo] Fix typo (#16872) ++ [mediaset] Add support for new videos and extract all formats (#16568) +* [dctptv] Restore extraction based on REST API (#16850) +* [svt] Improve extraction and add support for pages (#16802) +* [porncom] Fix extraction (#16808) + + +version 2018.06.25 + +Extractors +* [joj] Relax URL regular expression (#16771) +* [brightcove] Workaround sonyliv DRM protected videos (#16807) +* [motherless] Fix extraction (#16786) +* [itv] Make SOAP request non fatal and extract metadata from webpage (#16780) +- [foxnews:insider] Remove extractor (#15810) ++ [foxnews] Add support for iframe embeds (#15810, #16711) + + +version 2018.06.19 + +Core ++ [extractor/common] Introduce expected_status in _download_* methods + for convenient accept of HTTP requests failed with non 2xx status codes ++ [compat] Introduce compat_integer_types + +Extractors +* [peertube] Improve generic support (#16733) ++ [6play] Use geo verification headers +* [rtbf] Fix extraction for python 3.2 +* [vgtv] Improve HLS formats extraction ++ [vgtv] Add support for www.aftonbladet.se/tv URLs +* [bbccouk] Use expected_status +* [markiza] Expect 500 HTTP status code +* [tvnow] Try all clear manifest URLs (#15361) + + +version 2018.06.18 + +Core +* [downloader/rtmp] Fix downloading in verbose mode (#16736) + +Extractors ++ [markiza] Add support for markiza.sk (#16750) +* [wat] Try all supported adaptive URLs ++ [6play] Add support for rtlplay.be and extract hd usp formats ++ [rtbf] Add support for audio and live streams (#9638, #11923) ++ [rtbf] Extract HLS, DASH and all HTTP formats ++ [rtbf] Extract subtitles ++ [rtbf] Fixup specific HTTP URLs (#16101) ++ [expressen] Add support for expressen.se +* [vidzi] Fix extraction (#16678) +* [pbs] Improve extraction (#16623, #16684) +* [bilibili] Restrict cid regular expression (#16638, #16734) + + +version 2018.06.14 + +Core +* [downloader/http] Fix retry on error when streaming to stdout (#16699) + +Extractors ++ [discoverynetworks] Add support for disco-api videos (#16724) ++ [dailymotion] Add support for password protected videos (#9789) ++ [abc:iview] Add support for livestreams (#12354) +* [abc:iview] Fix extraction (#16704) ++ [crackle] Add support for sonycrackle.com (#16698) ++ [tvnet] Add support for tvnet.gov.vn (#15462) +* [nrk] Update API hosts and try all previously known ones (#16690) +* [wimp] Fix Youtube embeds extraction + + +version 2018.06.11 + +Extractors +* [npo] Extend URL regular expression and add support for npostart.nl (#16682) ++ [inc] Add support for another embed schema (#16666) +* [tv4] Fix format extraction (#16650) ++ [nexx] Add support for free cdn (#16538) ++ [pbs] Add another cove id pattern (#15373) ++ [rbmaradio] Add support for 192k format (#16631) + + +version 2018.06.04 + +Extractors ++ [camtube] Add support for camtube.co ++ [twitter:card] Extract guest token (#16609) ++ [chaturbate] Use geo verification headers ++ [bbc] Add support for bbcthree (#16612) +* [youtube] Move metadata extraction after video availability check ++ [youtube] Extract track and artist ++ [safari] Add support for new URL schema (#16614) +* [adn] Fix extraction + + +version 2018.06.02 + +Core +* [utils] Improve determine_ext + +Extractors ++ [facebook] Add support for tahoe player videos (#15441, #16554) +* [cbc] Improve extraction (#16583, #16593) +* [openload] Improve ext extraction (#16595) ++ [twitter:card] Add support for another endpoint (#16586) ++ [openload] Add support for oload.win and oload.download (#16592) +* [audimedia] Fix extraction (#15309) ++ [francetv] Add support for sport.francetvinfo.fr (#15645) +* [mlb] Improve extraction (#16587) +- [nhl] Remove old extractors +* [rbmaradio] Check formats availability (#16585) + + +version 2018.05.30 + +Core +* [downloader/rtmp] Generalize download messages and report time elapsed + on finish +* [downloader/rtmp] Gracefully handle live streams interrupted by user + +Extractors +* [teamcoco] Fix extraction for full episodes (#16573) +* [spiegel] Fix info extraction (#16538) ++ [apa] Add support for apa.at (#15041, #15672) ++ [bellmedia] Add support for bnnbloomberg.ca (#16560) ++ [9c9media] Extract MPD formats and subtitles +* [cammodels] Use geo verification headers ++ [ufctv] Add support for authentication (#16542) ++ [cammodels] Add support for cammodels.com (#14499) +* [utils] Fix style id extraction for namespaced id attribute in dfxp2srt + (#16551) +* [soundcloud] Detect format extension (#16549) +* [cbc] Fix playlist title extraction (#16502) ++ [tumblr] Detect and report sensitive media (#13829) ++ [tumblr] Add support for authentication (#15133) + + +version 2018.05.26 + +Core +* [utils] Improve parse_age_limit + +Extractors +* [audiomack] Stringify video id (#15310) +* [izlesene] Fix extraction (#16233, #16271, #16407) ++ [indavideo] Add support for generic embeds (#11989) +* [indavideo] Fix extraction (#11221) +* [indavideo] Sign download URLs (#16174) ++ [peertube] Add support for PeerTube based sites (#16301, #16329) +* [imgur] Fix extraction (#16537) ++ [hidive] Add support for authentication (#16534) ++ [nbc] Add support for stream.nbcsports.com (#13911) ++ [viewlift] Add support for hoichoi.tv (#16536) +* [go90] Extract age limit and detect DRM protection(#10127) +* [viewlift] fix extraction for snagfilms.com (#15766) +* [globo] Improve extraction (#4189) + * Add support for authentication + * Simplify URL signing + * Extract DASH and MSS formats +* [leeco] Fix extraction (#16464) +* [teamcoco] Add fallback for format extraction (#16484) +* [teamcoco] Improve URL regular expression (#16484) +* [imdb] Improve extraction (#4085, #14557) + + +version 2018.05.18 + +Extractors +* [vimeo:likes] Relax URL regular expression and fix single page likes + extraction (#16475) +* [pluralsight] Fix clip id extraction (#16460) ++ [mychannels] Add support for mychannels.com (#15334) +- [moniker] Remove extractor (#15336) +* [pbs] Fix embed data extraction (#16474) ++ [mtv] Add support for paramountnetwork.com and bellator.com (#15418) +* [youtube] Fix hd720 format position +* [dailymotion] Remove fragment part from m3u8 URLs (#8915) +* [3sat] Improve extraction (#15350) + * Extract all formats + * Extract more format metadata + * Improve format sorting + * Use hls native downloader + * Detect and bypass geo-restriction ++ [dtube] Add support for d.tube (#15201) +* [options] Fix typo (#16450) +* [youtube] Improve format filesize extraction (#16453) +* [youtube] Make uploader extraction non fatal (#16444) +* [youtube] Fix extraction for embed restricted live streams (#16433) +* [nbc] Improve info extraction (#16440) +* [twitch:clips] Fix extraction (#16429) +* [redditr] Relax URL regular expression (#16426, #16427) +* [mixcloud] Bypass throttling for HTTP formats (#12579, #16424) ++ [nick] Add support for nickjr.de (#13230) +* [teamcoco] Fix extraction (#16374) + + +version 2018.05.09 + +Core +* [YoutubeDL] Ensure ext exists for automatic captions +* Introduce --geo-bypass-ip-block + +Extractors ++ [udemy] Extract asset captions ++ [udemy] Extract stream URLs (#16372) ++ [businessinsider] Add support for businessinsider.com (#16387, #16388, #16389) ++ [cloudflarestream] Add support for cloudflarestream.com (#16375) +* [watchbox] Fix extraction (#16356) +* [discovery] Extract Affiliate/Anonymous Auth Token from cookies (#14954) ++ [itv:btcc] Add support for itv.com/btcc (#16139) +* [tunein] Use live title for live streams (#16347) +* [itv] Improve extraction (#16253) + + +version 2018.05.01 + +Core +* [downloader/fragment] Restart download if .ytdl file is corrupt (#16312) ++ [extractor/common] Extract interaction statistic ++ [utils] Add merge_dicts ++ [extractor/common] Add _download_json_handle + +Extractors +* [kaltura] Improve iframe embeds detection (#16337) ++ [udemy] Extract outputs renditions (#16289, #16291, #16320, #16321, #16334, + #16335) ++ [zattoo] Add support for zattoo.com and mobiltv.quickline.com (#14668, #14676) +* [yandexmusic] Convert release_year to int +* [udemy] Override _download_webpage_handle instead of _download_webpage +* [xiami] Override _download_webpage_handle instead of _download_webpage +* [yandexmusic] Override _download_webpage_handle instead of _download_webpage +* [youtube] Correctly disable polymer on all requests (#16323, #16326) +* [generic] Prefer enclosures over links in RSS feeds (#16189) ++ [redditr] Add support for old.reddit.com URLs (#16274) +* [nrktv] Update API host (#16324) ++ [imdb] Extract all formats (#16249) ++ [vimeo] Extract JSON-LD (#16295) +* [funk:channel] Improve extraction (#16285) + + +version 2018.04.25 + +Core +* [utils] Fix match_str for boolean meta fields ++ [Makefile] Add support for pandoc 2 and disable smart extension (#16251) +* [YoutubeDL] Fix typo in media extension compatibility checker (#16215) + +Extractors ++ [openload] Recognize IPv6 stream URLs (#16136, #16137, #16205, #16246, + #16250) ++ [twitch] Extract is_live according to status (#16259) +* [pornflip] Relax URL regular expression (#16258) +- [etonline] Remove extractor (#16256) +* [breakcom] Fix extraction (#16254) ++ [youtube] Add ability to authenticate with cookies +* [youtube:feed] Implement lazy playlist extraction (#10184) ++ [svt] Add support for TV channel live streams (#15279, #15809) +* [ccma] Fix video extraction (#15931) +* [rentv] Fix extraction (#15227) ++ [nick] Add support for nickjr.nl (#16230) +* [extremetube] Fix metadata extraction ++ [keezmovies] Add support for generic embeds (#16134, #16154) +* [nexx] Extract new azure URLs (#16223) +* [cbssports] Fix extraction (#16217) +* [kaltura] Improve embeds detection (#16201) +* [instagram:user] Fix extraction (#16119) +* [cbs] Skip DRM asset types (#16104) + + +version 2018.04.16 + +Extractors +* [smotri:broadcast] Fix extraction (#16180) ++ [picarto] Add support for picarto.tv (#6205, #12514, #15276, #15551) +* [vine:user] Fix extraction (#15514, #16190) +* [pornhub] Relax URL regular expression (#16165) +* [cbc:watch] Re-acquire device token when expired (#16160) ++ [fxnetworks] Add support for https theplatform URLs (#16125, #16157) ++ [instagram:user] Add request signing (#16119) ++ [twitch] Add support for mobile URLs (#16146) + + +version 2018.04.09 + +Core +* [YoutubeDL] Do not save/restore console title while simulate (#16103) +* [extractor/common] Relax JSON-LD context check (#16006) + +Extractors ++ [generic] Add support for tube8 embeds ++ [generic] Add support for share-videos.se embeds (#16089, #16115) +* [odnoklassniki] Extend URL regular expression (#16081) +* [steam] Bypass mature content check (#16113) ++ [acast] Extract more metadata +* [acast] Fix extraction (#16118) +* [instagram:user] Fix extraction (#16119) +* [drtuber] Fix title extraction (#16107, #16108) +* [liveleak] Extend URL regular expression (#16117) ++ [openload] Add support for oload.xyz +* [openload] Relax stream URL regular expression +* [openload] Fix extraction (#16099) ++ [svtplay:series] Add support for season URLs ++ [svtplay:series] Add support for series (#11130, #16059) + + +version 2018.04.03 + +Extractors ++ [tvnow] Add support for shows (#15837) +* [dramafever] Fix authentication (#16067) +* [afreecatv] Use partial view only when necessary (#14450) ++ [afreecatv] Add support for authentication (#14450) ++ [nationalgeographic] Add support for new URL schema (#16001, #16054) +* [xvideos] Fix thumbnail extraction (#15978, #15979) +* [medialaan] Fix vod id (#16038) ++ [openload] Add support for oload.site (#16039) +* [naver] Fix extraction (#16029) +* [dramafever] Partially switch to API v5 (#16026) +* [abc:iview] Unescape title and series meta fields (#15994) +* [videa] Extend URL regular expression (#16003) + + +version 2018.03.26.1 + +Core ++ [downloader/external] Add elapsed time to progress hook (#10876) +* [downloader/external,fragment] Fix download finalization when writing file + to stdout (#10809, #10876, #15799) + +Extractors +* [vrv] Fix extraction on python2 (#15928) +* [afreecatv] Update referrer (#15947) ++ [24video] Add support for 24video.sexy (#15973) +* [crackle] Bypass geo restriction +* [crackle] Fix extraction (#15969) ++ [lenta] Add support for lenta.ru (#15953) ++ [instagram:user] Add pagination (#15934) +* [youku] Update ccode (#15939) +* [libsyn] Adapt to new page structure + + +version 2018.03.20 + +Core +* [extractor/common] Improve thumbnail extraction for HTML5 entries +* Generalize XML manifest processing code and improve XSPF parsing ++ [extractor/common] Add _download_xml_handle ++ [extractor/common] Add support for relative URIs in _parse_xspf (#15794) + +Extractors ++ [7plus] Extract series metadata (#15862, #15906) +* [9now] Bypass geo restriction (#15920) +* [cbs] Skip unavailable assets (#13490, #13506, #15776) ++ [canalc2] Add support for HTML5 videos (#15916, #15919) ++ [ceskatelevize] Add support for iframe embeds (#15918) ++ [prosiebensat1] Add support for galileo.tv (#15894) ++ [generic] Add support for xfileshare embeds (#15879) +* [bilibili] Switch to v2 playurl API +* [bilibili] Fix and improve extraction (#15048, #15430, #15622, #15863) +* [heise] Improve extraction (#15496, #15784, #15026) +* [instagram] Fix user videos extraction (#15858) + + +version 2018.03.14 + +Extractors +* [soundcloud] Update client id (#15866) ++ [tennistv] Add support for tennistv.com ++ [line] Add support for tv.line.me (#9427) +* [xnxx] Fix extraction (#15817) +* [njpwworld] Fix authentication (#15815) + + +version 2018.03.10 + +Core +* [downloader/hls] Skip uplynk ad fragments (#15748) + +Extractors +* [pornhub] Don't override session cookies (#15697) ++ [raywenderlich] Add support for videos.raywenderlich.com (#15251) +* [funk] Fix extraction and rework extractors (#15792) +* [nexx] Restore reverse engineered approach ++ [heise] Add support for kaltura embeds (#14961, #15728) ++ [tvnow] Extract series metadata (#15774) +* [ruutu] Continue formats extraction on NOT-USED URLs (#15775) +* [vrtnu] Use redirect URL for building video JSON URL (#15767, #15769) +* [vimeo] Modernize login code and improve error messaging +* [archiveorg] Fix extraction (#15770, #15772) ++ [hidive] Add support for hidive.com (#15494) +* [afreecatv] Detect deleted videos +* [afreecatv] Fix extraction (#15755) +* [vice] Fix extraction and rework extractors (#11101, #13019, #13622, #13778) ++ [vidzi] Add support for vidzi.si (#15751) +* [npo] Fix typo + + +version 2018.03.03 + +Core ++ [utils] Add parse_resolution +Revert respect --prefer-insecure while updating + +Extractors ++ [yapfiles] Add support for yapfiles.ru (#15726, #11085) +* [spankbang] Fix formats extraction (#15727) +* [adn] Fix extraction (#15716) ++ [toggle] Extract DASH and ISM formats (#15721) ++ [nickelodeon] Add support for nickelodeon.com.tr (#15706) +* [npo] Validate and filter format URLs (#15709) + + +version 2018.02.26 + +Extractors +* [udemy] Use custom User-Agent (#15571) + + +version 2018.02.25 + +Core +* [postprocessor/embedthumbnail] Skip embedding when there aren't any + thumbnails (#12573) +* [extractor/common] Improve jwplayer subtitles extraction (#15695) + +Extractors ++ [vidlii] Add support for vidlii.com (#14472, #14512, #14779) ++ [streamango] Capture and output error messages +* [streamango] Fix extraction (#14160, #14256) ++ [telequebec] Add support for emissions (#14649, #14655) ++ [telequebec:live] Add support for live streams (#15688) ++ [mailru:music] Add support for mail.ru/music (#15618) +* [aenetworks] Switch to akamai HLS formats (#15612) +* [ytsearch] Fix flat title extraction (#11260, #15681) + + +version 2018.02.22 + +Core ++ [utils] Fixup some common URL typos in sanitize_url (#15649) +* Respect --prefer-insecure while updating (#15497) + +Extractors +* [vidio] Fix HLS URL extraction (#15675) ++ [nexx] Add support for arc.nexx.cloud URLs +* [nexx] Switch to arc API (#15652) +* [redtube] Fix duration extraction (#15659) ++ [sonyliv] Respect referrer (#15648) ++ [brightcove:new] Use referrer for formats' HTTP headers ++ [cbc] Add support for olympics.cbc.ca (#15535) ++ [fusion] Add support for fusion.tv (#15628) +* [npo] Improve quality metadata extraction +* [npo] Relax URL regular expression (#14987, #14994) ++ [npo] Capture and output error message ++ [pornhub] Add support for channels (#15613) +* [youtube] Handle shared URLs with generic extractor (#14303) + + +version 2018.02.11 + +Core ++ [YoutubeDL] Add support for filesize_approx in format selector (#15550) + +Extractors ++ [francetv] Add support for live streams (#13689) ++ [francetv] Add support for zouzous.fr and ludo.fr (#10454, #13087, #13103, + #15012) +* [francetv] Separate main extractor and rework others to delegate to it +* [francetv] Improve manifest URL signing (#15536) ++ [francetv] Sign m3u8 manifest URLs (#15565) ++ [veoh] Add support for embed URLs (#15561) +* [afreecatv] Fix extraction (#15556) +* [periscope] Use accessVideoPublic endpoint (#15554) +* [discovery] Fix auth request (#15542) ++ [6play] Extract subtitles (#15541) +* [newgrounds] Fix metadata extraction (#15531) ++ [nbc] Add support for stream.nbcolympics.com (#10295) +* [dvtv] Fix live streams extraction (#15442) + + +version 2018.02.08 + +Extractors ++ [myvi] Extend URL regular expression ++ [myvi:embed] Add support for myvi.tv embeds (#15521) ++ [prosiebensat1] Extend URL regular expression (#15520) +* [pokemon] Relax URL regular expression and extend title extraction (#15518) ++ [gameinformer] Use geo verification headers +* [la7] Fix extraction (#15501, #15502) +* [gameinformer] Fix brightcove id extraction (#15416) ++ [afreecatv] Pass referrer to video info request (#15507) ++ [telebruxelles] Add support for live streams +* [telebruxelles] Relax URL regular expression +* [telebruxelles] Fix extraction (#15504) +* [extractor/common] Respect secure schemes in _extract_wowza_formats + + +version 2018.02.04 + +Core +* [downloader/http] Randomize HTTP chunk size ++ [downloader/http] Add ability to pass downloader options via info dict +* [downloader/http] Fix 302 infinite loops by not reusing requests ++ Document http_chunk_size + +Extractors ++ [brightcove] Pass embed page URL as referrer (#15486) ++ [youtube] Enforce using chunked HTTP downloading for DASH formats + + +version 2018.02.03 + +Core ++ Introduce --http-chunk-size for chunk-based HTTP downloading ++ Add support for IronPython +* [downloader/ism] Fix Python 3.2 support + +Extractors +* [redbulltv] Fix extraction (#15481) +* [redtube] Fix metadata extraction (#15472) +* [pladform] Respect platform id and extract HLS formats (#15468) +- [rtlnl] Remove progressive formats (#15459) +* [6play] Do no modify asset URLs with a token (#15248) +* [nationalgeographic] Relax URL regular expression +* [dplay] Relax URL regular expression (#15458) +* [cbsinteractive] Fix data extraction (#15451) ++ [amcnetworks] Add support for sundancetv.com (#9260) + + +version 2018.01.27 + +Core +* [extractor/common] Improve _json_ld for articles +* Switch codebase to use compat_b64decode ++ [compat] Add compat_b64decode + +Extractors ++ [seznamzpravy] Add support for seznam.cz and seznamzpravy.cz (#14102, #14616) +* [dplay] Bypass geo restriction ++ [dplay] Add support for disco-api videos (#15396) +* [youtube] Extract precise error messages (#15284) +* [teachertube] Capture and output error message +* [teachertube] Fix and relax thumbnail extraction (#15403) ++ [prosiebensat1] Add another clip id regular expression (#15378) +* [tbs] Update tokenizer url (#15395) +* [mixcloud] Use compat_b64decode (#15394) +- [thesixtyone] Remove extractor (#15341) + + +version 2018.01.21 + +Core +* [extractor/common] Improve jwplayer DASH formats extraction (#9242, #15187) +* [utils] Improve scientific notation handling in js_to_json (#14789) + +Extractors ++ [southparkdk] Add support for southparkstudios.nu ++ [southpark] Add support for collections (#14803) +* [franceinter] Fix upload date extraction (#14996) ++ [rtvs] Add support for rtvs.sk (#9242, #15187) +* [restudy] Fix extraction and extend URL regular expression (#15347) +* [youtube:live] Improve live detection (#15365) ++ [springboardplatform] Add support for springboardplatform.com +* [prosiebensat1] Add another clip id regular expression (#15290) +- [ringtv] Remove extractor (#15345) + + +version 2018.01.18 + +Extractors +* [soundcloud] Update client id (#15306) +- [kamcord] Remove extractor (#15322) ++ [spiegel] Add support for nexx videos (#15285) +* [twitch] Fix authentication and error capture (#14090, #15264) +* [vk] Detect more errors due to copyright complaints (#15259) + + +version 2018.01.14 + +Extractors +* [youtube] Fix live streams extraction (#15202) +* [wdr] Bypass geo restriction +* [wdr] Rework extractors (#14598) ++ [wdr] Add support for wdrmaus.de/elefantenseite (#14598) ++ [gamestar] Add support for gamepro.de (#3384) +* [viafree] Skip rtmp formats (#15232) ++ [pandoratv] Add support for mobile URLs (#12441) ++ [pandoratv] Add support for new URL format (#15131) ++ [ximalaya] Add support for ximalaya.com (#14687) ++ [digg] Add support for digg.com (#15214) +* [limelight] Tolerate empty pc formats (#15150, #15151, #15207) +* [ndr:embed:base] Make separate formats extraction non fatal (#15203) ++ [weibo] Add extractor (#15079) ++ [ok] Add support for live streams +* [canalplus] Fix extraction (#15072) +* [bilibili] Fix extraction (#15188) + + +version 2018.01.07 + +Core +* [utils] Fix youtube-dl under PyPy3 on Windows +* [YoutubeDL] Output python implementation in debug header + +Extractors ++ [jwplatform] Add support for multiple embeds (#15192) +* [mitele] Fix extraction (#15186) ++ [motherless] Add support for groups (#15124) +* [lynda] Relax URL regular expression (#15185) +* [soundcloud] Fallback to avatar picture for thumbnail (#12878) +* [youku] Fix list extraction (#15135) +* [openload] Fix extraction (#15166) +* [lynda] Skip invalid subtitles (#15159) +* [twitch] Pass video id to url_result when extracting playlist (#15139) +* [rtve.es:alacarta] Fix extraction of some new URLs +* [acast] Fix extraction (#15147) + + +version 2017.12.31 + +Core ++ [extractor/common] Add container meta field for formats extracted + in _parse_mpd_formats (#13616) ++ [downloader/hls] Use HTTP headers for key request +* [common] Use AACL as the default fourcc when AudioTag is 255 +* [extractor/common] Fix extraction of DASH formats with the same + representation id (#15111) + +Extractors ++ [slutload] Add support for mobile URLs (#14806) +* [abc:iview] Bypass geo restriction +* [abc:iview] Fix extraction (#14711, #14782, #14838, #14917, #14963, #14985, + #15035, #15057, #15061, #15071, #15095, #15106) +* [openload] Fix extraction (#15118) +- [sandia] Remove extractor +- [collegerama] Remove extractor ++ [mediasite] Add support for sites based on Mediasite Video Platform (#5428, + #11185, #14343) ++ [ufctv] Add support for ufc.tv (#14520) +* [pluralsight] Fix missing first line of subtitles (#11118) +* [openload] Fallback on f-page extraction (#14665, #14879) +* [vimeo] Improve password protected videos extraction (#15114) +* [aws] Fix canonical/signed headers generation on python 2 (#15102) + + +version 2017.12.28 + +Extractors ++ [internazionale] Add support for internazionale.it (#14973) +* [playtvak] Relax video regular expression and make description optional + (#15037) ++ [filmweb] Add support for filmweb.no (#8773, #10368) ++ [23video] Add support for 23video.com ++ [espn] Add support for fivethirtyeight.com (#6864) ++ [umg:de] Add support for universal-music.de (#11582, #11584) ++ [espn] Add support for espnfc and extract more formats (#8053) +* [youku] Update ccode (#14880) ++ [openload] Add support for oload.stream (#15070) +* [youku] Fix list extraction (#15065) + + +version 2017.12.23 + +Core +* [extractor/common] Move X-Forwarded-For setup code into _request_webpage ++ [YoutubeDL] Add support for playlist_uploader and playlist_uploader_id in + output template (#11427, #15018) ++ [extractor/common] Introduce uploader, uploader_id and uploader_url + meta fields for playlists (#11427, #15018) +* [downloader/fragment] Encode filename of fragment being removed (#15020) ++ [utils] Add another date format pattern (#14999) + +Extractors ++ [kaltura] Add another embed pattern for entry_id ++ [7plus] Add support for 7plus.com.au (#15043) +* [animeondemand] Relax login error regular expression ++ [shahid] Add support for show pages (#7401) ++ [youtube] Extract uploader, uploader_id and uploader_url for playlists + (#11427, #15018) +* [afreecatv] Improve format extraction (#15019) ++ [cspan] Add support for audio only pages and catch page errors (#14995) ++ [mailru] Add support for embed URLs (#14904) +* [crunchyroll] Future-proof XML element checks (#15013) +* [cbslocal] Fix timestamp extraction (#14999, #15000) +* [discoverygo] Correct TTML subtitle extension +* [vk] Make view count optional (#14979) +* [disney] Skip Apple FairPlay formats (#14982) +* [voot] Fix format extraction (#14758) + + +version 2017.12.14 + +Core +* [postprocessor/xattr] Clarify NO_SPACE message (#14970) +* [downloader/http] Return actual download result from real_download (#14971) + +Extractors ++ [itv] Extract more subtitles and duration +* [itv] Improve extraction (#14944) ++ [byutv] Add support for geo restricted videos +* [byutv] Fix extraction (#14966, #14967) ++ [bbccouk] Fix extraction for 320k HLS streams ++ [toutv] Add support for special video URLs (#14179) +* [discovery] Fix free videos extraction (#14157, #14954) +* [tvnow] Fix extraction (#7831) ++ [nickelodeon:br] Add support for nickelodeon brazil websites (#14893) +* [nick] Improve extraction (#14876) +* [tbs] Fix extraction (#13658) + + +version 2017.12.10 + +Core ++ [utils] Add sami mimetype to mimetype2ext + +Extractors +* [culturebox] Improve video id extraction (#14947) +* [twitter] Improve extraction (#14197) ++ [udemy] Extract more HLS formats +* [udemy] Improve course id extraction (#14938) ++ [stretchinternet] Add support for portal.stretchinternet.com (#14576) +* [ellentube] Fix extraction (#14407, #14570) ++ [raiplay:playlist] Add support for playlists (#14563) +* [sonyliv] Bypass geo restriction +* [sonyliv] Extract higher quality formats (#14922) +* [fox] Extract subtitles ++ [fox] Add support for Adobe Pass authentication (#14205, #14489) +- [dailymotion:cloud] Remove extractor (#6794) +* [xhamster] Fix thumbnail extraction (#14780) ++ [xhamster] Add support for mobile URLs (#14780) +* [generic] Don't pass video id as mpd id while extracting DASH (#14902) +* [ard] Skip invalid stream URLs (#14906) +* [porncom] Fix metadata extraction (#14911) +* [pluralsight] Detect agreement request (#14913) +* [toutv] Fix login (#14614) + + +version 2017.12.02 + +Core ++ [downloader/fragment] Commit part file after each fragment ++ [extractor/common] Add durations for DASH fragments with bare SegmentURLs ++ [extractor/common] Add support for DASH manifests with SegmentLists with + bare SegmentURLs (#14844) ++ [utils] Add hvc1 codec code to parse_codecs + +Extractors +* [xhamster] Fix extraction (#14884) +* [youku] Update ccode (#14872) +* [mnet] Fix format extraction (#14883) ++ [xiami] Add Referer header to API request +* [mtv] Correct scc extention in extracted subtitles (#13730) +* [vvvvid] Fix extraction for kenc videos (#13406) ++ [br] Add support for BR Mediathek videos (#14560, #14788) ++ [daisuki] Add support for motto.daisuki.com (#14681) +* [odnoklassniki] Fix API metadata request (#14862) +* [itv] Fix HLS formats extraction ++ [pbs] Add another media id regular expression + + +version 2017.11.26 + +Core +* [extractor/common] Use final URL when dumping request (#14769) + +Extractors +* [fczenit] Fix extraction +- [firstpost] Remove extractor +* [freespeech] Fix extraction +* [nexx] Extract more formats ++ [openload] Add support for openload.link (#14763) +* [empflix] Relax URL regular expression +* [empflix] Fix extractrion +* [tnaflix] Don't modify download URLs (#14811) +- [gamersyde] Remove extractor +* [francetv:generationwhat] Fix extraction ++ [massengeschmacktv] Add support for Massengeschmack TV +* [fox9] Fix extraction +* [faz] Fix extraction and add support for Perform Group embeds (#14714) ++ [performgroup] Add support for performgroup.com ++ [jwplatform] Add support for iframes (#14828) +* [culturebox] Fix extraction (#14827) +* [youku] Fix extraction; update ccode (#14815) +* [livestream] Make SMIL extraction non fatal (#14792) ++ [drtuber] Add support for mobile URLs (#14772) ++ [spankbang] Add support for mobile URLs (#14771) +* [instagram] Fix description, timestamp and counters extraction (#14755) + + +version 2017.11.15 + +Core +* [common] Skip Apple FairPlay m3u8 manifests (#14741) +* [YoutubeDL] Fix playlist range optimization for --playlist-items (#14740) + +Extractors +* [vshare] Capture and output error message +* [vshare] Fix extraction (#14473) +* [crunchyroll] Extract old RTMP formats +* [tva] Fix extraction (#14736) +* [gamespot] Lower preference of HTTP formats (#14652) +* [instagram:user] Fix extraction (#14699) +* [ccma] Fix typo (#14730) +- Remove sensitive data from logging in messages +* [instagram:user] Fix extraction (#14699) ++ [gamespot] Add support for article URLs (#14652) +* [gamespot] Skip Brightcove Once HTTP formats (#14652) +* [cartoonnetwork] Update tokenizer_src (#14666) ++ [wsj] Recognize another URL pattern (#14704) +* [pandatv] Update API URL and sign format URLs (#14693) +* [crunchyroll] Use old login method (#11572) + + +version 2017.11.06 + +Core ++ [extractor/common] Add protocol for f4m formats +* [f4m] Prefer baseURL for relative URLs (#14660) +* [extractor/common] Respect URL query in _extract_wowza_formats (14645) + +Extractors ++ [hotstar:playlist] Add support for playlists (#12465) +* [hotstar] Bypass geo restriction (#14672) +- [22tracks] Remove extractor (#11024, #14628) ++ [skysport] Sdd support ooyala videos protected with embed_token (#14641) +* [gamespot] Extract formats referenced with new data fields (#14652) +* [spankbang] Detect unavailable videos (#14644) + + +version 2017.10.29 + +Core +* [extractor/common] Prefix format id for audio only HLS formats ++ [utils] Add support for zero years and months in parse_duration + +Extractors +* [egghead] Fix extraction (#14388) ++ [fxnetworks] Extract series metadata (#14603) ++ [younow] Add support for younow.com (#9255, #9432, #12436) +* [dctptv] Fix extraction (#14599) +* [youtube] Restrict embed regular expression (#14600) +* [vimeo] Restrict iframe embed regular expression (#14600) +* [soundgasm] Improve extraction (#14588) +- [myvideo] Remove extractor (#8557) ++ [nbc] Add support for classic-tv videos (#14575) ++ [vrtnu] Add support for cookies authentication and simplify (#11873) ++ [canvas] Add support for vrt.be/vrtnu (#11873) +* [twitch:clips] Fix title extraction (#14566) ++ [ndtv] Add support for sub-sites (#14534) +* [dramafever] Fix login error message extraction ++ [nick] Add support for more nickelodeon sites (no, dk, se, ch, fr, es, pt, + ro, hu) (#14553) + + +version 2017.10.20 + +Core +* [downloader/fragment] Report warning instead of error on inconsistent + download state +* [downloader/hls] Fix total fragments count when ad fragments exist + +Extractors +* [parliamentliveuk] Fix extraction (#14524) +* [soundcloud] Update client id (#14546) ++ [servus] Add support for servus.com (#14362) ++ [unity] Add support for unity3d.com (#14528) +* [youtube] Replace youtube redirect URLs in description (#14517) +* [pbs] Restrict direct video URL regular expression (#14519) +* [drtv] Respect preference for direct HTTP formats (#14509) ++ [eporner] Add support for embed URLs (#14507) +* [arte] Capture and output error message +* [niconico] Improve uploader metadata extraction robustness (#14135) + + +version 2017.10.15.1 + +Core +* [downloader/hls] Ignore anvato ad fragments (#14496) +* [downloader/fragment] Output ad fragment count + +Extractors +* [scrippsnetworks:watch] Bypass geo restriction ++ [anvato] Add ability to bypass geo restriction +* [redditr] Fix extraction for URLs with query (#14495) + + +version 2017.10.15 + +Core ++ [common] Add support for jwplayer youtube embeds + +Extractors +* [scrippsnetworks:watch] Fix extraction (#14389) +* [anvato] Process master m3u8 manifests +* [youtube] Fix relative URLs in description +* [spike] Bypass geo restriction ++ [howstuffworks] Add support for more domains +* [infoq] Fix http format downloading ++ [rtlnl] Add support for another type of embeds ++ [onionstudios] Add support for bulbs-video embeds +* [udn] Fix extraction +* [shahid] Fix extraction (#14448) +* [kaltura] Ignore Widevine encrypted video (.wvm) (#14471) +* [vh1] Fix extraction (#9613) + + +version 2017.10.12 + +Core +* [YoutubeDL] Improve _default_format_spec (#14461) + +Extractors +* [steam] Fix extraction (#14067) ++ [funk] Add support for funk.net (#14464) ++ [nexx] Add support for shortcuts and relax domain id extraction ++ [voxmedia] Add support for recode.net (#14173) ++ [once] Add support for vmap URLs ++ [generic] Add support for channel9 embeds (#14469) +* [tva] Fix extraction (#14328) ++ [tubitv] Add support for new URL format (#14460) +- [afreecatv:global] Remove extractor +- [youtube:shared] Removed extractor (#14420) ++ [slideslive] Add support for slideslive.com (#2680) ++ [facebook] Support thumbnails (#14416) +* [vvvvid] Fix episode number extraction (#14456) +* [hrti:playlist] Relax URL regular expression +* [wdr] Relax media link regular expression (#14447) +* [hrti] Relax URL regular expression (#14443) +* [fox] Delegate extraction to uplynk:preplay (#14147) ++ [youtube] Add support for hooktube.com (#14437) + + +version 2017.10.07 + +Core +* [YoutubeDL] Ignore duplicates in --playlist-items +* [YoutubeDL] Fix out of range --playlist-items for iterable playlists and + reduce code duplication (#14425) ++ [utils] Use cache in OnDemandPagedList by default +* [postprocessor/ffmpeg] Convert to opus using libopus (#14381) + +Extractors +* [reddit] Sort formats (#14430) +* [lnkgo] Relax URL regular expression (#14423) +* [pornflip] Extend URL regular expression (#14405, #14406) ++ [xtube] Add support for embed URLs (#14417) ++ [xvideos] Add support for embed URLs and improve extraction (#14409) +* [beeg] Fix extraction (#14403) +* [tvn24] Relax URL regular expression (#14395) +* [nbc] Fix extraction (#13651, #13715, #14137, #14198, #14312, #14314, #14378, + #14392, #14414, #14419, #14431) ++ [ketnet] Add support for videos without direct sources (#14377) +* [canvas] Generalize mediazone.vrt.be extractor and rework canvas and een ++ [afreecatv] Add support for adult videos (#14376) + + +version 2017.10.01 + +Core +* [YoutubeDL] Document youtube_include_dash_manifest + +Extractors ++ [tvp] Add support for new URL schema (#14368) ++ [generic] Add support for single format Video.js embeds (#14371) +* [yahoo] Bypass geo restriction for brightcove (#14210) +* [yahoo] Use extracted brightcove account id (#14210) +* [rtve:alacarta] Fix extraction (#14290) ++ [yahoo] Add support for custom brigthcove embeds (#14210) ++ [generic] Add support for Video.js embeds ++ [gfycat] Add support for /gifs/detail URLs (#14322) +* [generic] Fix infinite recursion for twitter:player URLs (#14339) +* [xhamsterembed] Fix extraction (#14308) + + +version 2017.09.24 + +Core ++ [options] Accept lrc as a subtitle conversion target format (#14292) +* [utils] Fix handling raw TTML subtitles (#14191) + +Extractors +* [24video] Fix timestamp extraction and make non fatal (#14295) ++ [24video] Add support for 24video.adult (#14295) ++ [kakao] Add support for tv.kakao.com (#12298, #14007) ++ [twitter] Add support for URLs without user id (#14270) ++ [americastestkitchen] Add support for americastestkitchen.com (#10764, + #13996) +* [generic] Fix support for multiple HTML5 videos on one page (#14080) +* [mixcloud] Fix extraction (#14088, #14132) ++ [lynda] Add support for educourse.ga (#14286) +* [beeg] Fix extraction (#14275) +* [nbcsports:vplayer] Correct theplatform URL (#13873) +* [twitter] Fix duration extraction (#14141) +* [tvplay] Bypass geo restriction ++ [heise] Add support for YouTube embeds (#14109) ++ [popcorntv] Add support for popcorntv.it (#5914, #14211) +* [viki] Update app data (#14181) +* [morningstar] Relax URL regular expression (#14222) +* [openload] Fix extraction (#14225, #14257) +* [noovo] Fix extraction (#14214) +* [dailymotion:playlist] Relax URL regular expression (#14219) ++ [twitch] Add support for go.twitch.tv URLs (#14215) +* [vgtv] Relax URL regular expression (#14223) + + +version 2017.09.15 + +Core +* [downloader/fragment] Restart inconsistent incomplete fragment downloads + (#13731) +* [YoutubeDL] Download raw subtitles files (#12909, #14191) + +Extractors +* [condenast] Fix extraction (#14196, #14207) ++ [orf] Add support for f4m stories +* [tv4] Relax URL regular expression (#14206) +* [animeondemand] Bypass geo restriction ++ [animeondemand] Add support for flash videos (#9944) + + +version 2017.09.11 + +Extractors +* [rutube:playlist] Fix suitable (#14166) + + +version 2017.09.10 + +Core ++ [utils] Introduce bool_or_none +* [YoutubeDL] Ensure dir existence for each requested format (#14116) + +Extractors +* [fox] Fix extraction (#14147) +* [rutube] Use bool_or_none +* [rutube] Rework and generalize playlist extractors (#13565) ++ [rutube:playlist] Add support for playlists (#13534, #13565) ++ [radiocanada] Add fallback for title extraction (#14145) +* [vk] Use dedicated YouTube embeds extraction routine +* [vice] Use dedicated YouTube embeds extraction routine +* [cracked] Use dedicated YouTube embeds extraction routine +* [chilloutzone] Use dedicated YouTube embeds extraction routine +* [abcnews] Use dedicated YouTube embeds extraction routine +* [youtube] Separate methods for embeds extraction +* [redtube] Fix formats extraction (#14122) +* [arte] Relax unavailability check (#14112) ++ [manyvids] Add support for preview videos from manyvids.com (#14053, #14059) +* [vidme:user] Relax URL regular expression (#14054) +* [bpb] Fix extraction (#14043, #14086) +* [soundcloud] Fix download URL with private tracks (#14093) +* [aliexpress:live] Add support for live.aliexpress.com (#13698, #13707) +* [viidea] Capture and output lecture error message (#14099) +* [radiocanada] Skip unsupported platforms (#14100) + + +version 2017.09.02 + +Extractors +* [youtube] Force old layout for each webpage (#14068, #14072, #14074, #14076, + #14077, #14079, #14082, #14083, #14094, #14095, #14096) +* [youtube] Fix upload date extraction (#14065) ++ [charlierose] Add support for episodes (#14062) ++ [bbccouk] Add support for w-prefixed ids (#14056) +* [googledrive] Extend URL regular expression (#9785) ++ [googledrive] Add support for source format (#14046) +* [pornhd] Fix extraction (#14005) + + +version 2017.08.27.1 + +Extractors + +* [youtube] Fix extraction with --youtube-skip-dash-manifest enabled (#14037) + + +version 2017.08.27 + +Core ++ [extractor/common] Extract height and format id for HTML5 videos (#14034) +* [downloader/http] Rework HTTP downloader (#506, #809, #2849, #4240, #6023, + #8625, #9483) + * Simplify code and split into separate routines to facilitate maintaining + * Make retry mechanism work on errors during actual download not only + during connection establishment phase + * Retry on ECONNRESET and ETIMEDOUT during reading data from network + * Retry on content too short + * Show error description on retry + +Extractors +* [generic] Lower preference for extraction from LD-JSON +* [rai] Fix audio formats extraction (#14024) +* [youtube] Fix controversy videos extraction (#14027, #14029) +* [mixcloud] Fix extraction (#14015, #14020) + + +version 2017.08.23 + +Core ++ [extractor/common] Introduce _parse_xml +* [extractor/common] Make HLS and DASH extraction in_parse_html5_media_entries + non fatal (#13970) +* [utils] Fix unescapeHTML for misformed string like "&a"" (#13935) + +Extractors +* [cbc:watch] Bypass geo restriction (#13993) +* [toutv] Relax DRM check (#13994) ++ [googledrive] Add support for subtitles (#13619, #13638) +* [pornhub] Relax uploader regular expression (#13906, #13975) +* [bandcamp:album] Extract track titles (#13962) ++ [bbccouk] Add support for events URLs (#13893) ++ [liveleak] Support multi-video pages (#6542) ++ [liveleak] Support another liveleak embedding pattern (#13336) +* [cda] Fix extraction (#13935) ++ [laola1tv] Add support for tv.ittf.com (#13965) +* [mixcloud] Fix extraction (#13958, #13974, #13980, #14003) + + +version 2017.08.18 + +Core +* [YoutubeDL] Sanitize byte string format URLs (#13951) ++ [extractor/common] Add support for float durations in _parse_mpd_formats + (#13919) + +Extractors +* [arte] Detect unavailable videos (#13945) +* [generic] Convert redirect URLs to unicode strings (#13951) +* [udemy] Fix paid course detection (#13943) +* [pluralsight] Use RPC API for course extraction (#13937) ++ [clippit] Add support for clippituser.tv ++ [qqmusic] Support new URL schemes (#13805) +* [periscope] Renew HLS extraction (#13917) +* [mixcloud] Extract decrypt key + + +version 2017.08.13 + +Core +* [YoutubeDL] Make sure format id is not empty +* [extractor/common] Make _family_friendly_search optional +* [extractor/common] Respect source's type attribute for HTML5 media (#13892) + +Extractors +* [pornhub:playlistbase] Skip videos from drop-down menu (#12819, #13902) ++ [fourtube] Add support pornerbros.com (#6022) ++ [fourtube] Add support porntube.com (#7859, #13901) ++ [fourtube] Add support fux.com +* [limelight] Improve embeds detection (#13895) ++ [reddit] Add support for v.redd.it and reddit.com (#13847) +* [aparat] Extract all formats (#13887) +* [mixcloud] Fix play info decryption (#13885) ++ [generic] Add support for vzaar embeds (#13876) + + +version 2017.08.09 + +Core +* [utils] Skip missing params in cli_bool_option (#13865) + +Extractors +* [xxxymovies] Fix title extraction (#13868) ++ [nick] Add support for nick.com.pl (#13860) +* [mixcloud] Fix play info decryption (#13867) +* [20min] Fix embeds extraction (#13852) +* [dplayit] Fix extraction (#13851) ++ [niconico] Support videos with multiple formats (#13522) ++ [niconico] Support HTML5-only videos (#13806) + + +version 2017.08.06 + +Core +* Use relative paths for DASH fragments (#12990) + +Extractors +* [pluralsight] Fix format selection +- [mpora] Remove extractor (#13826) ++ [voot] Add support for voot.com (#10255, #11644, #11814, #12350, #13218) +* [vlive:channel] Limit number of videos per page to 100 (#13830) +* [podomatic] Extend URL regular expression (#13827) +* [cinchcast] Extend URL regular expression +* [yandexdisk] Relax URL regular expression (#13824) +* [vidme] Extract DASH and HLS formats +- [teamfour] Remove extractor (#13782) +* [pornhd] Fix extraction (#13783) +* [udemy] Fix subtitles extraction (#13812) +* [mlb] Extend URL regular expression (#13740, #13773) ++ [pbs] Add support for new URL schema (#13801) +* [nrktv] Update API host (#13796) + + +version 2017.07.30.1 + +Core +* [downloader/hls] Use redirect URL as manifest base (#13755) +* [options] Correctly hide login info from debug outputs (#13696) + +Extractors ++ [watchbox] Add support for watchbox.de (#13739) +- [clipfish] Remove extractor ++ [youjizz] Fix extraction (#13744) ++ [generic] Add support for another ooyala embed pattern (#13727) ++ [ard] Add support for lives (#13771) +* [soundcloud] Update client id ++ [soundcloud:trackstation] Add support for track stations (#13733) +* [svtplay] Use geo verification proxy for API request +* [svtplay] Update API URL (#13767) ++ [yandexdisk] Add support for yadi.sk (#13755) ++ [megaphone] Add support for megaphone.fm +* [amcnetworks] Make rating optional (#12453) +* [cloudy] Fix extraction (#13737) ++ [nickru] Add support for nickelodeon.ru +* [mtv] Improve thumbnal extraction +* [nick] Automate geo-restriction bypass (#13711) +* [niconico] Improve error reporting (#13696) + + +version 2017.07.23 + +Core +* [YoutubeDL] Improve default format specification (#13704) +* [YoutubeDL] Do not override id, extractor and extractor_key for + url_transparent entities +* [extractor/common] Fix playlist_from_matches + +Extractors +* [itv] Fix production id extraction (#13671, #13703) +* [vidio] Make duration non fatal and fix typo +* [mtv] Skip missing video parts (#13690) +* [sportbox:embed] Fix extraction ++ [npo] Add support for npo3.nl URLs (#13695) +* [dramafever] Remove video id from title (#13699) ++ [egghead:lesson] Add support for lessons (#6635) +* [funnyordie] Extract more metadata (#13677) +* [youku:show] Fix playlist extraction (#13248) ++ [dispeak] Recognize sevt subdomain (#13276) +* [adn] Improve error reporting (#13663) +* [crunchyroll] Relax series and season regular expression (#13659) ++ [spiegel:article] Add support for nexx iframe embeds (#13029) ++ [nexx:embed] Add support for iframe embeds +* [nexx] Improve JS embed extraction ++ [pearvideo] Add support for pearvideo.com (#13031) + + +version 2017.07.15 + +Core +* [YoutubeDL] Don't expand environment variables in meta fields (#13637) + +Extractors +* [spiegeltv] Delegate extraction to nexx extractor (#13159) ++ [nexx] Add support for nexx.cloud (#10807, #13465) +* [generic] Fix rutube embeds extraction (#13641) +* [karrierevideos] Fix title extraction (#13641) +* [youtube] Don't capture YouTube Red ad for creator meta field (#13621) +* [slideshare] Fix extraction (#13617) ++ [5tv] Add another video URL pattern (#13354, #13606) +* [drtv] Make HLS and HDS extraction non fatal +* [ted] Fix subtitles extraction (#13628, #13629) +* [vine] Make sure the title won't be empty ++ [twitter] Support HLS streams in vmap URLs ++ [periscope] Support pscp.tv URLs in embedded frames +* [twitter] Extract mp4 urls via mobile API (#12726) +* [niconico] Fix authentication error handling (#12486) +* [giantbomb] Extract m3u8 formats (#13626) ++ [vlive:playlist] Add support for playlists (#13613) + + +version 2017.07.09 + +Core ++ [extractor/common] Add support for AMP tags in _parse_html5_media_entries ++ [utils] Support attributes with no values in get_elements_by_attribute + +Extractors ++ [dailymail] Add support for embeds ++ [joj] Add support for joj.sk (#13268) +* [abc.net.au:iview] Extract more formats (#13492, #13489) +* [egghead:course] Fix extraction (#6635, #13370) ++ [cjsw] Add support for cjsw.com (#13525) ++ [eagleplatform] Add support for referrer protected videos (#13557) ++ [eagleplatform] Add support for another embed pattern (#13557) +* [veoh] Extend URL regular expression (#13601) +* [npo:live] Fix live stream id extraction (#13568, #13605) +* [googledrive] Fix height extraction (#13603) ++ [dailymotion] Add support for new layout (#13580) +- [yam] Remove extractor +* [xhamster] Extract all formats and fix duration extraction (#13593) ++ [xhamster] Add support for new URL schema (#13593) +* [espn] Extend URL regular expression (#13244, #13549) +* [kaltura] Fix typo in subtitles extraction (#13569) +* [vier] Adapt extraction to redesign (#13575) + + +version 2017.07.02 + +Core +* [extractor/common] Improve _json_ld + +Extractors ++ [thisoldhouse] Add more fallbacks for video id +* [thisoldhouse] Fix video id extraction (#13540, #13541) +* [xfileshare] Extend format regular expression (#13536) +* [ted] Fix extraction (#13535) ++ [tastytrade] Add support for tastytrade.com (#13521) +* [dplayit] Relax video id regular expression (#13524) ++ [generic] Extract more generic metadata (#13527) ++ [bbccouk] Capture and output error message (#13501, #13518) +* [cbsnews] Relax video info regular expression (#13284, #13503) ++ [facebook] Add support for plugin video embeds and multiple embeds (#13493) +* [soundcloud] Switch to https for API requests (#13502) +* [pandatv] Switch to https for API and download URLs ++ [pandatv] Add support for https URLs (#13491) ++ [niconico] Support sp subdomain (#13494) + + +version 2017.06.25 + +Core ++ [adobepass] Add support for DIRECTV NOW (mso ATTOTT) (#13472) +* [YoutubeDL] Skip malformed formats for better extraction robustness + +Extractors ++ [wsj] Add support for barrons.com (#13470) ++ [ign] Add another video id pattern (#13328) ++ [raiplay:live] Add support for live streams (#13414) ++ [redbulltv] Add support for live videos and segments (#13486) ++ [onetpl] Add support for videos embedded via pulsembed (#13482) +* [ooyala] Make more robust +* [ooyala] Skip empty format URLs (#13471, #13476) +* [hgtv.com:show] Fix typo + + +version 2017.06.23 + +Core +* [adobepass] Fix extraction on older python 2.6 + +Extractors +* [youtube] Adapt to new automatic captions rendition (#13467) +* [hgtv.com:show] Relax video config regular expression (#13279, #13461) +* [drtuber] Fix formats extraction (#12058) +* [youporn] Fix upload date extraction +* [youporn] Improve formats extraction +* [youporn] Fix title extraction (#13456) +* [googledrive] Fix formats sorting (#13443) +* [watchindianporn] Fix extraction (#13411, #13415) ++ [vimeo] Add fallback mp4 extension for original format ++ [ruv] Add support for ruv.is (#13396) +* [viu] Fix extraction on older python 2.6 +* [pandora.tv] Fix upload_date extraction (#12846) ++ [asiancrush] Add support for asiancrush.com (#13420) + + +version 2017.06.18 + +Core +* [downloader/common] Use utils.shell_quote for debug command line +* [utils] Use compat_shlex_quote in shell_quote +* [postprocessor/execafterdownload] Encode command line (#13407) +* [compat] Fix compat_shlex_quote on Windows (#5889, #10254) +* [postprocessor/metadatafromtitle] Fix missing optional meta fields processing + in --metadata-from-title (#13408) +* [extractor/common] Fix json dumping with --geo-bypass ++ [extractor/common] Improve jwplayer subtitles extraction ++ [extractor/common] Improve jwplayer formats extraction (#13379) + +Extractors +* [polskieradio] Fix extraction (#13392) ++ [xfileshare] Add support for fastvideo.me (#13385) +* [bilibili] Fix extraction of videos with double quotes in titles (#13387) +* [4tube] Fix extraction (#13381, #13382) ++ [disney] Add support for disneychannel.de (#13383) +* [npo] Improve URL regular expression (#13376) ++ [corus] Add support for showcase.ca ++ [corus] Add support for history.ca (#13359) + + +version 2017.06.12 + +Core +* [utils] Handle compat_HTMLParseError in extract_attributes (#13349) ++ [compat] Introduce compat_HTMLParseError +* [utils] Improve unified_timestamp +* [extractor/generic] Ensure format id is unicode string +* [extractor/common] Return unicode string from _match_id ++ [YoutubeDL] Sanitize more fields (#13313) + +Extractors ++ [xfileshare] Add support for rapidvideo.tv (#13348) +* [xfileshare] Modernize and pass Referer ++ [rutv] Add support for testplayer.vgtrk.com (#13347) ++ [newgrounds] Extract more metadata (#13232) ++ [newgrounds:playlist] Add support for playlists (#10611) +* [newgrounds] Improve formats and uploader extraction (#13346) +* [msn] Fix formats extraction +* [turbo] Ensure format id is string +* [sexu] Ensure height is int +* [jove] Ensure comment count is int +* [golem] Ensure format id is string +* [gfycat] Ensure filesize is int +* [foxgay] Ensure height is int +* [flickr] Ensure format id is string +* [sohu] Fix numeric fields +* [safari] Improve authentication detection (#13319) +* [liveleak] Ensure height is int (#13313) +* [streamango] Make title optional (#13292) +* [rtlnl] Improve URL regular expression (#13295) +* [tvplayer] Fix extraction (#13291) + + +version 2017.06.05 + +Core +* [YoutubeDL] Don't emit ANSI escape codes on Windows (#13270) + +Extractors ++ [bandcamp:weekly] Add support for bandcamp weekly (#12758) +* [pornhub:playlist] Fix extraction (#13281) +- [godtv] Remove extractor (#13175) +* [safari] Fix typo (#13252) +* [youtube] Improve chapters extraction (#13247) +* [1tv] Lower preference for HTTP formats (#13246) +* [francetv] Relax URL regular expression +* [drbonanza] Fix extraction (#13231) +* [packtpub] Fix authentication (#13240) + + +version 2017.05.29 + +Extractors +* [youtube] Fix DASH MPD extraction for videos with non-encrypted format URLs + (#13211) +* [xhamster] Fix uploader and like/dislike count extraction (#13216)) ++ [xhamster] Extract categories (#11728) ++ [abcnews] Add support for embed URLs (#12851) +* [gaskrank] Fix extraction (#12493) +* [medialaan] Fix videos with missing videoUrl (#12774) +* [dvtv] Fix playlist support ++ [dvtv] Add support for DASH and HLS formats (#3063) ++ [beam:vod] Add support for beam.pro/mixer.com VODs (#13032)) +* [cbsinteractive] Relax URL regular expression (#13213) +* [adn] Fix formats extraction ++ [youku] Extract more metadata (#10433) +* [cbsnews] Fix extraction (#13205) + + +version 2017.05.26 + +Core ++ [utils] strip_jsonp() can recognize more patterns +* [postprocessor/ffmpeg] Fix metadata filename handling on Python 2 (#13182) + +Extractors ++ [youtube] DASH MPDs with cipher signatures are recognized now (#11381) ++ [bbc] Add support for authentication +* [tudou] Merge into youku extractor (#12214) +* [youku:show] Fix extraction +* [youku] Fix extraction (#13191) +* [udemy] Fix extraction for outputs' format entries without URL (#13192) +* [vimeo] Fix formats' sorting (#13189) +* [cbsnews] Fix extraction for 60 Minutes videos (#12861) + + +version 2017.05.23 + +Core ++ [downloader/external] Pass -loglevel to ffmpeg downloader (#13183) ++ [adobepass] Add support for Bright House Networks (#13149) + +Extractors ++ [streamcz] Add support for subtitles (#13174) +* [youtube] Fix DASH manifest signature decryption (#8944, #13156) +* [toggle] Relax URL regular expression (#13172) +* [toypics] Fix extraction (#13077) +* [njpwworld] Fix extraction (#13162, #13169) ++ [hitbox] Add support for smashcast.tv (#13154) +* [mitele] Update app key regular expression (#13158) + + +version 2017.05.18.1 + +Core +* [jsinterp] Fix typo and cleanup regular expressions (#13134) + + +version 2017.05.18 + +Core ++ [jsinterp] Add support for quoted names and indexers (#13123, #13124, #13125, + #13126, #13128, #13129, #13130, #13131, #13132) ++ [extractor/common] Add support for schemeless URLs in _extract_wowza_formats + (#13088, #13092) ++ [utils] Recognize more audio codecs (#13081) + +Extractors ++ [vier] Extract more metadata (#12539) +* [vier] Improve extraction (#12801) + + Add support for authentication + * Bypass authentication when no credentials provided + * Improve extraction robustness +* [dailymail] Fix sources extraction (#13057) +* [dailymotion] Extend URL regular expression (#13079) + + +version 2017.05.14 + +Core ++ [extractor/common] Respect Width and Height attributes in ISM manifests ++ [postprocessor/metadatafromtitle] Add support regular expression syntax for + --metadata-from-title (#13065) + +Extractors ++ [mediaset] Add support for video.mediaset.it (#12708, #12964) +* [orf:radio] Fix extraction (#11643, #12926) +* [aljazeera] Extend URL regular expression (#13053) +* [imdb] Relax URL regular expression (#13056) ++ [francetv] Add support for mobile.france.tv (#13068) ++ [upskill] Add support for upskillcourses.com (#13043) +* [thescene] Fix extraction (#13061) +* [condenast] Improve embed support +* [liveleak] Fix extraction (#12053) ++ [douyu] Support Douyu shows (#12228) +* [myspace] Improve URL regular expression (#13040) +* [adultswim] Use desktop platform in assets URL (#13041) + + +version 2017.05.09 + +Core +* [YoutubeDL] Force --restrict-filenames when no locale is set on all python + versions (#13027) + +Extractors +* [francetv] Adapt to site redesign (#13034) ++ [packtpub] Add support for authentication (#12622) +* [drtv] Lower preference for SignLanguage formats (#13013, #13016) ++ [cspan] Add support for brightcove live embeds (#13028) +* [vrv] Extract DASH formats and subtitles +* [funimation] Fix authentication (#13021) +* [adultswim] Fix extraction (#8640, #10950, #11042, #12121) + + Add support for Adobe Pass authentication + + Add support for live streams + + Add support for show pages +* [turner] Extract thumbnail, is_live and strip description ++ [nonktube] Add support for nonktube.com (#8647, #13024) ++ [nuevo] Pass headers to _extract_nuevo +* [nbc] Improve extraction (#12364) + + +version 2017.05.07 + +Common +* [extractor/common] Fix typo in _extract_akamai_formats ++ [postprocessor/ffmpeg] Embed chapters into media file with --add-metadata ++ [extractor/common] Introduce chapters meta field + +Extractors +* [youtube] Fix authentication (#12820, #12927, #12973, #12992, #12993, #12995, + #13003) +* [bilibili] Fix video downloading (#13001) +* [rmcdecouverte] Fix extraction (#12937) +* [theplatform] Extract chapters +* [bandcamp] Fix thumbnail extraction (#12980) +* [pornhub] Extend URL regular expression (#12996) ++ [youtube] Extract chapters ++ [nrk] Extract chapters ++ [vice] Add support for ooyala embeds in article pages ++ [vice] Support vice articles (#12968) +* [vice] Fix extraction for non en_us videos (#12967) +* [gdcvault] Fix extraction for some videos (#12733) +* [pbs] Improve multipart video support (#12981) +* [laola1tv] Fix extraction (#12880) ++ [cda] Support birthday verification (#12789) +* [leeco] Fix extraction (#12974) ++ [pbs] Extract chapters +* [amp] Imporove thumbnail and subtitles extraction +* [foxsports] Fix extraction (#12945) +- [coub] Remove comment count extraction (#12941) + + +version 2017.05.01 + +Core ++ [extractor/common] Extract view count from JSON-LD +* [utils] Improve unified_timestamp ++ [utils] Add video/mp2t to mimetype2ext +* [downloader/external] Properly handle live stream downloading cancellation + (#8932) ++ [utils] Add support for unicode whitespace in clean_html on python 2 (#12906) + +Extractors +* [infoq] Make audio format extraction non fatal (#12938) +* [brightcove] Allow whitespace around attribute names in embedded code ++ [zaq1] Add support for zaq1.pl (#12693) ++ [xvideos] Extract duration (#12828) +* [vevo] Fix extraction (#12879) ++ [noovo] Add support for noovo.ca (#12792) ++ [washingtonpost] Add support for embeds (#12699) +* [yandexmusic:playlist] Fix extraction for python 3 (#12888) +* [anvato] Improve extraction (#12913) + * Promote to regular shortcut based extractor + * Add mcp to access key mapping table + * Add support for embeds extraction + * Add support for anvato embeds in generic extractor +* [xtube] Fix extraction for older FLV videos (#12734) +* [tvplayer] Fix extraction (#12908) + + +version 2017.04.28 + +Core ++ [adobepass] Use geo verification headers for all requests +- [downloader/fragment] Remove assert for resume_len when no fragments + downloaded ++ [extractor/common] Add manifest_url for explicit group rendition formats +* [extractor/common] Fix manifest_url for m3u8 formats +- [extractor/common] Don't list master m3u8 playlists in format list (#12832) + +Extractor +* [aenetworks] Fix extraction for shows with single season ++ [go] Add support for Disney, DisneyJunior and DisneyXD show pages +* [youtube] Recognize new locale-based player URLs (#12885) ++ [streamable] Add support for new embedded URL schema (#12844) +* [arte:+7] Relax URL regular expression (#12837) + + +version 2017.04.26 + +Core +* Introduce --keep-fragments for keeping fragments of fragmented download + on disk after download is finished +* [YoutubeDL] Fix output template for missing timestamp (#12796) +* [socks] Handle cases where credentials are required but missing +* [extractor/common] Improve HLS extraction (#12211) + * Extract m3u8 parsing to separate method + * Improve rendition groups extraction + * Build stream name according stream GROUP-ID + * Ignore reference to AUDIO group without URI when stream has no CODECS + * Use float for scaled tbr in _parse_m3u8_formats +* [utils] Add support for TTML styles in dfxp2srt +* [downloader/hls] No need to download keys for fragments that have been + already downloaded +* [downloader/fragment] Improve fragment downloading + * Resume immediately + * Don't concatenate fragments and decrypt them on every resume + * Optimize disk storage usage, don't store intermediate fragments on disk + * Store bookkeeping download state file ++ [extractor/common] Add support for multiple getters in try_get ++ [extractor/common] Add support for video of WebPage context in _json_ld + (#12778) ++ [extractor/common] Relax JWPlayer regular expression and remove + duplicate URLs (#12768) + +Extractors +* [iqiyi] Fix extraction of Yule videos +* [vidio] Improve extraction and sort formats ++ [brightcove] Match only video elements with data-video-id attribute +* [iqiyi] Fix playlist detection (#12504) +- [azubu] Remove extractor (#12813) +* [porn91] Fix extraction (#12814) +* [vidzi] Fix extraction (#12793) ++ [amp] Extract error message (#12795) ++ [xfileshare] Add support for gorillavid.com and daclips.com (#12776) +* [instagram] Fix extraction (#12777) ++ [generic] Support Brightcove videos in ' + manifest_url = self._html_search_regex( + PLAYER_REGEX, webpage, 'manifest_url') - embed_url = KalturaIE._extract_url(start_page) - if embed_url: - embed_url = smuggle_url(embed_url, {'source_url': url}) - ie_key = 'Kaltura' - else: - PLAYER_REGEX = r'', - start_page, 'xml filename', default=None) - if not xml_name: - info = self._parse_html5_media_entries(url, start_page, video_id)[0] - info.update({ - 'title': remove_start(self._search_regex( - r'>Session Name:\s*<.*?>\s*(.+?)', start_page, - 'title', default=None) or self._og_search_title( - start_page, default=None), 'GDC Vault - '), - 'id': video_id, - 'display_id': display_id, - }) - return info - embed_url = '%s/xml/%s' % (xml_root, xml_name) - ie_key = 'DigitallySpeaking' + kaltura_id = self._search_regex( + r'entry_id=(?P(?:[^&])+)', manifest_url, + 'kaltura id', group='id') return { '_type': 'url_transparent', + 'url': 'kaltura:%s:%s' % (partner_id, kaltura_id), + 'ie_key': KalturaIE.ie_key(), 'id': video_id, 'display_id': display_id, - 'url': embed_url, - 'ie_key': ie_key, + 'title': title, } diff --git a/yt_dlp/extractor/generic.py b/youtube_dlc/extractor/generic.py similarity index 92% rename from yt_dlp/extractor/generic.py rename to youtube_dlc/extractor/generic.py index 7e0598e58..db4d3a933 100644 --- a/yt_dlp/extractor/generic.py +++ b/youtube_dlc/extractor/generic.py @@ -20,24 +20,19 @@ from ..utils import ( ExtractorError, float_or_none, HEADRequest, - int_or_none, is_html, js_to_json, KNOWN_EXTENSIONS, merge_dicts, mimetype2ext, orderedSet, - parse_duration, sanitized_Request, smuggle_url, unescapeHTML, - unified_timestamp, + unified_strdate, unsmuggle_url, UnsupportedError, - url_or_none, - xpath_attr, xpath_text, - xpath_with_ns, ) from .commonprotocols import RtmpIE from .brightcove import ( @@ -53,6 +48,7 @@ from .ooyala import OoyalaIE from .rutv import RUTVIE from .tvc import TVCIE from .sportbox import SportBoxIE +from .smotri import SmotriIE from .myvi import MyviIE from .condenast import CondeNastIE from .udn import UDNEmbedIE @@ -67,10 +63,7 @@ from .tube8 import Tube8IE from .mofosex import MofosexEmbedIE from .spankwire import SpankwireIE from .youporn import YouPornIE -from .vimeo import ( - VimeoIE, - VHXEmbedIE, -) +from .vimeo import VimeoIE from .dailymotion import DailymotionIE from .dailymail import DailyMailIE from .onionstudios import OnionStudiosIE @@ -84,6 +77,7 @@ from .jwplatform import JWPlatformIE from .digiteka import DigitekaIE from .arkena import ArkenaIE from .instagram import InstagramIE +from .liveleak import LiveLeakIE from .threeqsdn import ThreeQSDNIE from .theplatform import ThePlatformIE from .kaltura import KalturaIE @@ -125,16 +119,7 @@ from .viqeo import ViqeoIE from .expressen import ExpressenIE from .zype import ZypeIE from .odnoklassniki import OdnoklassnikiIE -from .vk import VKIE from .kinja import KinjaEmbedIE -from .gedidigital import GediDigitalIE -from .rcs import RCSEmbedsIE -from .bitchute import BitChuteIE -from .rumble import RumbleEmbedIE -from .arcpublishing import ArcPublishingIE -from .medialaan import MedialaanIE -from .simplecast import SimplecastIE -from .wimtv import WimTVIE class GenericIE(InfoExtractor): @@ -213,46 +198,11 @@ class GenericIE(InfoExtractor): { 'url': 'http://podcastfeeds.nbcnews.com/audio/podcast/MSNBC-MADDOW-NETCAST-M4V.xml', 'info_dict': { - 'id': 'http://podcastfeeds.nbcnews.com/nbcnews/video/podcast/MSNBC-MADDOW-NETCAST-M4V.xml', - 'title': 'MSNBC Rachel Maddow (video)', - 'description': 're:.*her unique approach to storytelling.*', - }, - 'playlist': [{ - 'info_dict': { - 'ext': 'mov', - 'id': 'pdv_maddow_netcast_mov-12-03-2020-223726', - 'title': 'MSNBC Rachel Maddow (video) - 12-03-2020-223726', - 'description': 're:.*her unique approach to storytelling.*', - 'upload_date': '20201204', - }, - }], - }, - # RSS feed with item with description and thumbnails - { - 'url': 'https://anchor.fm/s/dd00e14/podcast/rss', - 'info_dict': { - 'id': 'https://anchor.fm/s/dd00e14/podcast/rss', - 'title': 're:.*100% Hydrogen.*', - 'description': 're:.*In this episode.*', - }, - 'playlist': [{ - 'info_dict': { - 'ext': 'm4a', - 'id': 'c1c879525ce2cb640b344507e682c36d', - 'title': 're:Hydrogen!', - 'description': 're:.*In this episode we are going.*', - 'timestamp': 1567977776, - 'upload_date': '20190908', - 'duration': 459, - 'thumbnail': r're:^https?://.*\.jpg$', - 'episode_number': 1, - 'season_number': 1, - 'age_limit': 0, - }, - }], - 'params': { - 'skip_download': True, - }, + 'id': 'pdv_maddow_netcast_m4v-02-27-2015-201624', + 'ext': 'm4v', + 'upload_date': '20150228', + 'title': 'pdv_maddow_netcast_m4v-02-27-2015-201624', + } }, # RSS feed with enclosures and unsupported link URLs { @@ -1631,6 +1581,31 @@ class GenericIE(InfoExtractor): 'upload_date': '20160409', }, }, + # LiveLeak embed + { + 'url': 'http://www.wykop.pl/link/3088787/', + 'md5': '7619da8c820e835bef21a1efa2a0fc71', + 'info_dict': { + 'id': '874_1459135191', + 'ext': 'mp4', + 'title': 'Man shows poor quality of new apartment building', + 'description': 'The wall is like a sand pile.', + 'uploader': 'Lake8737', + }, + 'add_ie': [LiveLeakIE.ie_key()], + }, + # Another LiveLeak embed pattern (#13336) + { + 'url': 'https://milo.yiannopoulos.net/2017/06/concealed-carry-robbery/', + 'info_dict': { + 'id': '2eb_1496309988', + 'ext': 'mp4', + 'title': 'Thief robs place where everyone was armed', + 'description': 'md5:694d73ee79e535953cf2488562288eee', + 'uploader': 'brazilwtf', + }, + 'add_ie': [LiveLeakIE.ie_key()], + }, # Duplicated embedded video URLs { 'url': 'http://www.hudl.com/athlete/2538180/highlights/149298443', @@ -1973,7 +1948,7 @@ class GenericIE(InfoExtractor): }, { # vshare embed - 'url': 'https://youtube-dl-demo.neocities.org/vshare.html', + 'url': 'https://youtube-dlc-demo.neocities.org/vshare.html', 'md5': '17b39f55b5497ae8b59f5fbce8e35886', 'info_dict': { 'id': '0f64ce6', @@ -2008,6 +1983,22 @@ class GenericIE(InfoExtractor): }, 'add_ie': [SpringboardPlatformIE.ie_key()], }, + { + 'url': 'https://www.youtube.com/shared?ci=1nEzmT-M4fU', + 'info_dict': { + 'id': 'uPDB5I9wfp8', + 'ext': 'webm', + 'title': 'Pocoyo: 90 minutos de episódios completos Português para crianças - PARTE 3', + 'description': 'md5:d9e4d9346a2dfff4c7dc4c8cec0f546d', + 'upload_date': '20160219', + 'uploader': 'Pocoyo - Português (BR)', + 'uploader_id': 'PocoyoBrazil', + }, + 'add_ie': [YoutubeIE.ie_key()], + 'params': { + 'skip_download': True, + }, + }, { 'url': 'https://www.yapfiles.ru/show/1872528/690b05d3054d2dbe1e69523aa21bb3b1.mp4.html', 'info_dict': { @@ -2112,23 +2103,23 @@ class GenericIE(InfoExtractor): 'skip_download': True, }, }, - # { - # # Zype embed - # 'url': 'https://www.cookscountry.com/episode/554-smoky-barbecue-favorites', - # 'info_dict': { - # 'id': '5b400b834b32992a310622b9', - # 'ext': 'mp4', - # 'title': 'Smoky Barbecue Favorites', - # 'thumbnail': r're:^https?://.*\.jpe?g', - # 'description': 'md5:5ff01e76316bd8d46508af26dc86023b', - # 'upload_date': '20170909', - # 'timestamp': 1504915200, - # }, - # 'add_ie': [ZypeIE.ie_key()], - # 'params': { - # 'skip_download': True, - # }, - # }, + { + # Zype embed + 'url': 'https://www.cookscountry.com/episode/554-smoky-barbecue-favorites', + 'info_dict': { + 'id': '5b400b834b32992a310622b9', + 'ext': 'mp4', + 'title': 'Smoky Barbecue Favorites', + 'thumbnail': r're:^https?://.*\.jpe?g', + 'description': 'md5:5ff01e76316bd8d46508af26dc86023b', + 'upload_date': '20170909', + 'timestamp': 1504915200, + }, + 'add_ie': [ZypeIE.ie_key()], + 'params': { + 'skip_download': True, + }, + }, { # videojs embed 'url': 'https://video.sibnet.ru/shell.php?videoid=3422904', @@ -2177,68 +2168,7 @@ class GenericIE(InfoExtractor): # 'params': { # 'force_generic_extractor': True, # }, - # }, - { - # VHX Embed - 'url': 'https://demo.vhx.tv/category-c/videos/file-example-mp4-480-1-5mg-copy', - 'info_dict': { - 'id': '858208', - 'ext': 'mp4', - 'title': 'Untitled', - 'uploader_id': 'user80538407', - 'uploader': 'OTT Videos', - }, - }, - { - # ArcPublishing PoWa video player - 'url': 'https://www.adn.com/politics/2020/11/02/video-senate-candidates-campaign-in-anchorage-on-eve-of-election-day/', - 'md5': 'b03b2fac8680e1e5a7cc81a5c27e71b3', - 'info_dict': { - 'id': '8c99cb6e-b29c-4bc9-9173-7bf9979225ab', - 'ext': 'mp4', - 'title': 'Senate candidates wave to voters on Anchorage streets', - 'description': 'md5:91f51a6511f090617353dc720318b20e', - 'timestamp': 1604378735, - 'upload_date': '20201103', - 'duration': 1581, - }, - }, - { - # MyChannels SDK embed - # https://www.24kitchen.nl/populair/deskundige-dit-waarom-sommigen-gevoelig-zijn-voor-voedselallergieen - 'url': 'https://www.demorgen.be/nieuws/burgemeester-rotterdam-richt-zich-in-videoboodschap-tot-relschoppers-voelt-het-goed~b0bcfd741/', - 'md5': '90c0699c37006ef18e198c032d81739c', - 'info_dict': { - 'id': '194165', - 'ext': 'mp4', - 'title': 'Burgemeester Aboutaleb spreekt relschoppers toe', - 'timestamp': 1611740340, - 'upload_date': '20210127', - 'duration': 159, - }, - }, - { - # Simplecast player embed - 'url': 'https://www.bio.org/podcast', - 'info_dict': { - 'id': 'podcast', - 'title': 'I AM BIO Podcast | BIO', - }, - 'playlist_mincount': 52, - }, - { - # Sibnet embed (https://help.sibnet.ru/?sibnet_video_embed) - 'url': 'https://phpbb3.x-tk.ru/bbcode-video-sibnet-t24.html', - 'only_matching': True, - }, { - # WimTv embed player - 'url': 'http://www.msmotor.tv/wearefmi-pt-2-2021/', - 'info_dict': { - 'id': 'wearefmi-pt-2-2021', - 'title': '#WEAREFMI – PT.2 – 2021 – MsMotorTV', - }, - 'playlist_count': 1, - }, + # } ] def report_following_redirect(self, new_url): @@ -2250,10 +2180,6 @@ class GenericIE(InfoExtractor): playlist_desc_el = doc.find('./channel/description') playlist_desc = None if playlist_desc_el is None else playlist_desc_el.text - NS_MAP = { - 'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd', - } - entries = [] for it in doc.findall('./channel/item'): next_url = None @@ -2269,33 +2195,10 @@ class GenericIE(InfoExtractor): if not next_url: continue - def itunes(key): - return xpath_text( - it, xpath_with_ns('./itunes:%s' % key, NS_MAP), - default=None) - - duration = itunes('duration') - explicit = (itunes('explicit') or '').lower() - if explicit in ('true', 'yes'): - age_limit = 18 - elif explicit in ('false', 'no'): - age_limit = 0 - else: - age_limit = None - entries.append({ '_type': 'url_transparent', 'url': next_url, 'title': it.find('title').text, - 'description': xpath_text(it, 'description', default=None), - 'timestamp': unified_timestamp( - xpath_text(it, 'pubDate', default=None)), - 'duration': int_or_none(duration) or parse_duration(duration), - 'thumbnail': url_or_none(xpath_attr(it, xpath_with_ns('./itunes:image', NS_MAP), 'href')), - 'episode': itunes('title'), - 'episode_number': int_or_none(itunes('episode')), - 'season_number': int_or_none(itunes('season')), - 'age_limit': age_limit, }) return { @@ -2349,29 +2252,29 @@ class GenericIE(InfoExtractor): parsed_url = compat_urlparse.urlparse(url) if not parsed_url.scheme: - default_search = self.get_param('default_search') + default_search = self._downloader.params.get('default_search') if default_search is None: default_search = 'fixup_error' if default_search in ('auto', 'auto_warning', 'fixup_error'): if re.match(r'^[^\s/]+\.[^\s/]+/', url): - self.report_warning('The url doesn\'t specify the protocol, trying with http') + self._downloader.report_warning('The url doesn\'t specify the protocol, trying with http') return self.url_result('http://' + url) elif default_search != 'fixup_error': if default_search == 'auto_warning': if re.match(r'^(?:url|URL)$', url): raise ExtractorError( - 'Invalid URL: %r . Call yt-dlp like this: yt-dlp -v "https://www.youtube.com/watch?v=BaW_jenozKc" ' % url, + 'Invalid URL: %r . Call youtube-dlc like this: youtube-dlc -v "https://www.youtube.com/watch?v=BaW_jenozKc" ' % url, expected=True) else: - self.report_warning( + self._downloader.report_warning( 'Falling back to youtube search for %s . Set --default-search "auto" to suppress this warning.' % url) return self.url_result('ytsearch:' + url) if default_search in ('error', 'fixup_error'): raise ExtractorError( '%r is not a valid URL. ' - 'Set --default-search "ytsearch" (or run yt-dlp "ytsearch:%s" ) to search YouTube' + 'Set --default-search "ytsearch" (or run youtube-dlc "ytsearch:%s" ) to search YouTube' % (url, url), expected=True) else: if ':' not in default_search: @@ -2415,7 +2318,7 @@ class GenericIE(InfoExtractor): info_dict = { 'id': video_id, 'title': self._generic_title(url), - 'timestamp': unified_timestamp(head_response.headers.get('Last-Modified')) + 'upload_date': unified_strdate(head_response.headers.get('Last-Modified')) } # Check for direct link to a video @@ -2423,9 +2326,8 @@ class GenericIE(InfoExtractor): m = re.match(r'^(?Paudio|video|application(?=/(?:ogg$|(?:vnd\.apple\.|x-)?mpegurl)))/(?P[^;\s]+)', content_type) if m: format_id = compat_str(m.group('format_id')) - subtitles = {} if format_id.endswith('mpegurl'): - formats, subtitles = self._extract_m3u8_formats_and_subtitles(url, video_id, 'mp4') + formats = self._extract_m3u8_formats(url, video_id, 'mp4') elif format_id == 'f4m': formats = self._extract_f4m_formats(url, video_id) else: @@ -2437,19 +2339,18 @@ class GenericIE(InfoExtractor): info_dict['direct'] = True self._sort_formats(formats) info_dict['formats'] = formats - info_dict['subtitles'] = subtitles return info_dict - if not self.get_param('test', False) and not is_intentional: - force = self.get_param('force_generic_extractor', False) - self.report_warning( + if not self._downloader.params.get('test', False) and not is_intentional: + force = self._downloader.params.get('force_generic_extractor', False) + self._downloader.report_warning( '%s on generic information extractor.' % ('Forcing' if force else 'Falling back')) if not full_response: request = sanitized_Request(url) # Some webservers may serve compressed content of rather big size (e.g. gzipped flac) # making it impossible to download only chunk of the file (yet we need only 512kB to - # test whether it's HTML or not). According to yt-dlp default Accept-Encoding + # test whether it's HTML or not). According to youtube-dlc default Accept-Encoding # that will always result in downloading the whole file that is not desirable. # Therefore for extraction pass we have to override Accept-Encoding to any in order # to accept raw bytes and being able to download only a chunk. @@ -2462,14 +2363,14 @@ class GenericIE(InfoExtractor): # Is it an M3U playlist? if first_bytes.startswith(b'#EXTM3U'): - info_dict['formats'], info_dict['subtitles'] = self._extract_m3u8_formats_and_subtitles(url, video_id, 'mp4') + info_dict['formats'] = self._extract_m3u8_formats(url, video_id, 'mp4') self._sort_formats(info_dict['formats']) return info_dict # Maybe it's a direct link to a video? # Be careful not to download the whole thing! if not is_html(first_bytes): - self.report_warning( + self._downloader.report_warning( 'URL could be a direct video link, returning it as such.') info_dict.update({ 'direct': True, @@ -2480,21 +2381,15 @@ class GenericIE(InfoExtractor): webpage = self._webpage_read_content( full_response, url, video_id, prefix=first_bytes) - if 'DPG Media Privacy Gate' in webpage: - webpage = self._download_webpage(url, video_id) - self.report_extraction(video_id) # Is it an RSS feed, a SMIL file, an XSPF playlist or a MPD manifest? try: - try: - doc = compat_etree_fromstring(webpage) - except compat_xml_parse_error: - doc = compat_etree_fromstring(webpage.encode('utf-8')) + doc = compat_etree_fromstring(webpage.encode('utf-8')) if doc.tag == 'rss': return self._extract_rss(url, video_id, doc) elif doc.tag == 'SmoothStreamingMedia': - info_dict['formats'], info_dict['subtitles'] = self._parse_ism_formats_and_subtitles(doc, url) + info_dict['formats'] = self._parse_ism_formats(doc, url) self._sort_formats(info_dict['formats']) return info_dict elif re.match(r'^(?:{[^}]+})?smil$', doc.tag): @@ -2508,7 +2403,7 @@ class GenericIE(InfoExtractor): xspf_base_url=full_response.geturl()), video_id) elif re.match(r'(?i)^(?:{[^}]+})?MPD$', doc.tag): - info_dict['formats'], info_dict['subtitles'] = self._parse_mpd_formats_and_subtitles( + info_dict['formats'] = self._parse_mpd_formats( doc, mpd_base_url=full_response.geturl().rpartition('/')[0], mpd_url=url) @@ -2529,9 +2424,7 @@ class GenericIE(InfoExtractor): # Sometimes embedded video player is hidden behind percent encoding # (e.g. https://github.com/ytdl-org/youtube-dl/issues/2448) # Unescaping the whole page allows to handle those cases in a generic way - # FIXME: unescaping the whole page may break URLs, commenting out for now. - # There probably should be a second run of generic extractor on unescaped webpage. - # webpage = compat_urllib_parse_unquote(webpage) + webpage = compat_urllib_parse_unquote(webpage) # Unescape squarespace embeds to be detected by generic extractor, # see https://github.com/ytdl-org/youtube-dl/issues/21294 @@ -2613,15 +2506,6 @@ class GenericIE(InfoExtractor): if tp_urls: return self.playlist_from_matches(tp_urls, video_id, video_title, ie='ThePlatform') - arc_urls = ArcPublishingIE._extract_urls(webpage) - if arc_urls: - return self.playlist_from_matches(arc_urls, video_id, video_title, ie=ArcPublishingIE.ie_key()) - - mychannels_urls = MedialaanIE._extract_urls(webpage) - if mychannels_urls: - return self.playlist_from_matches( - mychannels_urls, video_id, video_title, ie=MedialaanIE.ie_key()) - # Look for embedded rtl.nl player matches = re.findall( r']+?src="((?:https?:)?//(?:(?:www|static)\.)?rtl\.nl/(?:system/videoplayer/[^"]+(?:video_)?)?embed[^"]+)"', @@ -2633,25 +2517,12 @@ class GenericIE(InfoExtractor): if vimeo_urls: return self.playlist_from_matches(vimeo_urls, video_id, video_title, ie=VimeoIE.ie_key()) - vhx_url = VHXEmbedIE._extract_url(webpage) - if vhx_url: - return self.url_result(vhx_url, VHXEmbedIE.ie_key()) - vid_me_embed_url = self._search_regex( r'src=[\'"](https?://vid\.me/[^\'"]+)[\'"]', webpage, 'vid.me embed', default=None) if vid_me_embed_url is not None: return self.url_result(vid_me_embed_url, 'Vidme') - # Invidious Instances - # https://github.com/yt-dlp/yt-dlp/issues/195 - # https://github.com/iv-org/invidious/pull/1730 - youtube_url = self._search_regex( - r']+?src=(["\'])(?Phttps?://(?:www\.)?ivi\.ru/video/player.+?)\1', webpage) if mobj is not None: @@ -2812,12 +2678,6 @@ class GenericIE(InfoExtractor): return self.playlist_from_matches( matches, video_id, video_title, getter=unescapeHTML, ie='FunnyOrDie') - # Look for Simplecast embeds - simplecast_urls = SimplecastIE._extract_urls(webpage) - if simplecast_urls: - return self.playlist_from_matches( - simplecast_urls, video_id, video_title) - # Look for BBC iPlayer embed matches = re.findall(r'setPlaylist\("(https?://www\.bbc\.co\.uk/iplayer/[^/]+/[\da-z]{8})"\)', webpage) if matches: @@ -2912,6 +2772,11 @@ class GenericIE(InfoExtractor): if mobj is not None: return self.url_result(mobj.group('url')) + # Look for embedded smotri.com player + smotri_url = SmotriIE._extract_url(webpage) + if smotri_url: + return self.url_result(smotri_url, 'Smotri') + # Look for embedded Myvi.ru player myvi_url = MyviIE._extract_url(webpage) if myvi_url: @@ -2963,7 +2828,7 @@ class GenericIE(InfoExtractor): webpage) if not mobj: mobj = re.search( - r'data-video-link=["\'](?Phttp://m\.mlb\.com/video/[^"\']+)', + r'data-video-link=["\'](?Phttp://m.mlb.com/video/[^"\']+)', webpage) if mobj is not None: return self.url_result(mobj.group('url'), 'MLB') @@ -3178,6 +3043,11 @@ class GenericIE(InfoExtractor): return self.url_result( self._proto_relative_url(instagram_embed_url), InstagramIE.ie_key()) + # Look for LiveLeak embeds + liveleak_urls = LiveLeakIE._extract_urls(webpage) + if liveleak_urls: + return self.playlist_from_matches(liveleak_urls, video_id, video_title) + # Look for 3Q SDN embeds threeqsdn_url = ThreeQSDNIE._extract_url(webpage) if threeqsdn_url: @@ -3342,34 +3212,6 @@ class GenericIE(InfoExtractor): return self.playlist_from_matches( zype_urls, video_id, video_title, ie=ZypeIE.ie_key()) - gedi_urls = GediDigitalIE._extract_urls(webpage) - if gedi_urls: - return self.playlist_from_matches( - gedi_urls, video_id, video_title, ie=GediDigitalIE.ie_key()) - - # Look for RCS media group embeds - rcs_urls = RCSEmbedsIE._extract_urls(webpage) - if rcs_urls: - return self.playlist_from_matches( - rcs_urls, video_id, video_title, ie=RCSEmbedsIE.ie_key()) - - wimtv_urls = WimTVIE._extract_urls(webpage) - if wimtv_urls: - return self.playlist_from_matches( - wimtv_urls, video_id, video_title, ie=WimTVIE.ie_key()) - - bitchute_urls = BitChuteIE._extract_urls(webpage) - if bitchute_urls: - return self.playlist_from_matches( - bitchute_urls, video_id, video_title, ie=BitChuteIE.ie_key()) - - rumble_urls = RumbleEmbedIE._extract_urls(webpage) - if len(rumble_urls) == 1: - return self.url_result(rumble_urls[0], RumbleEmbedIE.ie_key()) - if rumble_urls: - return self.playlist_from_matches( - rumble_urls, video_id, video_title, ie=RumbleEmbedIE.ie_key()) - # Look for HTML5 media entries = self._parse_html5_media_entries(url, webpage, video_id, m3u8_id='hls') if entries: @@ -3410,7 +3252,6 @@ class GenericIE(InfoExtractor): if not isinstance(sources, list): sources = [sources] formats = [] - subtitles = {} for source in sources: src = source.get('src') if not src or not isinstance(src, compat_str): @@ -3423,29 +3264,21 @@ class GenericIE(InfoExtractor): if src_type == 'video/youtube': return self.url_result(src, YoutubeIE.ie_key()) if src_type == 'application/dash+xml' or ext == 'mpd': - fmts, subs = self._extract_mpd_formats_and_subtitles( - src, video_id, mpd_id='dash', fatal=False) - formats.extend(fmts) - self._merge_subtitles(subs, target=subtitles) + formats.extend(self._extract_mpd_formats( + src, video_id, mpd_id='dash', fatal=False)) elif src_type == 'application/x-mpegurl' or ext == 'm3u8': - fmts, subs = self._extract_m3u8_formats_and_subtitles( + formats.extend(self._extract_m3u8_formats( src, video_id, 'mp4', entry_protocol='m3u8_native', - m3u8_id='hls', fatal=False) - formats.extend(fmts) - self._merge_subtitles(subs, target=subtitles) + m3u8_id='hls', fatal=False)) else: formats.append({ 'url': src, 'ext': (mimetype2ext(src_type) or ext if ext in KNOWN_EXTENSIONS else 'mp4'), - 'http_headers': { - 'Referer': full_response.geturl(), - }, }) - if formats or subtitles: + if formats: self._sort_formats(formats) info_dict['formats'] = formats - info_dict['subtitles'] = subtitles return info_dict # Looking for http://schema.org/VideoObject @@ -3510,7 +3343,7 @@ class GenericIE(InfoExtractor): m_video_type = re.findall(r' - (?:%s\.)?go|fxnow\.fxnetworks| - (?:www\.)?(?:abc|freeform|disneynow) + (?: + (?:(?P%s)\.)?go| + (?Pabc|freeform|disneynow) )\.com/ (?: (?:[^/]+/)*(?P[Vv][Dd][Kk][Aa]\w+)| (?:[^/]+/)*(?P[^/?\#]+) ) - ''' % r'\.|'.join(list(_SITE_INFO.keys())) + ''' % '|'.join(list(_SITE_INFO.keys())) _TESTS = [{ 'url': 'http://abc.go.com/shows/designated-survivor/video/most-recent/VDKA3807643', 'info_dict': { @@ -107,31 +99,6 @@ class GoIE(AdobePassIE): # m3u8 download 'skip_download': True, }, - }, { - 'url': 'https://fxnow.fxnetworks.com/shows/better-things/video/vdka12782841', - 'info_dict': { - 'id': 'VDKA12782841', - 'ext': 'mp4', - 'title': 'First Look: Better Things - Season 2', - 'description': 'md5:fa73584a95761c605d9d54904e35b407', - }, - 'params': { - 'geo_bypass_ip_block': '3.244.239.0/24', - # m3u8 download - 'skip_download': True, - }, - }, { - 'url': 'https://abc.com/shows/modern-family/episode-guide/season-01/101-pilot', - 'info_dict': { - 'id': 'VDKA22600213', - 'ext': 'mp4', - 'title': 'Pilot', - 'description': 'md5:74306df917cfc199d76d061d66bebdb4', - }, - 'params': { - # m3u8 download - 'skip_download': True, - }, }, { 'url': 'http://abc.go.com/shows/the-catch/episode-guide/season-01/10-the-wedding', 'only_matching': True, @@ -149,9 +116,6 @@ class GoIE(AdobePassIE): }, { 'url': 'https://disneynow.com/shows/minnies-bow-toons/video/happy-campers/vdka4872013', 'only_matching': True, - }, { - 'url': 'https://www.freeform.com/shows/cruel-summer/episode-guide/season-01/01-happy-birthday-jeanette-turner', - 'only_matching': True, }] def _extract_videos(self, brand, video_id='-1', show_id='-1'): @@ -162,36 +126,24 @@ class GoIE(AdobePassIE): def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - sub_domain = remove_start(remove_end(mobj.group('sub_domain') or '', '.go'), 'www.') + sub_domain = mobj.group('sub_domain') or mobj.group('sub_domain_2') video_id, display_id = mobj.group('id', 'display_id') site_info = self._SITE_INFO.get(sub_domain, {}) brand = site_info.get('brand') if not video_id or not site_info: webpage = self._download_webpage(url, display_id or video_id) - data = self._parse_json( - self._search_regex( - r'["\']__abc_com__["\']\s*\]\s*=\s*({.+?})\s*;', webpage, - 'data', default='{}'), - display_id or video_id, fatal=False) - # https://abc.com/shows/modern-family/episode-guide/season-01/101-pilot - layout = try_get(data, lambda x: x['page']['content']['video']['layout'], dict) - video_id = None - if layout: - video_id = try_get( - layout, - (lambda x: x['videoid'], lambda x: x['video']['id']), - compat_str) - if not video_id: - video_id = self._search_regex( - ( - # There may be inner quotes, e.g. data-video-id="'VDKA3609139'" - # from http://freeform.go.com/shows/shadowhunters/episodes/season-2/1-this-guilty-blood - r'data-video-id=["\']*(VDKA\w+)', - # page.analytics.videoIdCode - r'\bvideoIdCode["\']\s*:\s*["\']((?:vdka|VDKA)\w+)', - # https://abc.com/shows/the-rookie/episode-guide/season-02/03-the-bet - r'\b(?:video)?id["\']\s*:\s*["\'](VDKA\w+)' - ), webpage, 'video id', default=video_id) + video_id = self._search_regex( + ( + # There may be inner quotes, e.g. data-video-id="'VDKA3609139'" + # from http://freeform.go.com/shows/shadowhunters/episodes/season-2/1-this-guilty-blood + r'data-video-id=["\']*(VDKA\w+)', + # https://github.com/ytdl-org/youtube-dl/pull/25216/files + # The following is based on the pull request on the line above. Changed the ABC.com URL to a show available now. + # https://abc.com/shows/the-rookie/episode-guide/season-02/19-the-q-word + r'\bvideoIdCode["\']\s*:\s*["\'](vdka\w+)', + # Deprecated fallback pattern + r'\b(?:video)?id["\']\s*:\s*["\'](VDKA\w+)' + ), webpage, 'video id', default=video_id) if not site_info: brand = self._search_regex( (r'data-brand=\s*["\']\s*(\d+)', @@ -267,7 +219,7 @@ class GoIE(AdobePassIE): if re.search(r'(?:/mp4/source/|_source\.mp4)', asset_url): f.update({ 'format_id': ('%s-' % format_id if format_id else '') + 'SOURCE', - 'quality': 1, + 'preference': 1, }) else: mobj = re.search(r'/(\d+)x(\d+)/', asset_url) diff --git a/yt_dlp/extractor/godtube.py b/youtube_dlc/extractor/godtube.py similarity index 100% rename from yt_dlp/extractor/godtube.py rename to youtube_dlc/extractor/godtube.py diff --git a/yt_dlp/extractor/golem.py b/youtube_dlc/extractor/golem.py similarity index 100% rename from yt_dlp/extractor/golem.py rename to youtube_dlc/extractor/golem.py diff --git a/yt_dlp/extractor/googledrive.py b/youtube_dlc/extractor/googledrive.py similarity index 95% rename from yt_dlp/extractor/googledrive.py rename to youtube_dlc/extractor/googledrive.py index 7b5bf280f..fdb15795a 100644 --- a/yt_dlp/extractor/googledrive.py +++ b/youtube_dlc/extractor/googledrive.py @@ -7,7 +7,6 @@ from ..compat import compat_parse_qs from ..utils import ( determine_ext, ExtractorError, - get_element_by_class, int_or_none, lowercase_escape, try_get, @@ -238,7 +237,7 @@ class GoogleDriveIE(InfoExtractor): if confirmation_webpage: confirm = self._search_regex( r'confirm=([^&"\']+)', confirmation_webpage, - 'confirmation code', default=None) + 'confirmation code', fatal=False) if confirm: confirmed_source_url = update_url_query(source_url, { 'confirm': confirm, @@ -246,14 +245,9 @@ class GoogleDriveIE(InfoExtractor): urlh = request_source_file(confirmed_source_url, 'confirmed source') if urlh and urlh.headers.get('Content-Disposition'): add_source_format(urlh) - else: - self.report_warning( - get_element_by_class('uc-error-subcaption', confirmation_webpage) - or get_element_by_class('uc-error-caption', confirmation_webpage) - or 'unable to extract confirmation code') if not formats and reason: - self.raise_no_formats(reason, expected=True) + raise ExtractorError(reason, expected=True) self._sort_formats(formats) diff --git a/youtube_dlc/extractor/googleplus.py b/youtube_dlc/extractor/googleplus.py new file mode 100644 index 000000000..6b927bb44 --- /dev/null +++ b/youtube_dlc/extractor/googleplus.py @@ -0,0 +1,73 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re +import codecs + +from .common import InfoExtractor +from ..utils import unified_strdate + + +class GooglePlusIE(InfoExtractor): + IE_DESC = 'Google Plus' + _VALID_URL = r'https?://plus\.google\.com/(?:[^/]+/)*?posts/(?P\w+)' + IE_NAME = 'plus.google' + _TEST = { + 'url': 'https://plus.google.com/u/0/108897254135232129896/posts/ZButuJc6CtH', + 'info_dict': { + 'id': 'ZButuJc6CtH', + 'ext': 'flv', + 'title': '嘆きの天使 降臨', + 'upload_date': '20120613', + 'uploader': '井上ヨシマサ', + } + } + + def _real_extract(self, url): + video_id = self._match_id(url) + + # Step 1, Retrieve post webpage to extract further information + webpage = self._download_webpage(url, video_id, 'Downloading entry webpage') + + title = self._og_search_description(webpage).splitlines()[0] + upload_date = unified_strdate(self._html_search_regex( + r'''(?x) + ([0-9]{4}-[0-9]{2}-[0-9]{2})''', + webpage, 'upload date', fatal=False, flags=re.VERBOSE)) + uploader = self._html_search_regex( + r'rel="author".*?>(.*?)', webpage, 'uploader', fatal=False) + + # Step 2, Simulate clicking the image box to launch video + DOMAIN = 'https://plus.google.com/' + video_page = self._search_regex( + r'\d{10}) - ''' + _VALID_URL = r'https?://(?:www\.)?hotstar\.com/.*(?P\d{10})' _TESTS = [{ # contentData 'url': 'https://www.hotstar.com/can-you-not-spread-rumours/1000076273', @@ -131,8 +124,7 @@ class HotStarIE(HotStarBaseIE): def _real_extract(self, url): video_id = self._match_id(url) - webpage, urlh = self._download_webpage_handle(url, video_id) - st = urlh.headers.get('x-origin-date') + webpage = self._download_webpage(url, video_id) app_state = self._parse_json(self._search_regex( r'', webpage, 'app state'), video_id) @@ -149,14 +141,14 @@ class HotStarIE(HotStarBaseIE): title = video_data['title'] - if not self.get_param('allow_unplayable_formats') and video_data.get('drmProtected'): + if video_data.get('drmProtected'): raise ExtractorError('This video is DRM protected.', expected=True) headers = {'Referer': url} formats = [] geo_restricted = False # change to v2 in the future - playback_sets = self._call_api_v2('play/v1/playback', video_id, st=st)['playBackSets'] + playback_sets = self._call_api_v2('play/v1/playback', video_id)['playBackSets'] for playback_set in playback_sets: if not isinstance(playback_set, dict): continue @@ -192,7 +184,7 @@ class HotStarIE(HotStarBaseIE): geo_restricted = True continue if not formats and geo_restricted: - self.raise_geo_restricted(countries=['IN'], metadata_available=True) + self.raise_geo_restricted(countries=['IN']) self._sort_formats(formats) for f in formats: @@ -243,47 +235,3 @@ class HotStarPlaylistIE(HotStarBaseIE): if video.get('contentId')] return self.playlist_result(entries, playlist_id) - - -class HotStarSeriesIE(HotStarBaseIE): - IE_NAME = 'hotstar:series' - _VALID_URL = r'(?:https?://)(?:www\.)?hotstar\.com(?:/in)?/tv/[^/]+/(?P\d+)' - _TESTS = [{ - 'url': 'https://www.hotstar.com/in/tv/radhakrishn/1260000646', - 'info_dict': { - 'id': '1260000646', - }, - 'playlist_mincount': 690, - }, { - 'url': 'https://www.hotstar.com/tv/dancee-/1260050431', - 'info_dict': { - 'id': '1260050431', - }, - 'playlist_mincount': 43, - }, { - 'url': 'https://www.hotstar.com/in/tv/mahabharat/435/', - 'info_dict': { - 'id': '435', - }, - 'playlist_mincount': 269, - }] - - def _real_extract(self, url): - series_id = self._match_id(url) - headers = { - 'x-country-code': 'IN', - 'x-platform-code': 'PCTV', - } - detail_json = self._download_json('https://api.hotstar.com/o/v1/show/detail?contentId=' + series_id, - video_id=series_id, headers=headers) - id = compat_str(try_get(detail_json, lambda x: x['body']['results']['item']['id'], int)) - item_json = self._download_json('https://api.hotstar.com/o/v1/tray/g/1/items?etid=0&tao=0&tas=10000&eid=' + id, - video_id=series_id, headers=headers) - entries = [ - self.url_result( - 'https://www.hotstar.com/%d' % video['contentId'], - ie=HotStarIE.ie_key(), video_id=video['contentId']) - for video in item_json['body']['results']['items'] - if video.get('contentId')] - - return self.playlist_result(entries, series_id) diff --git a/yt_dlp/extractor/howcast.py b/youtube_dlc/extractor/howcast.py similarity index 100% rename from yt_dlp/extractor/howcast.py rename to youtube_dlc/extractor/howcast.py diff --git a/yt_dlp/extractor/howstuffworks.py b/youtube_dlc/extractor/howstuffworks.py similarity index 100% rename from yt_dlp/extractor/howstuffworks.py rename to youtube_dlc/extractor/howstuffworks.py diff --git a/yt_dlp/extractor/hrfensehen.py b/youtube_dlc/extractor/hrfensehen.py similarity index 98% rename from yt_dlp/extractor/hrfensehen.py rename to youtube_dlc/extractor/hrfensehen.py index 2a994d471..805345e69 100644 --- a/yt_dlp/extractor/hrfensehen.py +++ b/youtube_dlc/extractor/hrfensehen.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import json import re -from ..utils import int_or_none, unified_timestamp, unescapeHTML +from youtube_dlc.utils import int_or_none, unified_timestamp, unescapeHTML from .common import InfoExtractor diff --git a/yt_dlp/extractor/hrti.py b/youtube_dlc/extractor/hrti.py similarity index 100% rename from yt_dlp/extractor/hrti.py rename to youtube_dlc/extractor/hrti.py diff --git a/yt_dlp/extractor/huajiao.py b/youtube_dlc/extractor/huajiao.py similarity index 100% rename from yt_dlp/extractor/huajiao.py rename to youtube_dlc/extractor/huajiao.py diff --git a/yt_dlp/extractor/huffpost.py b/youtube_dlc/extractor/huffpost.py similarity index 100% rename from yt_dlp/extractor/huffpost.py rename to youtube_dlc/extractor/huffpost.py diff --git a/yt_dlp/extractor/hungama.py b/youtube_dlc/extractor/hungama.py similarity index 100% rename from yt_dlp/extractor/hungama.py rename to youtube_dlc/extractor/hungama.py diff --git a/yt_dlp/extractor/hypem.py b/youtube_dlc/extractor/hypem.py similarity index 100% rename from yt_dlp/extractor/hypem.py rename to youtube_dlc/extractor/hypem.py diff --git a/youtube_dlc/extractor/ign.py b/youtube_dlc/extractor/ign.py new file mode 100644 index 000000000..a96ea8010 --- /dev/null +++ b/youtube_dlc/extractor/ign.py @@ -0,0 +1,232 @@ +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + int_or_none, + parse_iso8601, +) + + +class IGNIE(InfoExtractor): + """ + Extractor for some of the IGN sites, like www.ign.com, es.ign.com de.ign.com. + Some videos of it.ign.com are also supported + """ + + _VALID_URL = r'https?://.+?\.ign\.com/(?:[^/]+/)?(?Pvideos|show_videos|articles|feature|(?:[^/]+/\d+/video))(/.+)?/(?P.+)' + IE_NAME = 'ign.com' + + _API_URL_TEMPLATE = 'http://apis.ign.com/video/v3/videos/%s' + _EMBED_RE = r']+?["\']((?:https?:)?//.+?\.ign\.com.+?/embed.+?)["\']' + + _TESTS = [ + { + 'url': 'http://www.ign.com/videos/2013/06/05/the-last-of-us-review', + 'md5': 'febda82c4bafecd2d44b6e1a18a595f8', + 'info_dict': { + 'id': '8f862beef863986b2785559b9e1aa599', + 'ext': 'mp4', + 'title': 'The Last of Us Review', + 'description': 'md5:c8946d4260a4d43a00d5ae8ed998870c', + 'timestamp': 1370440800, + 'upload_date': '20130605', + 'uploader_id': 'cberidon@ign.com', + } + }, + { + 'url': 'http://me.ign.com/en/feature/15775/100-little-things-in-gta-5-that-will-blow-your-mind', + 'info_dict': { + 'id': '100-little-things-in-gta-5-that-will-blow-your-mind', + }, + 'playlist': [ + { + 'info_dict': { + 'id': '5ebbd138523268b93c9141af17bec937', + 'ext': 'mp4', + 'title': 'GTA 5 Video Review', + 'description': 'Rockstar drops the mic on this generation of games. Watch our review of the masterly Grand Theft Auto V.', + 'timestamp': 1379339880, + 'upload_date': '20130916', + 'uploader_id': 'danieljkrupa@gmail.com', + }, + }, + { + 'info_dict': { + 'id': '638672ee848ae4ff108df2a296418ee2', + 'ext': 'mp4', + 'title': '26 Twisted Moments from GTA 5 in Slow Motion', + 'description': 'The twisted beauty of GTA 5 in stunning slow motion.', + 'timestamp': 1386878820, + 'upload_date': '20131212', + 'uploader_id': 'togilvie@ign.com', + }, + }, + ], + 'params': { + 'skip_download': True, + }, + }, + { + 'url': 'http://www.ign.com/articles/2014/08/15/rewind-theater-wild-trailer-gamescom-2014?watch', + 'md5': '618fedb9c901fd086f6f093564ef8558', + 'info_dict': { + 'id': '078fdd005f6d3c02f63d795faa1b984f', + 'ext': 'mp4', + 'title': 'Rewind Theater - Wild Trailer Gamescom 2014', + 'description': 'Brian and Jared explore Michel Ancel\'s captivating new preview.', + 'timestamp': 1408047180, + 'upload_date': '20140814', + 'uploader_id': 'jamesduggan1990@gmail.com', + }, + }, + { + 'url': 'http://me.ign.com/en/videos/112203/video/how-hitman-aims-to-be-different-than-every-other-s', + 'only_matching': True, + }, + { + 'url': 'http://me.ign.com/ar/angry-birds-2/106533/video/lrd-ldyy-lwl-lfylm-angry-birds', + 'only_matching': True, + }, + { + # videoId pattern + 'url': 'http://www.ign.com/articles/2017/06/08/new-ducktales-short-donalds-birthday-doesnt-go-as-planned', + 'only_matching': True, + }, + ] + + def _find_video_id(self, webpage): + res_id = [ + r'"video_id"\s*:\s*"(.*?)"', + r'class="hero-poster[^"]*?"[^>]*id="(.+?)"', + r'data-video-id="(.+?)"', + r']*value="[^"]*?url=(https?://www\.ign\.com/videos/.*?)["&]', + webpage) + if multiple_urls: + entries = [self.url_result(u, ie='IGN') for u in multiple_urls] + return { + '_type': 'playlist', + 'id': name_or_id, + 'entries': entries, + } + + video_id = self._find_video_id(webpage) + if not video_id: + return self.url_result(self._search_regex( + self._EMBED_RE, webpage, 'embed url')) + return self._get_video_info(video_id) + + def _get_video_info(self, video_id): + api_data = self._download_json( + self._API_URL_TEMPLATE % video_id, video_id) + + formats = [] + m3u8_url = api_data['refs'].get('m3uUrl') + if m3u8_url: + formats.extend(self._extract_m3u8_formats( + m3u8_url, video_id, 'mp4', 'm3u8_native', + m3u8_id='hls', fatal=False)) + f4m_url = api_data['refs'].get('f4mUrl') + if f4m_url: + formats.extend(self._extract_f4m_formats( + f4m_url, video_id, f4m_id='hds', fatal=False)) + for asset in api_data['assets']: + formats.append({ + 'url': asset['url'], + 'tbr': asset.get('actual_bitrate_kbps'), + 'fps': asset.get('frame_rate'), + 'height': int_or_none(asset.get('height')), + 'width': int_or_none(asset.get('width')), + }) + self._sort_formats(formats) + + thumbnails = [{ + 'url': thumbnail['url'] + } for thumbnail in api_data.get('thumbnails', [])] + + metadata = api_data['metadata'] + + return { + 'id': api_data.get('videoId') or video_id, + 'title': metadata.get('longTitle') or metadata.get('name') or metadata.get['title'], + 'description': metadata.get('description'), + 'timestamp': parse_iso8601(metadata.get('publishDate')), + 'duration': int_or_none(metadata.get('duration')), + 'display_id': metadata.get('slug') or video_id, + 'uploader_id': metadata.get('creator'), + 'thumbnails': thumbnails, + 'formats': formats, + } + + +class OneUPIE(IGNIE): + _VALID_URL = r'https?://gamevideos\.1up\.com/(?Pvideo)/id/(?P.+)\.html' + IE_NAME = '1up.com' + + _TESTS = [{ + 'url': 'http://gamevideos.1up.com/video/id/34976.html', + 'md5': 'c9cc69e07acb675c31a16719f909e347', + 'info_dict': { + 'id': '34976', + 'ext': 'mp4', + 'title': 'Sniper Elite V2 - Trailer', + 'description': 'md5:bf0516c5ee32a3217aa703e9b1bc7826', + 'timestamp': 1313099220, + 'upload_date': '20110811', + 'uploader_id': 'IGN', + } + }] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + result = super(OneUPIE, self)._real_extract(url) + result['id'] = mobj.group('name_or_id') + return result + + +class PCMagIE(IGNIE): + _VALID_URL = r'https?://(?:www\.)?pcmag\.com/(?Pvideos|article2)(/.+)?/(?P.+)' + IE_NAME = 'pcmag' + + _EMBED_RE = r'iframe\.setAttribute\("src",\s*__util.objToUrlString\("http://widgets\.ign\.com/video/embed/content\.html?[^"]*url=([^"]+)["&]' + + _TESTS = [{ + 'url': 'http://www.pcmag.com/videos/2015/01/06/010615-whats-new-now-is-gogo-snooping-on-your-data', + 'md5': '212d6154fd0361a2781075f1febbe9ad', + 'info_dict': { + 'id': 'ee10d774b508c9b8ec07e763b9125b91', + 'ext': 'mp4', + 'title': '010615_What\'s New Now: Is GoGo Snooping on Your Data?', + 'description': 'md5:a7071ae64d2f68cc821c729d4ded6bb3', + 'timestamp': 1420571160, + 'upload_date': '20150106', + 'uploader_id': 'cozzipix@gmail.com', + } + }, { + 'url': 'http://www.pcmag.com/article2/0,2817,2470156,00.asp', + 'md5': '94130c1ca07ba0adb6088350681f16c1', + 'info_dict': { + 'id': '042e560ba94823d43afcb12ddf7142ca', + 'ext': 'mp4', + 'title': 'HTC\'s Weird New Re Camera - What\'s New Now', + 'description': 'md5:53433c45df96d2ea5d0fda18be2ca908', + 'timestamp': 1412953920, + 'upload_date': '20141010', + 'uploader_id': 'chris_snyder@pcmag.com', + } + }] diff --git a/yt_dlp/extractor/imdb.py b/youtube_dlc/extractor/imdb.py similarity index 100% rename from yt_dlp/extractor/imdb.py rename to youtube_dlc/extractor/imdb.py diff --git a/yt_dlp/extractor/imggaming.py b/youtube_dlc/extractor/imggaming.py similarity index 98% rename from yt_dlp/extractor/imggaming.py rename to youtube_dlc/extractor/imggaming.py index 1e43ec95b..e11f92053 100644 --- a/yt_dlp/extractor/imggaming.py +++ b/youtube_dlc/extractor/imggaming.py @@ -65,7 +65,7 @@ class ImgGamingBaseIE(InfoExtractor): domain, media_type, media_id, playlist_id = re.match(self._VALID_URL, url).groups() if playlist_id: - if self.get_param('noplaylist'): + if self._downloader.params.get('noplaylist'): self.to_screen('Downloading just video %s because of --no-playlist' % media_id) else: self.to_screen('Downloading playlist %s - add --no-playlist to just download video' % playlist_id) diff --git a/yt_dlp/extractor/imgur.py b/youtube_dlc/extractor/imgur.py similarity index 96% rename from yt_dlp/extractor/imgur.py rename to youtube_dlc/extractor/imgur.py index dfa473752..4dc7b0b5c 100644 --- a/yt_dlp/extractor/imgur.py +++ b/youtube_dlc/extractor/imgur.py @@ -60,7 +60,7 @@ class ImgurIE(InfoExtractor): 'width': width, 'height': height, 'http_headers': { - 'User-Agent': 'yt-dlp (like wget)', + 'User-Agent': 'youtube-dlc (like wget)', }, }) @@ -72,7 +72,7 @@ class ImgurIE(InfoExtractor): gif_json, video_id, transform_source=js_to_json) formats.append({ 'format_id': 'gif', - 'preference': -10, # gifs are worse than videos + 'preference': -10, 'width': width, 'height': height, 'ext': 'gif', @@ -82,7 +82,7 @@ class ImgurIE(InfoExtractor): 'url': self._proto_relative_url(gifd['gifUrl']), 'filesize': gifd.get('size'), 'http_headers': { - 'User-Agent': 'yt-dlp (like wget)', + 'User-Agent': 'youtube-dlc (like wget)', }, }) diff --git a/yt_dlp/extractor/ina.py b/youtube_dlc/extractor/ina.py similarity index 93% rename from yt_dlp/extractor/ina.py rename to youtube_dlc/extractor/ina.py index b3b2683cb..12695af27 100644 --- a/yt_dlp/extractor/ina.py +++ b/youtube_dlc/extractor/ina.py @@ -12,7 +12,7 @@ from ..utils import ( class InaIE(InfoExtractor): - _VALID_URL = r'https?://(?:(?:www|m)\.)?ina\.fr/(?:video|audio)/(?P[A-Z0-9_]+)' + _VALID_URL = r'https?://(?:www\.)?ina\.fr/(?:video|audio)/(?P[A-Z0-9_]+)' _TESTS = [{ 'url': 'http://www.ina.fr/video/I12055569/francois-hollande-je-crois-que-c-est-clair-video.html', 'md5': 'a667021bf2b41f8dc6049479d9bb38a3', @@ -31,9 +31,6 @@ class InaIE(InfoExtractor): }, { 'url': 'https://www.ina.fr/video/P16173408-video.html', 'only_matching': True, - }, { - 'url': 'http://m.ina.fr/video/I12055569', - 'only_matching': True, }] def _real_extract(self, url): diff --git a/yt_dlp/extractor/inc.py b/youtube_dlc/extractor/inc.py similarity index 100% rename from yt_dlp/extractor/inc.py rename to youtube_dlc/extractor/inc.py diff --git a/yt_dlp/extractor/indavideo.py b/youtube_dlc/extractor/indavideo.py similarity index 100% rename from yt_dlp/extractor/indavideo.py rename to youtube_dlc/extractor/indavideo.py diff --git a/yt_dlp/extractor/infoq.py b/youtube_dlc/extractor/infoq.py similarity index 100% rename from yt_dlp/extractor/infoq.py rename to youtube_dlc/extractor/infoq.py diff --git a/yt_dlp/extractor/instagram.py b/youtube_dlc/extractor/instagram.py similarity index 72% rename from yt_dlp/extractor/instagram.py rename to youtube_dlc/extractor/instagram.py index 1261f438e..b061850a1 100644 --- a/yt_dlp/extractor/instagram.py +++ b/youtube_dlc/extractor/instagram.py @@ -12,19 +12,17 @@ from ..compat import ( ) from ..utils import ( ExtractorError, - float_or_none, get_element_by_attribute, int_or_none, lowercase_escape, std_headers, try_get, url_or_none, - variadic, ) class InstagramIE(InfoExtractor): - _VALID_URL = r'(?Phttps?://(?:www\.)?instagram\.com/(?:p|tv|reel)/(?P[^/?#&]+))' + _VALID_URL = r'(?Phttps?://(?:www\.)?instagram\.com/(?:p|tv)/(?P[^/?#&]+))' _TESTS = [{ 'url': 'https://instagram.com/p/aye83DjauH/?foo=bar#abc', 'md5': '0d2da106a9d2631273e192b372806516', @@ -34,11 +32,10 @@ class InstagramIE(InfoExtractor): 'title': 'Video by naomipq', 'description': 'md5:1f17f0ab29bd6fe2bfad705f58de3cb8', 'thumbnail': r're:^https?://.*\.jpg', - 'duration': 0, 'timestamp': 1371748545, 'upload_date': '20130620', 'uploader_id': 'naomipq', - 'uploader': 'B E A U T Y F O R A S H E S', + 'uploader': 'Naomi Leonor Phan-Quang', 'like_count': int, 'comment_count': int, 'comments': list, @@ -51,7 +48,6 @@ class InstagramIE(InfoExtractor): 'ext': 'mp4', 'title': 'Video by britneyspears', 'thumbnail': r're:^https?://.*\.jpg', - 'duration': 0, 'timestamp': 1453760977, 'upload_date': '20160125', 'uploader_id': 'britneyspears', @@ -90,24 +86,6 @@ class InstagramIE(InfoExtractor): 'title': 'Post by instagram', 'description': 'md5:0f9203fc6a2ce4d228da5754bcf54957', }, - }, { - # IGTV - 'url': 'https://www.instagram.com/tv/BkfuX9UB-eK/', - 'info_dict': { - 'id': 'BkfuX9UB-eK', - 'ext': 'mp4', - 'title': 'Fingerboarding Tricks with @cass.fb', - 'thumbnail': r're:^https?://.*\.jpg', - 'duration': 53.83, - 'timestamp': 1530032919, - 'upload_date': '20180626', - 'uploader_id': 'instagram', - 'uploader': 'Instagram', - 'like_count': int, - 'comment_count': int, - 'comments': list, - 'description': 'Meet Cass Hirst (@cass.fb), a fingerboarding pro who can perform tiny ollies and kickflips while blindfolded.', - } }, { 'url': 'https://instagram.com/p/-Cmh1cukG2/', 'only_matching': True, @@ -117,9 +95,6 @@ class InstagramIE(InfoExtractor): }, { 'url': 'https://www.instagram.com/tv/aye83DjauH/', 'only_matching': True, - }, { - 'url': 'https://www.instagram.com/reel/CDUMkliABpa/', - 'only_matching': True, }] @staticmethod @@ -147,9 +122,9 @@ class InstagramIE(InfoExtractor): webpage = self._download_webpage(url, video_id) - (media, video_url, description, thumbnail, timestamp, uploader, + (video_url, description, thumbnail, timestamp, uploader, uploader_id, like_count, comment_count, comments, height, - width) = [None] * 12 + width) = [None] * 11 shared_data = self._parse_json( self._search_regex( @@ -162,78 +137,59 @@ class InstagramIE(InfoExtractor): (lambda x: x['entry_data']['PostPage'][0]['graphql']['shortcode_media'], lambda x: x['entry_data']['PostPage'][0]['media']), dict) - # _sharedData.entry_data.PostPage is empty when authenticated (see - # https://github.com/ytdl-org/youtube-dl/pull/22880) - if not media: - additional_data = self._parse_json( - self._search_regex( - r'window\.__additionalDataLoaded\s*\(\s*[^,]+,\s*({.+?})\s*\)\s*;', - webpage, 'additional data', default='{}'), - video_id, fatal=False) - if additional_data: - media = try_get( - additional_data, lambda x: x['graphql']['shortcode_media'], - dict) - if media: - video_url = media.get('video_url') - height = int_or_none(media.get('dimensions', {}).get('height')) - width = int_or_none(media.get('dimensions', {}).get('width')) - description = try_get( - media, lambda x: x['edge_media_to_caption']['edges'][0]['node']['text'], - compat_str) or media.get('caption') - title = media.get('title') - thumbnail = media.get('display_src') or media.get('display_url') - duration = float_or_none(media.get('video_duration')) - timestamp = int_or_none(media.get('taken_at_timestamp') or media.get('date')) - uploader = media.get('owner', {}).get('full_name') - uploader_id = media.get('owner', {}).get('username') + if media: + video_url = media.get('video_url') + height = int_or_none(media.get('dimensions', {}).get('height')) + width = int_or_none(media.get('dimensions', {}).get('width')) + description = try_get( + media, lambda x: x['edge_media_to_caption']['edges'][0]['node']['text'], + compat_str) or media.get('caption') + thumbnail = media.get('display_src') + timestamp = int_or_none(media.get('taken_at_timestamp') or media.get('date')) + uploader = media.get('owner', {}).get('full_name') + uploader_id = media.get('owner', {}).get('username') - def get_count(keys, kind): - for key in variadic(keys): - count = int_or_none(try_get( + def get_count(key, kind): + return int_or_none(try_get( media, (lambda x: x['edge_media_%s' % key]['count'], lambda x: x['%ss' % kind]['count']))) - if count is not None: - return count - like_count = get_count('preview_like', 'like') - comment_count = get_count( - ('preview_comment', 'to_comment', 'to_parent_comment'), 'comment') + like_count = get_count('preview_like', 'like') + comment_count = get_count('to_comment', 'comment') - comments = [{ - 'author': comment.get('user', {}).get('username'), - 'author_id': comment.get('user', {}).get('id'), - 'id': comment.get('id'), - 'text': comment.get('text'), - 'timestamp': int_or_none(comment.get('created_at')), - } for comment in media.get( - 'comments', {}).get('nodes', []) if comment.get('text')] - if not video_url: - edges = try_get( - media, lambda x: x['edge_sidecar_to_children']['edges'], - list) or [] - if edges: - entries = [] - for edge_num, edge in enumerate(edges, start=1): - node = try_get(edge, lambda x: x['node'], dict) - if not node: - continue - node_video_url = url_or_none(node.get('video_url')) - if not node_video_url: - continue - entries.append({ - 'id': node.get('shortcode') or node['id'], - 'title': node.get('title') or 'Video %d' % edge_num, - 'url': node_video_url, - 'thumbnail': node.get('display_url'), - 'duration': float_or_none(node.get('video_duration')), - 'width': int_or_none(try_get(node, lambda x: x['dimensions']['width'])), - 'height': int_or_none(try_get(node, lambda x: x['dimensions']['height'])), - 'view_count': int_or_none(node.get('video_view_count')), - }) - return self.playlist_result( - entries, video_id, - 'Post by %s' % uploader_id if uploader_id else None, - description) + comments = [{ + 'author': comment.get('user', {}).get('username'), + 'author_id': comment.get('user', {}).get('id'), + 'id': comment.get('id'), + 'text': comment.get('text'), + 'timestamp': int_or_none(comment.get('created_at')), + } for comment in media.get( + 'comments', {}).get('nodes', []) if comment.get('text')] + if not video_url: + edges = try_get( + media, lambda x: x['edge_sidecar_to_children']['edges'], + list) or [] + if edges: + entries = [] + for edge_num, edge in enumerate(edges, start=1): + node = try_get(edge, lambda x: x['node'], dict) + if not node: + continue + node_video_url = url_or_none(node.get('video_url')) + if not node_video_url: + continue + entries.append({ + 'id': node.get('shortcode') or node['id'], + 'title': 'Video %d' % edge_num, + 'url': node_video_url, + 'thumbnail': node.get('display_url'), + 'width': int_or_none(try_get(node, lambda x: x['dimensions']['width'])), + 'height': int_or_none(try_get(node, lambda x: x['dimensions']['height'])), + 'view_count': int_or_none(node.get('video_view_count')), + }) + return self.playlist_result( + entries, video_id, + 'Post by %s' % uploader_id if uploader_id else None, + description) if not video_url: video_url = self._og_search_video_url(webpage, secure=False) @@ -262,9 +218,8 @@ class InstagramIE(InfoExtractor): 'id': video_id, 'formats': formats, 'ext': 'mp4', - 'title': title or 'Video by %s' % uploader_id, + 'title': 'Video by %s' % uploader_id, 'description': description, - 'duration': duration, 'thumbnail': thumbnail, 'timestamp': timestamp, 'uploader_id': uploader_id, diff --git a/yt_dlp/extractor/internazionale.py b/youtube_dlc/extractor/internazionale.py similarity index 100% rename from yt_dlp/extractor/internazionale.py rename to youtube_dlc/extractor/internazionale.py diff --git a/yt_dlp/extractor/internetvideoarchive.py b/youtube_dlc/extractor/internetvideoarchive.py similarity index 100% rename from yt_dlp/extractor/internetvideoarchive.py rename to youtube_dlc/extractor/internetvideoarchive.py diff --git a/yt_dlp/extractor/iprima.py b/youtube_dlc/extractor/iprima.py similarity index 98% rename from yt_dlp/extractor/iprima.py rename to youtube_dlc/extractor/iprima.py index 28e660972..648ae6741 100644 --- a/yt_dlp/extractor/iprima.py +++ b/youtube_dlc/extractor/iprima.py @@ -136,7 +136,7 @@ class IPrimaIE(InfoExtractor): extract_formats(src) if not formats and '>GEO_IP_NOT_ALLOWED<' in playerpage: - self.raise_geo_restricted(countries=['CZ'], metadata_available=True) + self.raise_geo_restricted(countries=['CZ']) self._sort_formats(formats) diff --git a/yt_dlp/extractor/iqiyi.py b/youtube_dlc/extractor/iqiyi.py similarity index 98% rename from yt_dlp/extractor/iqiyi.py rename to youtube_dlc/extractor/iqiyi.py index e33e23f08..5df674daf 100644 --- a/yt_dlp/extractor/iqiyi.py +++ b/youtube_dlc/extractor/iqiyi.py @@ -280,7 +280,7 @@ class IqiyiIE(InfoExtractor): msg = 'error %s' % code if validation_result.get('msg'): msg += ': ' + validation_result['msg'] - self.report_warning('unable to log in: ' + msg) + self._downloader.report_warning('unable to log in: ' + msg) return False return True @@ -373,7 +373,7 @@ class IqiyiIE(InfoExtractor): 'url': stream['m3utx'], 'format_id': vd, 'ext': 'mp4', - 'quality': self._FORMATS_MAP.get(vd, -1), + 'preference': self._FORMATS_MAP.get(vd, -1), 'protocol': 'm3u8_native', }) diff --git a/yt_dlp/extractor/ir90tv.py b/youtube_dlc/extractor/ir90tv.py similarity index 100% rename from yt_dlp/extractor/ir90tv.py rename to youtube_dlc/extractor/ir90tv.py diff --git a/youtube_dlc/extractor/itv.py b/youtube_dlc/extractor/itv.py new file mode 100644 index 000000000..ad2f4eca5 --- /dev/null +++ b/youtube_dlc/extractor/itv.py @@ -0,0 +1,312 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import uuid +import xml.etree.ElementTree as etree +import json +import re + +from .common import InfoExtractor +from .brightcove import BrightcoveNewIE +from ..compat import ( + compat_str, + compat_etree_register_namespace, +) +from ..utils import ( + determine_ext, + ExtractorError, + extract_attributes, + int_or_none, + merge_dicts, + parse_duration, + smuggle_url, + url_or_none, + xpath_with_ns, + xpath_element, + xpath_text, +) + + +class ITVIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?itv\.com/hub/[^/]+/(?P[0-9a-zA-Z]+)' + _GEO_COUNTRIES = ['GB'] + _TESTS = [{ + 'url': 'http://www.itv.com/hub/mr-bean-animated-series/2a2936a0053', + 'info_dict': { + 'id': '2a2936a0053', + 'ext': 'flv', + 'title': 'Home Movie', + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + }, { + # unavailable via data-playlist-url + 'url': 'https://www.itv.com/hub/through-the-keyhole/2a2271a0033', + 'only_matching': True, + }, { + # InvalidVodcrid + 'url': 'https://www.itv.com/hub/james-martins-saturday-morning/2a5159a0034', + 'only_matching': True, + }, { + # ContentUnavailable + 'url': 'https://www.itv.com/hub/whos-doing-the-dishes/2a2898a0024', + 'only_matching': True, + }] + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + params = extract_attributes(self._search_regex( + r'(?s)(<[^>]+id="video"[^>]*>)', webpage, 'params')) + + ns_map = { + 'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/', + 'tem': 'http://tempuri.org/', + 'itv': 'http://schemas.datacontract.org/2004/07/Itv.BB.Mercury.Common.Types', + 'com': 'http://schemas.itv.com/2009/05/Common', + } + for ns, full_ns in ns_map.items(): + compat_etree_register_namespace(ns, full_ns) + + def _add_ns(name): + return xpath_with_ns(name, ns_map) + + def _add_sub_element(element, name): + return etree.SubElement(element, _add_ns(name)) + + production_id = ( + params.get('data-video-autoplay-id') + or '%s#001' % ( + params.get('data-video-episode-id') + or video_id.replace('a', '/'))) + + req_env = etree.Element(_add_ns('soapenv:Envelope')) + _add_sub_element(req_env, 'soapenv:Header') + body = _add_sub_element(req_env, 'soapenv:Body') + get_playlist = _add_sub_element(body, ('tem:GetPlaylist')) + request = _add_sub_element(get_playlist, 'tem:request') + _add_sub_element(request, 'itv:ProductionId').text = production_id + _add_sub_element(request, 'itv:RequestGuid').text = compat_str(uuid.uuid4()).upper() + vodcrid = _add_sub_element(request, 'itv:Vodcrid') + _add_sub_element(vodcrid, 'com:Id') + _add_sub_element(request, 'itv:Partition') + user_info = _add_sub_element(get_playlist, 'tem:userInfo') + _add_sub_element(user_info, 'itv:Broadcaster').text = 'Itv' + _add_sub_element(user_info, 'itv:DM') + _add_sub_element(user_info, 'itv:RevenueScienceValue') + _add_sub_element(user_info, 'itv:SessionId') + _add_sub_element(user_info, 'itv:SsoToken') + _add_sub_element(user_info, 'itv:UserToken') + site_info = _add_sub_element(get_playlist, 'tem:siteInfo') + _add_sub_element(site_info, 'itv:AdvertisingRestriction').text = 'None' + _add_sub_element(site_info, 'itv:AdvertisingSite').text = 'ITV' + _add_sub_element(site_info, 'itv:AdvertisingType').text = 'Any' + _add_sub_element(site_info, 'itv:Area').text = 'ITVPLAYER.VIDEO' + _add_sub_element(site_info, 'itv:Category') + _add_sub_element(site_info, 'itv:Platform').text = 'DotCom' + _add_sub_element(site_info, 'itv:Site').text = 'ItvCom' + device_info = _add_sub_element(get_playlist, 'tem:deviceInfo') + _add_sub_element(device_info, 'itv:ScreenSize').text = 'Big' + player_info = _add_sub_element(get_playlist, 'tem:playerInfo') + _add_sub_element(player_info, 'itv:Version').text = '2' + + headers = self.geo_verification_headers() + headers.update({ + 'Content-Type': 'text/xml; charset=utf-8', + 'SOAPAction': 'http://tempuri.org/PlaylistService/GetPlaylist', + }) + + info = self._search_json_ld(webpage, video_id, default={}) + formats = [] + subtitles = {} + + def extract_subtitle(sub_url): + ext = determine_ext(sub_url, 'ttml') + subtitles.setdefault('en', []).append({ + 'url': sub_url, + 'ext': 'ttml' if ext == 'xml' else ext, + }) + + resp_env = self._download_xml( + params['data-playlist-url'], video_id, + headers=headers, data=etree.tostring(req_env), fatal=False) + if resp_env: + playlist = xpath_element(resp_env, './/Playlist') + if playlist is None: + fault_code = xpath_text(resp_env, './/faultcode') + fault_string = xpath_text(resp_env, './/faultstring') + if fault_code == 'InvalidGeoRegion': + self.raise_geo_restricted( + msg=fault_string, countries=self._GEO_COUNTRIES) + elif fault_code not in ( + 'InvalidEntity', 'InvalidVodcrid', 'ContentUnavailable'): + raise ExtractorError( + '%s said: %s' % (self.IE_NAME, fault_string), expected=True) + info.update({ + 'title': self._og_search_title(webpage), + 'episode_title': params.get('data-video-episode'), + 'series': params.get('data-video-title'), + }) + else: + title = xpath_text(playlist, 'EpisodeTitle', default=None) + info.update({ + 'title': title, + 'episode_title': title, + 'episode_number': int_or_none(xpath_text(playlist, 'EpisodeNumber')), + 'series': xpath_text(playlist, 'ProgrammeTitle'), + 'duration': parse_duration(xpath_text(playlist, 'Duration')), + }) + video_element = xpath_element(playlist, 'VideoEntries/Video', fatal=True) + media_files = xpath_element(video_element, 'MediaFiles', fatal=True) + rtmp_url = media_files.attrib['base'] + + for media_file in media_files.findall('MediaFile'): + play_path = xpath_text(media_file, 'URL') + if not play_path: + continue + tbr = int_or_none(media_file.get('bitrate'), 1000) + f = { + 'format_id': 'rtmp' + ('-%d' % tbr if tbr else ''), + 'play_path': play_path, + # Providing this swfVfy allows to avoid truncated downloads + 'player_url': 'http://www.itv.com/mercury/Mercury_VideoPlayer.swf', + 'page_url': url, + 'tbr': tbr, + 'ext': 'flv', + } + app = self._search_regex( + 'rtmpe?://[^/]+/(.+)$', rtmp_url, 'app', default=None) + if app: + f.update({ + 'url': rtmp_url.split('?', 1)[0], + 'app': app, + }) + else: + f['url'] = rtmp_url + formats.append(f) + + for caption_url in video_element.findall('ClosedCaptioningURIs/URL'): + if caption_url.text: + extract_subtitle(caption_url.text) + + ios_playlist_url = params.get('data-video-playlist') or params.get('data-video-id') + hmac = params.get('data-video-hmac') + if ios_playlist_url and hmac and re.match(r'https?://', ios_playlist_url): + headers = self.geo_verification_headers() + headers.update({ + 'Accept': 'application/vnd.itv.vod.playlist.v2+json', + 'Content-Type': 'application/json', + 'hmac': hmac.upper(), + }) + ios_playlist = self._download_json( + ios_playlist_url, video_id, data=json.dumps({ + 'user': { + 'itvUserId': '', + 'entitlements': [], + 'token': '' + }, + 'device': { + 'manufacturer': 'Safari', + 'model': '5', + 'os': { + 'name': 'Windows NT', + 'version': '6.1', + 'type': 'desktop' + } + }, + 'client': { + 'version': '4.1', + 'id': 'browser' + }, + 'variantAvailability': { + 'featureset': { + 'min': ['hls', 'aes', 'outband-webvtt'], + 'max': ['hls', 'aes', 'outband-webvtt'] + }, + 'platformTag': 'dotcom' + } + }).encode(), headers=headers, fatal=False) + if ios_playlist: + video_data = ios_playlist.get('Playlist', {}).get('Video', {}) + ios_base_url = video_data.get('Base') + for media_file in video_data.get('MediaFiles', []): + href = media_file.get('Href') + if not href: + continue + if ios_base_url: + href = ios_base_url + href + ext = determine_ext(href) + if ext == 'm3u8': + formats.extend(self._extract_m3u8_formats( + href, video_id, 'mp4', entry_protocol='m3u8_native', + m3u8_id='hls', fatal=False)) + else: + formats.append({ + 'url': href, + }) + subs = video_data.get('Subtitles') + if isinstance(subs, list): + for sub in subs: + if not isinstance(sub, dict): + continue + href = url_or_none(sub.get('Href')) + if href: + extract_subtitle(href) + if not info.get('duration'): + info['duration'] = parse_duration(video_data.get('Duration')) + + self._sort_formats(formats) + + info.update({ + 'id': video_id, + 'formats': formats, + 'subtitles': subtitles, + }) + + webpage_info = self._search_json_ld(webpage, video_id, default={}) + if not webpage_info.get('title'): + webpage_info['title'] = self._html_search_regex( + r'(?s)]+\bclass=["\'][^>]*episode-title["\'][^>]*>([^<]+)<', + webpage, 'title', default=None) or self._og_search_title( + webpage, default=None) or self._html_search_meta( + 'twitter:title', webpage, 'title', + default=None) or webpage_info['episode'] + + return merge_dicts(info, webpage_info) + + +class ITVBTCCIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?itv\.com/btcc/(?:[^/]+/)*(?P[^/?#&]+)' + _TEST = { + 'url': 'http://www.itv.com/btcc/races/btcc-2018-all-the-action-from-brands-hatch', + 'info_dict': { + 'id': 'btcc-2018-all-the-action-from-brands-hatch', + 'title': 'BTCC 2018: All the action from Brands Hatch', + }, + 'playlist_mincount': 9, + } + BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/1582188683001/HkiHLnNRx_default/index.html?videoId=%s' + + def _real_extract(self, url): + playlist_id = self._match_id(url) + + webpage = self._download_webpage(url, playlist_id) + + entries = [ + self.url_result( + smuggle_url(self.BRIGHTCOVE_URL_TEMPLATE % video_id, { + # ITV does not like some GB IP ranges, so here are some + # IP blocks it accepts + 'geo_ip_blocks': [ + '193.113.0.0/16', '54.36.162.0/23', '159.65.16.0/21' + ], + 'referrer': url, + }), + ie=BrightcoveNewIE.ie_key(), video_id=video_id) + for video_id in re.findall(r'data-video-id=["\'](\d+)', webpage)] + + title = self._og_search_title(webpage, fatal=False) + + return self.playlist_result(entries, playlist_id, title) diff --git a/yt_dlp/extractor/ivi.py b/youtube_dlc/extractor/ivi.py similarity index 97% rename from yt_dlp/extractor/ivi.py rename to youtube_dlc/extractor/ivi.py index c167ee500..b9cb5a8e6 100644 --- a/yt_dlp/extractor/ivi.py +++ b/youtube_dlc/extractor/ivi.py @@ -142,11 +142,11 @@ class IviIE(InfoExtractor): continue elif bundled: raise ExtractorError( - 'This feature does not work from bundled exe. Run yt-dlp from sources.', + 'This feature does not work from bundled exe. Run youtube-dlc from sources.', expected=True) elif not pycryptodomex_found: raise ExtractorError( - 'pycryptodomex not found. Please install', + 'pycryptodomex not found. Please install it.', expected=True) elif message: extractor_msg += ': ' + message @@ -163,10 +163,7 @@ class IviIE(InfoExtractor): for f in result.get('files', []): f_url = f.get('url') content_format = f.get('content_format') - if not f_url: - continue - if (not self.get_param('allow_unplayable_formats') - and ('-MDRM-' in content_format or '-FPS-' in content_format)): + if not f_url or '-MDRM-' in content_format or '-FPS-' in content_format: continue formats.append({ 'url': f_url, diff --git a/yt_dlp/extractor/ivideon.py b/youtube_dlc/extractor/ivideon.py similarity index 100% rename from yt_dlp/extractor/ivideon.py rename to youtube_dlc/extractor/ivideon.py diff --git a/yt_dlp/extractor/iwara.py b/youtube_dlc/extractor/iwara.py similarity index 100% rename from yt_dlp/extractor/iwara.py rename to youtube_dlc/extractor/iwara.py diff --git a/yt_dlp/extractor/izlesene.py b/youtube_dlc/extractor/izlesene.py similarity index 100% rename from yt_dlp/extractor/izlesene.py rename to youtube_dlc/extractor/izlesene.py diff --git a/yt_dlp/extractor/jamendo.py b/youtube_dlc/extractor/jamendo.py similarity index 79% rename from yt_dlp/extractor/jamendo.py rename to youtube_dlc/extractor/jamendo.py index 1db7c64af..490efa8fb 100644 --- a/yt_dlp/extractor/jamendo.py +++ b/youtube_dlc/extractor/jamendo.py @@ -29,51 +29,34 @@ class JamendoIE(InfoExtractor): 'id': '196219', 'display_id': 'stories-from-emona-i', 'ext': 'flac', - # 'title': 'Maya Filipič - Stories from Emona I', - 'title': 'Stories from Emona I', - # 'artist': 'Maya Filipič', + 'title': 'Maya Filipič - Stories from Emona I', + 'artist': 'Maya Filipič', 'track': 'Stories from Emona I', 'duration': 210, 'thumbnail': r're:^https?://.*\.jpg', 'timestamp': 1217438117, 'upload_date': '20080730', - 'license': 'by-nc-nd', - 'view_count': int, - 'like_count': int, - 'average_rating': int, - 'tags': ['piano', 'peaceful', 'newage', 'strings', 'upbeat'], } }, { 'url': 'https://licensing.jamendo.com/en/track/1496667/energetic-rock', 'only_matching': True, }] - def _call_api(self, resource, resource_id): - path = '/api/%ss' % resource - rand = compat_str(random.random()) - return self._download_json( - 'https://www.jamendo.com' + path, resource_id, query={ - 'id[]': resource_id, - }, headers={ - 'X-Jam-Call': '$%s*%s~' % (hashlib.sha1((path + rand).encode()).hexdigest(), rand) - })[0] - def _real_extract(self, url): track_id, display_id = self._VALID_URL_RE.match(url).groups() - # webpage = self._download_webpage( - # 'https://www.jamendo.com/track/' + track_id, track_id) - # models = self._parse_json(self._html_search_regex( - # r"data-bundled-models='([^']+)", - # webpage, 'bundled models'), track_id) - # track = models['track']['models'][0] - track = self._call_api('track', track_id) + webpage = self._download_webpage( + 'https://www.jamendo.com/track/' + track_id, track_id) + models = self._parse_json(self._html_search_regex( + r"data-bundled-models='([^']+)", + webpage, 'bundled models'), track_id) + track = models['track']['models'][0] title = track_name = track['name'] - # get_model = lambda x: try_get(models, lambda y: y[x]['models'][0], dict) or {} - # artist = get_model('artist') - # artist_name = artist.get('name') - # if artist_name: - # title = '%s - %s' % (artist_name, title) - # album = get_model('album') + get_model = lambda x: try_get(models, lambda y: y[x]['models'][0], dict) or {} + artist = get_model('artist') + artist_name = artist.get('name') + if artist_name: + title = '%s - %s' % (artist_name, title) + album = get_model('album') formats = [{ 'url': 'https://%s.jamendo.com/?trackid=%s&format=%s&from=app-97dab294' @@ -91,7 +74,7 @@ class JamendoIE(InfoExtractor): urls = [] thumbnails = [] - for covers in (track.get('cover') or {}).values(): + for _, covers in track.get('cover', {}).items(): for cover_id, cover_url in covers.items(): if not cover_url or cover_url in urls: continue @@ -105,14 +88,13 @@ class JamendoIE(InfoExtractor): }) tags = [] - for tag in (track.get('tags') or []): + for tag in track.get('tags', []): tag_name = tag.get('name') if not tag_name: continue tags.append(tag_name) stats = track.get('stats') or {} - license = track.get('licenseCC') or [] return { 'id': track_id, @@ -121,11 +103,11 @@ class JamendoIE(InfoExtractor): 'title': title, 'description': track.get('description'), 'duration': int_or_none(track.get('duration')), - # 'artist': artist_name, + 'artist': artist_name, 'track': track_name, - # 'album': album.get('name'), + 'album': album.get('name'), 'formats': formats, - 'license': '-'.join(license) if license else None, + 'license': '-'.join(track.get('licenseCC', [])) or None, 'timestamp': int_or_none(track.get('dateCreated')), 'view_count': int_or_none(stats.get('listenedAll')), 'like_count': int_or_none(stats.get('favorited')), @@ -134,9 +116,9 @@ class JamendoIE(InfoExtractor): } -class JamendoAlbumIE(JamendoIE): +class JamendoAlbumIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?jamendo\.com/album/(?P[0-9]+)' - _TESTS = [{ + _TEST = { 'url': 'https://www.jamendo.com/album/121486/duck-on-cover', 'info_dict': { 'id': '121486', @@ -169,7 +151,17 @@ class JamendoAlbumIE(JamendoIE): 'params': { 'playlistend': 2 } - }] + } + + def _call_api(self, resource, resource_id): + path = '/api/%ss' % resource + rand = compat_str(random.random()) + return self._download_json( + 'https://www.jamendo.com' + path, resource_id, query={ + 'id[]': resource_id, + }, headers={ + 'X-Jam-Call': '$%s*%s~' % (hashlib.sha1((path + rand).encode()).hexdigest(), rand) + })[0] def _real_extract(self, url): album_id = self._match_id(url) @@ -177,7 +169,7 @@ class JamendoAlbumIE(JamendoIE): album_name = album.get('name') entries = [] - for track in (album.get('tracks') or []): + for track in album.get('tracks', []): track_id = track.get('id') if not track_id: continue diff --git a/yt_dlp/extractor/jeuxvideo.py b/youtube_dlc/extractor/jeuxvideo.py similarity index 100% rename from yt_dlp/extractor/jeuxvideo.py rename to youtube_dlc/extractor/jeuxvideo.py diff --git a/yt_dlp/extractor/joj.py b/youtube_dlc/extractor/joj.py similarity index 100% rename from yt_dlp/extractor/joj.py rename to youtube_dlc/extractor/joj.py diff --git a/yt_dlp/extractor/jove.py b/youtube_dlc/extractor/jove.py similarity index 100% rename from yt_dlp/extractor/jove.py rename to youtube_dlc/extractor/jove.py diff --git a/yt_dlp/extractor/jwplatform.py b/youtube_dlc/extractor/jwplatform.py similarity index 78% rename from yt_dlp/extractor/jwplatform.py rename to youtube_dlc/extractor/jwplatform.py index 5aa508bf9..c34b5f5e6 100644 --- a/yt_dlp/extractor/jwplatform.py +++ b/youtube_dlc/extractor/jwplatform.py @@ -32,14 +32,9 @@ class JWPlatformIE(InfoExtractor): @staticmethod def _extract_urls(webpage): - for tag, key in ((r'(?:script|iframe)', 'src'), ('input', 'value')): - # is used by hyland.com - # if we find