diff --git a/modules/allocine/browser.py b/modules/allocine/browser.py
index 929ab6da..c6b6b24d 100644
--- a/modules/allocine/browser.py
+++ b/modules/allocine/browser.py
@@ -18,12 +18,16 @@
# along with weboob. If not, see .
-from weboob.tools.browser import BaseBrowser
from weboob.capabilities.base import NotAvailable, NotLoaded
from weboob.capabilities.cinema import Movie, Person
+from weboob.tools.browser import BaseBrowser
from weboob.tools.json import json
-
+import base64
+import hashlib
from datetime import datetime
+import time
+import urllib
+
__all__ = ['AllocineBrowser']
@@ -32,10 +36,28 @@ class AllocineBrowser(BaseBrowser):
DOMAIN = 'api.allocine.fr'
PROTOCOL = 'http'
ENCODING = 'utf-8'
- USER_AGENT = BaseBrowser.USER_AGENTS['android']
+ USER_AGENT = 'Dalvik/1.6.0 (Linux; U; Android 4.2.2; Nexus 4 Build/JDQ39E)'
+
+ PARTNER_KEY = '100043982026'
+ SECRET_KEY = '29d185d98c984a359e6e6f26a0474269'
+
+ def __do_request(self, method, params):
+ params_encode = urllib.urlencode(params)
+
+ sed = time.strftime('%Y%m%d', time.localtime())
+ sig = base64.b64encode(hashlib.sha1(self.SECRET_KEY + params_encode + '&sed=' + sed).digest())
+
+ query_url = 'http://api.allocine.fr/rest/v3/' + method + '?' + params_encode + '&sed=' + sed + '&sig=' + sig
+
+ return self.readurl(query_url)
def iter_movies(self, pattern):
- res = self.readurl('http://api.allocine.fr/rest/v3/search?partner=YW5kcm9pZC12M3M&filter=movie&q=%s&format=json' % pattern.encode('utf-8'))
+ params = [('partner', self.PARTNER_KEY),
+ ('q', pattern.encode('utf-8')),
+ ('format', 'json'),
+ ('filter', 'movie')]
+
+ res = self.__do_request('search', params)
jres = json.loads(res)
if 'movie' not in jres['feed']:
return
@@ -67,7 +89,12 @@ class AllocineBrowser(BaseBrowser):
yield movie
def iter_persons(self, pattern):
- res = self.readurl('http://api.allocine.fr/rest/v3/search?partner=YW5kcm9pZC12M3M&filter=person&q=%s&format=json' % pattern.encode('utf-8'))
+ params = [('partner', self.PARTNER_KEY),
+ ('q', pattern.encode('utf-8')),
+ ('format', 'json'),
+ ('filter', 'person')]
+
+ res = self.__do_request('search', params)
jres = json.loads(res)
if 'person' not in jres['feed']:
return
@@ -95,8 +122,15 @@ class AllocineBrowser(BaseBrowser):
yield person
def get_movie(self, id):
- res = self.readurl(
- 'http://api.allocine.fr/rest/v3/movie?partner=YW5kcm9pZC12M3M&code=%s&profile=large&mediafmt=mp4-lc&format=json&filter=movie&striptags=synopsis,synopsisshort' % id)
+ params = [('partner', self.PARTNER_KEY),
+ ('code', id),
+ ('profile', 'large'),
+ ('mediafmt', 'mp4-lc'),
+ ('filter', 'movie'),
+ ('striptags', 'synopsis,synopsisshort'),
+ ('format', 'json')]
+
+ res = self.__do_request('movie', params)
if res is not None:
jres = json.loads(res)
if 'movie' in jres:
@@ -169,8 +203,15 @@ class AllocineBrowser(BaseBrowser):
return movie
def get_person(self, id):
- res = self.readurl(
- 'http://api.allocine.fr/rest/v3/person?partner=YW5kcm9pZC12M3M&profile=large&code=%s&mediafmt=mp4-lc&filter=movie&format=json&striptags=biography' % id)
+ params = [('partner', self.PARTNER_KEY),
+ ('code', id),
+ ('profile', 'large'),
+ ('mediafmt', 'mp4-lc'),
+ ('filter', 'movie'),
+ ('striptags', 'biography,biographyshort'),
+ ('format', 'json')]
+
+ res = self.__do_request('person', params)
if res is not None:
jres = json.loads(res)
if 'person' in jres:
@@ -250,8 +291,15 @@ class AllocineBrowser(BaseBrowser):
return person
def iter_movie_persons(self, movie_id, role_filter):
- res = self.readurl(
- 'http://api.allocine.fr/rest/v3/movie?partner=YW5kcm9pZC12M3M&code=%s&profile=large&mediafmt=mp4-lc&format=json&filter=movie&striptags=synopsis,synopsisshort' % movie_id)
+ params = [('partner', self.PARTNER_KEY),
+ ('code', movie_id),
+ ('profile', 'large'),
+ ('mediafmt', 'mp4-lc'),
+ ('filter', 'movie'),
+ ('striptags', 'synopsis,synopsisshort'),
+ ('format', 'json')]
+
+ res = self.__do_request('movie', params)
if res is not None:
jres = json.loads(res)
if 'movie' in jres:
@@ -285,8 +333,13 @@ class AllocineBrowser(BaseBrowser):
yield person
def iter_person_movies(self, person_id, role_filter):
- res = self.readurl(
- 'http://api.allocine.fr/rest/v3/filmography?partner=YW5kcm9pZC12M3M&profile=medium&code=%s&filter=movie&format=json' % person_id)
+ params = [('partner', self.PARTNER_KEY),
+ ('code', person_id),
+ ('profile', 'medium'),
+ ('filter', 'movie'),
+ ('format', 'json')]
+
+ res = self.__do_request('filmography', params)
if res is not None:
jres = json.loads(res)
if 'person' in jres:
@@ -317,8 +370,13 @@ class AllocineBrowser(BaseBrowser):
yield movie
def iter_person_movies_ids(self, person_id):
- res = self.readurl(
- 'http://api.allocine.fr/rest/v3/filmography?partner=YW5kcm9pZC12M3M&profile=medium&code=%s&filter=movie&format=json' % person_id)
+ params = [('partner', self.PARTNER_KEY),
+ ('code', person_id),
+ ('profile', 'medium'),
+ ('filter', 'movie'),
+ ('format', 'json')]
+
+ res = self.__do_request('filmography', params)
if res is not None:
jres = json.loads(res)
if 'person' in jres:
@@ -331,8 +389,15 @@ class AllocineBrowser(BaseBrowser):
yield unicode(m['movie']['code'])
def iter_movie_persons_ids(self, movie_id):
- res = self.readurl(
- 'http://api.allocine.fr/rest/v3/movie?partner=YW5kcm9pZC12M3M&code=%s&profile=large&mediafmt=mp4-lc&format=json&filter=movie&striptags=synopsis,synopsisshort' % movie_id)
+ params = [('partner', self.PARTNER_KEY),
+ ('code', movie_id),
+ ('profile', 'large'),
+ ('mediafmt', 'mp4-lc'),
+ ('filter', 'movie'),
+ ('striptags', 'synopsis,synopsisshort'),
+ ('format', 'json')]
+
+ res = self.__do_request('movie', params)
if res is not None:
jres = json.loads(res)
if 'movie' in jres:
@@ -347,3 +412,28 @@ class AllocineBrowser(BaseBrowser):
def get_movie_releases(self, id, country):
return
+
+ def get_person_biography(self, id):
+ params = [('partner', self.PARTNER_KEY),
+ ('code', id),
+ ('profile', 'large'),
+ ('mediafmt', 'mp4-lc'),
+ ('filter', 'movie'),
+ ('striptags', 'biography,biographyshort'),
+ ('format', 'json')]
+
+ res = self.__do_request('person', params)
+ if res is not None:
+ jres = json.loads(res)
+ if 'person' in jres:
+ jres = jres['person']
+ else:
+ return None
+ else:
+ return None
+
+ biography = NotAvailable
+ if 'biography' in jres:
+ biography = unicode(jres['biography'])
+
+ return biography
diff --git a/modules/allocine/test.py b/modules/allocine/test.py
index 46c12193..743e5a90 100644
--- a/modules/allocine/test.py
+++ b/modules/allocine/test.py
@@ -18,40 +18,69 @@
# along with weboob. If not, see .
from weboob.tools.test import BackendTest
-
+import re
class AllocineTest(BackendTest):
BACKEND = 'allocine'
def test_search_movie(self):
movies = list(self.backend.iter_movies('spiderman'))
+ assert len(movies) > 0
for movie in movies:
assert movie.id
def test_get_movie(self):
movie = self.backend.get_movie('5032')
+ assert movie
assert movie.id
assert movie.original_title
def test_search_person(self):
persons = list(self.backend.iter_persons('dewaere'))
+ assert len(persons) > 0
for person in persons:
assert person.id
def test_get_person(self):
- person = self.backend.get_person('1116')
+ person = self.backend.get_person('1115')
+ assert person
assert person.id
assert person.name
assert person.birth_date
def test_movie_persons(self):
persons = list(self.backend.iter_movie_persons('5032'))
+ assert len(persons) > 0
for person in persons:
assert person.id
assert person.name
def test_person_movies(self):
movies = list(self.backend.iter_person_movies('1115'))
+ assert len(movies) > 0
for movie in movies:
assert movie.id
assert movie.original_title
+
+ def test_get_person_biography(self):
+ bio = self.backend.get_person_biography('1115')
+ assert bio != ''
+ assert bio is not None
+ assert re.match(r'^Patrick Dewaere, fils.*', bio)
+
+ def test_get_movie_releases(self):
+ rel = self.backend.get_movie_releases('5032', 'fr')
+ assert rel != ''
+ assert rel is not None
+
+ def test_iter_person_movies_ids(self):
+ movies_ids = list(self.backend.iter_person_movies_ids('1115'))
+ assert len(movies_ids) > 0
+ for movie_id in movies_ids:
+ assert movie_id
+
+ def test_iter_movie_persons_ids(self):
+ persons_ids = list(self.backend.iter_movie_persons_ids('5032'))
+ assert len(persons_ids) > 0
+ for person_id in persons_ids:
+ assert person_id