From d053e4e01a2603dab091874dbd31ddfee2d09a2a Mon Sep 17 00:00:00 2001 From: Cornishman Date: Wed, 8 Dec 2021 11:55:59 +0000 Subject: [PATCH 1/4] Updated scrobbler to handle multiple external ID identifiers --- .../Shared/plex/objects/library/extra/guid.py | 9 ++++++++- .../plex/objects/library/metadata/episode.py | 2 +- .../plex/objects/library/metadata/movie.py | 2 +- .../plex/objects/library/metadata/season.py | 2 +- .../plex/objects/library/metadata/show.py | 2 +- .../plugin/scrobbler/methods/core/base.py | 19 +++++++++++++------ 6 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/extra/guid.py b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/extra/guid.py index 46275bd47..4a54de292 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/extra/guid.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/extra/guid.py @@ -6,4 +6,11 @@ class Guid(Descriptor): @classmethod def from_node(cls, client, node): - return cls.construct(client, cls.helpers.find(node, 'Guid'), child=True) + items = [] + + for guid in cls.helpers.findall(node, 'Guid'): + _, obj = Guid.construct(client, guid, child=True) + + items.append(obj) + + return [], items diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/episode.py b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/episode.py index bdc414db5..866b5b975 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/episode.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/episode.py @@ -18,7 +18,7 @@ class Episode(Video, Metadata, PlaylistItemMixin, RateMixin, ScrobbleMixin): @property def guid(self): try: - return self.guids.id + return self.guids[0].id except: return self.agent_guid diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/movie.py b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/movie.py index 688efa6ed..42b5f8e67 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/movie.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/movie.py @@ -20,7 +20,7 @@ class Movie(Video, Metadata, PlaylistItemMixin, RateMixin, ScrobbleMixin): @property def guid(self): try: - return self.guids.id + return self.guids[0].id except: return self.agent_guid diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/season.py b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/season.py index 9d663fa7e..ebc414c28 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/season.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/season.py @@ -18,7 +18,7 @@ class Season(Directory, Metadata, RateMixin): @property def guid(self): try: - return self.guids.id + return self.guids[0].id except: return self.agent_guid diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/show.py b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/show.py index 768a3bdfa..be7449c3a 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/show.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plex/objects/library/metadata/show.py @@ -15,7 +15,7 @@ class Show(Directory, Metadata, RateMixin): @property def guid(self): try: - return self.guids.id + return self.guids[0].id except: return self.agent_guid diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py b/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py index 6e0d09a9e..0e84167ff 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py @@ -81,7 +81,7 @@ def build_request(cls, session, part=None, rating_key=None, view_offset=None): @classmethod def build_episode(cls, episode, guid, part): # Retrieve show identifier - ids = Identifier.get_ids(guid, strict=False) + ids = Identifier.get_ids(episode.guids, strict=False) if not ids: # Try map episode to a supported service (with OEM) @@ -97,7 +97,15 @@ def build_episode(cls, episode, guid, part): # Retrieve episode number season_num, episodes = ModuleManager['matcher'].process(episode) - + + # If matching only a single episode, scrobble it with just id's + if len(episodes) == 1: + return { + 'episode': { + 'ids': ids + } + } + if len(episodes) > 0 and part - 1 < len(episodes): episode_num = episodes[part - 1] elif len(episodes) > 0: @@ -116,20 +124,19 @@ def build_episode(cls, episode, guid, part): 'show': { 'title': episode.show.title, 'year': episode.year, - - 'ids': ids }, 'episode': { 'title': episode.title, 'season': season_num, - 'number': episode_num + 'number': episode_num, + 'ids': ids } } @staticmethod def build_movie(movie, guid, part): - ids = Identifier.get_ids(guid, strict=False) + ids = Identifier.get_ids(movie.guids, strict=False) if not ids: # Try map episode to a supported service (with OEM) From 047a79f712ceac14a3dd305a90cb1b331fadd5de Mon Sep 17 00:00:00 2001 From: Cornishman Date: Wed, 8 Dec 2021 17:01:40 +0000 Subject: [PATCH 2/4] removed sending episode id's on fallback to old method to scrobble to try and resolve multi-part scrobbling issues --- .../Libraries/Shared/plugin/scrobbler/methods/core/base.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py b/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py index 0e84167ff..f679140be 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py @@ -129,8 +129,7 @@ def build_episode(cls, episode, guid, part): 'title': episode.title, 'season': season_num, - 'number': episode_num, - 'ids': ids + 'number': episode_num } } From e122e59b2a89f0815dd5b53d19f1db87c245755d Mon Sep 17 00:00:00 2001 From: Cornishman Date: Wed, 8 Dec 2021 20:00:24 +0000 Subject: [PATCH 3/4] fetch show metadata when building episode scrobble request so that we can include the show id's and the correct year --- .../plugin/scrobbler/methods/core/base.py | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py b/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py index f679140be..dc6a65c06 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plugin/scrobbler/methods/core/base.py @@ -97,15 +97,7 @@ def build_episode(cls, episode, guid, part): # Retrieve episode number season_num, episodes = ModuleManager['matcher'].process(episode) - - # If matching only a single episode, scrobble it with just id's - if len(episodes) == 1: - return { - 'episode': { - 'ids': ids - } - } - + if len(episodes) > 0 and part - 1 < len(episodes): episode_num = episodes[part - 1] elif len(episodes) > 0: @@ -115,16 +107,22 @@ def build_episode(cls, episode, guid, part): log.warn('Matcher didn\'t return a valid result - season_num: %r, episodes: %r', season_num, episodes) episode_num = episode.index - # Process guid episode identifier overrides - if guid.season is not None: - season_num = guid.season + # Get the show metadata + if episode.show: + show_metadata = Metadata.get(episode.show.rating_key) + show_ids = Identifier.get_ids(show_metadata.guids, strict=False) + + if show_metadata: + show = { + 'title': show_metadata.title, + 'year': show_metadata.year, + + 'ids': show_ids + } # Build request return { - 'show': { - 'title': episode.show.title, - 'year': episode.year, - }, + 'show': show, 'episode': { 'title': episode.title, From 5ef97f54ab049518b6c40924a7eb26d9584332af Mon Sep 17 00:00:00 2001 From: Cornishman Date: Sat, 18 Dec 2021 16:08:56 +0000 Subject: [PATCH 4/4] Correcting an oversight --- .../Shared/plugin/core/identifier.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Trakttv.bundle/Contents/Libraries/Shared/plugin/core/identifier.py b/Trakttv.bundle/Contents/Libraries/Shared/plugin/core/identifier.py index ecc75a3fa..e6cba5d60 100644 --- a/Trakttv.bundle/Contents/Libraries/Shared/plugin/core/identifier.py +++ b/Trakttv.bundle/Contents/Libraries/Shared/plugin/core/identifier.py @@ -9,19 +9,20 @@ class Identifier(object): @classmethod - def get_ids(cls, guid, strict=True): + def get_ids(cls, guids, strict=True): ids = {} - if not guid: + if not guids: return ids - if type(guid) is str: - # Parse raw guid - guid = Guid.parse(guid, strict=strict) + for guid in guids: + if type(guid.id) is str: + # Parse raw guid + guid = Guid.parse(guid.id, strict=strict) - if guid and guid.valid and guid.service in GUID_SERVICES: - ids[guid.service] = guid.id - elif strict: - return None + if guid and guid.valid and guid.service in GUID_SERVICES: + ids[guid.service] = guid.id + elif strict: + return None return ids