yt-dlp 2025.12.29.233040.dev0__py3-none-any.whl → 2025.12.30.233018.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- yt_dlp/extractor/_extractors.py +0 -4
- yt_dlp/extractor/facebook.py +0 -64
- yt_dlp/extractor/iqiyi.py +0 -184
- yt_dlp/extractor/lazy_extractors.py +2 -33
- yt_dlp/extractor/nebula.py +9 -1
- yt_dlp/extractor/twitter.py +37 -194
- yt_dlp/extractor/youtube/_video.py +14 -19
- yt_dlp/utils/_utils.py +1 -1
- yt_dlp/version.py +3 -3
- {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/METADATA +1 -1
- {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/RECORD +19 -20
- yt_dlp/extractor/scte.py +0 -137
- {yt_dlp-2025.12.29.233040.dev0.data → yt_dlp-2025.12.30.233018.dev0.data}/data/share/bash-completion/completions/yt-dlp +0 -0
- {yt_dlp-2025.12.29.233040.dev0.data → yt_dlp-2025.12.30.233018.dev0.data}/data/share/doc/yt_dlp/README.txt +0 -0
- {yt_dlp-2025.12.29.233040.dev0.data → yt_dlp-2025.12.30.233018.dev0.data}/data/share/fish/vendor_completions.d/yt-dlp.fish +0 -0
- {yt_dlp-2025.12.29.233040.dev0.data → yt_dlp-2025.12.30.233018.dev0.data}/data/share/man/man1/yt-dlp.1 +0 -0
- {yt_dlp-2025.12.29.233040.dev0.data → yt_dlp-2025.12.30.233018.dev0.data}/data/share/zsh/site-functions/_yt-dlp +0 -0
- {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/WHEEL +0 -0
- {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/entry_points.txt +0 -0
- {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/licenses/LICENSE +0 -0
yt_dlp/extractor/scte.py
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
|
|
3
|
-
from .common import InfoExtractor
|
|
4
|
-
from ..utils import (
|
|
5
|
-
ExtractorError,
|
|
6
|
-
decode_packed_codes,
|
|
7
|
-
urlencode_postdata,
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class SCTEBaseIE(InfoExtractor):
|
|
12
|
-
_LOGIN_URL = 'https://www.scte.org/SCTE/Sign_In.aspx'
|
|
13
|
-
_NETRC_MACHINE = 'scte'
|
|
14
|
-
|
|
15
|
-
def _perform_login(self, username, password):
|
|
16
|
-
login_popup = self._download_webpage(
|
|
17
|
-
self._LOGIN_URL, None, 'Downloading login popup')
|
|
18
|
-
|
|
19
|
-
def is_logged(webpage):
|
|
20
|
-
return any(re.search(p, webpage) for p in (
|
|
21
|
-
r'class=["\']welcome\b', r'>Sign Out<'))
|
|
22
|
-
|
|
23
|
-
# already logged in
|
|
24
|
-
if is_logged(login_popup):
|
|
25
|
-
return
|
|
26
|
-
|
|
27
|
-
login_form = self._hidden_inputs(login_popup)
|
|
28
|
-
|
|
29
|
-
login_form.update({
|
|
30
|
-
'ctl01$TemplateBody$WebPartManager1$gwpciNewContactSignInCommon$ciNewContactSignInCommon$signInUserName': username,
|
|
31
|
-
'ctl01$TemplateBody$WebPartManager1$gwpciNewContactSignInCommon$ciNewContactSignInCommon$signInPassword': password,
|
|
32
|
-
'ctl01$TemplateBody$WebPartManager1$gwpciNewContactSignInCommon$ciNewContactSignInCommon$RememberMe': 'on',
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
response = self._download_webpage(
|
|
36
|
-
self._LOGIN_URL, None, 'Logging in',
|
|
37
|
-
data=urlencode_postdata(login_form))
|
|
38
|
-
|
|
39
|
-
if '|pageRedirect|' not in response and not is_logged(response):
|
|
40
|
-
error = self._html_search_regex(
|
|
41
|
-
r'(?s)<[^>]+class=["\']AsiError["\'][^>]*>(.+?)</',
|
|
42
|
-
response, 'error message', default=None)
|
|
43
|
-
if error:
|
|
44
|
-
raise ExtractorError(f'Unable to login: {error}', expected=True)
|
|
45
|
-
raise ExtractorError('Unable to log in')
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class SCTEIE(SCTEBaseIE):
|
|
49
|
-
_WORKING = False
|
|
50
|
-
_VALID_URL = r'https?://learning\.scte\.org/mod/scorm/view\.php?.*?\bid=(?P<id>\d+)'
|
|
51
|
-
_TESTS = [{
|
|
52
|
-
'url': 'https://learning.scte.org/mod/scorm/view.php?id=31484',
|
|
53
|
-
'info_dict': {
|
|
54
|
-
'title': 'Introduction to DOCSIS Engineering Professional',
|
|
55
|
-
'id': '31484',
|
|
56
|
-
},
|
|
57
|
-
'playlist_count': 5,
|
|
58
|
-
'skip': 'Requires account credentials',
|
|
59
|
-
}]
|
|
60
|
-
|
|
61
|
-
def _real_extract(self, url):
|
|
62
|
-
video_id = self._match_id(url)
|
|
63
|
-
|
|
64
|
-
webpage = self._download_webpage(url, video_id)
|
|
65
|
-
|
|
66
|
-
title = self._search_regex(r'<h1>(.+?)</h1>', webpage, 'title')
|
|
67
|
-
|
|
68
|
-
context_id = self._search_regex(r'context-(\d+)', webpage, video_id)
|
|
69
|
-
content_base = f'https://learning.scte.org/pluginfile.php/{context_id}/mod_scorm/content/8/'
|
|
70
|
-
context = decode_packed_codes(self._download_webpage(
|
|
71
|
-
f'{content_base}mobile/data.js', video_id))
|
|
72
|
-
|
|
73
|
-
data = self._parse_xml(
|
|
74
|
-
self._search_regex(
|
|
75
|
-
r'CreateData\(\s*"(.+?)"', context, 'data').replace(r"\'", "'"),
|
|
76
|
-
video_id)
|
|
77
|
-
|
|
78
|
-
entries = []
|
|
79
|
-
for asset in data.findall('.//asset'):
|
|
80
|
-
asset_url = asset.get('url')
|
|
81
|
-
if not asset_url or not asset_url.endswith('.mp4'):
|
|
82
|
-
continue
|
|
83
|
-
asset_id = self._search_regex(
|
|
84
|
-
r'video_([^_]+)_', asset_url, 'asset id', default=None)
|
|
85
|
-
if not asset_id:
|
|
86
|
-
continue
|
|
87
|
-
entries.append({
|
|
88
|
-
'id': asset_id,
|
|
89
|
-
'title': title,
|
|
90
|
-
'url': content_base + asset_url,
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
return self.playlist_result(entries, video_id, title)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
class SCTECourseIE(SCTEBaseIE):
|
|
97
|
-
_WORKING = False
|
|
98
|
-
_VALID_URL = r'https?://learning\.scte\.org/(?:mod/sub)?course/view\.php?.*?\bid=(?P<id>\d+)'
|
|
99
|
-
_TESTS = [{
|
|
100
|
-
'url': 'https://learning.scte.org/mod/subcourse/view.php?id=31491',
|
|
101
|
-
'only_matching': True,
|
|
102
|
-
}, {
|
|
103
|
-
'url': 'https://learning.scte.org/course/view.php?id=3639',
|
|
104
|
-
'only_matching': True,
|
|
105
|
-
}, {
|
|
106
|
-
'url': 'https://learning.scte.org/course/view.php?id=3073',
|
|
107
|
-
'only_matching': True,
|
|
108
|
-
}]
|
|
109
|
-
|
|
110
|
-
def _real_extract(self, url):
|
|
111
|
-
course_id = self._match_id(url)
|
|
112
|
-
|
|
113
|
-
webpage = self._download_webpage(url, course_id)
|
|
114
|
-
|
|
115
|
-
title = self._search_regex(
|
|
116
|
-
r'<h1>(.+?)</h1>', webpage, 'title', default=None)
|
|
117
|
-
|
|
118
|
-
entries = []
|
|
119
|
-
for mobj in re.finditer(
|
|
120
|
-
r'''(?x)
|
|
121
|
-
<a[^>]+
|
|
122
|
-
href=(["\'])
|
|
123
|
-
(?P<url>
|
|
124
|
-
https?://learning\.scte\.org/mod/
|
|
125
|
-
(?P<kind>scorm|subcourse)/view\.php?(?:(?!\1).)*?
|
|
126
|
-
\bid=\d+
|
|
127
|
-
)
|
|
128
|
-
''',
|
|
129
|
-
webpage):
|
|
130
|
-
item_url = mobj.group('url')
|
|
131
|
-
if item_url == url:
|
|
132
|
-
continue
|
|
133
|
-
ie = (SCTEIE.ie_key() if mobj.group('kind') == 'scorm'
|
|
134
|
-
else SCTECourseIE.ie_key())
|
|
135
|
-
entries.append(self.url_result(item_url, ie=ie))
|
|
136
|
-
|
|
137
|
-
return self.playlist_result(entries, course_id, title)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|