commit
c89267d31a
99 changed files with 2121 additions and 689 deletions
@ -0,0 +1,14 @@ |
||||
#EXTM3U |
||||
#EXT-X-VERSION:5 |
||||
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Francais",DEFAULT=NO,FORCED=NO,URI="http://replayftv-pmd.francetv.fr/subtitles/2017/16/156589847-1492488987.m3u8",LANGUAGE="fra" |
||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",LANGUAGE="fra",NAME="Francais",DEFAULT=YES, AUTOSELECT=YES |
||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=180000,RESOLUTION=256x144,CODECS="avc1.66.30, mp4a.40.2" |
||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_0_av.m3u8?null=0 |
||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=303000,RESOLUTION=320x180,CODECS="avc1.66.30, mp4a.40.2" |
||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_1_av.m3u8?null=0 |
||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=575000,RESOLUTION=512x288,CODECS="avc1.66.30, mp4a.40.2" |
||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_2_av.m3u8?null=0 |
||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=831000,RESOLUTION=704x396,CODECS="avc1.77.30, mp4a.40.2" |
||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_3_av.m3u8?null=0 |
||||
#EXT-X-STREAM-INF:SUBTITLES="subs",AUDIO="aac",PROGRAM-ID=1,BANDWIDTH=1467000,RESOLUTION=1024x576,CODECS="avc1.77.30, mp4a.40.2" |
||||
http://replayftv-vh.akamaihd.net/i/streaming-adaptatif_france-dom-tom/2017/S16/J2/156589847-58f59130c1f52-,standard1,standard2,standard3,standard4,standard5,.mp4.csmil/index_4_av.m3u8?null=0 |
@ -0,0 +1,16 @@ |
||||
#EXTM3U |
||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-0",NAME="Default",AUTOSELECT=YES,DEFAULT=YES,URI="hls/CONAN_020217_Highlight_show-audio-160k_v4.m3u8" |
||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio-1",NAME="Default",AUTOSELECT=YES,DEFAULT=YES,URI="hls/CONAN_020217_Highlight_show-audio-64k_v4.m3u8" |
||||
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=37862000,CODECS="avc1.4d001f",URI="hls/CONAN_020217_Highlight_show-2m_iframe.m3u8" |
||||
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=18750000,CODECS="avc1.4d001e",URI="hls/CONAN_020217_Highlight_show-1m_iframe.m3u8" |
||||
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=6535000,CODECS="avc1.42001e",URI="hls/CONAN_020217_Highlight_show-400k_iframe.m3u8" |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2374000,RESOLUTION=1024x576,CODECS="avc1.4d001f,mp4a.40.2",AUDIO="audio-0" |
||||
hls/CONAN_020217_Highlight_show-2m_v4.m3u8 |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1205000,RESOLUTION=640x360,CODECS="avc1.4d001e,mp4a.40.2",AUDIO="audio-0" |
||||
hls/CONAN_020217_Highlight_show-1m_v4.m3u8 |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=522000,RESOLUTION=400x224,CODECS="avc1.42001e,mp4a.40.2",AUDIO="audio-0" |
||||
hls/CONAN_020217_Highlight_show-400k_v4.m3u8 |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=413000,RESOLUTION=400x224,CODECS="avc1.42001e,mp4a.40.5",AUDIO="audio-1" |
||||
hls/CONAN_020217_Highlight_show-400k_v4.m3u8 |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=71000,CODECS="mp4a.40.5",AUDIO="audio-1" |
||||
hls/CONAN_020217_Highlight_show-audio-64k_v4.m3u8 |
@ -0,0 +1,13 @@ |
||||
#EXTM3U |
||||
#EXT-X-VERSION:4 |
||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="eng",NAME="English",URI="http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_sa2ntrdg/name/a.mp4/index.m3u8" |
||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",LANGUAGE="und",NAME="Undefined",URI="http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_r7y0nitg/name/a.mp4/index.m3u8" |
||||
|
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=155648,RESOLUTION=320x180,AUDIO="audio" |
||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_qlk9hlzr/name/a.mp4/index.m3u8 |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=502784,RESOLUTION=480x270,AUDIO="audio" |
||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/2/pv/1/flavorId/0_oefackmi/name/a.mp4/index.m3u8 |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=827392,RESOLUTION=640x360,AUDIO="audio" |
||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/12/pv/1/flavorId/0_vyg9pj7k/name/a.mp4/index.m3u8 |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1396736,RESOLUTION=854x480,AUDIO="audio" |
||||
http://k.toggle.sg/fhls/p/2082311/sp/208231100/serveFlavor/entryId/0_89q6e8ku/v/12/pv/1/flavorId/0_50n4psvx/name/a.mp4/index.m3u8 |
@ -0,0 +1,20 @@ |
||||
#EXTM3U |
||||
#EXT-X-TWITCH-INFO:ORIGIN="s3",CLUSTER="edgecast_vod",REGION="EU",MANIFEST-CLUSTER="edgecast_vod",USER-IP="109.171.17.81" |
||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="chunked",NAME="Source",AUTOSELECT=YES,DEFAULT=YES |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3214134,CODECS="avc1.100.31,mp4a.40.2",RESOLUTION="1280x720",VIDEO="chunked" |
||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/chunked/index-muted-HM49I092CC.m3u8 |
||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="high",NAME="High",AUTOSELECT=YES,DEFAULT=YES |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1603789,CODECS="avc1.42C01F,mp4a.40.2",RESOLUTION="1280x720",VIDEO="high" |
||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/high/index-muted-HM49I092CC.m3u8 |
||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="medium",NAME="Medium",AUTOSELECT=YES,DEFAULT=YES |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=893387,CODECS="avc1.42C01E,mp4a.40.2",RESOLUTION="852x480",VIDEO="medium" |
||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/medium/index-muted-HM49I092CC.m3u8 |
||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Low",AUTOSELECT=YES,DEFAULT=YES |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=628347,CODECS="avc1.42C01E,mp4a.40.2",RESOLUTION="640x360",VIDEO="low" |
||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/low/index-muted-HM49I092CC.m3u8 |
||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mobile",NAME="Mobile",AUTOSELECT=YES,DEFAULT=YES |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=280474,CODECS="avc1.42C00D,mp4a.40.2",RESOLUTION="400x226",VIDEO="mobile" |
||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/mobile/index-muted-HM49I092CC.m3u8 |
||||
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="audio_only",NAME="Audio Only",AUTOSELECT=NO,DEFAULT=NO |
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=182725,CODECS="mp4a.40.2",VIDEO="audio_only" |
||||
https://vod.edgecast.hls.ttvnw.net/e5da31ab49_riotgames_15001215120_261543898/audio_only/index-muted-HM49I092CC.m3u8 |
@ -0,0 +1,10 @@ |
||||
#EXTM3U |
||||
|
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=300000,RESOLUTION=480x270,NAME="270p 3G" |
||||
https://cdn1-a.production.vidio.static6.com/uploads/165683/dj_ambred-4383-b300.mp4.m3u8 |
||||
|
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=600000,RESOLUTION=640x360,NAME="360p SD" |
||||
https://cdn1-a.production.vidio.static6.com/uploads/165683/dj_ambred-4383-b600.mp4.m3u8 |
||||
|
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1200000,RESOLUTION=1280x720,NAME="720p HD" |
||||
https://cdn1-a.production.vidio.static6.com/uploads/165683/dj_ambred-4383-b1200.mp4.m3u8 |
@ -1,140 +0,0 @@ |
||||
from __future__ import unicode_literals |
||||
|
||||
import json |
||||
|
||||
from .common import InfoExtractor |
||||
from ..utils import ( |
||||
ExtractorError, |
||||
float_or_none, |
||||
sanitized_Request, |
||||
) |
||||
|
||||
|
||||
class AzubuIE(InfoExtractor): |
||||
_VALID_URL = r'https?://(?:www\.)?azubu\.(?:tv|uol.com.br)/[^/]+#!/play/(?P<id>\d+)' |
||||
_TESTS = [ |
||||
{ |
||||
'url': 'http://www.azubu.tv/GSL#!/play/15575/2014-hot6-cup-last-big-match-ro8-day-1', |
||||
'md5': 'a88b42fcf844f29ad6035054bd9ecaf4', |
||||
'info_dict': { |
||||
'id': '15575', |
||||
'ext': 'mp4', |
||||
'title': '2014 HOT6 CUP LAST BIG MATCH Ro8 Day 1', |
||||
'description': 'md5:d06bdea27b8cc4388a90ad35b5c66c01', |
||||
'thumbnail': r're:^https?://.*\.jpe?g', |
||||
'timestamp': 1417523507.334, |
||||
'upload_date': '20141202', |
||||
'duration': 9988.7, |
||||
'uploader': 'GSL', |
||||
'uploader_id': 414310, |
||||
'view_count': int, |
||||
}, |
||||
}, |
||||
{ |
||||
'url': 'http://www.azubu.tv/FnaticTV#!/play/9344/-fnatic-at-worlds-2014:-toyz---%22i-love-rekkles,-he-has-amazing-mechanics%22-', |
||||
'md5': 'b72a871fe1d9f70bd7673769cdb3b925', |
||||
'info_dict': { |
||||
'id': '9344', |
||||
'ext': 'mp4', |
||||
'title': 'Fnatic at Worlds 2014: Toyz - "I love Rekkles, he has amazing mechanics"', |
||||
'description': 'md5:4a649737b5f6c8b5c5be543e88dc62af', |
||||
'thumbnail': r're:^https?://.*\.jpe?g', |
||||
'timestamp': 1410530893.320, |
||||
'upload_date': '20140912', |
||||
'duration': 172.385, |
||||
'uploader': 'FnaticTV', |
||||
'uploader_id': 272749, |
||||
'view_count': int, |
||||
}, |
||||
'skip': 'Channel offline', |
||||
}, |
||||
] |
||||
|
||||
def _real_extract(self, url): |
||||
video_id = self._match_id(url) |
||||
|
||||
data = self._download_json( |
||||
'http://www.azubu.tv/api/video/%s' % video_id, video_id)['data'] |
||||
|
||||
title = data['title'].strip() |
||||
description = data.get('description') |
||||
thumbnail = data.get('thumbnail') |
||||
view_count = data.get('view_count') |
||||
user = data.get('user', {}) |
||||
uploader = user.get('username') |
||||
uploader_id = user.get('id') |
||||
|
||||
stream_params = json.loads(data['stream_params']) |
||||
|
||||
timestamp = float_or_none(stream_params.get('creationDate'), 1000) |
||||
duration = float_or_none(stream_params.get('length'), 1000) |
||||
|
||||
renditions = stream_params.get('renditions') or [] |
||||
video = stream_params.get('FLVFullLength') or stream_params.get('videoFullLength') |
||||
if video: |
||||
renditions.append(video) |
||||
|
||||
if not renditions and not user.get('channel', {}).get('is_live', True): |
||||
raise ExtractorError('%s said: channel is offline.' % self.IE_NAME, expected=True) |
||||
|
||||
formats = [{ |
||||
'url': fmt['url'], |
||||
'width': fmt['frameWidth'], |
||||
'height': fmt['frameHeight'], |
||||
'vbr': float_or_none(fmt['encodingRate'], 1000), |
||||
'filesize': fmt['size'], |
||||
'vcodec': fmt['videoCodec'], |
||||
'container': fmt['videoContainer'], |
||||
} for fmt in renditions if fmt['url']] |
||||
self._sort_formats(formats) |
||||
|
||||
return { |
||||
'id': video_id, |
||||
'title': title, |
||||
'description': description, |
||||
'thumbnail': thumbnail, |
||||
'timestamp': timestamp, |
||||
'duration': duration, |
||||
'uploader': uploader, |
||||
'uploader_id': uploader_id, |
||||
'view_count': view_count, |
||||
'formats': formats, |
||||
} |
||||
|
||||
|
||||
class AzubuLiveIE(InfoExtractor): |
||||
_VALID_URL = r'https?://(?:www\.)?azubu\.(?:tv|uol.com.br)/(?P<id>[^/]+)$' |
||||
|
||||
_TESTS = [{ |
||||
'url': 'http://www.azubu.tv/MarsTVMDLen', |
||||
'only_matching': True, |
||||
}, { |
||||
'url': 'http://azubu.uol.com.br/adolfz', |
||||
'only_matching': True, |
||||
}] |
||||
|
||||
def _real_extract(self, url): |
||||
user = self._match_id(url) |
||||
|
||||
info = self._download_json( |
||||
'http://api.azubu.tv/public/modules/last-video/{0}/info'.format(user), |
||||
user)['data'] |
||||
if info['type'] != 'STREAM': |
||||
raise ExtractorError('{0} is not streaming live'.format(user), expected=True) |
||||
|
||||
req = sanitized_Request( |
||||
'https://edge-elb.api.brightcove.com/playback/v1/accounts/3361910549001/videos/ref:' + info['reference_id']) |
||||
req.add_header('Accept', 'application/json;pk=BCpkADawqM1gvI0oGWg8dxQHlgT8HkdE2LnAlWAZkOlznO39bSZX726u4JqnDsK3MDXcO01JxXK2tZtJbgQChxgaFzEVdHRjaDoxaOu8hHOO8NYhwdxw9BzvgkvLUlpbDNUuDoc4E4wxDToV') |
||||
bc_info = self._download_json(req, user) |
||||
m3u8_url = next(source['src'] for source in bc_info['sources'] if source['container'] == 'M2TS') |
||||
formats = self._extract_m3u8_formats(m3u8_url, user, ext='mp4') |
||||
self._sort_formats(formats) |
||||
|
||||
return { |
||||
'id': info['id'], |
||||
'title': self._live_title(info['title']), |
||||
'uploader_id': user, |
||||
'formats': formats, |
||||
'is_live': True, |
||||
'thumbnail': bc_info['poster'], |
||||
} |
@ -0,0 +1,97 @@ |
||||
# coding: utf-8 |
||||
from __future__ import unicode_literals |
||||
|
||||
from .brightcove import BrightcoveNewIE |
||||
from .common import InfoExtractor |
||||
from ..compat import compat_str |
||||
from ..utils import ( |
||||
int_or_none, |
||||
smuggle_url, |
||||
try_get, |
||||
) |
||||
|
||||
|
||||
class NoovoIE(InfoExtractor): |
||||
_VALID_URL = r'https?://(?:[^/]+\.)?noovo\.ca/videos/(?P<id>[^/]+/[^/?#&]+)' |
||||
_TESTS = [{ |
||||
# clip |
||||
'url': 'http://noovo.ca/videos/rpm-plus/chrysler-imperial', |
||||
'info_dict': { |
||||
'id': '5386045029001', |
||||
'ext': 'mp4', |
||||
'title': 'Chrysler Imperial', |
||||
'description': 'md5:de3c898d1eb810f3e6243e08c8b4a056', |
||||
'timestamp': 1491399228, |
||||
'upload_date': '20170405', |
||||
'uploader_id': '618566855001', |
||||
'creator': 'vtele', |
||||
'view_count': int, |
||||
'series': 'RPM+', |
||||
}, |
||||
'params': { |
||||
'skip_download': True, |
||||
}, |
||||
}, { |
||||
# episode |
||||
'url': 'http://noovo.ca/videos/l-amour-est-dans-le-pre/episode-13-8', |
||||
'info_dict': { |
||||
'id': '5395865725001', |
||||
'title': 'Épisode 13 : Les retrouvailles', |
||||
'description': 'md5:336d5ebc5436534e61d16e63ddfca327', |
||||
'ext': 'mp4', |
||||
'timestamp': 1492019320, |
||||
'upload_date': '20170412', |
||||
'uploader_id': '618566855001', |
||||
'creator': 'vtele', |
||||
'view_count': int, |
||||
'series': "L'amour est dans le pré", |
||||
'season_number': 5, |
||||
'episode': 'Épisode 13', |
||||
'episode_number': 13, |
||||
}, |
||||
'params': { |
||||
'skip_download': True, |
||||
}, |
||||
}] |
||||
BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/618566855001/default_default/index.html?videoId=%s' |
||||
|
||||
def _real_extract(self, url): |
||||
video_id = self._match_id(url) |
||||
|
||||
data = self._download_json( |
||||
'http://api.noovo.ca/api/v1/pages/single-episode/%s' % video_id, |
||||
video_id)['data'] |
||||
|
||||
content = try_get(data, lambda x: x['contents'][0]) |
||||
|
||||
brightcove_id = data.get('brightcoveId') or content['brightcoveId'] |
||||
|
||||
series = try_get( |
||||
data, ( |
||||
lambda x: x['show']['title'], |
||||
lambda x: x['season']['show']['title']), |
||||
compat_str) |
||||
|
||||
episode = None |
||||
og = data.get('og') |
||||
if isinstance(og, dict) and og.get('type') == 'video.episode': |
||||
episode = og.get('title') |
||||
|
||||
video = content or data |
||||
|
||||
return { |
||||
'_type': 'url_transparent', |
||||
'ie_key': BrightcoveNewIE.ie_key(), |
||||
'url': smuggle_url( |
||||
self.BRIGHTCOVE_URL_TEMPLATE % brightcove_id, |
||||
{'geo_countries': ['CA']}), |
||||
'id': brightcove_id, |
||||
'title': video.get('title'), |
||||
'creator': video.get('source'), |
||||
'view_count': int_or_none(video.get('viewsCount')), |
||||
'series': series, |
||||
'season_number': int_or_none(try_get( |
||||
data, lambda x: x['season']['seasonNumber'])), |
||||
'episode': episode, |
||||
'episode_number': int_or_none(data.get('episodeNumber')), |
||||
} |
@ -0,0 +1,64 @@ |
||||
# coding: utf-8 |
||||
from __future__ import unicode_literals |
||||
|
||||
import re |
||||
|
||||
from .common import InfoExtractor |
||||
from ..utils import ( |
||||
determine_ext, |
||||
int_or_none, |
||||
js_to_json, |
||||
) |
||||
|
||||
|
||||
class StreamangoIE(InfoExtractor): |
||||
_VALID_URL = r'https?://(?:www\.)?streamango\.com/(?:f|embed)/(?P<id>[^/?#&]+)' |
||||
_TESTS = [{ |
||||
'url': 'https://streamango.com/f/clapasobsptpkdfe/20170315_150006_mp4', |
||||
'md5': 'e992787515a182f55e38fc97588d802a', |
||||
'info_dict': { |
||||
'id': 'clapasobsptpkdfe', |
||||
'ext': 'mp4', |
||||
'title': '20170315_150006.mp4', |
||||
} |
||||
}, { |
||||
'url': 'https://streamango.com/embed/clapasobsptpkdfe/20170315_150006_mp4', |
||||
'only_matching': True, |
||||
}] |
||||
|
||||
def _real_extract(self, url): |
||||
video_id = self._match_id(url) |
||||
|
||||
webpage = self._download_webpage(url, video_id) |
||||
|
||||
title = self._og_search_title(webpage) |
||||
|
||||
formats = [] |
||||
for format_ in re.findall(r'({[^}]*\bsrc\s*:\s*[^}]*})', webpage): |
||||
video = self._parse_json( |
||||
format_, video_id, transform_source=js_to_json, fatal=False) |
||||
if not video: |
||||
continue |
||||
src = video.get('src') |
||||
if not src: |
||||
continue |
||||
ext = determine_ext(src, default_ext=None) |
||||
if video.get('type') == 'application/dash+xml' or ext == 'mpd': |
||||
formats.extend(self._extract_mpd_formats( |
||||
src, video_id, mpd_id='dash', fatal=False)) |
||||
else: |
||||
formats.append({ |
||||
'url': src, |
||||
'ext': ext or 'mp4', |
||||
'width': int_or_none(video.get('width')), |
||||
'height': int_or_none(video.get('height')), |
||||
'tbr': int_or_none(video.get('bitrate')), |
||||
}) |
||||
self._sort_formats(formats) |
||||
|
||||
return { |
||||
'id': video_id, |
||||
'url': url, |
||||
'title': title, |
||||
'formats': formats, |
||||
} |
@ -0,0 +1,101 @@ |
||||
# coding: utf-8 |
||||
from __future__ import unicode_literals |
||||
|
||||
from .common import InfoExtractor |
||||
from ..utils import ( |
||||
int_or_none, |
||||
unified_timestamp, |
||||
) |
||||
|
||||
|
||||
class Zaq1IE(InfoExtractor): |
||||
_VALID_URL = r'https?://(?:www\.)?zaq1\.pl/video/(?P<id>[^/?#&]+)' |
||||
_TESTS = [{ |
||||
'url': 'http://zaq1.pl/video/xev0e', |
||||
'md5': '24a5eb3f052e604ae597c4d0d19b351e', |
||||
'info_dict': { |
||||
'id': 'xev0e', |
||||
'title': 'DJ NA WESELE. TANIEC Z FIGURAMI.węgrów/sokołów podlaski/siedlce/mińsk mazowiecki/warszawa', |
||||
'description': 'www.facebook.com/weseledjKontakt: 728 448 199 / 505 419 147', |
||||
'ext': 'mp4', |
||||
'duration': 511, |
||||
'timestamp': 1490896361, |
||||
'uploader': 'Anonim', |
||||
'upload_date': '20170330', |
||||
'view_count': int, |
||||
} |
||||
}, { |
||||
# malformed JSON-LD |
||||
'url': 'http://zaq1.pl/video/x81vn', |
||||
'info_dict': { |
||||
'id': 'x81vn', |
||||
'title': 'SEKRETNE ŻYCIE WALTERA MITTY', |
||||
'ext': 'mp4', |
||||
'duration': 6234, |
||||
'timestamp': 1493494860, |
||||
'uploader': 'Anonim', |
||||
'upload_date': '20170429', |
||||
'view_count': int, |
||||
}, |
||||
'params': { |
||||
'skip_download': True, |
||||
}, |
||||
'expected_warnings': ['Failed to parse JSON'], |
||||
}] |
||||
|
||||
def _real_extract(self, url): |
||||
video_id = self._match_id(url) |
||||
|
||||
webpage = self._download_webpage(url, video_id) |
||||
|
||||
video_url = self._search_regex( |
||||
r'data-video-url=(["\'])(?P<url>(?:(?!\1).)+)\1', webpage, |
||||
'video url', group='url') |
||||
|
||||
info = self._search_json_ld(webpage, video_id, fatal=False) |
||||
|
||||
def extract_data(field, name, fatal=False): |
||||
return self._search_regex( |
||||
r'data-%s=(["\'])(?P<field>(?:(?!\1).)+)\1' % field, |
||||
webpage, field, fatal=fatal, group='field') |
||||
|
||||
if not info.get('title'): |
||||
info['title'] = extract_data('file-name', 'title', fatal=True) |
||||
|
||||
if not info.get('duration'): |
||||
info['duration'] = int_or_none(extract_data('duration', 'duration')) |
||||
|
||||
if not info.get('thumbnail'): |
||||
info['thumbnail'] = extract_data('photo-url', 'thumbnail') |
||||
|
||||
if not info.get('timestamp'): |
||||
info['timestamp'] = unified_timestamp(self._html_search_meta( |
||||
'uploadDate', webpage, 'timestamp')) |
||||
|
||||
if not info.get('interactionCount'): |
||||
info['view_count'] = int_or_none(self._html_search_meta( |
||||
'interactionCount', webpage, 'view count')) |
||||
|
||||
uploader = self._html_search_regex( |
||||
r'Wideo dodał:\s*<a[^>]*>([^<]+)</a>', webpage, 'uploader', |
||||
fatal=False) |
||||
|
||||
width = int_or_none(self._html_search_meta( |
||||
'width', webpage, fatal=False)) |
||||
height = int_or_none(self._html_search_meta( |
||||
'height', webpage, fatal=False)) |
||||
|
||||
info.update({ |
||||
'id': video_id, |
||||
'formats': [{ |
||||
'url': video_url, |
||||
'width': width, |
||||
'height': height, |
||||
'http_headers': { |
||||
'Referer': url, |
||||
}, |
||||
}], |
||||
'uploader': uploader, |
||||
}) |
||||
|
||||
return info |
@ -1,3 +1,3 @@ |
||||
from __future__ import unicode_literals |
||||
|
||||
__version__ = '2017.04.15' |
||||
__version__ = '2017.05.01' |
||||
|
Loading…
Reference in new issue