def userdata(self, item, e_item): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar Make sure there's no other bookmarks created by widget. Create additional entry for widgets. This is only required for plugin/episode. ''' server_data = self.server.auth.get_server_info(self.server.auth.server_id) server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) API = api.API(item, server_address) obj = self.objects.map(item, 'EpisodeUserData') try: obj['KodiId'] = e_item[0] obj['FileId'] = e_item[1] obj['Media'] = e_item[4] except TypeError: return if obj['Media'] == "tvshow": if obj['Favorite']: self.get_tag(*values(obj, QU.get_tag_episode_obj)) else: self.remove_tag(*values(obj, QU.delete_tag_episode_obj)) elif obj['Media'] == "episode": obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) if obj['DatePlayed']: obj['DatePlayed'] = Local(obj['DatePlayed']).split('.')[0].replace('T', " ") if obj['DateAdded']: obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace('T', " ") self.add_playstate(*values(obj, QU.add_bookmark_obj)) if not self.direct_path and not obj['Resume']: temp_obj = dict(obj) temp_obj['Filename'] = self.get_filename(*values(temp_obj, QU.get_file_obj)) temp_obj['Path'] = "plugin://plugin.video.jellyfin/" self.remove_file(*values(temp_obj, QU.delete_file_obj)) elif not self.direct_path and obj['Resume']: temp_obj = dict(obj) temp_obj['Filename'] = self.get_filename(*values(temp_obj, QU.get_file_obj)) temp_obj['PathId'] = self.get_path("plugin://plugin.video.jellyfin/") temp_obj['FileId'] = self.add_file(*values(temp_obj, QU.add_file_obj)) self.update_file(*values(temp_obj, QU.update_file_obj)) self.add_playstate(*values(temp_obj, QU.add_bookmark_obj)) self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj)) LOG.info("USERDATA %s [%s/%s] %s: %s", obj['Media'], obj['FileId'], obj['KodiId'], obj['Id'], obj['Title'])
def userdata(self, item, e_item): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' API = api.API(item, self.server['auth/server-address']) obj = self.objects.map(item, 'MovieUserData') try: obj['MovieId'] = e_item[0] obj['FileId'] = e_item[1] except TypeError: return obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) if obj['DatePlayed']: obj['DatePlayed'] = Local(obj['DatePlayed']).split('.')[0].replace( 'T', " ") if obj['Favorite']: self.get_tag(*values(obj, QU.get_tag_movie_obj)) else: self.remove_tag(*values(obj, QU.delete_tag_movie_obj)) LOG.debug("New resume point %s: %s", obj['Id'], obj['Resume']) self.add_playstate(*values(obj, QU.add_bookmark_obj)) self.jellyfin_db.update_reference( *values(obj, QUEM.update_reference_obj)) LOG.info("USERDATA movie [%s/%s] %s: %s", obj['FileId'], obj['MovieId'], obj['Id'], obj['Title'])
def userdata(self, item, e_item): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' API = api.API(item, self.server['auth/server-address']) obj = self.objects.map(item, 'SongUserData') try: obj['KodiId'] = e_item[0] obj['Media'] = e_item[4] except TypeError: return obj['Rating'] = 0 if obj['Media'] == 'song': if obj['DatePlayed']: obj['DatePlayed'] = Local( obj['DatePlayed']).split('.')[0].replace('T', " ") self.rate_song(*values(obj, QU.update_song_rating_obj)) self.jellyfin_db.update_reference( *values(obj, QUEM.update_reference_obj)) LOG.info("USERDATA %s [%s] %s: %s", obj['Media'], obj['KodiId'], obj['Id'], obj['Title'])
def userdata(self, item, e_item): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' server_data = self.server.auth.get_server_info(self.server.auth.server_id) server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) API = api.API(item, server_address) obj = self.objects.map(item, 'MusicVideoUserData') try: obj['MvideoId'] = e_item[0] obj['FileId'] = e_item[1] except TypeError: return obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) if obj['DatePlayed']: obj['DatePlayed'] = Local(obj['DatePlayed']).split('.')[0].replace('T', " ") if obj['Favorite']: self.get_tag(*values(obj, QU.get_tag_mvideo_obj)) else: self.remove_tag(*values(obj, QU.delete_tag_mvideo_obj)) self.add_playstate(*values(obj, QU.add_bookmark_obj)) self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj)) LOG.info("USERDATA mvideo [%s/%s] %s: %s", obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
def album(self, item, e_item): ''' Update object to kodi. ''' server_address = self.server.auth.get_server_info(self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'Album') update = True try: obj['AlbumId'] = e_item[0] obj['LibraryId'] = e_item[6] obj['LibraryName'] = self.jellyfin_db.get_view_name(obj['LibraryId']) except TypeError: update = False library = self.library or find_library(self.server, item) if not library: # This item doesn't belong to a whitelisted library return obj['AlbumId'] = None obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] LOG.debug("AlbumId %s not found", obj['Id']) else: if self.validate_album(*values(obj, QU.get_album_by_id_obj)) is None: update = False LOG.info("AlbumId %s missing from kodi. repairing the entry.", obj['AlbumId']) obj['Rating'] = 0 obj['LastScraped'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') obj['Genres'] = obj['Genres'] or [] obj['Genre'] = " / ".join(obj['Genres']) obj['Bio'] = API.get_overview(obj['Bio']) obj['Artists'] = " / ".join(obj['Artists'] or []) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'ArtworkMusic'), True) obj['Thumb'] = obj['Artwork']['Primary'] obj['DateAdded'] = item.get('DateCreated') if obj['DateAdded']: obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace('T', " ") if obj['Thumb']: obj['Thumb'] = "<thumb>%s</thumb>" % obj['Thumb'] if update: self.album_update(obj) else: self.album_add(obj) self.artist_link(obj) self.artist_discography(obj) self.update_album(*values(obj, QU.update_album_obj)) self.add_genres(*values(obj, QU.add_genres_obj)) self.artwork.add(obj['Artwork'], obj['AlbumId'], "album") self.item_ids.append(obj['Id'])
def movie(self, item, e_item, library): ''' If item does not exist, entry will be added. If item exists, entry will be updated. ''' server_data = self.server.auth.get_server_info( self.server.auth.server_id) server_address = self.server.auth.get_server_address( server_data, server_data['LastConnectionMode']) API = api.API(item, server_address) obj = self.objects.map(item, 'Movie') update = True try: obj['MovieId'] = e_item[0] obj['FileId'] = e_item[1] obj['PathId'] = e_item[2] except TypeError: update = False LOG.debug("MovieId %s not found", obj['Id']) obj['MovieId'] = self.create_entry() else: if self.get(*values(obj, QU.get_movie_obj)) is None: update = False LOG.info("MovieId %s missing from kodi. repairing the entry.", obj['MovieId']) if not settings('syncRottenTomatoes.bool'): obj['CriticRating'] = None obj['Path'] = API.get_file_path(obj['Path']) obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] obj['Genres'] = obj['Genres'] or [] obj['Studios'] = [ API.validate_studio(studio) for studio in (obj['Studios'] or []) ] obj['People'] = obj['People'] or [] obj['Genre'] = " / ".join(obj['Genres']) obj['Writers'] = " / ".join(obj['Writers'] or []) obj['Directors'] = " / ".join(obj['Directors'] or []) obj['Plot'] = API.get_overview(obj['Plot']) obj['Mpaa'] = API.get_mpaa(obj['Mpaa']) obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['People'] = API.get_people_artwork(obj['People']) obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace( 'T', " ") obj['DatePlayed'] = None if not obj['DatePlayed'] else Local( obj['DatePlayed']).split('.')[0].replace('T', " ") obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) obj['Video'] = API.video_streams(obj['Video'] or [], obj['Container']) obj['Audio'] = API.audio_streams(obj['Audio'] or []) obj['Streams'] = API.media_streams(obj['Video'], obj['Audio'], obj['Subtitles']) self.get_path_filename(obj) self.trailer(obj) if obj['Countries']: self.add_countries(*values(obj, QU.update_country_obj)) tags = [] tags.extend(obj['Tags'] or []) tags.append(obj['LibraryName']) if obj['Favorite']: tags.append('Favorite movies') obj['Tags'] = tags if update: self.movie_update(obj) else: self.movie_add(obj) self.update_path(*values(obj, QU.update_path_movie_obj)) self.update_file(*values(obj, QU.update_file_obj)) self.add_tags(*values(obj, QU.add_tags_movie_obj)) self.add_genres(*values(obj, QU.add_genres_movie_obj)) self.add_studios(*values(obj, QU.add_studios_movie_obj)) self.add_playstate(*values(obj, QU.add_bookmark_obj)) self.add_people(*values(obj, QU.add_people_movie_obj)) self.add_streams(*values(obj, QU.add_streams_obj)) self.artwork.add(obj['Artwork'], obj['MovieId'], "movie") self.item_ids.append(obj['Id']) return not update
def song(self, item, e_item): ''' Update object to kodi. ''' API = api.API(item, self.server['auth/server-address']) obj = self.objects.map(item, 'Song') update = True try: obj['SongId'] = e_item[0] obj['PathId'] = e_item[2] obj['AlbumId'] = e_item[3] except TypeError as error: update = False obj['SongId'] = self.create_entry_song() LOG.debug("SongId %s not found", obj['Id']) else: if self.validate_song(*values(obj, QU.get_song_by_id_obj)) is None: update = False LOG.info("SongId %s missing from kodi. repairing the entry.", obj['SongId']) self.get_song_path_filename(obj, API) obj['Rating'] = 0 obj['Genres'] = obj['Genres'] or [] obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) obj['Runtime'] = (obj['Runtime'] or 0) / 10000000.0 obj['Genre'] = " / ".join(obj['Genres']) obj['Artists'] = " / ".join(obj['Artists'] or []) obj['AlbumArtists'] = obj['AlbumArtists'] or [] obj['Index'] = obj['Index'] or 0 obj['Disc'] = obj['Disc'] or 1 obj['EmbedCover'] = False obj['Comment'] = API.get_overview(obj['Comment']) obj['Artwork'] = API.get_all_artwork( self.objects.map(item, 'ArtworkMusic'), True) if obj['DateAdded']: obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace( 'T', " ") if obj['DatePlayed']: obj['DatePlayed'] = Local(obj['DatePlayed']).split('.')[0].replace( 'T', " ") if obj['Disc'] != 1: obj['Index'] = obj['Disc'] * 2**16 + obj['Index'] if update: self.song_update(obj) else: self.song_add(obj) self.link_song_album(*values(obj, QU.update_song_album_obj)) self.add_role(*values(obj, QU.update_role_obj)) # defaultt role self.song_artist_link(obj) self.song_artist_discography(obj) obj['strAlbumArtists'] = " / ".join(obj['AlbumArtists']) self.get_album_artist(*values(obj, QU.get_album_artist_obj)) self.add_genres(*values(obj, QU.update_genre_song_obj)) self.artwork.add(obj['Artwork'], obj['SongId'], "song") self.item_ids.append(obj['Id']) if obj['SongAlbumId'] is None: self.artwork.add(obj['Artwork'], obj['AlbumId'], "album") return not update
def musicvideo(self, item, e_item, library): ''' If item does not exist, entry will be added. If item exists, entry will be updated. If we don't get the track number from Emby, see if we can infer it from the sortname attribute. ''' API = api.API(item, self.server['auth/server-address']) obj = self.objects.map(item, 'MusicVideo') update = True try: obj['MvideoId'] = e_item[0] obj['FileId'] = e_item[1] obj['PathId'] = e_item[2] except TypeError as error: update = False LOG.debug("MvideoId for %s not found", obj['Id']) obj['MvideoId'] = self.create_entry() else: if self.get(*values(obj, QU.get_musicvideo_obj)) is None: update = False LOG.info("MvideoId %s missing from kodi. repairing the entry.", obj['MvideoId']) obj['Path'] = API.get_file_path(obj['Path']) obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] obj['Genres'] = obj['Genres'] or [] obj['ArtistItems'] = obj['ArtistItems'] or [] obj['Studios'] = [ API.validate_studio(studio) for studio in (obj['Studios'] or []) ] obj['Plot'] = API.get_overview(obj['Plot']) obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace( 'T', " ") obj['DatePlayed'] = None if not obj['DatePlayed'] else Local( obj['DatePlayed']).split('.')[0].replace('T', " ") obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['Premiere'] = Local( obj['Premiere']) if obj['Premiere'] else datetime.date( obj['Year'] or 2021, 1, 1) obj['Genre'] = " / ".join(obj['Genres']) obj['Studio'] = " / ".join(obj['Studios']) obj['Artists'] = " / ".join(obj['Artists'] or []) obj['Directors'] = " / ".join(obj['Directors'] or []) obj['Video'] = API.video_streams(obj['Video'] or [], obj['Container']) obj['Audio'] = API.audio_streams(obj['Audio'] or []) obj['Streams'] = API.media_streams(obj['Video'], obj['Audio'], obj['Subtitles']) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) self.get_path_filename(obj) if obj['Premiere']: obj['Premiere'] = str(obj['Premiere']).split('.')[0].replace( 'T', " ") for artist in obj['ArtistItems']: artist['Type'] = "Artist" obj['People'] = obj['People'] or [] + obj['ArtistItems'] obj['People'] = API.get_people_artwork(obj['People']) if obj['Index'] is None and obj['SortTitle'] is not None: search = re.search(r'^\d+\s?', obj['SortTitle']) if search: obj['Index'] = search.group() tags = [] tags.extend(obj['Tags'] or []) tags.append(obj['LibraryName']) if obj['Favorite']: tags.append('Favorite musicvideos') obj['Tags'] = tags if update: self.musicvideo_update(obj) else: self.musicvideo_add(obj) self.update_path(*values(obj, QU.update_path_mvideo_obj)) self.update_file(*values(obj, QU.update_file_obj)) self.add_tags(*values(obj, QU.add_tags_mvideo_obj)) self.add_genres(*values(obj, QU.add_genres_mvideo_obj)) self.add_studios(*values(obj, QU.add_studios_mvideo_obj)) self.add_playstate(*values(obj, QU.add_bookmark_obj)) self.add_people(*values(obj, QU.add_people_mvideo_obj)) self.add_streams(*values(obj, QU.add_streams_obj)) self.artwork.add(obj['Artwork'], obj['MvideoId'], "musicvideo") self.item_ids.append(obj['Id']) return not update
def tvshow(self, item, e_item, library): ''' If item does not exist, entry will be added. If item exists, entry will be updated. If the show is empty, try to remove it. Process seasons. Apply series pooling. ''' server_address = self.server.auth.get_server_info(self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'Series') update = True try: obj['ShowId'] = e_item[0] obj['PathId'] = e_item[2] except TypeError: update = False LOG.debug("ShowId %s not found", obj['Id']) obj['ShowId'] = self.create_entry() else: if self.get(*values(obj, QU.get_tvshow_obj)) is None: update = False LOG.info("ShowId %s missing from kodi. repairing the entry.", obj['ShowId']) obj['Path'] = API.get_file_path(obj['Path']) obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] obj['Genres'] = obj['Genres'] or [] obj['People'] = obj['People'] or [] obj['Mpaa'] = API.get_mpaa(obj['Mpaa']) obj['Studios'] = [API.validate_studio(studio) for studio in (obj['Studios'] or [])] obj['Genre'] = " / ".join(obj['Genres']) obj['People'] = API.get_people_artwork(obj['People']) obj['Plot'] = API.get_overview(obj['Plot']) obj['Studio'] = " / ".join(obj['Studios']) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) if obj['Status'] != 'Ended': obj['Status'] = None self.get_path_filename(obj) if obj['Premiere']: obj['Premiere'] = str(Local(obj['Premiere'])).split('.')[0].replace('T', " ") tags = [] tags.extend(obj['Tags'] or []) tags.append(obj['LibraryName']) if obj['Favorite']: tags.append('Favorite tvshows') obj['Tags'] = tags if update: self.tvshow_update(obj) else: self.tvshow_add(obj) self.link(*values(obj, QU.update_tvshow_link_obj)) self.update_path(*values(obj, QU.update_path_tvshow_obj)) self.add_tags(*values(obj, QU.add_tags_tvshow_obj)) self.add_people(*values(obj, QU.add_people_tvshow_obj)) self.add_genres(*values(obj, QU.add_genres_tvshow_obj)) self.add_studios(*values(obj, QU.add_studios_tvshow_obj)) self.artwork.add(obj['Artwork'], obj['ShowId'], "tvshow") self.item_ids.append(obj['Id']) season_episodes = {} for season in self.server.jellyfin.get_seasons(obj['Id'])['Items']: if season['SeriesId'] != obj['Id']: obj['SeriesId'] = season['SeriesId'] self.item_ids.append(season['SeriesId']) try: self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0] if self.update_library: season_episodes[season['Id']] = season['SeriesId'] except TypeError: self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_pool_obj)) LOG.info("POOL %s [%s/%s]", obj['Title'], obj['Id'], obj['SeriesId']) season_episodes[season['Id']] = season['SeriesId'] try: self.jellyfin_db.get_item_by_id(season['Id'])[0] self.item_ids.append(season['Id']) except TypeError: self.season(season, obj['ShowId']) else: season_id = self.get_season(*values(obj, QU.get_season_special_obj)) self.artwork.add(obj['Artwork'], season_id, "season") for season in season_episodes: for episodes in server.get_episode_by_season(season_episodes[season], season): for episode in episodes['Items']: self.episode(episode)
def episode(self, item, e_item): ''' If item does not exist, entry will be added. If item exists, entry will be updated. Create additional entry for widgets. This is only required for plugin/episode. ''' server_address = self.server.auth.get_server_info(self.server.auth.server_id)['address'] API = api.API(item, server_address) obj = self.objects.map(item, 'Episode') update = True if obj['Location'] == "Virtual": LOG.info("Skipping virtual episode %s: %s", obj['Title'], obj['Id']) return elif obj['SeriesId'] is None: LOG.info("Skipping episode %s with missing SeriesId", obj['Id']) return try: obj['EpisodeId'] = e_item[0] obj['FileId'] = e_item[1] obj['PathId'] = e_item[2] except TypeError: update = False LOG.debug("EpisodeId %s not found", obj['Id']) obj['EpisodeId'] = self.create_entry_episode() else: if self.get_episode(*values(obj, QU.get_episode_obj)) is None: update = False LOG.info("EpisodeId %s missing from kodi. repairing the entry.", obj['EpisodeId']) obj['Path'] = API.get_file_path(obj['Path']) obj['Index'] = obj['Index'] or -1 obj['Writers'] = " / ".join(obj['Writers'] or []) obj['Directors'] = " / ".join(obj['Directors'] or []) obj['Plot'] = API.get_overview(obj['Plot']) obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0) obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['People'] = API.get_people_artwork(obj['People'] or []) obj['DateAdded'] = Local(obj['DateAdded']).split('.')[0].replace('T', " ") obj['DatePlayed'] = None if not obj['DatePlayed'] else Local(obj['DatePlayed']).split('.')[0].replace('T', " ") obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) obj['Video'] = API.video_streams(obj['Video'] or [], obj['Container']) obj['Audio'] = API.audio_streams(obj['Audio'] or []) obj['Streams'] = API.media_streams(obj['Video'], obj['Audio'], obj['Subtitles']) self.get_episode_path_filename(obj) if obj['Premiere']: obj['Premiere'] = Local(obj['Premiere']).split('.')[0].replace('T', " ") if obj['Season'] is None: if obj['AbsoluteNumber']: obj['Season'] = 1 obj['Index'] = obj['AbsoluteNumber'] else: obj['Season'] = 0 if obj['AirsAfterSeason']: obj['AirsBeforeSeason'] = obj['AirsAfterSeason'] obj['AirsBeforeEpisode'] = 4096 # Kodi default number for afterseason ordering if obj['MultiEpisode']: obj['Title'] = "| %02d | %s" % (obj['MultiEpisode'], obj['Title']) if not self.get_show_id(obj): return False obj['SeasonId'] = self.get_season(*values(obj, QU.get_season_episode_obj)) if update: self.episode_update(obj) else: self.episode_add(obj) self.update_path(*values(obj, QU.update_path_episode_obj)) self.update_file(*values(obj, QU.update_file_obj)) self.add_people(*values(obj, QU.add_people_episode_obj)) self.add_streams(*values(obj, QU.add_streams_obj)) self.add_playstate(*values(obj, QU.add_bookmark_obj)) self.artwork.update(obj['Artwork']['Primary'], obj['EpisodeId'], "episode", "thumb") self.item_ids.append(obj['Id']) if not self.direct_path and obj['Resume']: temp_obj = dict(obj) temp_obj['Path'] = "plugin://plugin.video.jellyfin/" temp_obj['PathId'] = self.get_path(*values(temp_obj, QU.get_path_obj)) temp_obj['FileId'] = self.add_file(*values(temp_obj, QU.add_file_obj)) self.update_file(*values(temp_obj, QU.update_file_obj)) self.add_playstate(*values(temp_obj, QU.add_bookmark_obj)) return not update
def tvshow(self, item, e_item, library, pooling=None, *args, **kwargs): ''' If item does not exist, entry will be added. If item exists, entry will be updated. If the show is empty, try to remove it. Process seasons. Apply series pooling. ''' API = api.API(item, self.server['auth/server-address']) obj = self.objects.map(item, 'Series') obj['Item'] = item obj['Library'] = library obj['LibraryId'] = library['Id'] obj['LibraryName'] = library['Name'] update = True if not settings('syncEmptyShows.bool') and not obj['RecursiveCount']: LOG.info("Skipping empty show %s: %s", obj['Title'], obj['Id']) self.remove(obj['Id']) return False try: obj['ShowId'] = e_item[0] obj['PathId'] = e_item[2] except TypeError as error: if pooling is None: obj['Item']['Id'] = self.server['api'].is_valid_series(obj['LibraryId'], obj['Title'], obj['Id']) if str(obj['Item']['Id']) != obj['Id']: return self.tvshow(obj['Item'], library=obj['Library'], pooling=obj['Id']) update = False LOG.debug("ShowId %s not found", obj['Id']) obj['ShowId'] = self.create_entry() else: if self.get(*values(obj, QU.get_tvshow_obj)) is None: update = False LOG.info("ShowId %s missing from kodi. repairing the entry.", obj['ShowId']) obj['Path'] = API.get_file_path(obj['Path']) obj['Genres'] = obj['Genres'] or [] obj['People'] = obj['People'] or [] obj['Mpaa'] = API.get_mpaa(obj['Mpaa']) obj['Studios'] = [API.validate_studio(studio) for studio in (obj['Studios'] or [])] obj['Genre'] = " / ".join(obj['Genres']) obj['People'] = API.get_people_artwork(obj['People']) obj['Plot'] = API.get_overview(obj['Plot']) obj['Studio'] = " / ".join(obj['Studios']) obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork')) if obj['Status'] != 'Ended': obj['Status'] = None self.get_path_filename(obj) if obj['Premiere']: obj['Premiere'] = str(Local(obj['Premiere'])).split('.')[0].replace('T', " ") tags = [] tags.extend(obj['Tags'] or []) tags.append(obj['LibraryName']) if obj['Favorite']: tags.append('Favorite tvshows') obj['Tags'] = tags if update: self.tvshow_update(obj) else: self.tvshow_add(obj) if pooling: obj['SeriesId'] = pooling LOG.info("POOL %s [%s/%s]", obj['Title'], obj['Id'], obj['SeriesId']) self.emby_db.add_reference(*values(obj, QUEM.add_reference_pool_obj)) return self.link(*values(obj, QU.update_tvshow_link_obj)) self.update_path(*values(obj, QU.update_path_tvshow_obj)) self.add_tags(*values(obj, QU.add_tags_tvshow_obj)) self.add_people(*values(obj, QU.add_people_tvshow_obj)) self.add_genres(*values(obj, QU.add_genres_tvshow_obj)) self.add_studios(*values(obj, QU.add_studios_tvshow_obj)) self.artwork.add(obj['Artwork'], obj['ShowId'], "tvshow") self.item_ids.append(obj['Id']) season_episodes = {} try: all_seasons = self.server['api'].get_seasons(obj['Id'])['Items'] except Exception as error: LOG.error("Unable to pull seasons for %s", obj['Title']) LOG.error(error) return for season in all_seasons: if season['SeriesId'] != obj['Id']: if self.update_library: season_episodes[season['Id']] = season['SeriesId'] try: self.emby_db.get_item_by_id(season['Id'])[0] self.item_ids.append(season['Id']) except TypeError: self.season(season, obj['ShowId']) else: season_id = self.get_season(*values(obj, QU.get_season_special_obj)) self.artwork.add(obj['Artwork'], season_id, "season") for season in season_episodes: for episodes in server.get_episode_by_season(season_episodes[season], season): for episode in episodes['Items']: self.episode(episode)