def update_on_provider(handle, _): # retrieve the media import media_import = xbmcmediaimport.getImport(handle) if not media_import: log("cannot retrieve media import", xbmc.LOGERROR) return # retrieve the media provider media_provider = media_import.getProvider() if not media_provider: log("cannot retrieve media provider", xbmc.LOGERROR) return # prepare and get the media import settings import_settings = media_import.prepareSettings() if not import_settings: log("cannot prepare media import settings", xbmc.LOGERROR) return # prepare the media provider settings if not media_provider.prepareSettings(): log("cannot prepare media provider settings", xbmc.LOGERROR) return # get the updated item item = xbmcmediaimport.getUpdatedItem(handle) if not item: log("cannot retrieve updated item", xbmc.LOGERROR) return log(f'updating "{item.getLabel()}" ({item.getPath()}) on {provider2str(media_provider)}...' ) video_info_tag = item.getVideoInfoTag() if not video_info_tag: log("updated item is not a video item", xbmc.LOGERROR) return # TODO(stub): update playback related metadata (playcount, last played, resume point) xbmcmediaimport.finishUpdate_on_provider(handle)
def updateOnProvider(handle, options): # retrieve the media import mediaImport = xbmcmediaimport.getImport(handle) if not mediaImport: log('cannot retrieve media import', xbmc.LOGERROR) return # retrieve the media provider mediaProvider = mediaImport.getProvider() if not mediaProvider: log('cannot retrieve media provider', xbmc.LOGERROR) return # prepare and get the media import settings importSettings = mediaImport.prepareSettings() if not importSettings: log('cannot prepare media import settings', xbmc.LOGERROR) return item = xbmcmediaimport.getUpdatedItem(handle) if not item: log('cannot retrieve updated item', xbmc.LOGERROR) return log('updating "{}" ({}) on {}...'.format(item.getLabel(), item.getPath(), mediaProvider2str(mediaProvider))) itemVideoInfoTag = item.getVideoInfoTag() if not itemVideoInfoTag: log('updated item is not a video item', xbmc.LOGERROR) return # determine the item's identifier itemId = kodi.Api.getEmbyItemIdFromVideoInfoTag(itemVideoInfoTag) if not itemId: log('cannot determine the identifier of the updated item: "{}"'.format(itemVideoInfoTag.getPath()), xbmc.LOGERROR) return # prepare the media provider settings if not mediaProvider.prepareSettings(): log('cannot prepare media provider settings', xbmc.LOGERROR) return # create an Emby server instance embyServer = Server(mediaProvider) if not embyServer.Authenticate(): log('failed to authenticate on media provider {}'.format(mediaProvider2str(mediaProvider)), xbmc.LOGERROR) return # retrieve all details of the item itemObj = Library.GetItem(embyServer, itemId) if not itemObj: log('cannot retrieve details of updated item with id {}'.format(itemId), xbmc.LOGERROR) return if not emby.constants.PROPERTY_ITEM_USER_DATA in itemObj: log('cannot update item with id {} because it has no userdata'.format(itemId), xbmc.LOGERROR) return updateItemPlayed = False updatePlaybackPosition = False # retrieve playback states from the updated item playcount = itemVideoInfoTag.getPlayCount() watched = playcount > 0 lastPlayed = itemVideoInfoTag.getLastPlayed() # retrieve playback position from the updated item playbackPositionInSeconds = max(0.0, float(item.getProperty('resumetime'))) playbackPositionInTicks = kodi.Api.secondsToTicks(playbackPositionInSeconds) userDataObj = itemObj[emby.constants.PROPERTY_ITEM_USER_DATA] # check and update playcout if necessary if emby.constants.PROPERTY_ITEM_USER_DATA_PLAY_COUNT in userDataObj: # retrieve playcount from the original item itemPlayed = userDataObj[emby.constants.PROPERTY_ITEM_USER_DATA_PLAY_COUNT] > 0 if watched != itemPlayed: updateItemPlayed = True # check and update playback position if necessary if emby.constants.PROPERTY_ITEM_USER_DATA_PLAYBACK_POSITION_TICKS in userDataObj: # retrieve playback position from the original item itemPlaybackPositionInTicks = userDataObj[emby.constants.PROPERTY_ITEM_USER_DATA_PLAYBACK_POSITION_TICKS] if playbackPositionInTicks != itemPlaybackPositionInTicks: updatePlaybackPosition = True # nothing to do if no playback related properties have been changed if not updateItemPlayed and not updatePlaybackPosition: log('no playback related properties of "{}" ({}) have changed => nothing to update on {}'.format(item.getLabel(), item.getPath(), mediaProvider2str(mediaProvider))) return log('updating playback related properties of "{}" ({}) on {}...'.format(item.getLabel(), item.getPath(), mediaProvider2str(mediaProvider))) if not UserData.Update(embyServer, itemId, updateItemPlayed, updatePlaybackPosition, watched, playcount, lastPlayed, playbackPositionInTicks): log('updating playback related properties of "{}" ({}) on {} failed'.format(item.getLabel(), item.getPath(), mediaProvider2str(mediaProvider)), xbmc.LOGERROR) xbmcmediaimport.finishUpdateOnProvider(handle)
def updateOnProvider(handle, options): # retrieve the media import mediaImport = xbmcmediaimport.getImport(handle) if not mediaImport: log('cannot retrieve media import', xbmc.LOGERROR) return # retrieve the media provider mediaProvider = mediaImport.getProvider() if not mediaProvider: log('cannot retrieve media provider', xbmc.LOGERROR) return # prepare the media provider settings if not mediaProvider.prepareSettings(): log('cannot prepare media provider settings', xbmc.LOGERROR) return # prepare and get the media import settings importSettings = mediaImport.prepareSettings() if not importSettings: log('cannot prepare media import settings', xbmc.LOGERROR) return item = xbmcmediaimport.getUpdatedItem(handle) if not item: log('cannot retrieve updated item', xbmc.LOGERROR) return itemVideoInfoTag = item.getVideoInfoTag() if not itemVideoInfoTag: log('updated item is not a video item', xbmc.LOGERROR) return # determine the item's identifier / ratingKey itemId = Api.getItemIdFromListItem(item) if not itemId: log('cannot determine the identifier of the updated item: {}'.format(itemVideoInfoTag.getPath()), xbmc.LOGERROR) return # create a Plex server instance server = Server(mediaProvider) if not server.Authenticate(): log('failed to connect to Plex Media Server for {}'.format(mediaProvider2str(mediaProvider)), xbmc.LOGWARNING) return plexItem = Api.getPlexItemDetails(server.PlexServer(), itemId, Api.getPlexMediaClassFromMediaType(itemVideoInfoTag.getMediaType())) if not plexItem: log('cannot retrieve details of updated item {} with id {}'.format(itemVideoInfoTag.getPath(), itemId), xbmc.LOGERROR) return # check / update watched state playcount = itemVideoInfoTag.getPlayCount() watched = playcount > 0 if watched != plexItem.isWatched: if watched: plexItem.markWatched() else: plexItem.markUnwatched() # TODO(Montellese): check / update last played # TODO(Montellese): check / update resume point xbmcmediaimport.finishUpdateOnProvider(handle)
def updateOnProvider(handle: int, _options: dict): """Perform update/export of library items from Kodi into conifigured PMS (watch status, resume points, etc.) :param handle: Handle id from input :type handle: int :param _options: Options/parameters passed in with the call, Unused :type _options: dict """ # retrieve the media import mediaImport = xbmcmediaimport.getImport(handle) if not mediaImport: log("cannot retrieve media import", xbmc.LOGERROR) return # retrieve the media provider mediaProvider = mediaImport.getProvider() if not mediaProvider: log("cannot retrieve media provider", xbmc.LOGERROR) return # prepare the media provider settings if not mediaProvider.prepareSettings(): log("cannot prepare media provider settings", xbmc.LOGERROR) return # prepare and get the media import settings importSettings = mediaImport.prepareSettings() if not importSettings: log("cannot prepare media import settings", xbmc.LOGERROR) return item = xbmcmediaimport.getUpdatedItem(handle) if not item: log("cannot retrieve updated item", xbmc.LOGERROR) return itemVideoInfoTag = item.getVideoInfoTag() if not itemVideoInfoTag: log("updated item is not a video item", xbmc.LOGERROR) return # determine the item's identifier / ratingKey itemId = Api.getItemIdFromListItem(item) if not itemId: log( f"cannot determine the identifier of the updated item: {itemVideoInfoTag.getPath()}", xbmc.LOGERROR) return # create a Plex server instance server = Server(mediaProvider) if not server.Authenticate(): log( f"failed to connect to Plex Media Server for {mediaProvider2str(mediaProvider)}", xbmc.LOGWARNING) return plexItem = Api.getPlexItemDetails( server.PlexServer(), itemId, Api.getPlexMediaClassFromMediaType(itemVideoInfoTag.getMediaType())) if not plexItem: log( f"cannot retrieve details of updated item {itemVideoInfoTag.getPath()} with id {itemId}", xbmc.LOGERROR) return # check / update watched state playcount = itemVideoInfoTag.getPlayCount() watched = playcount > 0 if watched != plexItem.isWatched: if watched: plexItem.markWatched() else: plexItem.markUnwatched() # TODO(Montellese): check / update last played # TODO(Montellese): check / update resume point xbmcmediaimport.finishUpdateOnProvider(handle)