From 09aac229098d98cec2bcca617cc866837129c8ef Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Sun, 18 Oct 2015 20:47:17 -0700 Subject: [PATCH 01/23] Initial library_id changes * Give the library sections their own db table. --- data/interfaces/default/info.html | 78 ++++---- .../default/info_children_list.html | 10 +- .../default/info_search_results_list.html | 10 +- data/interfaces/default/library_stats.html | 2 +- .../default/user_recently_watched.html | 2 +- plexpy/__init__.py | 162 +++++++++------- plexpy/activity_processor.py | 17 +- plexpy/config.py | 1 + plexpy/datafactory.py | 88 ++++++++- plexpy/plexwatch_import.py | 8 +- plexpy/pmsconnect.py | 183 +++++++++++++----- plexpy/webserve.py | 63 +++++- 12 files changed, 420 insertions(+), 204 deletions(-) diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index eb0bf32a..efcdaf56 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -60,49 +60,41 @@ DOCUMENTATION :: END % if data:
- % if data['media_type'] != 'library':
- % endif
@@ -143,18 +135,18 @@ DOCUMENTATION :: END

 

${data['title']}

% elif data['media_type'] == 'season':

 

${data['parent_title']}

- + % elif data['media_type'] == 'episode':

${data['grandparent_title']}

${data['title']}

- + % elif data['media_type'] == 'album':

${data['parent_title']}

${data['title']}

% elif data['media_type'] == 'track':

${data['grandparent_title']}

${data['parent_title']} - ${data['title']}

- + % endif
@@ -315,6 +307,13 @@ DOCUMENTATION :: END % endif % endif
+ % if data['media_type'] == 'library' and config['update_library_ids'] == 1: +
+ Updating library ids in the database. This could take a few minutes depending on the size of your database. +
+ The history table will refresh automatically when the update is complete. Please wait... +
+ % endif
Watch History for ${data['title']} @@ -417,21 +416,15 @@ DOCUMENTATION :: END
-
-
-

- Error retrieving item metadata. This media item is not available in the Plex Media Server library. -

- % if query: -

- If the item has been moved, please select the correct match below to update the PlexPy database. -

- % endif -
-
+
+ Error retrieving item metadata. This media item is not available in the Plex Media Server library. +
% if query: +
+ If the item has been moved, please select the correct match below to update the PlexPy database. +
Search Results for ${query['query_string']} @@ -507,10 +500,23 @@ DOCUMENTATION :: END type: 'post', data: function ( d ) { return { 'json_data': JSON.stringify( d ), - 'media_type': "${data['media_type_filter']}" }; + 'library_id': "${data['library_id']}" }; } } } + if ("${config['update_library_ids']}" == "1") { + $.ajax({ + url: 'update_library_ids', + type: 'post', + cache: false, + async: true, + data: { }, + complete: function (xhr, status) { + $('#update_library_ids_mssage').remove(); + history_table.draw(); + } + }); + } % elif data['media_type'] == 'show' or data['media_type'] == 'artist': @@ -83,7 +83,7 @@ DOCUMENTATION :: END
% else:
- ${child['index']} + ${child['media_index']} ${child['title']} diff --git a/data/interfaces/default/info_search_results_list.html b/data/interfaces/default/info_search_results_list.html index bd09e068..7b83fbcb 100644 --- a/data/interfaces/default/info_search_results_list.html +++ b/data/interfaces/default/info_search_results_list.html @@ -35,8 +35,8 @@ duration Returns the standard runtime of the media. content_rating Returns the age rating for the media. summary Returns a brief description of the media plot. grandparent_title Returns the name of the show, or artist. -parent_index Returns the index number of the season. -index Returns the index number of the episode, or track. +parent_media_index Returns the index number of the season. +media_index Returns the index number of the episode, or track. parent_thumb Returns the location of the item's thumbnail. Use with pms_image_proxy. writers Returns an array of writers. thumb Returns the location of the item's thumbnail. Use with pms_image_proxy. @@ -112,7 +112,7 @@ DOCUMENTATION :: END

${child['parent_title']}

-

S${child['index']}

+

S${child['media_index']}

@@ -135,7 +135,7 @@ DOCUMENTATION :: END

${child['grandparent_title']}

${child['title']}

-

S${child['parent_index']} · E${child['index']}

+

S${child['parent_media_index']} · E${child['media_index']}

@@ -199,7 +199,7 @@ DOCUMENTATION :: END
- Track ${child['index']} + Track ${child['media_index']}
diff --git a/data/interfaces/default/library_stats.html b/data/interfaces/default/library_stats.html index f310ab5c..70f052e9 100644 --- a/data/interfaces/default/library_stats.html +++ b/data/interfaces/default/library_stats.html @@ -39,7 +39,7 @@ DOCUMENTATION :: END
% if library['type'] != 'photo':

- ${library['rows']['title']} + ${library['rows']['title']}

% else:

${library['rows']['title']}

diff --git a/data/interfaces/default/user_recently_watched.html b/data/interfaces/default/user_recently_watched.html index 2e432203..d40ec84b 100644 --- a/data/interfaces/default/user_recently_watched.html +++ b/data/interfaces/default/user_recently_watched.html @@ -50,7 +50,7 @@ DOCUMENTATION :: END % if item['type'] == 'episode':

${item['grandparent_title']}

${item['title']}

-

S${item['parent_index']} · E${item['index']}

+

S${item['parent_media_index']} · E${item['media_index']}

% elif item['type'] == 'movie':

${item['title']}

${item['year']}

diff --git a/plexpy/__init__.py b/plexpy/__init__.py index bbd234da..681d2565 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -405,11 +405,10 @@ def dbcheck(): 'CREATE TABLE IF NOT EXISTS session_history_metadata (id INTEGER PRIMARY KEY, ' 'rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, ' 'title TEXT, parent_title TEXT, grandparent_title TEXT, full_title TEXT, media_index INTEGER, ' - 'parent_media_index INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, art TEXT, media_type TEXT, ' - 'year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, last_viewed_at INTEGER, ' - 'content_rating TEXT, summary TEXT, tagline TEXT, rating TEXT, duration INTEGER DEFAULT 0, guid TEXT, ' - 'directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT)' - '' + 'parent_media_index INTEGER, library_id INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, ' + 'art TEXT, media_type TEXT, year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, ' + 'last_viewed_at INTEGER, content_rating TEXT, summary TEXT, tagline TEXT, rating TEXT, ' + 'duration INTEGER DEFAULT 0, guid TEXT, directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT)' ) # users table :: This table keeps record of the friends list @@ -421,6 +420,20 @@ def dbcheck(): 'keep_history INTEGER DEFAULT 1, deleted_user INTEGER DEFAULT 0)' ) + # notify_log table :: This is a table which logs notifications sent + c_db.execute( + 'CREATE TABLE IF NOT EXISTS notify_log (id INTEGER PRIMARY KEY AUTOINCREMENT, ' + 'session_key INTEGER, rating_key INTEGER, user_id INTEGER, user TEXT, ' + 'agent_id INTEGER, agent_name TEXT, on_play INTEGER, on_stop INTEGER, on_watched INTEGER, ' + 'on_pause INTEGER, on_resume INTEGER, on_buffer INTEGER)' + ) + + # library_sections table :: This table keeps record of the servers library sections + c_db.execute( + 'CREATE TABLE IF NOT EXISTS library_sections (id INTEGER PRIMARY KEY AUTOINCREMENT, ' + 'section_id INTEGER UNIQUE, section_name TEXT, section_type TEXT)' + ) + # Upgrade sessions table from earlier versions try: c_db.execute('SELECT started from sessions') @@ -547,6 +560,50 @@ def dbcheck(): 'ALTER TABLE sessions ADD COLUMN transcode_height INTEGER' ) + # Upgrade sessions table from earlier versions + try: + c_db.execute('SELECT buffer_count from sessions') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table sessions.") + c_db.execute( + 'ALTER TABLE sessions ADD COLUMN buffer_count INTEGER DEFAULT 0' + ) + c_db.execute( + 'ALTER TABLE sessions ADD COLUMN buffer_last_triggered INTEGER' + ) + + # Upgrade sessions table from earlier versions + try: + c_db.execute('SELECT last_paused from sessions') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table sessions.") + c_db.execute( + 'ALTER TABLE sessions ADD COLUMN last_paused INTEGER' + ) + + # Upgrade session_history table from earlier versions + try: + c_db.execute('SELECT reference_id from session_history') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table session_history.") + c_db.execute( + 'ALTER TABLE session_history ADD COLUMN reference_id INTEGER DEFAULT 0' + ) + # Set reference_id to the first row where (user_id = previous row, rating_key != previous row) and user_id = user_id + c_db.execute( + 'UPDATE session_history ' \ + 'SET reference_id = (SELECT (CASE \ + WHEN (SELECT MIN(id) FROM session_history WHERE id > ( \ + SELECT MAX(id) FROM session_history \ + WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) IS NULL \ + THEN (SELECT MIN(id) FROM session_history WHERE (user_id = t1.user_id)) \ + ELSE (SELECT MIN(id) FROM session_history WHERE id > ( \ + SELECT MAX(id) FROM session_history \ + WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) END) ' \ + 'FROM session_history AS t1 ' \ + 'WHERE t1.id = session_history.id) ' + ) + # Upgrade session_history_metadata table from earlier versions try: c_db.execute('SELECT full_title from session_history_metadata') @@ -565,13 +622,14 @@ def dbcheck(): 'ALTER TABLE session_history_metadata ADD COLUMN tagline TEXT' ) - # notify_log table :: This is a table which logs notifications sent - c_db.execute( - 'CREATE TABLE IF NOT EXISTS notify_log (id INTEGER PRIMARY KEY AUTOINCREMENT, ' - 'session_key INTEGER, rating_key INTEGER, user_id INTEGER, user TEXT, ' - 'agent_id INTEGER, agent_name TEXT, on_play INTEGER, on_stop INTEGER, on_watched INTEGER, ' - 'on_pause INTEGER, on_resume INTEGER, on_buffer INTEGER, on_created INTEGER)' - ) + # Upgrade session_history_metadata table from earlier versions + try: + c_db.execute('SELECT library_id from session_history_metadata') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table session_history_metadata.") + c_db.execute( + 'ALTER TABLE session_history_metadata ADD COLUMN library_id INTEGER' + ) # Upgrade users table from earlier versions try: @@ -591,6 +649,24 @@ def dbcheck(): 'ALTER TABLE users ADD COLUMN keep_history INTEGER DEFAULT 1' ) + # Upgrade users table from earlier versions + try: + c_db.execute('SELECT custom_avatar_url from users') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table users.") + c_db.execute( + 'ALTER TABLE users ADD COLUMN custom_avatar_url TEXT' + ) + + # Upgrade users table from earlier versions + try: + c_db.execute('SELECT deleted_user from users') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table users.") + c_db.execute( + 'ALTER TABLE users ADD COLUMN deleted_user INTEGER DEFAULT 0' + ) + # Upgrade notify_log table from earlier versions try: c_db.execute('SELECT on_pause from notify_log') @@ -615,74 +691,12 @@ def dbcheck(): 'ALTER TABLE notify_log ADD COLUMN on_created INTEGER' ) - # Upgrade sessions table from earlier versions - try: - c_db.execute('SELECT buffer_count from sessions') - except sqlite3.OperationalError: - logger.debug(u"Altering database. Updating database table sessions.") - c_db.execute( - 'ALTER TABLE sessions ADD COLUMN buffer_count INTEGER DEFAULT 0' - ) - c_db.execute( - 'ALTER TABLE sessions ADD COLUMN buffer_last_triggered INTEGER' - ) - - # Upgrade users table from earlier versions - try: - c_db.execute('SELECT custom_avatar_url from users') - except sqlite3.OperationalError: - logger.debug(u"Altering database. Updating database table users.") - c_db.execute( - 'ALTER TABLE users ADD COLUMN custom_avatar_url TEXT' - ) - - # Upgrade sessions table from earlier versions - try: - c_db.execute('SELECT last_paused from sessions') - except sqlite3.OperationalError: - logger.debug(u"Altering database. Updating database table sessions.") - c_db.execute( - 'ALTER TABLE sessions ADD COLUMN last_paused INTEGER' - ) - # Add "Local" user to database as default unauthenticated user. result = c_db.execute('SELECT id FROM users WHERE username = "Local"') if not result.fetchone(): logger.debug(u'User "Local" does not exist. Adding user.') c_db.execute('INSERT INTO users (user_id, username) VALUES (0, "Local")') - # Upgrade session_history table from earlier versions - try: - c_db.execute('SELECT reference_id from session_history') - except sqlite3.OperationalError: - logger.debug(u"Altering database. Updating database table session_history.") - c_db.execute( - 'ALTER TABLE session_history ADD COLUMN reference_id INTEGER DEFAULT 0' - ) - # Set reference_id to the first row where (user_id = previous row, rating_key != previous row) and user_id = user_id - c_db.execute( - 'UPDATE session_history ' \ - 'SET reference_id = (SELECT (CASE \ - WHEN (SELECT MIN(id) FROM session_history WHERE id > ( \ - SELECT MAX(id) FROM session_history \ - WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) IS NULL \ - THEN (SELECT MIN(id) FROM session_history WHERE (user_id = t1.user_id)) \ - ELSE (SELECT MIN(id) FROM session_history WHERE id > ( \ - SELECT MAX(id) FROM session_history \ - WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) END) ' \ - 'FROM session_history AS t1 ' \ - 'WHERE t1.id = session_history.id) ' - ) - - # Upgrade users table from earlier versions - try: - c_db.execute('SELECT deleted_user from users') - except sqlite3.OperationalError: - logger.debug(u"Altering database. Updating database table users.") - c_db.execute( - 'ALTER TABLE users ADD COLUMN deleted_user INTEGER DEFAULT 0' - ) - conn_db.commit() c_db.close() diff --git a/plexpy/activity_processor.py b/plexpy/activity_processor.py index 0a68f4d0..cc3f6448 100644 --- a/plexpy/activity_processor.py +++ b/plexpy/activity_processor.py @@ -250,19 +250,20 @@ class ActivityProcessor(object): # logger.debug(u"PlexPy ActivityProcessor :: Attempting to write to session_history_metadata table...") query = 'INSERT INTO session_history_metadata (id, rating_key, parent_rating_key, ' \ 'grandparent_rating_key, title, parent_title, grandparent_title, full_title, media_index, ' \ - 'parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, year, ' \ - 'originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, ' \ - 'tagline, rating, duration, guid, directors, writers, actors, genres, studio) VALUES ' \ + 'parent_media_index, library_id, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \ + 'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, ' \ + 'summary, tagline, rating, duration, guid, directors, writers, actors, genres, studio) VALUES ' \ '(last_insert_rowid(), ' \ - '?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' + '?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' args = [session['rating_key'], session['parent_rating_key'], session['grandparent_rating_key'], session['title'], session['parent_title'], session['grandparent_title'], full_title, - metadata['index'], metadata['parent_index'], metadata['thumb'], metadata['parent_thumb'], - metadata['grandparent_thumb'], metadata['art'], session['media_type'], metadata['year'], - metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'], + metadata['media_index'], metadata['parent_media_index'], metadata['library_id'], metadata['thumb'], + metadata['parent_thumb'], metadata['grandparent_thumb'], metadata['art'], session['media_type'], + metadata['year'], metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'], metadata['last_viewed_at'], metadata['content_rating'], metadata['summary'], metadata['tagline'], - metadata['rating'], metadata['duration'], metadata['guid'], directors, writers, actors, genres, metadata['studio']] + metadata['rating'], metadata['duration'], metadata['guid'], directors, writers, actors, genres, + metadata['studio']] # logger.debug(u"PlexPy ActivityProcessor :: Writing session_history_metadata transaction...") self.db.action(query=query, args=args) diff --git a/plexpy/config.py b/plexpy/config.py index f5afd041..ac33003c 100644 --- a/plexpy/config.py +++ b/plexpy/config.py @@ -370,6 +370,7 @@ _CONFIG_DEFINITIONS = { 'TWITTER_ON_EXTUP': (int, 'Twitter', 0), 'TWITTER_ON_INTUP': (int, 'Twitter', 0), 'UPDATE_DB_INTERVAL': (int, 'General', 24), + 'UPDATE_LIBRARY_IDS': (int, 'General', 1), 'VERIFY_SSL_CERT': (bool_int, 'Advanced', 1), 'VIDEO_LOGGING_ENABLE': (int, 'Monitoring', 1), 'XBMC_ENABLED': (int, 'XBMC', 0), diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index a9fdf29e..a33ca723 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -755,8 +755,8 @@ class DataFactory(object): 'parent_title': row['parent_title'], 'grandparent_title': row['grandparent_title'], 'thumb': thumb, - 'index': row['media_index'], - 'parent_index': row['parent_media_index'], + 'media_index': row['media_index'], + 'parent_media_index': row['parent_media_index'], 'year': row['year'], 'time': row['started'], 'user': row['user'] @@ -769,12 +769,23 @@ class DataFactory(object): monitor_db = database.MonitorDatabase() if row_id: - query = 'SELECT rating_key, parent_rating_key, grandparent_rating_key, title, parent_title, grandparent_title, ' \ - 'full_title, media_index, parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \ - 'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, tagline, ' \ - 'rating, duration, guid, directors, writers, actors, genres, studio ' \ + query = 'SELECT session_history_metadata.rating_key, session_history_metadata.parent_rating_key, ' \ + 'session_history_metadata.grandparent_rating_key, session_history_metadata.title, ' \ + 'session_history_metadata.parent_title, session_history_metadata.grandparent_title, ' \ + 'session_history_metadata.full_title, library_sections.section_name, ' \ + 'session_history_metadata.media_index, session_history_metadata.parent_media_index, ' \ + 'session_history_metadata.library_id, session_history_metadata.thumb, ' \ + 'session_history_metadata.parent_thumb, session_history_metadata.grandparent_thumb, ' \ + 'session_history_metadata.art, session_history_metadata.media_type, session_history_metadata.year, ' \ + 'session_history_metadata.originally_available_at, session_history_metadata.added_at, ' \ + 'session_history_metadata.updated_at, session_history_metadata.last_viewed_at, ' \ + 'session_history_metadata.content_rating, session_history_metadata.summary, ' \ + 'session_history_metadata.tagline, session_history_metadata.rating, session_history_metadata.duration, ' \ + 'session_history_metadata.guid, session_history_metadata.directors, session_history_metadata.writers, ' \ + 'session_history_metadata.actors, session_history_metadata.genres, session_history_metadata.studio ' \ 'FROM session_history_metadata ' \ - 'WHERE id = ?' + 'JOIN library_sections ON session_history_metadata.library_id = library_sections.section_id ' \ + 'WHERE session_history_metadata.id = ?' result = monitor_db.select(query=query, args=[row_id]) else: result = [] @@ -791,9 +802,9 @@ class DataFactory(object): 'parent_rating_key': item['parent_rating_key'], 'grandparent_rating_key': item['grandparent_rating_key'], 'grandparent_title': item['grandparent_title'], - 'parent_index': item['parent_media_index'], + 'parent_media_index': item['parent_media_index'], 'parent_title': item['parent_title'], - 'index': item['media_index'], + 'media_index': item['media_index'], 'studio': item['studio'], 'title': item['title'], 'content_rating': item['content_rating'], @@ -814,7 +825,9 @@ class DataFactory(object): 'writers': writers, 'directors': directors, 'genres': genres, - 'actors': actors + 'actors': actors, + 'library_title': item['section_name'], + 'library_id': item['library_id'] } return metadata @@ -1051,6 +1064,10 @@ class DataFactory(object): if mapping: logger.info(u"PlexPy DataFactory :: Updating rating keys in the database.") for old_key, new_key in mapping.iteritems(): + # check library_id (1 table) + monitor_db.action('UPDATE session_history_metadata SET library_id = ? WHERE rating_key = ?', + [new_key_list['library_id'], old_key]) + # check rating_key (3 tables) monitor_db.action('UPDATE session_history SET rating_key = ? WHERE rating_key = ?', [new_key, old_key]) @@ -1135,3 +1152,54 @@ class DataFactory(object): total_duration = item['total_duration'] return total_duration + + def update_library_ids(self): + from plexpy import pmsconnect + + pms_connect = pmsconnect.PmsConnect() + monitor_db = database.MonitorDatabase() + + try: + query = 'SELECT id, rating_key FROM session_history_metadata WHERE library_id IS NULL' + result = monitor_db.select(query=query) + except: + logger.warn("Unable to execute database query for update_library_id.") + return None + + for item in result: + id = item[0] + rating_key = item[1] + + result = pms_connect.get_metadata_details(rating_key=rating_key) + + if result: + metadata = result['metadata'] + + section_keys = {'id': id} + section_values = {'library_id': metadata['library_id']} + + monitor_db.upsert('session_history_metadata', key_dict=section_keys, value_dict=section_values) + else: + continue + + return True + + def update_library_sections(self): + from plexpy import pmsconnect + + pms_connect = pmsconnect.PmsConnect() + library_sections = pms_connect.get_server_children() + + if library_sections: + if library_sections['libraries_count'] != '0': + monitor_db = database.MonitorDatabase() + + for section in library_sections['libraries_list']: + section_keys = {'section_id': section['key']} + section_values = {'section_id': section['key'], + 'section_name': section['title'], + 'section_type': section['type']} + + monitor_db.upsert('library_sections', key_dict=section_keys, value_dict=section_values) + + return True \ No newline at end of file diff --git a/plexpy/plexwatch_import.py b/plexpy/plexwatch_import.py index b92be702..e586933a 100644 --- a/plexpy/plexwatch_import.py +++ b/plexpy/plexwatch_import.py @@ -41,6 +41,7 @@ def extract_plexwatch_xml(xml=None): grandparent_thumb = helpers.get_xml_attr(a, 'grandparentThumb') grandparent_title = helpers.get_xml_attr(a, 'grandparentTitle') guid = helpers.get_xml_attr(a, 'guid') + library_id = helpers.get_xml_attr(a, 'librarySectionID') media_index = helpers.get_xml_attr(a, 'index') originally_available_at = helpers.get_xml_attr(a, 'originallyAvailableAt') last_viewed_at = helpers.get_xml_attr(a, 'lastViewedAt') @@ -156,6 +157,7 @@ def extract_plexwatch_xml(xml=None): 'title': title, 'tagline': tagline, 'guid': guid, + 'library_id': library_id, 'media_index': media_index, 'originally_available_at': originally_available_at, 'last_viewed_at': last_viewed_at, @@ -352,8 +354,8 @@ def import_from_plexwatch(database=None, table_name=None, import_ignore_interval 'title': row['title'], 'parent_title': extracted_xml['parent_title'], 'grandparent_title': row['grandparent_title'], - 'index': extracted_xml['media_index'], - 'parent_index': extracted_xml['parent_media_index'], + 'media_index': extracted_xml['media_index'], + 'parent_media_index': extracted_xml['parent_media_index'], 'thumb': extracted_xml['thumb'], 'parent_thumb': extracted_xml['parent_thumb'], 'grandparent_thumb': extracted_xml['grandparent_thumb'], @@ -370,6 +372,7 @@ def import_from_plexwatch(database=None, table_name=None, import_ignore_interval 'rating': extracted_xml['rating'], 'duration': extracted_xml['duration'], 'guid': extracted_xml['guid'], + 'library_id': extracted_xml['library_id'], 'directors': extracted_xml['directors'], 'writers': extracted_xml['writers'], 'actors': extracted_xml['actors'], @@ -409,4 +412,3 @@ def import_users(): logger.debug(u"PlexPy Importer :: Users imported.") except: logger.debug(u"PlexPy Importer :: Failed to import users.") - diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index 2fc84a2f..0e2a2654 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -398,6 +398,10 @@ class PmsConnect(object): metadata_type = helpers.get_xml_attr(metadata_main, 'type') else: logger.debug(u"Metadata failed") + return None + + library_id = helpers.get_xml_attr(a, 'librarySectionID') + library_title = helpers.get_xml_attr(a, 'librarySectionTitle') genres = [] actors = [] @@ -420,13 +424,48 @@ class PmsConnect(object): for director in metadata_main.getElementsByTagName('Director'): directors.append(helpers.get_xml_attr(director, 'tag')) - if metadata_type == 'show': + if metadata_type == 'movie': metadata = {'media_type': metadata_type, + 'library_id': library_id, + 'library_title': library_title, 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), + 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), - 'index': helpers.get_xml_attr(metadata_main, 'index'), + 'media_index': helpers.get_xml_attr(metadata_main, 'index'), + 'studio': helpers.get_xml_attr(metadata_main, 'studio'), + 'title': helpers.get_xml_attr(metadata_main, 'title'), + 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'), + 'summary': helpers.get_xml_attr(metadata_main, 'summary'), + 'tagline': helpers.get_xml_attr(metadata_main, 'tagline'), + 'rating': helpers.get_xml_attr(metadata_main, 'rating'), + 'duration': helpers.get_xml_attr(metadata_main, 'duration'), + 'year': helpers.get_xml_attr(metadata_main, 'year'), + 'thumb': helpers.get_xml_attr(metadata_main, 'thumb'), + 'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'), + 'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'), + 'art': helpers.get_xml_attr(metadata_main, 'art'), + 'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'), + 'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'), + 'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'), + 'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'), + 'guid': helpers.get_xml_attr(metadata_main, 'guid'), + 'genres': genres, + 'actors': actors, + 'writers': writers, + 'directors': directors + } + metadata_list = {'metadata': metadata} + + elif metadata_type == 'show': + metadata = {'media_type': metadata_type, + 'library_id': library_id, + 'library_title': library_title, + 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), + 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), + 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), + 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'studio': helpers.get_xml_attr(metadata_main, 'studio'), 'title': helpers.get_xml_attr(metadata_main, 'title'), 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'), @@ -450,16 +489,19 @@ class PmsConnect(object): 'actors': actors } metadata_list = {'metadata': metadata} + elif metadata_type == 'season': parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey') show_details = self.get_metadata_details(parent_rating_key) metadata = {'media_type': metadata_type, + 'library_id': library_id, + 'library_title': library_title, 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), 'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), + 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), - 'index': helpers.get_xml_attr(metadata_main, 'index'), + 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'studio': show_details['metadata']['studio'], 'title': helpers.get_xml_attr(metadata_main, 'title'), 'content_rating': show_details['metadata']['content_rating'], @@ -483,17 +525,20 @@ class PmsConnect(object): 'directors': show_details['metadata']['directors'] } metadata_list = {'metadata': metadata} + elif metadata_type == 'episode': grandparent_rating_key = helpers.get_xml_attr(metadata_main, 'grandparentRatingKey') show_details = self.get_metadata_details(grandparent_rating_key) metadata = {'media_type': metadata_type, + 'library_id': library_id, + 'library_title': library_title, 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), 'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'), 'grandparent_rating_key': helpers.get_xml_attr(metadata_main, 'grandparentRatingKey'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), + 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), - 'index': helpers.get_xml_attr(metadata_main, 'index'), + 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'studio': show_details['metadata']['studio'], 'title': helpers.get_xml_attr(metadata_main, 'title'), 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'), @@ -517,43 +562,16 @@ class PmsConnect(object): 'directors': directors } metadata_list = {'metadata': metadata} - elif metadata_type == 'movie': - metadata = {'media_type': metadata_type, - 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), - 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), - 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), - 'index': helpers.get_xml_attr(metadata_main, 'index'), - 'studio': helpers.get_xml_attr(metadata_main, 'studio'), - 'title': helpers.get_xml_attr(metadata_main, 'title'), - 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'), - 'summary': helpers.get_xml_attr(metadata_main, 'summary'), - 'tagline': helpers.get_xml_attr(metadata_main, 'tagline'), - 'rating': helpers.get_xml_attr(metadata_main, 'rating'), - 'duration': helpers.get_xml_attr(metadata_main, 'duration'), - 'year': helpers.get_xml_attr(metadata_main, 'year'), - 'thumb': helpers.get_xml_attr(metadata_main, 'thumb'), - 'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'), - 'grandparent_thumb': helpers.get_xml_attr(metadata_main, 'grandparentThumb'), - 'art': helpers.get_xml_attr(metadata_main, 'art'), - 'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'), - 'added_at': helpers.get_xml_attr(metadata_main, 'addedAt'), - 'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'), - 'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'), - 'guid': helpers.get_xml_attr(metadata_main, 'guid'), - 'genres': genres, - 'actors': actors, - 'writers': writers, - 'directors': directors - } - metadata_list = {'metadata': metadata} + elif metadata_type == 'artist': metadata = {'media_type': metadata_type, + 'library_id': library_id, + 'library_title': library_title, 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), + 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), - 'index': helpers.get_xml_attr(metadata_main, 'index'), + 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'studio': helpers.get_xml_attr(metadata_main, 'studio'), 'title': helpers.get_xml_attr(metadata_main, 'title'), 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'), @@ -577,16 +595,19 @@ class PmsConnect(object): 'actors': actors } metadata_list = {'metadata': metadata} + elif metadata_type == 'album': parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey') artist_details = self.get_metadata_details(parent_rating_key) metadata = {'media_type': metadata_type, + 'library_id': library_id, + 'library_title': library_title, 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), 'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), + 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), - 'index': helpers.get_xml_attr(metadata_main, 'index'), + 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'studio': helpers.get_xml_attr(metadata_main, 'studio'), 'title': helpers.get_xml_attr(metadata_main, 'title'), 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'), @@ -610,17 +631,20 @@ class PmsConnect(object): 'directors': directors } metadata_list = {'metadata': metadata} + elif metadata_type == 'track': parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey') album_details = self.get_metadata_details(parent_rating_key) metadata = {'media_type': metadata_type, + 'library_id': library_id, + 'library_title': library_title, 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'), 'parent_rating_key': helpers.get_xml_attr(metadata_main, 'parentRatingKey'), 'grandparent_rating_key': helpers.get_xml_attr(metadata_main, 'grandparentRatingKey'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), + 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), - 'index': helpers.get_xml_attr(metadata_main, 'index'), + 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'studio': helpers.get_xml_attr(metadata_main, 'studio'), 'title': helpers.get_xml_attr(metadata_main, 'title'), 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'), @@ -644,6 +668,7 @@ class PmsConnect(object): 'directors': directors } metadata_list = {'metadata': metadata} + else: return None @@ -663,7 +688,6 @@ class PmsConnect(object): xml_head = metadata.getElementsByTagName('MediaContainer') except: logger.warn("Unable to parse XML for get_metadata_children.") - return [] metadata_list = [] @@ -692,6 +716,53 @@ class PmsConnect(object): output = {'metadata': metadata_list} return output + """ + Return processed and validated metadata list for requested library. + + Parameters required: library_id { Plex library key } + + Output: array + """ + def get_library_metadata_details(self, library_id=''): + libraries_data = self.get_libraries_list(output_format='xml') + + try: + xml_head = libraries_data.getElementsByTagName('MediaContainer') + except: + logger.warn("Unable to parse XML for get_library_metadata_details.") + return [] + + metadata_list = [] + + for a in xml_head: + if a.getAttribute('size'): + if a.getAttribute('size') == '0': + metadata_list = {'metadata': None} + return metadata_list + + if a.getElementsByTagName('Directory'): + result_data = a.getElementsByTagName('Directory') + for result in result_data: + key = helpers.get_xml_attr(result, 'key') + if key == library_id: + metadata = {'media_type': 'library', + 'library_id': helpers.get_xml_attr(result, 'key'), + 'library': helpers.get_xml_attr(result, 'type'), + 'title': helpers.get_xml_attr(result, 'title'), + 'art': helpers.get_xml_attr(result, 'art'), + 'thumb': helpers.get_xml_attr(result, 'thumb') + } + if metadata['library'] == 'movie': + metadata['section_type'] = 'movie' + elif metadata['library'] == 'show': + metadata['section_type'] = 'episode' + elif metadata['library'] == 'artist': + metadata['section_type'] = 'track' + + metadata_list = {'metadata': metadata} + + return metadata_list + """ Return processed and validated session list. @@ -1215,7 +1286,7 @@ class PmsConnect(object): if result_data: for result in result_data: children_output = {'rating_key': helpers.get_xml_attr(result, 'ratingKey'), - 'index': helpers.get_xml_attr(result, 'index'), + 'media_index': helpers.get_xml_attr(result, 'index'), 'title': helpers.get_xml_attr(result, 'title'), 'thumb': helpers.get_xml_attr(result, 'thumb'), 'parent_thumb': helpers.get_xml_attr(a, 'thumb'), @@ -1430,7 +1501,8 @@ class PmsConnect(object): continue if library_list['library_count'] != '0': - library_stats = {'title': library['title'], + library_stats = {'key': library['key'], + 'title': library['title'], 'thumb': library['thumb'], 'count': library_list['library_count'], 'count_type': library_list['count_type'] @@ -1589,12 +1661,17 @@ class PmsConnect(object): match_type = 'title' else: match_type = 'index' - + + library_id = None + library_title = None + # get grandparent rating key if media_type == 'season' or media_type == 'album': try: metadata = self.get_metadata_details(rating_key=rating_key) rating_key = metadata['metadata']['parent_rating_key'] + library_id = metadata['metadata']['library_id'] + library_title = metadata['metadata']['library_title'] except: logger.warn("Unable to get parent_rating_key for get_rating_keys_list.") return {} @@ -1603,6 +1680,8 @@ class PmsConnect(object): try: metadata = self.get_metadata_details(rating_key=rating_key) rating_key = metadata['metadata']['grandparent_rating_key'] + library_id = metadata['metadata']['library_id'] + library_title = metadata['metadata']['library_title'] except: logger.warn("Unable to get grandparent_rating_key for get_rating_keys_list.") return {} @@ -1668,14 +1747,16 @@ class PmsConnect(object): key = int(parent_index) if match_type == 'index' else parent_title parents.update({key: - {'rating_key': int(parent_rating_key), - 'children': children} - }) + {'rating_key': int(parent_rating_key), + 'children': children} + }) key = 0 if match_type == 'index' else title key_list = {key: {'rating_key': int(rating_key), - 'children': parents} + 'children': parents }, + 'library_id': library_id, + 'library_title': library_title } return key_list diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 79ba325a..d80a86e3 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -167,6 +167,10 @@ class WebInterface(object): @cherrypy.expose def history(self): + # Make sure our library sections are up to date. + data_factory = datafactory.DataFactory() + data_factory.update_library_sections() + return serve_template(templatename="history.html", title="History") @cherrypy.expose @@ -623,6 +627,9 @@ class WebInterface(object): if 'reference_id' in kwargs: reference_id = kwargs.get('reference_id', "") custom_where.append(['session_history.reference_id', reference_id]) + if 'library_id' in kwargs: + library_id = kwargs.get('library_id', "") + custom_where.append(['session_history_metadata.library_id', library_id]) if 'media_type' in kwargs: media_type = kwargs.get('media_type', "") if media_type != 'all': @@ -838,23 +845,27 @@ class WebInterface(object): return None @cherrypy.expose - def info(self, item_id=None, source=None, **kwargs): + def info(self, library_id=None, item_id=None, source=None, query=None, **kwargs): + # Make sure our library sections are up to date. + data_factory = datafactory.DataFactory() + data_factory.update_library_sections() + metadata = None - query = None + query_string = query config = { - "pms_identifier": plexpy.CONFIG.PMS_IDENTIFIER + "pms_identifier": plexpy.CONFIG.PMS_IDENTIFIER, + "update_library_ids": plexpy.CONFIG.UPDATE_LIBRARY_IDS } if source == 'history': data_factory = datafactory.DataFactory() metadata = data_factory.get_metadata_details(row_id=item_id) - elif item_id == 'movie': - metadata = {'media_type': 'library', 'library': 'movie', 'media_type_filter': 'movie', 'title': 'Movies'} - elif item_id == 'show': - metadata = {'media_type': 'library', 'library': 'show', 'media_type_filter': 'episode', 'title': 'TV Shows'} - elif item_id == 'artist': - metadata = {'media_type': 'library', 'library': 'artist', 'media_type_filter': 'track', 'title': 'Music'} + elif library_id: + pms_connect = pmsconnect.PmsConnect() + result = pms_connect.get_library_metadata_details(library_id=library_id) + if result: + metadata = result['metadata'] else: pms_connect = pmsconnect.PmsConnect() result = pms_connect.get_metadata_details(rating_key=item_id) @@ -863,6 +874,8 @@ class WebInterface(object): else: data_factory = datafactory.DataFactory() query = data_factory.get_search_query(rating_key=item_id) + if query_string: + query['query_string'] = query_string if metadata: return serve_template(templatename="info.html", data=metadata, title="Info", config=config) @@ -1527,7 +1540,7 @@ class WebInterface(object): result['results_list'] = {media_type: result['results_list'][media_type]} if media_type == 'season' and season_index: for season in result['results_list']['season']: - if season['index'] == season_index: + if season['media_index'] == season_index: result['results_list']['season'] = [season] break @@ -1616,3 +1629,33 @@ class WebInterface(object): if servers: cherrypy.response.headers['Content-type'] = 'application/json' return servers + + @cherrypy.expose + def update_library_ids(self, **kwargs): + + logger.debug(u"Updating library_id's in database.") + data_factory = datafactory.DataFactory() + result = data_factory.update_library_ids() + + if result: + logger.debug(u"Updated all library_id's in database.") + plexpy.CONFIG.UPDATE_LIBRARY_IDS = 0 + plexpy.CONFIG.write() + return "Library ids updated." + else: + logger.debug(u"Unable to update library_id's in database.") + return "Unable to update library ids in database." + + @cherrypy.expose + def update_library_sections(self, **kwargs): + + logger.debug(u"Updating library sections in database.") + data_factory = datafactory.DataFactory() + result = data_factory.update_library_sections() + + if result: + logger.debug(u"Updated all library sections in database.") + return "Library sections updated." + else: + logger.debug(u"Unable to update library sections in database.") + return "Unable to update library sections in database." From 771885f27f6f2cade44de463ecfec0b466270de8 Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Sun, 15 Nov 2015 11:19:34 -0800 Subject: [PATCH 02/23] Add update metadata feature * Use rating_key instead of item_id for history info --- data/interfaces/default/current_activity.html | 10 +- data/interfaces/default/home_stats.html | 56 ++--- data/interfaces/default/info.html | 187 ++-------------- .../default/info_children_list.html | 2 +- .../default/info_search_results_list.html | 14 +- .../default/js/tables/history_table.js | 8 +- .../default/js/tables/history_table_modal.js | 8 +- .../default/js/tables/sync_table.js | 2 +- data/interfaces/default/js/tables/user_ips.js | 8 +- data/interfaces/default/js/tables/users.js | 8 +- data/interfaces/default/recently_added.html | 4 +- data/interfaces/default/update_metadata.html | 200 ++++++++++++++++++ .../default/user_recently_watched.html | 4 +- plexpy/datafactory.py | 152 +++++++------ plexpy/pmsconnect.py | 78 ++++--- plexpy/webserve.py | 74 ++++--- 16 files changed, 448 insertions(+), 367 deletions(-) create mode 100644 data/interfaces/default/update_metadata.html diff --git a/data/interfaces/default/current_activity.html b/data/interfaces/default/current_activity.html index 54d612fd..bb0949e0 100644 --- a/data/interfaces/default/current_activity.html +++ b/data/interfaces/default/current_activity.html @@ -69,7 +69,7 @@ DOCUMENTATION :: END % for a in data['sessions']:
% if a['media_type'] == 'movie' or a['media_type'] == 'episode' or a['media_type'] == 'track': - + % endif
% if a['media_type'] == 'movie' and not a['indexes']: @@ -227,13 +227,13 @@ DOCUMENTATION :: END   % endif % if a['media_type'] == 'episode': - ${a['grandparent_title']} - ${a['title']} + ${a['grandparent_title']} - ${a['title']} % elif a['media_type'] == 'movie': - ${a['title']} + ${a['title']} % elif a['media_type'] == 'clip': ${a['title']} % elif a['media_type'] == 'track': - ${a['grandparent_title']} - ${a['title']} + ${a['grandparent_title']} - ${a['title']} % elif a['media_type'] == 'photo': ${a['parent_title']} % else: @@ -246,7 +246,7 @@ DOCUMENTATION :: END % elif a['media_type'] == 'movie': ${a['year']} % elif a['media_type'] == 'track': - ${a['parent_title']} + ${a['parent_title']} % elif a['media_type'] == 'photo': ${a['title']} % else: diff --git a/data/interfaces/default/home_stats.html b/data/interfaces/default/home_stats.html index fa4ac42d..419bf1b9 100644 --- a/data/interfaces/default/home_stats.html +++ b/data/interfaces/default/home_stats.html @@ -83,7 +83,7 @@ DOCUMENTATION :: END

- + ${top_stat['rows'][0]['title']}

@@ -95,7 +95,7 @@ DOCUMENTATION :: END % endif
- + % if top_stat['rows'][0]['grandparent_thumb']: - + % if top_stat['rows'][0]['grandparent_thumb'] != '': - + % if top_stat['rows'][0]['thumb']: - + % if top_stat['rows'][0]['thumb']: - + % if top_stat['rows'][0]['grandparent_thumb']: - + % if top_stat['rows'][0]['grandparent_thumb'] != '': - + % if top_stat['rows'][0]['thumb']:
@@ -741,7 +741,7 @@ DOCUMENTATION :: END
- + ${top_stat['rows'][loop.index]['title']}
@@ -765,7 +765,7 @@ DOCUMENTATION :: END

- + % if top_stat['rows'][loop.index]['thumb']:
diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index efcdaf56..b6c3a51e 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -32,19 +32,6 @@ directors Returns an array of directors. studio Returns the name of the studio. originally_available_at Returns the air date of the item. -query :: Usable parameters - -== Global keys == -query_string Returns the string used for the search query. -title Returns the name of the movie, episode, or track. -parent_title Returns the name of the album. -grandparent_title Returns the name of the show, or artist. -media_index Returns the index number of the episode, or track. -parent_media_index Returns the index number of the season. -year Returns the release year of the movie, or show. -media_type Returns the type of media. Either 'movie', 'show', 'season', 'episode', 'artist', 'album', or 'track'. -rating_key Returns the unique identifier for the media item. - DOCUMENTATION :: END @@ -76,24 +63,24 @@ DOCUMENTATION :: END
  • ${data['title']}
  • % elif data['media_type'] == 'season':
    -
  • ${data['parent_title']}
  • +
  • ${data['parent_title']}
  • Season ${data['media_index']}
  • % elif data['media_type'] == 'episode': - -
  • Season ${data['parent_media_index']}
  • + +
  • Season ${data['parent_media_index']}
  • Episode ${data['media_index']} - ${data['title']}
  • % elif data['media_type'] == 'artist':
  • ${data['library_title']}
  • ${data['title']}
  • % elif data['media_type'] == 'album': -
  • ${data['parent_title']}
  • +
  • ${data['parent_title']}
  • ${data['title']}
  • % elif data['media_type'] == 'track': - -
  • ${data['parent_title']}
  • + +
  • ${data['parent_title']}
  • Track ${data['media_index']} - ${data['title']}
  • % endif @@ -134,18 +121,18 @@ DOCUMENTATION :: END % if data['media_type'] == 'movie' or data['media_type'] == 'show' or data['media_type'] == 'artist':

     

    ${data['title']}

    % elif data['media_type'] == 'season': -

     

    ${data['parent_title']}

    +

     

    ${data['parent_title']}

    % elif data['media_type'] == 'episode': -

    ${data['grandparent_title']}

    +

    ${data['grandparent_title']}

    ${data['title']}

    % elif data['media_type'] == 'album': -

    ${data['parent_title']}

    +

    ${data['parent_title']}

    ${data['title']}

    % elif data['media_type'] == 'track': -

    ${data['grandparent_title']}

    -

    ${data['parent_title']} - ${data['title']}

    +

    ${data['grandparent_title']}

    +

    ${data['parent_title']} - ${data['title']}

    % endif
    @@ -374,111 +361,6 @@ DOCUMENTATION :: END
    -% else: -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - Error retrieving item metadata. This media item is not available in the Plex Media Server library. -
    - % if query: -
    - If the item has been moved, please select the correct match below to update the PlexPy database. -
    -
    -
    - Search Results for ${query['query_string']} -
    -
    -
    -
      Loading search results...
    -
    - - % endif -
    -
    -
    -
    -
    % endif @@ -618,13 +500,10 @@ DOCUMENTATION :: END % endif % if data['media_type'] != 'library': - % endif % if data['media_type'] != 'library' and data['rating']: -% elif query: - % endif diff --git a/data/interfaces/default/info_children_list.html b/data/interfaces/default/info_children_list.html index cae9425b..decb2049 100644 --- a/data/interfaces/default/info_children_list.html +++ b/data/interfaces/default/info_children_list.html @@ -37,7 +37,7 @@ DOCUMENTATION :: END % else:
  • % endif - + %if data['children_type'] == 'season':
    % if child['thumb']: diff --git a/data/interfaces/default/info_search_results_list.html b/data/interfaces/default/info_search_results_list.html index 7b83fbcb..a233e735 100644 --- a/data/interfaces/default/info_search_results_list.html +++ b/data/interfaces/default/info_search_results_list.html @@ -62,7 +62,7 @@ DOCUMENTATION :: END