diff --git a/modules/vimeo/browser.py b/modules/vimeo/browser.py index 8691a1324670d8ad19a9fc6a4c5699ab0ca44377..3fd2adc6f73d7dd72eb47a68e149ba933b253c97 100644 --- a/modules/vimeo/browser.py +++ b/modules/vimeo/browser.py @@ -18,10 +18,13 @@ # You should have received a copy of the GNU Affero General Public License # along with weboob. If not, see . +from base64 import b64encode + from weboob.browser import PagesBrowser, URL from weboob.browser.exceptions import HTTPNotFound from weboob.capabilities.base import NotAvailable from weboob.tools.compat import urljoin, quote_plus + from .pages import VideoJsonPage, CategoriesPage, ListPage, APIPage, XMLAPIPage import time @@ -77,15 +80,14 @@ def fill_video_url(self, video): if self.method == u'hls': streams = [] for item in self.read_url(video.url): - if not item.startswith('#'): + item = item.decode('ascii') + if not item.startswith('#') and item.strip(): streams.append(item) + if streams: streams.reverse() url = streams[self.quality] if self.quality < len(streams) else streams[0] - if url.startswith('..'): - video.url = urljoin(video.url, url) - else: - video.url = url + video.url = urljoin(video.url, url) else: video.url = NotAvailable return video @@ -139,10 +141,6 @@ def get_category_videos(self, category): def _create_authorization(self, url, method, params=None): def _percent_encode(s): - if isinstance(s, unicode): - s = s.encode('utf-8') - pass - result = quote_plus(s).replace('+', '%20').replace('*', '%2A').replace('%7E', '~') # the implementation of the app has a bug. someone double escaped the '@' so we have to correct this # on our end. @@ -151,8 +149,12 @@ def _percent_encode(s): def _compute_signature(s): key = _percent_encode(self.CONSUMER_SECRET) + '&' + _percent_encode('') + key = key.encode('ascii') + s = s.encode('ascii') a = hmac.new(key, s, sha1) - return a.digest().encode("base64").rstrip('\n') + sig = b64encode(a.digest()).decode('ascii') + sig = sig.rstrip('\n') + return sig def _normalize_parameters(_params): sorted_keys = sorted(_params.keys()) diff --git a/modules/vimeo/module.py b/modules/vimeo/module.py index 914fe82458cc1c1457ac7c172419815040678afd..d2fbf4e0557cb3014683eebba6bc7dfbf4b5be1a 100644 --- a/modules/vimeo/module.py +++ b/modules/vimeo/module.py @@ -45,7 +45,7 @@ class VimeoModule(Module, CapVideo, CapCollection): SORTBY = ['relevance', 'rating', 'views', 'time'] quality_choice = OrderedDict([(k, v) for k, v in sorted( - {u'0': u'hight', u'1': u'medium', u'2': u'low'}.iteritems())]) + {u'0': u'high', u'1': u'medium', u'2': u'low'}.items())]) method_choice = [u'hls', u'progressive'] diff --git a/modules/vimeo/pages.py b/modules/vimeo/pages.py index 493ee8711b2e332c849ddf04994cb1fcee389983..77854cc4d973dddf2dd0fcab95b03737f23e5058 100644 --- a/modules/vimeo/pages.py +++ b/modules/vimeo/pages.py @@ -26,7 +26,7 @@ from weboob.browser.elements import ItemElement, ListElement, method, DictElement from weboob.browser.pages import HTMLPage, pagination, JsonPage, XMLPage from weboob.browser.filters.standard import Regexp, Env, CleanText, DateTime, Duration, Field, BrowserURL -from weboob.browser.filters.html import Attr, Link, XPath +from weboob.browser.filters.html import Attr, Link from weboob.browser.filters.json import Dict import re @@ -99,14 +99,18 @@ def obj_url(self): # Choosen method is not available, we choose an other one method = self.obj._method if method not in data['request']['files']: - method = data['request']['files'].keys()[0] + method = list(data['request']['files'].keys())[0] streams = data['request']['files'][method] if not streams: raise ValueError('There is no url available for id: %r' % (int(Field('id')(self)))) - # stream is single for hls, just return the url - stream = streams['url'] if method == 'hls' else None + stream = None + if method == 'hls': + if 'url' in streams: + stream = streams['url'] + else: + stream = streams['cdns'][streams['default_cdn']]['url'] # ...but a list for progressive # we assume the list is sorted by quality with best first @@ -116,8 +120,6 @@ def obj_url(self): return stream - obj_ext = Regexp(Field('url'), '.*\.(.*)\?.*$', '\\1') - class CategoriesPage(HTMLPage): @method @@ -168,7 +170,7 @@ class item(VimeoItem): class fill_video_infos(VimeoItem): def __init__(self, *args, **kwargs): super(VimeoItem, self).__init__(*args, **kwargs) - self.el = XPath('/rsp/video')(self.el)[0] + self.el = self.el.xpath('/rsp/video')[0] @pagination @method diff --git a/tools/py3-compatible.modules b/tools/py3-compatible.modules index 1c83d731df7590de2e975147d30400e78f57f0fc..ee80203ef3e1d1735458ea56b6410674a4d632a1 100644 --- a/tools/py3-compatible.modules +++ b/tools/py3-compatible.modules @@ -91,6 +91,7 @@ supertoinette/ tumblr/ tvsubtitles/ twitter/ +vimeo/ vlille/ wordreference/ xhamster/