Skip to content

Commit

Permalink
release: v2.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
newt-sc committed Dec 26, 2020
1 parent cd4a674 commit 9fe12cf
Show file tree
Hide file tree
Showing 9 changed files with 172 additions and 41 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
* [v2.0.0](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-2.0.0):
* Use IMDb as main source for all meta.
* Retry on 503 (Service Unavailable). OpenSubtitles and Subscene seems to return it occasionally.

* [v1.8.0](https://github.com/newt-sc/a4kSubtitles/releases/tag/service.subtitles.a4ksubtitles%2Fservice.subtitles.a4ksubtitles-1.8.0):
* Remove SubDb (Site is down)
* Make lib vfs optional since there are fallbacks and it is used as last case scenario. Thus making the addon installable on platforms which are not supported by lib vfs.
Expand Down
4 changes: 0 additions & 4 deletions a4kSubtitles/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,11 @@ def get_info_label(label):
default___ = self.core.kodi.xbmcvfs.File.hash
self.core.kodi.xbmcvfs.File.hash = lambda: meta.get('filehash', '')

default____ = self.core.kodi.xbmcvfs.File.subdb_hash
self.core.kodi.xbmcvfs.File.subdb_hash = lambda: meta.get('subdb_hash', '')

def restore():
self.core.kodi.xbmc.getInfoLabel = default
self.core.kodi.xbmc.Player().getPlayingFile = default_
self.core.kodi.xbmcvfs.File.size = default__
self.core.kodi.xbmcvfs.File.hash = default___
self.core.kodi.xbmcvfs.File.subdb_hash = default____
return restore

def mock_settings(self, settings):
Expand Down
1 change: 0 additions & 1 deletion a4kSubtitles/lib/kodi_mock.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,5 @@ def __File(_):
return __File
__File.size = lambda: 0
__File.hash = lambda: 0
__File.subdb_hash = lambda: 0
__File.close = lambda: None
xbmcvfs.File = __File
19 changes: 15 additions & 4 deletions a4kSubtitles/lib/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def __retry_on_503(core, request, response, retry=True):
if not retry:
return None

if response.status_code == 503:
core.time.sleep(2)
request['validate'] = lambda response: __retry_on_503(core, request, response, retry=False)
return request

def execute(core, request, progress=True):
try: default_timeout = get_int_setting('general.timeout')
except: default_timeout = 10
Expand All @@ -20,6 +29,9 @@ def execute(core, request, progress=True):
validate = request.pop('validate', None)
next = request.pop('next', None)

if not validate:
validate = lambda response: __retry_on_503(core, request, response)

if next:
request.pop('stream', None)

Expand All @@ -33,10 +45,9 @@ def execute(core, request, progress=True):
response.status_code = 500
logger.debug('%s $ - %s - %s' % (request['method'], request['url'], response.status_code))

if validate:
alt_request = validate(response)
if alt_request:
return execute(core, alt_request)
alt_request = validate(response)
if alt_request:
return execute(core, alt_request)

if next and response.status_code == 200:
next_request = next(response)
Expand Down
127 changes: 109 additions & 18 deletions a4kSubtitles/lib/video.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,23 +51,6 @@ def __set_size_and_hash(core, meta, filepath):
finally:
f.close()

def __set_subdb_hash(meta, filepath):
f = xbmcvfs.File(filepath)
try:
# used for mocking
try:
meta.subdb_hash = f.subdb_hash()
return
except: pass

data = f.read(__64k)
f.seek(-__64k, os.SEEK_END)
data += f.read(__64k)

meta.subdb_hash = hashlib.md5(data).hexdigest()
finally:
f.close()

def __get_filename(title):
filename = title
video_exts = ['mkv', 'mp4', 'avi', 'mov', 'mpeg', 'flv', 'wmv']
Expand Down Expand Up @@ -189,6 +172,112 @@ def filter_tvshow_results(result):
meta.imdb_id = result['id']
return

def __update_info_from_imdb(core, meta):
request = {
'method': 'POST',
'url': 'https://graphql.imdb.com',
'data': core.json.dumps({
'query': '''
query TitlesList($idArray: [ID!]!) {
titles(ids: $idArray) {
id
titleText {
text
}
releaseDate {
year
}
series {
series {
id,
titleText {
text
}
releaseDate {
year
}
}
episodeNumber {
episodeNumber
seasonNumber
}
}
episodes {
...TMD_Episodes_EpisodesCardContainer
}
}
}
fragment TMD_Episodes_EpisodesCardContainer on Episodes {
result: episodes(first: 99999) {
edges {
node {
...TMD_Episodes_EpisodeCard
}
}
}
}
fragment TMD_Episodes_EpisodeCard on Title {
id
titleText {
text
}
releaseDate {
year
}
series {
episodeNumber {
episodeNumber
seasonNumber
}
}
}
''',
'operationName': 'TitlesList',
'variables': {
'idArray': [meta.imdb_id]
},
}),
'headers': {
'content-type': 'application/json',
},
'timeout': 10
}

response = core.request.execute(core, request)
if response.status_code != 200:
return

try:
result = json.loads(response.text)
result = result['data']['titles'][0]

if result['episodes'] is None:
meta.title = result['titleText']['text']
meta.year = str(result['releaseDate']['year'])
if result['series'] is not None:
meta.tvshow = result['series']['series']['titleText']['text']
meta.tvshow_year = str(result['series']['series']['releaseDate']['year'])
meta.season = str(result['series']['episodeNumber']['seasonNumber'])
meta.episode = str(result['series']['episodeNumber']['episodeNumber'])
else:
meta.tvshow = result['titleText']['text']
meta.tvshow_year = str(result['releaseDate']['year'])

episodes = result['episodes']['result']['edges']
s_number = int(meta.season)
ep_number = int(meta.episode)
for episode in episodes:
ep = episode['node']
series = ep['series']['episodeNumber']
if series['episodeNumber'] == ep_number and series['seasonNumber'] == s_number:
meta.title = ep['titleText']['text']
meta.year = str(ep['releaseDate']['year'])
meta.imdb_id = ep['id']
except:
return

def __get_basic_info():
meta = utils.DictAsObject({})

Expand Down Expand Up @@ -228,6 +317,9 @@ def get_meta(core):
tvshow_years_cache[meta.imdb_id] = meta.tvshow_year
cache.save_tvshow_years_cache(tvshow_years_cache)

if meta.imdb_id != '':
__update_info_from_imdb(core, meta)

meta_cache = cache.get_meta_cache()
if meta.imdb_id != '' and meta_cache.imdb_id == meta.imdb_id and meta_cache.filename == meta.filename:
meta = meta_cache
Expand All @@ -238,7 +330,6 @@ def get_meta(core):
try:
filepath = xbmc.Player().getPlayingFile()
__set_size_and_hash(core, meta, filepath)
__set_subdb_hash(meta, filepath)
except:
import traceback
traceback.print_exc()
Expand Down
8 changes: 6 additions & 2 deletions addon.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="service.subtitles.a4ksubtitles"
name="a4kSubtitles"
version="1.8.0"
version="2.0.0"
provider-name="Unknown">
<requires>
<import addon="script.module.requests"/>
Expand All @@ -13,7 +13,7 @@
<summary lang="en">a4kSubtitles - Multi-Source Subtitles Addon</summary>
<description>
Multi-source subtitles addon optimized for Seren.
Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed
Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, Subscene, Addic7ed
</description>
<platform>all</platform>
<reuselanguageinvoker>true</reuselanguageinvoker>
Expand All @@ -27,6 +27,10 @@ Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed
<screenshot>screenshot-03.png</screenshot>
</assets>
<news>
[v2.0.0]:
* Use IMDb as main source for all meta.
* Retry on 503 (Service Unavailable). OpenSubtitles and Subscene seems to return it occasionally.

[v1.8.0]:
* Remove SubDb (Site is down)
* Make lib vfs optional since there are fallbacks and it is used as last case scenario. Thus making the addon installable on platforms which are not supported by lib vfs.
Expand Down
8 changes: 6 additions & 2 deletions packages/addons.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<addons>
<addon id="service.subtitles.a4ksubtitles"
name="a4kSubtitles"
version="1.8.0"
version="2.0.0"
provider-name="Unknown">
<requires>
<import addon="script.module.requests"/>
Expand All @@ -16,7 +16,7 @@
<summary lang="en">a4kSubtitles - Multi-Source Subtitles Addon</summary>
<description>
Multi-source subtitles addon optimized for Seren.
Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed
Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, Subscene, Addic7ed
</description>
<platform>all</platform>
<reuselanguageinvoker>true</reuselanguageinvoker>
Expand All @@ -30,6 +30,10 @@ Supports: OpenSubtitles, BSPlayer, Podnadpisi.NET, SubDB, Subscene, Addic7ed
<screenshot>screenshot-03.png</screenshot>
</assets>
<news>
[v2.0.0]:
* Use IMDb as main source for all meta.
* Retry on 503 (Service Unavailable). OpenSubtitles and Subscene seems to return it occasionally.

[v1.8.0]:
* Remove SubDb (Site is down)
* Make lib vfs optional since there are fallbacks and it is used as last case scenario. Thus making the addon installable on platforms which are not supported by lib vfs.
Expand Down
2 changes: 1 addition & 1 deletion packages/addons.xml.crc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bde01dcf6a9f3cc4714b9b86735740ce03d7ec73
a720a2682dce0e0aaa430feb0ebfaf1af0bf4d32
Loading

0 comments on commit 9fe12cf

Please sign in to comment.