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.
Files changed (20) hide show
  1. yt_dlp/extractor/_extractors.py +0 -4
  2. yt_dlp/extractor/facebook.py +0 -64
  3. yt_dlp/extractor/iqiyi.py +0 -184
  4. yt_dlp/extractor/lazy_extractors.py +2 -33
  5. yt_dlp/extractor/nebula.py +9 -1
  6. yt_dlp/extractor/twitter.py +37 -194
  7. yt_dlp/extractor/youtube/_video.py +14 -19
  8. yt_dlp/utils/_utils.py +1 -1
  9. yt_dlp/version.py +3 -3
  10. {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/METADATA +1 -1
  11. {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/RECORD +19 -20
  12. yt_dlp/extractor/scte.py +0 -137
  13. {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
  14. {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
  15. {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
  16. {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
  17. {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
  18. {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/WHEEL +0 -0
  19. {yt_dlp-2025.12.29.233040.dev0.dist-info → yt_dlp-2025.12.30.233018.dev0.dist-info}/entry_points.txt +0 -0
  20. {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)