astrXbian/.install/.kodi/addons/plugin.video.vstream/resources/hosters/googlevideo.py

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