#!/usr/bin/env python import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http from livestreamer.stream import HLSStream from livestreamer.plugin.api import validate STREAM_INFO_URL = "http://dinamics.ccma.cat/pvideo/media.jsp?media=video&version=0s&idint={ident}&profile=pc&desplacament=0" _url_re = re.compile(r"http://(?:www.)?ccma.cat/tv3/directe/(.+?)/") _media_schema = validate.Schema({ "geo": validate.text, "url": validate.url(scheme=validate.any("http")) }) _channel_schema = validate.Schema({ "media": validate.any([_media_schema], _media_schema) }) class TV3Cat(Plugin): @classmethod def can_handle_url(self, url): match = _url_re.match(url) return match def _get_streams(self): match = _url_re.match(self.url) if match: ident = match.group(1) data_url = STREAM_INFO_URL.format(ident=ident)
http(s)?://(\w+\.)?aliez.tv (?: /live/[^/]+ )? (?: /video/\d+/[^/]+ )? """, re.VERBOSE) _file_re = re.compile("\"?file\"?:\s+['\"]([^'\"]+)['\"]") _swf_url_re = re.compile("swfobject.embedSWF\(\"([^\"]+)\",") _schema = validate.Schema( validate.union({ "urls": validate.all(validate.transform(_file_re.findall), validate.map(unquote), [validate.url()]), "swf": validate.all( validate.transform(_swf_url_re.search), validate.any( None, validate.all( validate.get(1), validate.url(scheme="http", path=validate.endswith("swf"))))) })) class Aliez(Plugin): @classmethod def can_handle_url(self, url):
from time import time from livestreamer.plugin import Plugin, PluginError from livestreamer.plugin.api import http, validate from livestreamer.stream import RTMPStream, HLSStream SWF_URL = "http://play.streamingvideoprovider.com/player2.swf" API_URL = "http://player.webvideocore.net/index.php" _url_re = re.compile( "http(s)?://(\w+\.)?streamingvideoprovider.co.uk/(?P<channel>[^/&?]+)") _hls_re = re.compile("'(http://.+\.m3u8)'") _rtmp_schema = validate.Schema(validate.xml_findtext("./info/url"), validate.url(scheme="rtmp")) _hls_schema = validate.Schema( validate.transform(_hls_re.search), validate.any( None, validate.all( validate.get(1), validate.url(scheme="http", path=validate.endswith("m3u8"))))) class Streamingvideoprovider(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_hls_stream(self, channel_name):
{ "chansub": { "restricted_bitrates": validate.all([validate.text], validate.filter(lambda n: not re.match( r"(.+_)?archives|live|chunked", n))) } }, validate.get("chansub")) _user_schema = validate.Schema( {validate.optional("display_name"): validate.text}, validate.get("display_name")) _video_schema = validate.Schema({ "chunks": { validate.text: [{ "length": int, "url": validate.any(None, validate.url(scheme="http")), "upkeep": validate.any("pass", "fail", None) }] }, "restrictions": { validate.text: validate.text }, "start_offset": int, "end_offset": int, }) _viewer_info_schema = validate.Schema( {validate.optional("login"): validate.text}, validate.get("login")) _viewer_token_schema = validate.Schema( {validate.optional("token"): validate.text}, validate.get("token"))
{ "CHANNEL": { "RESULT": validate.transform(int), "BNO": validate.text, "CDN": validate.text, "RMD": validate.text, } }, validate.get("CHANNEL")) _channel_aid_schema = validate.Schema( {"CHANNEL": { "RESULT": validate.transform(int), "AID": validate.text, }}, validate.get("CHANNEL")) _stream_schema = validate.Schema({ validate.optional("view_url"): validate.url(scheme=validate.any("rtmp", "http")) }) class AfreecaTV_PC(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_channel_info(self, bid): headers = { "Referer": "http://play.afreecatv.com", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", } params = {"bid": bid} res = http.post(CHANNEL_INFO_URL, data=params, headers=headers)
import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream _url_re = re.compile("http(s)?://chaturbate.com/[^/?&]+") _playlist_url_re = re.compile("html \+= \"src='(?P<url>[^']+)'\";") _schema = validate.Schema( validate.transform(_playlist_url_re.search), validate.any( None, validate.all( validate.get("url"), validate.url( scheme="http", path=validate.endswith(".m3u8") ) ) ) ) class Chaturbate(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_streams(self): playlist_url = http.get(self.url, schema=_schema) if not playlist_url: return
(?: /live/[^/]+ )? (?: /video/\d+/[^/]+ )? """, re.VERBOSE, ) _file_re = re.compile('"?file"?:\s+[\'"]([^\'"]+)[\'"]') _swf_url_re = re.compile('swfobject.embedSWF\("([^"]+)",') _schema = validate.Schema( validate.union( { "urls": validate.all(validate.transform(_file_re.findall), validate.map(unquote), [validate.url()]), "swf": validate.all( validate.transform(_swf_url_re.search), validate.any( None, validate.all(validate.get(1), validate.url(scheme="http", path=validate.endswith("swf"))) ), ), } ) ) class Aliez(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url)
_live_re = re.compile(""" \s*jwplayer\(\"player\"\)\.setup\({.*? \s*primary:\s+"([^"]+)".*? \s*file:\s+"([^"]+)" """, re.DOTALL) _live_schema = validate.Schema( validate.transform(_live_re.search), validate.any( None, validate.union({ "type": validate.get(1), "url": validate.all( validate.get(2), validate.url(scheme="http"), ), }) ) ) class SSH101(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_streams(self): res = http.get(self.url, schema=_live_schema) if not res: return
_url_re = re.compile("http(s)?://(\w+\.)?filmon.us") _live_export_re = re.compile( "<iframe src=\"(https://www.filmon.com/channel/export[^\"]+)\"") _live_json_re = re.compile("var startupChannel = (.+);") _replay_json_re = re.compile( "var standByVideo = encodeURIComponent\('(.+)'\);") _history_re = re.compile( "helpers.common.flash.flashplayerinstall\({url:'([^']+)',") _video_flashvars_re = re.compile( "<embed width=\"486\" height=\"326\" flashvars=\"([^\"]+)\"") _live_schema = validate.Schema({ "streams": [{ "name": validate.text, "quality": validate.text, "url": validate.url(scheme="rtmp") }] }) _schema = validate.Schema( validate.union({ "export_url": validate.all(validate.transform(_live_export_re.search), validate.any( None, validate.get(1), )), "video_flashvars": validate.all( validate.transform(_video_flashvars_re.search), validate.any( None,
API_URL = "http://veetle.com/index.php/stream/ajaxStreamLocation/{0}/flash" _url_re = re.compile( """ http(s)?://(\w+\.)?veetle.com (:? /.*(v|view)/ (?P<channel>[^/]+/[^/&?]+) )? """, re.VERBOSE, ) _schema = validate.Schema( {validate.optional("isLive"): bool, "payload": validate.any(int, validate.url(scheme="http")), "success": bool} ) class Veetle(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_streams(self): match = _url_re.match(self.url) parsed = urlparse(self.url) if parsed.fragment: channel_id = parsed.fragment elif parsed.path[:3] == "/v/": channel_id = parsed.path.split("/")[-1]
} QUALITY_WEIGHTS = { "high": 720, "low": 480 } STREAM_TYPES = ("hls", "rtmp") _url_re = re.compile("http(s)?://(\w+\.)?filmon.com/(channel|tv|vod)/") _channel_id_re = re.compile("/channels/(\d+)/extra_big_logo.png") _vod_id_re = re.compile("movie_id=(\d+)") _channel_schema = validate.Schema({ "streams": [{ "name": validate.text, "quality": validate.text, "url": validate.url(scheme=validate.any("http", "rtmp")) }] }) _vod_schema = validate.Schema( { "data": { "streams": { validate.text: { "name": validate.text, "url": validate.url(scheme=validate.any("http", "rtmp")) } } } }, validate.get("data") )
_url_re = re.compile("http(s)?://(\w+\.)?afreeca.com/(?P<username>\w+)") _channel_schema = validate.Schema( { "CHANNEL": { "RESULT": validate.transform(int), validate.optional("BNO"): validate.text, } }, validate.get("CHANNEL") ) _stream_schema = validate.Schema( { validate.optional("view_url"): validate.url( scheme=validate.any("rtmp", "http") ) } ) class AfreecaTV(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_channel_info(self, username): data = { "bid": username } res = http.post(CHANNEL_INFO_URL, data=data)
_channel_schema = validate.Schema( { "data" : validate.any(None, { "channel" : validate.any(None, { "id" : validate.all( validate.text, validate.transform(int) ), "vid" : int }) }) }, validate.get("data") ); _qq_schema = validate.Schema({ validate.optional("playurl"): validate.url(scheme="http") }, validate.get("playurl") ) STREAM_WEIGHTS = { "middle": 540, "source": 1080 } class Tga(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) @classmethod
} }, validate.get("chansub") ) _user_schema = validate.Schema( { validate.optional("display_name"): validate.text }, validate.get("display_name") ) _video_schema = validate.Schema( { "chunks": { validate.text: [{ "length": int, "url": validate.any(None, validate.url(scheme="http")), "upkeep": validate.any("pass", "fail", None) }] }, "restrictions": {validate.text: validate.text}, "start_offset": int, "end_offset": int, } ) _viewer_info_schema = validate.Schema( { validate.optional("login"): validate.text }, validate.get("login") ) _viewer_token_schema = validate.Schema(
#!/usr/bin/env python import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http from livestreamer.stream import HLSStream from livestreamer.plugin.api import validate STREAM_INFO_URL = "http://dinamics.ccma.cat/pvideo/media.jsp?media=video&version=0s&idint={ident}&profile=pc&desplacament=0" _url_re = re.compile(r"http://(?:www.)?ccma.cat/tv3/directe/(.+?)/") _media_schema = validate.Schema({ "geo": validate.text, "url": validate.url(scheme=validate.any("http")) }) _channel_schema = validate.Schema( {"media": validate.any([_media_schema], _media_schema)}) class TV3Cat(Plugin): @classmethod def can_handle_url(self, url): match = _url_re.match(url) return match def _get_streams(self): match = _url_re.match(self.url) if match: ident = match.group(1)
SWF_URL = "http://euronews.com/media/player_live_1_14.swf" API_URL_LIVE = "http://euronews.hexaglobe.com/json/" _url_re = re.compile("http(s)?://(\w+\.)?euronews.com") _lang_re = re.compile("EN.lang\s+= \"([^\"]+)\";") _live_check_re = re.compile("swfobject.embedSWF\(\"[^\"]+\", \"streaming-live-player\",") _video_re = re.compile("{file: \"(?P<url>[^\"]+)\", label: \"(?P<name>[^\"]+)\"}") _live_schema = validate.Schema({ validate.any("primary", "secondary"): { validate.text: { "rtmp_flash": { validate.text: { "name": validate.text, "server": validate.url(scheme="rtmp") } } } } }) _schema = validate.Schema( validate.union({ "lang": validate.all( validate.transform(_lang_re.search), validate.get(1) ), "live": validate.all( validate.transform(_live_check_re.search), validate.transform(bool) ),
def test_url(self): url_ = "https://google.se/path" assert validate(url(), url_) assert validate(url(scheme="http"), url_) assert validate(url(path="/path"), url_)
API_URL_LIVE = "http://euronews.hexaglobe.com/json/" _url_re = re.compile("http(s)?://(\w+\.)?euronews.com") _lang_re = re.compile("EN.lang\s+= \"([^\"]+)\";") _live_check_re = re.compile( "swfobject.embedSWF\(\"[^\"]+\", \"streaming-live-player\",") _video_re = re.compile( "{file: \"(?P<url>[^\"]+)\", label: \"(?P<name>[^\"]+)\"}") _live_schema = validate.Schema({ validate.any("primary", "secondary"): { validate.text: { "rtmp_flash": { validate.text: { "name": validate.text, "server": validate.url(scheme="rtmp") } } } } }) _schema = validate.Schema( validate.union({ "lang": validate.all(validate.transform(_lang_re.search), validate.get(1)), "live": validate.all(validate.transform(_live_check_re.search), validate.transform(bool)), "videos": validate.all(validate.transform(_video_re.findall), [(validate.url(scheme="http"), validate.text)])
_channel_schema = validate.Schema( { "data": validate.any( None, { "channel": validate.any( None, { "id": validate.all(validate.text, validate.transform(int)), "vid": int }) }) }, validate.get("data")) _qq_schema = validate.Schema( {validate.optional("playurl"): validate.url(scheme="http")}, validate.get("playurl")) STREAM_WEIGHTS = {"middle": 540, "source": 1080} class Tga(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) @classmethod def stream_weight(cls, stream): if stream in STREAM_WEIGHTS: return STREAM_WEIGHTS[stream], "tga"
from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import RTMPStream _url_re = re.compile("http(s)?://(\w+.)?beam.pro/(?P<channel>[^/]+)") CHANNEL_INFO = "https://beam.pro/api/v1/channels/{0}" CHANNEL_MANIFEST = "https://beam.pro/api/v1/channels/{0}/manifest.smil" _assets_schema = validate.Schema( validate.union({ "base": validate.all( validate.xml_find("./head/meta"), validate.get("base"), validate.url(scheme="rtmp") ), "videos": validate.all( validate.xml_findall(".//video"), [ validate.union({ "src": validate.all( validate.get("src"), validate.text ), "height": validate.all( validate.get("height"), validate.text, validate.transform(int) ) })
import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import RTMPStream _url_re = re.compile("^http(s)?://(\w+\.)?furstre\.am/stream/.+") _stream_url_re = re.compile("<source src=\"([^\"]+)\"") _schema = validate.Schema( validate.transform(_stream_url_re.search), validate.any(None, validate.all(validate.get(1), validate.url(scheme="rtmp")))) class Furstream(Plugin): @classmethod def can_handle_url(cls, url): return _url_re.match(url) def _get_streams(self): stream_url = http.get(self.url, schema=_schema) if not stream_url: return stream = RTMPStream(self.session, { "rtmp": stream_url, "pageUrl": self.url, "live": True }) return dict(live=stream)
import re from livestreamer.compat import urlparse from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import RTMPStream, HTTPStream, HLSStream from livestreamer.utils import parse_json, rtmpparse, swfdecompress _url_re = re.compile("http(s)?://api.dmcloud.net/player/embed/[^/]+/[^/]+") _rtmp_re = re.compile(b"customURL[^h]+(https://.*?)\\\\") _info_re = re.compile("var info = (.*);") _schema = validate.Schema({ "mode": validate.text, validate.optional("mp4_url"): validate.url(scheme="http"), validate.optional("ios_url"): validate.url(scheme="http"), validate.optional("swf_url"): validate.url(scheme="http"), }) class DMCloud(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_rtmp_stream(self, swfurl): res = http.get(swfurl) swf = swfdecompress(res.content)
from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream STREAM_INFO_URL = "https://api.periscope.tv/api/v2/getAccessPublic" STATUS_GONE = 410 STATUS_UNAVAILABLE = (STATUS_GONE,) _url_re = re.compile(r"http(s)?://(www\.)?periscope.tv/w/(?P<token>[\w\-\=]+)") _stream_schema = validate.Schema( validate.any( None, validate.union({ "hls_url": validate.all( {"hls_url": validate.url(scheme="http")}, validate.get("hls_url") ), }), validate.union({ "replay_url": validate.all( {"replay_url": validate.url(scheme="http")}, validate.get("replay_url") ), }), ), ) class Periscope(Plugin): @classmethod
from livestreamer.plugin.api import http, validate from livestreamer.stream import FLVPlaylist, HTTPStream API_URL = "http://veetle.com/index.php/stream/ajaxStreamLocation/{0}/flash" _url_re = re.compile(""" http(s)?://(\w+\.)?veetle.com (:? /.*(v|view)/ (?P<channel>[^/]+/[^/&?]+) )? """, re.VERBOSE) _schema = validate.Schema({ validate.optional("isLive"): bool, "payload": validate.any(int, validate.url(scheme="http")), "success": bool }) class Veetle(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_streams(self): match = _url_re.match(self.url) parsed = urlparse(self.url) if parsed.fragment: channel_id = parsed.fragment else:
import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream STREAM_INFO_URL = "https://api.periscope.tv/api/v2/getAccessPublic" STATUS_GONE = 410 STATUS_UNAVAILABLE = (STATUS_GONE,) _url_re = re.compile(r"http(s)?://(www\.)?periscope.tv/w/(?P<token>[\w\-\=]+)") _stream_schema = validate.Schema( {"hls_url": validate.url(scheme="http")}, validate.get("hls_url") ) class Periscope(Plugin): @classmethod def can_handle_url(cls, url): return _url_re.match(url) def _get_streams(self): match = _url_re.match(self.url) res = http.get(STREAM_INFO_URL, params=match.groupdict(), acceptable_status=STATUS_UNAVAILABLE) if res.status_code in STATUS_UNAVAILABLE:
"medium": 2, "low": 1, } _url_re = re.compile(""" http(s)?://(staging|alpha)\.gaminglive\.tv /\#/channels/(?P<channel>[^/]+) """, re.VERBOSE) _quality_re = re.compile("[^/]+-(?P<quality>[^/]+)") _channel_schema = validate.Schema( { validate.optional("state"): { "stream": { "qualities": [validate.text], "rootUrl": validate.url(scheme="rtmp") } } }, validate.get("state") ) class GamingLive(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) @classmethod def stream_weight(cls, key): weight = QUALITY_WEIGHTS.get(key)
#!/usr/bin/env python import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream STREAM_INFO_URL = "http://lapi.cdn.tvplayer.com/tvplayer/stream/live/id/{id}" _url_re = re.compile(r"http://(?:www.)?tvplayer.com/watch/(.+)") _channel_map_re = re.compile(r'href="/watch/([a-z]+?)".*?img.*?src=".*?/(\d+).png"', re.S) _channel_schema = validate.Schema({"stream": validate.url(scheme=validate.any("http"))}) class TVPlayer(Plugin): @classmethod def can_handle_url(cls, url): match = _url_re.match(url) return match def _get_streams(self): url_match = _url_re.match(self.url) if url_match: # find the list of channels from the html in the page res = http.get(self.url) channel_map = dict(_channel_map_re.findall(res.text)) channel_id = channel_map.get(url_match.group(1)) # get the stream urls res = http.get(STREAM_INFO_URL.format(id=channel_id)) stream_data = http.json(res, schema=_channel_schema)
_url_re = re.compile(""" http(s)?://(\w+\.)?zdf.de/zdfmediathek(\#)?/.+ /(live|video) /(?P<video_id>\d+) """, re.VERBOSE | re.IGNORECASE) _schema = validate.Schema( validate.xml_findall("video/formitaeten/formitaet"), [ validate.union({ "type": validate.get("basetype"), "quality": validate.xml_findtext("quality"), "url": validate.all( validate.xml_findtext("url"), validate.url() ) }) ] ) class zdf_mediathek(Plugin): @classmethod def can_handle_url(cls, url): return _url_re.match(url) @classmethod def stream_weight(cls, key): weight = QUALITY_WEIGHTS.get(key) if weight:
{ "token": validate.text }, validate.get("token") ) _schema = validate.Schema( validate.transform(_rtmp_re.search), validate.any( None, validate.all( validate.transform(methodcaller("groupdict")), { "rtmp_playpath": validate.text, "rtmp_url": validate.all( validate.transform(methodcaller("replace", "\\/", "/")), validate.url(scheme="rtmp"), ), "swf_url": validate.url(scheme="http"), "token_url": validate.url(scheme="http") } ) ) ) class ILive(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_streams(self):
import re from livestreamer.compat import urlparse from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import RTMPStream, HTTPStream, HLSStream from livestreamer.utils import parse_json, rtmpparse, swfdecompress _url_re = re.compile("http(s)?://api.dmcloud.net/player/embed/[^/]+/[^/]+") _rtmp_re = re.compile(b"customURL[^h]+(https://.*?)\\\\") _info_re = re.compile("var info = (.*);") _schema = validate.Schema( { "mode": validate.text, validate.optional("mp4_url"): validate.url(scheme="http"), validate.optional("ios_url"): validate.url(scheme="http"), validate.optional("swf_url"): validate.url(scheme="http"), } ) class DMCloud(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_rtmp_stream(self, swfurl): res = http.get(swfurl) swf = swfdecompress(res.content) match = _rtmp_re.search(swf) if not match:
from livestreamer.compat import urljoin from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.plugin.api.utils import parse_json from livestreamer.stream import AkamaiHDStream, HLSStream _url_re = re.compile("http(s)?://(www\.)?livestream.com/") _stream_config_schema = validate.Schema({ "event": { "stream_info": validate.any({ "is_live": bool, "qualities": [{ "bitrate": int, "height": int }], validate.optional("play_url"): validate.url(scheme="http"), validate.optional("m3u8_url"): validate.url( scheme="http", path=validate.endswith(".m3u8") ), }, None) }, validate.optional("viewerPlusSwfUrl"): validate.url(scheme="http"), validate.optional("hdPlayerSwfUrl"): validate.text }) _smil_schema = validate.Schema(validate.union({ "http_base": validate.all( validate.xml_find("{http://www.w3.org/2001/SMIL20/Language}head/" "{http://www.w3.org/2001/SMIL20/Language}meta" "[@name='httpBase']"), validate.xml_element(attrib={
(?: /live/[^/]+ )? (?: /video/\d+/[^/]+ )? """, re.VERBOSE) _file_re = re.compile("\"?file\"?:\s+['\"]([^'\"]+)['\"]") _swf_url_re = re.compile("swfobject.embedSWF\(\"([^\"]+)\",") _schema = validate.Schema( validate.union({ "urls": validate.all( validate.transform(_file_re.findall), validate.map(unquote), [validate.url()] ), "swf": validate.all( validate.transform(_swf_url_re.search), validate.any( None, validate.all( validate.get(1), validate.url( scheme="http", path=validate.endswith("swf") ) ) ) ) })
"User-Agent": "Mozilla/5.0" } CHINFO_URL = "http://www.filmon.com/ajax/getChannelInfo" VODINFO_URL = "http://www.filmon.com/vod/info/{0}" QUALITY_WEIGHTS = {"high": 720, "low": 480} SWF_URL = "http://www.filmon.com/tv/modules/FilmOnTV/files/flashapp/filmon/FilmonPlayer.swf" _url_re = re.compile("http(s)?://(\w+\.)?filmon.com/(channel|tv|vod)/") _channel_id_re = re.compile("/channels/(\d+)/extra_big_logo.png") _vod_id_re = re.compile("movie_id=(\d+)") _channel_schema = validate.Schema({ "streams": [{ "name": validate.text, "quality": validate.text, "url": validate.url(scheme="rtmp") }] }) _vod_schema = validate.Schema( { "data": { "streams": { validate.text: { "name": validate.text, "url": validate.url(scheme="rtmp") } } } }, validate.get("data"))
"low": 1 } _url_re = re.compile( """ http(s)?://(\w+\.)?gaminglive\.tv /(?P<type>channels|videos)/(?P<name>[^/]+) """, re.VERBOSE) _quality_re = re.compile("[^/]+-(?P<quality>[^/]+)") _channel_schema = validate.Schema( { validate.optional("state"): { "stream": { "qualities": [validate.text], "rootUrl": validate.url(scheme="rtmp") } } }, validate.get("state")) _vod_schema = validate.Schema( { "name": validate.text, "channel_slug": validate.text, "title": validate.text, "created_at": validate.transform(int) }, ) class GamingLive(Plugin): @classmethod
#!/usr/bin/env python import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream USER_AGENT_STRING = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/43.0.2357.65 Safari/537.36") STREAM_INFO_URL = "http://lapi.cdn.tvplayer.com/tvplayer/stream/live/id/{id}" _url_re = re.compile(r"http://(?:www.)?tvplayer.com/watch/(.+)") _channel_map_re = re.compile( r'href="/watch/([a-z]+?)".*?img.*?src=".*?/(\d+).png"', re.S) _channel_schema = validate.Schema( {"stream": validate.url(scheme=validate.any("http"))}) class TVPlayer(Plugin): @classmethod def can_handle_url(cls, url): match = _url_re.match(url) return match def _get_streams(self): url_match = _url_re.match(self.url) if url_match: # find the list of channels from the html in the page res = http.get(self.url) channel_map = dict(_channel_map_re.findall(res.text)) channel_id = channel_map.get(url_match.group(1))
import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream STREAM_INFO_URL = "https://api.periscope.tv/api/v2/getAccessPublic" STATUS_GONE = 410 STATUS_UNAVAILABLE = (STATUS_GONE, ) _url_re = re.compile(r"http(s)?://(www\.)?periscope.tv/w/(?P<token>[\w\-\=]+)") _stream_schema = validate.Schema({"hls_url": validate.url(scheme="http")}, validate.get("hls_url")) class Periscope(Plugin): @classmethod def can_handle_url(cls, url): return _url_re.match(url) def _get_streams(self): match = _url_re.match(self.url) res = http.get(STREAM_INFO_URL, params=match.groupdict(), acceptable_status=STATUS_UNAVAILABLE) if res.status_code in STATUS_UNAVAILABLE: return playlist_url = http.json(res, schema=_stream_schema)
"<iframe src=\"(https://www.filmon.com/channel/export[^\"]+)\"" ) _live_json_re = re.compile("var startupChannel = (.+);") _replay_json_re = re.compile("var standByVideo = encodeURIComponent\('(.+)'\);") _history_re = re.compile( "helpers.common.flash.flashplayerinstall\({url:'([^']+)'," ) _video_flashvars_re = re.compile( "<embed width=\"486\" height=\"326\" flashvars=\"([^\"]+)\"" ) _live_schema = validate.Schema({ "streams": [{ "name": validate.text, "quality": validate.text, "url": validate.url(scheme="rtmp") }] }) _schema = validate.Schema( validate.union({ "export_url": validate.all( validate.transform(_live_export_re.search), validate.any( None, validate.get(1), ) ), "video_flashvars": validate.all( validate.transform(_video_flashvars_re.search), validate.any( None,
from livestreamer.plugin import Plugin, PluginError from livestreamer.plugin.api import http, validate from livestreamer.stream import RTMPStream, HLSStream SWF_URL = "http://play.streamingvideoprovider.com/player2.swf" API_URL = "http://player.webvideocore.net/index.php" _url_re = re.compile( "http(s)?://(\w+\.)?streamingvideoprovider.co.uk/(?P<channel>[^/&?]+)" ) _hls_re = re.compile("'(http://.+\.m3u8)'") _rtmp_schema = validate.Schema( validate.xml_findtext("./info/url"), validate.url(scheme="rtmp") ) _hls_schema = validate.Schema( validate.transform(_hls_re.search), validate.any( None, validate.all( validate.get(1), validate.url( scheme="http", path=validate.endswith("m3u8") ) ) ) )
_config_schema = validate.Schema( { validate.optional("fmt_list"): validate.all( validate.text, validate.transform(parse_fmt_list) ), validate.optional("url_encoded_fmt_stream_map"): validate.all( validate.text, validate.transform(parse_stream_map), [{ "itag": validate.all( validate.text, validate.transform(int) ), "quality": validate.text, "url": validate.url(scheme="http"), validate.optional("s"): validate.text, validate.optional("stereo3d"): validate.all( validate.text, validate.transform(int), validate.transform(bool) ), }] ), validate.optional("adaptive_fmts"): validate.all( validate.text, validate.transform(parse_stream_map), [{ validate.optional("s"): validate.text, "type": validate.all( validate.text,
#!/usr/bin/env python import re from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream USER_AGENT_STRING = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/43.0.2357.65 Safari/537.36") STREAM_INFO_URL = "http://lapi.cdn.tvplayer.com/tvplayer/stream/live/id/{id}" _url_re = re.compile(r"http://(?:www.)?tvplayer.com/watch/(.+)") _channel_map_re = re.compile(r'href="/watch/([a-z]+?)".*?img.*?src=".*?/(\d+).png"', re.S) _channel_schema = validate.Schema({ "stream": validate.url(scheme=validate.any("http")) }) class TVPlayer(Plugin): @classmethod def can_handle_url(cls, url): match = _url_re.match(url) return match def _get_streams(self): url_match = _url_re.match(self.url) if url_match: # find the list of channels from the html in the page res = http.get(self.url) channel_map = dict(_channel_map_re.findall(res.text)) channel_id = channel_map.get(url_match.group(1))
from livestreamer.compat import urljoin from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.plugin.api.utils import parse_json from livestreamer.stream import AkamaiHDStream, HLSStream _url_re = re.compile("http(s)?://new.livestream.com/") _stream_config_schema = validate.Schema({ "event": { "stream_info": validate.any({ "is_live": bool, "qualities": [{ "bitrate": int, "height": int }], validate.optional("play_url"): validate.url(scheme="http"), validate.optional("m3u8_url"): validate.url( scheme="http", path=validate.endswith(".m3u8") ), }, None) }, validate.optional("viewerPlusSwfUrl"): validate.url(scheme="http"), validate.optional("hdPlayerSwfUrl"): validate.text }) _smil_schema = validate.Schema(validate.union({ "http_base": validate.all( validate.xml_find("{http://www.w3.org/2001/SMIL20/Language}head/" "{http://www.w3.org/2001/SMIL20/Language}meta" "[@name='httpBase']"), validate.xml_element(attrib={
API_URL = "http://veetle.com/index.php/stream/ajaxStreamLocation/{0}/flash" _url_re = re.compile( """ http(s)?://(\w+\.)?veetle.com (:? /.*(v|view)/ (?P<channel>[^/]+/[^/&?]+) )? """, re.VERBOSE) _schema = validate.Schema({ validate.optional("isLive"): bool, "payload": validate.any(int, validate.url(scheme="http")), "success": bool }) class Veetle(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_streams(self): match = _url_re.match(self.url) parsed = urlparse(self.url) if parsed.fragment: channel_id = parsed.fragment
validate.transform(parse_query), validate.any( { "s": validate.text, "id": validate.text }, {} ) ) _view_live_schema = validate.Schema( { "channel": { "strm": [{ "brt": validate.text, "bps": validate.text, "purl": validate.url(scheme="rtmp") }] }, }, validate.get("channel"), validate.get("strm") ) class AfreecaTV(Plugin): @classmethod def can_handle_url(cls, url): return _url_re.match(url) def _get_streams(self): flashvars = http.get(self.url, schema=_flashvars_schema)
import re from itertools import chain from livestreamer.compat import urlparse from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream, HTTPStream, RTMPStream SWF_URL = "http://www.arte.tv/player/v2/jwplayer6/mediaplayer.6.6.swf" _url_re = re.compile("http(s)?://(\w+\.)?arte.tv/") _json_re = re.compile('arte_vp_(?:live-)?url="([^"]+)"') _schema = validate.Schema( validate.transform(_json_re.search), validate.any(None, validate.all(validate.get(1), validate.url(scheme="http"))) ) _video_schema = validate.Schema( { "videoJsonPlayer": { "VSR": validate.any( [], { validate.text: { "height": int, "mediaType": validate.text, "url": validate.text, validate.optional("streamer"): validate.text, } }, ),
from itertools import chain from livestreamer.compat import urlparse from livestreamer.plugin import Plugin from livestreamer.plugin.api import http, validate from livestreamer.stream import HLSStream, HTTPStream, RTMPStream SWF_URL = "http://www.arte.tv/player/v2/jwplayer6/mediaplayer.6.6.swf" _url_re = re.compile("http(s)?://(\w+\.)?arte.tv/") _json_re = re.compile("arte_vp_(?:live-)?url=(['\"])(.+?)\\1") _schema = validate.Schema( validate.transform(_json_re.search), validate.any(None, validate.all(validate.get(2), validate.url(scheme="http")))) _video_schema = validate.Schema({ "videoJsonPlayer": { "VSR": validate.any( [], { validate.text: { "height": int, "mediaType": validate.text, "url": validate.text, validate.optional("streamer"): validate.text }, }, ), "VTY":
{ "CHANNEL": { "RESULT": validate.transform(int), "BROAD_INFOS": [{ "list": [{ "nBroadNo": validate.text }] }] } }, validate.get("CHANNEL") ) _stream_schema = validate.Schema( { validate.optional("view_url"): validate.url( scheme=validate.any("rtmp", "http") ) } ) class AfreecaTV(Plugin): @classmethod def can_handle_url(self, url): return _url_re.match(url) def _get_channel_info(self, username): headers = { "Referer": self.url } data = {