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