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()">
% if data:
<% media_info = data['media_info'][0] if data['media_info'] else {} %>
<div class="container-fluid">
<div class="row">
<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
% if data['media_type'] in ('movie', 'episode', 'track'):
<div class="summary-content-media-info-wrapper">
% if data['media_type'] != 'track' and data['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" />
% if data['media_type'] != 'track' and media_info['video_codec']:
<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
% if data['media_type'] != 'track' and data['video_resolution']:
<img class="summary-content-media-flag" title="${data['video_resolution']}" src="${http_root}images/media_flags/video_resolution/${data['video_resolution']}.png" />
% if data['media_type'] != 'track' and media_info['video_resolution']:
<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
% if data['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" />
% if media_info['audio_codec']:
<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
% if data['audio_channels']:
<img class="summary-content-media-flag" title="${data['audio_channels']}" src="${http_root}images/media_flags/audio_channels/${data['audio_channels']}.png" />
% if media_info['audio_channels']:
<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
</div>
% endif

View file

@ -1013,7 +1013,7 @@
</div>
<div class="checkbox">
<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>
<p class="help-block">
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)'
)
# 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')

View file

@ -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))

View file

@ -13,6 +13,8 @@
# You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see <http://www.gnu.org/licenses/>.
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]
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()
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

View file

@ -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'],

View file

@ -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)

View file

@ -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)