123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #!/usr/bin/env python
- # coding=utf8
- #
- # This file is part of PlayStream - enigma2 plugin to play video streams from various sources
- # Copyright (c) 2016 ivars777 (ivars777@gmail.com)
- # Distributed under the GNU GPL v3. For full terms see http://www.gnu.org/licenses/gpl-3.0.en.html
- #
-
- import urllib2, urllib
- import datetime, re, sys,os
- import requests, json
- import ssl
- if "_create_unverified_context" in dir(ssl):
- ssl._create_default_https_context = ssl._create_unverified_context
-
- try:
- from requests.packages.urllib3.exceptions import InsecureRequestWarning
- requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
- except:
- pass
- from collections import OrderedDict
- import ConfigParser
- try:
- import util
- except:
- parent = os.path.dirname(os.path.abspath(__file__))
- parent = os.sep.join(parent.split(os.sep)[:-1])
- sys.path.insert(0,parent)
- import util
-
- headers2dict = lambda h: dict([l.strip().split(": ") for l in h.strip().splitlines()])
-
- class SourceBase(object):
- """Stream source base class"""
-
- def __init__(self,country="lv"):
- self.name = "name"
- self.title = "Title"
- self.img = ""
- self.desc = ""
- self.options = OrderedDict()
- self.config_file = ""
- self.url = "http://www.bbb.com/"
- self.headers = headers2dict("""
- User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
- """)
-
- def login(self,user="",password=""):
- return False
-
- def logout(self):
- return True
-
- def get_content(self,data):
- ### To be overriden in child class
- return [("..atpakaļ","back","back.png","Kļūda, atgriezties atpakaļ")]
-
- def is_video(self,data):
- ### To be overriden in child class
- return False
-
- def get_streams(self,data):
- ### Normally to be overrided in child class
-
- if not self.is_video(data):
- return []
- content = self.get_content(data)
- stream = util.item()
- stream["name"] = content[0].encode("utf8") if isinstance(content[0],unicode) else content[0]
- stream["url"] = content[1].encode("utf8") if isinstance(content[1],unicode) else content[1]
- stream["img"] = content[2].encode("utf8") if isinstance(content[2],unicode) else content[2]
- stream["desc"] = content[3].encode("utf8") if isinstance(content[3],unicode) else content[3]
- stream["type"] = stream_type(content[1]).encode("utf8")
- return[stream]
-
- def get_epg(self,data):
- ### Normally to be overrided in child class
- return [self.get_info(data)]
-
- def options_read(self):
- if not ("options" in dir(self) and self.options): # process options only if self.options defined, self.config_file should be defined too
- return None
- config = ConfigParser.ConfigParser()
- if os.path.exists(self.config_file):
- options0 = self.options
- config.read(self.config_file)
- self.options = OrderedDict(config.items(self.name))
- for k in options0:
- if not k in self.options:
- self.options[k] = options0[k]
- self.options_write(self.options)
- else:
- self.options_write(self.options)
- return self.options
-
- def options_write(self,options):
- config = ConfigParser.ConfigParser()
- config.add_section(self.name)
- for k in options.keys():
- config.set(self.name, k,options[k])
- with open(self.config_file,"w") as f:
- config.write(f)
- self.options = OrderedDict(config.items(self.name))
-
- def call(self, data,params=None,headers=None,lang=""):
- if not headers: headers = self.headers
- url = self.url+data
- result = self._http_request(url,params,headers=headers)
- return result
-
- def call_json(self, data,params=None,headers=None,lang=""):
- result = self.call(data,params,headers)
- if result:
- result = json.loads(result)
- return result
- else:
- raise "No data returned"
-
- def _http_request(self, url,params = None, headers=None):
- if not headers:
- headers = self.headers if "headers" in dir(self) else headers2dict("User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0")
- try:
- if params:
- r = requests.post(url, data=params, headers=headers,verify=False)
- else:
- r = requests.get(url, headers=headers,verify=False)
- return r.content
- except Exception as ex:
- if "read" in ex:
- content = ex.read()
- else:
- content = None
- return content
-
- @staticmethod
- def stream_type(data):
- return stream_type(data)
-
- @staticmethod
- def parse_data(data):
- if "::" in data:
- source = data.split("::")[0]
- data = data.split("::")[1]
- else:
- source = ""
- path = data.split("?")[0]
- plist = path.split("/")
- clist = plist[0]
- params = data[data.find("?"):] if "?" in data else ""
- qs = dict(map(lambda x:x.split("="),re.findall("\w+=[\w\-]+",params)))
- return source,data,path,plist,clist,params,qs
-
- def stream_type(data):
- data = data.lower()
- m = re.search(r"^(\w+)://", data)
- prefix = m.group(1) if m else ""
- if prefix in ("http","https"):
- if ".m3u8" in data:
- return "hls"
- elif ".mpd" in data:
- return "dash"
- else:
- return "http"
- else:
- return prefix
-
- if __name__ == "__main__":
- pass
|