From fc7b396e452682d501128fa9c46221c25d8e7a49 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Fri, 27 Jan 2017 20:50:46 -0800 Subject: [PATCH] Log recently added items to the database * Temporarily disable recently added upgrade notifications --- data/interfaces/default/info.html | 17 +++---- data/interfaces/default/settings.html | 2 +- plexpy/__init__.py | 8 ++++ plexpy/activity_handler.py | 69 +++++++++++++++++---------- plexpy/datafactory.py | 60 +++++++++++++++++++---- plexpy/libraries.py | 33 +++++++------ plexpy/notification_handler.py | 29 ++++++----- plexpy/pmsconnect.py | 43 +++++++++-------- plexpy/webserve.py | 2 +- 9 files changed, 173 insertions(+), 90 deletions(-) diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index 9a0de9ad..f1825441 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -68,6 +68,7 @@ DOCUMENTATION :: END <%def name="body()"> % if data: +<% media_info = data['media_info'][0] if data['media_info'] else {} %>
@@ -187,17 +188,17 @@ DOCUMENTATION :: END % endif % if data['media_type'] in ('movie', 'episode', 'track'):
- % if data['media_type'] != 'track' and data['video_codec']: - + % if data['media_type'] != 'track' and media_info['video_codec']: + % endif - % if data['media_type'] != 'track' and data['video_resolution']: - + % if data['media_type'] != 'track' and media_info['video_resolution']: + % endif - % if data['audio_codec']: - + % if media_info['audio_codec']: + % endif - % if data['audio_channels']: - + % if media_info['audio_channels']: + % endif
% endif diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 82ab8146..8cb22f14 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -1013,7 +1013,7 @@

Enable to send another recently added notification when adding a new version of existing media.
diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 58b2661b..f50284a9 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -526,6 +526,14 @@ def dbcheck(): 'rating_key INTEGER, poster_title TEXT, poster_url TEXT)' ) + # recently_added table :: This table keeps record of recently added items + c_db.execute( + 'CREATE TABLE IF NOT EXISTS recently_added (id INTEGER PRIMARY KEY AUTOINCREMENT, ' + 'added_at INTEGER, pms_identifier TEXT, section_id INTEGER, ' + 'rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, media_type TEXT, ' + 'media_info TEXT)' + ) + # Upgrade sessions table from earlier versions try: c_db.execute('SELECT started FROM sessions') diff --git a/plexpy/activity_handler.py b/plexpy/activity_handler.py index e4b62a1f..9668b7ea 100644 --- a/plexpy/activity_handler.py +++ b/plexpy/activity_handler.py @@ -268,9 +268,29 @@ class TimelineHandler(object): metadata = pms_connect.get_metadata_details(rating_key) if metadata: - data = {'timeline_data': metadata, 'notify_action': 'on_created'} - data.update(kwargs) - plexpy.NOTIFY_QUEUE.put(data) + notify = True + + if 'child_keys' not in kwargs: + data_factory = datafactory.DataFactory() + + if data_factory.get_recently_added_item(rating_key): + logger.debug(u"PlexPy TimelineHandler :: Library item %s added already. Not notifying again." % str(rating_key)) + notify = False + + if notify: + data = {'timeline_data': metadata, 'notify_action': 'on_created'} + data.update(kwargs) + plexpy.NOTIFY_QUEUE.put(data) + + all_keys = [rating_key] + if 'child_keys' in kwargs: + all_keys.extend(kwargs['child_keys']) + + for key in all_keys: + data_factory.set_recently_added_item(key) + + logger.debug(u"Added %s items to the recently_added database table." % str(len(all_keys))) + else: logger.error(u"PlexPy TimelineHandler :: Unable to retrieve metadata for rating_key %s" \ % str(rating_key)) @@ -300,9 +320,9 @@ class TimelineHandler(object): # Add a new media item to the recently added queue if media_type and section_id > 0 and \ - ((state_type == 0 and metadata_state == 'created') or \ - (plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and state_type in (1, 5) and \ - media_state == 'analyzing' and queue_size is None)): + ((state_type == 0 and metadata_state == 'created')): # or \ + #(plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and state_type in (1, 5) and \ + #media_state == 'analyzing' and queue_size is None)): if media_type in ('episode', 'track'): metadata = self.get_metadata() @@ -373,34 +393,35 @@ class TimelineHandler(object): self.on_created(rating_key) # Remove all keys - self.del_keys(rating_key) + del_keys(rating_key) # An episode or track is done processing (upgrade only) - elif plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and \ - media_type in ('episode', 'track') and section_id > 0 and \ - state_type == 5 and metadata_state is None and queue_size is None and \ - rating_key in RECENTLY_ADDED_QUEUE: + #elif plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and \ + # media_type in ('episode', 'track') and section_id > 0 and \ + # state_type == 5 and metadata_state is None and queue_size is None and \ + # rating_key in RECENTLY_ADDED_QUEUE: - logger.debug(u"PlexPy TimelineHandler :: Library item '%s' (%s) done processing metadata (upgrade)." - % (title, str(rating_key))) + # logger.debug(u"PlexPy TimelineHandler :: Library item '%s' (%s) done processing metadata (upgrade)." + # % (title, str(rating_key))) - grandparent_rating_key = RECENTLY_ADDED_QUEUE[rating_key] - self.on_created(rating_key) + # grandparent_rating_key = RECENTLY_ADDED_QUEUE[rating_key] + # self.on_created(rating_key) - # Remove all keys - self.del_keys(grandparent_rating_key) + # # Remove all keys + # del_keys(grandparent_rating_key) # An item was deleted, make sure it is removed from the queue elif state_type == 9 and metadata_state == 'deleted': if rating_key in RECENTLY_ADDED_QUEUE and not RECENTLY_ADDED_QUEUE[rating_key]: logger.debug(u"PlexPy TimelineHandler :: Library item %s removed from recently added queue." % str(rating_key)) - self.del_keys(rating_key) + del_keys(rating_key) - def del_keys(self, key): - if isinstance(key, set): - for child_key in key: - self.del_keys(child_key) - elif key in RECENTLY_ADDED_QUEUE: - self.del_keys(RECENTLY_ADDED_QUEUE.pop(key)) + +def del_keys(key): + if isinstance(key, set): + for child_key in key: + del_keys(child_key) + elif key in RECENTLY_ADDED_QUEUE: + del_keys(RECENTLY_ADDED_QUEUE.pop(key)) diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index 1ae44efb..28c0c3a9 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -13,6 +13,8 @@ # You should have received a copy of the GNU General Public License # along with PlexPy. If not, see . +import json + import plexpy import common import database @@ -920,6 +922,15 @@ class DataFactory(object): genres = item['genres'].split(';') if item['genres'] else [] labels = item['labels'].split(';') if item['labels'] else [] + media_info = [{'container': item['container'], + 'bitrate': item['bitrate'], + 'video_codec': item['video_codec'], + 'video_resolution': item['video_resolution'], + 'video_framerate': item['video_framerate'], + 'audio_codec': item['audio_codec'], + 'audio_channels': item['audio_channels'] + }] + metadata = {'media_type': item['media_type'], 'rating_key': item['rating_key'], 'parent_rating_key': item['parent_rating_key'], @@ -952,13 +963,7 @@ class DataFactory(object): 'labels': labels, 'library_name': item['section_name'], 'section_id': item['section_id'], - 'container': item['container'], - 'bitrate': item['bitrate'], - 'video_codec': item['video_codec'], - 'video_resolution': item['video_resolution'], - 'video_framerate': item['video_framerate'], - 'audio_codec': item['audio_codec'], - 'audio_channels': item['audio_channels'] + 'media_info': media_info } metadata_list.append(metadata) @@ -1393,4 +1398,43 @@ class DataFactory(object): else: return [] - return [d['machine_id'] for d in result] \ No newline at end of file + return [d['machine_id'] for d in result] + + def get_recently_added_item(self, rating_key=''): + monitor_db = database.MonitorDatabase() + + if rating_key: + try: + query = 'SELECT * FROM recently_added WHERE rating_key = ?' + result = monitor_db.select(query=query, args=[rating_key]) + except Exception as e: + logger.warn(u"PlexPy DataFactory :: Unable to execute database query for get_recently_added_item: %s." % e) + return [] + else: + return [] + + return result + + def set_recently_added_item(self, rating_key=''): + monitor_db = database.MonitorDatabase() + + pms_connect = pmsconnect.PmsConnect() + metadata = pms_connect.get_metadata_details(rating_key) + + keys = {'rating_key': metadata['rating_key']} + + values = {'added_at': metadata['added_at'], + 'section_id': metadata['section_id'], + 'parent_rating_key': metadata['parent_rating_key'], + 'grandparent_rating_key': metadata['grandparent_rating_key'], + 'media_type': metadata['media_type'], + 'media_info': json.dumps(metadata['media_info']) + } + + try: + monitor_db.upsert(table_name='recently_added', key_dict=keys, value_dict=values) + except Exception as e: + logger.warn(u"PlexPy DataFactory :: Unable to execute database query for set_recently_added_item: %s." % e) + return False + + return True diff --git a/plexpy/libraries.py b/plexpy/libraries.py index e528c65a..bd5ca6cb 100644 --- a/plexpy/libraries.py +++ b/plexpy/libraries.py @@ -388,12 +388,10 @@ class Libraries(object): pms_connect = pmsconnect.PmsConnect() if rating_key: - library_children = pms_connect.get_library_children_details(rating_key=rating_key, - get_media_info=True) + library_children = pms_connect.get_library_children_details(rating_key=rating_key) elif section_id: library_children = pms_connect.get_library_children_details(section_id=section_id, - section_type=section_type, - get_media_info=True) + section_type=section_type) if library_children: library_count = library_children['library_count'] @@ -404,8 +402,11 @@ class Libraries(object): new_rows = [] for item in children_list: + ## TODO: Check list of media info items, currently only grabs first item + media_info = item['media_info'][0] if item['media_info'] else {} + cached_file_size = cached_items.get(item['rating_key'], None) - file_size = cached_file_size if cached_file_size else item.get('file_size', '') + file_size = cached_file_size if cached_file_size else media_info.get('file_size', '') row = {'section_id': library_details['section_id'], 'section_type': library_details['section_type'], @@ -419,13 +420,13 @@ class Libraries(object): 'media_index': item['media_index'], 'parent_media_index': item['parent_media_index'], 'thumb': item['thumb'], - 'container': item.get('container', ''), - 'bitrate': item.get('bitrate', ''), - 'video_codec': item.get('video_codec', ''), - 'video_resolution': item.get('video_resolution', ''), - 'video_framerate': item.get('video_framerate', ''), - 'audio_codec': item.get('audio_codec', ''), - 'audio_channels': item.get('audio_channels', ''), + 'container': media_info.get('container', ''), + 'bitrate': media_info.get('bitrate', ''), + 'video_codec': media_info.get('video_codec', ''), + 'video_resolution': media_info.get('video_resolution', ''), + 'video_framerate': media_info.get('video_framerate', ''), + 'audio_codec': media_info.get('audio_codec', ''), + 'audio_channels': media_info.get('audio_channels', ''), 'file_size': file_size } new_rows.append(row) @@ -561,11 +562,13 @@ class Libraries(object): file_size = 0 metadata = pms_connect.get_metadata_children_details(rating_key=item['rating_key'], - get_children=True, - get_media_info=True) + get_children=True) for child_metadata in metadata: - file_size += helpers.cast_to_int(child_metadata.get('file_size', 0)) + ## TODO: Check list of media info items, currently only grabs first item + media_info = item['media_info'][0] if item['media_info'] else {} + + file_size += helpers.cast_to_int(media_info.get('file_size', 0)) item['file_size'] = file_size diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index 0fa98598..1cb25acf 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -263,12 +263,15 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, * rating_key = timeline['rating_key'] pms_connect = pmsconnect.PmsConnect() - metadata = pms_connect.get_metadata_details(rating_key=rating_key, get_media_info=True) + metadata = pms_connect.get_metadata_details(rating_key=rating_key) if not metadata: logger.error(u"PlexPy NotificationHandler :: Unable to retrieve metadata for rating_key %s" % str(rating_key)) return None + ## TODO: Check list of media info items, currently only grabs first item + media_info = metadata['media_info'][0] if metadata['media_info'] else {} + child_metadata = grandchild_metadata = [] for key in kwargs.pop('child_keys', []): child_metadata.append(pms_connect.get_metadata_details(rating_key=key)) @@ -434,16 +437,16 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, * 'machine_id': session.get('machine_id',''), # Metadata parameters 'media_type': metadata['media_type'], - 'container': session.get('container', metadata.get('container','')), - 'video_codec': session.get('video_codec', metadata.get('video_codec','')), - 'video_bitrate': session.get('bitrate', metadata.get('bitrate','')), - 'video_width': session.get('width', metadata.get('width','')), - 'video_height': session.get('height', metadata.get('height','')), - 'video_resolution': session.get('video_resolution', metadata.get('video_resolution','')), - 'video_framerate': session.get('video_framerate', metadata.get('video_framerate','')), - 'aspect_ratio': session.get('aspect_ratio', metadata.get('aspect_ratio','')), - 'audio_codec': session.get('audio_codec', metadata.get('audio_codec','')), - 'audio_channels': session.get('audio_channels', metadata.get('audio_channels','')), + 'container': session.get('container', media_info.get('container','')), + 'video_codec': session.get('video_codec', media_info.get('video_codec','')), + 'video_bitrate': session.get('bitrate', media_info.get('bitrate','')), + 'video_width': session.get('width', media_info.get('width','')), + 'video_height': session.get('height', media_info.get('height','')), + 'video_resolution': session.get('video_resolution', media_info.get('video_resolution','')), + 'video_framerate': session.get('video_framerate', media_info.get('video_framerate','')), + 'aspect_ratio': session.get('aspect_ratio', media_info.get('aspect_ratio','')), + 'audio_codec': session.get('audio_codec', media_info.get('audio_codec','')), + 'audio_channels': session.get('audio_channels', media_info.get('audio_channels','')), 'title': full_title, 'library_name': metadata['library_name'], 'show_name': show_name, @@ -489,8 +492,8 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, * 'themoviedb_url': metadata.get('themoviedb_url',''), 'lastfm_url': metadata.get('lastfm_url',''), 'trakt_url': metadata.get('trakt_url',''), - 'file': metadata.get('file',''), - 'file_size': helpers.humanFileSize(metadata.get('file_size','')), + 'file': media_info.get('file',''), + 'file_size': helpers.humanFileSize(media_info.get('file_size','')), 'section_id': metadata['section_id'], 'rating_key': metadata['rating_key'], 'parent_rating_key': metadata['parent_rating_key'], diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index 28fab4ef..79350129 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -871,29 +871,32 @@ class PmsConnect(object): else: return [] - if get_media_info and metadata_main.getElementsByTagName('Media'): - item_media = metadata_main.getElementsByTagName('Media')[0] - media_info = {'container': helpers.get_xml_attr(item_media, 'container'), - 'bitrate': helpers.get_xml_attr(item_media, 'bitrate'), - 'height': helpers.get_xml_attr(item_media, 'height'), - 'width': helpers.get_xml_attr(item_media, 'width'), - 'aspect_ratio': helpers.get_xml_attr(item_media, 'aspectRatio'), - 'video_codec': helpers.get_xml_attr(item_media, 'videoCodec'), - 'video_resolution': helpers.get_xml_attr(item_media, 'videoResolution'), - 'video_framerate': helpers.get_xml_attr(item_media, 'videoFrameRate'), - 'audio_codec': helpers.get_xml_attr(item_media, 'audioCodec'), - 'audio_channels': helpers.get_xml_attr(item_media, 'audioChannels'), - 'file': helpers.get_xml_attr(item_media.getElementsByTagName('Part')[0], 'file'), - 'file_size': helpers.get_xml_attr(item_media.getElementsByTagName('Part')[0], 'size'), - } - metadata.update(media_info) + media_info_list = [] + media_items = metadata_main.getElementsByTagName('Media') + for item in media_items: + media_info = {'container': helpers.get_xml_attr(item, 'container'), + 'bitrate': helpers.get_xml_attr(item, 'bitrate'), + 'height': helpers.get_xml_attr(item, 'height'), + 'width': helpers.get_xml_attr(item, 'width'), + 'aspect_ratio': helpers.get_xml_attr(item, 'aspectRatio'), + 'video_codec': helpers.get_xml_attr(item, 'videoCodec'), + 'video_resolution': helpers.get_xml_attr(item, 'videoResolution'), + 'video_framerate': helpers.get_xml_attr(item, 'videoFrameRate'), + 'audio_codec': helpers.get_xml_attr(item, 'audioCodec'), + 'audio_channels': helpers.get_xml_attr(item, 'audioChannels'), + 'file': helpers.get_xml_attr(item.getElementsByTagName('Part')[0], 'file'), + 'file_size': helpers.get_xml_attr(item.getElementsByTagName('Part')[0], 'size'), + } + media_info_list.append(media_info) + + metadata['media_info'] = media_info_list if metadata_list: return metadata_list[0] else: return [] - def get_metadata_children_details(self, rating_key='', get_children=False, get_media_info=False): + def get_metadata_children_details(self, rating_key='', get_children=False): """ Return processed and validated metadata list for all children of requested item. @@ -920,7 +923,7 @@ class PmsConnect(object): metadata_main = a.getElementsByTagName('Video') for item in metadata_main: child_rating_key = helpers.get_xml_attr(item, 'ratingKey') - metadata = self.get_metadata_details(str(child_rating_key), get_media_info) + metadata = self.get_metadata_details(str(child_rating_key)) if metadata: metadata_list.append(metadata) @@ -928,7 +931,7 @@ class PmsConnect(object): metadata_main = a.getElementsByTagName('Track') for item in metadata_main: child_rating_key = helpers.get_xml_attr(item, 'ratingKey') - metadata = self.get_metadata_details(str(child_rating_key), get_media_info) + metadata = self.get_metadata_details(str(child_rating_key)) if metadata: metadata_list.append(metadata) @@ -937,7 +940,7 @@ class PmsConnect(object): metadata_main = [d for d in dir_main if helpers.get_xml_attr(d, 'ratingKey')] for item in metadata_main: child_rating_key = helpers.get_xml_attr(item, 'ratingKey') - metadata = self.get_metadata_children_details(str(child_rating_key), get_children, get_media_info) + metadata = self.get_metadata_children_details(str(child_rating_key), get_children) if metadata: metadata_list.extend(metadata) diff --git a/plexpy/webserve.py b/plexpy/webserve.py index b4c9737d..32a719e6 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -3441,7 +3441,7 @@ class WebInterface(object): metadata.update(poster_info) else: pms_connect = pmsconnect.PmsConnect() - metadata = pms_connect.get_metadata_details(rating_key=rating_key, get_media_info=True) + metadata = pms_connect.get_metadata_details(rating_key=rating_key) if metadata: data_factory = datafactory.DataFactory() poster_info = data_factory.get_poster_info(metadata=metadata)