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)