123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #!/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
- #
- try:
- import json
- except:
- import simplejson as json
- import urllib2, urllib
- import binascii
- import datetime, re, sys,os, time
- import ConfigParser
- from collections import OrderedDict
- from SourceBase import SourceBase
- import requests
- 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
- #import resolver
- try:
- import util
- except:
- sys.path.insert(0,'..')
- import util
-
- headers2dict = lambda h: dict([l.strip().split(": ") for l in h.strip().splitlines()])
-
- class Source(SourceBase):
-
- def __init__(self, country="",cfg_path=None):
- self.hidden = False # nerāda menu nestrādājošos avotus
- self.name = "filmas"
- self.title = "Filmas.lv"
- self.img = "filmas.png"
- self.desc = "Filmas.lv - Latvijas filmas"
- self.headers = headers2dict("""
- User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- Accept-Language: en-US,en;q=0.5
- Accept-Encoding: gzip, deflate, br
- """)
- self.headers2 = headers2dict("""
- User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
- X-Requested-With: XMLHttpRequest
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- """)
- self.url = "https://www.filmas.lv/"
-
-
- ######### Entry point ########
- def get_content(self, data):
- print "[filmas] get_content:", data
- source, data, path, plist, clist, params, qs = self.parse_data(data)
- content = []
- content.append(("..return", "back","back.png","Return back"))
-
- if clist=="home":
- content.extend([
- ("Meklēt", "filmas::lmdb/api/search/?term={0}","","Meklēt"),
- ("Visas", "filmas::filmu-katalogs/?tab=movies&sub_tab=movies-all&watch=latvia&pg=1","","Latvijā skatamās visas filmas"),
- ("Spēlfilmas", "filmu-katalogs/?tab=movies&sub_tab=movies-all&mp20=112&watch=latvia&pg=1","","Latvijā skatamās spēlfilmas"),
- ("Dokumentalās filmas", "filmas::filmu-katalogs/?tab=movies&sub_tab=movies-hronika&pg=1","","Latvijā skatamās kinohronikas") ,
- ("Animācijas filmas", "filmu-katalogs/?tab=movies&sub_tab=movies-all&mp20=113&watch=latvia&pg=1","","Latvijā skatamās animācijas filmas"),
- ("Kinohronikas", "filmas::filmu-katalogs/filmu-katalogs/?tab=movies&sub_tab=movies-hronika","","Latvijā skatamās kinohronikas") ,
- ("Pēc alfabēta", "filmas::filmu-katalogs/?ml=A&tab=movies&sub_tab=movies-abc&pg=1","","Latvija skatamās filmas pēc alfabēta") ,
- ])
- return content
-
- elif "api/search" in data:
- r = self.call(data)
- js = json.loads(r)
- for it in js:
- if "type" in it and it["type"] == "movie":
- title = it["label"] + "(%s)" % it["year"] if "year" in it else ""
- img = ("https://www.filmas.lv/images/movies/" + it["photo"]) if "photo" in it and it["photo"] else ""
- desc = title
- data2 = "movie/%s" % it["value"]
- content.append((title,self.name+"::"+data2,img,desc))
- return content
-
- elif clist=="filmu-katalogs":
- r=self.call(data)
- result = re.findall(r'<a href="/(movie/\d+)">.+?src="([^"]+)".+?"movie-catalog-title">([^<]+)<.+?"movie-catalog-year">([^<]+)<', r, re.DOTALL)
- for item in result:
- title = item[2]+' (%s)'%item[3]
- data2 = item[0]
- img = item[1]
- desc = title
- content.append((title,self.name+"::"+data2,img,desc))
- m = re.search("<a class='next' href='(.+?)'", r, re.DOTALL)
- if m:
- data2 = "filmu-katalogs/"+m.group(1)
- content.append(("Next page",self.name+"::"+data2, "","Next page"))
- return content
-
- ### kaut kas neparedzets ###
- else:
- return content
-
- def is_video(self,data):
- source,data,path,plist,clist,params,qs = self.parse_data(data)
- if clist=="movie":
- return True
- else:
- return False
-
- 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 get_streams(self,data):
- print "[filmas] get_streams:", data
- source, data, path, plist, clist, params, qs = self.parse_data(data)
- streams = []
- url = self.url+data
- mid = data.split("/")[1]
- r = requests.get(url, headers=self.headers, verify=False)
- if not "PHPSESSID" in r.cookies:
- return streams
- phpsessid = r.cookies["PHPSESSID"]
-
- ### Main playlist ###
- m = re.search('lmdb.video_src = "/(.+?m3u8)"', r.content)
- url = "https://www.filmas.lv/%s"%m.group(1)
- headers = headers2dict("""
- User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
- Accept: */*
- Accept-Language: en-US,en;q=0.5
- Accept-Encoding: gzip, deflate, br
- Referer: https://www.filmas.lv/movie/%s/
- """%mid)
- r = requests.get(url, headers=headers, verify=False, cookies={"phpsessid":phpsessid} )
- filmassession = r.cookies["filmassession"]
- result = re.findall(r'#EXT-X-STREAM-INF:PROGRAM-ID=(\d+),BANDWIDTH=(\d+),RESOLUTION=(.+?),CODECS="(.+?)"\n(.+?)$', r.content, re.IGNORECASE | re.MULTILINE)
- title = url.split("/")[-1].split(".")[0]
-
- ### Initial key requests
- url = "https://www.filmas.lv/lmdb/hls/key/request/%s?%s"%(mid,int(time.time()))
- r=requests.get(url,headers=headers,cookies = {"filmassession":filmassession}, verify=False )
- filmassession = r.cookies["filmassession"]
-
- ### Metada ###
- url = "https://www.filmas.lv/charts/api/api/?method=search_movie&query=%s"%mid
- r = requests.get(url, headers=headers, verify=False)
- if not "error" in r.content:
- title = r.json()["nodes"][0]["name"]
- img = self.url+r.json()["nodes"][0]["image"]
- desc = r.json()["nodes"][0]["plot"]
- else:
- img = desc = ""
-
- for h in result:
- url = h[4]
-
- ### Key request ###
- headers["Origin"] = "https://www.filmas.lv"
- headers["Referer"] = "https://www.filmas.lv/" + data
- headers["Cookie"] = 'filmassession=%s; PHPSESSID=%s' % (filmassession, phpsessid)
- #r=requests.get(url,headers=headers, verify=False)
- #url_key = re.search('#EXT-X-KEY:METHOD=AES-128,URI="(.+?)"', r.content, re.IGNORECASE | re.MULTILINE).group(1)
- #r=requests.get(url_key,headers=headers, cookies={"filmassession":filmassession,"PHPSESSID":phpsessid}, verify=False)
- #key = r.content if not "error" in r.content else ""
-
- stream = util.item()
- stream["name"] = title
- stream["url"] = url
- stream["img"] = img
- stream["desc"] = desc
- stream["headers"] = headers #{"key":binascii.b2a_hex(key)}
- stream["quality"] = h[2]
- stream["order"] = int(h[1])
- stream["resolver"] = "filmas"
- streams.append(stream)
-
- return sorted(streams,key=lambda item: item["order"],reverse=True)
-
-
- def download_hls(url, title, download_dir="", headers=None, overwrite=True):
- UA = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0"
- if not headers:
- headers = {"User-Agent" : UA}
- key = headers["key"] if "key" in headers else ""
- if not "User-Agent" in headers:
- headers["User-Agent"] = UA
- tsname = os.path.join(download_dir,title+".ts")
- if not os.path.exists(tsname) or overwrite:
- tsfile = open(tsname,"wb")
- print "Downloading ", tsname
- try:
- r=requests.get(url,headers=headers, verify=False)
- except Exception as e:
- print "Got Exception: ", str(e)
- import traceback
- traceback.print_exc()
- sys.exit()
- ts_list = re.findall(r"#EXTINF:([\d\.]+),\n(.+?)$", r.content, re.IGNORECASE | re.MULTILINE)
- for ts in ts_list:
- url2 = ts[1]
- #print "Downloading ", url2
- #fname = os.path.join(download_dir,url2.split("/")[-1])
- r = requests.get(url2, headers=headers, verify=False)
- content = r.content
- if key:
- from Crypto.Cipher import AES
- key2 = binascii.a2b_hex(key)
- iv = content[:16]
- d = AES.new(key2, AES.MODE_CBC, iv)
- content = d.decrypt(content[16:])
- #with open(fname,"wb") as f:
- #f.write(content)
- tsfile.write(content)
- #lfile.write("file '%s'"%fname)
- #lfile.close()
- tsfile.close()
- from subprocess import call
- cmd = [r"ffmpeg.exe","-i", tsname.encode(sys.getfilesystemencoding()), "-c","copy", os.path.join(download_dir,title+".mp4").encode(sys.getfilesystemencoding())]
- ret = call(cmd)
-
-
- if __name__ == "__main__":
-
- #url = "http://localhost:88/https%3A//as2.filmas.lv/FilmasLV/508D4024A83FDC1AA61D727DE5046D12/index-f3-v1-a1.m3u8?~key=4cb5c12b2aaa3d2cf211583cc9add2dd"
- #download_hls(url, "video", "")
-
- # c = Source()
- # if len(sys.argv)>1:
- # data= sys.argv[1]
- # else:
- # data = "movie/3112/"
- # if "movie" in data:
- # if data.startswith("http"):
- # data = data.replace("https://www.filmas.lv/","")
- # streams = c.get_streams(data)
- # #for s in streams:
- # s = streams[0]
- # download_hls(s["url"],"%s %s"%(s["name"],s["quality"]),"",s["headers"])
- # sys.exit()
-
- sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
- import run
- source = Source()
- data= sys.argv[1] if len(sys.argv)>1 else source.name+"::home"
- run.run(source, data)
- sys.exit()
|