diff --git a/API.md b/API.md index 557bbcd5..7dcb3e9a 100644 --- a/API.md +++ b/API.md @@ -434,6 +434,7 @@ Returns: "optimized_version_profile": "", "optimized_version_title": "", "originally_available_at": "2016-04-24", + "original_title": "", "parent_media_index": "6", "parent_rating_key": "153036", "parent_thumb": "/library/metadata/153036/thumb/1503889210", @@ -678,6 +679,7 @@ Returns: "full_title": "Game of Thrones - The Red Woman", "grandparent_rating_key": 351, "grandparent_title": "Game of Thrones", + "original_title": "", "group_count": 1, "group_ids": "1124", "id": 1124, @@ -1172,6 +1174,7 @@ Returns: } ], "media_type": "episode", + "original_title": "", "originally_available_at": "2016-04-24", "parent_media_index": "6", "parent_rating_key": "153036", @@ -1779,6 +1782,7 @@ Returns: "library_name": "", "media_index": "1", "media_type": "episode", + "original_title": "", "parent_media_index": "6", "parent_rating_key": "153036", "parent_thumb": "/library/metadata/153036/thumb/1462175062", @@ -1953,6 +1957,7 @@ Returns: "optimized_version": "", "optimized_version_profile": "", "optimized_version_title": "", + "original_title": "", "pre_tautulli": "", "quality_profile": "1.5 Mbps 480p", "stream_audio_bitrate": 203, @@ -2545,7 +2550,7 @@ Returns: ### set_mobile_device_config -Configure an exisitng notificaiton agent. +Configure an existing notification agent. ``` Required parameters: @@ -2560,7 +2565,7 @@ Returns: ### set_newsletter_config -Configure an exisitng newsletter agent. +Configure an existing newsletter agent. ``` Required parameters: @@ -2576,7 +2581,7 @@ Returns: ### set_notifier_config -Configure an exisitng notificaiton agent. +Configure an existing notification agent. ``` Required parameters: diff --git a/data/interfaces/default/current_activity_instance.html b/data/interfaces/default/current_activity_instance.html index 27e63a1c..4cd677a7 100644 --- a/data/interfaces/default/current_activity_instance.html +++ b/data/interfaces/default/current_activity_instance.html @@ -387,8 +387,8 @@ DOCUMENTATION :: END ${data['grandparent_title']} - ${data['title']} % elif data['media_type'] == 'track': - ${data['grandparent_title']} - - ${data['title']} + ${data['title']} + - ${data['original_title'] or data['grandparent_title']} % elif data['media_type'] == 'photo': ${data['parent_title']} % elif data['media_type'] == 'clip': diff --git a/data/interfaces/default/index.html b/data/interfaces/default/index.html index 96c1a707..449267a2 100644 --- a/data/interfaces/default/index.html +++ b/data/interfaces/default/index.html @@ -390,8 +390,8 @@ $('#background-' + key).css('background-image', 'url(pms_image_proxy?img=' + s.art + '&width=500&height=280&opacity=40&background=282828&blur=3&fallback=art&refresh=true)'); $('#metadata-grandparent_title-' + key) .attr('href', 'info?rating_key=' + s.grandparent_rating_key) - .attr('title', s.grandparent_title) - .text(s.grandparent_title); + .attr('title', s.original_title || s.grandparent_title) + .text(s.original_title || s.grandparent_title); } // Update cover if album changed if (s.parent_rating_key !== instance.data('parent_rating_key')) { @@ -406,7 +406,11 @@ .text(s.parent_title); } // Update cover if track changed - if (s.parent_rating_key !== instance.data('parent_rating_key')) { + if (s.rating_key !== instance.data('rating_key')) { + $('#metadata-grandparent_title-' + key) + .attr('href', 'info?rating_key=' + s.grandparent_rating_key) + .attr('title', s.original_title || s.grandparent_title) + .text(s.original_title || s.grandparent_title); $('#metadata-title-' + key) .attr('href', 'info?rating_key=' + s.rating_key) .attr('title', s.title) diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index 4b6095c0..e207591d 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -165,7 +165,7 @@ DOCUMENTATION :: END

${data['parent_title']}

${data['title']}

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

${data['grandparent_title']}

+

${data['original_title'] or data['grandparent_title']}

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

% endif @@ -371,7 +371,11 @@ DOCUMENTATION :: END
+ % if data['media_type'] in ('artist', 'album', 'track'): + Play History for ${data['title']} + % else: Watch History for ${data['title']} + % endif
% if _session['user_group'] == 'admin': @@ -502,7 +506,7 @@ DOCUMENTATION :: END % elif data['media_type'] == 'album': ${data['parent_title']}
${data['title']} % elif data['media_type'] == 'track': - ${data['grandparent_title']}
${data['title']}
${data['parent_title']} + ${data['original_title'] or data['grandparent_title']}
${data['title']}
${data['parent_title']} % endif

diff --git a/data/interfaces/default/info_children_list.html b/data/interfaces/default/info_children_list.html index afe208ca..b2a843a9 100644 --- a/data/interfaces/default/info_children_list.html +++ b/data/interfaces/default/info_children_list.html @@ -123,7 +123,8 @@ DOCUMENTATION :: END % if loop.index % 2 == 0:
${child['media_index']} - ${child['title']} + ${child['title']} + - ${child['original_title']} @@ -131,7 +132,8 @@ DOCUMENTATION :: END % else:
${child['media_index']} - ${child['title']} + ${child['title']} + - ${child['original_title']} diff --git a/data/interfaces/default/info_search_results_list.html b/data/interfaces/default/info_search_results_list.html index 041bd1a0..49469285 100644 --- a/data/interfaces/default/info_search_results_list.html +++ b/data/interfaces/default/info_search_results_list.html @@ -251,7 +251,7 @@ DOCUMENTATION :: END % endif
-

${child['grandparent_title']}

+

${child['original_title'] or child['grandparent_title']}

${child['title']}

${child['parent_title']}

diff --git a/data/interfaces/default/stream_data.html b/data/interfaces/default/stream_data.html index 64d20788..06ecff76 100644 --- a/data/interfaces/default/stream_data.html +++ b/data/interfaces/default/stream_data.html @@ -46,8 +46,10 @@ DOCUMENTATION :: END
-

- ${item['grandparent_title']} +

+ ${item['original_title'] or item['grandparent_title']}

${item['title']} diff --git a/plexpy/__init__.py b/plexpy/__init__.py index 749983c4..533c4a1b 100644 --- a/plexpy/__init__.py +++ b/plexpy/__init__.py @@ -520,7 +520,8 @@ def dbcheck(): 'transcode_key TEXT, rating_key INTEGER, section_id INTEGER, media_type TEXT, started INTEGER, stopped INTEGER, ' 'paused_counter INTEGER DEFAULT 0, state TEXT, user_id INTEGER, user TEXT, friendly_name TEXT, ' 'ip_address TEXT, machine_id TEXT, player TEXT, product TEXT, platform TEXT, title TEXT, parent_title TEXT, ' - 'grandparent_title TEXT, full_title TEXT, media_index INTEGER, parent_media_index INTEGER, ' + 'grandparent_title TEXT, original_title TEXT, full_title TEXT, ' + 'media_index INTEGER, parent_media_index INTEGER, ' 'thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, year INTEGER, ' 'parent_rating_key INTEGER, grandparent_rating_key INTEGER, ' 'view_offset INTEGER DEFAULT 0, duration INTEGER, video_decision TEXT, audio_decision TEXT, ' @@ -581,8 +582,9 @@ def dbcheck(): c_db.execute( '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, section_id INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, ' + 'title TEXT, parent_title TEXT, grandparent_title TEXT, original_title TEXT, full_title TEXT, ' + 'media_index INTEGER, 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, ' '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, ' @@ -1077,6 +1079,15 @@ def dbcheck(): 'ALTER TABLE sessions ADD COLUMN live_uuid TEXT' ) + # Upgrade sessions table from earlier versions + try: + c_db.execute('SELECT original_title FROM sessions') + except sqlite3.OperationalError: + logger.debug(u"Altering database. Updating database table sessions.") + c_db.execute( + 'ALTER TABLE sessions ADD COLUMN original_title TEXT' + ) + # Upgrade session_history table from earlier versions try: c_db.execute('SELECT reference_id FROM session_history') @@ -1163,6 +1174,15 @@ def dbcheck(): 'ALTER TABLE session_history_metadata ADD COLUMN labels TEXT' ) + # Upgrade session_history_metadata table from earlier versions + try: + c_db.execute('SELECT original_title 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 original_title TEXT' + ) + # Upgrade session_history_media_info table from earlier versions try: c_db.execute('SELECT transcode_decision FROM session_history_media_info') diff --git a/plexpy/activity_processor.py b/plexpy/activity_processor.py index 393f8b48..4e93c8ec 100644 --- a/plexpy/activity_processor.py +++ b/plexpy/activity_processor.py @@ -50,6 +50,7 @@ class ActivityProcessor(object): 'title': session.get('title', ''), 'parent_title': session.get('parent_title', ''), 'grandparent_title': session.get('grandparent_title', ''), + 'original_title': session.get('original_title', ''), 'full_title': session.get('full_title', ''), 'media_index': session.get('media_index', ''), 'parent_media_index': session.get('parent_media_index', ''), @@ -399,6 +400,7 @@ class ActivityProcessor(object): 'title': session['title'], 'parent_title': session['parent_title'], 'grandparent_title': session['grandparent_title'], + 'original_title': session['original_title'], 'full_title': session['full_title'], 'media_index': metadata['media_index'], 'parent_media_index': metadata['parent_media_index'], diff --git a/plexpy/common.py b/plexpy/common.py index 1d7f89ba..8f0ba9a0 100644 --- a/plexpy/common.py +++ b/plexpy/common.py @@ -403,6 +403,7 @@ NOTIFICATION_PARAMETERS = [ {'name': 'Artist Name', 'type': 'str', 'value': 'artist_name', 'description': 'The name of the artist.'}, {'name': 'Album Name', 'type': 'str', 'value': 'album_name', 'description': 'The title of the album.'}, {'name': 'Track Name', 'type': 'str', 'value': 'track_name', 'description': 'The title of the track.'}, + {'name': 'Track Artist', 'type': 'str', 'value': 'track_artist', 'description': 'The name of the artist of the track.'}, {'name': 'Season Number', 'type': 'int', 'value': 'season_num', 'description': 'The season number.', 'example': 'e.g. 1, or 1-3'}, {'name': 'Season Number 00', 'type': 'int', 'value': 'season_num00', 'description': 'The two digit season number.', 'example': 'e.g. 01, or 01-03'}, {'name': 'Episode Number', 'type': 'int', 'value': 'episode_num', 'description': 'The episode number.', 'example': 'e.g. 6, or 6-10'}, diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index 9e971bb6..181dafea 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -86,6 +86,7 @@ class DataFactory(object): 'session_history_metadata.title', 'session_history_metadata.parent_title', 'session_history_metadata.grandparent_title', + 'session_history_metadata.original_title', 'session_history_metadata.year', 'session_history_metadata.media_index', 'session_history_metadata.parent_media_index', @@ -132,6 +133,7 @@ class DataFactory(object): 'title', 'parent_title', 'grandparent_title', + 'original_title', 'year', 'media_index', 'parent_media_index', @@ -233,6 +235,7 @@ class DataFactory(object): 'title': item['parent_title'], 'parent_title': item['parent_title'], 'grandparent_title': item['grandparent_title'], + 'original_title': item['original_title'], 'year': item['year'], 'media_index': item['media_index'], 'parent_media_index': item['parent_media_index'], @@ -480,7 +483,8 @@ class DataFactory(object): elif stat == 'top_music': top_music = [] try: - query = 'SELECT t.id, t.grandparent_title, t.grandparent_rating_key, t.grandparent_thumb, t.section_id, ' \ + query = 'SELECT t.id, t.grandparent_title, t.original_title, ' \ + 't.grandparent_rating_key, t.grandparent_thumb, t.section_id, ' \ 't.art, t.media_type, t.content_rating, t.labels, t.started, ' \ 'MAX(t.started) AS last_watch, COUNT(t.id) AS total_plays, SUM(t.d) AS total_duration ' \ 'FROM (SELECT *, SUM(CASE WHEN stopped > 0 THEN (stopped - started) - ' \ @@ -492,7 +496,7 @@ class DataFactory(object): ' >= datetime("now", "-%s days", "localtime") ' \ ' AND session_history.media_type = "track" ' \ ' GROUP BY %s) AS t ' \ - 'GROUP BY t.grandparent_title ' \ + 'GROUP BY t.original_title, t.grandparent_title ' \ 'ORDER BY %s DESC, started DESC ' \ 'LIMIT %s ' % (time_range, group_by, sort_type, stats_count) result = monitor_db.select(query) @@ -501,7 +505,7 @@ class DataFactory(object): return None for item in result: - row = {'title': item['grandparent_title'], + row = {'title': item['original_title'] or item['grandparent_title'], 'total_plays': item['total_plays'], 'total_duration': item['total_duration'], 'users_watched': '', @@ -529,7 +533,8 @@ class DataFactory(object): elif stat == 'popular_music': popular_music = [] try: - query = 'SELECT t.id, t.grandparent_title, t.grandparent_rating_key, t.grandparent_thumb, t.section_id, ' \ + query = 'SELECT t.id, t.grandparent_title, t.original_title, ' \ + 't.grandparent_rating_key, t.grandparent_thumb, t.section_id, ' \ 't.art, t.media_type, t.content_rating, t.labels, t.started, ' \ 'COUNT(DISTINCT t.user_id) AS users_watched, ' \ 'MAX(t.started) AS last_watch, COUNT(t.id) as total_plays, SUM(t.d) AS total_duration ' \ @@ -542,7 +547,7 @@ class DataFactory(object): ' >= datetime("now", "-%s days", "localtime") ' \ ' AND session_history.media_type = "track" ' \ ' GROUP BY %s) AS t ' \ - 'GROUP BY t.grandparent_title ' \ + 'GROUP BY t.original_title, t.grandparent_title ' \ 'ORDER BY users_watched DESC, %s DESC, started DESC ' \ 'LIMIT %s ' % (time_range, group_by, sort_type, stats_count) result = monitor_db.select(query) @@ -551,7 +556,7 @@ class DataFactory(object): return None for item in result: - row = {'title': item['grandparent_title'], + row = {'title': item['original_title'] or item['grandparent_title'], 'users_watched': item['users_watched'], 'rating_key': item['grandparent_rating_key'], 'last_play': item['last_watch'], @@ -888,7 +893,7 @@ class DataFactory(object): 'video_decision, audio_decision, transcode_decision, width, height, container, ' \ 'transcode_container, transcode_video_codec, transcode_audio_codec, transcode_audio_channels, ' \ 'transcode_width, transcode_height, ' \ - 'session_history_metadata.media_type, title, grandparent_title ' \ + 'session_history_metadata.media_type, title, grandparent_title, original_title ' \ 'FROM session_history_media_info ' \ 'JOIN session_history ON session_history_media_info.id = session_history.id ' \ 'JOIN session_history_metadata ON session_history_media_info.id = session_history_metadata.id ' \ @@ -909,7 +914,7 @@ class DataFactory(object): 'video_decision, audio_decision, transcode_decision, width, height, container, ' \ 'transcode_container, transcode_video_codec, transcode_audio_codec, transcode_audio_channels, ' \ 'transcode_width, transcode_height, ' \ - 'media_type, title, grandparent_title ' \ + 'media_type, title, grandparent_title, original_title ' \ 'FROM sessions ' \ 'WHERE session_key = ? %s' % user_cond result = monitor_db.select(query, args=[session_key]) @@ -979,6 +984,7 @@ class DataFactory(object): 'media_type': item['media_type'], 'title': item['title'], 'grandparent_title': item['grandparent_title'], + 'original_title': item['original_title'], 'current_session': 1 if session_key else 0, 'pre_tautulli': pre_tautulli } @@ -994,7 +1000,8 @@ class DataFactory(object): '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.original_title, session_history_metadata.full_title, ' \ + 'library_sections.section_name, ' \ 'session_history_metadata.media_index, session_history_metadata.parent_media_index, ' \ 'session_history_metadata.section_id, session_history_metadata.thumb, ' \ 'session_history_metadata.parent_thumb, session_history_metadata.grandparent_thumb, ' \ @@ -1043,6 +1050,7 @@ class DataFactory(object): 'parent_rating_key': item['parent_rating_key'], 'grandparent_rating_key': item['grandparent_rating_key'], 'grandparent_title': item['grandparent_title'], + 'original_title': item['original_title'], 'parent_media_index': item['parent_media_index'], 'parent_title': item['parent_title'], 'media_index': item['media_index'], @@ -1550,8 +1558,11 @@ class DataFactory(object): if metadata: # Create full_title - if metadata['media_type'] == 'episode' or metadata['media_type'] == 'track': + if metadata['media_type'] == 'episode': full_title = '%s - %s' % (metadata['grandparent_title'], metadata['title']) + elif metadata['media_type'] == 'track': + full_title = '%s - %s' % (metadata['title'], + metadata['original_title'] or metadata['grandparent_title']) else: full_title = metadata['title'] @@ -1566,7 +1577,8 @@ class DataFactory(object): # Update the session_history_metadata table query = 'UPDATE session_history_metadata SET rating_key = ?, parent_rating_key = ?, ' \ - 'grandparent_rating_key = ?, title = ?, parent_title = ?, grandparent_title = ?, full_title = ?, ' \ + 'grandparent_rating_key = ?, title = ?, parent_title = ?, grandparent_title = ?, ' \ + 'original_title = ?, full_title = ?, ' \ 'media_index = ?, 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 = ?, summary = ?, ' \ @@ -1575,7 +1587,8 @@ class DataFactory(object): 'WHERE rating_key = ?' args = [metadata['rating_key'], metadata['parent_rating_key'], metadata['grandparent_rating_key'], - metadata['title'], metadata['parent_title'], metadata['grandparent_title'], full_title, + metadata['title'], metadata['parent_title'], metadata['grandparent_title'], + metadata['original_title'], full_title, metadata['media_index'], metadata['parent_media_index'], metadata['section_id'], metadata['thumb'], metadata['parent_thumb'], metadata['grandparent_thumb'], metadata['art'], metadata['media_type'], metadata['year'], metadata['originally_available_at'], metadata['added_at'], metadata['updated_at'], diff --git a/plexpy/libraries.py b/plexpy/libraries.py index d5178c4b..3a3ed97c 100644 --- a/plexpy/libraries.py +++ b/plexpy/libraries.py @@ -862,13 +862,13 @@ class Libraries(object): if str(section_id).isdigit(): query = 'SELECT session_history.id, session_history.media_type, ' \ 'session_history.rating_key, session_history.parent_rating_key, session_history.grandparent_rating_key, ' \ - 'title, parent_title, grandparent_title, thumb, parent_thumb, grandparent_thumb, media_index, parent_media_index, ' \ + 'title, parent_title, grandparent_title, original_title, ' \ + 'thumb, parent_thumb, grandparent_thumb, media_index, parent_media_index, ' \ 'year, started, user, content_rating, labels, section_id ' \ 'FROM session_history_metadata ' \ 'JOIN session_history ON session_history_metadata.id = session_history.id ' \ 'WHERE section_id = ? ' \ - 'GROUP BY (CASE WHEN session_history.media_type = "track" THEN session_history.parent_rating_key ' \ - ' ELSE session_history.rating_key END) ' \ + 'GROUP BY session_history.rating_key ' \ 'ORDER BY started DESC LIMIT ?' result = monitor_db.select(query, args=[section_id, limit]) else: @@ -893,6 +893,7 @@ class Libraries(object): 'title': row['title'], 'parent_title': row['parent_title'], 'grandparent_title': row['grandparent_title'], + 'original_title': row['original_title'], 'thumb': thumb, 'media_index': row['media_index'], 'parent_media_index': row['parent_media_index'], diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index 40fb2841..993b0d84 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -805,6 +805,7 @@ def build_media_notify_params(notify_action=None, session=None, timeline=None, m 'artist_name': artist_name, 'album_name': album_name, 'track_name': track_name, + 'track_artist': notify_params['original_title'] or notify_params['grandparent_title'], 'season_num': season_num, 'season_num00': season_num00, 'episode_num': episode_num, diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index 145ded30..c4d7dbad 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -728,7 +728,7 @@ class PrettyMetadata(object): elif self.media_type == 'album': title = '%s - %s' % (self.parameters['artist_name'], self.parameters['album_name']) elif self.media_type == 'track': - title = '%s - %s' % (self.parameters['artist_name'], self.parameters['track_name']) + title = '%s - %s' % (self.parameters['track_name'], self.parameters['track_artist']) return title.encode("utf-8") def get_description(self): diff --git a/plexpy/plexivity_import.py b/plexpy/plexivity_import.py index cdc1186b..725f5620 100644 --- a/plexpy/plexivity_import.py +++ b/plexpy/plexivity_import.py @@ -49,6 +49,7 @@ def extract_plexivity_xml(xml=None): grandparent_rating_key = helpers.get_xml_attr(a, 'grandparentRatingKey') grandparent_thumb = helpers.get_xml_attr(a, 'grandparentThumb') grandparent_title = helpers.get_xml_attr(a, 'grandparentTitle') + original_title = helpers.get_xml_attr(a, 'originalTitle') guid = helpers.get_xml_attr(a, 'guid') section_id = helpers.get_xml_attr(a, 'librarySectionID') media_index = helpers.get_xml_attr(a, 'index') @@ -180,9 +181,10 @@ def extract_plexivity_xml(xml=None): 'duration': duration, 'grandparent_rating_key': grandparent_rating_key, 'grandparent_thumb': grandparent_thumb, - 'grandparent_title': grandparent_title, - 'parent_title': parent_title, 'title': title, + 'parent_title': parent_title, + 'grandparent_title': grandparent_title, + 'original_title': original_title, 'tagline': tagline, 'guid': guid, 'section_id': section_id, @@ -339,6 +341,7 @@ def import_from_plexivity(database=None, table_name=None, import_ignore_interval 'title': row['title'], 'parent_title': extracted_xml['parent_title'], 'grandparent_title': row['grandparent_title'], + 'original_title': extracted_xml['original_title'], 'full_title': row['full_title'], 'user_id': user_id, 'user': row['user'], @@ -380,6 +383,7 @@ def import_from_plexivity(database=None, table_name=None, import_ignore_interval 'title': row['title'], 'parent_title': extracted_xml['parent_title'], 'grandparent_title': row['grandparent_title'], + 'original_title': extracted_xml['original_title'], 'media_index': extracted_xml['media_index'], 'parent_media_index': extracted_xml['parent_media_index'], 'thumb': extracted_xml['thumb'], diff --git a/plexpy/plexwatch_import.py b/plexpy/plexwatch_import.py index df5fa283..10b2a680 100644 --- a/plexpy/plexwatch_import.py +++ b/plexpy/plexwatch_import.py @@ -45,6 +45,7 @@ def extract_plexwatch_xml(xml=None): duration = helpers.get_xml_attr(a, 'duration') grandparent_thumb = helpers.get_xml_attr(a, 'grandparentThumb') grandparent_title = helpers.get_xml_attr(a, 'grandparentTitle') + original_title = helpers.get_xml_attr(a, 'originalTitle') guid = helpers.get_xml_attr(a, 'guid') section_id = helpers.get_xml_attr(a, 'librarySectionID') media_index = helpers.get_xml_attr(a, 'index') @@ -172,9 +173,10 @@ def extract_plexwatch_xml(xml=None): 'art': art, 'duration': duration, 'grandparent_thumb': grandparent_thumb, - 'grandparent_title': grandparent_title, - 'parent_title': parent_title, 'title': title, + 'parent_title': parent_title, + 'grandparent_title': grandparent_title, + 'original_title': original_title, 'tagline': tagline, 'guid': guid, 'section_id': section_id, @@ -332,6 +334,7 @@ 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'], + 'original_title': extracted_xml['original_title'], 'full_title': row['full_title'], 'user_id': user_id, 'user': row['user'], @@ -373,6 +376,7 @@ 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'], + 'original_title': extracted_xml['original_title'], 'media_index': extracted_xml['media_index'], 'parent_media_index': extracted_xml['parent_media_index'], 'thumb': extracted_xml['thumb'], diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index ee407e85..9cfe6808 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -512,6 +512,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(m, 'title'), 'parent_title': helpers.get_xml_attr(m, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(m, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(m, 'originalTitle'), 'sort_title': helpers.get_xml_attr(m, 'titleSort'), 'media_index': helpers.get_xml_attr(m, 'index'), 'parent_media_index': helpers.get_xml_attr(m, 'parentIndex'), @@ -661,6 +662,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -708,6 +710,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -752,6 +755,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -797,6 +801,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': 'Season %s' % helpers.get_xml_attr(metadata_main, 'parentIndex'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -840,6 +845,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -884,6 +890,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -920,6 +927,8 @@ class PmsConnect(object): elif metadata_type == 'track': parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey') album_details = self.get_metadata_details(parent_rating_key) + track_artist = helpers.get_xml_attr(metadata_main, 'originalTitle') or \ + helpers.get_xml_attr(metadata_main, 'grandparentTitle') metadata = {'media_type': metadata_type, 'section_id': section_id, 'library_name': library_name, @@ -929,6 +938,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -957,8 +967,8 @@ class PmsConnect(object): 'genres': album_details['genres'], 'labels': album_details['labels'], 'collections': album_details['collections'], - 'full_title': u'{} - {}'.format(helpers.get_xml_attr(metadata_main, 'grandparentTitle'), - helpers.get_xml_attr(metadata_main, 'title')), + 'full_title': u'{} - {}'.format(helpers.get_xml_attr(metadata_main, 'title'), + track_artist), 'children_count': helpers.get_xml_attr(metadata_main, 'leafCount') } @@ -972,6 +982,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -1016,6 +1027,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -1060,6 +1072,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -1105,6 +1118,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(metadata_main, 'title'), 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(metadata_main, 'originalTitle'), 'sort_title': helpers.get_xml_attr(metadata_main, 'titleSort'), 'media_index': helpers.get_xml_attr(metadata_main, 'index'), 'parent_media_index': helpers.get_xml_attr(metadata_main, 'parentIndex'), @@ -1682,6 +1696,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(session, 'title'), 'parent_title': helpers.get_xml_attr(session, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(session, 'originalTitle'), 'sort_title': helpers.get_xml_attr(session, 'titleSort'), 'media_index': helpers.get_xml_attr(session, 'index'), 'parent_media_index': helpers.get_xml_attr(session, 'parentIndex'), @@ -1992,6 +2007,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(m, 'title'), 'parent_title': helpers.get_xml_attr(m, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(m, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(m, 'originalTitle'), 'sort_title': helpers.get_xml_attr(m, 'titleSort'), 'media_index': helpers.get_xml_attr(m, 'index'), 'parent_media_index': helpers.get_xml_attr(m, 'parentIndex'), @@ -2309,6 +2325,7 @@ class PmsConnect(object): 'title': helpers.get_xml_attr(item, 'title'), 'parent_title': helpers.get_xml_attr(item, 'parentTitle'), 'grandparent_title': helpers.get_xml_attr(item, 'grandparentTitle'), + 'original_title': helpers.get_xml_attr(item, 'originalTitle'), 'sort_title': helpers.get_xml_attr(item, 'titleSort'), 'media_index': helpers.get_xml_attr(item, 'index'), 'parent_media_index': helpers.get_xml_attr(item, 'parentIndex'), diff --git a/plexpy/session.py b/plexpy/session.py index a3c150f1..a3af502c 100644 --- a/plexpy/session.py +++ b/plexpy/session.py @@ -201,9 +201,10 @@ def mask_session_info(list_of_dicts, mask_metadata=True): 'grandparent_thumb': common.DEFAULT_POSTER_THUMB, 'thumb': common.DEFAULT_POSTER_THUMB, 'bif_thumb': '', - 'grandparent_title': 'Plex Media', - 'parent_title': 'Plex Media', 'title': 'Plex Media', + 'parent_title': 'Plex Media', + 'grandparent_title': 'Plex Media', + 'original_title': 'Plex Media', 'rating_key': '', 'parent_rating_key': '', 'grandparent_rating_key': '', diff --git a/plexpy/users.py b/plexpy/users.py index b8ed2691..1dc7ed1f 100644 --- a/plexpy/users.py +++ b/plexpy/users.py @@ -521,7 +521,8 @@ class Users(object): if str(user_id).isdigit(): query = 'SELECT session_history.id, session_history.media_type, ' \ 'session_history.rating_key, session_history.parent_rating_key, session_history.grandparent_rating_key, ' \ - 'title, parent_title, grandparent_title, thumb, parent_thumb, grandparent_thumb, media_index, parent_media_index, ' \ + 'title, parent_title, grandparent_title, original_title, ' \ + 'thumb, parent_thumb, grandparent_thumb, media_index, parent_media_index, ' \ 'year, started, user ' \ 'FROM session_history_metadata ' \ 'JOIN session_history ON session_history_metadata.id = session_history.id ' \ @@ -552,6 +553,7 @@ class Users(object): 'title': row['title'], 'parent_title': row['parent_title'], 'grandparent_title': row['grandparent_title'], + 'original_title': row['original_title'], 'thumb': thumb, 'media_index': row['media_index'], 'parent_media_index': row['parent_media_index'], diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 60cda4a1..039bf3cb 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -1614,6 +1614,7 @@ class WebInterface(object): "full_title": "Game of Thrones - The Red Woman", "grandparent_rating_key": 351, "grandparent_title": "Game of Thrones", + "original_title": "", "group_count": 1, "group_ids": "1124", "id": 1124, @@ -1745,6 +1746,7 @@ class WebInterface(object): "optimized_version": "", "optimized_version_profile": "", "optimized_version_title": "", + "original_title": "", "pre_tautulli": "", "quality_profile": "1.5 Mbps 480p", "stream_audio_bitrate": 203, @@ -4626,6 +4628,7 @@ class WebInterface(object): } ], "media_type": "episode", + "original_title": "", "originally_available_at": "2016-04-24", "parent_media_index": "6", "parent_rating_key": "153036", @@ -4684,6 +4687,7 @@ class WebInterface(object): "library_name": "", "media_index": "1", "media_type": "episode", + "original_title": "", "parent_media_index": "6", "parent_rating_key": "153036", "parent_thumb": "/library/metadata/153036/thumb/1462175062", @@ -4955,6 +4959,7 @@ class WebInterface(object): "optimized_version_profile": "", "optimized_version_title": "", "originally_available_at": "2016-04-24", + "original_title": "", "parent_media_index": "6", "parent_rating_key": "153036", "parent_thumb": "/library/metadata/153036/thumb/1503889210",