From fd9cf7017b7b39d954db6862a1f42cc14ff8abff Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Tue, 10 Nov 2015 19:28:14 -0800 Subject: [PATCH 1/4] Add IP address to current activity --- data/interfaces/default/css/plexpy.css | 8 ++++++++ data/interfaces/default/current_activity.html | 3 +++ plexpy/datafactory.py | 19 ++++++++++++++++++- plexpy/webserve.py | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/data/interfaces/default/css/plexpy.css b/data/interfaces/default/css/plexpy.css index 14cd9c60..2571667a 100644 --- a/data/interfaces/default/css/plexpy.css +++ b/data/interfaces/default/css/plexpy.css @@ -688,6 +688,14 @@ a:hover .dashboard-activity-poster { white-space: nowrap; width: 150px; } +.dashboard-activity-poster-info-ip-address { + position: absolute; + bottom: 5px; + left: 10px; + text-align: left; + font-size: 12px; + color: #eee; +} .dashboard-activity-poster-info-time { position: absolute; bottom: 5px; diff --git a/data/interfaces/default/current_activity.html b/data/interfaces/default/current_activity.html index b118d47f..af8ae85b 100644 --- a/data/interfaces/default/current_activity.html +++ b/data/interfaces/default/current_activity.html @@ -191,6 +191,9 @@ DOCUMENTATION :: END % if a['media_type'] != 'photo':
+
+ IP: ${a['ip_address']} +
${a['view_offset']}/${a['duration']}
diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index b03d1c64..28d09ebb 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -998,4 +998,21 @@ class DataFactory(object): else: return 'No updated rating key needed in database. No changes were made.' # for debugging - #return mapping \ No newline at end of file + #return mapping + + def get_session_ip(self, session_key=''): + monitor_db = database.MonitorDatabase() + + if session_key: + query = 'SELECT CASE WHEN ip_address IS NULL THEN "N/A" ELSE ip_address END ' \ + 'FROM sessions WHERE session_key = %d' % int(session_key) + result = monitor_db.select(query) + else: + return None + + ip_address = 'N/A' + + for item in result: + ip_address = item[0] + + return ip_address diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 7c2a7986..7b93500a 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -715,6 +715,11 @@ class WebInterface(object): return serve_template(templatename="current_activity.html", data=None) if result: + data_factory = datafactory.DataFactory() + for session in result['sessions']: + ip_address = data_factory.get_session_ip(session['session_key']) + session['ip_address'] = ip_address + return serve_template(templatename="current_activity.html", data=result) else: logger.warn('Unable to retrieve data.') From 80df8f6191c0c1aad34b401fda0da836dfbcb0d1 Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Wed, 11 Nov 2015 08:59:55 -0800 Subject: [PATCH 2/4] Add IP address to sessions for PMS 0.9.14 --- data/interfaces/default/settings.html | 2 +- plexpy/activity_processor.py | 19 ++++++++++--------- plexpy/pmsconnect.py | 5 +++++ plexpy/webserve.py | 11 ++++++----- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index ba7f08dd..571bd867 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -435,7 +435,7 @@ available_notification_agents = sorted(notifiers.available_notification_agents()

- Enable this to attempt to log the IP address of the user. + Enable this to attempt to log the IP address of the user (for PMS 0.9.12 and below, IP address is automatically logged for PMS 0.9.14 and above).

diff --git a/plexpy/activity_processor.py b/plexpy/activity_processor.py index 95b43fe1..db290c2d 100644 --- a/plexpy/activity_processor.py +++ b/plexpy/activity_processor.py @@ -39,6 +39,7 @@ class ActivityProcessor(object): 'parent_title': session['parent_title'], 'grandparent_title': session['grandparent_title'], 'friendly_name': session['friendly_name'], + 'ip_address': session['ip_address'], 'player': session['player'], 'platform': session['platform'], 'parent_rating_key': session['parent_rating_key'], @@ -78,16 +79,16 @@ class ActivityProcessor(object): kwargs=dict(stream_data=values, notify_action='play')).start() started = int(time.time()) + timestamp = {'started': started} - # Try and grab IP address from logs - if plexpy.CONFIG.IP_LOGGING_ENABLE and plexpy.CONFIG.PMS_LOGS_FOLDER: - ip_address = self.find_session_ip(rating_key=session['rating_key'], - machine_id=session['machine_id']) - else: - ip_address = None - - timestamp = {'started': started, - 'ip_address': ip_address} + # Try and grab IP address from logs (fallback if not on PMS 0.9.14 and above) + if not session['ip_address']: + if plexpy.CONFIG.IP_LOGGING_ENABLE and plexpy.CONFIG.PMS_LOGS_FOLDER: + ip_address = self.find_session_ip(rating_key=session['rating_key'], + machine_id=session['machine_id']) + timestamp.update({'ip_address': ip_address}) + else: + timestamp.update({'ip_address': None}) # If it's our first write then time stamp it. self.db.upsert('sessions', timestamp, keys) diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index fdecfae6..a53e9f4b 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -756,6 +756,7 @@ class PmsConnect(object): 'user_id': user_details['user_id'], 'friendly_name': user_details['friendly_name'], 'user_thumb': user_details['thumb'], + 'ip_address': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'address'), 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'), 'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'), 'machine_id': machine_id, @@ -876,6 +877,7 @@ class PmsConnect(object): 'user_id': user_details['user_id'], 'friendly_name': user_details['friendly_name'], 'user_thumb': user_details['thumb'], + 'ip_address': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'address'), 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'), 'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'), 'machine_id': machine_id, @@ -932,6 +934,7 @@ class PmsConnect(object): 'user_id': user_details['user_id'], 'friendly_name': user_details['friendly_name'], 'user_thumb': user_details['thumb'], + 'ip_address': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'address'), 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'), 'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'), 'machine_id': machine_id, @@ -988,6 +991,7 @@ class PmsConnect(object): 'user_id': user_details['user_id'], 'friendly_name': user_details['friendly_name'], 'user_thumb': user_details['thumb'], + 'ip_address': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'address'), 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'), 'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'), 'machine_id': machine_id, @@ -1077,6 +1081,7 @@ class PmsConnect(object): 'user_id': user_details['user_id'], 'friendly_name': user_details['friendly_name'], 'user_thumb': user_details['thumb'], + 'ip_address': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'address'), 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'title'), 'platform': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'), 'machine_id': machine_id, diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 7b93500a..4e0d4937 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -711,15 +711,16 @@ class WebInterface(object): try: pms_connect = pmsconnect.PmsConnect() result = pms_connect.get_current_activity() + + data_factory = datafactory.DataFactory() + for session in result['sessions']: + if not session['ip_address']: + ip_address = data_factory.get_session_ip(session['session_key']) + session['ip_address'] = ip_address except: return serve_template(templatename="current_activity.html", data=None) if result: - data_factory = datafactory.DataFactory() - for session in result['sessions']: - ip_address = data_factory.get_session_ip(session['session_key']) - session['ip_address'] = ip_address - return serve_template(templatename="current_activity.html", data=result) else: logger.warn('Unable to retrieve data.') From d79d5d5b39fcc6b20d1b9199f2a3532978daf3ee Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Wed, 11 Nov 2015 09:16:28 -0800 Subject: [PATCH 3/4] Better IP address handling for current activity --- data/interfaces/default/current_activity.html | 5 +++++ plexpy/datafactory.py | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/data/interfaces/default/current_activity.html b/data/interfaces/default/current_activity.html index af8ae85b..ad78ee22 100644 --- a/data/interfaces/default/current_activity.html +++ b/data/interfaces/default/current_activity.html @@ -32,6 +32,7 @@ user_thumb Returns the profile picture of the user owning the s state Returns the state of the current session. Either 'playing', 'paused' or 'buffering'. title Returns the name of the episode, movie or music track. year Returns the year of the episode, movie, or clip. +ip_address Returns the ip address of the stream. player Returns the name of the platform used to play the stream. platform Returns the type of platform used to play the stream. throttled Returns true if the transcode session is throttled. @@ -192,7 +193,11 @@ DOCUMENTATION :: END % if a['media_type'] != 'photo':
+ % if a['ip_address']: IP: ${a['ip_address']} + % else: + IP: N/A + % endif
${a['view_offset']}/${a['duration']} diff --git a/plexpy/datafactory.py b/plexpy/datafactory.py index 28d09ebb..38c4e5ce 100644 --- a/plexpy/datafactory.py +++ b/plexpy/datafactory.py @@ -1004,8 +1004,7 @@ class DataFactory(object): monitor_db = database.MonitorDatabase() if session_key: - query = 'SELECT CASE WHEN ip_address IS NULL THEN "N/A" ELSE ip_address END ' \ - 'FROM sessions WHERE session_key = %d' % int(session_key) + query = 'SELECT ip_address FROM sessions WHERE session_key = %d' % int(session_key) result = monitor_db.select(query) else: return None From 6362b5190290fc7a10158be16b2fc11d9a539e46 Mon Sep 17 00:00:00 2001 From: Jonathan Wong Date: Wed, 11 Nov 2015 14:48:59 -0800 Subject: [PATCH 4/4] Add ip_address to notification options * Also track_name --- data/interfaces/default/settings.html | 10 +++++++++- plexpy/notification_handler.py | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 571bd867..76a8551f 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -882,13 +882,17 @@ available_notification_agents = sorted(notifiers.available_notification_agents() {player} The name of the device being used for playback. + + {ip_address} + The IP address of the device being used for playback. (PMS 0.9.14 and above) + {media_type} The type of media being played (movie, episode, track). {title} - The title of the item being played. + The full title of the item being played. {show_name} @@ -906,6 +910,10 @@ available_notification_agents = sorted(notifiers.available_notification_agents() {album_name} The title of the album being played. + + {track_name} + The title of the track being played. + {season_num} The season number for the media item if item is episode. diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index af7d6a80..f85887f4 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -355,6 +355,7 @@ def build_notify_text(session=None, timeline=None, state=None): user = '' platform = '' player = '' + ip_address = 'N/A' # Session values if session: @@ -383,6 +384,7 @@ def build_notify_text(session=None, timeline=None, state=None): user = session['friendly_name'] platform = session['platform'] player = session['player'] + ip_address = session['ip_address'] if session['ip_address'] != '' else 'N/A' progress_percent = helpers.get_percent(view_offset, duration) @@ -390,12 +392,14 @@ def build_notify_text(session=None, timeline=None, state=None): 'user': user, 'platform': platform, 'player': player, + 'ip_address': ip_address, 'media_type': metadata['media_type'], 'title': full_title, 'show_name': metadata['grandparent_title'], 'episode_name': metadata['title'], 'artist_name': metadata['grandparent_title'], 'album_name': metadata['parent_title'], + 'track_name': metadata['title'], 'season_num': metadata['parent_index'], 'season_num00': metadata['parent_index'].zfill(2), 'episode_num': metadata['index'],