@ -1,4 +1,3 @@
import re
from . common import InfoExtractor
from . common import InfoExtractor
from . . utils import (
from . . utils import (
@ -7,86 +6,28 @@ from ..utils import (
)
)
class KinescopeIE ( InfoExtractor ) :
class KinescopeBaseIE ( InfoExtractor ) :
_DOMAINS = (
' sponsr.ru ' ,
)
_VALID_URL = rf ''' (?x)
https ? : / / ( ? : www \. ) ? ( ? P < host > { " | " . join ( map ( re . escape , _DOMAINS ) ) } ) /
( ? : [ ^ / ] + ) / ( ? P < id > \d + ) ( ? : / ( [ ^ / ? #]+))?
'''
# _VALID_URL = r'https?://(?:www\.)?sponsr\.ru/(?:[^/]+)/(?P<id>[0-9]+)'
_TESTS = [ {
' url ' : ' https://sponsr.ru/vpered/114539/Rossiya_stroit_zavod_poluprovodnikov_vkosmose_Eksperiment_nachalsya ' ,
' md5 ' : ' f94e07364c18df48b65903255123cc06 ' ,
' info_dict ' : {
' id ' : ' 114539 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Россия строит завод полупроводников в космосе. Эксперимент начался! | Время - вперёд! | Sponsr ' ,
' description ' : ' Россия строит завод полупроводников в космосе. Эксперимент начался!. О позитивных достижениях России в сфере экономики, науки и о подвигах наших соотечественников ' ,
} ,
} , {
' url ' : ' https://sponsr.ru/vpered/113655/Rossiya_zanedelu_megaturbina_novyi_reaktor_sputniki_bespilotnik_idrugie_chudesa_tehniki ' ,
' md5 ' : ' 763cad7f406cf35c5169ec95fcbd637f ' ,
' info_dict ' : {
' id ' : ' 113655 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Россия за неделю: мегатурбина, новый реактор, спутники, беспилотник и другие чудеса техники | Время - вперёд! | Sponsr ' ,
' description ' : ' Россия за неделю: мегатурбина, новый реактор, спутники, беспилотник и другие чудеса техники. О позитивных достижениях России в сфере экономики, науки и о подвигах наших соотечественников ' ,
} ,
} , {
' url ' : ' https://sponsr.ru/savvateev/114618/ZADACHKI_IZ_BROSHURY_KOLMOGOROVA__PRODOLJENIE/ ' ,
' md5 ' : ' b70e84d53fbbd1144230e30207b57e7d ' ,
' info_dict ' : {
' id ' : ' 114618 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' ЗАДАЧКИ ИЗ БРОШЮРЫ КОЛМОГОРОВА - ПРОДОЛЖЕНИЕ! | Маткульт-привет! | Sponsr ' ,
' description ' : ' ЗАДАЧКИ ИЗ БРОШЮРЫ КОЛМОГОРОВА - ПРОДОЛЖЕНИЕ!. Алексей Савватеев — популяризатор математики и пламенный борец за улучшение школьного образования. Лекции, выступления, новости ' ,
} ,
} ,
]
def _call_api ( self , url , video_id , fatal = False , * * kwargs ) :
content = self . _download_json ( url , video_id , fatal = fatal , * * kwargs )
if traverse_obj ( content , ' error ' ) :
raise self . _error_or_warning ( ExtractorError (
f ' Kinescope said: { content [ " error " ] } ' , expected = True ) , fatal = fatal )
return content or { }
def _real_extract ( self , url ) :
video_id = self . _match_id ( url )
webpage = self . _download_webpage ( url , video_id )
media_id = self . _html_search_regex ( r ' video_id=(.+?) \ ? ' , webpage , ' media_id ' )
token = traverse_obj ( self . _search_nextjs_data ( webpage , video_id ) , ( ' props ' , ' pageProps ' , ' project ' , ' project_kinescope_token ' ) )
def _get_video_info ( self , media_id , token , fatal = False , * * kwargs ) :
headers = { ' Authorization ' : f ' Bearer { token } ' , ' Content-Type ' : ' application/json ' }
headers = { ' Authorization ' : f ' Bearer { token } ' , ' Content-Type ' : ' application/json ' }
video_info = self . _download_json ( f ' https://api.kinescope.io/v1/videos/ { media_id } ' ,
media_id , fatal = fatal , headers = headers , * * kwargs )
if traverse_obj ( video_info , ' error ' ) :
raise self . _error_or_warning ( ExtractorError (
f ' Kinescope said: { video_info [ " error " ] } ' , expected = True ) , fatal = fatal )
return video_info or { }
video_info = self . _call_api (
def _get_formats ( self , video_info , fatal = False , * * kwargs ) :
f ' https://api.kinescope.io/v1/videos/ { media_id } ' , media_id , fatal = True ,
if traverse_obj ( video_info , ' error ' ) :
note = ' Downloading video file info ' , headers = headers )
raise self . _error_or_warning ( ExtractorError (
f ' Kinescope said: { video_info [ " error " ] } ' , expected = True ) , fatal = fatal )
formats = [ ]
else :
for item in traverse_obj ( video_info , ( ' data ' , ' assets ' ) ) :
formats = [ ]
formats . append ( {
for item in traverse_obj ( video_info , ( ' data ' , ' assets ' ) ) :
' url ' : item . get ( ' download_link ' ) ,
formats . append ( {
' format_id ' : item . get ( ' quality ' ) ,
' url ' : item . get ( ' download_link ' ) ,
' ext ' : item . get ( ' filetype ' ) ,
' format_id ' : item . get ( ' quality ' ) ,
' resolution ' : item . get ( ' resolution ' ) ,
' ext ' : item . get ( ' filetype ' ) ,
} )
' resolution ' : item . get ( ' resolution ' ) ,
} )
return {
return formats or { }
' id ' : video_id ,
' title ' : self . _og_search_title ( webpage ) ,
' description ' : self . _og_search_description ( webpage ) ,
' formats ' : formats ,
# 'uploader': self._search_regex(r'<div[^>]+id="uploader"[^>]*>([^<]+)<', webpage, 'uploader', fatal=False),
# TODO: more properties (see yt_dlp/extractor/common.py)
}