The branch, frodo has been updated
       via  2386f98e0b08413001249b1d29da68fbacec95c5 (commit)
      from  2034df4fb2b7197f7e3c5410cad1217d5d9b08d8 (commit)

- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=2386f98e0b08413001249b1d29da68fbacec95c5

commit 2386f98e0b08413001249b1d29da68fbacec95c5
Author: Martijn Kaijser <[email protected]>
Date:   Sat Sep 13 14:44:06 2014 +0200

    [plugin.video.synopsi] 1.2.0

diff --git a/plugin.video.synopsi/addon.py b/plugin.video.synopsi/addon.py
index 7712329..5c3bae2 100644
--- a/plugin.video.synopsi/addon.py
+++ b/plugin.video.synopsi/addon.py
@@ -246,32 +246,32 @@ try:
                # fill in custom listing dialog/window
                items = [
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg"},
             "id": 136558,
             "name": "The Time Machine",
             'file': 'volaco'
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02514500-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02514500-223.jpg"},
             "id": 2514500,
             "name": "Inglourious Basterds",
             'watched': 'yes'
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg"},
             "id": 72215,
             "name": "I, Robot",
             'watched': 'yes',
             'file': 'volaco'
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg"},
             "id": 72215,
             "name": "I, Robot 2",
             'custom_overlay': 'ondisk-AND-already-watched-stack.png'
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg"},
             "id": 72215,
             "name": "I, Robot 3",
             'custom_overlay': 'already-watched-stack.png'
diff --git a/plugin.video.synopsi/addon.xml b/plugin.video.synopsi/addon.xml
index 148a6de..bbfcc19 100644
--- a/plugin.video.synopsi/addon.xml
+++ b/plugin.video.synopsi/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.synopsi"
        name="SynopsiTV"
-       version="1.1.1"
+       version="1.2.0"
        provider-name="Synopsi.TV">
        <requires>
                <import addon="xbmc.python" version="2.1.0" />
diff --git a/plugin.video.synopsi/apiclient.py 
b/plugin.video.synopsi/apiclient.py
index 1d8572f..ae576b4 100644
--- a/plugin.video.synopsi/apiclient.py
+++ b/plugin.video.synopsi/apiclient.py
@@ -24,14 +24,14 @@ RATING_CODE = {
 }
 
 # api request title properties
-commonTitleProps = ['id', 'cover_full', 'cover_large', 'cover_medium', 
'cover_small', 'cover_thumbnail', 'date', 'genres', 'name', 'plot', 'released', 
'trailer', 'type', 'year', 'url', 'directors', 'writers', 'runtime']
+commonTitleProps = ['id', 'covers', 'date', 'genres', 'name', 'plot', 
'released', 'trailer', 'type', 'year', 'url', 'directors', 'writers', 'runtime']
 defaultIdentifyProps = commonTitleProps + ['tvshow_id']
 watchableTitleProps = commonTitleProps + ['watched']
 defaultTVShowProps = commonTitleProps + ['seasons']
-smallListProps = ['id', 'cover_medium', 'name', 'watched', 'type']
-defaultEpisodeProps = smallListProps + ['season_number', 'episode_number', 
'cover_large', 'tvshow_id', 'tvshow_name']
-allSeasonProps = ['id', 'cover_full', 'cover_large', 'cover_medium', 
'cover_small', 'cover_thumbnail', 'season_number', 'episodes_count', 
'watched_count']
-defaultSeasonProps = ['id', 'cover_medium', 'season_number', 'episodes_count', 
'watched_count']
+smallListProps = ['id', 'covers', 'name', 'watched', 'type']
+defaultEpisodeProps = smallListProps + ['season_number', 'episode_number', 
'tvshow_id', 'tvshow_name']
+allSeasonProps = ['id', 'covers', 'season_number', 'episodes_count', 
'watched_count']
+defaultSeasonProps = ['id', 'covers', 'season_number', 'episodes_count', 
'watched_count']
 defaultSeasonProps2 = ['id', 'episodes']
 defaultSearchProps = defaultEpisodeProps + ['year', 'directors', 'cast']
 
@@ -41,6 +41,9 @@ class NotConnectedException(Exception):
 class AuthenticationError(Exception):
        pass
 
+class ValidationError(Exception):
+       pass
+
 class ApiCallError(Exception):
        pass
 
@@ -131,6 +134,9 @@ class ApiClient(loggable.Loggable):
                        return response_json
 
        def getAccessToken(self):
+               if not self.username:
+                       raise ValidationError('Your username/email is missing.')
+
                data = {
                        'grant_type': 'password',
                        'client_id': self.key,
@@ -141,8 +147,8 @@ class ApiClient(loggable.Loggable):
 
                authHeaders = {'AUTHORIZATION': 'BASIC %s' % b64encode("%s:%s" 
% (self.key, self.secret))}
 
-               #~ self._log.debug('apiclient getaccesstoken u:%s p:%s' % 
(self.username, self.password))
-               #~ self._log.debug('apiclient getaccesstoken %s' % str(data))
+               # self._log.debug('apiclient getaccesstoken u:%s p:%s' % 
(self.username, self.password))
+               # self._log.debug('apiclient getaccesstoken %s' % str(data))
 
                # get token
                try:
@@ -288,7 +294,7 @@ class ApiClient(loggable.Loggable):
                                response_json = json.loads(response_json_str)
                        except:
                                response_json = response_json_str
-                               
+                       
                        self._log.error('APICLIENT HTTP %s :\nURL:%s\nERROR 
STRING: %s\nSERVER RESPONSE: "%s"' % (e.code, url, unicode(e), response_json))
 
                except URLError as e:
@@ -415,10 +421,9 @@ class ApiClient(loggable.Loggable):
 
                if title_property:
                        req['data']['title_property[]'] = 
','.join(title_property)
-
+               
                return self.execute(req)
 
-
        def title(self, titleId, props=watchableTitleProps, cast_props=None, 
cast_limit=None):
                " Get title from library "
 
diff --git a/plugin.video.synopsi/changelog.txt 
b/plugin.video.synopsi/changelog.txt
index f44ede6..2fcb047 100644
--- a/plugin.video.synopsi/changelog.txt
+++ b/plugin.video.synopsi/changelog.txt
@@ -1,3 +1,7 @@
+[B]Version 1.2[/B]
+
+* use api version 1.1
+
 [B]Version 1.1.1[/B]
 
 * Code cleanup & update
diff --git a/plugin.video.synopsi/dialog.py b/plugin.video.synopsi/dialog.py
index 010b371..14d3d88 100644
--- a/plugin.video.synopsi/dialog.py
+++ b/plugin.video.synopsi/dialog.py
@@ -38,7 +38,7 @@ __author__  = __addon__.getAddonInfo('author')
 __version__   = __addon__.getAddonInfo('version')
 __profile__      = __addon__.getAddonInfo('profile')
 
-itemFolderBack = {'name': '...', 'cover_medium': 'DefaultFolderBack.png', 
'id': HACK_GO_BACK, 'type': 'HACK'}
+itemFolderBack = {'name': '...', 'covers': {'medium': 
'DefaultFolderBack.png'}, 'id': HACK_GO_BACK, 'type': 'HACK'}
 
 open_dialogs = []
 closed_dialogs = []
@@ -188,7 +188,7 @@ class ListDialog(MyDialog):
                        itemName = '%s - %s' % (episident, itemName)
                
                # create listitem with basic properties 
-               li = xbmcgui.ListItem(itemName, iconImage=item['cover_medium'])
+               li = xbmcgui.ListItem(itemName, 
iconImage=item['covers']['medium'])
                li.setProperty('id', str(item['id']))
                li.setProperty('type', str(item['type']))
 
@@ -298,7 +298,7 @@ class VideoDialog(MyDialog):
                elif stv_details['type'] == 'tvshow' and 
stv_details.has_key('seasons'):
                        seasons = 
top.stvList.get_tvshow_local_seasons(stv_details['id'])
                        log('seasons on disk:' + str(seasons))          
-                       stv_details['similars'] = [ {'id': i['id'], 'name': 
'Season %d' % i['season_number'], 'cover_medium': i['cover_medium'], 'watched': 
i['episodes_count'] == i['watched_count'], 'file': i['season_number'] in 
seasons} for i in stv_details['seasons'] ]
+                       stv_details['similars'] = [ {'id': i['id'], 'name': 
'Season %d' % i['season_number'], 'covers': i['covers'], 'watched': 
i['episodes_count'] == i['watched_count'], 'file': i['season_number'] in 
seasons} for i in stv_details['seasons'] ]
 
                # similar overlays
                if stv_details.has_key('similars'):
@@ -332,7 +332,7 @@ class VideoDialog(MyDialog):
                        
                win.setProperty("Movie.Title", str_title)
                win.setProperty("Movie.Plot", self.data["plot"])
-               win.setProperty("Movie.Cover", self.data["cover_full"])
+               win.setProperty("Movie.Cover", self.data["covers"]["full"])
 
                for i in range(5):
                        win.setProperty("Movie.Similar.{0}.Cover".format(i + 
1), "default.png")
@@ -363,7 +363,7 @@ class VideoDialog(MyDialog):
 
                if self.data.has_key('similars'):
                        for item in self.data['similars']:
-                               li = xbmcgui.ListItem(item['name'], 
iconImage=item['cover_medium'])
+                               li = xbmcgui.ListItem(item['name'], 
iconImage=item['covers']['medium'])
                                if item.get('overlay'):
                                        li.setProperty('Overlay', 
item['overlay'])
 
@@ -480,7 +480,7 @@ class SelectMovieDialog(MyDialog):
                                if item.get('type') == 'episode':
                                        text = 'S%sE%s - ' % 
(item.get('season_number', '??'), item.get('episode_number', '??')) + text
 
-                               li = xbmcgui.ListItem(text, 
iconImage=item['cover_medium'])
+                               li = xbmcgui.ListItem(text, 
iconImage=item['covers']['medium'])
                                li.setProperty('id', str(item['id']))
                                li.setProperty('director', ', 
'.join(item.get('directors')) if item.has_key('directors') else t_unavail)
                                cast = ', '.join([i['name'] for i in 
item['cast']]) if item.has_key('cast') else t_unavail                      
diff --git a/plugin.video.synopsi/resources/const.py 
b/plugin.video.synopsi/resources/const.py
index 45e41d1..8e8650c 100644
--- a/plugin.video.synopsi/resources/const.py
+++ b/plugin.video.synopsi/resources/const.py
@@ -1,11 +1,10 @@
 
 # connection
 BASE_URL="https://api.synopsi.tv/";
-REL_API_URL="1.0/"
+REL_API_URL="1.1/"
 KEY="59c53964b1013defcff0155f6e4d54a4"
 SECRET="487615d20b22cdce510fd3476ed84d924e2b0c45ce7c49dc621764e05fae0904"
 
 # addon
 # incrementing this will cause restarting plugin after update
 SERVICE_IFACE_VERSION=2
-
diff --git a/plugin.video.synopsi/tests/apiclient.unittest.py 
b/plugin.video.synopsi/tests/apiclient.unittest.py
index 6dfdfb1..9c3f2d2 100644
--- a/plugin.video.synopsi/tests/apiclient.unittest.py
+++ b/plugin.video.synopsi/tests/apiclient.unittest.py
@@ -6,9 +6,10 @@ import json
 from copy import copy
 import random
 import string
+from pprint import pformat
 
 # test helper
-from common import connection
+from settings import connection
 
 # application
 sys.path.insert(0, os.path.abspath('..'))
@@ -49,21 +50,32 @@ exampleEvents = [
 
 
 class ApiTest(TestCase):
+       clientClass = ApiClient
+
+       client = None
+
+       def setUp(self):
+               if not self.__class__.client:
+                       c = connection
+                       self.__class__.client = self.clientClass(c['base_url'], 
c['key'], c['secret'], c['username'], c['password'], c['device_id'], debugLvl = 
logging.DEBUG, rel_api_url=c['rel_api_url'])
+
+               self.client = self.__class__.client
+
        def test_auth(self):
-               client.getAccessToken()
-               self.assertIsInstance(client, ApiClient)
-               return client
+               self.client.getAccessToken()
+               self.assertIsInstance(self.client, ApiClient)
+               return self.client
 
        def test_auth_fail(self):
                c = copy(connection)
                c['password'] = 'aax'           # bad password
-               client = ApiClient(c['base_url'], c['key'], c['secret'], 
c['username'], c['password'], c['device_id'], debugLvl=logging.WARNING, 
rel_api_url=c['rel_api_url'])
+               self.client = ApiClient(c['base_url'], c['key'], c['secret'], 
c['username'], c['password'], c['device_id'], debugLvl=logging.WARNING, 
rel_api_url=c['rel_api_url'])
 
-               self.assertRaises(AuthenticationError, client.getAccessToken)
-               self.assertTrue(client.isAuthenticated()==False)
+               self.assertRaises(AuthenticationError, 
self.client.getAccessToken)
+               self.assertTrue(self.client.isAuthenticated()==False)
 
        def test_unwatched_episodes(self):
-               data = client.unwatchedEpisodes()
+               data = self.client.unwatchedEpisodes()
 
                self.assertTrue(data.has_key('lineup'))
                self.assertTrue(data.has_key('new'))
@@ -76,11 +88,11 @@ class ApiTest(TestCase):
                        "stv_title_hash": 
"1defa7f69476e9ffca7b8ceb8c251275afc31ade",
                        "os_title_hash": "486d1f7112f9749d",
                        "imdb_id": "0102536",
-                       'title_property[]': ','.join(['name', 'cover_medium']),
+                       'title_property[]': ','.join(['name', 'covers']),
                        'type': 'movie'
                }
 
-               stv_title = client.titleIdentify(**ident)
+               stv_title = self.client.titleIdentify(**ident)
 
                self.assertTrue(stv_title.has_key('type'))
 
@@ -91,14 +103,14 @@ class ApiTest(TestCase):
                        'imdb_id': ''
                }
 
-               stv_title = client.titleIdentify(**ident2)
+               stv_title = self.client.titleIdentify(**ident2)
                self.assertTrue(stv_title.has_key('type'))
 
                ident3 = {
                        'file_name': 
'_videne/Notorious/Notorious.[2009self.Eng].TELESYNC.DivX-LTT.avi',
                }
 
-               stv_title = client.titleIdentify(**ident3)
+               stv_title = self.client.titleIdentify(**ident3)
 
                self.assertTrue(stv_title.has_key('type'))
 
@@ -108,7 +120,7 @@ class ApiTest(TestCase):
                        'os_title_hash': None
                }
 
-               stv_title = client.titleIdentify(**ident)
+               stv_title = self.client.titleIdentify(**ident)
 
                self.assertTrue(stv_title.has_key('type'))
                
@@ -117,7 +129,7 @@ class ApiTest(TestCase):
                        'stv_title_hash': ''
                }
 
-               stv_title = client.titleIdentify(**ident)
+               stv_title = self.client.titleIdentify(**ident)
 
                self.assertTrue(stv_title.has_key('type'))
 
@@ -126,7 +138,7 @@ class ApiTest(TestCase):
                        'stv_title_hash': ''
                }
 
-               stv_title = client.titleIdentify(**ident)
+               stv_title = self.client.titleIdentify(**ident)
 
                self.assertTrue(stv_title.has_key('type'))
 
@@ -134,17 +146,17 @@ class ApiTest(TestCase):
                        'file_name': 'Rambo.avi',
                }
 
-               stv_title = client.titleIdentify(**ident)
+               stv_title = self.client.titleIdentify(**ident)
 
                self.assertTrue(stv_title.has_key('type'))
 
 
        def test_library_add(self):
-               client.getAccessToken()
+               self.client.getAccessToken()
                
                # change the device id, to use empty library
                randstr = ''.join(random.choice(string.ascii_uppercase + 
string.digits) for x in range(10))
-               client.device_id = 'testing_' + randstr
+               self.client.device_id = 'testing_' + randstr
                
                ident = {
                        'file_name': 
'/Volumes/FLOAT/Film/_videne/Notorious/Notorious.[2009self.Eng].TELESYNC.DivX-LTT.avi',
@@ -153,11 +165,11 @@ class ApiTest(TestCase):
                        'imdb_id': '0472198'
                }
 
-               data = client.titleIdentify(**ident)
-
+               data = self.client.titleIdentify(**ident)
+               logger.debug(pformat(data))
                stv_title_id = data['id']
 
-               data = client.libraryTitleAdd(stv_title_id)
+               data = self.client.libraryTitleAdd(stv_title_id)
 
                #exampleEvents = []
 
@@ -166,12 +178,12 @@ class ApiTest(TestCase):
                        'player_events': json.dumps(exampleEvents)
                }
 
-               data = client.titleWatched(stv_title_id, **watched_data)
+               data = self.client.titleWatched(stv_title_id, **watched_data)
 
-               data = client.libraryTitleRemove(stv_title_id)
+               data = self.client.libraryTitleRemove(stv_title_id)
 
        def test_titleWatched(self):
-               client.getAccessToken()
+               self.client.getAccessToken()
                stv_title_id = 145948
                watched_data = {
                        'rating': 1,
@@ -179,14 +191,14 @@ class ApiTest(TestCase):
                        'software_info': 'Test bullshit'
                }
 
-               data = client.titleWatched(stv_title_id, **watched_data)
+               data = self.client.titleWatched(stv_title_id, **watched_data)
                
 
        def test_profile_recco(self):
 
 
-               props = [ 'year', 'cover_small' ]
-               data = client.profileRecco('movie', False, 5, props)
+               props = [ 'year', 'covers' ]
+               data = self.client.profileRecco('movie', False, 5, props)
 
                self.assertTrue(data.has_key('recco_id'))
                self.assertTrue(data.has_key('titles'))
@@ -202,9 +214,10 @@ class ApiTest(TestCase):
                        - add titles not in global recco to library
                        - test that first title is in local recco, and second 
not
                """
-               props = [ 'id', 'name', 'year', 'cover_small' ]
+               props = [ 'id', 'name', 'year', 'covers' ]
 
                device_id = ''.join([random.choice(string.hexdigits) for n in 
xrange(32)])
+               c = connection
                new_client = ApiClient(c['base_url'], c['key'], c['secret'], 
c['username'], c['password'], device_id, debugLvl = logging.DEBUG, 
rel_api_url=c['rel_api_url'])
                
                # get global recco
@@ -237,8 +250,8 @@ class ApiTest(TestCase):
                
 
        def test_profile_recco_watched(self):
-               props = [ 'id', 'year', 'cover_small' ]
-               data = client.profileRecco('movie', False, 5, props)
+               props = [ 'id', 'year', 'covers' ]
+               data = self.client.profileRecco('movie', False, 5, props)
                all_ids = [ i['id'] for i in data['titles'] ]
 
                self.assertTrue(data.has_key('recco_id'))
@@ -246,9 +259,9 @@ class ApiTest(TestCase):
                self.assertTrue(len(data['titles']) > 0)
 
                check_id = data['titles'][0]['id']
-               client.titleWatched(check_id, **{'rating': 1})
+               self.client.titleWatched(check_id, **{'rating': 1})
 
-               new_data = client.profileRecco('movie', False, 5, props)
+               new_data = self.client.profileRecco('movie', False, 5, props)
                all_ids = [ i['id'] for i in new_data['titles'] ]
 
                self.assertFalse(check_id in all_ids)
@@ -257,28 +270,35 @@ class ApiTest(TestCase):
 
        def test_title_similar(self):
                # 1947362 "Ben-Hur (1959)"
-               data_similar = client.titleSimilar(1947362)
+               data_similar = self.client.titleSimilar(1947362)
                #print data_similar
 
        def test_title(self):
-               title = client.title(1947362, cast_props=['name'])
+               title = self.client.title(1947362, cast_props=['name'])
+               self.assertTrue(title.has_key('covers'))
+               self.assertTrue(title['covers']['full'])
+               self.assertTrue(title.has_key('cast'))
+               self.assertTrue(title['cast'][0]['name']=='Charlton Heston')
 
+       def test_title_encoding(self):
+               title = client.title(719, cast_props=['name'])
+               
                self.assertTrue(title.has_key('cover_full'))
                self.assertTrue(title.has_key('cast'))
-               self.assertTrue(title['cast'][0]['name']=='Charlton Heston')
+               self.assertEqual(title['cast'][0]['name'], 'Audrey Tautou')
 
        def test_tvshow(self):
-               title = client.tvshow(14335, cast_props=['name'], 
season_props=['id','season_number', 'episodes_count', 'watched_count'], 
season_limit=3)
+               title = self.client.tvshow(14335, cast_props=['name'], 
season_props=['id','season_number', 'episodes_count', 'watched_count'], 
season_limit=3)
 
                # print dump(title)
 
-               self.assertTrue(title.has_key('cover_full'))
+               self.assertTrue(title.has_key('covers'))
                self.assertTrue(title.get('type')=='tvshow')
                self.assertTrue(title.get('year')==2005)
                self.assertTrue(title['cast'][0]['name']=='Josh Radnor')
 
        def test_season(self):
-               title = client.season(14376)
+               title = self.client.season(14376)
 
                self.assertTrue(title.has_key('episodes'))
                es = title['episodes']
@@ -297,22 +317,22 @@ class ApiTest(TestCase):
                        }
                }
 
-               enc_data = client._unicode_input(data)
+               enc_data = self.client._unicode_input(data)
                self.assertEquals(str(enc_data), r"{'key-one': 'Alfa - 
\xce\xb1', 'key-dict': {'key-nested': 'Gama - \xce\xb3'}}")
 
        def test_search(self):
-               result = client.search('Adams aebler', 13)
-               
+               result = self.client.search('Adams aebler', 13)
+               logger.debug(pformat(result))
                self.assertTrue(result.has_key('search_result'))
                self.assertTrue(result['search_result'][0]['id'] == 514461)
 
 
-               result = client.search('Love', 13)
+               result = self.client.search('Love', 13)
                self.assertTrue(len(result['search_result']) == 13)
 
        def test_identify_correct(self):
-               result = client.title_identify_correct(1947362, 
'8b05ff1ad4865480e4705a42b413115db2bf94db')
-               #~ print dump(result)
+               result = self.client.title_identify_correct(1947362, 
'8b05ff1ad4865480e4705a42b413115db2bf94db')
+               logger.debug(dump(result))
                self.assertTrue(result['status']=='ok')
 
        @skip('this needs deeper work')
@@ -327,33 +347,33 @@ class ApiTest(TestCase):
                        "stv_title_hash": CORRECTION_FILE_HASH,
                        "os_title_hash": "486d1f7112f9749d",
                        "imdb_id": "0102536",
-                       'title_property[]': ','.join(['name', 'cover_medium']),
+                       'title_property[]': ','.join(['name', 'covers']),
                        'type': 'movie'
                }
 
                # let the service know about our hash. without this it would 
not be possible to do correction
-               stv_title = client.titleIdentify(**ident)
+               stv_title = self.client.titleIdentify(**ident)
 
                # make sure that this unreal id is in library
                SOME_ID_IN_LIBRARY = 100
-               result = client.title_identify_correct(SOME_ID_IN_LIBRARY, 
CORRECTION_FILE_HASH)
+               result = self.client.title_identify_correct(SOME_ID_IN_LIBRARY, 
CORRECTION_FILE_HASH)
                self.assertTrue(result.get('status')=='ok')
 
-               library = client.library(['id', 'type', 'name'])
+               library = self.client.library(['id', 'type', 'name'])
                lib_ids = [i['id'] for i in library['titles']]
                #~ print lib_ids
 
                # the id should already be there after correction, but we can 
let this code here
                if SOME_ID_IN_LIBRARY not in lib_ids:
                        print 'adding %d into library' % SOME_ID_IN_LIBRARY
-                       client.libraryTitleAdd(SOME_ID_IN_LIBRARY)
+                       self.client.libraryTitleAdd(SOME_ID_IN_LIBRARY)
 
                # remove the target id if it is in the library
                if TITLE_CORRECTION_TARGET in lib_ids:
                        print 'removing %d from library' % 
TITLE_CORRECTION_TARGET
-                       client.libraryTitleRemove(TITLE_CORRECTION_TARGET)
+                       self.client.libraryTitleRemove(TITLE_CORRECTION_TARGET)
 
-               library = client.library(['id', 'type', 'name'])
+               library = self.client.library(['id', 'type', 'name'])
                lib_ids = [i['id'] for i in library['titles']]
                #~ print lib_ids
 
@@ -362,29 +382,29 @@ class ApiTest(TestCase):
                # test the correction
 
                #       get recco
-               recco = client.profileRecco('movie', True)
+               recco = self.client.profileRecco('movie', True)
                lib_ids = [i['id'] for i in recco['titles']]
                print 'recco:' + dump(lib_ids)
 
-               result = client.title_identify_correct(TITLE_CORRECTION_TARGET, 
CORRECTION_FILE_HASH)
+               result = 
self.client.title_identify_correct(TITLE_CORRECTION_TARGET, 
CORRECTION_FILE_HASH)
                self.assertTrue(result.get('status')=='ok')
 
-               library = client.library(['id', 'type', 'name'])
+               library = self.client.library(['id', 'type', 'name'])
                lib_ids = [i['id'] for i in library['titles']]
                self.assertTrue(TITLE_CORRECTION_TARGET in lib_ids, "The 
correction target id is not in library")
                self.assertTrue(SOME_ID_IN_LIBRARY not in lib_ids, "The 
corrected id is still in library")
 
 
-               recco = client.profileRecco('movie', True)
+               recco = self.client.profileRecco('movie', True)
                lib_ids = [i['id'] for i in recco['titles']]
                print 'recco:' + dump(lib_ids)
 
 
                # correct back to stv_id = SOME_ID_IN_LIBRARY
-               result = client.title_identify_correct(SOME_ID_IN_LIBRARY, 
CORRECTION_FILE_HASH)
+               result = self.client.title_identify_correct(SOME_ID_IN_LIBRARY, 
CORRECTION_FILE_HASH)
                self.assertTrue(result.get('status')=='ok')
 
-               library = client.library(['id', 'type', 'name'])
+               library = self.client.library(['id', 'type', 'name'])
                lib_ids = [i['id'] for i in library['titles']]
                self.assertTrue(TITLE_CORRECTION_TARGET not in lib_ids)
                self.assertTrue(SOME_ID_IN_LIBRARY in lib_ids)
@@ -401,64 +421,86 @@ class ApiTest(TestCase):
                        "stv_title_hash": CORRECTION_FILE_HASH,
                        "os_title_hash": "486d1f7112f9749d",
                        "imdb_id": "0102536",
-                       'title_property[]': ','.join(['name', 'cover_medium']),
+                       'title_property[]': ','.join(['name', 'covers']),
                        'type': 'movie'
                }
 
                # let the service know about our hash. withou this it would not 
be possible to do correction
-               stv_title = client.titleIdentify(**ident)
+               stv_title = self.client.titleIdentify(**ident)
 
                # make sure that this unreal id in library
                SOME_ID_IN_LIBRARY = 100
-               result = client.title_identify_correct(SOME_ID_IN_LIBRARY, 
CORRECTION_FILE_HASH)
+               result = self.client.title_identify_correct(SOME_ID_IN_LIBRARY, 
CORRECTION_FILE_HASH)
                self.assertTrue(result.get('status')=='ok')
 
                # remove the target id if it is in the library
                if TITLE_CORRECTION_TARGET in lib_ids:
                        print 'removing %d from library' % 
TITLE_CORRECTION_TARGET
-                       client.libraryTitleRemove(TITLE_CORRECTION_TARGET)
+                       self.client.libraryTitleRemove(TITLE_CORRECTION_TARGET)
 
     
        def test_library(self):
-               result = client.library(['date', 'genres', 'cover_small'])
+               # add data to library
+               ident = {
+                       'file_name': 
'/Volumes/FLOAT/Film/_videne/Notorious/Notorious.[2009self.Eng].TELESYNC.DivX-LTT.avi',
+                       'stv_title_hash': 
'8b05ff1ad4865480e4705a42b413115db2bf94db',
+                       'os_title_hash': '484e59acbfaf64e5',
+                       'imdb_id': '0472198'
+               }
+
+               data = self.client.titleIdentify(**ident)
+               stv_title_id = data['id']
+
+               data = self.client.libraryTitleAdd(stv_title_id)
+
+               requested_title_props = ['date', 'genres', 'covers']
+               result = self.client.library(requested_title_props)
                self.assertTrue(result.get('created'))
                self.assertTrue(result.get('device_id'))
                self.assertTrue(result.get('name'))
                self.assertTrue(result.get('titles'))
                self.assertTrue(type(result['titles']) is list)
+               for title in result['titles']:
+                       for prop_name in requested_title_props:
+                               self.assertTrue(title.has_key(prop_name))
                
-               result2 = client.library(['id', 'cover_full', 'cover_large', 
'cover_medium', 'cover_small', 'cover_thumbnail', 'date', 'genres', 'url', 
'name', 'plot', 'released', 'trailer', 'type', 'year', 'runtime', 'directors', 
'writers', 'cast', 'watched'])
+               requested_title_props = ['id', 'covers', 'date', 'genres', 
'url', 'name', 'plot', 'released', 'trailer', 'type', 'year', 'runtime', 
'directors', 'writers', 'cast', 'watched']
+               result2 = self.client.library(requested_title_props)
                self.assertTrue(result2.get('created'))
                self.assertTrue(result2.get('device_id'))
                self.assertTrue(result2.get('name'))
                self.assertTrue(result2.get('titles'))
                self.assertTrue(type(result2['titles']) is list)
+               for title in result['titles']:
+                       logger.debug(title)
+                       for prop_name in requested_title_props:
+                               self.assertTrue(title.has_key(prop_name))
+
 
        def test_profileCreate(self):
                device_id = ''.join([random.choice(string.hexdigits) for n in 
xrange(32)])
+               c = connection
                new_client = ApiClient(c['base_url'], c['key'], c['secret'], 
None, None, device_id, debugLvl = logging.DEBUG, rel_api_url=c['rel_api_url'])
                
                # bad request
                result = new_client.profileCreate('Real \;\"\\"Name', '"select 
1\".smid\"@gmail.com')           
-               print result
+               logger.debug(pformat(result))
                
                # good request, but repeated
                result = new_client.profileCreate('Real Second Name', 
'[email protected]')          
-               print result
+               logger.debug(pformat(result))
                
                # good request, unique
                result = new_client.profileCreate('Real Third Name', 
'[email protected]' % device_id)            
-               print result
+               logger.debug(pformat(result))
                
                #~ self.assertEqual(result.get('status'), 'created')
 
-if __name__ == '__main__':
-       c = connection
-       client = ApiClient(c['base_url'], c['key'], c['secret'], c['username'], 
c['password'], c['device_id'], debugLvl = logging.DEBUG, 
rel_api_url=c['rel_api_url'])
 
+if __name__ == '__main__':
+       logging.basicConfig(level=logging.ERROR)
        logger = logging.getLogger()
 
-
        if len(sys.argv) < 2:
                suite = TestLoader().loadTestsFromTestCase(ApiTest)
        else:
diff --git a/plugin.video.synopsi/tests/cache.unittest.py 
b/plugin.video.synopsi/tests/cache.unittest.py
index cb64e06..5e59009 100644
--- a/plugin.video.synopsi/tests/cache.unittest.py
+++ b/plugin.video.synopsi/tests/cache.unittest.py
@@ -6,7 +6,7 @@ import logging
 import json
 
 # test helper
-from common import connection
+from settings import connection
 
 # application
 sys.path.insert(0, os.path.abspath('..'))
diff --git a/plugin.video.synopsi/tests/data/local_recco.py 
b/plugin.video.synopsi/tests/data/local_recco.py
index 44cb3d0..aa9b3d4 100644
--- a/plugin.video.synopsi/tests/data/local_recco.py
+++ b/plugin.video.synopsi/tests/data/local_recco.py
@@ -3,22 +3,22 @@ local_recco = {
     "_generated_in": "0:00:00.188243",
     "titles": [
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg"},
             "id": 136558,
             "name": "The Time Machine"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02514500-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02514500-223.jpg"},
             "id": 2514500,
             "name": "Inglourious Basterds"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00072215-223.jpg"},
             "id": 72215,
             "name": "I, Robot"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/01743052-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/01743052-223.jpg"},
             "id": 1743052,
             "name": "The Time Machine"
         }
@@ -28,57 +28,57 @@ local_recco = {
 local_recco2 = {
        "titles": [
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02565924-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02565924-223.jpg"},
             "id": 2565924,
             "name": "WALL\u00b7E"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00082746-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00082746-223.jpg"},
             "id": 82746,
             "name": "Cats & Dogs"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02496504-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02496504-223.jpg"},
             "id": 2496504,
             "name": "Die Hard"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00067407-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00067407-223.jpg"},
             "id": 67407,
             "name": "Mission: Impossible"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00077621-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00077621-223.jpg"},
             "id": 77621,
             "name": "Mr. Nobody"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02384607-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02384607-223.jpg"},
             "id": 2384607,
             "name": "Limitless"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00035100-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00035100-223.jpg"},
             "id": 35100,
             "name": "X2"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02107999-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02107999-223.jpg"},
             "id": 2107999,
             "name": "The Hangover"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00719816-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00719816-223.jpg"},
             "id": 719816,
             "name": "Zombieland"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02830590-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/02830590-223.jpg"},
             "id": 2830590,
             "name": "The Brave One"
         },
         {
-            "cover_medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00104614-223.jpg";,
+            "covers": {"medium": 
"https://s3.amazonaws.com/titles.synopsi.tv/00104614-223.jpg"},
             "id": 104614,
             "name": "American History X"
         }
diff --git a/plugin.video.synopsi/tests/onlinecache.unittest.py 
b/plugin.video.synopsi/tests/onlinecache.unittest.py
index d952f5e..98fa0c4 100644
--- a/plugin.video.synopsi/tests/onlinecache.unittest.py
+++ b/plugin.video.synopsi/tests/onlinecache.unittest.py
@@ -9,7 +9,7 @@ import random
 import time
 
 # test helper
-from common import connection
+from settings import connection
 
 # application
 sys.path.insert(0, os.path.abspath('..'))
@@ -87,7 +87,7 @@ class OnlineCacheTest(TestCase):
                        "stv_title_hash": CORRECTION_FILE_HASH,
                        "os_title_hash": "486d1f7112f9749d",
                        "imdb_id": "0102536",
-                       'title_property[]': ','.join(['name', 'cover_medium']),
+                       'title_property[]': ','.join(['name', 'covers']),
                        'type': 'movie'
                }
 
@@ -162,7 +162,7 @@ class OnlineCacheTest(TestCase):
                        "stv_title_hash": CORRECTION_FILE_HASH,
                        "os_title_hash": "486d1f7112f9749d",
                        "imdb_id": "0102536",
-                       'title_property[]': ','.join(['name', 'cover_medium']),
+                       'title_property[]': ','.join(['name', 'covers']),
                        'type': 'movie'
                }
 
diff --git a/plugin.video.synopsi/tests/test.py 
b/plugin.video.synopsi/tests/test.py
index 274321c..450d86a 100644
--- a/plugin.video.synopsi/tests/test.py
+++ b/plugin.video.synopsi/tests/test.py
@@ -5,12 +5,13 @@ from PIL import Image, ImageDraw, ImageOps
 
 jsfile = [ 
 
-         {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-960.jpg',
-          'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-267.jpg',
-          'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg',
-          'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-134.jpg',
-          'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-075.jpg',
-          
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-960.jpg',
+              'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-267.jpg',
+              'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg',
+              'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-134.jpg',
+              'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-075.jpg'},
+              
           'genres': ['Sci-Fi', 'Adventure', 'Action'],
           'id': 136558,
           'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-075.jpg',
@@ -24,12 +25,13 @@ jsfile = [
           'type': u'movie',
           'url': '/movies/136558/the-time-machine-2002/',
           'year': 2002},
- {'cover_full': u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-960.jpg',
-          'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-267.jpg',
-          'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-223.jpg',
-          'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-134.jpg',
-          'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-075.jpg',
-          
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-960.jpg',
+              'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-267.jpg',
+              'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-223.jpg',
+              'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-134.jpg',
+              'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-075.jpg'},
+              
           'genres': ['Action', 'Adventure', 'Fantasy', 'Sci-Fi'],
           'id': 230206,
           'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-075.jpg',
@@ -43,12 +45,13 @@ jsfile = [
           'type': u'movie',
           'url': 
'/movies/230206/star-wars-episode-vi-return-of-the-jedi-1983/',
           'year': 1983},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-960.jpg',
-          'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-267.jpg',
-          'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-223.jpg',
-          'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-134.jpg',
-          'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-075.jpg',
-          
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-960.jpg',
+              'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-267.jpg',
+              'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-223.jpg',
+              'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-134.jpg',
+              'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-075.jpg'},
+              
           'genres': ['Action', 'Adventure', 'Crime', 'Mystery', 'Thriller'],
           'id': 654591,
           'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-075.jpg',
@@ -62,12 +65,13 @@ jsfile = [
           'type': u'movie',
           'url': '/movies/654591/sherlock-holmes-a-game-of-shadows-2011/',
           'year': 2011},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-960.jpg',
-           'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-267.jpg',
-           'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-223.jpg',
-           'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-134.jpg',
-           'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-075.jpg',
-           
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-960.jpg',
+               'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-267.jpg',
+               'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-223.jpg',
+               'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-134.jpg',
+               'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-075.jpg'},
+               
            'genres': ['Action', 'Drama', 'Thriller'],
            'id': 2382712,
            'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-075.jpg',
@@ -81,12 +85,13 @@ jsfile = [
            'type': u'movie',
            'url': '/movies/2382712/clear-and-present-danger-1994/',
            'year': 1994},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-960.jpg',
-           'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-267.jpg',
-           'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-223.jpg',
-           'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-134.jpg',
-           'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-075.jpg',
-           
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-960.jpg',
+               'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-267.jpg',
+               'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-223.jpg',
+               'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-134.jpg',
+               'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-075.jpg'},
+               
            'genres': ['Comedy', 'Drama', 'Fantasy', 'Sci-Fi', 'Thriller'],
            'id': 2455949,
            'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-075.jpg',
@@ -100,12 +105,13 @@ jsfile = [
            'type': u'movie',
            'url': '/movies/2455949/southland-tales-2006/',
            'year': 2006},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-960.jpg',
-           'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-267.jpg',
-           'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-223.jpg',
-           'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-134.jpg',
-           'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-075.jpg',
-           
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-960.jpg',
+               'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-267.jpg',
+               'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-223.jpg',
+               'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-134.jpg',
+               'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-075.jpg'},
+               
            'genres': ['Action', 'Sci-Fi', 'Thriller'],
            'id': 3094553,
            'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-075.jpg',
@@ -119,12 +125,13 @@ jsfile = [
            'type': u'movie',
            'url': '/movies/3094553/terminator-2-judgment-day-1991/',
            'year': 1991},
-{'cover_full': u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-960.jpg',
-          'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-267.jpg',
-          'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg',
-          'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-134.jpg',
-          'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-075.jpg',
-          
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-960.jpg',
+              'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-267.jpg',
+              'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-223.jpg',
+              'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-134.jpg',
+              'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-075.jpg'},
+              
           'genres': ['Sci-Fi', 'Adventure', 'Action'],
           'id': 136558,
           'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00136558-075.jpg',
@@ -138,12 +145,13 @@ jsfile = [
           'type': u'movie',
           'url': '/movies/136558/the-time-machine-2002/',
           'year': 2002},
- {'cover_full': u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-960.jpg',
-          'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-267.jpg',
-          'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-223.jpg',
-          'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-134.jpg',
-          'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-075.jpg',
-          
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-960.jpg',
+              'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-267.jpg',
+              'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-223.jpg',
+              'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-134.jpg',
+              'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-075.jpg'},
+              
           'genres': ['Action', 'Adventure', 'Fantasy', 'Sci-Fi'],
           'id': 230206,
           'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00230206-075.jpg',
@@ -157,12 +165,13 @@ jsfile = [
           'type': u'movie',
           'url': 
'/movies/230206/star-wars-episode-vi-return-of-the-jedi-1983/',
           'year': 1983},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-960.jpg',
-          'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-267.jpg',
-          'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-223.jpg',
-          'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-134.jpg',
-          'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-075.jpg',
-          
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-960.jpg',
+              'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-267.jpg',
+              'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-223.jpg',
+              'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-134.jpg',
+              'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-075.jpg'},
+              
           'genres': ['Action', 'Adventure', 'Crime', 'Mystery', 'Thriller'],
           'id': 654591,
           'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/00654591-075.jpg',
@@ -176,12 +185,13 @@ jsfile = [
           'type': u'movie',
           'url': '/movies/654591/sherlock-holmes-a-game-of-shadows-2011/',
           'year': 2011},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-960.jpg',
-           'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-267.jpg',
-           'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-223.jpg',
-           'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-134.jpg',
-           'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-075.jpg',
-           
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-960.jpg',
+               'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-267.jpg',
+               'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-223.jpg',
+               'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-134.jpg',
+               'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-075.jpg'},
+               
            'genres': ['Action', 'Drama', 'Thriller'],
            'id': 2382712,
            'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02382712-075.jpg',
@@ -195,12 +205,13 @@ jsfile = [
            'type': u'movie',
            'url': '/movies/2382712/clear-and-present-danger-1994/',
            'year': 1994},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-960.jpg',
-           'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-267.jpg',
-           'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-223.jpg',
-           'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-134.jpg',
-           'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-075.jpg',
-           
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-960.jpg',
+               'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-267.jpg',
+               'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-223.jpg',
+               'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-134.jpg',
+               'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-075.jpg'},
+               
            'genres': ['Comedy', 'Drama', 'Fantasy', 'Sci-Fi', 'Thriller'],
            'id': 2455949,
            'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/02455949-075.jpg',
@@ -214,12 +225,13 @@ jsfile = [
            'type': u'movie',
            'url': '/movies/2455949/southland-tales-2006/',
            'year': 2006},
-  {'cover_full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-960.jpg',
-           'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-267.jpg',
-           'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-223.jpg',
-           'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-134.jpg',
-           'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-075.jpg',
-           
+          {'covers':
+              {'full': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-960.jpg',
+               'cover_large': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-267.jpg',
+               'cover_medium': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-223.jpg',
+               'cover_small': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-134.jpg',
+               'cover_thumbnail': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-075.jpg'},
+               
            'genres': ['Action', 'Sci-Fi', 'Thriller'],
            'id': 3094553,
            'image': 
u'https://s3.amazonaws.com/titles.synopsi.tv/2371b5d0b29c0ab4d0c7e65b5fc0cd91-075.jpg',
diff --git a/plugin.video.synopsi/tests/utilities.unittest.py 
b/plugin.video.synopsi/tests/utilities.unittest.py
index 7988e90..0909da5 100644
--- a/plugin.video.synopsi/tests/utilities.unittest.py
+++ b/plugin.video.synopsi/tests/utilities.unittest.py
@@ -5,7 +5,7 @@ import logging
 import json
 
 # test helper
-from common import connection
+from settings import connection
 
 # application
 sys.path.insert(0, os.path.abspath('..'))
diff --git a/plugin.video.synopsi/tests/xbmcrpc.unittest.py 
b/plugin.video.synopsi/tests/xbmcrpc.unittest.py
index 0d3e52e..d361f40 100644
--- a/plugin.video.synopsi/tests/xbmcrpc.unittest.py
+++ b/plugin.video.synopsi/tests/xbmcrpc.unittest.py
@@ -5,7 +5,7 @@ import logging
 import json
 
 # test helper
-from common import connection
+from settings import connection
 
 sys.path.insert(0, os.path.abspath('..'))
 
diff --git a/plugin.video.synopsi/utilities.py 
b/plugin.video.synopsi/utilities.py
index 857972f..ff59233 100644
--- a/plugin.video.synopsi/utilities.py
+++ b/plugin.video.synopsi/utilities.py
@@ -46,8 +46,8 @@ SEARCH_RESULT_LIMIT = 15
 
 
 # api request title properties
-reccoDefaultProps = ['id', 'cover_medium', 'name', 'type', 'watched', 'year']
-defaultDetailProps = ['id', 'cover_full', 'cover_large', 'cover_medium', 
'cover_small', 'cover_thumbnail', 'date', 'genres', 'url', 'name', 'plot', 
'released', 'trailer', 'type', 'year', 'directors', 'writers', 'runtime', 
'cast']
+reccoDefaultProps = ['id', 'covers', 'name', 'type', 'watched', 'year']
+defaultDetailProps = ['id', 'covers', 'date', 'genres', 'url', 'name', 'plot', 
'released', 'trailer', 'type', 'year', 'directors', 'writers', 'runtime', 
'cast']
 tvshowdefaultDetailProps = defaultDetailProps + ['seasons']
 defaultCastProps = ['name']
 
@@ -57,7 +57,7 @@ type2listinglabel = { 'movie': 'Similar movies', 'tvshow': 
'Seasons'}
 
 list_filter = reccoDefaultProps + ['type', 'id', 'stvId', 'xbmc_id', 'name', 
'file']
 
-item_show_all_movies_hack = { 'id': HACK_SHOW_ALL_LOCAL_MOVIES, 
'cover_medium': BTN_SHOW_ALL_MOVIES, 'name': '', 'type': 'HACK'}
+item_show_all_movies_hack = { 'id': HACK_SHOW_ALL_LOCAL_MOVIES, 'covers': 
{'medium': BTN_SHOW_ALL_MOVIES}, 'name': '', 'type': 'HACK'}
 
 #      enums
 class OverlayCode:
@@ -623,7 +623,7 @@ def home_screen_fill(apiClient, cache):
                                
WINDOW.setProperty("LatestMovie.{0}.Title".format(i+1), m['name'])
                                if lib_item:
                                        
WINDOW.setProperty("LatestMovie.{0}.Path".format(i+1), lib_item['file'])
-                               
WINDOW.setProperty("LatestMovie.{0}.Thumb".format(i+1), m['cover_large'])
+                               
WINDOW.setProperty("LatestMovie.{0}.Thumb".format(i+1), m['covers']['large'])
 
                        # recco could return less than 5 items
                        if i < len(episode_recco):
@@ -635,7 +635,7 @@ def home_screen_fill(apiClient, cache):
                                
WINDOW.setProperty("LatestEpisode.{0}.ShowTitle".format(i+1), e['name'])        
                                        # episode name
                                
WINDOW.setProperty("LatestEpisode.{0}.EpisodeNo".format(i+1), 
get_episode_identifier(e))                # episode id string
                                
WINDOW.setProperty("LatestEpisode.{0}.Path".format(i+1), c_episode['file'] if 
c_episode else '')
-                               
WINDOW.setProperty("LatestEpisode.{0}.Thumb".format(i+1), e['cover_large'])
+                               
WINDOW.setProperty("LatestEpisode.{0}.Thumb".format(i+1), e['covers']['large'])
 
 
        except Exception as e:

-----------------------------------------------------------------------

Summary of changes:
 plugin.video.synopsi/_src/install_xbmc_version.sh  |    2 +
 plugin.video.synopsi/_src/pull_request.sh          |   15 ++
 plugin.video.synopsi/_src/release-local.sh         |   25 +++
 plugin.video.synopsi/addon.py                      |   10 +-
 plugin.video.synopsi/addon.xml                     |    2 +-
 plugin.video.synopsi/apiclient.py                  |   25 ++-
 plugin.video.synopsi/changelog.txt                 |    4 +
 plugin.video.synopsi/dialog.py                     |   12 +-
 plugin.video.synopsi/resources/const.py            |    3 +-
 plugin.video.synopsi/tests/apiclient.unittest.py   |  182 ++++++++++++--------
 plugin.video.synopsi/tests/cache.unittest.py       |    2 +-
 plugin.video.synopsi/tests/common.py               |   25 ---
 plugin.video.synopsi/tests/data/local_recco.py     |   30 ++--
 plugin.video.synopsi/tests/onlinecache.unittest.py |    6 +-
 plugin.video.synopsi/tests/settings/base.py        |   11 ++
 plugin.video.synopsi/tests/settings/crux.py        |    3 +
 plugin.video.synopsi/tests/settings/live.py        |    3 +
 plugin.video.synopsi/tests/settings/pluto.py       |    3 +
 plugin.video.synopsi/tests/test.py                 |  156 +++++++++--------
 plugin.video.synopsi/tests/utilities.unittest.py   |    2 +-
 plugin.video.synopsi/tests/xbmcrpc.unittest.py     |    2 +-
 plugin.video.synopsi/utilities.py                  |   10 +-
 22 files changed, 316 insertions(+), 217 deletions(-)
 create mode 100644 plugin.video.synopsi/_src/install_xbmc_version.sh
 create mode 100644 plugin.video.synopsi/_src/pull_request.sh
 create mode 100644 plugin.video.synopsi/_src/release-local.sh
 delete mode 100644 plugin.video.synopsi/tests/common.py
 create mode 100644 plugin.video.synopsi/tests/settings/base.py
 create mode 100644 plugin.video.synopsi/tests/settings/crux.py
 create mode 100644 plugin.video.synopsi/tests/settings/live.py
 create mode 100644 plugin.video.synopsi/tests/settings/pluto.py


hooks/post-receive
-- 
Plugins

------------------------------------------------------------------------------
Want excitement?
Manually upgrade your production database.
When you want reliability, choose Perforce
Perforce version control. Predictably reliable.
http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons

Reply via email to