190 lines
6.3 KiB
Python
190 lines
6.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
|
|
|
|
try: # Python 2
|
|
import urllib2
|
|
from urllib2 import URLError as UrlError
|
|
|
|
except ImportError: # Python 3
|
|
import urllib.request as urllib2
|
|
from urllib.error import URLError as UrlError
|
|
|
|
import re
|
|
import xbmcgui
|
|
|
|
from resources.hosters.hoster import iHoster
|
|
from resources.lib.comaddon import VSlog
|
|
|
|
UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:62.0) Gecko/20100101 Firefox/62.0'
|
|
|
|
|
|
class cHoster(iHoster):
|
|
def __init__(self):
|
|
self.__sDisplayName = 'GoogleVideo'
|
|
self.__sFileName = self.__sDisplayName
|
|
|
|
def getDisplayName(self):
|
|
return self.__sDisplayName
|
|
|
|
def setDisplayName(self, sDisplayName):
|
|
self.__sDisplayName = sDisplayName + ' [COLOR skyblue]' + self.__sDisplayName + '[/COLOR]'
|
|
|
|
def setFileName(self, sFileName):
|
|
self.__sFileName = sFileName
|
|
|
|
def getFileName(self):
|
|
return self.__sFileName
|
|
|
|
def setUrl(self, sUrl):
|
|
self.__sUrl = sUrl
|
|
|
|
def get_host_and_id(self, url):
|
|
sPattern = 'http[s]*:\/\/(.*?(?:\.googlevideo|picasaweb\.google)\.com)\/(.*?(?:videoplayback\?|\?authkey|#|\/).+)'
|
|
r = re.search(sPattern, url)
|
|
if r:
|
|
return r.groups()
|
|
else:
|
|
return False
|
|
|
|
def __modifyUrl(self, sUrl):
|
|
return
|
|
|
|
def getPluginIdentifier(self):
|
|
return 'googlevideo'
|
|
|
|
def isDownloadable(self):
|
|
return True
|
|
|
|
def isJDownloaderable(self):
|
|
return True
|
|
|
|
def getPattern(self):
|
|
return ''
|
|
|
|
def checkUrl(self, sUrl):
|
|
return True
|
|
|
|
def getUrl(self, host, media_id):
|
|
return 'https://%s/%s' % (host, media_id)
|
|
|
|
def getMediaLink(self):
|
|
return self.__getMediaLinkForGuest()
|
|
|
|
def __getMediaLinkForGuest(self):
|
|
|
|
r = self.get_host_and_id(self.__sUrl)
|
|
|
|
# si lien deja decode
|
|
if (r == False):
|
|
if '//lh3.googleusercontent.com' in self.__sUrl:
|
|
# Nouveaute, avec cookie now
|
|
|
|
VSlog(self.__sUrl)
|
|
|
|
import requests
|
|
h = {'User-Agent': UA}
|
|
r = requests.get(self.__sUrl, headers=h, allow_redirects=False)
|
|
url = r.headers['Location']
|
|
# VSlog(url)
|
|
|
|
url = url + '|User-Agent=' + UA
|
|
|
|
if 'set-cookie' in r.headers:
|
|
cookies = r.headers['set-cookie']
|
|
url = url + '&Cookie=' + cookies
|
|
# VSlog(cookies)
|
|
|
|
# Impossible a faire fonctionner, si quelqu'un y arrive .....
|
|
# class NoRedirect(urllib2.HTTPRedirectHandler):
|
|
# def redirect_request(self, req, fp, code, msg, hdrs, newurl):
|
|
# return newurl
|
|
# opener = urllib2.build_opener(NoRedirect)
|
|
# HttpReponse = opener.open(self.__sUrl)
|
|
# htmlcontent = HttpReponse.read()
|
|
# head = HttpReponse.headers
|
|
|
|
return True, url
|
|
# Peut etre un peu brutal, peut provoquer des bugs
|
|
if 'lh3.googleusercontent.com' in self.__sUrl:
|
|
VSlog('Attention: lien sans cookies')
|
|
return True, self.__sUrl
|
|
|
|
web_url = self.getUrl(r[0], r[1])
|
|
|
|
headers = {'Referer': web_url}
|
|
|
|
stream_url = ''
|
|
vid_sel = web_url
|
|
|
|
try:
|
|
if 'picasaweb.' in r[0]:
|
|
|
|
request = urllib2.Request(web_url, None, headers)
|
|
|
|
try:
|
|
reponse = urllib2.urlopen(request)
|
|
except UrlError as e:
|
|
print(e.read())
|
|
print(e.reason)
|
|
|
|
resp = reponse.read()
|
|
|
|
# fh = open('c:\\test.txt', "w")
|
|
# fh.write(resp)
|
|
# fh.close()
|
|
|
|
vid_sel = ''
|
|
vid_id = re.search('.*?#(.+?)$', web_url)
|
|
|
|
if vid_id:
|
|
vid_id = vid_id.group(1)
|
|
html = re.search('\["shared_group_' + re.escape(vid_id) + '"\](.+?),"ccOverride":"false"}', resp, re.DOTALL)
|
|
else:
|
|
# Methode brute en test
|
|
html = re.search('(?:,|\[)"shared_group_[0-9]+"\](.+?),"ccOverride":"false"}', resp, re.DOTALL)
|
|
|
|
if html:
|
|
vid_list = []
|
|
url_list = []
|
|
best = 0
|
|
quality = 0
|
|
|
|
videos = re.compile(',{"url":"(https:\/\/redirector\.googlevideo\.com\/[^<>"]+?)","height":([0-9]+?),"width":([0-9]+?),"type":"video\/.+?"}').findall(html.group(1))
|
|
if not videos:
|
|
videos = re.compile(',{"url":"(https:\/\/lh3\.googleusercontent\.com\/[^<>"]+?)","height":([0-9]+?),"width":([0-9]+?),"type":"video\/.+?"}').findall(html.group(1))
|
|
|
|
if videos:
|
|
if len(videos) > 1:
|
|
for index, video in enumerate(videos):
|
|
if int(video[1]) > quality:
|
|
best = index
|
|
quality = int(video[2])
|
|
vid_list.extend(['GoogleVideo - %sp' % quality])
|
|
url_list.extend([video[0]])
|
|
if len(videos) == 1:
|
|
vid_sel = videos[0][0]
|
|
else:
|
|
result = xbmcgui.Dialog().select('Choose a link', vid_list)
|
|
if result != -1:
|
|
vid_sel = url_list[result]
|
|
else:
|
|
return self.unresolvable(0, 'No link selected')
|
|
|
|
if vid_sel:
|
|
if 'googleusercontent' in vid_sel:
|
|
stream_url = urllib2.urlopen(vid_sel).geturl()
|
|
elif 'redirector.' in vid_sel:
|
|
stream_url = urllib2.urlopen(vid_sel).geturl()
|
|
elif 'google' in vid_sel:
|
|
stream_url = vid_sel
|
|
|
|
except UrlError:
|
|
stream_url = ''
|
|
|
|
api_call = stream_url
|
|
|
|
if api_call:
|
|
return True, api_call
|
|
|
|
return False, False
|