commit: 7ce067ccc2811d5e36191b012ce337003a3481f2
parent c0783c3e639313e7a027fb754ff1c44c824d0ee9
Author: Michael Forney <mforney@mforney.org>
Date: Sat, 18 Dec 2021 23:52:11 -0800
Add yt-dlp 2021.12.01
Diffstat:
10 files changed, 1302 insertions(+), 0 deletions(-)
diff --git a/pkg/gen.lua b/pkg/gen.lua
@@ -135,5 +135,6 @@ subgen 'x509cert'
subgen 'xkeyboard-config'
subgen 'xz'
subgen 'youtube-dl'
+subgen 'yt-dlp'
subgen 'zlib'
subgen 'zstd'
diff --git a/pkg/yt-dlp/.gitignore b/pkg/yt-dlp/.gitignore
@@ -0,0 +1,2 @@
+/src
+/yt-dlp.tar.gz
diff --git a/pkg/yt-dlp/gen.lua b/pkg/yt-dlp/gen.lua
@@ -0,0 +1,7 @@
+file('bin/yt-dlp', '755', '$dir/yt-dlp')
+for f in iterlines('pylibs.txt') do
+ file('lib/python3.10/'..f, '644', '$srcdir/'..f)
+end
+man{'yt-dlp.1'}
+
+fetch 'curl'
diff --git a/pkg/yt-dlp/patch/0001-Disable-use-of-ctypes-and-dynamic-loading.patch b/pkg/yt-dlp/patch/0001-Disable-use-of-ctypes-and-dynamic-loading.patch
@@ -0,0 +1,350 @@
+From 52d1ea4b111432f7a8c3e14f06b4fc2431fe6a5b Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Mon, 4 Jul 2016 16:14:18 -0700
+Subject: [PATCH] Disable use of ctypes and dynamic loading
+
+---
+ yt_dlp/compat.py | 8 ---
+ yt_dlp/cookies.py | 69 --------------------
+ yt_dlp/utils.py | 161 +---------------------------------------------
+ 3 files changed, 1 insertion(+), 237 deletions(-)
+
+diff --git a/yt_dlp/compat.py b/yt_dlp/compat.py
+index 79c8e3494..28f3b065b 100644
+--- a/yt_dlp/compat.py
++++ b/yt_dlp/compat.py
+@@ -2,7 +2,6 @@
+
+ import asyncio
+ import base64
+-import ctypes
+ import getpass
+ import html
+ import html.parser
+@@ -34,12 +33,6 @@ class compat_HTMLParseError(Exception):
+ pass
+
+
+-# compat_ctypes_WINFUNCTYPE = ctypes.WINFUNCTYPE
+-# will not work since ctypes.WINFUNCTYPE does not exist in UNIX machines
+-def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
+- return ctypes.WINFUNCTYPE(*args, **kwargs)
+-
+-
+ class _TreeBuilder(etree.TreeBuilder):
+ def doctype(self, name, pubid, system):
+ pass
+@@ -249,7 +242,6 @@ __all__ = [
+ 'compat_cookiejar_Cookie',
+ 'compat_cookies',
+ 'compat_cookies_SimpleCookie',
+- 'compat_ctypes_WINFUNCTYPE',
+ 'compat_etree_Element',
+ 'compat_etree_fromstring',
+ 'compat_etree_register_namespace',
+diff --git a/yt_dlp/cookies.py b/yt_dlp/cookies.py
+index ec68a809d..0ea322074 100644
+--- a/yt_dlp/cookies.py
++++ b/yt_dlp/cookies.py
+@@ -1,4 +1,3 @@
+-import ctypes
+ import json
+ import os
+ import shutil
+@@ -311,8 +310,6 @@ def get_cookie_decryptor(browser_root, browser_keyring_name, logger):
+ return LinuxChromeCookieDecryptor(browser_keyring_name, logger)
+ elif sys.platform == 'darwin':
+ return MacChromeCookieDecryptor(browser_keyring_name, logger)
+- elif sys.platform == 'win32':
+- return WindowsChromeCookieDecryptor(browser_root, logger)
+ else:
+ raise NotImplementedError('Chrome cookie decryption is not supported '
+ 'on this platform: {}'.format(sys.platform))
+@@ -379,40 +376,6 @@ class MacChromeCookieDecryptor(ChromeCookieDecryptor):
+ return encrypted_value
+
+
+-class WindowsChromeCookieDecryptor(ChromeCookieDecryptor):
+- def __init__(self, browser_root, logger):
+- self._logger = logger
+- self._v10_key = _get_windows_v10_key(browser_root, logger)
+-
+- def decrypt(self, encrypted_value):
+- version = encrypted_value[:3]
+- ciphertext = encrypted_value[3:]
+-
+- if version == b'v10':
+- if self._v10_key is None:
+- self._logger.warning('cannot decrypt v10 cookies: no key found', only_once=True)
+- return None
+-
+- # https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/os_crypt_win.cc
+- # kNonceLength
+- nonce_length = 96 // 8
+- # boringssl
+- # EVP_AEAD_AES_GCM_TAG_LEN
+- authentication_tag_length = 16
+-
+- raw_ciphertext = ciphertext
+- nonce = raw_ciphertext[:nonce_length]
+- ciphertext = raw_ciphertext[nonce_length:-authentication_tag_length]
+- authentication_tag = raw_ciphertext[-authentication_tag_length:]
+-
+- return _decrypt_aes_gcm(ciphertext, self._v10_key, nonce, authentication_tag, self._logger)
+-
+- else:
+- # any other prefix means the data is DPAPI encrypted
+- # https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/os_crypt_win.cc
+- return _decrypt_windows_dpapi(encrypted_value, self._logger).decode('utf-8')
+-
+-
+ def _extract_safari_cookies(profile, logger):
+ if profile is not None:
+ logger.error('safari does not support profiles')
+@@ -663,38 +626,6 @@ def _decrypt_aes_gcm(ciphertext, key, nonce, authentication_tag, logger):
+ return None
+
+
+-def _decrypt_windows_dpapi(ciphertext, logger):
+- """
+- References:
+- - https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata
+- """
+- from ctypes.wintypes import DWORD
+-
+- class DATA_BLOB(ctypes.Structure):
+- _fields_ = [('cbData', DWORD),
+- ('pbData', ctypes.POINTER(ctypes.c_char))]
+-
+- buffer = ctypes.create_string_buffer(ciphertext)
+- blob_in = DATA_BLOB(ctypes.sizeof(buffer), buffer)
+- blob_out = DATA_BLOB()
+- ret = ctypes.windll.crypt32.CryptUnprotectData(
+- ctypes.byref(blob_in), # pDataIn
+- None, # ppszDataDescr: human readable description of pDataIn
+- None, # pOptionalEntropy: salt?
+- None, # pvReserved: must be NULL
+- None, # pPromptStruct: information about prompts to display
+- 0, # dwFlags
+- ctypes.byref(blob_out) # pDataOut
+- )
+- if not ret:
+- logger.warning('failed to decrypt with DPAPI', only_once=True)
+- return None
+-
+- result = ctypes.string_at(blob_out.pbData, blob_out.cbData)
+- ctypes.windll.kernel32.LocalFree(blob_out.pbData)
+- return result
+-
+-
+ def _config_home():
+ return os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config'))
+
+diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py
+index 81c95f3e9..34b2eab51 100644
+--- a/yt_dlp/utils.py
++++ b/yt_dlp/utils.py
+@@ -9,7 +9,6 @@ import calendar
+ import codecs
+ import collections
+ import contextlib
+-import ctypes
+ import datetime
+ import email.utils
+ import email.header
+@@ -47,7 +46,6 @@ from .compat import (
+ compat_basestring,
+ compat_chr,
+ compat_cookiejar,
+- compat_ctypes_WINFUNCTYPE,
+ compat_etree_fromstring,
+ compat_expanduser,
+ compat_html_entities,
+@@ -1857,90 +1855,11 @@ def get_windows_version():
+ return None
+
+
+-def _windows_write_string(s, out):
+- """ Returns True if the string was written using special methods,
+- False if it has yet to be written out."""
+- # Adapted from http://stackoverflow.com/a/3259271/35070
+-
+- import ctypes
+- import ctypes.wintypes
+-
+- WIN_OUTPUT_IDS = {
+- 1: -11,
+- 2: -12,
+- }
+-
+- try:
+- fileno = out.fileno()
+- except AttributeError:
+- # If the output stream doesn't have a fileno, it's virtual
+- return False
+- except io.UnsupportedOperation:
+- # Some strange Windows pseudo files?
+- return False
+- if fileno not in WIN_OUTPUT_IDS:
+- return False
+-
+- GetStdHandle = compat_ctypes_WINFUNCTYPE(
+- ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD)(
+- ('GetStdHandle', ctypes.windll.kernel32))
+- h = GetStdHandle(WIN_OUTPUT_IDS[fileno])
+-
+- WriteConsoleW = compat_ctypes_WINFUNCTYPE(
+- ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR,
+- ctypes.wintypes.DWORD, ctypes.POINTER(ctypes.wintypes.DWORD),
+- ctypes.wintypes.LPVOID)(('WriteConsoleW', ctypes.windll.kernel32))
+- written = ctypes.wintypes.DWORD(0)
+-
+- GetFileType = compat_ctypes_WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)(('GetFileType', ctypes.windll.kernel32))
+- FILE_TYPE_CHAR = 0x0002
+- FILE_TYPE_REMOTE = 0x8000
+- GetConsoleMode = compat_ctypes_WINFUNCTYPE(
+- ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE,
+- ctypes.POINTER(ctypes.wintypes.DWORD))(
+- ('GetConsoleMode', ctypes.windll.kernel32))
+- INVALID_HANDLE_VALUE = ctypes.wintypes.DWORD(-1).value
+-
+- def not_a_console(handle):
+- if handle == INVALID_HANDLE_VALUE or handle is None:
+- return True
+- return ((GetFileType(handle) & ~FILE_TYPE_REMOTE) != FILE_TYPE_CHAR
+- or GetConsoleMode(handle, ctypes.byref(ctypes.wintypes.DWORD())) == 0)
+-
+- if not_a_console(h):
+- return False
+-
+- def next_nonbmp_pos(s):
+- try:
+- return next(i for i, c in enumerate(s) if ord(c) > 0xffff)
+- except StopIteration:
+- return len(s)
+-
+- while s:
+- count = min(next_nonbmp_pos(s), 1024)
+-
+- ret = WriteConsoleW(
+- h, s, count if count else 2, ctypes.byref(written), None)
+- if ret == 0:
+- raise OSError('Failed to write string')
+- if not count: # We just wrote a non-BMP character
+- assert written.value == 2
+- s = s[1:]
+- else:
+- assert written.value > 0
+- s = s[written.value:]
+- return True
+-
+-
+ def write_string(s, out=None, encoding=None):
+ if out is None:
+ out = sys.stderr
+ assert type(s) == compat_str
+
+- if sys.platform == 'win32' and encoding is None and hasattr(out, 'fileno'):
+- if _windows_write_string(s, out):
+- return
+-
+ if ('b' in getattr(out, 'mode', '')
+ or sys.version_info[0] < 3): # Python 2 lies about mode of sys.stderr
+ byt = s.encode(encoding or preferredencoding(), 'ignore')
+@@ -1969,62 +1888,6 @@ def intlist_to_bytes(xs):
+ return compat_struct_pack('%dB' % len(xs), *xs)
+
+
+-# Cross-platform file locking
+-if sys.platform == 'win32':
+- import ctypes.wintypes
+- import msvcrt
+-
+- class OVERLAPPED(ctypes.Structure):
+- _fields_ = [
+- ('Internal', ctypes.wintypes.LPVOID),
+- ('InternalHigh', ctypes.wintypes.LPVOID),
+- ('Offset', ctypes.wintypes.DWORD),
+- ('OffsetHigh', ctypes.wintypes.DWORD),
+- ('hEvent', ctypes.wintypes.HANDLE),
+- ]
+-
+- kernel32 = ctypes.windll.kernel32
+- LockFileEx = kernel32.LockFileEx
+- LockFileEx.argtypes = [
+- ctypes.wintypes.HANDLE, # hFile
+- ctypes.wintypes.DWORD, # dwFlags
+- ctypes.wintypes.DWORD, # dwReserved
+- ctypes.wintypes.DWORD, # nNumberOfBytesToLockLow
+- ctypes.wintypes.DWORD, # nNumberOfBytesToLockHigh
+- ctypes.POINTER(OVERLAPPED) # Overlapped
+- ]
+- LockFileEx.restype = ctypes.wintypes.BOOL
+- UnlockFileEx = kernel32.UnlockFileEx
+- UnlockFileEx.argtypes = [
+- ctypes.wintypes.HANDLE, # hFile
+- ctypes.wintypes.DWORD, # dwReserved
+- ctypes.wintypes.DWORD, # nNumberOfBytesToLockLow
+- ctypes.wintypes.DWORD, # nNumberOfBytesToLockHigh
+- ctypes.POINTER(OVERLAPPED) # Overlapped
+- ]
+- UnlockFileEx.restype = ctypes.wintypes.BOOL
+- whole_low = 0xffffffff
+- whole_high = 0x7fffffff
+-
+- def _lock_file(f, exclusive):
+- overlapped = OVERLAPPED()
+- overlapped.Offset = 0
+- overlapped.OffsetHigh = 0
+- overlapped.hEvent = 0
+- f._lock_file_overlapped_p = ctypes.pointer(overlapped)
+- handle = msvcrt.get_osfhandle(f.fileno())
+- if not LockFileEx(handle, 0x2 if exclusive else 0x0, 0,
+- whole_low, whole_high, f._lock_file_overlapped_p):
+- raise OSError('Locking file failed: %r' % ctypes.FormatError())
+-
+- def _unlock_file(f):
+- assert f._lock_file_overlapped_p
+- handle = msvcrt.get_osfhandle(f.fileno())
+- if not UnlockFileEx(handle, 0,
+- whole_low, whole_high, f._lock_file_overlapped_p):
+- raise OSError('Unlocking file failed: %r' % ctypes.FormatError())
+-
+-else:
+ # Some platforms, such as Jython, is missing fcntl
+ try:
+ import fcntl
+@@ -2287,29 +2150,7 @@ def fix_xml_ampersands(xml_str):
+
+
+ def setproctitle(title):
+- assert isinstance(title, compat_str)
+-
+- # ctypes in Jython is not complete
+- # http://bugs.jython.org/issue2148
+- if sys.platform.startswith('java'):
+- return
+-
+- try:
+- libc = ctypes.cdll.LoadLibrary('libc.so.6')
+- except OSError:
+- return
+- except TypeError:
+- # LoadLibrary in Windows Python 2.7.13 only expects
+- # a bytestring, but since unicode_literals turns
+- # every string into a unicode string, it fails.
+- return
+- title_bytes = title.encode('utf-8')
+- buf = ctypes.create_string_buffer(len(title_bytes))
+- buf.value = title_bytes
+- try:
+- libc.prctl(15, buf, 0, 0, 0)
+- except AttributeError:
+- return # Strange libc, just skip this
++ return
+
+
+ def remove_start(s, start):
+--
+2.34.0
+
diff --git a/pkg/yt-dlp/pylibs.txt b/pkg/yt-dlp/pylibs.txt
@@ -0,0 +1,932 @@
+# 2,<cd src && find yt_dlp -type f -name '*.py' | LC_COLLATE=C sort
+yt_dlp/YoutubeDL.py
+yt_dlp/__init__.py
+yt_dlp/__main__.py
+yt_dlp/aes.py
+yt_dlp/cache.py
+yt_dlp/compat.py
+yt_dlp/cookies.py
+yt_dlp/downloader/__init__.py
+yt_dlp/downloader/common.py
+yt_dlp/downloader/dash.py
+yt_dlp/downloader/external.py
+yt_dlp/downloader/f4m.py
+yt_dlp/downloader/fragment.py
+yt_dlp/downloader/hls.py
+yt_dlp/downloader/http.py
+yt_dlp/downloader/ism.py
+yt_dlp/downloader/mhtml.py
+yt_dlp/downloader/niconico.py
+yt_dlp/downloader/rtmp.py
+yt_dlp/downloader/rtsp.py
+yt_dlp/downloader/websocket.py
+yt_dlp/downloader/youtube_live_chat.py
+yt_dlp/extractor/__init__.py
+yt_dlp/extractor/abc.py
+yt_dlp/extractor/abcnews.py
+yt_dlp/extractor/abcotvs.py
+yt_dlp/extractor/academicearth.py
+yt_dlp/extractor/acast.py
+yt_dlp/extractor/adn.py
+yt_dlp/extractor/adobeconnect.py
+yt_dlp/extractor/adobepass.py
+yt_dlp/extractor/adobetv.py
+yt_dlp/extractor/adultswim.py
+yt_dlp/extractor/aenetworks.py
+yt_dlp/extractor/afreecatv.py
+yt_dlp/extractor/airmozilla.py
+yt_dlp/extractor/aliexpress.py
+yt_dlp/extractor/aljazeera.py
+yt_dlp/extractor/allocine.py
+yt_dlp/extractor/alphaporno.py
+yt_dlp/extractor/alura.py
+yt_dlp/extractor/amara.py
+yt_dlp/extractor/amazon.py
+yt_dlp/extractor/amcnetworks.py
+yt_dlp/extractor/americastestkitchen.py
+yt_dlp/extractor/amp.py
+yt_dlp/extractor/animelab.py
+yt_dlp/extractor/animeondemand.py
+yt_dlp/extractor/anvato.py
+yt_dlp/extractor/anvato_token_generator/__init__.py
+yt_dlp/extractor/anvato_token_generator/common.py
+yt_dlp/extractor/anvato_token_generator/nfl.py
+yt_dlp/extractor/aol.py
+yt_dlp/extractor/apa.py
+yt_dlp/extractor/aparat.py
+yt_dlp/extractor/appleconnect.py
+yt_dlp/extractor/applepodcasts.py
+yt_dlp/extractor/appletrailers.py
+yt_dlp/extractor/archiveorg.py
+yt_dlp/extractor/arcpublishing.py
+yt_dlp/extractor/ard.py
+yt_dlp/extractor/arkena.py
+yt_dlp/extractor/arnes.py
+yt_dlp/extractor/arte.py
+yt_dlp/extractor/asiancrush.py
+yt_dlp/extractor/atresplayer.py
+yt_dlp/extractor/atttechchannel.py
+yt_dlp/extractor/atvat.py
+yt_dlp/extractor/audimedia.py
+yt_dlp/extractor/audioboom.py
+yt_dlp/extractor/audiomack.py
+yt_dlp/extractor/audius.py
+yt_dlp/extractor/awaan.py
+yt_dlp/extractor/aws.py
+yt_dlp/extractor/azmedien.py
+yt_dlp/extractor/baidu.py
+yt_dlp/extractor/bandaichannel.py
+yt_dlp/extractor/bandcamp.py
+yt_dlp/extractor/bannedvideo.py
+yt_dlp/extractor/bbc.py
+yt_dlp/extractor/beatport.py
+yt_dlp/extractor/beeg.py
+yt_dlp/extractor/behindkink.py
+yt_dlp/extractor/bellmedia.py
+yt_dlp/extractor/bet.py
+yt_dlp/extractor/bfi.py
+yt_dlp/extractor/bfmtv.py
+yt_dlp/extractor/bibeltv.py
+yt_dlp/extractor/bigflix.py
+yt_dlp/extractor/bild.py
+yt_dlp/extractor/bilibili.py
+yt_dlp/extractor/biobiochiletv.py
+yt_dlp/extractor/biqle.py
+yt_dlp/extractor/bitchute.py
+yt_dlp/extractor/bitwave.py
+yt_dlp/extractor/blackboardcollaborate.py
+yt_dlp/extractor/bleacherreport.py
+yt_dlp/extractor/blinkx.py
+yt_dlp/extractor/blogger.py
+yt_dlp/extractor/bloomberg.py
+yt_dlp/extractor/bokecc.py
+yt_dlp/extractor/bongacams.py
+yt_dlp/extractor/bostonglobe.py
+yt_dlp/extractor/box.py
+yt_dlp/extractor/bpb.py
+yt_dlp/extractor/br.py
+yt_dlp/extractor/bravotv.py
+yt_dlp/extractor/breakcom.py
+yt_dlp/extractor/breitbart.py
+yt_dlp/extractor/brightcove.py
+yt_dlp/extractor/businessinsider.py
+yt_dlp/extractor/buzzfeed.py
+yt_dlp/extractor/byutv.py
+yt_dlp/extractor/c56.py
+yt_dlp/extractor/cableav.py
+yt_dlp/extractor/cam4.py
+yt_dlp/extractor/camdemy.py
+yt_dlp/extractor/cammodels.py
+yt_dlp/extractor/camwithher.py
+yt_dlp/extractor/canalalpha.py
+yt_dlp/extractor/canalc2.py
+yt_dlp/extractor/canalplus.py
+yt_dlp/extractor/canvas.py
+yt_dlp/extractor/carambatv.py
+yt_dlp/extractor/cartoonnetwork.py
+yt_dlp/extractor/cbc.py
+yt_dlp/extractor/cbs.py
+yt_dlp/extractor/cbsinteractive.py
+yt_dlp/extractor/cbslocal.py
+yt_dlp/extractor/cbsnews.py
+yt_dlp/extractor/cbssports.py
+yt_dlp/extractor/ccc.py
+yt_dlp/extractor/ccma.py
+yt_dlp/extractor/cctv.py
+yt_dlp/extractor/cda.py
+yt_dlp/extractor/ceskatelevize.py
+yt_dlp/extractor/cgtn.py
+yt_dlp/extractor/channel9.py
+yt_dlp/extractor/charlierose.py
+yt_dlp/extractor/chaturbate.py
+yt_dlp/extractor/chilloutzone.py
+yt_dlp/extractor/chingari.py
+yt_dlp/extractor/chirbit.py
+yt_dlp/extractor/cinchcast.py
+yt_dlp/extractor/cinemax.py
+yt_dlp/extractor/ciscolive.py
+yt_dlp/extractor/ciscowebex.py
+yt_dlp/extractor/cjsw.py
+yt_dlp/extractor/cliphunter.py
+yt_dlp/extractor/clippit.py
+yt_dlp/extractor/cliprs.py
+yt_dlp/extractor/clipsyndicate.py
+yt_dlp/extractor/closertotruth.py
+yt_dlp/extractor/cloudflarestream.py
+yt_dlp/extractor/cloudy.py
+yt_dlp/extractor/clubic.py
+yt_dlp/extractor/clyp.py
+yt_dlp/extractor/cmt.py
+yt_dlp/extractor/cnbc.py
+yt_dlp/extractor/cnn.py
+yt_dlp/extractor/comedycentral.py
+yt_dlp/extractor/common.py
+yt_dlp/extractor/commonmistakes.py
+yt_dlp/extractor/commonprotocols.py
+yt_dlp/extractor/condenast.py
+yt_dlp/extractor/contv.py
+yt_dlp/extractor/corus.py
+yt_dlp/extractor/coub.py
+yt_dlp/extractor/cozytv.py
+yt_dlp/extractor/cracked.py
+yt_dlp/extractor/crackle.py
+yt_dlp/extractor/crooksandliars.py
+yt_dlp/extractor/crunchyroll.py
+yt_dlp/extractor/cspan.py
+yt_dlp/extractor/ctsnews.py
+yt_dlp/extractor/ctv.py
+yt_dlp/extractor/ctvnews.py
+yt_dlp/extractor/cultureunplugged.py
+yt_dlp/extractor/curiositystream.py
+yt_dlp/extractor/cwtv.py
+yt_dlp/extractor/dailymail.py
+yt_dlp/extractor/dailymotion.py
+yt_dlp/extractor/damtomo.py
+yt_dlp/extractor/daum.py
+yt_dlp/extractor/dbtv.py
+yt_dlp/extractor/dctp.py
+yt_dlp/extractor/deezer.py
+yt_dlp/extractor/defense.py
+yt_dlp/extractor/democracynow.py
+yt_dlp/extractor/dfb.py
+yt_dlp/extractor/dhm.py
+yt_dlp/extractor/digg.py
+yt_dlp/extractor/digiteka.py
+yt_dlp/extractor/discovery.py
+yt_dlp/extractor/discoverygo.py
+yt_dlp/extractor/discoveryvr.py
+yt_dlp/extractor/disney.py
+yt_dlp/extractor/dispeak.py
+yt_dlp/extractor/dlive.py
+yt_dlp/extractor/doodstream.py
+yt_dlp/extractor/dotsub.py
+yt_dlp/extractor/douyutv.py
+yt_dlp/extractor/dplay.py
+yt_dlp/extractor/drbonanza.py
+yt_dlp/extractor/dreisat.py
+yt_dlp/extractor/dropbox.py
+yt_dlp/extractor/drtuber.py
+yt_dlp/extractor/drtv.py
+yt_dlp/extractor/dtube.py
+yt_dlp/extractor/duboku.py
+yt_dlp/extractor/dumpert.py
+yt_dlp/extractor/dvtv.py
+yt_dlp/extractor/dw.py
+yt_dlp/extractor/eagleplatform.py
+yt_dlp/extractor/ebaumsworld.py
+yt_dlp/extractor/echomsk.py
+yt_dlp/extractor/egghead.py
+yt_dlp/extractor/ehow.py
+yt_dlp/extractor/eighttracks.py
+yt_dlp/extractor/einthusan.py
+yt_dlp/extractor/eitb.py
+yt_dlp/extractor/ellentube.py
+yt_dlp/extractor/elonet.py
+yt_dlp/extractor/elpais.py
+yt_dlp/extractor/embedly.py
+yt_dlp/extractor/engadget.py
+yt_dlp/extractor/epicon.py
+yt_dlp/extractor/eporner.py
+yt_dlp/extractor/eroprofile.py
+yt_dlp/extractor/escapist.py
+yt_dlp/extractor/espn.py
+yt_dlp/extractor/esri.py
+yt_dlp/extractor/europa.py
+yt_dlp/extractor/euscreen.py
+yt_dlp/extractor/everyonesmixtape.py
+yt_dlp/extractor/expotv.py
+yt_dlp/extractor/expressen.py
+yt_dlp/extractor/extractors.py
+yt_dlp/extractor/extremetube.py
+yt_dlp/extractor/eyedotv.py
+yt_dlp/extractor/facebook.py
+yt_dlp/extractor/fancode.py
+yt_dlp/extractor/faz.py
+yt_dlp/extractor/fc2.py
+yt_dlp/extractor/fczenit.py
+yt_dlp/extractor/filmmodu.py
+yt_dlp/extractor/filmon.py
+yt_dlp/extractor/filmweb.py
+yt_dlp/extractor/firsttv.py
+yt_dlp/extractor/fivemin.py
+yt_dlp/extractor/fivetv.py
+yt_dlp/extractor/flickr.py
+yt_dlp/extractor/folketinget.py
+yt_dlp/extractor/footyroom.py
+yt_dlp/extractor/formula1.py
+yt_dlp/extractor/fourtube.py
+yt_dlp/extractor/fox.py
+yt_dlp/extractor/fox9.py
+yt_dlp/extractor/foxgay.py
+yt_dlp/extractor/foxnews.py
+yt_dlp/extractor/foxsports.py
+yt_dlp/extractor/franceculture.py
+yt_dlp/extractor/franceinter.py
+yt_dlp/extractor/francetv.py
+yt_dlp/extractor/freesound.py
+yt_dlp/extractor/freespeech.py
+yt_dlp/extractor/freshlive.py
+yt_dlp/extractor/frontendmasters.py
+yt_dlp/extractor/fujitv.py
+yt_dlp/extractor/funimation.py
+yt_dlp/extractor/funk.py
+yt_dlp/extractor/fusion.py
+yt_dlp/extractor/fxnetworks.py
+yt_dlp/extractor/gab.py
+yt_dlp/extractor/gaia.py
+yt_dlp/extractor/gameinformer.py
+yt_dlp/extractor/gamespot.py
+yt_dlp/extractor/gamestar.py
+yt_dlp/extractor/gaskrank.py
+yt_dlp/extractor/gazeta.py
+yt_dlp/extractor/gdcvault.py
+yt_dlp/extractor/gedidigital.py
+yt_dlp/extractor/generic.py
+yt_dlp/extractor/gettr.py
+yt_dlp/extractor/gfycat.py
+yt_dlp/extractor/giantbomb.py
+yt_dlp/extractor/giga.py
+yt_dlp/extractor/gigya.py
+yt_dlp/extractor/glide.py
+yt_dlp/extractor/globo.py
+yt_dlp/extractor/go.py
+yt_dlp/extractor/godtube.py
+yt_dlp/extractor/golem.py
+yt_dlp/extractor/googledrive.py
+yt_dlp/extractor/googlepodcasts.py
+yt_dlp/extractor/googlesearch.py
+yt_dlp/extractor/gopro.py
+yt_dlp/extractor/goshgay.py
+yt_dlp/extractor/gotostage.py
+yt_dlp/extractor/gputechconf.py
+yt_dlp/extractor/gronkh.py
+yt_dlp/extractor/groupon.py
+yt_dlp/extractor/hbo.py
+yt_dlp/extractor/hearthisat.py
+yt_dlp/extractor/heise.py
+yt_dlp/extractor/hellporno.py
+yt_dlp/extractor/helsinki.py
+yt_dlp/extractor/hentaistigma.py
+yt_dlp/extractor/hgtv.py
+yt_dlp/extractor/hidive.py
+yt_dlp/extractor/historicfilms.py
+yt_dlp/extractor/hitbox.py
+yt_dlp/extractor/hitrecord.py
+yt_dlp/extractor/hketv.py
+yt_dlp/extractor/hornbunny.py
+yt_dlp/extractor/hotnewhiphop.py
+yt_dlp/extractor/hotstar.py
+yt_dlp/extractor/howcast.py
+yt_dlp/extractor/howstuffworks.py
+yt_dlp/extractor/hrfensehen.py
+yt_dlp/extractor/hrti.py
+yt_dlp/extractor/huajiao.py
+yt_dlp/extractor/huffpost.py
+yt_dlp/extractor/hungama.py
+yt_dlp/extractor/hypem.py
+yt_dlp/extractor/ichinanalive.py
+yt_dlp/extractor/ign.py
+yt_dlp/extractor/iheart.py
+yt_dlp/extractor/imdb.py
+yt_dlp/extractor/imggaming.py
+yt_dlp/extractor/imgur.py
+yt_dlp/extractor/ina.py
+yt_dlp/extractor/inc.py
+yt_dlp/extractor/indavideo.py
+yt_dlp/extractor/infoq.py
+yt_dlp/extractor/instagram.py
+yt_dlp/extractor/internazionale.py
+yt_dlp/extractor/internetvideoarchive.py
+yt_dlp/extractor/iprima.py
+yt_dlp/extractor/iqiyi.py
+yt_dlp/extractor/ir90tv.py
+yt_dlp/extractor/itv.py
+yt_dlp/extractor/ivi.py
+yt_dlp/extractor/ivideon.py
+yt_dlp/extractor/iwara.py
+yt_dlp/extractor/izlesene.py
+yt_dlp/extractor/jamendo.py
+yt_dlp/extractor/jeuxvideo.py
+yt_dlp/extractor/joj.py
+yt_dlp/extractor/jove.py
+yt_dlp/extractor/jwplatform.py
+yt_dlp/extractor/kakao.py
+yt_dlp/extractor/kaltura.py
+yt_dlp/extractor/kanalplay.py
+yt_dlp/extractor/kankan.py
+yt_dlp/extractor/karaoketv.py
+yt_dlp/extractor/karrierevideos.py
+yt_dlp/extractor/keezmovies.py
+yt_dlp/extractor/ketnet.py
+yt_dlp/extractor/khanacademy.py
+yt_dlp/extractor/kickstarter.py
+yt_dlp/extractor/kinja.py
+yt_dlp/extractor/kinopoisk.py
+yt_dlp/extractor/konserthusetplay.py
+yt_dlp/extractor/koo.py
+yt_dlp/extractor/krasview.py
+yt_dlp/extractor/ku6.py
+yt_dlp/extractor/kusi.py
+yt_dlp/extractor/kuwo.py
+yt_dlp/extractor/la7.py
+yt_dlp/extractor/laola1tv.py
+yt_dlp/extractor/lazy_extractors.py
+yt_dlp/extractor/lbry.py
+yt_dlp/extractor/lci.py
+yt_dlp/extractor/lcp.py
+yt_dlp/extractor/lecture2go.py
+yt_dlp/extractor/lecturio.py
+yt_dlp/extractor/leeco.py
+yt_dlp/extractor/lego.py
+yt_dlp/extractor/lemonde.py
+yt_dlp/extractor/lenta.py
+yt_dlp/extractor/libraryofcongress.py
+yt_dlp/extractor/libsyn.py
+yt_dlp/extractor/lifenews.py
+yt_dlp/extractor/limelight.py
+yt_dlp/extractor/line.py
+yt_dlp/extractor/linkedin.py
+yt_dlp/extractor/linuxacademy.py
+yt_dlp/extractor/litv.py
+yt_dlp/extractor/livejournal.py
+yt_dlp/extractor/livestream.py
+yt_dlp/extractor/lnkgo.py
+yt_dlp/extractor/localnews8.py
+yt_dlp/extractor/lovehomeporn.py
+yt_dlp/extractor/lrt.py
+yt_dlp/extractor/lynda.py
+yt_dlp/extractor/m6.py
+yt_dlp/extractor/magentamusik360.py
+yt_dlp/extractor/mailru.py
+yt_dlp/extractor/malltv.py
+yt_dlp/extractor/mangomolo.py
+yt_dlp/extractor/manoto.py
+yt_dlp/extractor/manyvids.py
+yt_dlp/extractor/maoritv.py
+yt_dlp/extractor/markiza.py
+yt_dlp/extractor/massengeschmacktv.py
+yt_dlp/extractor/matchtv.py
+yt_dlp/extractor/mdr.py
+yt_dlp/extractor/medaltv.py
+yt_dlp/extractor/mediaite.py
+yt_dlp/extractor/mediaklikk.py
+yt_dlp/extractor/medialaan.py
+yt_dlp/extractor/mediaset.py
+yt_dlp/extractor/mediasite.py
+yt_dlp/extractor/medici.py
+yt_dlp/extractor/megaphone.py
+yt_dlp/extractor/meipai.py
+yt_dlp/extractor/melonvod.py
+yt_dlp/extractor/meta.py
+yt_dlp/extractor/metacafe.py
+yt_dlp/extractor/metacritic.py
+yt_dlp/extractor/mgoon.py
+yt_dlp/extractor/mgtv.py
+yt_dlp/extractor/miaopai.py
+yt_dlp/extractor/microsoftstream.py
+yt_dlp/extractor/microsoftvirtualacademy.py
+yt_dlp/extractor/mildom.py
+yt_dlp/extractor/minds.py
+yt_dlp/extractor/ministrygrid.py
+yt_dlp/extractor/minoto.py
+yt_dlp/extractor/miomio.py
+yt_dlp/extractor/mirrativ.py
+yt_dlp/extractor/mit.py
+yt_dlp/extractor/mitele.py
+yt_dlp/extractor/mixch.py
+yt_dlp/extractor/mixcloud.py
+yt_dlp/extractor/mlb.py
+yt_dlp/extractor/mlssoccer.py
+yt_dlp/extractor/mnet.py
+yt_dlp/extractor/moevideo.py
+yt_dlp/extractor/mofosex.py
+yt_dlp/extractor/mojvideo.py
+yt_dlp/extractor/morningstar.py
+yt_dlp/extractor/motherless.py
+yt_dlp/extractor/motorsport.py
+yt_dlp/extractor/movieclips.py
+yt_dlp/extractor/moviezine.py
+yt_dlp/extractor/movingimage.py
+yt_dlp/extractor/msn.py
+yt_dlp/extractor/mtv.py
+yt_dlp/extractor/muenchentv.py
+yt_dlp/extractor/musescore.py
+yt_dlp/extractor/mwave.py
+yt_dlp/extractor/mxplayer.py
+yt_dlp/extractor/mychannels.py
+yt_dlp/extractor/myspace.py
+yt_dlp/extractor/myspass.py
+yt_dlp/extractor/myvi.py
+yt_dlp/extractor/myvideoge.py
+yt_dlp/extractor/myvidster.py
+yt_dlp/extractor/n1.py
+yt_dlp/extractor/nationalgeographic.py
+yt_dlp/extractor/naver.py
+yt_dlp/extractor/nba.py
+yt_dlp/extractor/nbc.py
+yt_dlp/extractor/ndr.py
+yt_dlp/extractor/ndtv.py
+yt_dlp/extractor/nebula.py
+yt_dlp/extractor/nerdcubed.py
+yt_dlp/extractor/neteasemusic.py
+yt_dlp/extractor/netzkino.py
+yt_dlp/extractor/newgrounds.py
+yt_dlp/extractor/newstube.py
+yt_dlp/extractor/nextmedia.py
+yt_dlp/extractor/nexx.py
+yt_dlp/extractor/nfhsnetwork.py
+yt_dlp/extractor/nfl.py
+yt_dlp/extractor/nhk.py
+yt_dlp/extractor/nhl.py
+yt_dlp/extractor/nick.py
+yt_dlp/extractor/niconico.py
+yt_dlp/extractor/ninecninemedia.py
+yt_dlp/extractor/ninegag.py
+yt_dlp/extractor/ninenow.py
+yt_dlp/extractor/nintendo.py
+yt_dlp/extractor/nitter.py
+yt_dlp/extractor/njpwworld.py
+yt_dlp/extractor/nobelprize.py
+yt_dlp/extractor/noco.py
+yt_dlp/extractor/nonktube.py
+yt_dlp/extractor/noovo.py
+yt_dlp/extractor/normalboots.py
+yt_dlp/extractor/nosvideo.py
+yt_dlp/extractor/nova.py
+yt_dlp/extractor/novaplay.py
+yt_dlp/extractor/nowness.py
+yt_dlp/extractor/noz.py
+yt_dlp/extractor/npo.py
+yt_dlp/extractor/npr.py
+yt_dlp/extractor/nrk.py
+yt_dlp/extractor/nrl.py
+yt_dlp/extractor/ntvcojp.py
+yt_dlp/extractor/ntvde.py
+yt_dlp/extractor/ntvru.py
+yt_dlp/extractor/nuevo.py
+yt_dlp/extractor/nuvid.py
+yt_dlp/extractor/nytimes.py
+yt_dlp/extractor/nzherald.py
+yt_dlp/extractor/nzz.py
+yt_dlp/extractor/odatv.py
+yt_dlp/extractor/odnoklassniki.py
+yt_dlp/extractor/oktoberfesttv.py
+yt_dlp/extractor/olympics.py
+yt_dlp/extractor/on24.py
+yt_dlp/extractor/once.py
+yt_dlp/extractor/ondemandkorea.py
+yt_dlp/extractor/onefootball.py
+yt_dlp/extractor/onet.py
+yt_dlp/extractor/onionstudios.py
+yt_dlp/extractor/ooyala.py
+yt_dlp/extractor/openload.py
+yt_dlp/extractor/openrec.py
+yt_dlp/extractor/ora.py
+yt_dlp/extractor/orf.py
+yt_dlp/extractor/outsidetv.py
+yt_dlp/extractor/packtpub.py
+yt_dlp/extractor/palcomp3.py
+yt_dlp/extractor/pandoratv.py
+yt_dlp/extractor/paramountplus.py
+yt_dlp/extractor/parliamentliveuk.py
+yt_dlp/extractor/parlview.py
+yt_dlp/extractor/patreon.py
+yt_dlp/extractor/pbs.py
+yt_dlp/extractor/pearvideo.py
+yt_dlp/extractor/peertube.py
+yt_dlp/extractor/peertv.py
+yt_dlp/extractor/peloton.py
+yt_dlp/extractor/people.py
+yt_dlp/extractor/performgroup.py
+yt_dlp/extractor/periscope.py
+yt_dlp/extractor/philharmoniedeparis.py
+yt_dlp/extractor/phoenix.py
+yt_dlp/extractor/photobucket.py
+yt_dlp/extractor/picarto.py
+yt_dlp/extractor/piksel.py
+yt_dlp/extractor/pinkbike.py
+yt_dlp/extractor/pinterest.py
+yt_dlp/extractor/pladform.py
+yt_dlp/extractor/planetmarathi.py
+yt_dlp/extractor/platzi.py
+yt_dlp/extractor/playfm.py
+yt_dlp/extractor/playplustv.py
+yt_dlp/extractor/plays.py
+yt_dlp/extractor/playstuff.py
+yt_dlp/extractor/playtvak.py
+yt_dlp/extractor/playvid.py
+yt_dlp/extractor/playwire.py
+yt_dlp/extractor/pluralsight.py
+yt_dlp/extractor/plutotv.py
+yt_dlp/extractor/podomatic.py
+yt_dlp/extractor/pokemon.py
+yt_dlp/extractor/polsatgo.py
+yt_dlp/extractor/polskieradio.py
+yt_dlp/extractor/popcorntimes.py
+yt_dlp/extractor/popcorntv.py
+yt_dlp/extractor/porn91.py
+yt_dlp/extractor/porncom.py
+yt_dlp/extractor/pornflip.py
+yt_dlp/extractor/pornhd.py
+yt_dlp/extractor/pornhub.py
+yt_dlp/extractor/pornotube.py
+yt_dlp/extractor/pornovoisines.py
+yt_dlp/extractor/pornoxo.py
+yt_dlp/extractor/presstv.py
+yt_dlp/extractor/projectveritas.py
+yt_dlp/extractor/prosiebensat1.py
+yt_dlp/extractor/puhutv.py
+yt_dlp/extractor/puls4.py
+yt_dlp/extractor/pyvideo.py
+yt_dlp/extractor/qqmusic.py
+yt_dlp/extractor/r7.py
+yt_dlp/extractor/radiko.py
+yt_dlp/extractor/radiobremen.py
+yt_dlp/extractor/radiocanada.py
+yt_dlp/extractor/radiode.py
+yt_dlp/extractor/radiofrance.py
+yt_dlp/extractor/radiojavan.py
+yt_dlp/extractor/radiokapital.py
+yt_dlp/extractor/radiozet.py
+yt_dlp/extractor/radlive.py
+yt_dlp/extractor/rai.py
+yt_dlp/extractor/raywenderlich.py
+yt_dlp/extractor/rbmaradio.py
+yt_dlp/extractor/rcs.py
+yt_dlp/extractor/rcti.py
+yt_dlp/extractor/rds.py
+yt_dlp/extractor/redbulltv.py
+yt_dlp/extractor/reddit.py
+yt_dlp/extractor/redgifs.py
+yt_dlp/extractor/redtube.py
+yt_dlp/extractor/regiotv.py
+yt_dlp/extractor/rentv.py
+yt_dlp/extractor/restudy.py
+yt_dlp/extractor/reuters.py
+yt_dlp/extractor/reverbnation.py
+yt_dlp/extractor/rice.py
+yt_dlp/extractor/rmcdecouverte.py
+yt_dlp/extractor/ro220.py
+yt_dlp/extractor/rockstargames.py
+yt_dlp/extractor/roosterteeth.py
+yt_dlp/extractor/rottentomatoes.py
+yt_dlp/extractor/roxwel.py
+yt_dlp/extractor/rozhlas.py
+yt_dlp/extractor/rtbf.py
+yt_dlp/extractor/rte.py
+yt_dlp/extractor/rtl2.py
+yt_dlp/extractor/rtlnl.py
+yt_dlp/extractor/rtp.py
+yt_dlp/extractor/rtrfm.py
+yt_dlp/extractor/rts.py
+yt_dlp/extractor/rtve.py
+yt_dlp/extractor/rtvnh.py
+yt_dlp/extractor/rtvs.py
+yt_dlp/extractor/ruhd.py
+yt_dlp/extractor/rumble.py
+yt_dlp/extractor/rutube.py
+yt_dlp/extractor/rutv.py
+yt_dlp/extractor/ruutu.py
+yt_dlp/extractor/ruv.py
+yt_dlp/extractor/safari.py
+yt_dlp/extractor/saitosan.py
+yt_dlp/extractor/samplefocus.py
+yt_dlp/extractor/sapo.py
+yt_dlp/extractor/savefrom.py
+yt_dlp/extractor/sbs.py
+yt_dlp/extractor/screencast.py
+yt_dlp/extractor/screencastomatic.py
+yt_dlp/extractor/scrippsnetworks.py
+yt_dlp/extractor/scte.py
+yt_dlp/extractor/seeker.py
+yt_dlp/extractor/senategov.py
+yt_dlp/extractor/sendtonews.py
+yt_dlp/extractor/servus.py
+yt_dlp/extractor/sevenplus.py
+yt_dlp/extractor/sexu.py
+yt_dlp/extractor/seznamzpravy.py
+yt_dlp/extractor/shahid.py
+yt_dlp/extractor/shared.py
+yt_dlp/extractor/shemaroome.py
+yt_dlp/extractor/showroomlive.py
+yt_dlp/extractor/simplecast.py
+yt_dlp/extractor/sina.py
+yt_dlp/extractor/sixplay.py
+yt_dlp/extractor/sky.py
+yt_dlp/extractor/skyit.py
+yt_dlp/extractor/skylinewebcams.py
+yt_dlp/extractor/skynewsarabia.py
+yt_dlp/extractor/skynewsau.py
+yt_dlp/extractor/slideshare.py
+yt_dlp/extractor/slideslive.py
+yt_dlp/extractor/slutload.py
+yt_dlp/extractor/snotr.py
+yt_dlp/extractor/sohu.py
+yt_dlp/extractor/sonyliv.py
+yt_dlp/extractor/soundcloud.py
+yt_dlp/extractor/soundgasm.py
+yt_dlp/extractor/southpark.py
+yt_dlp/extractor/sovietscloset.py
+yt_dlp/extractor/spankbang.py
+yt_dlp/extractor/spankwire.py
+yt_dlp/extractor/spiegel.py
+yt_dlp/extractor/spiegeltv.py
+yt_dlp/extractor/spike.py
+yt_dlp/extractor/sport5.py
+yt_dlp/extractor/sportbox.py
+yt_dlp/extractor/sportdeutschland.py
+yt_dlp/extractor/spotify.py
+yt_dlp/extractor/spreaker.py
+yt_dlp/extractor/springboardplatform.py
+yt_dlp/extractor/sprout.py
+yt_dlp/extractor/srgssr.py
+yt_dlp/extractor/srmediathek.py
+yt_dlp/extractor/stanfordoc.py
+yt_dlp/extractor/startv.py
+yt_dlp/extractor/steam.py
+yt_dlp/extractor/stitcher.py
+yt_dlp/extractor/storyfire.py
+yt_dlp/extractor/streamable.py
+yt_dlp/extractor/streamanity.py
+yt_dlp/extractor/streamcloud.py
+yt_dlp/extractor/streamcz.py
+yt_dlp/extractor/streamff.py
+yt_dlp/extractor/streetvoice.py
+yt_dlp/extractor/stretchinternet.py
+yt_dlp/extractor/stripchat.py
+yt_dlp/extractor/stv.py
+yt_dlp/extractor/sunporno.py
+yt_dlp/extractor/sverigesradio.py
+yt_dlp/extractor/svt.py
+yt_dlp/extractor/swrmediathek.py
+yt_dlp/extractor/syfy.py
+yt_dlp/extractor/sztvhu.py
+yt_dlp/extractor/tagesschau.py
+yt_dlp/extractor/tass.py
+yt_dlp/extractor/tastytrade.py
+yt_dlp/extractor/tbs.py
+yt_dlp/extractor/tdslifeway.py
+yt_dlp/extractor/teachable.py
+yt_dlp/extractor/teachertube.py
+yt_dlp/extractor/teachingchannel.py
+yt_dlp/extractor/teamcoco.py
+yt_dlp/extractor/teamtreehouse.py
+yt_dlp/extractor/techtalks.py
+yt_dlp/extractor/ted.py
+yt_dlp/extractor/tele13.py
+yt_dlp/extractor/tele5.py
+yt_dlp/extractor/telebruxelles.py
+yt_dlp/extractor/telecinco.py
+yt_dlp/extractor/telegraaf.py
+yt_dlp/extractor/telemb.py
+yt_dlp/extractor/telemundo.py
+yt_dlp/extractor/telequebec.py
+yt_dlp/extractor/teletask.py
+yt_dlp/extractor/telewebion.py
+yt_dlp/extractor/tennistv.py
+yt_dlp/extractor/tenplay.py
+yt_dlp/extractor/testurl.py
+yt_dlp/extractor/tf1.py
+yt_dlp/extractor/tfo.py
+yt_dlp/extractor/theintercept.py
+yt_dlp/extractor/theplatform.py
+yt_dlp/extractor/thescene.py
+yt_dlp/extractor/thestar.py
+yt_dlp/extractor/thesun.py
+yt_dlp/extractor/theta.py
+yt_dlp/extractor/theweatherchannel.py
+yt_dlp/extractor/thisamericanlife.py
+yt_dlp/extractor/thisav.py
+yt_dlp/extractor/thisoldhouse.py
+yt_dlp/extractor/threeqsdn.py
+yt_dlp/extractor/threespeak.py
+yt_dlp/extractor/tiktok.py
+yt_dlp/extractor/tinypic.py
+yt_dlp/extractor/tmz.py
+yt_dlp/extractor/tnaflix.py
+yt_dlp/extractor/toggle.py
+yt_dlp/extractor/tokentube.py
+yt_dlp/extractor/tonline.py
+yt_dlp/extractor/toongoggles.py
+yt_dlp/extractor/toutv.py
+yt_dlp/extractor/toypics.py
+yt_dlp/extractor/traileraddict.py
+yt_dlp/extractor/trilulilu.py
+yt_dlp/extractor/trovo.py
+yt_dlp/extractor/trunews.py
+yt_dlp/extractor/trutv.py
+yt_dlp/extractor/tube8.py
+yt_dlp/extractor/tubitv.py
+yt_dlp/extractor/tudou.py
+yt_dlp/extractor/tumblr.py
+yt_dlp/extractor/tunein.py
+yt_dlp/extractor/tunepk.py
+yt_dlp/extractor/turbo.py
+yt_dlp/extractor/turner.py
+yt_dlp/extractor/tv2.py
+yt_dlp/extractor/tv2dk.py
+yt_dlp/extractor/tv2hu.py
+yt_dlp/extractor/tv4.py
+yt_dlp/extractor/tv5mondeplus.py
+yt_dlp/extractor/tv5unis.py
+yt_dlp/extractor/tva.py
+yt_dlp/extractor/tvanouvelles.py
+yt_dlp/extractor/tvc.py
+yt_dlp/extractor/tver.py
+yt_dlp/extractor/tvigle.py
+yt_dlp/extractor/tvland.py
+yt_dlp/extractor/tvn24.py
+yt_dlp/extractor/tvnet.py
+yt_dlp/extractor/tvnoe.py
+yt_dlp/extractor/tvnow.py
+yt_dlp/extractor/tvp.py
+yt_dlp/extractor/tvplay.py
+yt_dlp/extractor/tvplayer.py
+yt_dlp/extractor/tweakers.py
+yt_dlp/extractor/twentyfourvideo.py
+yt_dlp/extractor/twentymin.py
+yt_dlp/extractor/twentythreevideo.py
+yt_dlp/extractor/twitcasting.py
+yt_dlp/extractor/twitch.py
+yt_dlp/extractor/twitter.py
+yt_dlp/extractor/udemy.py
+yt_dlp/extractor/udn.py
+yt_dlp/extractor/ufctv.py
+yt_dlp/extractor/ukcolumn.py
+yt_dlp/extractor/uktvplay.py
+yt_dlp/extractor/umg.py
+yt_dlp/extractor/unistra.py
+yt_dlp/extractor/unity.py
+yt_dlp/extractor/uol.py
+yt_dlp/extractor/uplynk.py
+yt_dlp/extractor/urort.py
+yt_dlp/extractor/urplay.py
+yt_dlp/extractor/usanetwork.py
+yt_dlp/extractor/usatoday.py
+yt_dlp/extractor/ustream.py
+yt_dlp/extractor/ustudio.py
+yt_dlp/extractor/utreon.py
+yt_dlp/extractor/varzesh3.py
+yt_dlp/extractor/vbox7.py
+yt_dlp/extractor/veehd.py
+yt_dlp/extractor/veo.py
+yt_dlp/extractor/veoh.py
+yt_dlp/extractor/vesti.py
+yt_dlp/extractor/vevo.py
+yt_dlp/extractor/vgtv.py
+yt_dlp/extractor/vh1.py
+yt_dlp/extractor/vice.py
+yt_dlp/extractor/vidbit.py
+yt_dlp/extractor/viddler.py
+yt_dlp/extractor/videa.py
+yt_dlp/extractor/videodetective.py
+yt_dlp/extractor/videofyme.py
+yt_dlp/extractor/videomore.py
+yt_dlp/extractor/videopress.py
+yt_dlp/extractor/vidio.py
+yt_dlp/extractor/vidlii.py
+yt_dlp/extractor/vidzi.py
+yt_dlp/extractor/vier.py
+yt_dlp/extractor/viewlift.py
+yt_dlp/extractor/viidea.py
+yt_dlp/extractor/viki.py
+yt_dlp/extractor/vimeo.py
+yt_dlp/extractor/vimple.py
+yt_dlp/extractor/vine.py
+yt_dlp/extractor/viqeo.py
+yt_dlp/extractor/viu.py
+yt_dlp/extractor/vk.py
+yt_dlp/extractor/vlive.py
+yt_dlp/extractor/vodlocker.py
+yt_dlp/extractor/vodpl.py
+yt_dlp/extractor/vodplatform.py
+yt_dlp/extractor/voicerepublic.py
+yt_dlp/extractor/voicy.py
+yt_dlp/extractor/voot.py
+yt_dlp/extractor/voxmedia.py
+yt_dlp/extractor/vrak.py
+yt_dlp/extractor/vrt.py
+yt_dlp/extractor/vrv.py
+yt_dlp/extractor/vshare.py
+yt_dlp/extractor/vtm.py
+yt_dlp/extractor/vube.py
+yt_dlp/extractor/vuclip.py
+yt_dlp/extractor/vupload.py
+yt_dlp/extractor/vvvvid.py
+yt_dlp/extractor/vyborymos.py
+yt_dlp/extractor/vzaar.py
+yt_dlp/extractor/wakanim.py
+yt_dlp/extractor/walla.py
+yt_dlp/extractor/washingtonpost.py
+yt_dlp/extractor/wat.py
+yt_dlp/extractor/watchbox.py
+yt_dlp/extractor/watchindianporn.py
+yt_dlp/extractor/wdr.py
+yt_dlp/extractor/webcaster.py
+yt_dlp/extractor/webofstories.py
+yt_dlp/extractor/weibo.py
+yt_dlp/extractor/weiqitv.py
+yt_dlp/extractor/whowatch.py
+yt_dlp/extractor/willow.py
+yt_dlp/extractor/wimtv.py
+yt_dlp/extractor/wistia.py
+yt_dlp/extractor/worldstarhiphop.py
+yt_dlp/extractor/wppilot.py
+yt_dlp/extractor/wsj.py
+yt_dlp/extractor/wwe.py
+yt_dlp/extractor/xbef.py
+yt_dlp/extractor/xboxclips.py
+yt_dlp/extractor/xfileshare.py
+yt_dlp/extractor/xhamster.py
+yt_dlp/extractor/xiami.py
+yt_dlp/extractor/ximalaya.py
+yt_dlp/extractor/xminus.py
+yt_dlp/extractor/xnxx.py
+yt_dlp/extractor/xstream.py
+yt_dlp/extractor/xtube.py
+yt_dlp/extractor/xuite.py
+yt_dlp/extractor/xvideos.py
+yt_dlp/extractor/xxxymovies.py
+yt_dlp/extractor/yahoo.py
+yt_dlp/extractor/yandexdisk.py
+yt_dlp/extractor/yandexmusic.py
+yt_dlp/extractor/yandexvideo.py
+yt_dlp/extractor/yapfiles.py
+yt_dlp/extractor/yesjapan.py
+yt_dlp/extractor/yinyuetai.py
+yt_dlp/extractor/ynet.py
+yt_dlp/extractor/youjizz.py
+yt_dlp/extractor/youku.py
+yt_dlp/extractor/younow.py
+yt_dlp/extractor/youporn.py
+yt_dlp/extractor/yourporn.py
+yt_dlp/extractor/yourupload.py
+yt_dlp/extractor/youtube.py
+yt_dlp/extractor/zapiks.py
+yt_dlp/extractor/zaq1.py
+yt_dlp/extractor/zattoo.py
+yt_dlp/extractor/zdf.py
+yt_dlp/extractor/zee5.py
+yt_dlp/extractor/zhihu.py
+yt_dlp/extractor/zingmp3.py
+yt_dlp/extractor/zoom.py
+yt_dlp/extractor/zype.py
+yt_dlp/jsinterp.py
+yt_dlp/minicurses.py
+yt_dlp/options.py
+yt_dlp/postprocessor/__init__.py
+yt_dlp/postprocessor/common.py
+yt_dlp/postprocessor/embedthumbnail.py
+yt_dlp/postprocessor/exec.py
+yt_dlp/postprocessor/ffmpeg.py
+yt_dlp/postprocessor/metadataparser.py
+yt_dlp/postprocessor/modify_chapters.py
+yt_dlp/postprocessor/movefilesafterdownload.py
+yt_dlp/postprocessor/sponskrub.py
+yt_dlp/postprocessor/sponsorblock.py
+yt_dlp/postprocessor/xattrpp.py
+yt_dlp/socks.py
+yt_dlp/update.py
+yt_dlp/utils.py
+yt_dlp/version.py
+yt_dlp/webvtt.py
diff --git a/pkg/yt-dlp/sha256 b/pkg/yt-dlp/sha256
@@ -0,0 +1 @@
+bf0cc22d17ffbe59c0d0378026ff135a996b86c546ec9713d838f952dea61e0f yt-dlp.tar.gz
diff --git a/pkg/yt-dlp/url b/pkg/yt-dlp/url
@@ -0,0 +1 @@
+url = "https://github.com/yt-dlp/yt-dlp/releases/download/2021.12.01/yt-dlp.tar.gz"
diff --git a/pkg/yt-dlp/ver b/pkg/yt-dlp/ver
@@ -0,0 +1 @@
+2021.12.01 r0
diff --git a/pkg/yt-dlp/yt-dlp b/pkg/yt-dlp/yt-dlp
@@ -0,0 +1,6 @@
+#!/bin/python
+
+import yt_dlp
+
+if __name__ == '__main__':
+ yt_dlp.main()
diff --git a/sets.lua b/sets.lua
@@ -62,6 +62,7 @@ return {
'mpv',
'tinyalsa',
'youtube-dl',
+ 'yt-dlp',
},
net={
'acme-client',