aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yt_dlp/extractor/_extractors.py27
-rw-r--r--yt_dlp/extractor/bleacherreport.py2
-rw-r--r--yt_dlp/extractor/cbs.py1
-rw-r--r--yt_dlp/extractor/cbsinteractive.py98
-rw-r--r--yt_dlp/extractor/cbssports.py3
-rw-r--r--yt_dlp/extractor/chingari.py199
-rw-r--r--yt_dlp/extractor/cinemax.py1
-rw-r--r--yt_dlp/extractor/cliphunter.py76
-rw-r--r--yt_dlp/extractor/cliprs.py1
-rw-r--r--yt_dlp/extractor/closertotruth.py1
-rw-r--r--yt_dlp/extractor/digg.py54
-rw-r--r--yt_dlp/extractor/dtube.py1
-rw-r--r--yt_dlp/extractor/dw.py4
-rw-r--r--yt_dlp/extractor/europa.py1
-rw-r--r--yt_dlp/extractor/fancode.py2
-rw-r--r--yt_dlp/extractor/filmmodu.py69
-rw-r--r--yt_dlp/extractor/gameinformer.py46
-rw-r--r--yt_dlp/extractor/gazeta.py1
-rw-r--r--yt_dlp/extractor/gdcvault.py1
-rw-r--r--yt_dlp/extractor/giga.py93
-rw-r--r--yt_dlp/extractor/godtube.py1
-rw-r--r--yt_dlp/extractor/hotnewhiphop.py1
-rw-r--r--yt_dlp/extractor/instagram.py1
-rw-r--r--yt_dlp/extractor/jeuxvideo.py2
-rw-r--r--yt_dlp/extractor/kanal2.py66
-rw-r--r--yt_dlp/extractor/kankanews.py1
-rw-r--r--yt_dlp/extractor/karrierevideos.py96
-rw-r--r--yt_dlp/extractor/kelbyone.py1
-rw-r--r--yt_dlp/extractor/konserthusetplay.py119
-rw-r--r--yt_dlp/extractor/koo.py1
-rw-r--r--yt_dlp/extractor/krasview.py1
-rw-r--r--yt_dlp/extractor/kusi.py83
-rw-r--r--yt_dlp/extractor/kuwo.py6
-rw-r--r--yt_dlp/extractor/lecture2go.py1
-rw-r--r--yt_dlp/extractor/lenta.py1
-rw-r--r--yt_dlp/extractor/localnews8.py42
-rw-r--r--yt_dlp/extractor/malltv.py107
-rw-r--r--yt_dlp/extractor/manyvids.py1
-rw-r--r--yt_dlp/extractor/markiza.py2
-rw-r--r--yt_dlp/extractor/miaopai.py36
-rw-r--r--yt_dlp/extractor/ministrygrid.py55
-rw-r--r--yt_dlp/extractor/morningstar.py45
-rw-r--r--yt_dlp/extractor/motorsport.py1
-rw-r--r--yt_dlp/extractor/mtv.py1
-rw-r--r--yt_dlp/extractor/muenchentv.py1
-rw-r--r--yt_dlp/extractor/murrtube.py2
-rw-r--r--yt_dlp/extractor/ndtv.py1
-rw-r--r--yt_dlp/extractor/netzkino.py1
-rw-r--r--yt_dlp/extractor/nextmedia.py2
-rw-r--r--yt_dlp/extractor/nobelprize.py1
-rw-r--r--yt_dlp/extractor/noz.py1
-rw-r--r--yt_dlp/extractor/odatv.py47
-rw-r--r--yt_dlp/extractor/parlview.py2
-rw-r--r--yt_dlp/extractor/playstuff.py63
-rw-r--r--yt_dlp/extractor/plutotv.py1
-rw-r--r--yt_dlp/extractor/podomatic.py1
-rw-r--r--yt_dlp/extractor/pornovoisines.py1
-rw-r--r--yt_dlp/extractor/pornoxo.py1
-rw-r--r--yt_dlp/extractor/projectveritas.py1
-rw-r--r--yt_dlp/extractor/r7.py4
-rw-r--r--yt_dlp/extractor/radiode.py1
-rw-r--r--yt_dlp/extractor/radiojavan.py1
-rw-r--r--yt_dlp/extractor/rbmaradio.py68
-rw-r--r--yt_dlp/extractor/rds.py1
-rw-r--r--yt_dlp/extractor/redbee.py1
-rw-r--r--yt_dlp/extractor/regiotv.py55
-rw-r--r--yt_dlp/extractor/rentv.py2
-rw-r--r--yt_dlp/extractor/restudy.py1
-rw-r--r--yt_dlp/extractor/reuters.py1
-rw-r--r--yt_dlp/extractor/rockstargames.py1
-rw-r--r--yt_dlp/extractor/rts.py1
-rw-r--r--yt_dlp/extractor/saitosan.py1
-rw-r--r--yt_dlp/extractor/savefrom.py30
-rw-r--r--yt_dlp/extractor/seeker.py55
-rw-r--r--yt_dlp/extractor/senalcolombia.py1
-rw-r--r--yt_dlp/extractor/sendtonews.py1
-rw-r--r--yt_dlp/extractor/sexu.py1
-rw-r--r--yt_dlp/extractor/skylinewebcams.py1
-rw-r--r--yt_dlp/extractor/skynewsarabia.py2
-rw-r--r--yt_dlp/extractor/startrek.py1
-rw-r--r--yt_dlp/extractor/streamff.py30
-rw-r--r--yt_dlp/extractor/syfy.py1
-rw-r--r--yt_dlp/extractor/tagesschau.py1
-rw-r--r--yt_dlp/extractor/tass.py1
-rw-r--r--yt_dlp/extractor/tdslifeway.py31
-rw-r--r--yt_dlp/extractor/teachable.py1
-rw-r--r--yt_dlp/extractor/teachertube.py2
-rw-r--r--yt_dlp/extractor/teachingchannel.py1
-rw-r--r--yt_dlp/extractor/tele5.py1
-rw-r--r--yt_dlp/extractor/telemb.py1
-rw-r--r--yt_dlp/extractor/telemundo.py2
-rw-r--r--yt_dlp/extractor/teletask.py1
-rw-r--r--yt_dlp/extractor/tonline.py2
-rw-r--r--yt_dlp/extractor/tv2.py2
-rw-r--r--yt_dlp/extractor/tvn24.py1
-rw-r--r--yt_dlp/extractor/tvnoe.py1
-rw-r--r--yt_dlp/extractor/ukcolumn.py1
-rw-r--r--yt_dlp/extractor/umg.py1
-rw-r--r--yt_dlp/extractor/unity.py1
-rw-r--r--yt_dlp/extractor/urort.py1
-rw-r--r--yt_dlp/extractor/varzesh3.py1
-rw-r--r--yt_dlp/extractor/vesti.py1
-rw-r--r--yt_dlp/extractor/videofyme.py1
-rw-r--r--yt_dlp/extractor/viqeo.py1
-rw-r--r--yt_dlp/extractor/voicy.py2
-rw-r--r--yt_dlp/extractor/vtm.py1
-rw-r--r--yt_dlp/extractor/weiqitv.py1
-rw-r--r--yt_dlp/extractor/xinpianchang.py1
-rw-r--r--yt_dlp/extractor/xminus.py1
-rw-r--r--yt_dlp/extractor/yapfiles.py1
-rw-r--r--yt_dlp/extractor/yappy.py1
-rw-r--r--yt_dlp/extractor/zeenews.py2
112 files changed, 113 insertions, 1692 deletions
diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py
index c8a701050..c75365536 100644
--- a/yt_dlp/extractor/_extractors.py
+++ b/yt_dlp/extractor/_extractors.py
@@ -320,7 +320,6 @@ from .cbs import (
CBSIE,
ParamountPressExpressIE,
)
-from .cbsinteractive import CBSInteractiveIE
from .cbsnews import (
CBSNewsEmbedIE,
CBSNewsIE,
@@ -348,10 +347,6 @@ from .cgtn import CGTNIE
from .charlierose import CharlieRoseIE
from .chaturbate import ChaturbateIE
from .chilloutzone import ChilloutzoneIE
-from .chingari import (
- ChingariIE,
- ChingariUserIE,
-)
from .chzzk import (
CHZZKLiveIE,
CHZZKVideoIE,
@@ -369,7 +364,6 @@ from .ciscolive import (
from .ciscowebex import CiscoWebexIE
from .cjsw import CJSWIE
from .clipchamp import ClipchampIE
-from .cliphunter import CliphunterIE
from .clippit import ClippitIE
from .cliprs import ClipRsIE
from .closertotruth import CloserToTruthIE
@@ -476,7 +470,6 @@ from .dlf import (
)
from .dfb import DFBIE
from .dhm import DHMIE
-from .digg import DiggIE
from .douyutv import (
DouyuShowIE,
DouyuTVIE,
@@ -610,7 +603,6 @@ from .fc2 import (
)
from .fczenit import FczenitIE
from .fifa import FifaIE
-from .filmmodu import FilmmoduIE
from .filmon import (
FilmOnIE,
FilmOnChannelIE,
@@ -676,7 +668,6 @@ from .gab import (
GabIE,
)
from .gaia import GaiaIE
-from .gameinformer import GameInformerIE
from .gamejolt import (
GameJoltIE,
GameJoltUserIE,
@@ -705,7 +696,6 @@ from .gettr import (
GettrStreamingIE,
)
from .giantbomb import GiantBombIE
-from .giga import GigaIE
from .glide import GlideIE
from .globalplayer import (
GlobalPlayerLiveIE,
@@ -896,10 +886,8 @@ from .jtbc import (
from .jwplatform import JWPlatformIE
from .kakao import KakaoIE
from .kaltura import KalturaIE
-from .kanal2 import Kanal2IE
from .kankanews import KankaNewsIE
from .karaoketv import KaraoketvIE
-from .karrierevideos import KarriereVideosIE
from .kelbyone import KelbyOneIE
from .khanacademy import (
KhanAcademyIE,
@@ -915,13 +903,11 @@ from .kinja import KinjaEmbedIE
from .kinopoisk import KinoPoiskIE
from .kommunetv import KommunetvIE
from .kompas import KompasVideoIE
-from .konserthusetplay import KonserthusetPlayIE
from .koo import KooIE
from .kth import KTHIE
from .krasview import KrasViewIE
from .ku6 import Ku6IE
from .kukululive import KukuluLiveIE
-from .kusi import KUSIIE
from .kuwo import (
KuwoIE,
KuwoAlbumIE,
@@ -1003,7 +989,6 @@ from .lnkgo import (
LnkGoIE,
LnkIE,
)
-from .localnews8 import LocalNews8IE
from .lovehomeporn import LoveHomePornIE
from .lrt import (
LRTVODIE,
@@ -1030,7 +1015,6 @@ from .mailru import (
MailRuMusicSearchIE,
)
from .mainstreaming import MainStreamingIE
-from .malltv import MallTVIE
from .mangomolo import (
MangomoloVideoIE,
MangomoloLiveIE,
@@ -1074,7 +1058,6 @@ from .meipai import MeipaiIE
from .melonvod import MelonVODIE
from .metacritic import MetacriticIE
from .mgtv import MGTVIE
-from .miaopai import MiaoPaiIE
from .microsoftstream import MicrosoftStreamIE
from .microsoftvirtualacademy import (
MicrosoftVirtualAcademyIE,
@@ -1092,7 +1075,6 @@ from .minds import (
MindsChannelIE,
MindsGroupIE,
)
-from .ministrygrid import MinistryGridIE
from .minoto import MinotoIE
from .mirrativ import (
MirrativIE,
@@ -1120,7 +1102,6 @@ from .mlssoccer import MLSSoccerIE
from .mocha import MochaVideoIE
from .mojvideo import MojvideoIE
from .monstercat import MonstercatIE
-from .morningstar import MorningstarIE
from .motherless import (
MotherlessIE,
MotherlessGroupIE,
@@ -1365,7 +1346,6 @@ from .nuvid import NuvidIE
from .nzherald import NZHeraldIE
from .nzonscreen import NZOnScreenIE
from .nzz import NZZIE
-from .odatv import OdaTVIE
from .odkmedia import OnDemandChinaEpisodeIE
from .odnoklassniki import OdnoklassnikiIE
from .oftv import (
@@ -1477,7 +1457,6 @@ from .platzi import (
PlatziCourseIE,
)
from .playplustv import PlayPlusTVIE
-from .playstuff import PlayStuffIE
from .playsuisse import PlaySuisseIE
from .playtvak import PlaytvakIE
from .playwire import PlaywireIE
@@ -1599,7 +1578,6 @@ from .raywenderlich import (
RayWenderlichIE,
RayWenderlichCourseIE,
)
-from .rbmaradio import RBMARadioIE
from .rbgtum import (
RbgTumIE,
RbgTumCourseIE,
@@ -1631,7 +1609,6 @@ from .redgifs import (
RedGifsUserIE,
)
from .redtube import RedTubeIE
-from .regiotv import RegioTVIE
from .rentv import (
RENTVIE,
RENTVArticleIE,
@@ -1739,7 +1716,6 @@ from .safari import (
from .saitosan import SaitosanIE
from .samplefocus import SampleFocusIE
from .sapo import SapoIE
-from .savefrom import SaveFromIE
from .sbs import SBSIE
from .sbscokr import (
SBSCoKrIE,
@@ -1759,7 +1735,6 @@ from .scte import (
SCTECourseIE,
)
from .scrolller import ScrolllerIE
-from .seeker import SeekerIE
from .sejmpl import SejmIE
from .senalcolombia import SenalColombiaLiveIE
from .senategov import SenateISVPIE, SenateGovIE
@@ -1902,7 +1877,6 @@ from .storyfire import (
)
from .streamable import StreamableIE
from .streamcz import StreamCZIE
-from .streamff import StreamFFIE
from .streetvoice import StreetVoiceIE
from .stretchinternet import StretchInternetIE
from .stripchat import StripchatIE
@@ -1931,7 +1905,6 @@ from .tbsjp import (
TBSJPProgramIE,
TBSJPPlaylistIE,
)
-from .tdslifeway import TDSLifewayIE
from .teachable import (
TeachableIE,
TeachableCourseIE,
diff --git a/yt_dlp/extractor/bleacherreport.py b/yt_dlp/extractor/bleacherreport.py
index 12630fb86..e875957cf 100644
--- a/yt_dlp/extractor/bleacherreport.py
+++ b/yt_dlp/extractor/bleacherreport.py
@@ -9,6 +9,7 @@ from ..utils import (
class BleacherReportIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?bleacherreport\.com/articles/(?P<id>\d+)'
_TESTS = [{
'url': 'http://bleacherreport.com/articles/2496438-fsu-stat-projections-is-jalen-ramsey-best-defensive-player-in-college-football',
@@ -83,6 +84,7 @@ class BleacherReportIE(InfoExtractor):
class BleacherReportCMSIE(AMPIE):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?bleacherreport\.com/video_embed\?id=(?P<id>[0-9a-f-]{36}|\d{5})'
_TESTS = [{
'url': 'http://bleacherreport.com/video_embed?id=8fd44c2f-3dc5-4821-9118-2c825a98c0e1&library=video-cms',
diff --git a/yt_dlp/extractor/cbs.py b/yt_dlp/extractor/cbs.py
index d97fbd758..cf830210f 100644
--- a/yt_dlp/extractor/cbs.py
+++ b/yt_dlp/extractor/cbs.py
@@ -76,6 +76,7 @@ class CBSBaseIE(ThePlatformFeedIE): # XXX: Do not subclass from concrete IE
class CBSIE(CBSBaseIE):
+ _WORKING = False
_VALID_URL = r'''(?x)
(?:
cbs:|
diff --git a/yt_dlp/extractor/cbsinteractive.py b/yt_dlp/extractor/cbsinteractive.py
deleted file mode 100644
index b09e9823e..000000000
--- a/yt_dlp/extractor/cbsinteractive.py
+++ /dev/null
@@ -1,98 +0,0 @@
-from .cbs import CBSIE
-from ..utils import int_or_none
-
-
-class CBSInteractiveIE(CBSIE): # XXX: Do not subclass from concrete IE
- _VALID_URL = r'https?://(?:www\.)?(?P<site>cnet|zdnet)\.com/(?:videos|video(?:/share)?)/(?P<id>[^/?]+)'
- _TESTS = [{
- 'url': 'http://www.cnet.com/videos/hands-on-with-microsofts-windows-8-1-update/',
- 'info_dict': {
- 'id': 'R49SYt__yAfmlXR85z4f7gNmCBDcN_00',
- 'display_id': 'hands-on-with-microsofts-windows-8-1-update',
- 'ext': 'mp4',
- 'title': 'Hands-on with Microsoft Windows 8.1 Update',
- 'description': 'The new update to the Windows 8 OS brings improved performance for mouse and keyboard users.',
- 'uploader_id': '6085384d-619e-11e3-b231-14feb5ca9861',
- 'uploader': 'Sarah Mitroff',
- 'duration': 70,
- 'timestamp': 1396479627,
- 'upload_date': '20140402',
- },
- 'params': {
- # m3u8 download
- 'skip_download': True,
- },
- }, {
- 'url': 'http://www.cnet.com/videos/whiny-pothole-tweets-at-local-government-when-hit-by-cars-tomorrow-daily-187/',
- 'md5': 'f11d27b2fa18597fbf92444d2a9ed386',
- 'info_dict': {
- 'id': 'kjOJd_OoVJqbg_ZD8MZCOk8Wekb9QccK',
- 'display_id': 'whiny-pothole-tweets-at-local-government-when-hit-by-cars-tomorrow-daily-187',
- 'ext': 'mp4',
- 'title': 'Whiny potholes tweet at local government when hit by cars (Tomorrow Daily 187)',
- 'description': 'md5:d2b9a95a5ffe978ae6fbd4cf944d618f',
- 'uploader_id': 'b163284d-6b73-44fc-b3e6-3da66c392d40',
- 'uploader': 'Ashley Esqueda',
- 'duration': 1482,
- 'timestamp': 1433289889,
- 'upload_date': '20150603',
- },
- }, {
- 'url': 'http://www.zdnet.com/video/share/video-keeping-android-smartphones-and-tablets-secure/',
- 'info_dict': {
- 'id': 'k0r4T_ehht4xW_hAOqiVQPuBDPZ8SRjt',
- 'display_id': 'video-keeping-android-smartphones-and-tablets-secure',
- 'ext': 'mp4',
- 'title': 'Video: Keeping Android smartphones and tablets secure',
- 'description': 'Here\'s the best way to keep Android devices secure, and what you do when they\'ve come to the end of their lives.',
- 'uploader_id': 'f2d97ea2-8175-11e2-9d12-0018fe8a00b0',
- 'uploader': 'Adrian Kingsley-Hughes',
- 'duration': 731,
- 'timestamp': 1449129925,
- 'upload_date': '20151203',
- },
- 'params': {
- # m3u8 download
- 'skip_download': True,
- },
- }, {
- 'url': 'http://www.zdnet.com/video/huawei-matebook-x-video/',
- 'only_matching': True,
- }]
-
- MPX_ACCOUNTS = {
- 'cnet': 2198311517,
- 'zdnet': 2387448114,
- }
-
- def _real_extract(self, url):
- site, display_id = self._match_valid_url(url).groups()
- webpage = self._download_webpage(url, display_id)
-
- data_json = self._html_search_regex(
- r"data(?:-(?:cnet|zdnet))?-video(?:-(?:uvp(?:js)?|player))?-options='([^']+)'",
- webpage, 'data json')
- data = self._parse_json(data_json, display_id)
- vdata = data.get('video') or (data.get('videos') or data.get('playlist'))[0]
-
- video_id = vdata['mpxRefId']
-
- title = vdata['title']
- author = vdata.get('author')
- if author:
- uploader = '%s %s' % (author['firstName'], author['lastName'])
- uploader_id = author.get('id')
- else:
- uploader = None
- uploader_id = None
-
- info = self._extract_video_info(video_id, site, self.MPX_ACCOUNTS[site])
- info.update({
- 'id': video_id,
- 'display_id': display_id,
- 'title': title,
- 'duration': int_or_none(vdata.get('duration')),
- 'uploader': uploader,
- 'uploader_id': uploader_id,
- })
- return info
diff --git a/yt_dlp/extractor/cbssports.py b/yt_dlp/extractor/cbssports.py
index b5d85af12..b9c82dab6 100644
--- a/yt_dlp/extractor/cbssports.py
+++ b/yt_dlp/extractor/cbssports.py
@@ -8,6 +8,7 @@ from ..utils import (
# class CBSSportsEmbedIE(CBSBaseIE):
class CBSSportsEmbedIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'cbssports:embed'
_VALID_URL = r'''(?ix)https?://(?:(?:www\.)?cbs|embed\.247)sports\.com/player/embed.+?
(?:
@@ -75,6 +76,7 @@ class CBSSportsBaseIE(InfoExtractor):
class CBSSportsIE(CBSSportsBaseIE):
+ _WORKING = False
IE_NAME = 'cbssports'
_VALID_URL = r'https?://(?:www\.)?cbssports\.com/[^/]+/video/(?P<id>[^/?#&]+)'
_TESTS = [{
@@ -92,6 +94,7 @@ class CBSSportsIE(CBSSportsBaseIE):
class TwentyFourSevenSportsIE(CBSSportsBaseIE):
+ _WORKING = False
IE_NAME = '247sports'
_VALID_URL = r'https?://(?:www\.)?247sports\.com/Video/(?:[^/?#&]+-)?(?P<id>\d+)'
_TESTS = [{
diff --git a/yt_dlp/extractor/chingari.py b/yt_dlp/extractor/chingari.py
deleted file mode 100644
index fd194482e..000000000
--- a/yt_dlp/extractor/chingari.py
+++ /dev/null
@@ -1,199 +0,0 @@
-import itertools
-import json
-import urllib.parse
-
-from .common import InfoExtractor
-from ..utils import (
- ExtractorError,
- clean_html,
- int_or_none,
- str_to_int,
- url_or_none,
-)
-
-
-class ChingariBaseIE(InfoExtractor):
- def _get_post(self, id, post_data):
- media_data = post_data['mediaLocation']
- base_url = media_data['base']
- author_data = post_data.get('authorData', {})
- song_data = post_data.get('song', {}) # revist this in future for differentiating b/w 'art' and 'author'
-
- formats = [{
- 'format_id': frmt,
- 'width': str_to_int(frmt[1:]),
- 'url': base_url + frmt_path,
- } for frmt, frmt_path in media_data.get('transcoded', {}).items()]
-
- if media_data.get('path'):
- formats.append({
- 'format_id': 'original',
- 'format_note': 'Direct video.',
- 'url': base_url + '/apipublic' + media_data['path'],
- 'quality': 10,
- })
- timestamp = str_to_int(post_data.get('created_at'))
- if timestamp:
- timestamp = int_or_none(timestamp, 1000)
-
- thumbnail, uploader_url = None, None
- if media_data.get('thumbnail'):
- thumbnail = base_url + media_data.get('thumbnail')
- if author_data.get('username'):
- uploader_url = 'https://chingari.io/' + author_data.get('username')
-
- return {
- 'id': id,
- 'extractor_key': ChingariIE.ie_key(),
- 'extractor': 'Chingari',
- 'title': urllib.parse.unquote_plus(clean_html(post_data.get('caption'))),
- 'description': urllib.parse.unquote_plus(clean_html(post_data.get('caption'))),
- 'duration': media_data.get('duration'),
- 'thumbnail': url_or_none(thumbnail),
- 'like_count': post_data.get('likeCount'),
- 'view_count': post_data.get('viewsCount'),
- 'comment_count': post_data.get('commentCount'),
- 'repost_count': post_data.get('shareCount'),
- 'timestamp': timestamp,
- 'uploader_id': post_data.get('userId') or author_data.get('_id'),
- 'uploader': author_data.get('name'),
- 'uploader_url': url_or_none(uploader_url),
- 'track': song_data.get('title'),
- 'artist': song_data.get('author'),
- 'formats': formats,
- }
-
-
-class ChingariIE(ChingariBaseIE):
- _VALID_URL = r'https?://(?:www\.)?chingari\.io/share/post\?id=(?P<id>[^&/#?]+)'
- _TESTS = [{
- 'url': 'https://chingari.io/share/post?id=612f8f4ce1dc57090e8a7beb',
- 'info_dict': {
- 'id': '612f8f4ce1dc57090e8a7beb',
- 'ext': 'mp4',
- 'title': 'Happy birthday Srila Prabhupada',
- 'description': 'md5:c7080ebfdfeb06016e638c286d6bc3fa',
- 'duration': 0,
- 'thumbnail': 'https://media.chingari.io/uploads/c41d30e2-06b6-4e3b-9b4b-edbb929cec06-1630506826911/thumbnail/198f993f-ce87-4623-82c6-cd071bd6d4f4-1630506828016.jpg',
- 'like_count': int,
- 'view_count': int,
- 'comment_count': int,
- 'repost_count': int,
- 'timestamp': 1630506828,
- 'upload_date': '20210901',
- 'uploader_id': '5f0403982c8bd344f4813f8c',
- 'uploader': 'ISKCON,Inc.',
- 'uploader_url': 'https://chingari.io/iskcon,inc',
- },
- 'params': {'skip_download': True}
- }]
-
- def _real_extract(self, url):
- id = self._match_id(url)
- post_json = self._download_json(f'https://api.chingari.io/post/post_details/{id}', id)
- if post_json['code'] != 200:
- raise ExtractorError(post_json['message'], expected=True)
- post_data = post_json['data']
- return self._get_post(id, post_data)
-
-
-class ChingariUserIE(ChingariBaseIE):
- _VALID_URL = r'https?://(?:www\.)?chingari\.io/(?!share/post)(?P<id>[^/?]+)'
- _TESTS = [{
- 'url': 'https://chingari.io/dada1023',
- 'info_dict': {
- 'id': 'dada1023',
- },
- 'params': {'playlistend': 3},
- 'playlist': [{
- 'url': 'https://chingari.io/share/post?id=614781f3ade60b3a0bfff42a',
- 'info_dict': {
- 'id': '614781f3ade60b3a0bfff42a',
- 'ext': 'mp4',
- 'title': '#chingaribappa ',
- 'description': 'md5:d1df21d84088770468fa63afe3b17857',
- 'duration': 7,
- 'thumbnail': 'https://media.chingari.io/uploads/346d86d4-abb2-474e-a164-ffccf2bbcb72-1632076273717/thumbnail/b0b3aac2-2b86-4dd1-909d-9ed6e57cf77c-1632076275552.jpg',
- 'like_count': int,
- 'view_count': int,
- 'comment_count': int,
- 'repost_count': int,
- 'timestamp': 1632076275,
- 'upload_date': '20210919',
- 'uploader_id': '5efc4b12cca35c3d1794c2d3',
- 'uploader': 'dada (girish) dhawale',
- 'uploader_url': 'https://chingari.io/dada1023',
- },
- 'params': {'skip_download': True}
- }, {
- 'url': 'https://chingari.io/share/post?id=6146b132bcbf860959e12cba',
- 'info_dict': {
- 'id': '6146b132bcbf860959e12cba',
- 'ext': 'mp4',
- 'title': 'Tactor harvesting',
- 'description': 'md5:8403f12dce68828b77ecee7eb7e887b7',
- 'duration': 59.3,
- 'thumbnail': 'https://media.chingari.io/uploads/b353ca70-7a87-400d-93a6-fa561afaec86-1632022814584/thumbnail/c09302e3-2043-41b1-a2fe-77d97e5bd676-1632022834260.jpg',
- 'like_count': int,
- 'view_count': int,
- 'comment_count': int,
- 'repost_count': int,
- 'timestamp': 1632022834,
- 'upload_date': '20210919',
- 'uploader_id': '5efc4b12cca35c3d1794c2d3',
- 'uploader': 'dada (girish) dhawale',
- 'uploader_url': 'https://chingari.io/dada1023',
- },
- 'params': {'skip_download': True}
- }, {
- 'url': 'https://chingari.io/share/post?id=6145651b74cb030a64c40b82',
- 'info_dict': {
- 'id': '6145651b74cb030a64c40b82',
- 'ext': 'mp4',
- 'title': '#odiabhajan ',
- 'description': 'md5:687ea36835b9276cf2af90f25e7654cb',
- 'duration': 56.67,
- 'thumbnail': 'https://media.chingari.io/uploads/6cbf216b-babc-4cce-87fe-ceaac8d706ac-1631937782708/thumbnail/8855754f-6669-48ce-b269-8cc0699ed6da-1631937819522.jpg',
- 'like_count': int,
- 'view_count': int,
- 'comment_count': int,
- 'repost_count': int,
- 'timestamp': 1631937819,
- 'upload_date': '20210918',
- 'uploader_id': '5efc4b12cca35c3d1794c2d3',
- 'uploader': 'dada (girish) dhawale',
- 'uploader_url': 'https://chingari.io/dada1023',
- },
- 'params': {'skip_download': True}
- }],
- }, {
- 'url': 'https://chingari.io/iskcon%2Cinc',
- 'playlist_mincount': 1025,
- 'info_dict': {
- 'id': 'iskcon%2Cinc',
- },
- }]
-
- def _entries(self, id):
- skip = 0
- has_more = True
- for page in itertools.count():
- posts = self._download_json('https://api.chingari.io/users/getPosts', id,
- data=json.dumps({'userId': id, 'ownerId': id, 'skip': skip, 'limit': 20}).encode(),
- headers={'content-type': 'application/json;charset=UTF-8'},
- note='Downloading page %s' % page)
- for post in posts.get('data', []):
- post_data = post['post']
- yield self._get_post(post_data['_id'], post_data)
- skip += 20
- has_more = posts['hasMoreData']
- if not has_more:
- break
-
- def _real_extract(self, url):
- alt_id = self._match_id(url)
- post_json = self._download_json(f'https://api.chingari.io/user/{alt_id}', alt_id)
- if post_json['code'] != 200:
- raise ExtractorError(post_json['message'], expected=True)
- id = post_json['data']['_id']
- return self.playlist_result(self._entries(id), playlist_id=alt_id)
diff --git a/yt_dlp/extractor/cinemax.py b/yt_dlp/extractor/cinemax.py
index 54cab2285..706ec8553 100644
--- a/yt_dlp/extractor/cinemax.py
+++ b/yt_dlp/extractor/cinemax.py
@@ -2,6 +2,7 @@ from .hbo import HBOBaseIE
class CinemaxIE(HBOBaseIE):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?cinemax\.com/(?P<path>[^/]+/video/[0-9a-z-]+-(?P<id>\d+))'
_TESTS = [{
'url': 'https://www.cinemax.com/warrior/video/s1-ep-1-recap-20126903',
diff --git a/yt_dlp/extractor/cliphunter.py b/yt_dlp/extractor/cliphunter.py
deleted file mode 100644
index 2b907dc80..000000000
--- a/yt_dlp/extractor/cliphunter.py
+++ /dev/null
@@ -1,76 +0,0 @@
-from .common import InfoExtractor
-from ..utils import (
- int_or_none,
- url_or_none,
-)
-
-
-class CliphunterIE(InfoExtractor):
- IE_NAME = 'cliphunter'
-
- _VALID_URL = r'''(?x)https?://(?:www\.)?cliphunter\.com/w/
- (?P<id>[0-9]+)/
- (?P<seo>.+?)(?:$|[#\?])
- '''
- _TESTS = [{
- 'url': 'http://www.cliphunter.com/w/1012420/Fun_Jynx_Maze_solo',
- 'md5': 'b7c9bbd4eb3a226ab91093714dcaa480',
- 'info_dict': {
- 'id': '1012420',
- 'ext': 'flv',
- 'title': 'Fun Jynx Maze solo',
- 'thumbnail': r're:^https?://.*\.jpg$',
- 'age_limit': 18,
- },
- 'skip': 'Video gone',
- }, {
- 'url': 'http://www.cliphunter.com/w/2019449/ShesNew__My_booty_girlfriend_Victoria_Paradices_pussy_filled_with_jizz',
- 'md5': '55a723c67bfc6da6b0cfa00d55da8a27',
- 'info_dict': {
- 'id': '2019449',
- 'ext': 'mp4',
- 'title': 'ShesNew - My booty girlfriend, Victoria Paradice\'s pussy filled with jizz',
- 'thumbnail': r're:^https?://.*\.jpg$',
- 'age_limit': 18,
- },
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
- webpage = self._download_webpage(url, video_id)
-
- video_title = self._search_regex(
- r'mediaTitle = "([^"]+)"', webpage, 'title')
-
- gexo_files = self._parse_json(
- self._search_regex(
- r'var\s+gexoFiles\s*=\s*({.+?});', webpage, 'gexo files'),
- video_id)
-
- formats = []
- for format_id, f in gexo_files.items():
- video_url = url_or_none(f.get('url'))
- if not video_url:
- continue
- fmt = f.get('fmt')
- height = f.get('h')
- format_id = '%s_%sp' % (fmt, height) if fmt and height else format_id
- formats.append({
- 'url': video_url,
- 'format_id': format_id,
- 'width': int_or_none(f.get('w')),
- 'height': int_or_none(height),
- 'tbr': int_or_none(f.get('br')),
- })
-
- thumbnail = self._search_regex(
- r"var\s+mov_thumb\s*=\s*'([^']+)';",
- webpage, 'thumbnail', fatal=False)
-
- return {
- 'id': video_id,
- 'title': video_title,
- 'formats': formats,
- 'age_limit': self._rta_search(webpage),
- 'thumbnail': thumbnail,
- }
diff --git a/yt_dlp/extractor/cliprs.py b/yt_dlp/extractor/cliprs.py
index 567f77b94..c2add02da 100644
--- a/yt_dlp/extractor/cliprs.py
+++ b/yt_dlp/extractor/cliprs.py
@@ -2,6 +2,7 @@ from .onet import OnetBaseIE
class ClipRsIE(OnetBaseIE):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?clip\.rs/(?P<id>[^/]+)/\d+'
_TEST = {
'url': 'http://www.clip.rs/premijera-frajle-predstavljaju-novi-spot-za-pesmu-moli-me-moli/3732',
diff --git a/yt_dlp/extractor/closertotruth.py b/yt_dlp/extractor/closertotruth.py
index e78e26a11..1f9a5f611 100644
--- a/yt_dlp/extractor/closertotruth.py
+++ b/yt_dlp/extractor/closertotruth.py
@@ -4,6 +4,7 @@ from .common import InfoExtractor
class CloserToTruthIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?closertotruth\.com/(?:[^/]+/)*(?P<id>[^/?#&]+)'
_TESTS = [{
'url': 'http://closertotruth.com/series/solutions-the-mind-body-problem#video-3688',
diff --git a/yt_dlp/extractor/digg.py b/yt_dlp/extractor/digg.py
deleted file mode 100644
index 86e8a6fac..000000000
--- a/yt_dlp/extractor/digg.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from .common import InfoExtractor
-from ..utils import js_to_json
-
-
-class DiggIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?digg\.com/video/(?P<id>[^/?#&]+)'
- _TESTS = [{
- # JWPlatform via provider
- 'url': 'http://digg.com/video/sci-fi-short-jonah-daniel-kaluuya-get-out',
- 'info_dict': {
- 'id': 'LcqvmS0b',
- 'ext': 'mp4',
- 'title': "'Get Out' Star Daniel Kaluuya Goes On 'Moby Dick'-Like Journey In Sci-Fi Short 'Jonah'",
- 'description': 'md5:541bb847648b6ee3d6514bc84b82efda',
- 'upload_date': '20180109',
- 'timestamp': 1515530551,
- },
- 'params': {
- 'skip_download': True,
- },
- }, {
- # Youtube via provider
- 'url': 'http://digg.com/video/dog-boat-seal-play',
- 'only_matching': True,
- }, {
- # vimeo as regular embed
- 'url': 'http://digg.com/video/dream-girl-short-film',
- 'only_matching': True,
- }]
-
- def _real_extract(self, url):
- display_id = self._match_id(url)
-
- webpage = self._download_webpage(url, display_id)
-
- info = self._parse_json(
- self._search_regex(
- r'(?s)video_info\s*=\s*({.+?});\n', webpage, 'video info',
- default='{}'), display_id, transform_source=js_to_json,
- fatal=False)
-
- video_id = info.get('video_id')
-
- if video_id:
- provider = info.get('provider_name')
- if provider == 'youtube':
- return self.url_result(
- video_id, ie='Youtube', video_id=video_id)
- elif provider == 'jwplayer':
- return self.url_result(
- 'jwplatform:%s' % video_id, ie='JWPlatform',
- video_id=video_id)
-
- return self.url_result(url, 'Generic')
diff --git a/yt_dlp/extractor/dtube.py b/yt_dlp/extractor/dtube.py
index 25a98f625..bb06c42be 100644
--- a/yt_dlp/extractor/dtube.py
+++ b/yt_dlp/extractor/dtube.py
@@ -9,6 +9,7 @@ from ..utils import (
class DTubeIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?d\.tube/(?:#!/)?v/(?P<uploader_id>[0-9a-z.-]+)/(?P<id>[0-9a-z]{8})'
_TEST = {
'url': 'https://d.tube/#!/v/broncnutz/x380jtr1',
diff --git a/yt_dlp/extractor/dw.py b/yt_dlp/extractor/dw.py
index 9c4a08e54..f7b852076 100644
--- a/yt_dlp/extractor/dw.py
+++ b/yt_dlp/extractor/dw.py
@@ -8,6 +8,8 @@ from ..compat import compat_urlparse
class DWIE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
IE_NAME = 'dw'
_VALID_URL = r'https?://(?:www\.)?dw\.com/(?:[^/]+/)+(?:av|e)-(?P<id>\d+)'
_TESTS = [{
@@ -82,6 +84,8 @@ class DWIE(InfoExtractor):
class DWArticleIE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
IE_NAME = 'dw:article'
_VALID_URL = r'https?://(?:www\.)?dw\.com/(?:[^/]+/)+a-(?P<id>\d+)'
_TEST = {
diff --git a/yt_dlp/extractor/europa.py b/yt_dlp/extractor/europa.py
index f3da95f5c..191a4361a 100644
--- a/yt_dlp/extractor/europa.py
+++ b/yt_dlp/extractor/europa.py
@@ -13,6 +13,7 @@ from ..utils import (
class EuropaIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://ec\.europa\.eu/avservices/(?:video/player|audio/audioDetails)\.cfm\?.*?\bref=(?P<id>[A-Za-z0-9-]+)'
_TESTS = [{
'url': 'http://ec.europa.eu/avservices/video/player.cfm?ref=I107758',
diff --git a/yt_dlp/extractor/fancode.py b/yt_dlp/extractor/fancode.py
index 1b5db818a..cddf25497 100644
--- a/yt_dlp/extractor/fancode.py
+++ b/yt_dlp/extractor/fancode.py
@@ -10,6 +10,7 @@ from ..utils import (
class FancodeVodIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'fancode:vod'
_VALID_URL = r'https?://(?:www\.)?fancode\.com/video/(?P<id>[0-9]+)\b'
@@ -126,6 +127,7 @@ class FancodeVodIE(InfoExtractor):
class FancodeLiveIE(FancodeVodIE): # XXX: Do not subclass from concrete IE
+ _WORKING = False
IE_NAME = 'fancode:live'
_VALID_URL = r'https?://(www\.)?fancode\.com/match/(?P<id>[0-9]+).+'
diff --git a/yt_dlp/extractor/filmmodu.py b/yt_dlp/extractor/filmmodu.py
deleted file mode 100644
index 1e793560d..000000000
--- a/yt_dlp/extractor/filmmodu.py
+++ /dev/null
@@ -1,69 +0,0 @@
-from .common import InfoExtractor
-from ..utils import int_or_none
-
-
-class FilmmoduIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?filmmodu\.org/(?P<id>[^/]+-(?:turkce-dublaj-izle|altyazili-izle))'
- _TESTS = [{
- 'url': 'https://www.filmmodu.org/f9-altyazili-izle',
- 'md5': 'aeefd955c2a508a5bdaa3bcec8eeb0d4',
- 'info_dict': {
- 'id': '10804',
- 'ext': 'mp4',
- 'title': 'F9',
- 'description': 'md5:2713f584a4d65afa2611e2948d0b953c',
- 'subtitles': {
- 'tr': [{
- 'ext': 'vtt',
- }],
- },
- 'thumbnail': r're:https://s[0-9]+.filmmodu.org/uploads/movie/cover/10804/xXHZeb1yhJvnSHPzZDqee0zfMb6.jpg',
- },
- }, {
- 'url': 'https://www.filmmodu.org/the-godfather-turkce-dublaj-izle',
- 'md5': '109f2fcb9c941330eed133971c035c00',
- 'info_dict': {
- 'id': '3646',
- 'ext': 'mp4',
- 'title': 'Baba',
- 'description': 'md5:d43fd651937cd75cc650883ebd8d8461',
- 'thumbnail': r're:https://s[0-9]+.filmmodu.org/uploads/movie/cover/3646/6xKCYgH16UuwEGAyroLU6p8HLIn.jpg',
- },
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
- webpage = self._download_webpage(url, video_id)
- title = self._og_search_title(webpage, fatal=True)
- description = self._og_search_description(webpage)
- thumbnail = self._og_search_thumbnail(webpage)
- real_video_id = self._search_regex(r'var\s*videoId\s*=\s*\'([0-9]+)\'', webpage, 'video_id')
- video_type = self._search_regex(r'var\s*videoType\s*=\s*\'([a-z]+)\'', webpage, 'video_type')
- data = self._download_json('https://www.filmmodu.org/get-source', real_video_id, query={
- 'movie_id': real_video_id,
- 'type': video_type,
- })
- formats = [{
- 'url': source['src'],
- 'ext': 'mp4',
- 'format_id': source['label'],
- 'height': int_or_none(source.get('res')),
- 'protocol': 'm3u8_native',
- } for source in data['sources']]
-
- subtitles = {}
-
- if data.get('subtitle'):
- subtitles['tr'] = [{
- 'url': data['subtitle'],
- }]
-
- return {
- 'id': real_video_id,
- 'display_id': video_id,
- 'title': title,
- 'description': description,
- 'formats': formats,
- 'subtitles': subtitles,
- 'thumbnail': thumbnail,
- }
diff --git a/yt_dlp/extractor/gameinformer.py b/yt_dlp/extractor/gameinformer.py
deleted file mode 100644
index 2664edb81..000000000
--- a/yt_dlp/extractor/gameinformer.py
+++ /dev/null
@@ -1,46 +0,0 @@
-from .brightcove import BrightcoveNewIE
-from .common import InfoExtractor
-from ..utils import (
- clean_html,
- get_element_by_class,
- get_element_by_id,
-)
-
-
-class GameInformerIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?gameinformer\.com/(?:[^/]+/)*(?P<id>[^.?&#]+)'
- _TESTS = [{
- # normal Brightcove embed code extracted with BrightcoveNewIE._extract_url
- 'url': 'http://www.gameinformer.com/b/features/archive/2015/09/26/replay-animal-crossing.aspx',
- 'md5': '292f26da1ab4beb4c9099f1304d2b071',
- 'info_dict': {
- 'id': '4515472681001',
- 'ext': 'mp4',
- 'title': 'Replay - Animal Crossing',
- 'description': 'md5:2e211891b215c85d061adc7a4dd2d930',
- 'timestamp': 1443457610,
- 'upload_date': '20150928',
- 'uploader_id': '694940074001',
- },
- }, {
- # Brightcove id inside unique element with field--name-field-brightcove-video-id class
- 'url': 'https://www.gameinformer.com/video-feature/new-gameplay-today/2019/07/09/new-gameplay-today-streets-of-rogue',
- 'info_dict': {
- 'id': '6057111913001',
- 'ext': 'mp4',
- 'title': 'New Gameplay Today – Streets Of Rogue',
- 'timestamp': 1562699001,
- 'upload_date': '20190709',
- 'uploader_id': '694940074001',
-
- },
- }]
- BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/694940074001/default_default/index.html?videoId=%s'
-
- def _real_extract(self, url):
- display_id = self._match_id(url)
- webpage = self._download_webpage(
- url, display_id, headers=self.geo_verification_headers())
- brightcove_id = clean_html(get_element_by_class('field--name-field-brightcove-video-id', webpage) or get_element_by_id('video-source-content', webpage))
- brightcove_url = self.BRIGHTCOVE_URL_TEMPLATE % brightcove_id if brightcove_id else BrightcoveNewIE._extract_url(self, webpage)
- return self.url_result(brightcove_url, 'BrightcoveNew', brightcove_id)
diff --git a/yt_dlp/extractor/gazeta.py b/yt_dlp/extractor/gazeta.py
index c6868a672..8925b69fd 100644
--- a/yt_dlp/extractor/gazeta.py
+++ b/yt_dlp/extractor/gazeta.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class GazetaIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'(?P<url>https?://(?:www\.)?gazeta\.ru/(?:[^/]+/)?video/(?:main/)*(?:\d{4}/\d{2}/\d{2}/)?(?P<id>[A-Za-z0-9-_.]+)\.s?html)'
_TESTS = [{
'url': 'http://www.gazeta.ru/video/main/zadaite_vopros_vladislavu_yurevichu.shtml',
diff --git a/yt_dlp/extractor/gdcvault.py b/yt_dlp/extractor/gdcvault.py
index 4265feb61..b4d81b2e8 100644
--- a/yt_dlp/extractor/gdcvault.py
+++ b/yt_dlp/extractor/gdcvault.py
@@ -7,6 +7,7 @@ from ..utils import remove_start, smuggle_url, urlencode_postdata
class GDCVaultIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?gdcvault\.com/play/(?P<id>\d+)(?:/(?P<name>[\w-]+))?'
_NETRC_MACHINE = 'gdcvault'
_TESTS = [
diff --git a/yt_dlp/extractor/giga.py b/yt_dlp/extractor/giga.py
deleted file mode 100644
index b59c129ab..000000000
--- a/yt_dlp/extractor/giga.py
+++ /dev/null
@@ -1,93 +0,0 @@
-import itertools
-
-from .common import InfoExtractor
-from ..compat import compat_str
-from ..utils import parse_duration, parse_iso8601, qualities, str_to_int
-
-
-class GigaIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?giga\.de/(?:[^/]+/)*(?P<id>[^/]+)'
- _TESTS = [{
- 'url': 'http://www.giga.de/filme/anime-awesome/trailer/anime-awesome-chihiros-reise-ins-zauberland-das-beste-kommt-zum-schluss/',
- 'md5': '6bc5535e945e724640664632055a584f',
- 'info_dict': {
- 'id': '2622086',
- 'display_id': 'anime-awesome-chihiros-reise-ins-zauberland-das-beste-kommt-zum-schluss',
- 'ext': 'mp4',
- 'title': 'Anime Awesome: Chihiros Reise ins Zauberland – Das Beste kommt zum Schluss',
- 'description': 'md5:afdf5862241aded4718a30dff6a57baf',
- 'thumbnail': r're:^https?://.*\.jpg$',
- 'duration': 578,
- 'timestamp': 1414749706,
- 'upload_date': '20141031',
- 'uploader': 'Robin Schweiger',
- 'view_count': int,
- },
- }, {
- 'url': 'http://www.giga.de/games/channel/giga-top-montag/giga-topmontag-die-besten-serien-2014/',
- 'only_matching': True,
- }, {
- 'url': 'http://www.giga.de/extra/netzkultur/videos/giga-games-tom-mats-robin-werden-eigene-wege-gehen-eine-ankuendigung/',
- 'only_matching': True,
- }, {
- 'url': 'http://www.giga.de/tv/jonas-liest-spieletitel-eingedeutscht-episode-2/',
- 'only_matching': True,
- }]
-
- def _real_extract(self, url):
- display_id = self._match_id(url)
-
- webpage = self._download_webpage(url, display_id)
-
- video_id = self._search_regex(
- [r'data-video-id="(\d+)"', r'/api/video/jwplayer/#v=(\d+)'],
- webpage, 'video id')
-
- playlist = self._download_json(
- 'http://www.giga.de/api/syndication/video/video_id/%s/playlist.json?content=syndication/key/368b5f151da4ae05ced7fa296bdff65a/'
- % video_id, video_id)[0]
-
- quality = qualities(['normal', 'hd720'])
-
- formats = []
- for format_id in itertools.count(0):
- fmt = playlist.get(compat_str(format_id))
- if not fmt:
- break
- formats.append({
- 'url': fmt['src'],
- 'format_id': '%s-%s' % (fmt['quality'], fmt['type'].split('/')[-1]),
- 'quality': quality(fmt['quality']),
- })
-
- title = self._html_search_meta(
- 'title', webpage, 'title', fatal=True)
- description = self._html_search_meta(
- 'description', webpage, 'description')
- thumbnail = self._og_search_thumbnail(webpage)
-
- duration = parse_duration(self._search_regex(
- r'(?s)(?:data-video-id="{0}"|data-video="[^"]*/api/video/jwplayer/#v={0}[^"]*")[^>]*>.+?<span class="duration">([^<]+)</span>'.format(video_id),
- webpage, 'duration', fatal=False))
-
- timestamp = parse_iso8601(self._search_regex(
- r'datetime="([^"]+)"', webpage, 'upload date', fatal=False))
- uploader = self._search_regex(
- r'class="author">([^<]+)</a>', webpage, 'uploader', fatal=False)
-
- view_count = str_to_int(self._search_regex(
- r'<span class="views"><strong>([\d.,]+)</strong>',
- webpage, 'view count', fatal=False))
-
- return {
- 'id': video_id,
- 'display_id': display_id,
- 'title': title,
- 'description': description,
- 'thumbnail': thumbnail,
- 'duration': duration,
- 'timestamp': timestamp,
- 'uploader': uploader,
- 'view_count': view_count,
- 'formats': formats,
- }
diff --git a/yt_dlp/extractor/godtube.py b/yt_dlp/extractor/godtube.py
index 697540155..35fb7a9c9 100644
--- a/yt_dlp/extractor/godtube.py
+++ b/yt_dlp/extractor/godtube.py
@@ -6,6 +6,7 @@ from ..utils import (
class GodTubeIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?godtube\.com/watch/\?v=(?P<id>[\da-zA-Z]+)'
_TESTS = [
{
diff --git a/yt_dlp/extractor/hotnewhiphop.py b/yt_dlp/extractor/hotnewhiphop.py
index 3007fbb53..4f506cde7 100644
--- a/yt_dlp/extractor/hotnewhiphop.py
+++ b/yt_dlp/extractor/hotnewhiphop.py
@@ -5,6 +5,7 @@ from ..utils import ExtractorError, urlencode_postdata
class HotNewHipHopIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?hotnewhiphop\.com/.*\.(?P<id>.*)\.html'
_TEST = {
'url': 'http://www.hotnewhiphop.com/freddie-gibbs-lay-it-down-song.1435540.html',
diff --git a/yt_dlp/extractor/instagram.py b/yt_dlp/extractor/instagram.py
index dbaa332c2..f7f21505e 100644
--- a/yt_dlp/extractor/instagram.py
+++ b/yt_dlp/extractor/instagram.py
@@ -617,6 +617,7 @@ class InstagramPlaylistBaseIE(InstagramBaseIE):
class InstagramUserIE(InstagramPlaylistBaseIE):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?instagram\.com/(?P<id>[^/]{2,})/?(?:$|[?#])'
IE_DESC = 'Instagram user profile'
IE_NAME = 'instagram:user'
diff --git a/yt_dlp/extractor/jeuxvideo.py b/yt_dlp/extractor/jeuxvideo.py
index 56ea15cf9..793820600 100644
--- a/yt_dlp/extractor/jeuxvideo.py
+++ b/yt_dlp/extractor/jeuxvideo.py
@@ -2,6 +2,8 @@ from .common import InfoExtractor
class JeuxVideoIE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
_VALID_URL = r'https?://.*?\.jeuxvideo\.com/.*/(.*?)\.htm'
_TESTS = [{
diff --git a/yt_dlp/extractor/kanal2.py b/yt_dlp/extractor/kanal2.py
deleted file mode 100644
index 3c0efe598..000000000
--- a/yt_dlp/extractor/kanal2.py
+++ /dev/null
@@ -1,66 +0,0 @@
-from .common import InfoExtractor
-from ..utils import (
- ExtractorError,
- join_nonempty,
- traverse_obj,
- unified_timestamp,
- update_url_query,
-)
-
-
-class Kanal2IE(InfoExtractor):
- _VALID_URL = r'https?://kanal2\.postimees\.ee/[^?#]+\?([^#]+&)?id=(?P<id>\d+)'
- _TESTS = [{
- 'note': 'Test standard url (#5575)',
- 'url': 'https://kanal2.postimees.ee/pluss/video/?id=40792',
- 'md5': '7ea7b16266ec1798743777df241883dd',
- 'info_dict': {
- 'id': '40792',
- 'ext': 'mp4',
- 'title': 'Aedniku aabits / Osa 53 (05.08.2016 20:00)',
- 'thumbnail': r're:https?://.*\.jpg$',
- 'description': 'md5:53cabf3c5d73150d594747f727431248',
- 'upload_date': '20160805',
- 'timestamp': 1470420000,
- },
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
- playlist = self._download_json(
- f'https://kanal2.postimees.ee/player/playlist/{video_id}',
- video_id, query={'type': 'episodes'},
- headers={'X-Requested-With': 'XMLHttpRequest'})
-
- return {
- 'id': video_id,
- 'title': join_nonempty(*traverse_obj(playlist, ('info', ('title', 'subtitle'))), delim=' / '),
- 'description': traverse_obj(playlist, ('info', 'description')),
- 'thumbnail': traverse_obj(playlist, ('data', 'image')),
- 'formats': self.get_formats(playlist, video_id),
- 'timestamp': unified_timestamp(self._search_regex(
- r'\((\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2})\)$',
- traverse_obj(playlist, ('info', 'subtitle')), 'timestamp', default='') + ' +0200'),
- }
-
- def get_formats(self, playlist, video_id):
- path = traverse_obj(playlist, ('data', 'path'))
- if not path:
- raise ExtractorError('Path value not found in playlist JSON response')
- session = self._download_json(
- 'https://sts.postimees.ee/session/register',
- video_id, note='Creating session', errnote='Error creating session',
- headers={
- 'X-Original-URI': path,
- 'Accept': 'application/json',
- })
- if session.get('reason') != 'OK' or not session.get('session'):
- reason = session.get('reason', 'unknown error')
- raise ExtractorError(f'Unable to obtain session: {reason}')
-
- formats = []
- for stream in traverse_obj(playlist, ('data', 'streams', ..., 'file')):
- formats.extend(self._extract_m3u8_formats(
- update_url_query(stream, {'s': session['session']}), video_id, 'mp4'))
-
- return formats
diff --git a/yt_dlp/extractor/kankanews.py b/yt_dlp/extractor/kankanews.py
index 46e239bd6..8f247b305 100644
--- a/yt_dlp/extractor/kankanews.py
+++ b/yt_dlp/extractor/kankanews.py
@@ -8,6 +8,7 @@ from .common import InfoExtractor
class KankaNewsIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?kankanews\.com/a/\d+\-\d+\-\d+/(?P<id>\d+)\.shtml'
_TESTS = [{
'url': 'https://www.kankanews.com/a/2022-11-08/00310276054.shtml?appid=1088227',
diff --git a/yt_dlp/extractor/karrierevideos.py b/yt_dlp/extractor/karrierevideos.py
deleted file mode 100644
index 28d4841aa..000000000
--- a/yt_dlp/extractor/karrierevideos.py
+++ /dev/null
@@ -1,96 +0,0 @@
-from .common import InfoExtractor
-from ..compat import compat_urlparse
-from ..utils import (
- fix_xml_ampersands,
- float_or_none,
- xpath_with_ns,
- xpath_text,
-)
-
-
-class KarriereVideosIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?karrierevideos\.at(?:/[^/]+)+/(?P<id>[^/]+)'
- _TESTS = [{
- 'url': 'http://www.karrierevideos.at/berufsvideos/mittlere-hoehere-schulen/altenpflegerin',
- 'info_dict': {
- 'id': '32c91',
- 'ext': 'flv',
- 'title': 'AltenpflegerIn',
- 'description': 'md5:dbadd1259fde2159a9b28667cb664ae2',
- 'thumbnail': r're:^http://.*\.png',
- },
- 'params': {
- # rtmp download
- 'skip_download': True,
- }
- }, {
- # broken ampersands
- 'url': 'http://www.karrierevideos.at/orientierung/vaeterkarenz-und-neue-chancen-fuer-muetter-baby-was-nun',
- 'info_dict': {
- 'id': '5sniu',
- 'ext': 'flv',
- 'title': 'Väterkarenz und neue Chancen für Mütter - "Baby - was nun?"',
- 'description': 'md5:97092c6ad1fd7d38e9d6a5fdeb2bcc33',
- 'thumbnail': r're:^http://.*\.png',
- },
- 'params': {
- # rtmp download
- 'skip_download': True,
- }
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
-
- webpage = self._download_webpage(url, video_id)
-
- title = (self._html_search_meta('title', webpage, default=None)
- or self._search_regex(r'<h1 class="title">([^<]+)</h1>', webpage, 'video title'))
-
- video_id = self._search_regex(
- r'/config/video/(.+?)\.xml', webpage, 'video id')
- # Server returns malformed headers
- # Force Accept-Encoding: * to prevent gzipped results
- playlist = self._download_xml(
- 'http://www.karrierevideos.at/player-playlist.xml.php?p=%s' % video_id,
- video_id, transform_source=fix_xml_ampersands,
- headers={'Accept-Encoding': '*'})
-
- NS_MAP = {
- 'jwplayer': 'http://developer.longtailvideo.com/trac/wiki/FlashFormats'
- }
-
- def ns(path):
- return xpath_with_ns(path, NS_MAP)
-
- item = playlist.find('./tracklist/item')
- video_file = xpath_text(
- item, ns('./jwplayer:file'), 'video url', fatal=True)
- streamer = xpath_text(
- item, ns('./jwplayer:streamer'), 'streamer', fatal=True)
-
- uploader = xpath_text(
- item, ns('./jwplayer:author'), 'uploader')
- duration = float_or_none(
- xpath_text(item, ns('./jwplayer:duration'), 'duration'))
-
- description = self._html_search_regex(
- r'(?s)<div class="leadtext">(.+?)</div>',
- webpage, 'description')
-
- thumbnail = self._html_search_meta(
- 'thumbnail', webpage, 'thumbnail')
- if thumbnail:
- thumbnail = compat_urlparse.urljoin(url, thumbnail)
-
- return {
- 'id': video_id,
- 'url': streamer.replace('rtmpt', 'rtmp'),
- 'play_path': 'mp4:%s' % video_file,
- 'ext': 'flv',
- 'title': title,
- 'description': description,
- 'thumbnail': thumbnail,
- 'uploader': uploader,
- 'duration': duration,
- }
diff --git a/yt_dlp/extractor/kelbyone.py b/yt_dlp/extractor/kelbyone.py
index 2ca9ad426..bba527e29 100644
--- a/yt_dlp/extractor/kelbyone.py
+++ b/yt_dlp/extractor/kelbyone.py
@@ -3,6 +3,7 @@ from ..utils import int_or_none
class KelbyOneIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://members\.kelbyone\.com/course/(?P<id>[^$&?#/]+)'
_TESTS = [{
diff --git a/yt_dlp/extractor/konserthusetplay.py b/yt_dlp/extractor/konserthusetplay.py
deleted file mode 100644
index 10767f1b6..000000000
--- a/yt_dlp/extractor/konserthusetplay.py
+++ /dev/null
@@ -1,119 +0,0 @@
-from .common import InfoExtractor
-from ..utils import (
- determine_ext,
- float_or_none,
- int_or_none,
- url_or_none,
-)
-
-
-class KonserthusetPlayIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?(?:konserthusetplay|rspoplay)\.se/\?.*\bm=(?P<id>[^&]+)'
- _TESTS = [{
- 'url': 'http://www.konserthusetplay.se/?m=CKDDnlCY-dhWAAqiMERd-A',
- 'md5': 'e3fd47bf44e864bd23c08e487abe1967',
- 'info_dict': {
- 'id': 'CKDDnlCY-dhWAAqiMERd-A',
- 'ext': 'mp4',
- 'title': 'Orkesterns instrument: Valthornen',
- 'description': 'md5:f10e1f0030202020396a4d712d2fa827',
- 'thumbnail': 're:^https?://.*$',
- 'duration': 398.76,
- },
- }, {
- 'url': 'http://rspoplay.se/?m=elWuEH34SMKvaO4wO_cHBw',
- 'only_matching': True,
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
-
- webpage = self._download_webpage(url, video_id)
-
- e = self._search_regex(
- r'https?://csp\.picsearch\.com/rest\?.*\be=(.+?)[&"\']', webpage, 'e')
-
- rest = self._download_json(
- 'http://csp.picsearch.com/rest?e=%s&containerId=mediaplayer&i=object' % e,
- video_id, transform_source=lambda s: s[s.index('{'):s.rindex('}') + 1])
-
- media = rest['media']
- player_config = media['playerconfig']
- playlist = player_config['playlist']
-
- source = next(f for f in playlist if f.get('bitrates') or f.get('provider'))
-
- FORMAT_ID_REGEX = r'_([^_]+)_h264m\.mp4'
-
- formats = []
-
- m3u8_url = source.get('url')
- if m3u8_url and determine_ext(m3u8_url) == 'm3u8':
- formats.extend(self._extract_m3u8_formats(
- m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native',
- m3u8_id='hls', fatal=False))
-
- fallback_url = source.get('fallbackUrl')
- fallback_format_id = None
- if fallback_url:
- fallback_format_id = self._search_regex(
- FORMAT_ID_REGEX, fallback_url, 'format id', default=None)
-
- connection_url = (player_config.get('rtmp', {}).get(
- 'netConnectionUrl') or player_config.get(
- 'plugins', {}).get('bwcheck', {}).get('netConnectionUrl'))
- if connection_url:
- for f in source['bitrates']:
- video_url = f.get('url')
- if not video_url:
- continue
- format_id = self._search_regex(
- FORMAT_ID_REGEX, video_url, 'format id', default=None)
- f_common = {
- 'vbr': int_or_none(f.get('bitrate')),
- 'width': int_or_none(f.get('width')),
- 'height': int_or_none(f.get('height')),
- }
- f = f_common.copy()
- f.update({
- 'url': connection_url,
- 'play_path': video_url,
- 'format_id': 'rtmp-%s' % format_id if format_id else 'rtmp',
- 'ext': 'flv',
- })
- formats.append(f)
- if format_id and format_id == fallback_format_id:
- f = f_common.copy()
- f.update({
- 'url': fallback_url,
- 'format_id': 'http-%s' % format_id if format_id else 'http',
- })
- formats.append(f)
-
- if not formats and fallback_url:
- formats.append({
- 'url': fallback_url,
- })
-
- title = player_config.get('title') or media['title']
- description = player_config.get('mediaInfo', {}).get('description')
- thumbnail = media.get('image')
- duration = float_or_none(media.get('duration'), 1000)
-
- subtitles = {}
- captions = source.get('captionsAvailableLanguages')
- if isinstance(captions, dict):
- for lang, subtitle_url in captions.items():
- subtitle_url = url_or_none(subtitle_url)
- if lang != 'none' and subtitle_url:
- subtitles.setdefault(lang, []).append({'url': subtitle_url})
-
- return {
- 'id': video_id,
- 'title': title,
- 'description': description,
- 'thumbnail': thumbnail,
- 'duration': duration,
- 'formats': formats,
- 'subtitles': subtitles,
- }
diff --git a/yt_dlp/extractor/koo.py b/yt_dlp/extractor/koo.py
index 9cfec5eb9..c78a7b9ca 100644
--- a/yt_dlp/extractor/koo.py
+++ b/yt_dlp/extractor/koo.py
@@ -6,6 +6,7 @@ from ..utils import (
class KooIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?kooapp\.com/koo/[^/]+/(?P<id>[^/&#$?]+)'
_TESTS = [{ # Test for video in the comments
'url': 'https://www.kooapp.com/koo/ytdlpTestAccount/946c4189-bc2d-4524-b95b-43f641e2adde',
diff --git a/yt_dlp/extractor/krasview.py b/yt_dlp/extractor/krasview.py
index 4323aa429..0febf759b 100644
--- a/yt_dlp/extractor/krasview.py
+++ b/yt_dlp/extractor/krasview.py
@@ -8,6 +8,7 @@ from ..utils import (
class KrasViewIE(InfoExtractor):
+ _WORKING = False
IE_DESC = 'Красвью'
_VALID_URL = r'https?://krasview\.ru/(?:video|embed)/(?P<id>\d+)'
diff --git a/yt_dlp/extractor/kusi.py b/yt_dlp/extractor/kusi.py
deleted file mode 100644
index a23ad8945..000000000
--- a/yt_dlp/extractor/kusi.py
+++ /dev/null
@@ -1,83 +0,0 @@
-import random
-import urllib.parse
-
-from .common import InfoExtractor
-from ..utils import (
- float_or_none,
- int_or_none,
- timeconvert,
- update_url_query,
- xpath_text,
-)
-
-
-class KUSIIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?kusi\.com/(?P<path>story/.+|video\?clipId=(?P<clipId>\d+))'
- _TESTS = [{
- 'url': 'http://www.kusi.com/story/32849881/turko-files-refused-to-help-it-aint-right',
- 'md5': '4e76ce8e53660ce9697d06c0ba6fc47d',
- 'info_dict': {
- 'id': '12689020',
- 'ext': 'mp4',
- 'title': "Turko Files: Refused to Help, It Ain't Right!",
- 'duration': 223.586,
- 'upload_date': '20160826',
- 'timestamp': 1472233118,
- 'thumbnail': r're:^https?://.*\.jpg$'
- },
- }, {
- 'url': 'http://kusi.com/video?clipId=12203019',
- 'only_matching': True,
- }]
-
- def _real_extract(self, url):
- mobj = self._match_valid_url(url)
- clip_id = mobj.group('clipId')
- video_id = clip_id or mobj.group('path')
-
- webpage = self._download_webpage(url, video_id)
-
- if clip_id is None:
- video_id = clip_id = self._html_search_regex(
- r'"clipId"\s*,\s*"(\d+)"', webpage, 'clip id')
-
- affiliate_id = self._search_regex(
- r'affiliateId\s*:\s*\'([^\']+)\'', webpage, 'affiliate id')
-
- # See __Packages/worldnow/model/GalleryModel.as of WNGallery.swf
- xml_url = update_url_query('http://www.kusi.com/build.asp', {
- 'buildtype': 'buildfeaturexmlrequest',
- 'featureType': 'Clip',
- 'featureid': clip_id,
- 'affiliateno': affiliate_id,
- 'clientgroupid': '1',
- 'rnd': int(round(random.random() * 1000000)),
- })
-
- doc = self._download_xml(xml_url, video_id)
-
- video_title = xpath_text(doc, 'HEADLINE', fatal=True)
- duration = float_or_none(xpath_text(doc, 'DURATION'), scale=1000)
- description = xpath_text(doc, 'ABSTRACT')
- thumbnail = xpath_text(doc, './THUMBNAILIMAGE/FILENAME')
- creation_time = timeconvert(xpath_text(doc, 'rfc822creationdate'))
-
- quality_options = doc.find('{http://search.yahoo.com/mrss/}group').findall('{http://search.yahoo.com/mrss/}content')
- formats = []
- for quality in quality_options:
- formats.append({
- 'url': urllib.parse.unquote_plus(quality.attrib['url']),
- 'height': int_or_none(quality.attrib.get('height')),
- 'width': int_or_none(quality.attrib.get('width')),
- 'vbr': float_or_none(quality.attrib.get('bitratebits'), scale=1000),
- })
-
- return {
- 'id': video_id,
- 'title': video_title,
- 'description': description,
- 'duration': duration,
- 'formats': formats,
- 'thumbnail': thumbnail,
- 'timestamp': creation_time,
- }
diff --git a/yt_dlp/extractor/kuwo.py b/yt_dlp/extractor/kuwo.py
index e8a061a10..3c93dedac 100644
--- a/yt_dlp/extractor/kuwo.py
+++ b/yt_dlp/extractor/kuwo.py
@@ -54,6 +54,7 @@ class KuwoBaseIE(InfoExtractor):
class KuwoIE(KuwoBaseIE):
+ _WORKING = False
IE_NAME = 'kuwo:song'
IE_DESC = '酷我音乐'
_VALID_URL = r'https?://(?:www\.)?kuwo\.cn/yinyue/(?P<id>\d+)'
@@ -133,6 +134,7 @@ class KuwoIE(KuwoBaseIE):
class KuwoAlbumIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'kuwo:album'
IE_DESC = '酷我音乐 - 专辑'
_VALID_URL = r'https?://(?:www\.)?kuwo\.cn/album/(?P<id>\d+?)/'
@@ -169,6 +171,7 @@ class KuwoAlbumIE(InfoExtractor):
class KuwoChartIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'kuwo:chart'
IE_DESC = '酷我音乐 - 排行榜'
_VALID_URL = r'https?://yinyue\.kuwo\.cn/billboard_(?P<id>[^.]+).htm'
@@ -194,6 +197,7 @@ class KuwoChartIE(InfoExtractor):
class KuwoSingerIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'kuwo:singer'
IE_DESC = '酷我音乐 - 歌手'
_VALID_URL = r'https?://(?:www\.)?kuwo\.cn/mingxing/(?P<id>[^/]+)'
@@ -251,6 +255,7 @@ class KuwoSingerIE(InfoExtractor):
class KuwoCategoryIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'kuwo:category'
IE_DESC = '酷我音乐 - 分类'
_VALID_URL = r'https?://yinyue\.kuwo\.cn/yy/cinfo_(?P<id>\d+?).htm'
@@ -290,6 +295,7 @@ class KuwoCategoryIE(InfoExtractor):
class KuwoMvIE(KuwoBaseIE):
+ _WORKING = False
IE_NAME = 'kuwo:mv'
IE_DESC = '酷我音乐 - MV'
_VALID_URL = r'https?://(?:www\.)?kuwo\.cn/mv/(?P<id>\d+?)/'
diff --git a/yt_dlp/extractor/lecture2go.py b/yt_dlp/extractor/lecture2go.py
index 3a9b30a3c..10fb5d479 100644
--- a/yt_dlp/extractor/lecture2go.py
+++ b/yt_dlp/extractor/lecture2go.py
@@ -10,6 +10,7 @@ from ..utils import (
class Lecture2GoIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://lecture2go\.uni-hamburg\.de/veranstaltungen/-/v/(?P<id>\d+)'
_TEST = {
'url': 'https://lecture2go.uni-hamburg.de/veranstaltungen/-/v/17473',
diff --git a/yt_dlp/extractor/lenta.py b/yt_dlp/extractor/lenta.py
index 10aac984e..fe01bda1c 100644
--- a/yt_dlp/extractor/lenta.py
+++ b/yt_dlp/extractor/lenta.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class LentaIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?lenta\.ru/[^/]+/\d+/\d+/\d+/(?P<id>[^/?#&]+)'
_TESTS = [{
'url': 'https://lenta.ru/news/2018/03/22/savshenko_go/',
diff --git a/yt_dlp/extractor/localnews8.py b/yt_dlp/extractor/localnews8.py
deleted file mode 100644
index 6f3f02c70..000000000
--- a/yt_dlp/extractor/localnews8.py
+++ /dev/null
@@ -1,42 +0,0 @@
-from .common import InfoExtractor
-
-
-class LocalNews8IE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?localnews8\.com/(?:[^/]+/)*(?P<display_id>[^/]+)/(?P<id>[0-9]+)'
- _TEST = {
- 'url': 'http://www.localnews8.com/news/rexburg-business-turns-carbon-fiber-scraps-into-wedding-rings/35183304',
- 'md5': 'be4d48aea61aa2bde7be2ee47691ad20',
- 'info_dict': {
- 'id': '35183304',
- 'display_id': 'rexburg-business-turns-carbon-fiber-scraps-into-wedding-rings',
- 'ext': 'mp4',
- 'title': 'Rexburg business turns carbon fiber scraps into wedding ring',
- 'description': 'The process was first invented by Lamborghini and less than a dozen companies around the world use it.',
- 'duration': 153,
- 'timestamp': 1441844822,
- 'upload_date': '20150910',
- 'uploader_id': 'api',
- }
- }
-
- def _real_extract(self, url):
- mobj = self._match_valid_url(url)
- video_id = mobj.group('id')
- display_id = mobj.group('display_id')
-
- webpage = self._download_webpage(url, display_id)
-
- partner_id = self._search_regex(
- r'partnerId\s*[:=]\s*(["\'])(?P<id>\d+)\1',
- webpage, 'partner id', group='id')
- kaltura_id = self._search_regex(
- r'videoIdString\s*[:=]\s*(["\'])kaltura:(?P<id>[0-9a-z_]+)\1',
- webpage, 'videl id', group='id')
-
- return {
- '_type': 'url_transparent',
- 'url': 'kaltura:%s:%s' % (partner_id, kaltura_id),
- 'ie_key': 'Kaltura',
- 'id': video_id,
- 'display_id': display_id,
- }
diff --git a/yt_dlp/extractor/malltv.py b/yt_dlp/extractor/malltv.py
deleted file mode 100644
index e1031d8da..000000000
--- a/yt_dlp/extractor/malltv.py
+++ /dev/null
@@ -1,107 +0,0 @@
-from .common import InfoExtractor
-from ..utils import (
- clean_html,
- dict_get,
- float_or_none,
- int_or_none,
- merge_dicts,
- parse_duration,
- try_get,
-)
-
-
-class MallTVIE(InfoExtractor):
- _VALID_URL = r'https?://(?:(?:www|sk)\.)?mall\.tv/(?:[^/]+/)*(?P<id>[^/?#&]+)'
- _TESTS = [{
- 'url': 'https://www.mall.tv/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice',
- 'md5': 'cd69ce29176f6533b65bff69ed9a5f2a',
- 'info_dict': {
- 'id': 't0zzt0',
- 'display_id': '18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice',
- 'ext': 'mp4',
- 'title': '18 miliard pro neziskovky. Opravdu jsou sportovci nebo Člověk v tísni pijavice?',
- 'description': 'md5:db7d5744a4bd4043d9d98324aa72ab35',
- 'duration': 216,
- 'timestamp': 1538870400,
- 'upload_date': '20181007',
- 'view_count': int,
- 'comment_count': int,
- 'thumbnail': 'https://cdn.vpplayer.tech/agmipnzv/encode/vjsnigfq/thumbnails/retina.jpg',
- 'average_rating': 9.060869565217391,
- 'dislike_count': int,
- 'like_count': int,
- }
- }, {
- 'url': 'https://www.mall.tv/kdo-to-plati/18-miliard-pro-neziskovky-opravdu-jsou-sportovci-nebo-clovek-v-tisni-pijavice',
- 'only_matching': True,
- }, {
- 'url': 'https://sk.mall.tv/gejmhaus/reklamacia-nehreje-vyrobnik-tepla-alebo-spekacka',
- 'only_matching': True,
- }, {
- 'url': 'https://www.mall.tv/zivoty-slavnych/nadeje-vychodu-i-zapadu-jak-michail-gorbacov-zmenil-politickou-mapu-sveta-a-ziskal-za-to-nobelovu-cenu-miru',
- 'info_dict': {
- 'id': 'yx010y',
- 'ext': 'mp4',
- 'dislike_count': int,
- 'description': 'md5:aee02bee5a8d072c6a8207b91d1905a9',
- 'thumbnail': 'https://cdn.vpplayer.tech/agmipnzv/encode/vjsnjdeu/thumbnails/retina.jpg',
- 'comment_count': int,
- 'display_id': 'md5:0ec2afa94d2e2b7091c019cef2a43a9b',
- 'like_count': int,
- 'duration': 752,
- 'timestamp': 1646956800,
- 'title': 'md5:fe79385daaf16d74c12c1ec4a26687af',
- 'view_count': int,
- 'upload_date': '20220311',
- 'average_rating': 9.685714285714285,
- }
- }]
-
- def _real_extract(self, url):
- display_id = self._match_id(url)
-
- webpage = self._download_webpage(
- url, display_id, headers=self.geo_verification_headers())
-
- video = self._parse_json(self._search_regex(
- r'videoObject\s*=\s*JSON\.parse\(JSON\.stringify\(({.+?})\)\);',
- webpage, 'video object'), display_id)
-
- video_id = self._search_regex(
- r'<input\s*id\s*=\s*player-id-name\s*[^>]+value\s*=\s*(\w+)', webpage, 'video id')
-
- formats = self._extract_m3u8_formats(
- video['VideoSource'], video_id, 'mp4', 'm3u8_native')
-
- subtitles = {}
- for s in (video.get('Subtitles') or {}):
- s_url = s.get('Url')
- if not s_url:
- continue
- subtitles.setdefault(s.get('Language') or 'cz', []).append({
- 'url': s_url,
- })
-
- entity_counts = video.get('EntityCounts') or {}
-
- def get_count(k):
- v = entity_counts.get(k + 's') or {}
- return int_or_none(dict_get(v, ('Count', 'StrCount')))
-
- info = self._search_json_ld(webpage, video_id, default={})
-
- return merge_dicts({
- 'id': str(video_id),
- 'display_id': display_id,
- 'title': video.get('Title'),
- 'description': clean_html(video.get('Description')),
- 'thumbnail': video.get('ThumbnailUrl'),
- 'formats': formats,
- 'subtitles': subtitles,
- 'duration': int_or_none(video.get('DurationSeconds')) or parse_duration(video.get('Duration')),
- 'view_count': get_count('View'),
- 'like_count': get_count('Like'),
- 'dislike_count': get_count('Dislike'),
- 'average_rating': float_or_none(try_get(video, lambda x: x['EntityRating']['AvarageRate'])),
- 'comment_count': get_count('Comment'),
- }, info)
diff --git a/yt_dlp/extractor/manyvids.py b/yt_dlp/extractor/manyvids.py
index 741745378..2aa3a3c93 100644
--- a/yt_dlp/extractor/manyvids.py
+++ b/yt_dlp/extractor/manyvids.py
@@ -12,6 +12,7 @@ from ..utils import (
class ManyVidsIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'(?i)https?://(?:www\.)?manyvids\.com/video/(?P<id>\d+)'
_TESTS = [{
# preview video
diff --git a/yt_dlp/extractor/markiza.py b/yt_dlp/extractor/markiza.py
index 53ed79158..ca465eae9 100644
--- a/yt_dlp/extractor/markiza.py
+++ b/yt_dlp/extractor/markiza.py
@@ -10,6 +10,7 @@ from ..utils import (
class MarkizaIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?videoarchiv\.markiza\.sk/(?:video/(?:[^/]+/)*|embed/)(?P<id>\d+)(?:[_/]|$)'
_TESTS = [{
'url': 'http://videoarchiv.markiza.sk/video/oteckovia/84723_oteckovia-109',
@@ -68,6 +69,7 @@ class MarkizaIE(InfoExtractor):
class MarkizaPageIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?(?:(?:[^/]+\.)?markiza|tvnoviny)\.sk/(?:[^/]+/)*(?P<id>\d+)_'
_TESTS = [{
'url': 'http://www.markiza.sk/soubiz/zahranicny/1923705_oteckovia-maju-svoj-den-ti-slavni-nie-su-o-nic-menej-rozkosni',
diff --git a/yt_dlp/extractor/miaopai.py b/yt_dlp/extractor/miaopai.py
deleted file mode 100644
index 329ce3658..000000000
--- a/yt_dlp/extractor/miaopai.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from .common import InfoExtractor
-
-
-class MiaoPaiIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?miaopai\.com/show/(?P<id>[-A-Za-z0-9~_]+)'
- _TEST = {
- 'url': 'http://www.miaopai.com/show/n~0hO7sfV1nBEw4Y29-Hqg__.htm',
- 'md5': '095ed3f1cd96b821add957bdc29f845b',
- 'info_dict': {
- 'id': 'n~0hO7sfV1nBEw4Y29-Hqg__',
- 'ext': 'mp4',
- 'title': '西游记音乐会的秒拍视频',
- 'thumbnail': 're:^https?://.*/n~0hO7sfV1nBEw4Y29-Hqg___m.jpg',
- }
- }
-
- _USER_AGENT_IPAD = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
- webpage = self._download_webpage(
- url, video_id, headers={'User-Agent': self._USER_AGENT_IPAD})
-
- title = self._html_extract_title(webpage)
- thumbnail = self._html_search_regex(
- r'<div[^>]+class=(?P<q1>[\'"]).*\bvideo_img\b.*(?P=q1)[^>]+data-url=(?P<q2>[\'"])(?P<url>[^\'"]+)(?P=q2)',
- webpage, 'thumbnail', fatal=False, group='url')
- videos = self._parse_html5_media_entries(url, webpage, video_id)
- info = videos[0]
-
- info.update({
- 'id': video_id,
- 'title': title,
- 'thumbnail': thumbnail,
- })
- return info
diff --git a/yt_dlp/extractor/ministrygrid.py b/yt_dlp/extractor/ministrygrid.py
deleted file mode 100644
index 053c6726c..000000000
--- a/yt_dlp/extractor/ministrygrid.py
+++ /dev/null
@@ -1,55 +0,0 @@
-from .common import InfoExtractor
-from ..utils import (
- ExtractorError,
- smuggle_url,
-)
-
-
-class MinistryGridIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?ministrygrid\.com/([^/?#]*/)*(?P<id>[^/#?]+)/?(?:$|[?#])'
-
- _TEST = {
- 'url': 'http://www.ministrygrid.com/training-viewer/-/training/t4g-2014-conference/the-gospel-by-numbers-4/the-gospel-by-numbers',
- 'md5': '844be0d2a1340422759c2a9101bab017',
- 'info_dict': {
- 'id': '3453494717001',
- 'ext': 'mp4',
- 'title': 'The Gospel by Numbers',
- 'thumbnail': r're:^https?://.*\.jpg',
- 'upload_date': '20140410',
- 'description': 'Coming soon from T4G 2014!',
- 'uploader_id': '2034960640001',
- 'timestamp': 1397145591,
- },
- 'params': {
- # m3u8 download
- 'skip_download': True,
- },
- 'add_ie': ['TDSLifeway'],
- }
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
-
- webpage = self._download_webpage(url, video_id)
- portlets = self._parse_json(self._search_regex(
- r'Liferay\.Portlet\.list=(\[.+?\])', webpage, 'portlet list'),
- video_id)
- pl_id = self._search_regex(
- r'getPlid:function\(\){return"(\d+)"}', webpage, 'p_l_id')
-
- for i, portlet in enumerate(portlets):
- portlet_url = 'http://www.ministrygrid.com/c/portal/render_portlet?p_l_id=%s&p_p_id=%s' % (pl_id, portlet)
- portlet_code = self._download_webpage(
- portlet_url, video_id,
- note='Looking in portlet %s (%d/%d)' % (portlet, i + 1, len(portlets)),
- fatal=False)
- video_iframe_url = self._search_regex(
- r'<iframe.*?src="([^"]+)"', portlet_code, 'video iframe',
- default=None)
- if video_iframe_url:
- return self.url_result(
- smuggle_url(video_iframe_url, {'force_videoid': video_id}),
- video_id=video_id)
-
- raise ExtractorError('Could not find video iframe in any portlets')
diff --git a/yt_dlp/extractor/morningstar.py b/yt_dlp/extractor/morningstar.py
deleted file mode 100644
index e9fcfe3e2..000000000
--- a/yt_dlp/extractor/morningstar.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from .common import InfoExtractor
-
-
-class MorningstarIE(InfoExtractor):
- IE_DESC = 'morningstar.com'
- _VALID_URL = r'https?://(?:(?:www|news)\.)morningstar\.com/[cC]over/video[cC]enter\.aspx\?id=(?P<id>[0-9]+)'
- _TESTS = [{
- 'url': 'http://www.morningstar.com/cover/videocenter.aspx?id=615869',
- 'md5': '6c0acface7a787aadc8391e4bbf7b0f5',
- 'info_dict': {
- 'id': '615869',
- 'ext': 'mp4',
- 'title': 'Get Ahead of the Curve on 2013 Taxes',
- 'description': "Vanguard's Joel Dickson on managing higher tax rates for high-income earners and fund capital-gain distributions in 2013.",
- 'thumbnail': r're:^https?://.*m(?:orning)?star\.com/.+thumb\.jpg$'
- }
- }, {
- 'url': 'http://news.morningstar.com/cover/videocenter.aspx?id=825556',
- 'only_matching': True,
- }]
-
- def _real_extract(self, url):
- mobj = self._match_valid_url(url)
- video_id = mobj.group('id')
-
- webpage = self._download_webpage(url, video_id)
- title = self._html_search_regex(
- r'<h1 id="titleLink">(.*?)</h1>', webpage, 'title')
- video_url = self._html_search_regex(
- r'<input type="hidden" id="hidVideoUrl" value="([^"]+)"',
- webpage, 'video URL')
- thumbnail = self._html_search_regex(
- r'<input type="hidden" id="hidSnapshot" value="([^"]+)"',
- webpage, 'thumbnail', fatal=False)
- description = self._html_search_regex(
- r'<div id="mstarDeck".*?>(.*?)</div>',
- webpage, 'description', fatal=False)
-
- return {
- 'id': video_id,
- 'title': title,
- 'url': video_url,
- 'thumbnail': thumbnail,
- 'description': description,
- }
diff --git a/yt_dlp/extractor/motorsport.py b/yt_dlp/extractor/motorsport.py
index efb087d03..167d85fa9 100644
--- a/yt_dlp/extractor/motorsport.py
+++ b/yt_dlp/extractor/motorsport.py
@@ -5,6 +5,7 @@ from ..compat import (
class MotorsportIE(InfoExtractor):
+ _WORKING = False
IE_DESC = 'motorsport.com'
_VALID_URL = r'https?://(?:www\.)?motorsport\.com/[^/?#]+/video/(?:[^/?#]+/)(?P<id>[^/]+)/?(?:$|[?#])'
_TEST = {
diff --git a/yt_dlp/extractor/mtv.py b/yt_dlp/extractor/mtv.py
index e192453c7..404e431bc 100644
--- a/yt_dlp/extractor/mtv.py
+++ b/yt_dlp/extractor/mtv.py
@@ -451,6 +451,7 @@ class MTVVideoIE(MTVServicesInfoExtractor):
class MTVDEIE(MTVServicesInfoExtractor):
+ _WORKING = False
IE_NAME = 'mtv.de'
_VALID_URL = r'https?://(?:www\.)?mtv\.de/(?:musik/videoclips|folgen|news)/(?P<id>[0-9a-z]+)'
_TESTS = [{
diff --git a/yt_dlp/extractor/muenchentv.py b/yt_dlp/extractor/muenchentv.py
index 36a2d4688..934cd4fbc 100644
--- a/yt_dlp/extractor/muenchentv.py
+++ b/yt_dlp/extractor/muenchentv.py
@@ -9,6 +9,7 @@ from ..utils import (
class MuenchenTVIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?muenchen\.tv/livestream'
IE_DESC = 'münchen.tv'
_TEST = {
diff --git a/yt_dlp/extractor/murrtube.py b/yt_dlp/extractor/murrtube.py
index 6cdbbda16..74365c0c0 100644
--- a/yt_dlp/extractor/murrtube.py
+++ b/yt_dlp/extractor/murrtube.py
@@ -12,6 +12,7 @@ from ..utils import (
class MurrtubeIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'''(?x)
(?:
murrtube:|
@@ -100,6 +101,7 @@ query Medium($id: ID!) {
class MurrtubeUserIE(MurrtubeIE): # XXX: Do not subclass from concrete IE
+ _WORKING = False
IE_DESC = 'Murrtube user profile'
_VALID_URL = r'https?://murrtube\.net/(?P<id>[^/]+)$'
_TEST = {
diff --git a/yt_dlp/extractor/ndtv.py b/yt_dlp/extractor/ndtv.py
index bfe52f77d..d099db37b 100644
--- a/yt_dlp/extractor/ndtv.py
+++ b/yt_dlp/extractor/ndtv.py
@@ -5,6 +5,7 @@ from ..utils import parse_duration, remove_end, unified_strdate, urljoin
class NDTVIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:[^/]+\.)?ndtv\.com/(?:[^/]+/)*videos?/?(?:[^/]+/)*[^/?^&]+-(?P<id>\d+)'
_TESTS = [
diff --git a/yt_dlp/extractor/netzkino.py b/yt_dlp/extractor/netzkino.py
index 9c314e223..e9422eebf 100644
--- a/yt_dlp/extractor/netzkino.py
+++ b/yt_dlp/extractor/netzkino.py
@@ -8,6 +8,7 @@ from ..utils import (
class NetzkinoIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?netzkino\.de/\#!/[^/]+/(?P<id>[^/]+)'
_TESTS = [{
diff --git a/yt_dlp/extractor/nextmedia.py b/yt_dlp/extractor/nextmedia.py
index 0e47a4d45..871d3e669 100644
--- a/yt_dlp/extractor/nextmedia.py
+++ b/yt_dlp/extractor/nextmedia.py
@@ -191,6 +191,8 @@ class AppleDailyIE(NextMediaIE): # XXX: Do not subclass from concrete IE
class NextTVIE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
IE_DESC = '壹電視'
_VALID_URL = r'https?://(?:www\.)?nexttv\.com\.tw/(?:[^/]+/)+(?P<id>\d+)'
diff --git a/yt_dlp/extractor/nobelprize.py b/yt_dlp/extractor/nobelprize.py
index 1aa9705be..cddc72f71 100644
--- a/yt_dlp/extractor/nobelprize.py
+++ b/yt_dlp/extractor/nobelprize.py
@@ -10,6 +10,7 @@ from ..utils import (
class NobelPrizeIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?nobelprize\.org/mediaplayer.*?\bid=(?P<id>\d+)'
_TEST = {
'url': 'http://www.nobelprize.org/mediaplayer/?id=2636',
diff --git a/yt_dlp/extractor/noz.py b/yt_dlp/extractor/noz.py
index 59d259f9d..c7b803803 100644
--- a/yt_dlp/extractor/noz.py
+++ b/yt_dlp/extractor/noz.py
@@ -9,6 +9,7 @@ from ..compat import compat_urllib_parse_unquote
class NozIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?noz\.de/video/(?P<id>[0-9]+)/'
_TESTS = [{
'url': 'http://www.noz.de/video/25151/32-Deutschland-gewinnt-Badminton-Lnderspiel-in-Melle',
diff --git a/yt_dlp/extractor/odatv.py b/yt_dlp/extractor/odatv.py
deleted file mode 100644
index 24ab93942..000000000
--- a/yt_dlp/extractor/odatv.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from .common import InfoExtractor
-from ..utils import (
- ExtractorError,
- NO_DEFAULT,
- remove_start
-)
-
-
-class OdaTVIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?odatv\.com/(?:mob|vid)_video\.php\?.*\bid=(?P<id>[^&]+)'
- _TESTS = [{
- 'url': 'http://odatv.com/vid_video.php?id=8E388',
- 'md5': 'dc61d052f205c9bf2da3545691485154',
- 'info_dict': {
- 'id': '8E388',
- 'ext': 'mp4',
- 'title': 'Artık Davutoğlu ile devam edemeyiz'
- }
- }, {
- # mobile URL
- 'url': 'http://odatv.com/mob_video.php?id=8E388',
- 'only_matching': True,
- }, {
- # no video
- 'url': 'http://odatv.com/mob_video.php?id=8E900',
- 'only_matching': True,
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
- webpage = self._download_webpage(url, video_id)
-
- no_video = 'NO VIDEO!' in webpage
-
- video_url = self._search_regex(
- r'mp4\s*:\s*(["\'])(?P<url>http.+?)\1', webpage, 'video url',
- default=None if no_video else NO_DEFAULT, group='url')
-
- if no_video:
- raise ExtractorError('Video %s does not exist' % video_id, expected=True)
-
- return {
- 'id': video_id,
- 'url': video_url,
- 'title': remove_start(self._og_search_title(webpage), 'Video: '),
- 'thumbnail': self._og_search_thumbnail(webpage),
- }
diff --git a/yt_dlp/extractor/parlview.py b/yt_dlp/extractor/parlview.py
index 0b547917c..777b00889 100644
--- a/yt_dlp/extractor/parlview.py
+++ b/yt_dlp/extractor/parlview.py
@@ -8,7 +8,7 @@ from ..utils import (
class ParlviewIE(InfoExtractor):
-
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?parlview\.aph\.gov\.au/(?:[^/]+)?\bvideoID=(?P<id>\d{6})'
_TESTS = [{
'url': 'https://parlview.aph.gov.au/mediaPlayer.php?videoID=542661',
diff --git a/yt_dlp/extractor/playstuff.py b/yt_dlp/extractor/playstuff.py
deleted file mode 100644
index b424ba187..000000000
--- a/yt_dlp/extractor/playstuff.py
+++ /dev/null
@@ -1,63 +0,0 @@
-from .common import InfoExtractor
-from ..compat import compat_str
-from ..utils import (
- smuggle_url,
- try_get,
-)
-
-
-class PlayStuffIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?play\.stuff\.co\.nz/details/(?P<id>[^/?#&]+)'
- _TESTS = [{
- 'url': 'https://play.stuff.co.nz/details/608778ac1de1c4001a3fa09a',
- 'md5': 'c82d3669e5247c64bc382577843e5bd0',
- 'info_dict': {
- 'id': '6250584958001',
- 'ext': 'mp4',
- 'title': 'Episode 1: Rotorua/Mt Maunganui/Tauranga',
- 'description': 'md5:c154bafb9f0dd02d01fd4100fb1c1913',
- 'uploader_id': '6005208634001',
- 'timestamp': 1619491027,
- 'upload_date': '20210427',
- },
- 'add_ie': ['BrightcoveNew'],
- }, {
- # geo restricted, bypassable
- 'url': 'https://play.stuff.co.nz/details/_6155660351001',
- 'only_matching': True,
- }]
- BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/%s/%s_default/index.html?videoId=%s'
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
-
- webpage = self._download_webpage(url, video_id)
-
- state = self._parse_json(
- self._search_regex(
- r'__INITIAL_STATE__\s*=\s*({.+?})\s*;', webpage, 'state'),
- video_id)
-
- account_id = try_get(
- state, lambda x: x['configurations']['accountId'],
- compat_str) or '6005208634001'
- player_id = try_get(
- state, lambda x: x['configurations']['playerId'],
- compat_str) or 'default'
-
- entries = []
- for item_id, video in state['items'].items():
- if not isinstance(video, dict):
- continue
- asset_id = try_get(
- video, lambda x: x['content']['attributes']['assetId'],
- compat_str)
- if not asset_id:
- continue
- entries.append(self.url_result(
- smuggle_url(
- self.BRIGHTCOVE_URL_TEMPLATE % (account_id, player_id, asset_id),
- {'geo_countries': ['NZ']}),
- 'BrightcoveNew', video_id))
-
- return self.playlist_result(entries, video_id)
diff --git a/yt_dlp/extractor/plutotv.py b/yt_dlp/extractor/plutotv.py
index caffeb21d..5898d927c 100644
--- a/yt_dlp/extractor/plutotv.py
+++ b/yt_dlp/extractor/plutotv.py
@@ -16,6 +16,7 @@ from ..utils import (
class PlutoTVIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'''(?x)
https?://(?:www\.)?pluto\.tv(?:/[^/]+)?/on-demand
/(?P<video_type>movies|series)
diff --git a/yt_dlp/extractor/podomatic.py b/yt_dlp/extractor/podomatic.py
index 985bfae9d..37b68694b 100644
--- a/yt_dlp/extractor/podomatic.py
+++ b/yt_dlp/extractor/podomatic.py
@@ -5,6 +5,7 @@ from ..utils import int_or_none
class PodomaticIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'podomatic'
_VALID_URL = r'''(?x)
(?P<proto>https?)://
diff --git a/yt_dlp/extractor/pornovoisines.py b/yt_dlp/extractor/pornovoisines.py
index aa48da06b..2e51b4f6b 100644
--- a/yt_dlp/extractor/pornovoisines.py
+++ b/yt_dlp/extractor/pornovoisines.py
@@ -7,6 +7,7 @@ from ..utils import (
class PornoVoisinesIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?pornovoisines\.com/videos/show/(?P<id>\d+)/(?P<display_id>[^/.]+)'
_TEST = {
diff --git a/yt_dlp/extractor/pornoxo.py b/yt_dlp/extractor/pornoxo.py
index 5104d8a49..049feb4ec 100644
--- a/yt_dlp/extractor/pornoxo.py
+++ b/yt_dlp/extractor/pornoxo.py
@@ -5,6 +5,7 @@ from ..utils import (
class PornoXOIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?pornoxo\.com/videos/(?P<id>\d+)/(?P<display_id>[^/]+)\.html'
_TEST = {
'url': 'http://www.pornoxo.com/videos/7564/striptease-from-sexy-secretary.html',
diff --git a/yt_dlp/extractor/projectveritas.py b/yt_dlp/extractor/projectveritas.py
index 0e029ce8c..daf14054c 100644
--- a/yt_dlp/extractor/projectveritas.py
+++ b/yt_dlp/extractor/projectveritas.py
@@ -7,6 +7,7 @@ from ..utils import (
class ProjectVeritasIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?projectveritas\.com/(?P<type>news|video)/(?P<id>[^/?#]+)'
_TESTS = [{
'url': 'https://www.projectveritas.com/news/exclusive-inside-the-new-york-and-new-jersey-hospitals-battling-coronavirus/',
diff --git a/yt_dlp/extractor/r7.py b/yt_dlp/extractor/r7.py
index f067a0571..36f0b52bd 100644
--- a/yt_dlp/extractor/r7.py
+++ b/yt_dlp/extractor/r7.py
@@ -3,6 +3,8 @@ from ..utils import int_or_none
class R7IE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
_VALID_URL = r'''(?x)
https?://
(?:
@@ -86,6 +88,8 @@ class R7IE(InfoExtractor):
class R7ArticleIE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
_VALID_URL = r'https?://(?:[a-zA-Z]+)\.r7\.com/(?:[^/]+/)+[^/?#&]+-(?P<id>\d+)'
_TEST = {
'url': 'http://tv.r7.com/record-play/balanco-geral/videos/policiais-humilham-suspeito-a-beira-da-morte-morre-com-dignidade-16102015',
diff --git a/yt_dlp/extractor/radiode.py b/yt_dlp/extractor/radiode.py
index 32c36d557..726207825 100644
--- a/yt_dlp/extractor/radiode.py
+++ b/yt_dlp/extractor/radiode.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class RadioDeIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'radio.de'
_VALID_URL = r'https?://(?P<id>.+?)\.(?:radio\.(?:de|at|fr|pt|es|pl|it)|rad\.io)'
_TEST = {
diff --git a/yt_dlp/extractor/radiojavan.py b/yt_dlp/extractor/radiojavan.py
index 6a9139466..b3befaef9 100644
--- a/yt_dlp/extractor/radiojavan.py
+++ b/yt_dlp/extractor/radiojavan.py
@@ -11,6 +11,7 @@ from ..utils import (
class RadioJavanIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?radiojavan\.com/videos/video/(?P<id>[^/]+)/?'
_TEST = {
'url': 'http://www.radiojavan.com/videos/video/chaartaar-ashoobam',
diff --git a/yt_dlp/extractor/rbmaradio.py b/yt_dlp/extractor/rbmaradio.py
deleted file mode 100644
index 86c63dbb7..000000000
--- a/yt_dlp/extractor/rbmaradio.py
+++ /dev/null
@@ -1,68 +0,0 @@
-from .common import InfoExtractor
-from ..compat import compat_str
-from ..utils import (
- clean_html,
- int_or_none,
- unified_timestamp,
- update_url_query,
-)
-
-
-class RBMARadioIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?(?:rbmaradio|redbullradio)\.com/shows/(?P<show_id>[^/]+)/episodes/(?P<id>[^/?#&]+)'
- _TEST = {
- 'url': 'https://www.rbmaradio.com/shows/main-stage/episodes/ford-lopatin-live-at-primavera-sound-2011',
- 'md5': '6bc6f9bcb18994b4c983bc3bf4384d95',
- 'info_dict': {
- 'id': 'ford-lopatin-live-at-primavera-sound-2011',
- 'ext': 'mp3',
- 'title': 'Main Stage - Ford & Lopatin at Primavera Sound',
- 'description': 'md5:d41d8cd98f00b204e9800998ecf8427e',
- 'thumbnail': r're:^https?://.*\.jpg',
- 'duration': 2452,
- 'timestamp': 1307103164,
- 'upload_date': '20110603',
- },
- }
-
- def _real_extract(self, url):
- mobj = self._match_valid_url(url)
- show_id = mobj.group('show_id')
- episode_id = mobj.group('id')
-
- webpage = self._download_webpage(url, episode_id)
-
- episode = self._parse_json(
- self._search_regex(
- r'__INITIAL_STATE__\s*=\s*({.+?})\s*</script>',
- webpage, 'json data'),
- episode_id)['episodes'][show_id][episode_id]
-
- title = episode['title']
-
- show_title = episode.get('showTitle')
- if show_title:
- title = '%s - %s' % (show_title, title)
-
- formats = [{
- 'url': update_url_query(episode['audioURL'], query={'cbr': abr}),
- 'format_id': compat_str(abr),
- 'abr': abr,
- 'vcodec': 'none',
- } for abr in (96, 128, 192, 256)]
- self._check_formats(formats, episode_id)
-
- description = clean_html(episode.get('longTeaser'))
- thumbnail = self._proto_relative_url(episode.get('imageURL', {}).get('landscape'))
- duration = int_or_none(episode.get('duration'))
- timestamp = unified_timestamp(episode.get('publishedAt'))
-
- return {
- 'id': episode_id,
- 'title': title,
- 'description': description,
- 'thumbnail': thumbnail,
- 'duration': duration,
- 'timestamp': timestamp,
- 'formats': formats,
- }
diff --git a/yt_dlp/extractor/rds.py b/yt_dlp/extractor/rds.py
index 9a2e0d985..1a1c6634e 100644
--- a/yt_dlp/extractor/rds.py
+++ b/yt_dlp/extractor/rds.py
@@ -8,6 +8,7 @@ from ..compat import compat_str
class RDSIE(InfoExtractor):
+ _WORKING = False
IE_DESC = 'RDS.ca'
_VALID_URL = r'https?://(?:www\.)?rds\.ca/vid(?:[eé]|%C3%A9)os/(?:[^/]+/)*(?P<id>[^/]+)-\d+\.\d+'
diff --git a/yt_dlp/extractor/redbee.py b/yt_dlp/extractor/redbee.py
index b59b518b1..4d71133b3 100644
--- a/yt_dlp/extractor/redbee.py
+++ b/yt_dlp/extractor/redbee.py
@@ -134,6 +134,7 @@ class ParliamentLiveUKIE(RedBeeBaseIE):
class RTBFIE(RedBeeBaseIE):
+ _WORKING = False
_VALID_URL = r'''(?x)
https?://(?:www\.)?rtbf\.be/
(?:
diff --git a/yt_dlp/extractor/regiotv.py b/yt_dlp/extractor/regiotv.py
deleted file mode 100644
index edb6ae5bc..000000000
--- a/yt_dlp/extractor/regiotv.py
+++ /dev/null
@@ -1,55 +0,0 @@
-from .common import InfoExtractor
-from ..networking import Request
-from ..utils import xpath_text, xpath_with_ns
-
-
-class RegioTVIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?regio-tv\.de/video/(?P<id>[0-9]+)'
- _TESTS = [{
- 'url': 'http://www.regio-tv.de/video/395808.html',
- 'info_dict': {
- 'id': '395808',
- 'ext': 'mp4',
- 'title': 'Wir in Ludwigsburg',
- 'description': 'Mit unseren zuckersüßen Adventskindern, außerdem besuchen wir die Abendsterne!',
- }
- }, {
- 'url': 'http://www.regio-tv.de/video/395808',
- 'only_matching': True,
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
-
- webpage = self._download_webpage(url, video_id)
-
- key = self._search_regex(
- r'key\s*:\s*(["\'])(?P<key>.+?)\1', webpage, 'key', group='key')
- title = self._og_search_title(webpage)
-
- SOAP_TEMPLATE = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><{0} xmlns="http://v.telvi.de/"><key xsi:type="xsd:string">{1}</key></{0}></soap:Body></soap:Envelope>'
-
- request = Request(
- 'http://v.telvi.de/',
- SOAP_TEMPLATE.format('GetHTML5VideoData', key).encode('utf-8'))
- video_data = self._download_xml(request, video_id, 'Downloading video XML')
-
- NS_MAP = {
- 'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
- 'soap': 'http://schemas.xmlsoap.org/soap/envelope/',
- }
-
- video_url = xpath_text(
- video_data, xpath_with_ns('.//video', NS_MAP), 'video url', fatal=True)
- thumbnail = xpath_text(
- video_data, xpath_with_ns('.//image', NS_MAP), 'thumbnail')
- description = self._og_search_description(
- webpage) or self._html_search_meta('description', webpage)
-
- return {
- 'id': video_id,
- 'url': video_url,
- 'title': title,
- 'description': description,
- 'thumbnail': thumbnail,
- }
diff --git a/yt_dlp/extractor/rentv.py b/yt_dlp/extractor/rentv.py
index fdde31704..abb537cf3 100644
--- a/yt_dlp/extractor/rentv.py
+++ b/yt_dlp/extractor/rentv.py
@@ -8,6 +8,7 @@ from ..utils import (
class RENTVIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'(?:rentv:|https?://(?:www\.)?ren\.tv/(?:player|video/epizod)/)(?P<id>\d+)'
_TESTS = [{
'url': 'http://ren.tv/video/epizod/118577',
@@ -59,6 +60,7 @@ class RENTVIE(InfoExtractor):
class RENTVArticleIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?ren\.tv/novosti/\d{4}-\d{2}-\d{2}/(?P<id>[^/?#]+)'
_TESTS = [{
'url': 'http://ren.tv/novosti/2016-10-26/video-mikroavtobus-popavshiy-v-dtp-s-gruzovikami-v-podmoskove-prevratilsya-v',
diff --git a/yt_dlp/extractor/restudy.py b/yt_dlp/extractor/restudy.py
index 6d032564d..f49262a65 100644
--- a/yt_dlp/extractor/restudy.py
+++ b/yt_dlp/extractor/restudy.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class RestudyIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:(?:www|portal)\.)?restudy\.dk/video/[^/]+/id/(?P<id>[0-9]+)'
_TESTS = [{
'url': 'https://www.restudy.dk/video/play/id/1637',
diff --git a/yt_dlp/extractor/reuters.py b/yt_dlp/extractor/reuters.py
index 6919425f3..0a8f13b9f 100644
--- a/yt_dlp/extractor/reuters.py
+++ b/yt_dlp/extractor/reuters.py
@@ -9,6 +9,7 @@ from ..utils import (
class ReutersIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?reuters\.com/.*?\?.*?videoId=(?P<id>[0-9]+)'
_TEST = {
'url': 'http://www.reuters.com/video/2016/05/20/san-francisco-police-chief-resigns?videoId=368575562',
diff --git a/yt_dlp/extractor/rockstargames.py b/yt_dlp/extractor/rockstargames.py
index c491aaf53..b0b92e642 100644
--- a/yt_dlp/extractor/rockstargames.py
+++ b/yt_dlp/extractor/rockstargames.py
@@ -6,6 +6,7 @@ from ..utils import (
class RockstarGamesIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?rockstargames\.com/videos(?:/video/|#?/?\?.*\bvideo=)(?P<id>\d+)'
_TESTS = [{
'url': 'https://www.rockstargames.com/videos/video/11544/',
diff --git a/yt_dlp/extractor/rts.py b/yt_dlp/extractor/rts.py
index 9f73d1811..bce5cba82 100644
--- a/yt_dlp/extractor/rts.py
+++ b/yt_dlp/extractor/rts.py
@@ -13,6 +13,7 @@ from ..utils import (
class RTSIE(SRGSSRIE): # XXX: Do not subclass from concrete IE
+ _WORKING = False
IE_DESC = 'RTS.ch'
_VALID_URL = r'rts:(?P<rts_id>\d+)|https?://(?:.+?\.)?rts\.ch/(?:[^/]+/){2,}(?P<id>[0-9]+)-(?P<display_id>.+?)\.html'
diff --git a/yt_dlp/extractor/saitosan.py b/yt_dlp/extractor/saitosan.py
index d2f60e92f..a5f05e1d0 100644
--- a/yt_dlp/extractor/saitosan.py
+++ b/yt_dlp/extractor/saitosan.py
@@ -3,6 +3,7 @@ from ..utils import ExtractorError, try_get
class SaitosanIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'Saitosan'
_VALID_URL = r'https?://(?:www\.)?saitosan\.net/bview.html\?id=(?P<id>[0-9]+)'
_TESTS = [{
diff --git a/yt_dlp/extractor/savefrom.py b/yt_dlp/extractor/savefrom.py
deleted file mode 100644
index 9c9e74b6d..000000000
--- a/yt_dlp/extractor/savefrom.py
+++ /dev/null
@@ -1,30 +0,0 @@
-import os.path
-
-from .common import InfoExtractor
-
-
-class SaveFromIE(InfoExtractor):
- IE_NAME = 'savefrom.net'
- _VALID_URL = r'https?://[^.]+\.savefrom\.net/\#url=(?P<url>.*)$'
-
- _TEST = {
- 'url': 'http://en.savefrom.net/#url=http://youtube.com/watch?v=UlVRAPW2WJY&utm_source=youtube.com&utm_medium=short_domains&utm_campaign=ssyoutube.com',
- 'info_dict': {
- 'id': 'UlVRAPW2WJY',
- 'ext': 'mp4',
- 'title': 'About Team Radical MMA | MMA Fighting',
- 'upload_date': '20120816',
- 'uploader': 'Howcast',
- 'uploader_id': 'Howcast',
- 'description': r're:(?s).* Hi, my name is Rene Dreifuss\. And I\'m here to show you some MMA.*',
- },
- 'params': {
- 'skip_download': True
- }
- }
-
- def _real_extract(self, url):
- mobj = self._match_valid_url(url)
- video_id = os.path.splitext(url.split('/')[-1])[0]
-
- return self.url_result(mobj.group('url'), video_id=video_id)
diff --git a/yt_dlp/extractor/seeker.py b/yt_dlp/extractor/seeker.py
deleted file mode 100644
index 65eb16a09..000000000
--- a/yt_dlp/extractor/seeker.py
+++ /dev/null
@@ -1,55 +0,0 @@
-import re
-
-from .common import InfoExtractor
-from ..utils import (
- get_element_by_class,
- strip_or_none,
-)
-
-
-class SeekerIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?seeker\.com/(?P<display_id>.*)-(?P<article_id>\d+)\.html'
- _TESTS = [{
- 'url': 'http://www.seeker.com/should-trump-be-required-to-release-his-tax-returns-1833805621.html',
- 'md5': '897d44bbe0d8986a2ead96de565a92db',
- 'info_dict': {
- 'id': 'Elrn3gnY',
- 'ext': 'mp4',
- 'title': 'Should Trump Be Required To Release His Tax Returns?',
- 'description': 'md5:41efa8cfa8d627841045eec7b018eb45',
- 'timestamp': 1490090165,
- 'upload_date': '20170321',
- }
- }, {
- 'url': 'http://www.seeker.com/changes-expected-at-zoos-following-recent-gorilla-lion-shootings-1834116536.html',
- 'playlist': [
- {
- 'md5': '0497b9f20495174be73ae136949707d2',
- 'info_dict': {
- 'id': 'FihYQ8AE',
- 'ext': 'mp4',
- 'title': 'The Pros & Cons Of Zoos',
- 'description': 'md5:d88f99a8ea8e7d25e6ff77f271b1271c',
- 'timestamp': 1490039133,
- 'upload_date': '20170320',
- },
- }
- ],
- 'info_dict': {
- 'id': '1834116536',
- 'title': 'After Gorilla Killing, Changes Ahead for Zoos',
- 'description': 'The largest association of zoos and others are hoping to learn from recent incidents that led to the shooting deaths of a gorilla and two lions.',
- },
- }]
-
- def _real_extract(self, url):
- display_id, article_id = self._match_valid_url(url).groups()
- webpage = self._download_webpage(url, display_id)
- entries = []
- for jwp_id in re.findall(r'data-video-id="([a-zA-Z0-9]{8})"', webpage):
- entries.append(self.url_result(
- 'jwplatform:' + jwp_id, 'JWPlatform', jwp_id))
- return self.playlist_result(
- entries, article_id,
- self._og_search_title(webpage),
- strip_or_none(get_element_by_class('subtitle__text', webpage)) or self._og_search_description(webpage))
diff --git a/yt_dlp/extractor/senalcolombia.py b/yt_dlp/extractor/senalcolombia.py
index f3c066da7..b2f354fae 100644
--- a/yt_dlp/extractor/senalcolombia.py
+++ b/yt_dlp/extractor/senalcolombia.py
@@ -3,6 +3,7 @@ from .rtvcplay import RTVCKalturaIE
class SenalColombiaLiveIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?senalcolombia\.tv/(?P<id>senal-en-vivo)'
_TESTS = [{
diff --git a/yt_dlp/extractor/sendtonews.py b/yt_dlp/extractor/sendtonews.py
index 3600e2e74..1ecea71fc 100644
--- a/yt_dlp/extractor/sendtonews.py
+++ b/yt_dlp/extractor/sendtonews.py
@@ -12,6 +12,7 @@ from ..utils import (
class SendtoNewsIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://embed\.sendtonews\.com/player2/embedplayer\.php\?.*\bSC=(?P<id>[0-9A-Za-z-]+)'
_TEST = {
diff --git a/yt_dlp/extractor/sexu.py b/yt_dlp/extractor/sexu.py
index 3117f81e3..989b63c72 100644
--- a/yt_dlp/extractor/sexu.py
+++ b/yt_dlp/extractor/sexu.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class SexuIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?sexu\.com/(?P<id>\d+)'
_TEST = {
'url': 'http://sexu.com/961791/',
diff --git a/yt_dlp/extractor/skylinewebcams.py b/yt_dlp/extractor/skylinewebcams.py
index 4292bb2ae..197407c18 100644
--- a/yt_dlp/extractor/skylinewebcams.py
+++ b/yt_dlp/extractor/skylinewebcams.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class SkylineWebcamsIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?skylinewebcams\.com/[^/]+/webcam/(?:[^/]+/)+(?P<id>[^/]+)\.html'
_TEST = {
'url': 'https://www.skylinewebcams.com/it/webcam/italia/lazio/roma/scalinata-piazza-di-spagna-barcaccia.html',
diff --git a/yt_dlp/extractor/skynewsarabia.py b/yt_dlp/extractor/skynewsarabia.py
index 6264b04bb..867782778 100644
--- a/yt_dlp/extractor/skynewsarabia.py
+++ b/yt_dlp/extractor/skynewsarabia.py
@@ -38,6 +38,7 @@ class SkyNewsArabiaBaseIE(InfoExtractor):
class SkyNewsArabiaIE(SkyNewsArabiaBaseIE):
+ _WORKING = False
IE_NAME = 'skynewsarabia:video'
_VALID_URL = r'https?://(?:www\.)?skynewsarabia\.com/web/video/(?P<id>[0-9]+)'
_TEST = {
@@ -64,6 +65,7 @@ class SkyNewsArabiaIE(SkyNewsArabiaBaseIE):
class SkyNewsArabiaArticleIE(SkyNewsArabiaBaseIE):
+ _WORKING = False
IE_NAME = 'skynewsarabia:article'
_VALID_URL = r'https?://(?:www\.)?skynewsarabia\.com/web/article/(?P<id>[0-9]+)'
_TESTS = [{
diff --git a/yt_dlp/extractor/startrek.py b/yt_dlp/extractor/startrek.py
index e92122f9b..94efb589c 100644
--- a/yt_dlp/extractor/startrek.py
+++ b/yt_dlp/extractor/startrek.py
@@ -3,6 +3,7 @@ from ..utils import int_or_none, urljoin
class StarTrekIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'(?P<base>https?://(?:intl|www)\.startrek\.com)/videos/(?P<id>[^/]+)'
_TESTS = [{
'url': 'https://intl.startrek.com/videos/watch-welcoming-jess-bush-to-the-ready-room',
diff --git a/yt_dlp/extractor/streamff.py b/yt_dlp/extractor/streamff.py
deleted file mode 100644
index 93c42942c..000000000
--- a/yt_dlp/extractor/streamff.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from .common import InfoExtractor
-from ..utils import int_or_none, parse_iso8601
-
-
-class StreamFFIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?streamff\.com/v/(?P<id>[a-zA-Z0-9]+)'
-
- _TESTS = [{
- 'url': 'https://streamff.com/v/55cc94',
- 'md5': '8745a67bb5e5c570738efe7983826370',
- 'info_dict': {
- 'id': '55cc94',
- 'ext': 'mp4',
- 'title': '55cc94',
- 'timestamp': 1634764643,
- 'upload_date': '20211020',
- 'view_count': int,
- }
- }]
-
- def _real_extract(self, url):
- video_id = self._match_id(url)
- json_data = self._download_json(f'https://streamff.com/api/videos/{video_id}', video_id)
- return {
- 'id': video_id,
- 'title': json_data.get('name') or video_id,
- 'url': 'https://streamff.com/%s' % json_data['videoLink'],
- 'view_count': int_or_none(json_data.get('views')),
- 'timestamp': parse_iso8601(json_data.get('date')),
- }
diff --git a/yt_dlp/extractor/syfy.py b/yt_dlp/extractor/syfy.py
index afcdbf780..bd2d73842 100644
--- a/yt_dlp/extractor/syfy.py
+++ b/yt_dlp/extractor/syfy.py
@@ -6,6 +6,7 @@ from ..utils import (
class SyfyIE(AdobePassIE):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?syfy\.com/(?:[^/]+/)?videos/(?P<id>[^/?#]+)'
_TESTS = [{
'url': 'http://www.syfy.com/theinternetruinedmylife/videos/the-internet-ruined-my-life-season-1-trailer',
diff --git a/yt_dlp/extractor/tagesschau.py b/yt_dlp/extractor/tagesschau.py
index e23b490b0..c69c13d0b 100644
--- a/yt_dlp/extractor/tagesschau.py
+++ b/yt_dlp/extractor/tagesschau.py
@@ -12,6 +12,7 @@ from ..utils import (
class TagesschauIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?tagesschau\.de/(?P<path>[^/]+/(?:[^/]+/)*?(?P<id>[^/#?]+?(?:-?[0-9]+)?))(?:~_?[^/#?]+?)?\.html'
_TESTS = [{
diff --git a/yt_dlp/extractor/tass.py b/yt_dlp/extractor/tass.py
index 67e544a6a..d4c5b41a7 100644
--- a/yt_dlp/extractor/tass.py
+++ b/yt_dlp/extractor/tass.py
@@ -8,6 +8,7 @@ from ..utils import (
class TassIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:tass\.ru|itar-tass\.com)/[^/]+/(?P<id>\d+)'
_TESTS = [
{
diff --git a/yt_dlp/extractor/tdslifeway.py b/yt_dlp/extractor/tdslifeway.py
deleted file mode 100644
index 3623a68c8..000000000
--- a/yt_dlp/extractor/tdslifeway.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from .common import InfoExtractor
-
-
-class TDSLifewayIE(InfoExtractor):
- _VALID_URL = r'https?://tds\.lifeway\.com/v1/trainingdeliverysystem/courses/(?P<id>\d+)/index\.html'
-
- _TEST = {
- # From http://www.ministrygrid.com/training-viewer/-/training/t4g-2014-conference/the-gospel-by-numbers-4/the-gospel-by-numbers
- 'url': 'http://tds.lifeway.com/v1/trainingdeliverysystem/courses/3453494717001/index.html?externalRegistration=AssetId%7C34F466F1-78F3-4619-B2AB-A8EFFA55E9E9%21InstanceId%7C0%21UserId%7Caaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa&grouping=http%3A%2F%2Flifeway.com%2Fvideo%2F3453494717001&activity_id=http%3A%2F%2Flifeway.com%2Fvideo%2F3453494717001&content_endpoint=http%3A%2F%2Ftds.lifeway.com%2Fv1%2Ftrainingdeliverysystem%2FScormEngineInterface%2FTCAPI%2Fcontent%2F&actor=%7B%22name%22%3A%5B%22Guest%20Guest%22%5D%2C%22account%22%3A%5B%7B%22accountServiceHomePage%22%3A%22http%3A%2F%2Fscorm.lifeway.com%2F%22%2C%22accountName%22%3A%22aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa%22%7D%5D%2C%22objectType%22%3A%22Agent%22%7D&content_token=462a50b2-b6f9-4970-99b1-930882c499fb&registration=93d6ec8e-7f7b-4ed3-bbc8-a857913c0b2a&externalConfiguration=access%7CFREE%21adLength%7C-1%21assignOrgId%7C4AE36F78-299A-425D-91EF-E14A899B725F%21assignOrgParentId%7C%21courseId%7C%21isAnonymous%7Cfalse%21previewAsset%7Cfalse%21previewLength%7C-1%21previewMode%7Cfalse%21royalty%7CFREE%21sessionId%7C671422F9-8E79-48D4-9C2C-4EE6111EA1CD%21trackId%7C&auth=Basic%20OjhmZjk5MDBmLTBlYTMtNDJhYS04YjFlLWE4MWQ3NGNkOGRjYw%3D%3D&endpoint=http%3A%2F%2Ftds.lifeway.com%2Fv1%2Ftrainingdeliverysystem%2FScormEngineInterface%2FTCAPI%2F',
- 'info_dict': {
- 'id': '3453494717001',
- 'ext': 'mp4',
- 'title': 'The Gospel by Numbers',
- 'thumbnail': r're:^https?://.*\.jpg',
- 'upload_date': '20140410',
- 'description': 'Coming soon from T4G 2014!',
- 'uploader_id': '2034960640001',
- 'timestamp': 1397145591,
- },
- 'params': {
- # m3u8 download
- 'skip_download': True,
- },
- 'add_ie': ['BrightcoveNew'],
- }
-
- BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/2034960640001/default_default/index.html?videoId=%s'
-
- def _real_extract(self, url):
- brightcove_id = self._match_id(url)
- return self.url_result(self.BRIGHTCOVE_URL_TEMPLATE % brightcove_id, 'BrightcoveNew', brightcove_id)
diff --git a/yt_dlp/extractor/teachable.py b/yt_dlp/extractor/teachable.py
index 01906bda9..5eac9aa3f 100644
--- a/yt_dlp/extractor/teachable.py
+++ b/yt_dlp/extractor/teachable.py
@@ -99,6 +99,7 @@ class TeachableBaseIE(InfoExtractor):
class TeachableIE(TeachableBaseIE):
+ _WORKING = False
_VALID_URL = r'''(?x)
(?:
%shttps?://(?P<site_t>[^/]+)|
diff --git a/yt_dlp/extractor/teachertube.py b/yt_dlp/extractor/teachertube.py
index c3eec2784..90a976297 100644
--- a/yt_dlp/extractor/teachertube.py
+++ b/yt_dlp/extractor/teachertube.py
@@ -9,6 +9,7 @@ from ..utils import (
class TeacherTubeIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'teachertube'
IE_DESC = 'teachertube.com videos'
@@ -87,6 +88,7 @@ class TeacherTubeIE(InfoExtractor):
class TeacherTubeUserIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'teachertube:user:collection'
IE_DESC = 'teachertube.com user and collection videos'
diff --git a/yt_dlp/extractor/teachingchannel.py b/yt_dlp/extractor/teachingchannel.py
index 275f6d1f9..5791292a9 100644
--- a/yt_dlp/extractor/teachingchannel.py
+++ b/yt_dlp/extractor/teachingchannel.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class TeachingChannelIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?teachingchannel\.org/videos?/(?P<id>[^/?&#]+)'
_TEST = {
diff --git a/yt_dlp/extractor/tele5.py b/yt_dlp/extractor/tele5.py
index 9260db2b4..72f67e402 100644
--- a/yt_dlp/extractor/tele5.py
+++ b/yt_dlp/extractor/tele5.py
@@ -7,6 +7,7 @@ from ..utils import (
class Tele5IE(DPlayIE): # XXX: Do not subclass from concrete IE
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?tele5\.de/(?:[^/]+/)*(?P<id>[^/?#&]+)'
_GEO_COUNTRIES = ['DE']
_TESTS = [{
diff --git a/yt_dlp/extractor/telemb.py b/yt_dlp/extractor/telemb.py
index 3d29dace3..a71b14c27 100644
--- a/yt_dlp/extractor/telemb.py
+++ b/yt_dlp/extractor/telemb.py
@@ -5,6 +5,7 @@ from ..utils import remove_start
class TeleMBIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?telemb\.be/(?P<display_id>.+?)_d_(?P<id>\d+)\.html'
_TESTS = [
{
diff --git a/yt_dlp/extractor/telemundo.py b/yt_dlp/extractor/telemundo.py
index 54e74a6c0..84b24dead 100644
--- a/yt_dlp/extractor/telemundo.py
+++ b/yt_dlp/extractor/telemundo.py
@@ -4,7 +4,7 @@ from ..utils import try_get, unified_timestamp
class TelemundoIE(InfoExtractor):
-
+ _WORKING = False
_VALID_URL = r'https?:\/\/(?:www\.)?telemundo\.com\/.+?video\/[^\/]+(?P<id>tmvo\d{7})'
_TESTS = [{
'url': 'https://www.telemundo.com/noticias/noticias-telemundo-en-la-noche/empleo/video/esta-aplicacion-gratuita-esta-ayudando-los-latinos-encontrar-trabajo-en-estados-unidos-tmvo9829325',
diff --git a/yt_dlp/extractor/teletask.py b/yt_dlp/extractor/teletask.py
index a73dd68fb..fd831f580 100644
--- a/yt_dlp/extractor/teletask.py
+++ b/yt_dlp/extractor/teletask.py
@@ -5,6 +5,7 @@ from ..utils import unified_strdate
class TeleTaskIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?tele-task\.de/archive/video/html5/(?P<id>[0-9]+)'
_TEST = {
'url': 'http://www.tele-task.de/archive/video/html5/26168/',
diff --git a/yt_dlp/extractor/tonline.py b/yt_dlp/extractor/tonline.py
index 720282663..33b9a32e4 100644
--- a/yt_dlp/extractor/tonline.py
+++ b/yt_dlp/extractor/tonline.py
@@ -3,6 +3,8 @@ from ..utils import int_or_none, join_nonempty
class TOnlineIE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
IE_NAME = 't-online.de'
_VALID_URL = r'https?://(?:www\.)?t-online\.de/tv/(?:[^/]+/)*id_(?P<id>\d+)'
_TEST = {
diff --git a/yt_dlp/extractor/tv2.py b/yt_dlp/extractor/tv2.py
index f6b452dc8..7756aa3f5 100644
--- a/yt_dlp/extractor/tv2.py
+++ b/yt_dlp/extractor/tv2.py
@@ -161,6 +161,7 @@ class TV2ArticleIE(InfoExtractor):
class KatsomoIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?(?:katsomo|mtv(uutiset)?)\.fi/(?:sarja/[0-9a-z-]+-\d+/[0-9a-z-]+-|(?:#!/)?jakso/(?:\d+/[^/]+/)?|video/prog)(?P<id>\d+)'
_TESTS = [{
'url': 'https://www.mtv.fi/sarja/mtv-uutiset-live-33001002003/lahden-pelicans-teki-kovan-ratkaisun-ville-nieminen-pihalle-1181321',
@@ -279,6 +280,7 @@ class KatsomoIE(InfoExtractor):
class MTVUutisetArticleIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)mtvuutiset\.fi/artikkeli/[^/]+/(?P<id>\d+)'
_TESTS = [{
'url': 'https://www.mtvuutiset.fi/artikkeli/tallaisia-vaurioita-viking-amorellassa-on-useamman-osaston-alla-vetta/7931384',
diff --git a/yt_dlp/extractor/tvn24.py b/yt_dlp/extractor/tvn24.py
index 9c777c17d..527681315 100644
--- a/yt_dlp/extractor/tvn24.py
+++ b/yt_dlp/extractor/tvn24.py
@@ -7,6 +7,7 @@ from ..utils import (
class TVN24IE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:(?:[^/]+)\.)?tvn24(?:bis)?\.pl/(?:[^/]+/)*(?P<id>[^/]+)'
_TESTS = [{
'url': 'http://www.tvn24.pl/wiadomosci-z-kraju,3/oredzie-artura-andrusa,702428.html',
diff --git a/yt_dlp/extractor/tvnoe.py b/yt_dlp/extractor/tvnoe.py
index 712fbb275..917c46bd1 100644
--- a/yt_dlp/extractor/tvnoe.py
+++ b/yt_dlp/extractor/tvnoe.py
@@ -7,6 +7,7 @@ from ..utils import (
class TVNoeIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?tvnoe\.cz/video/(?P<id>[0-9]+)'
_TEST = {
'url': 'http://www.tvnoe.cz/video/10362',
diff --git a/yt_dlp/extractor/ukcolumn.py b/yt_dlp/extractor/ukcolumn.py
index aade79f20..f914613c0 100644
--- a/yt_dlp/extractor/ukcolumn.py
+++ b/yt_dlp/extractor/ukcolumn.py
@@ -9,6 +9,7 @@ from .youtube import YoutubeIE
class UkColumnIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'ukcolumn'
_VALID_URL = r'(?i)https?://(?:www\.)?ukcolumn\.org(/index\.php)?/(?:video|ukcolumn-news)/(?P<id>[-a-z0-9]+)'
diff --git a/yt_dlp/extractor/umg.py b/yt_dlp/extractor/umg.py
index 3ffcb7364..1da4ecdf8 100644
--- a/yt_dlp/extractor/umg.py
+++ b/yt_dlp/extractor/umg.py
@@ -7,6 +7,7 @@ from ..utils import (
class UMGDeIE(InfoExtractor):
+ _WORKING = False
IE_NAME = 'umg:de'
IE_DESC = 'Universal Music Deutschland'
_VALID_URL = r'https?://(?:www\.)?universal-music\.de/[^/]+/videos/[^/?#]+-(?P<id>\d+)'
diff --git a/yt_dlp/extractor/unity.py b/yt_dlp/extractor/unity.py
index d1b0ecbf3..6d8bc0593 100644
--- a/yt_dlp/extractor/unity.py
+++ b/yt_dlp/extractor/unity.py
@@ -3,6 +3,7 @@ from .youtube import YoutubeIE
class UnityIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?unity3d\.com/learn/tutorials/(?:[^/]+/)*(?P<id>[^/?#&]+)'
_TESTS = [{
'url': 'https://unity3d.com/learn/tutorials/topics/animation/animate-anything-mecanim',
diff --git a/yt_dlp/extractor/urort.py b/yt_dlp/extractor/urort.py
index debd2ba9e..f14d7cce6 100644
--- a/yt_dlp/extractor/urort.py
+++ b/yt_dlp/extractor/urort.py
@@ -5,6 +5,7 @@ from ..utils import unified_strdate
class UrortIE(InfoExtractor):
+ _WORKING = False
IE_DESC = 'NRK P3 Urørt'
_VALID_URL = r'https?://(?:www\.)?urort\.p3\.no/#!/Band/(?P<id>[^/]+)$'
diff --git a/yt_dlp/extractor/varzesh3.py b/yt_dlp/extractor/varzesh3.py
index 2c13cbdc0..07a2d5329 100644
--- a/yt_dlp/extractor/varzesh3.py
+++ b/yt_dlp/extractor/varzesh3.py
@@ -7,6 +7,7 @@ from ..utils import (
class Varzesh3IE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?video\.varzesh3\.com/(?:[^/]+/)+(?P<id>[^/]+)/?'
_TESTS = [{
'url': 'http://video.varzesh3.com/germany/bundesliga/5-%D9%88%D8%A7%DA%A9%D9%86%D8%B4-%D8%A8%D8%B1%D8%AA%D8%B1-%D8%AF%D8%B1%D9%88%D8%A7%D8%B2%D9%87%E2%80%8C%D8%A8%D8%A7%D9%86%D8%A7%D9%86%D8%9B%D9%87%D9%81%D8%AA%D9%87-26-%D8%A8%D9%88%D9%86%D8%AF%D8%B3/',
diff --git a/yt_dlp/extractor/vesti.py b/yt_dlp/extractor/vesti.py
index e9731a941..3f2dddbe9 100644
--- a/yt_dlp/extractor/vesti.py
+++ b/yt_dlp/extractor/vesti.py
@@ -6,6 +6,7 @@ from .rutv import RUTVIE
class VestiIE(InfoExtractor):
+ _WORKING = False
IE_DESC = 'Вести.Ru'
_VALID_URL = r'https?://(?:.+?\.)?vesti\.ru/(?P<id>.+)'
diff --git a/yt_dlp/extractor/videofyme.py b/yt_dlp/extractor/videofyme.py
index 735432688..f1f88c499 100644
--- a/yt_dlp/extractor/videofyme.py
+++ b/yt_dlp/extractor/videofyme.py
@@ -6,6 +6,7 @@ from ..utils import (
class VideofyMeIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.videofy\.me/.+?|p\.videofy\.me/v)/(?P<id>\d+)(&|#|$)'
IE_NAME = 'videofy.me'
diff --git a/yt_dlp/extractor/viqeo.py b/yt_dlp/extractor/viqeo.py
index 79b9f299a..f0a7b5e44 100644
--- a/yt_dlp/extractor/viqeo.py
+++ b/yt_dlp/extractor/viqeo.py
@@ -7,6 +7,7 @@ from ..utils import (
class ViqeoIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'''(?x)
(?:
viqeo:|
diff --git a/yt_dlp/extractor/voicy.py b/yt_dlp/extractor/voicy.py
index 7438b4956..9ab97688a 100644
--- a/yt_dlp/extractor/voicy.py
+++ b/yt_dlp/extractor/voicy.py
@@ -62,6 +62,7 @@ class VoicyBaseIE(InfoExtractor):
class VoicyIE(VoicyBaseIE):
+ _WORKING = False
IE_NAME = 'voicy'
_VALID_URL = r'https?://voicy\.jp/channel/(?P<channel_id>\d+)/(?P<id>\d+)'
ARTICLE_LIST_API_URL = 'https://vmw.api.voicy.jp/articles_list?channel_id=%s&pid=%s'
@@ -88,6 +89,7 @@ class VoicyIE(VoicyBaseIE):
class VoicyChannelIE(VoicyBaseIE):
+ _WORKING = False
IE_NAME = 'voicy:channel'
_VALID_URL = r'https?://voicy\.jp/channel/(?P<id>\d+)'
PROGRAM_LIST_API_URL = 'https://vmw.api.voicy.jp/program_list/all?channel_id=%s&limit=20&public_type=3%s'
diff --git a/yt_dlp/extractor/vtm.py b/yt_dlp/extractor/vtm.py
index 6381fd311..6db49c5b6 100644
--- a/yt_dlp/extractor/vtm.py
+++ b/yt_dlp/extractor/vtm.py
@@ -7,6 +7,7 @@ from ..utils import (
class VTMIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?vtm\.be/([^/?&#]+)~v(?P<id>[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12})'
_TEST = {
'url': 'https://vtm.be/gast-vernielt-genkse-hotelkamer~ve7534523-279f-4b4d-a5c9-a33ffdbe23e1',
diff --git a/yt_dlp/extractor/weiqitv.py b/yt_dlp/extractor/weiqitv.py
index c9ff64154..89e4856ca 100644
--- a/yt_dlp/extractor/weiqitv.py
+++ b/yt_dlp/extractor/weiqitv.py
@@ -2,6 +2,7 @@ from .common import InfoExtractor
class WeiqiTVIE(InfoExtractor):
+ _WORKING = False
IE_DESC = 'WQTV'
_VALID_URL = r'https?://(?:www\.)?weiqitv\.com/index/video_play\?videoId=(?P<id>[A-Za-z0-9]+)'
diff --git a/yt_dlp/extractor/xinpianchang.py b/yt_dlp/extractor/xinpianchang.py
index 9b878de85..bd67e8b29 100644
--- a/yt_dlp/extractor/xinpianchang.py
+++ b/yt_dlp/extractor/xinpianchang.py
@@ -9,6 +9,7 @@ from ..utils import (
class XinpianchangIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://www\.xinpianchang\.com/(?P<id>[^/]+?)(?:\D|$)'
IE_NAME = 'xinpianchang'
IE_DESC = 'xinpianchang.com'
diff --git a/yt_dlp/extractor/xminus.py b/yt_dlp/extractor/xminus.py
index 5f113810f..37e31045c 100644
--- a/yt_dlp/extractor/xminus.py
+++ b/yt_dlp/extractor/xminus.py
@@ -12,6 +12,7 @@ from ..utils import (
class XMinusIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://(?:www\.)?x-minus\.org/track/(?P<id>[0-9]+)'
_TEST = {
'url': 'http://x-minus.org/track/4542/%D0%BF%D0%B5%D1%81%D0%B5%D0%BD%D0%BA%D0%B0-%D1%88%D0%BE%D1%84%D0%B5%D1%80%D0%B0.html',
diff --git a/yt_dlp/extractor/yapfiles.py b/yt_dlp/extractor/yapfiles.py
index 19812bae0..d6024d912 100644
--- a/yt_dlp/extractor/yapfiles.py
+++ b/yt_dlp/extractor/yapfiles.py
@@ -8,6 +8,7 @@ from ..utils import (
class YapFilesIE(InfoExtractor):
+ _WORKING = False
_YAPFILES_URL = r'//(?:(?:www|api)\.)?yapfiles\.ru/get_player/*\?.*?\bv=(?P<id>\w+)'
_VALID_URL = r'https?:%s' % _YAPFILES_URL
_EMBED_REGEX = [rf'<iframe\b[^>]+\bsrc=(["\'])(?P<url>(?:https?:)?{_YAPFILES_URL}.*?)\1']
diff --git a/yt_dlp/extractor/yappy.py b/yt_dlp/extractor/yappy.py
index 7b3d0cb81..5ce647eee 100644
--- a/yt_dlp/extractor/yappy.py
+++ b/yt_dlp/extractor/yappy.py
@@ -9,6 +9,7 @@ from ..utils import (
class YappyIE(InfoExtractor):
+ _WORKING = False
_VALID_URL = r'https?://yappy\.media/video/(?P<id>\w+)'
_TESTS = [{
'url': 'https://yappy.media/video/47fea6d8586f48d1a0cf96a7342aabd2',
diff --git a/yt_dlp/extractor/zeenews.py b/yt_dlp/extractor/zeenews.py
index 1616dbfbf..e2cb1e7d6 100644
--- a/yt_dlp/extractor/zeenews.py
+++ b/yt_dlp/extractor/zeenews.py
@@ -3,6 +3,8 @@ from ..utils import ExtractorError, traverse_obj
class ZeeNewsIE(InfoExtractor):
+ _WORKING = False
+ _ENABLED = None # XXX: pass through to GenericIE
_VALID_URL = r'https?://zeenews\.india\.com/[^#?]+/video/(?P<display_id>[^#/?]+)/(?P<id>\d+)'
_TESTS = [
{