Skip to content

Commit 19f0e49

Browse files
committed
auto quality/language selection
1 parent dd1f5bc commit 19f0e49

File tree

2 files changed

+48
-35
lines changed

2 files changed

+48
-35
lines changed

resources/settings.xml

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,13 @@
44
<setting label="Авторизация" type="lsep" />
55
<setting id="username" type="text" label="Логин" default="" />
66
<setting id="password" type="text" label="Пароль" option="hidden" default="" />
7-
<!-- </category>
8-
<category label="Список видео">-->
9-
<!--
7+
108
<setting label="Список видео" type="lsep" />
11-
<setting id="quality" type="enum" label="Максимальное качество видео" values="Любой|SD|720p|FullHD"/>
12-
<setting id="translate" type="enum" label="Перевод по возможности" values="Показывать все|Субтитры|Голос"/>
13-
<setting id="sorting" type="enum" label="Сортировка" values="Сначала новые|Сначала старые" />
14-
-->
9+
<setting id="language" type="enum" label="Предпочитаемый язык озвучки" values="Русский|Оригинал"/>
10+
<setting id="subtitles_language" type="enum" label="Предпочитаемый язык субтитров" values="Русский|Оригинал"/>
11+
<setting id="quality" type="enum" label="Максимальное качество видео" values="SD|720p|FullHD|2K|4K"/>
1512

16-
<!-- <setting label="Группировка" type="lsep" />
17-
<setting id="group_quality" type="bool" label="Группировать по качеству" default="false" />
18-
<setting id="group_translate" type="bool" label="Группировать по переводу" default="false" />
19-
<setting id="group_season" type="bool" label="Группировать по сезонам" default="true" /> -->
20-
</category>
21-
<category label="Параметры">
13+
<setting label="Параметры" type="lsep" />
2214
<setting id="port" type="number" label="Порт веб-сервера" default="19088" />
23-
<!--
24-
<setting label="Параметры воспроизведения" type="lsep" />
25-
<setting id="audio" type="enum" label="Предпочитаемая аудиодорожка" values="По-умолчанию|Перевод|Оригинал"/>
26-
<setting id="subtitle" type="enum" label="Предпочитаемые субтитры" values="По-умолчанию|Перевод|Оригинал|Выключить"/>
27-
28-
<setting label="Прочее" type="lsep" />
29-
<setting id="list_unwatched_season" type="bool" label="Открывать непросмотренный сезон" default="false" />
30-
<setting label="Стереть кеши" type="action" action="RunScript(plugin.video.soap4.me, clearcache)"/>
31-
-->
3215
</category>
3316
</settings>

service.py

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
__addon__ = xbmcaddon.Addon()
2626
ADDONVERSION = __addon__.getAddonInfo('version')
2727
ADDONNAME = __addon__.getAddonInfo('name')
28+
ADDONID = __addon__.getAddonInfo('id')
2829
ADDONICON = xbmc.translatePath(__addon__.getAddonInfo('icon'))
2930
ADDONPROFILE = xbmc.translatePath(__addon__.getAddonInfo('profile'))
3031

@@ -170,7 +171,7 @@ def _post_data(self, params=None):
170171
return urllib.urlencode(params)
171172

172173
def _request(self, url, params=None):
173-
xbmc.log('{0}: REQUEST: {1} {2}'.format(ADDONNAME, url, params))
174+
xbmc.log('{0}: REQUEST: {1} {2}'.format(ADDONID, url, params))
174175
self._cookies_init()
175176

176177
req = urllib2.Request(self.HOST + url)
@@ -230,7 +231,6 @@ def clean_all(self):
230231
class KodiConfig(object):
231232
@classmethod
232233
def soap_get_auth(cls):
233-
234234
return {
235235
'token': __addon__.getSetting('_token'),
236236
'token_sid': __addon__.getSetting('_token_sid'),
@@ -285,6 +285,13 @@ def get_web_port(cls):
285285
return to_int(__addon__.getSetting('port'))
286286

287287

288+
class SoapConfig(object):
289+
def __init__(self):
290+
self.language = to_int(__addon__.getSetting('language')) # 0 rus, 1 orig
291+
self.subtitles_language = to_int(__addon__.getSetting('subtitles_language')) # 0 rus, 1 orig
292+
self.quality = to_int(__addon__.getSetting('quality')) # 0 SD, 1 720p, 2 FullHD, 3 2K, 4 4K
293+
294+
288295
class SoapAuth(object):
289296
AUTH_URL = '/auth/'
290297
CHECK_URL = '/auth/check/'
@@ -359,7 +366,7 @@ class SoapApi(object):
359366
def __init__(self):
360367
self.client = SoapHttpClient()
361368
self.auth = SoapAuth(self.client)
362-
#self.config = SoapConfig()
369+
self.config = SoapConfig()
363370

364371
self.auth.auth()
365372

@@ -379,12 +386,35 @@ def episodes(self, sid):
379386
data = data['episodes']
380387
return map(lambda row: self.get_episode(row), data)
381388

382-
@staticmethod
383-
def get_episode(row):
384-
file = row['files'][0] # TODO: search for the best file
385-
return {'season': row['season'], 'episode': row['episode'], 'id': file['eid'], 'hash': file['hash']}
389+
def get_episode(self, row):
390+
f = self.get_best_file(row['files'])
391+
return {'season': row['season'], 'episode': row['episode'], 'id': f['eid'], 'hash': f['hash']}
392+
393+
def get_best_file(self, files):
394+
return max(files, key=self.get_file_order)
395+
396+
def get_file_order(self, f):
397+
translate = int(f['translate']) - 1 # from 0
398+
quality = int(f['quality']) - 1 # from 0
399+
400+
translate_matrix = \
401+
[
402+
[-4, -3, -1, 0], # eng
403+
[-1, -1, -3, -2], # rus with eng subs
404+
[-2, -3, -1, -1], # eng with rus subs
405+
[ 0, -1, -3, -4], # rus
406+
]
407+
408+
config_translate_index = 2 * self.config.language * 2 + self.config.subtitles_language
409+
translate_order = translate_matrix[translate][config_translate_index]
410+
quality_order = \
411+
(quality - self.config.quality) \
412+
if (quality <= self.config.quality) \
413+
else (self.config.quality - quality - 10)
414+
return 100 * translate_order + quality_order # translation has priority over quality
386415

387416
def get_episode_url(self, sid, eid, ehash):
417+
# TODO: warn if quality is bigger than configured
388418
myhash = hashlib.md5(
389419
str(self.client.token) +
390420
str(eid) +
@@ -405,13 +435,13 @@ class WebHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
405435

406436
def do_GET(self):
407437
# Parse query data & params to find out what was passed
408-
xbmc.log('%s: Serve %s' % (ADDONNAME, self.path))
438+
xbmc.log('%s: Serve %s' % (ADDONID, self.path))
409439
parsed_params = urlparse.urlparse(self.path)
410440
query_parsed = urlparse.parse_qs(parsed_params.query)
411441
path = urllib.unquote(parsed_params.path)
412442

413443
if path == '/':
414-
xbmc.log('%s: Listing shows' % ADDONNAME)
444+
xbmc.log('%s: Listing shows' % ADDONID)
415445
shows = self.server.api.my_shows()
416446

417447
self.out_folders(shows,
@@ -421,7 +451,7 @@ def do_GET(self):
421451
show = self.match.group(1)
422452
sid = query_parsed['id'][0]
423453

424-
xbmc.log('%s: Listing episodes of \'%s\'' % (ADDONNAME, show))
454+
xbmc.log('%s: Listing episodes of \'%s\'' % (ADDONID, show))
425455
episodes = self.server.api.episodes(sid)
426456

427457
self.out_files(episodes,
@@ -435,10 +465,10 @@ def do_GET(self):
435465
eid = query_parsed['id'][0]
436466
ehash = query_parsed['hash'][0]
437467

438-
xbmc.log('%s: Requested episode %s from season %s of \'%s\'' % (ADDONNAME, episode, season, show))
468+
xbmc.log('%s: Requested episode %s from season %s of \'%s\'' % (ADDONID, episode, season, show))
439469
url = self.server.api.get_episode_url(sid, eid, ehash)
440470

441-
xbmc.log("%s: Redirect to '%s'" % (ADDONNAME, url))
471+
xbmc.log("%s: Redirect to '%s'" % (ADDONID, url))
442472
self.send_response(301)
443473
self.send_header('Location', url)
444474
self.end_headers()
@@ -481,5 +511,5 @@ def out_elements(self, elements):
481511

482512

483513
if __name__ == "__main__":
484-
xbmc.log('%s: Version %s started' % (ADDONNAME, ADDONVERSION))
514+
xbmc.log('%s: Version %s started' % (ADDONID, ADDONVERSION))
485515
Main()

0 commit comments

Comments
 (0)