mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-10 23:42:37 -07:00
Add metadata labels to database
This commit is contained in:
parent
03faebe776
commit
ae60b21375
7 changed files with 216 additions and 69 deletions
|
@ -438,7 +438,8 @@ def dbcheck():
|
||||||
'parent_media_index INTEGER, section_id INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, '
|
'parent_media_index INTEGER, section_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, '
|
'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, '
|
'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)'
|
'duration INTEGER DEFAULT 0, guid TEXT, directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT, '
|
||||||
|
'labels TEXT)'
|
||||||
)
|
)
|
||||||
|
|
||||||
# users table :: This table keeps record of the friends list
|
# users table :: This table keeps record of the friends list
|
||||||
|
@ -692,6 +693,15 @@ def dbcheck():
|
||||||
'ALTER TABLE session_history_metadata ADD COLUMN section_id INTEGER'
|
'ALTER TABLE session_history_metadata ADD COLUMN section_id INTEGER'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Upgrade session_history_metadata table from earlier versions
|
||||||
|
try:
|
||||||
|
c_db.execute('SELECT labels 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 labels TEXT'
|
||||||
|
)
|
||||||
|
|
||||||
# Upgrade session_history_media_info table from earlier versions
|
# Upgrade session_history_media_info table from earlier versions
|
||||||
try:
|
try:
|
||||||
c_db.execute('SELECT transcode_decision FROM session_history_media_info')
|
c_db.execute('SELECT transcode_decision FROM session_history_media_info')
|
||||||
|
|
|
@ -278,6 +278,7 @@ class ActivityProcessor(object):
|
||||||
writers = ";".join(metadata['writers'])
|
writers = ";".join(metadata['writers'])
|
||||||
actors = ";".join(metadata['actors'])
|
actors = ";".join(metadata['actors'])
|
||||||
genres = ";".join(metadata['genres'])
|
genres = ";".join(metadata['genres'])
|
||||||
|
labels = ";".join(metadata['labels'])
|
||||||
|
|
||||||
# Build media item title
|
# Build media item title
|
||||||
if session['media_type'] == 'episode' or session['media_type'] == 'track':
|
if session['media_type'] == 'episode' or session['media_type'] == 'track':
|
||||||
|
@ -292,9 +293,9 @@ class ActivityProcessor(object):
|
||||||
'grandparent_rating_key, title, parent_title, grandparent_title, full_title, media_index, ' \
|
'grandparent_rating_key, title, parent_title, grandparent_title, full_title, media_index, ' \
|
||||||
'parent_media_index, section_id, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \
|
'parent_media_index, section_id, thumb, parent_thumb, grandparent_thumb, art, media_type, ' \
|
||||||
'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, ' \
|
'year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, ' \
|
||||||
'summary, tagline, rating, duration, guid, directors, writers, actors, genres, studio) VALUES ' \
|
'summary, tagline, rating, duration, guid, directors, writers, actors, genres, studio, labels) ' \
|
||||||
'(last_insert_rowid(), ' \
|
'VALUES (last_insert_rowid(), ' \
|
||||||
'?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
'?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
|
||||||
|
|
||||||
args = [session['rating_key'], session['parent_rating_key'], session['grandparent_rating_key'],
|
args = [session['rating_key'], session['parent_rating_key'], session['grandparent_rating_key'],
|
||||||
session['title'], session['parent_title'], session['grandparent_title'], full_title,
|
session['title'], session['parent_title'], session['grandparent_title'], full_title,
|
||||||
|
@ -303,7 +304,7 @@ class ActivityProcessor(object):
|
||||||
metadata['year'], metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'],
|
metadata['year'], metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'],
|
||||||
metadata['last_viewed_at'], metadata['content_rating'], metadata['summary'], metadata['tagline'],
|
metadata['last_viewed_at'], metadata['content_rating'], metadata['summary'], metadata['tagline'],
|
||||||
metadata['rating'], metadata['duration'], metadata['guid'], directors, writers, actors, genres,
|
metadata['rating'], metadata['duration'], metadata['guid'], directors, writers, actors, genres,
|
||||||
metadata['studio']]
|
metadata['studio'], labels]
|
||||||
|
|
||||||
# logger.debug(u"PlexPy ActivityProcessor :: Writing session_history_metadata transaction...")
|
# logger.debug(u"PlexPy ActivityProcessor :: Writing session_history_metadata transaction...")
|
||||||
self.db.action(query=query, args=args)
|
self.db.action(query=query, args=args)
|
||||||
|
|
|
@ -418,6 +418,7 @@ _CONFIG_DEFINITIONS = {
|
||||||
'TWITTER_ON_PMSUPDATE': (int, 'Twitter', 0),
|
'TWITTER_ON_PMSUPDATE': (int, 'Twitter', 0),
|
||||||
'UPDATE_DB_INTERVAL': (int, 'General', 24),
|
'UPDATE_DB_INTERVAL': (int, 'General', 24),
|
||||||
'UPDATE_SECTION_IDS': (int, 'General', 1),
|
'UPDATE_SECTION_IDS': (int, 'General', 1),
|
||||||
|
'UPDATE_LABELS': (int, 'General', 1),
|
||||||
'VERIFY_SSL_CERT': (bool_int, 'Advanced', 1),
|
'VERIFY_SSL_CERT': (bool_int, 'Advanced', 1),
|
||||||
'VIDEO_LOGGING_ENABLE': (int, 'Monitoring', 1),
|
'VIDEO_LOGGING_ENABLE': (int, 'Monitoring', 1),
|
||||||
'XBMC_ENABLED': (int, 'XBMC', 0),
|
'XBMC_ENABLED': (int, 'XBMC', 0),
|
||||||
|
|
|
@ -1155,6 +1155,7 @@ class DataFactory(object):
|
||||||
writers = ";".join(metadata['writers'])
|
writers = ";".join(metadata['writers'])
|
||||||
actors = ";".join(metadata['actors'])
|
actors = ";".join(metadata['actors'])
|
||||||
genres = ";".join(metadata['genres'])
|
genres = ";".join(metadata['genres'])
|
||||||
|
labels = ";".join(metadata['labels'])
|
||||||
|
|
||||||
#logger.info(u"PlexPy DataFactory :: Updating metadata in the database for rating key: %s." % new_rating_key)
|
#logger.info(u"PlexPy DataFactory :: Updating metadata in the database for rating key: %s." % new_rating_key)
|
||||||
monitor_db = database.MonitorDatabase()
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
|
@ -18,18 +18,9 @@ from plexpy import logger, datatables, common, database, helpers, session
|
||||||
|
|
||||||
def update_section_ids():
|
def update_section_ids():
|
||||||
from plexpy import pmsconnect, activity_pinger
|
from plexpy import pmsconnect, activity_pinger
|
||||||
#import threading
|
|
||||||
|
|
||||||
plexpy.CONFIG.UPDATE_SECTION_IDS = -1
|
plexpy.CONFIG.UPDATE_SECTION_IDS = -1
|
||||||
|
|
||||||
#logger.debug(u"PlexPy Libraries :: Disabling monitoring while update in progress.")
|
|
||||||
#plexpy.schedule_job(activity_pinger.check_active_sessions, 'Check for active sessions',
|
|
||||||
# hours=0, minutes=0, seconds=0)
|
|
||||||
#plexpy.schedule_job(activity_pinger.check_recently_added, 'Check for recently added items',
|
|
||||||
# hours=0, minutes=0, seconds=0)
|
|
||||||
#plexpy.schedule_job(activity_pinger.check_server_response, 'Check for server response',
|
|
||||||
# hours=0, minutes=0, seconds=0)
|
|
||||||
|
|
||||||
monitor_db = database.MonitorDatabase()
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -44,9 +35,6 @@ def update_section_ids():
|
||||||
logger.warn(u"PlexPy Libraries :: Unable to update section_id's in database.")
|
logger.warn(u"PlexPy Libraries :: Unable to update section_id's in database.")
|
||||||
plexpy.CONFIG.UPDATE_SECTION_IDS = 1
|
plexpy.CONFIG.UPDATE_SECTION_IDS = 1
|
||||||
plexpy.CONFIG.write()
|
plexpy.CONFIG.write()
|
||||||
|
|
||||||
#logger.debug(u"PlexPy Libraries :: Re-enabling monitoring.")
|
|
||||||
#plexpy.initialize_scheduler()
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if not history_results:
|
if not history_results:
|
||||||
|
@ -54,13 +42,7 @@ def update_section_ids():
|
||||||
plexpy.CONFIG.write()
|
plexpy.CONFIG.write()
|
||||||
return None
|
return None
|
||||||
|
|
||||||
logger.info(u"PlexPy Libraries :: Updating section_id's in database.")
|
logger.debug(u"PlexPy Libraries :: Updating section_id's in database.")
|
||||||
|
|
||||||
# Add thread filter to the logger
|
|
||||||
#logger.debug(u"PlexPy Libraries :: Disabling logging in the current thread while update in progress.")
|
|
||||||
#thread_filter = logger.NoThreadFilter(threading.current_thread().name)
|
|
||||||
#for handler in logger.logger.handlers:
|
|
||||||
# handler.addFilter(thread_filter)
|
|
||||||
|
|
||||||
# Get rating_key: section_id mapping pairs
|
# Get rating_key: section_id mapping pairs
|
||||||
key_mappings = {}
|
key_mappings = {}
|
||||||
|
@ -94,11 +76,6 @@ def update_section_ids():
|
||||||
else:
|
else:
|
||||||
error_keys.add(item['rating_key'])
|
error_keys.add(item['rating_key'])
|
||||||
|
|
||||||
# Remove thread filter from the logger
|
|
||||||
#for handler in logger.logger.handlers:
|
|
||||||
# handler.removeFilter(thread_filter)
|
|
||||||
#logger.debug(u"PlexPy Libraries :: Re-enabling logging in the current thread.")
|
|
||||||
|
|
||||||
if error_keys:
|
if error_keys:
|
||||||
logger.info(u"PlexPy Libraries :: Updated all section_id's in database except for rating_keys: %s." %
|
logger.info(u"PlexPy Libraries :: Updated all section_id's in database except for rating_keys: %s." %
|
||||||
', '.join(str(key) for key in error_keys))
|
', '.join(str(key) for key in error_keys))
|
||||||
|
@ -108,11 +85,87 @@ def update_section_ids():
|
||||||
plexpy.CONFIG.UPDATE_SECTION_IDS = 0
|
plexpy.CONFIG.UPDATE_SECTION_IDS = 0
|
||||||
plexpy.CONFIG.write()
|
plexpy.CONFIG.write()
|
||||||
|
|
||||||
#logger.debug(u"PlexPy Libraries :: Re-enabling monitoring.")
|
return True
|
||||||
#plexpy.initialize_scheduler()
|
|
||||||
|
def update_labels():
|
||||||
|
from plexpy import pmsconnect
|
||||||
|
|
||||||
|
plexpy.CONFIG.UPDATE_LABELS = -1
|
||||||
|
|
||||||
|
monitor_db = database.MonitorDatabase()
|
||||||
|
|
||||||
|
try:
|
||||||
|
query = 'SELECT section_id, section_type FROM library_sections'
|
||||||
|
library_results = monitor_db.select(query=query)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warn(u"PlexPy Libraries :: Unable to execute database query for update_labels: %s." % e)
|
||||||
|
|
||||||
|
logger.warn(u"PlexPy Libraries :: Unable to update labels in database.")
|
||||||
|
plexpy.CONFIG.UPDATE_LABELS = 1
|
||||||
|
plexpy.CONFIG.write()
|
||||||
|
return None
|
||||||
|
|
||||||
|
if not library_results:
|
||||||
|
plexpy.CONFIG.UPDATE_LABELS = 0
|
||||||
|
plexpy.CONFIG.write()
|
||||||
|
return None
|
||||||
|
|
||||||
|
logger.debug(u"PlexPy Libraries :: Updating labels in database.")
|
||||||
|
|
||||||
|
# Get rating_key: section_id mapping pairs
|
||||||
|
key_mappings = {}
|
||||||
|
|
||||||
|
pms_connect = pmsconnect.PmsConnect()
|
||||||
|
for library in library_results:
|
||||||
|
section_id = library['section_id']
|
||||||
|
section_type = library['section_type']
|
||||||
|
|
||||||
|
if section_type != 'photo':
|
||||||
|
library_children = []
|
||||||
|
library_labels = pms_connect.get_library_label_details(section_id=section_id)
|
||||||
|
|
||||||
|
if library_labels:
|
||||||
|
for label in library_labels:
|
||||||
|
library_children = pms_connect.get_library_children_details(section_id=section_id,
|
||||||
|
section_type=section_type,
|
||||||
|
label_key=label['label_key'])
|
||||||
|
|
||||||
|
if library_children:
|
||||||
|
children_list = library_children['childern_list']
|
||||||
|
rating_key_list = [child['rating_key'] for child in children_list]
|
||||||
|
|
||||||
|
for rating_key in [child['rating_key'] for child in children_list]:
|
||||||
|
if key_mappings.get(rating_key):
|
||||||
|
key_mappings[rating_key].append(label['label_title'])
|
||||||
|
else:
|
||||||
|
key_mappings[rating_key] = [label['label_title']]
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.warn(u"PlexPy Libraries :: Unable to get a list of library items for section_id %s."
|
||||||
|
% section_id)
|
||||||
|
|
||||||
|
error_keys = set()
|
||||||
|
for rating_key, labels in key_mappings.iteritems():
|
||||||
|
try:
|
||||||
|
labels = ';'.join(labels)
|
||||||
|
monitor_db.action('UPDATE session_history_metadata SET labels = ? '
|
||||||
|
'WHERE rating_key = ? OR parent_rating_key = ? OR grandparent_rating_key = ? ',
|
||||||
|
args=[labels, rating_key, rating_key, rating_key])
|
||||||
|
except:
|
||||||
|
error_keys.add(rating_key)
|
||||||
|
|
||||||
|
if error_keys:
|
||||||
|
logger.info(u"PlexPy Libraries :: Updated all labels in database except for rating_keys: %s." %
|
||||||
|
', '.join(str(key) for key in error_keys))
|
||||||
|
else:
|
||||||
|
logger.info(u"PlexPy Libraries :: Updated all labels in database.")
|
||||||
|
|
||||||
|
plexpy.CONFIG.UPDATE_LABELS = 0
|
||||||
|
plexpy.CONFIG.write()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
class Libraries(object):
|
class Libraries(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -148,6 +148,12 @@ def extract_plexwatch_xml(xml=None):
|
||||||
for i in genre_elem:
|
for i in genre_elem:
|
||||||
genres.append(helpers.get_xml_attr(i, 'tag'))
|
genres.append(helpers.get_xml_attr(i, 'tag'))
|
||||||
|
|
||||||
|
labels = []
|
||||||
|
if a.getElementsByTagName('Lables'):
|
||||||
|
label_elem = a.getElementsByTagName('Lables')
|
||||||
|
for i in label_elem:
|
||||||
|
labels.append(helpers.get_xml_attr(i, 'tag'))
|
||||||
|
|
||||||
output = {'added_at': added_at,
|
output = {'added_at': added_at,
|
||||||
'art': art,
|
'art': art,
|
||||||
'duration': duration,
|
'duration': duration,
|
||||||
|
@ -196,7 +202,8 @@ def extract_plexwatch_xml(xml=None):
|
||||||
'writers': writers,
|
'writers': writers,
|
||||||
'actors': actors,
|
'actors': actors,
|
||||||
'genres': genres,
|
'genres': genres,
|
||||||
'studio': studio
|
'studio': studio,
|
||||||
|
'labels': labels
|
||||||
}
|
}
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
@ -380,6 +387,7 @@ def import_from_plexwatch(database=None, table_name=None, import_ignore_interval
|
||||||
'actors': extracted_xml['actors'],
|
'actors': extracted_xml['actors'],
|
||||||
'genres': extracted_xml['genres'],
|
'genres': extracted_xml['genres'],
|
||||||
'studio': extracted_xml['studio'],
|
'studio': extracted_xml['studio'],
|
||||||
|
'labels': extracted_xml['labels'],
|
||||||
'full_title': row['full_title']
|
'full_title': row['full_title']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,13 @@ def refresh_libraries():
|
||||||
# Start library section_id update on it's own thread
|
# Start library section_id update on it's own thread
|
||||||
threading.Thread(target=libraries.update_section_ids).start()
|
threading.Thread(target=libraries.update_section_ids).start()
|
||||||
|
|
||||||
|
if plexpy.CONFIG.UPDATE_LABELS == 1 or plexpy.CONFIG.UPDATE_LABELS == -1:
|
||||||
|
from plexpy import libraries
|
||||||
|
import threading
|
||||||
|
|
||||||
|
# Start library labels update on it's own thread
|
||||||
|
threading.Thread(target=libraries.update_labels).start()
|
||||||
|
|
||||||
logger.info(u"PlexPy Pmsconnect :: Libraries list refreshed.")
|
logger.info(u"PlexPy Pmsconnect :: Libraries list refreshed.")
|
||||||
else:
|
else:
|
||||||
logger.warn(u"PlexPy Pmsconnect :: Unable to refresh libraries list.")
|
logger.warn(u"PlexPy Pmsconnect :: Unable to refresh libraries list.")
|
||||||
|
@ -105,7 +112,16 @@ class PmsConnect(object):
|
||||||
port = plexpy.CONFIG.PMS_PORT
|
port = plexpy.CONFIG.PMS_PORT
|
||||||
self.protocol = 'http'
|
self.protocol = 'http'
|
||||||
|
|
||||||
token = token if token else plexpy.CONFIG.PMS_TOKEN
|
if token == 'admin':
|
||||||
|
token = plexpy.CONFIG.PMS_TOKEN
|
||||||
|
elif not token:
|
||||||
|
# Check if we should use the admin token, or the guest server token
|
||||||
|
if session.get_session_user_id():
|
||||||
|
user_data = users.Users()
|
||||||
|
user_tokens = user_data.get_tokens(user_id=session.get_session_user_id())
|
||||||
|
token = user_tokens['server_token']
|
||||||
|
else:
|
||||||
|
token = plexpy.CONFIG.PMS_TOKEN
|
||||||
|
|
||||||
self.request_handler = http_handler.HTTPHandler(host=hostname,
|
self.request_handler = http_handler.HTTPHandler(host=hostname,
|
||||||
port=port,
|
port=port,
|
||||||
|
@ -293,7 +309,7 @@ class PmsConnect(object):
|
||||||
|
|
||||||
return request
|
return request
|
||||||
|
|
||||||
def get_library_list(self, section_id='', list_type='all', count='0', sort_type='', output_format=''):
|
def get_library_list(self, section_id='', list_type='all', count='0', sort_type='', label_key='', output_format=''):
|
||||||
"""
|
"""
|
||||||
Return list of items in library on server.
|
Return list of items in library on server.
|
||||||
|
|
||||||
|
@ -302,8 +318,25 @@ class PmsConnect(object):
|
||||||
Output: array
|
Output: array
|
||||||
"""
|
"""
|
||||||
count = '&X-Plex-Container-Size=' + count if count else ''
|
count = '&X-Plex-Container-Size=' + count if count else ''
|
||||||
|
label_key = '&label=' + label_key if label_key else ''
|
||||||
|
|
||||||
uri = '/library/sections/' + section_id + '/' + list_type + '?X-Plex-Container-Start=0' + count + sort_type
|
uri = '/library/sections/' + section_id + '/' + list_type + '?X-Plex-Container-Start=0' + count + sort_type + label_key
|
||||||
|
request = self.request_handler.make_request(uri=uri,
|
||||||
|
proto=self.protocol,
|
||||||
|
request_type='GET',
|
||||||
|
output_format=output_format)
|
||||||
|
|
||||||
|
return request
|
||||||
|
|
||||||
|
def get_library_labels(self, section_id='', output_format=''):
|
||||||
|
"""
|
||||||
|
Return list of labels for a library on server.
|
||||||
|
|
||||||
|
Optional parameters: output_format { dict, json }
|
||||||
|
|
||||||
|
Output: array
|
||||||
|
"""
|
||||||
|
uri = '/library/sections/' + section_id + '/label'
|
||||||
request = self.request_handler.make_request(uri=uri,
|
request = self.request_handler.make_request(uri=uri,
|
||||||
proto=self.protocol,
|
proto=self.protocol,
|
||||||
request_type='GET',
|
request_type='GET',
|
||||||
|
@ -539,26 +572,31 @@ class PmsConnect(object):
|
||||||
section_id = helpers.get_xml_attr(a, 'librarySectionID')
|
section_id = helpers.get_xml_attr(a, 'librarySectionID')
|
||||||
library_name = helpers.get_xml_attr(a, 'librarySectionTitle')
|
library_name = helpers.get_xml_attr(a, 'librarySectionTitle')
|
||||||
|
|
||||||
genres = []
|
|
||||||
actors = []
|
|
||||||
writers = []
|
|
||||||
directors = []
|
directors = []
|
||||||
|
writers = []
|
||||||
|
actors = []
|
||||||
|
genres = []
|
||||||
|
labels = []
|
||||||
|
|
||||||
if metadata_main.getElementsByTagName('Genre'):
|
if metadata_main.getElementsByTagName('Director'):
|
||||||
for genre in metadata_main.getElementsByTagName('Genre'):
|
for director in metadata_main.getElementsByTagName('Director'):
|
||||||
genres.append(helpers.get_xml_attr(genre, 'tag'))
|
directors.append(helpers.get_xml_attr(director, 'tag'))
|
||||||
|
|
||||||
if metadata_main.getElementsByTagName('Role'):
|
|
||||||
for actor in metadata_main.getElementsByTagName('Role'):
|
|
||||||
actors.append(helpers.get_xml_attr(actor, 'tag'))
|
|
||||||
|
|
||||||
if metadata_main.getElementsByTagName('Writer'):
|
if metadata_main.getElementsByTagName('Writer'):
|
||||||
for writer in metadata_main.getElementsByTagName('Writer'):
|
for writer in metadata_main.getElementsByTagName('Writer'):
|
||||||
writers.append(helpers.get_xml_attr(writer, 'tag'))
|
writers.append(helpers.get_xml_attr(writer, 'tag'))
|
||||||
|
|
||||||
if metadata_main.getElementsByTagName('Director'):
|
if metadata_main.getElementsByTagName('Role'):
|
||||||
for director in metadata_main.getElementsByTagName('Director'):
|
for actor in metadata_main.getElementsByTagName('Role'):
|
||||||
directors.append(helpers.get_xml_attr(director, 'tag'))
|
actors.append(helpers.get_xml_attr(actor, 'tag'))
|
||||||
|
|
||||||
|
if metadata_main.getElementsByTagName('Genre'):
|
||||||
|
for genre in metadata_main.getElementsByTagName('Genre'):
|
||||||
|
genres.append(helpers.get_xml_attr(genre, 'tag'))
|
||||||
|
|
||||||
|
if metadata_main.getElementsByTagName('Label'):
|
||||||
|
for labels in metadata_main.getElementsByTagName('Label'):
|
||||||
|
labels.append(helpers.get_xml_attr(labels, 'tag'))
|
||||||
|
|
||||||
if metadata_type == 'movie':
|
if metadata_type == 'movie':
|
||||||
metadata = {'media_type': metadata_type,
|
metadata = {'media_type': metadata_type,
|
||||||
|
@ -588,10 +626,11 @@ class PmsConnect(object):
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
'genres': genres,
|
'directors': directors,
|
||||||
'actors': actors,
|
|
||||||
'writers': writers,
|
'writers': writers,
|
||||||
'directors': directors
|
'actors': actors,
|
||||||
|
'genres': genres,
|
||||||
|
'labels': labels
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
@ -623,10 +662,11 @@ class PmsConnect(object):
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
'writers': writers,
|
|
||||||
'directors': directors,
|
'directors': directors,
|
||||||
|
'writers': writers,
|
||||||
|
'actors': actors,
|
||||||
'genres': genres,
|
'genres': genres,
|
||||||
'actors': actors
|
'labels': labels
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
@ -660,10 +700,11 @@ class PmsConnect(object):
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
'genres': show_details['metadata']['genres'],
|
'directors': show_details['metadata']['directors'],
|
||||||
'actors': show_details['metadata']['actors'],
|
|
||||||
'writers': show_details['metadata']['writers'],
|
'writers': show_details['metadata']['writers'],
|
||||||
'directors': show_details['metadata']['directors']
|
'actors': show_details['metadata']['actors'],
|
||||||
|
'genres': show_details['metadata']['genres'],
|
||||||
|
'labels': show_details['metadata']['labels']
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
@ -697,10 +738,11 @@ class PmsConnect(object):
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
'genres': show_details['metadata']['genres'],
|
'directors': directors,
|
||||||
'actors': show_details['metadata']['actors'],
|
|
||||||
'writers': writers,
|
'writers': writers,
|
||||||
'directors': directors
|
'actors': show_details['metadata']['actors'],
|
||||||
|
'genres': show_details['metadata']['genres'],
|
||||||
|
'labels': show_details['metadata']['labels']
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
@ -732,10 +774,11 @@ class PmsConnect(object):
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
'writers': writers,
|
|
||||||
'directors': directors,
|
'directors': directors,
|
||||||
|
'writers': writers,
|
||||||
|
'actors': actors,
|
||||||
'genres': genres,
|
'genres': genres,
|
||||||
'actors': actors
|
'labels': labels
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
@ -769,10 +812,11 @@ class PmsConnect(object):
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
'genres': genres,
|
'directors': directors,
|
||||||
'actors': actors,
|
|
||||||
'writers': writers,
|
'writers': writers,
|
||||||
'directors': directors
|
'actors': actors,
|
||||||
|
'genres': genres,
|
||||||
|
'labels': labels
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
@ -806,10 +850,11 @@ class PmsConnect(object):
|
||||||
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
'updated_at': helpers.get_xml_attr(metadata_main, 'updatedAt'),
|
||||||
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
'last_viewed_at': helpers.get_xml_attr(metadata_main, 'lastViewedAt'),
|
||||||
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
'guid': helpers.get_xml_attr(metadata_main, 'guid'),
|
||||||
'genres': album_details['metadata']['genres'],
|
'directors': directors,
|
||||||
'actors': actors,
|
|
||||||
'writers': writers,
|
'writers': writers,
|
||||||
'directors': directors
|
'actors': actors,
|
||||||
|
'genres': album_details['metadata']['genres'],
|
||||||
|
'labels': album_details['metadata']['labels']
|
||||||
}
|
}
|
||||||
metadata_list = {'metadata': metadata}
|
metadata_list = {'metadata': metadata}
|
||||||
|
|
||||||
|
@ -1611,7 +1656,8 @@ class PmsConnect(object):
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def get_library_children_details(self, section_id='', section_type='', list_type='all', count='', rating_key='', get_media_info=False):
|
def get_library_children_details(self, section_id='', section_type='', list_type='all', count='',
|
||||||
|
rating_key='', label_key='', get_media_info=False):
|
||||||
"""
|
"""
|
||||||
Return processed and validated server library items list.
|
Return processed and validated server library items list.
|
||||||
|
|
||||||
|
@ -1645,7 +1691,7 @@ class PmsConnect(object):
|
||||||
sort_type = ''
|
sort_type = ''
|
||||||
|
|
||||||
if str(section_id).isdigit():
|
if str(section_id).isdigit():
|
||||||
library_data = self.get_library_list(str(section_id), list_type, count, sort_type, output_format='xml')
|
library_data = self.get_library_list(str(section_id), list_type, count, sort_type, label_key, output_format='xml')
|
||||||
elif str(rating_key).isdigit():
|
elif str(rating_key).isdigit():
|
||||||
library_data = self.get_children_list(str(rating_key), output_format='xml')
|
library_data = self.get_children_list(str(rating_key), output_format='xml')
|
||||||
else:
|
else:
|
||||||
|
@ -1792,6 +1838,33 @@ class PmsConnect(object):
|
||||||
|
|
||||||
return server_library_stats
|
return server_library_stats
|
||||||
|
|
||||||
|
def get_library_label_details(self, section_id=''):
|
||||||
|
labels_data = self.get_library_labels(section_id=str(section_id), output_format='xml')
|
||||||
|
|
||||||
|
try:
|
||||||
|
xml_head = labels_data.getElementsByTagName('MediaContainer')
|
||||||
|
except Exception as e:
|
||||||
|
logger.warn(u"PlexPy Pmsconnect :: Unable to parse XML for get_library_label_details: %s." % e)
|
||||||
|
return None
|
||||||
|
|
||||||
|
labels_list = []
|
||||||
|
|
||||||
|
for a in xml_head:
|
||||||
|
if a.getAttribute('size'):
|
||||||
|
if a.getAttribute('size') == '0':
|
||||||
|
logger.debug(u"PlexPy Pmsconnect :: No labels data.")
|
||||||
|
return labels_list
|
||||||
|
|
||||||
|
if a.getElementsByTagName('Directory'):
|
||||||
|
labels_main = a.getElementsByTagName('Directory')
|
||||||
|
for item in labels_main:
|
||||||
|
label = {'label_key': helpers.get_xml_attr(item, 'key'),
|
||||||
|
'label_title': helpers.get_xml_attr(item, 'title')
|
||||||
|
}
|
||||||
|
labels_list.append(label)
|
||||||
|
|
||||||
|
return labels_list
|
||||||
|
|
||||||
def get_image(self, img=None, width=None, height=None):
|
def get_image(self, img=None, width=None, height=None):
|
||||||
"""
|
"""
|
||||||
Return image data as array.
|
Return image data as array.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue