Skip to content

Commit

Permalink
add aggregate cast crew options - #769
Browse files Browse the repository at this point in the history
  • Loading branch information
jurialmunkey committed Jun 16, 2022
1 parent 08a3068 commit ba9bbc7
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 8 deletions.
2 changes: 1 addition & 1 deletion addon.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon id="plugin.video.themoviedb.helper"
version="4.8.13"
version="4.8.15"
name="TheMovieDb Helper"
provider-name="jurialmunkey">
<requires>
Expand Down
16 changes: 13 additions & 3 deletions resources/lib/api/tmdb/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,15 +368,19 @@ def get_episode_list(self, tmdb_id, season):
for i in request.get('episodes', [])]
return items

def get_cast_list(self, tmdb_id, tmdb_type, season=None, episode=None, keys=['cast', 'guest_stars']):
def get_cast_list(self, tmdb_id, tmdb_type, season=None, episode=None, keys=['cast', 'guest_stars'], aggregate=False):
""" Get cast list
endpoint switch to aggregate_credits for full tv series cast
"""
items = []
if season is not None and episode is not None:
affix = f'season/{season}/episode/{episode}'
elif season is not None:
affix = f'season/{season}'
else:
affix = None
response = self.get_request_lc(tmdb_type, tmdb_id, affix, 'credits')
endpoint = 'aggregate_credits' if aggregate and tmdb_type == 'tv' and affix is None else 'credits'
response = self.get_request_lc(tmdb_type, tmdb_id, affix, endpoint)
if not response:
return []

Expand All @@ -387,7 +391,11 @@ def get_cast_list(self, tmdb_id, tmdb_type, season=None, episode=None, keys=['ca

# Add items
item_ids = []
for i in sorted(cast_list, key=lambda k: k.get('order', 1000)):
if endpoint == 'aggregate_credits':
cast_list_sorted = sorted(cast_list, key=lambda k: k.get('roles', [{}])[0].get('episode_count', 0), reverse=True)
else:
cast_list_sorted = sorted(cast_list, key=lambda k: k.get('order', 1000))
for i in cast_list_sorted:
if not i.get('id'):
continue
# Avoid re-adding people that have multiple roles listed
Expand All @@ -405,6 +413,8 @@ def get_cast_list(self, tmdb_id, tmdb_type, season=None, episode=None, keys=['ca
p[k] = v
elif p[k] != v:
p[k] = f'{p[k]} / {v}'
for i in items:
i['label2'] = i['infoproperties'].get('role')
return items

@lazyimport_modules(globals(), (
Expand Down
8 changes: 4 additions & 4 deletions resources/lib/api/tmdb/lists.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,16 +83,16 @@ def get_items(self, tmdb_type, page=None, **kwargs):


class ListCast(Container):
def get_items(self, tmdb_id, tmdb_type, season=None, episode=None, **kwargs):
items = self.tmdb_api.get_cast_list(tmdb_id, tmdb_type, season=season, episode=episode)
def get_items(self, tmdb_id, tmdb_type, season=None, episode=None, aggregate=False, **kwargs):
items = self.tmdb_api.get_cast_list(tmdb_id, tmdb_type, season=season, episode=episode, aggregate=aggregate)
self.tmdb_cache_only = True
self.container_content = convert_type('person', 'container')
return items


class ListCrew(Container):
def get_items(self, tmdb_id, tmdb_type, season=None, episode=None, **kwargs):
items = self.tmdb_api.get_cast_list(tmdb_id, tmdb_type, season=season, episode=episode, keys=['crew'])
def get_items(self, tmdb_id, tmdb_type, season=None, episode=None, aggregate=False, **kwargs):
items = self.tmdb_api.get_cast_list(tmdb_id, tmdb_type, season=season, episode=episode, keys=['crew'], aggregate=aggregate)
self.tmdb_cache_only = True
self.container_content = convert_type('person', 'container')
return items
Expand Down
23 changes: 23 additions & 0 deletions resources/lib/api/tmdb/mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,19 @@ def get_external_ids(v):
return unique_ids


def get_roles(v, key='character'):
infoproperties = {}
for x, i in enumerate(sorted(v, key=lambda d: d.get('episode_count', 0)), start=1):
infoproperties[f'{key}.{x}.name'] = i.get(key)
infoproperties[f'{key}.{x}.episodes'] = i.get('episode_count')
infoproperties[f'{key}.{x}.id'] = i.get('credit_id')
else:
name = infoproperties[f'{key}.1.name']
episodes = infoproperties[f'{key}.1.episodes']
infoproperties[key] = infoproperties['role'] = f"{name} ({episodes})"
return infoproperties


def get_extra_art(v):
""" Get additional artwork types from artwork list
Fanart with language is treated as landscape because it will have text
Expand Down Expand Up @@ -464,6 +477,16 @@ def __init__(self, language=None, mpaa_prefix=None):
'keys': [('infoproperties', 'known_for')],
'func': lambda v: ' / '.join([x['title'] for x in v or [] if x.get('title')])
}],
'roles': [{
'keys': [('infoproperties', UPDATE_BASEKEY)],
'func': get_roles,
'kwargs': {'key': 'character'}
}],
'jobs': [{
'keys': [('infoproperties', UPDATE_BASEKEY)],
'func': get_roles,
'kwargs': {'key': 'job'}
}],
'external_ids': [{
'keys': [('unique_ids', UPDATE_BASEKEY)],
'func': get_external_ids
Expand Down

0 comments on commit ba9bbc7

Please sign in to comment.