Log recently added items to the database

* Temporarily disable recently added upgrade notifications
This commit is contained in:
JonnyWong16 2017-01-27 20:50:46 -08:00
parent eac31d10f1
commit fc7b396e45
9 changed files with 173 additions and 90 deletions

View file

@ -68,6 +68,7 @@ DOCUMENTATION :: END
<%def name="body()"> <%def name="body()">
% if data: % if data:
<% media_info = data['media_info'][0] if data['media_info'] else {} %>
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="art-face" style="background-image:url(pms_image_proxy?img=${data['art']}&width=1920&height=1080)"></div> <div class="art-face" style="background-image:url(pms_image_proxy?img=${data['art']}&width=1920&height=1080)"></div>
@ -187,17 +188,17 @@ DOCUMENTATION :: END
% endif % endif
% if data['media_type'] in ('movie', 'episode', 'track'): % if data['media_type'] in ('movie', 'episode', 'track'):
<div class="summary-content-media-info-wrapper"> <div class="summary-content-media-info-wrapper">
% if data['media_type'] != 'track' and data['video_codec']: % if data['media_type'] != 'track' and media_info['video_codec']:
<img class="summary-content-media-flag" title="${data['video_codec']}" src="${http_root}images/media_flags/video_codec/${data['video_codec'] | vf}.png" /> <img class="summary-content-media-flag" title="${media_info['video_codec']}" src="${http_root}images/media_flags/video_codec/${media_info['video_codec'] | vf}.png" />
% endif % endif
% if data['media_type'] != 'track' and data['video_resolution']: % if data['media_type'] != 'track' and media_info['video_resolution']:
<img class="summary-content-media-flag" title="${data['video_resolution']}" src="${http_root}images/media_flags/video_resolution/${data['video_resolution']}.png" /> <img class="summary-content-media-flag" title="${media_info['video_resolution']}" src="${http_root}images/media_flags/video_resolution/${media_info['video_resolution']}.png" />
% endif % endif
% if data['audio_codec']: % if media_info['audio_codec']:
<img class="summary-content-media-flag" title="${data['audio_codec']}" src="${http_root}images/media_flags/audio_codec/${data['audio_codec'] | af}.png" /> <img class="summary-content-media-flag" title="${media_info['audio_codec']}" src="${http_root}images/media_flags/audio_codec/${media_info['audio_codec'] | af}.png" />
% endif % endif
% if data['audio_channels']: % if media_info['audio_channels']:
<img class="summary-content-media-flag" title="${data['audio_channels']}" src="${http_root}images/media_flags/audio_channels/${data['audio_channels']}.png" /> <img class="summary-content-media-flag" title="${media_info['audio_channels']}" src="${http_root}images/media_flags/audio_channels/${media_info['audio_channels']}.png" />
% endif % endif
</div> </div>
% endif % endif

View file

@ -1013,7 +1013,7 @@
</div> </div>
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input type="checkbox" name="notify_recently_added_upgrade" id="notify_recently_added_upgrade" value="1" ${config['notify_recently_added_upgrade']}> Send a Notification for New Versions <input type="checkbox" name="notify_recently_added_upgrade" id="notify_recently_added_upgrade" value="1" ${config['notify_recently_added_upgrade']}> Send a Notification for New Versions <span style="color: #eb8600; padding-left: 10px;">[Not working]</span>
</label> </label>
<p class="help-block"> <p class="help-block">
Enable to send another recently added notification when adding a new version of existing media.<br /> Enable to send another recently added notification when adding a new version of existing media.<br />

View file

@ -526,6 +526,14 @@ def dbcheck():
'rating_key INTEGER, poster_title TEXT, poster_url TEXT)' '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 # Upgrade sessions table from earlier versions
try: try:
c_db.execute('SELECT started FROM sessions') c_db.execute('SELECT started FROM sessions')

View file

@ -268,9 +268,29 @@ class TimelineHandler(object):
metadata = pms_connect.get_metadata_details(rating_key) metadata = pms_connect.get_metadata_details(rating_key)
if metadata: if metadata:
data = {'timeline_data': metadata, 'notify_action': 'on_created'} notify = True
data.update(kwargs)
plexpy.NOTIFY_QUEUE.put(data) 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: else:
logger.error(u"PlexPy TimelineHandler :: Unable to retrieve metadata for rating_key %s" \ logger.error(u"PlexPy TimelineHandler :: Unable to retrieve metadata for rating_key %s" \
% str(rating_key)) % str(rating_key))
@ -300,9 +320,9 @@ class TimelineHandler(object):
# Add a new media item to the recently added queue # Add a new media item to the recently added queue
if media_type and section_id > 0 and \ if media_type and section_id > 0 and \
((state_type == 0 and metadata_state == 'created') or \ ((state_type == 0 and metadata_state == 'created')): # or \
(plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and state_type in (1, 5) and \ #(plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and state_type in (1, 5) and \
media_state == 'analyzing' and queue_size is None)): #media_state == 'analyzing' and queue_size is None)):
if media_type in ('episode', 'track'): if media_type in ('episode', 'track'):
metadata = self.get_metadata() metadata = self.get_metadata()
@ -373,34 +393,35 @@ class TimelineHandler(object):
self.on_created(rating_key) self.on_created(rating_key)
# Remove all keys # Remove all keys
self.del_keys(rating_key) del_keys(rating_key)
# An episode or track is done processing (upgrade only) # An episode or track is done processing (upgrade only)
elif plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and \ #elif plexpy.CONFIG.NOTIFY_RECENTLY_ADDED_UPGRADE and \
media_type in ('episode', 'track') and section_id > 0 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 \ # state_type == 5 and metadata_state is None and queue_size is None and \
rating_key in RECENTLY_ADDED_QUEUE: # rating_key in RECENTLY_ADDED_QUEUE:
logger.debug(u"PlexPy TimelineHandler :: Library item '%s' (%s) done processing metadata (upgrade)." # logger.debug(u"PlexPy TimelineHandler :: Library item '%s' (%s) done processing metadata (upgrade)."
% (title, str(rating_key))) # % (title, str(rating_key)))
grandparent_rating_key = RECENTLY_ADDED_QUEUE[rating_key] # grandparent_rating_key = RECENTLY_ADDED_QUEUE[rating_key]
self.on_created(rating_key) # self.on_created(rating_key)
# Remove all keys # # Remove all keys
self.del_keys(grandparent_rating_key) # del_keys(grandparent_rating_key)
# An item was deleted, make sure it is removed from the queue # An item was deleted, make sure it is removed from the queue
elif state_type == 9 and metadata_state == 'deleted': elif state_type == 9 and metadata_state == 'deleted':
if rating_key in RECENTLY_ADDED_QUEUE and not RECENTLY_ADDED_QUEUE[rating_key]: 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." logger.debug(u"PlexPy TimelineHandler :: Library item %s removed from recently added queue."
% str(rating_key)) % str(rating_key))
self.del_keys(rating_key) del_keys(rating_key)
def del_keys(self, key):
if isinstance(key, set): def del_keys(key):
for child_key in key: if isinstance(key, set):
self.del_keys(child_key) for child_key in key:
elif key in RECENTLY_ADDED_QUEUE: del_keys(child_key)
self.del_keys(RECENTLY_ADDED_QUEUE.pop(key)) elif key in RECENTLY_ADDED_QUEUE:
del_keys(RECENTLY_ADDED_QUEUE.pop(key))

View file

@ -13,6 +13,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>. # along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
import json
import plexpy import plexpy
import common import common
import database import database
@ -920,6 +922,15 @@ class DataFactory(object):
genres = item['genres'].split(';') if item['genres'] else [] genres = item['genres'].split(';') if item['genres'] else []
labels = item['labels'].split(';') if item['labels'] 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'], metadata = {'media_type': item['media_type'],
'rating_key': item['rating_key'], 'rating_key': item['rating_key'],
'parent_rating_key': item['parent_rating_key'], 'parent_rating_key': item['parent_rating_key'],
@ -952,13 +963,7 @@ class DataFactory(object):
'labels': labels, 'labels': labels,
'library_name': item['section_name'], 'library_name': item['section_name'],
'section_id': item['section_id'], 'section_id': item['section_id'],
'container': item['container'], 'media_info': media_info
'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_list.append(metadata) metadata_list.append(metadata)
@ -1394,3 +1399,42 @@ class DataFactory(object):
return [] return []
return [d['machine_id'] for d in result] 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

View file

@ -388,12 +388,10 @@ class Libraries(object):
pms_connect = pmsconnect.PmsConnect() pms_connect = pmsconnect.PmsConnect()
if rating_key: if rating_key:
library_children = pms_connect.get_library_children_details(rating_key=rating_key, library_children = pms_connect.get_library_children_details(rating_key=rating_key)
get_media_info=True)
elif section_id: elif section_id:
library_children = pms_connect.get_library_children_details(section_id=section_id, library_children = pms_connect.get_library_children_details(section_id=section_id,
section_type=section_type, section_type=section_type)
get_media_info=True)
if library_children: if library_children:
library_count = library_children['library_count'] library_count = library_children['library_count']
@ -404,8 +402,11 @@ class Libraries(object):
new_rows = [] new_rows = []
for item in children_list: 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) 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'], row = {'section_id': library_details['section_id'],
'section_type': library_details['section_type'], 'section_type': library_details['section_type'],
@ -419,13 +420,13 @@ class Libraries(object):
'media_index': item['media_index'], 'media_index': item['media_index'],
'parent_media_index': item['parent_media_index'], 'parent_media_index': item['parent_media_index'],
'thumb': item['thumb'], 'thumb': item['thumb'],
'container': item.get('container', ''), 'container': media_info.get('container', ''),
'bitrate': item.get('bitrate', ''), 'bitrate': media_info.get('bitrate', ''),
'video_codec': item.get('video_codec', ''), 'video_codec': media_info.get('video_codec', ''),
'video_resolution': item.get('video_resolution', ''), 'video_resolution': media_info.get('video_resolution', ''),
'video_framerate': item.get('video_framerate', ''), 'video_framerate': media_info.get('video_framerate', ''),
'audio_codec': item.get('audio_codec', ''), 'audio_codec': media_info.get('audio_codec', ''),
'audio_channels': item.get('audio_channels', ''), 'audio_channels': media_info.get('audio_channels', ''),
'file_size': file_size 'file_size': file_size
} }
new_rows.append(row) new_rows.append(row)
@ -561,11 +562,13 @@ class Libraries(object):
file_size = 0 file_size = 0
metadata = pms_connect.get_metadata_children_details(rating_key=item['rating_key'], metadata = pms_connect.get_metadata_children_details(rating_key=item['rating_key'],
get_children=True, get_children=True)
get_media_info=True)
for child_metadata in metadata: 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 item['file_size'] = file_size

View file

@ -263,12 +263,15 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, *
rating_key = timeline['rating_key'] rating_key = timeline['rating_key']
pms_connect = pmsconnect.PmsConnect() 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: if not metadata:
logger.error(u"PlexPy NotificationHandler :: Unable to retrieve metadata for rating_key %s" % str(rating_key)) logger.error(u"PlexPy NotificationHandler :: Unable to retrieve metadata for rating_key %s" % str(rating_key))
return None 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 = [] child_metadata = grandchild_metadata = []
for key in kwargs.pop('child_keys', []): for key in kwargs.pop('child_keys', []):
child_metadata.append(pms_connect.get_metadata_details(rating_key=key)) 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',''), 'machine_id': session.get('machine_id',''),
# Metadata parameters # Metadata parameters
'media_type': metadata['media_type'], 'media_type': metadata['media_type'],
'container': session.get('container', metadata.get('container','')), 'container': session.get('container', media_info.get('container','')),
'video_codec': session.get('video_codec', metadata.get('video_codec','')), 'video_codec': session.get('video_codec', media_info.get('video_codec','')),
'video_bitrate': session.get('bitrate', metadata.get('bitrate','')), 'video_bitrate': session.get('bitrate', media_info.get('bitrate','')),
'video_width': session.get('width', metadata.get('width','')), 'video_width': session.get('width', media_info.get('width','')),
'video_height': session.get('height', metadata.get('height','')), 'video_height': session.get('height', media_info.get('height','')),
'video_resolution': session.get('video_resolution', metadata.get('video_resolution','')), 'video_resolution': session.get('video_resolution', media_info.get('video_resolution','')),
'video_framerate': session.get('video_framerate', metadata.get('video_framerate','')), 'video_framerate': session.get('video_framerate', media_info.get('video_framerate','')),
'aspect_ratio': session.get('aspect_ratio', metadata.get('aspect_ratio','')), 'aspect_ratio': session.get('aspect_ratio', media_info.get('aspect_ratio','')),
'audio_codec': session.get('audio_codec', metadata.get('audio_codec','')), 'audio_codec': session.get('audio_codec', media_info.get('audio_codec','')),
'audio_channels': session.get('audio_channels', metadata.get('audio_channels','')), 'audio_channels': session.get('audio_channels', media_info.get('audio_channels','')),
'title': full_title, 'title': full_title,
'library_name': metadata['library_name'], 'library_name': metadata['library_name'],
'show_name': show_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',''), 'themoviedb_url': metadata.get('themoviedb_url',''),
'lastfm_url': metadata.get('lastfm_url',''), 'lastfm_url': metadata.get('lastfm_url',''),
'trakt_url': metadata.get('trakt_url',''), 'trakt_url': metadata.get('trakt_url',''),
'file': metadata.get('file',''), 'file': media_info.get('file',''),
'file_size': helpers.humanFileSize(metadata.get('file_size','')), 'file_size': helpers.humanFileSize(media_info.get('file_size','')),
'section_id': metadata['section_id'], 'section_id': metadata['section_id'],
'rating_key': metadata['rating_key'], 'rating_key': metadata['rating_key'],
'parent_rating_key': metadata['parent_rating_key'], 'parent_rating_key': metadata['parent_rating_key'],

View file

@ -871,29 +871,32 @@ class PmsConnect(object):
else: else:
return [] return []
if get_media_info and metadata_main.getElementsByTagName('Media'): media_info_list = []
item_media = metadata_main.getElementsByTagName('Media')[0] media_items = metadata_main.getElementsByTagName('Media')
media_info = {'container': helpers.get_xml_attr(item_media, 'container'), for item in media_items:
'bitrate': helpers.get_xml_attr(item_media, 'bitrate'), media_info = {'container': helpers.get_xml_attr(item, 'container'),
'height': helpers.get_xml_attr(item_media, 'height'), 'bitrate': helpers.get_xml_attr(item, 'bitrate'),
'width': helpers.get_xml_attr(item_media, 'width'), 'height': helpers.get_xml_attr(item, 'height'),
'aspect_ratio': helpers.get_xml_attr(item_media, 'aspectRatio'), 'width': helpers.get_xml_attr(item, 'width'),
'video_codec': helpers.get_xml_attr(item_media, 'videoCodec'), 'aspect_ratio': helpers.get_xml_attr(item, 'aspectRatio'),
'video_resolution': helpers.get_xml_attr(item_media, 'videoResolution'), 'video_codec': helpers.get_xml_attr(item, 'videoCodec'),
'video_framerate': helpers.get_xml_attr(item_media, 'videoFrameRate'), 'video_resolution': helpers.get_xml_attr(item, 'videoResolution'),
'audio_codec': helpers.get_xml_attr(item_media, 'audioCodec'), 'video_framerate': helpers.get_xml_attr(item, 'videoFrameRate'),
'audio_channels': helpers.get_xml_attr(item_media, 'audioChannels'), 'audio_codec': helpers.get_xml_attr(item, 'audioCodec'),
'file': helpers.get_xml_attr(item_media.getElementsByTagName('Part')[0], 'file'), 'audio_channels': helpers.get_xml_attr(item, 'audioChannels'),
'file_size': helpers.get_xml_attr(item_media.getElementsByTagName('Part')[0], 'size'), 'file': helpers.get_xml_attr(item.getElementsByTagName('Part')[0], 'file'),
} 'file_size': helpers.get_xml_attr(item.getElementsByTagName('Part')[0], 'size'),
metadata.update(media_info) }
media_info_list.append(media_info)
metadata['media_info'] = media_info_list
if metadata_list: if metadata_list:
return metadata_list[0] return metadata_list[0]
else: else:
return [] 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. Return processed and validated metadata list for all children of requested item.
@ -920,7 +923,7 @@ class PmsConnect(object):
metadata_main = a.getElementsByTagName('Video') metadata_main = a.getElementsByTagName('Video')
for item in metadata_main: for item in metadata_main:
child_rating_key = helpers.get_xml_attr(item, 'ratingKey') 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: if metadata:
metadata_list.append(metadata) metadata_list.append(metadata)
@ -928,7 +931,7 @@ class PmsConnect(object):
metadata_main = a.getElementsByTagName('Track') metadata_main = a.getElementsByTagName('Track')
for item in metadata_main: for item in metadata_main:
child_rating_key = helpers.get_xml_attr(item, 'ratingKey') 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: if metadata:
metadata_list.append(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')] metadata_main = [d for d in dir_main if helpers.get_xml_attr(d, 'ratingKey')]
for item in metadata_main: for item in metadata_main:
child_rating_key = helpers.get_xml_attr(item, 'ratingKey') 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: if metadata:
metadata_list.extend(metadata) metadata_list.extend(metadata)

View file

@ -3441,7 +3441,7 @@ class WebInterface(object):
metadata.update(poster_info) metadata.update(poster_info)
else: else:
pms_connect = pmsconnect.PmsConnect() 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: if metadata:
data_factory = datafactory.DataFactory() data_factory = datafactory.DataFactory()
poster_info = data_factory.get_poster_info(metadata=metadata) poster_info = data_factory.get_poster_info(metadata=metadata)