diff --git a/resources/lib/library_sync/__init__.py b/resources/lib/library_sync/__init__.py index ca1a088a..0ce01a8d 100644 --- a/resources/lib/library_sync/__init__.py +++ b/resources/lib/library_sync/__init__.py @@ -2,7 +2,6 @@ from __future__ import absolute_import, division, unicode_literals from .full_sync import start -from .time import sync_pms_time from .websocket import store_websocket_message, process_websocket_messages, \ WEBSOCKET_MESSAGES, PLAYSTATE_SESSIONS from .common import update_kodi_library, PLAYLIST_SYNC_ENABLED diff --git a/resources/lib/library_sync/time.py b/resources/lib/library_sync/time.py deleted file mode 100644 index 0a237234..00000000 --- a/resources/lib/library_sync/time.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -from __future__ import absolute_import, division, unicode_literals -from logging import getLogger - -from .. import plex_functions as PF, utils, timing, variables as v, app - -LOG = getLogger('PLEX.sync.time') - - -def sync_pms_time(): - """ - PMS does not provide a means to get a server timestamp. This is a work- - around - because the PMS might be in another time zone - - In general, everything saved to Kodi shall be in Kodi time. - - Any info with a PMS timestamp is in Plex time, naturally - """ - LOG.info('Synching time with PMS server') - # Find a PMS item where we can toggle the view state to enforce a - # change in lastViewedAt - - # Get all Plex libraries - sections = PF.get_plex_sections() - if sections is None: - LOG.error("Error download PMS views, abort sync_pms_time") - return False - - plex_id = None - typus = ( - (v.PLEX_TYPE_MOVIE, v.PLEX_TYPE_MOVIE,), - (v.PLEX_TYPE_SHOW, v.PLEX_TYPE_EPISODE), - (v.PLEX_TYPE_ARTIST, v.PLEX_TYPE_SONG) - ) - for section_type, plex_type in typus: - if plex_id: - break - for section in sections: - if plex_id: - break - if not section.attrib['type'] == section_type: - continue - library_id = section.attrib['key'] - try: - iterator = PF.SectionItems(library_id, plex_type=plex_type) - for item in iterator: - if item.get('viewCount'): - # Don't want to mess with items that have playcount>0 - continue - if item.get('viewOffset'): - # Don't mess with items with a resume point - continue - plex_id = utils.cast(int, item.get('ratingKey')) - LOG.info('Found a %s item to sync with: %s', - plex_type, plex_id) - break - except RuntimeError: - pass - if plex_id is None: - LOG.error("Could not find an item to sync time with") - LOG.error("Aborting PMS-Kodi time sync") - return False - - # Get the Plex item's metadata - xml = PF.GetPlexMetadata(plex_id) - if xml in (None, 401): - LOG.error("Could not download metadata, aborting time sync") - return False - - timestamp = xml[0].get('lastViewedAt') - if timestamp is None: - timestamp = xml[0].get('updatedAt') - LOG.debug('Using items updatedAt=%s', timestamp) - if timestamp is None: - timestamp = xml[0].get('addedAt') - LOG.debug('Using items addedAt=%s', timestamp) - if timestamp is None: - timestamp = 0 - LOG.debug('No timestamp; using 0') - timestamp = utils.cast(int, timestamp) - # Set the timer - koditime = timing.unix_timestamp() - # Toggle watched state - PF.scrobble(plex_id, 'watched') - # Let the PMS process this first! - app.APP.monitor.waitForAbort(1) - # Get updated metadata - xml = PF.GetPlexMetadata(plex_id) - # Toggle watched state back - PF.scrobble(plex_id, 'unwatched') - try: - plextime = xml[0].attrib['lastViewedAt'] - except (IndexError, TypeError, AttributeError, KeyError): - LOG.warn('Could not get lastViewedAt - aborting') - return False - - # Calculate time offset Kodi-PMS - timing.KODI_PLEX_TIME_OFFSET = float(koditime) - float(plextime) - utils.settings('kodiplextimeoffset', - value=str(timing.KODI_PLEX_TIME_OFFSET)) - LOG.info("Time offset Koditime - Plextime in seconds: %s", - timing.KODI_PLEX_TIME_OFFSET) - return True diff --git a/resources/lib/service_entry.py b/resources/lib/service_entry.py index e259dec8..e85c5442 100644 --- a/resources/lib/service_entry.py +++ b/resources/lib/service_entry.py @@ -87,8 +87,6 @@ class Service(object): utils.window(prop, clear=True) clientinfo.getDeviceId() - # Init time-offset between Kodi and Plex - timing.KODI_PLEX_TIME_OFFSET = float(utils.settings('kodiplextimeoffset') or 0.0) self.startup_completed = False self.server_has_been_online = True diff --git a/resources/lib/sync.py b/resources/lib/sync.py index 46d53d6d..32f1fcad 100644 --- a/resources/lib/sync.py +++ b/resources/lib/sync.py @@ -137,7 +137,6 @@ class Sync(backgroundthread.KillableThread): playlist_monitor = None initial_sync_done = False last_websocket_processing = 0 - last_time_sync = 0 one_day_in_seconds = 60 * 60 * 24 # Link to Websocket queue queue = app.APP.websocket_queue @@ -171,8 +170,6 @@ class Sync(backgroundthread.KillableThread): return if not install_sync_done: # Very FIRST sync ever upon installation or reset of Kodi DB - # Initialize time offset Kodi - PMS - library_sync.sync_pms_time() last_time_sync = timing.unix_timestamp() LOG.info('Initial start-up full sync starting') xbmc.executebuiltin('InhibitIdleShutdown(true)') @@ -227,10 +224,6 @@ class Sync(backgroundthread.KillableThread): not app.APP.is_playing_video): LOG.info('Doing scheduled full library scan') self.start_library_sync() - elif now - last_time_sync > one_day_in_seconds: - LOG.info('Starting daily time sync') - library_sync.sync_pms_time() - last_time_sync = now elif not app.SYNC.background_sync_disabled: # Check back whether we should process something Only do # this once a while (otherwise, potentially many screen diff --git a/resources/lib/timing.py b/resources/lib/timing.py index f0f5b6e7..818a3629 100644 --- a/resources/lib/timing.py +++ b/resources/lib/timing.py @@ -6,9 +6,6 @@ from time import localtime, strftime EPOCH = datetime.utcfromtimestamp(0) -# What's the time offset between the PMS and Kodi? -KODI_PLEX_TIME_OFFSET = 0.0 - def unix_timestamp(seconds_into_the_future=None): """ @@ -37,27 +34,23 @@ def unix_date_to_kodi(unix_kodi_time): def plex_date_to_kodi(plex_timestamp): """ - converts a Unix time stamp (seconds passed sinceJanuary 1 1970) to a - propper, human-readable time stamp used by Kodi + converts a PMS epoch time stamp (seconds passed since January 1 1970, Plex + sends timezone-independent epoch) to a propper, human-readable time stamp + used by Kodi (varies per time-zone!) Output: Y-m-d h:m:s = 2009-04-05 23:16:04 Returns None if plex_timestamp is not valid (e.g. -1)) """ try: - return strftime('%Y-%m-%d %H:%M:%S', - localtime(float(plex_timestamp) + KODI_PLEX_TIME_OFFSET)) + return unix_date_to_kodi(plex_timestamp) except ValueError: # the PMS can return -1 as plex_timestamp - great! - return - - -def kodi_date_to_plex(kodi_timestamp): - return float(kodi_timestamp) - KODI_PLEX_TIME_OFFSET + pass def plex_now(): - return kodi_date_to_plex(unix_timestamp()) + return unix_timestamp() def kodi_timestamp(plex_timestamp): diff --git a/resources/settings.xml b/resources/settings.xml index 68406395..c5c70565 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -82,7 +82,6 @@ -