diff --git a/data/interfaces/default/index.html b/data/interfaces/default/index.html
index 4d9bdca6..3b96b7aa 100644
--- a/data/interfaces/default/index.html
+++ b/data/interfaces/default/index.html
@@ -309,14 +309,17 @@
streams_header = streams_header.replace(/, $/, '') + ')';
$('#currentActivityHeader-streams').text(streams_header);
- var bandwidth_header = ((total_bw > 1000) ? ((total_bw / 1000).toFixed(1) + ' Mbps') : (total_bw + ' kbps')) + ' (';
+ var bandwidth_header = ((total_bw > 1000) ? ((total_bw / 1000).toFixed(1) + ' Mbps') : (total_bw + ' kbps'));
+ var lan_wan_bandwidth_header = '';
if (lan_bw) {
- bandwidth_header += 'LAN: ' + ((lan_bw > 1000) ? ((lan_bw / 1000).toFixed(1) + ' Mbps') : (lan_bw + ' kbps')) + ', ';
+ lan_wan_bandwidth_header += 'LAN: ' + ((lan_bw > 1000) ? ((lan_bw / 1000).toFixed(1) + ' Mbps') : (lan_bw + ' kbps')) + ', ';
}
if (wan_bw) {
- bandwidth_header += 'WAN: ' + ((wan_bw > 1000) ? ((wan_bw / 1000).toFixed(1) + ' Mbps') : (wan_bw + ' kbps')) + ', ';
+ lan_wan_bandwidth_header += 'WAN: ' + ((wan_bw > 1000) ? ((wan_bw / 1000).toFixed(1) + ' Mbps') : (wan_bw + ' kbps')) + ', ';
+ }
+ if (lan_wan_bandwidth_header) {
+ bandwidth_header += ' (' + lan_wan_bandwidth_header.replace(/, $/, '') + ')';
}
- bandwidth_header = bandwidth_header.replace(/, $/, '') + ')';
$('#currentActivityHeader-bandwidth').text(bandwidth_header);
$('#currentActivityHeader').show();
diff --git a/plexpy/activity_handler.py b/plexpy/activity_handler.py
index 2470dcfb..79eea249 100644
--- a/plexpy/activity_handler.py
+++ b/plexpy/activity_handler.py
@@ -449,7 +449,7 @@ def force_stop_stream(session_key):
row_id = ap.write_session_history(session=session)
if row_id:
- # If session is written to the databaase successfully, remove the session from the session table
+ # If session is written to the database successfully, remove the session from the session table
logger.info(u"Tautulli ActivityHandler :: Removing stale stream with sessionKey %s ratingKey %s from session queue"
% (session['session_key'], session['rating_key']))
ap.delete_session(row_id=row_id)
diff --git a/plexpy/plextv.py b/plexpy/plextv.py
index 7cf7ff74..8aa2f2aa 100644
--- a/plexpy/plextv.py
+++ b/plexpy/plextv.py
@@ -379,6 +379,11 @@ class PlexTV(object):
if machine_id is None:
machine_id = plexpy.CONFIG.PMS_IDENTIFIER
+ if isinstance(rating_key_filter, list):
+ rating_key_filter = [str(k) for k in rating_key_filter]
+ else:
+ rating_key_filter = [str(rating_key_filter)]
+
sync_list = self.get_plextv_sync_lists(machine_id, output_format='xml')
user_data = users.Users()
@@ -432,7 +437,7 @@ class PlexTV(object):
for idx, item in enumerate(clean_uri) if item == 'metadata'), None)
# Filter by rating_key
- if rating_key_filter and str(rating_key_filter) != rating_key:
+ if rating_key_filter and rating_key not in rating_key_filter:
continue
sync_id = helpers.get_xml_attr(item, 'id')
@@ -461,12 +466,13 @@ class PlexTV(object):
status_item_downloaded_count, status_item_count)
for settings in item.getElementsByTagName('MediaSettings'):
- settings_audio_boost = helpers.get_xml_attr(settings, 'audioBoost')
- settings_music_bitrate = helpers.get_xml_attr(settings, 'musicBitrate')
- settings_photo_quality = helpers.get_xml_attr(settings, 'photoQuality')
- settings_photo_resolution = helpers.get_xml_attr(settings, 'photoResolution')
+ settings_video_bitrate = helpers.get_xml_attr(settings, 'maxVideoBitrate')
settings_video_quality = helpers.get_xml_attr(settings, 'videoQuality')
settings_video_resolution = helpers.get_xml_attr(settings, 'videoResolution')
+ settings_audio_boost = helpers.get_xml_attr(settings, 'audioBoost')
+ settings_audio_bitrate = helpers.get_xml_attr(settings, 'musicBitrate')
+ settings_photo_quality = helpers.get_xml_attr(settings, 'photoQuality')
+ settings_photo_resolution = helpers.get_xml_attr(settings, 'photoResolution')
sync_details = {"device_name": helpers.sanitize(device_name),
"platform": helpers.sanitize(device_platform),
@@ -483,7 +489,8 @@ class PlexTV(object):
"item_complete_count": status_item_complete_count,
"item_downloaded_count": status_item_downloaded_count,
"item_downloaded_percent_complete": status_item_download_percent_complete,
- "music_bitrate": settings_music_bitrate,
+ "video_bitrate": settings_video_bitrate,
+ "audio_bitrate": settings_audio_bitrate,
"photo_quality": settings_photo_quality,
"video_quality": settings_video_quality,
"total_size": status_total_size,
diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py
index 1ab8db4f..a6f9a9fc 100644
--- a/plexpy/pmsconnect.py
+++ b/plexpy/pmsconnect.py
@@ -559,27 +559,32 @@ class PmsConnect(object):
for a in xml_head:
if a.getAttribute('size'):
- if a.getAttribute('size') != '1':
+ if a.getAttribute('size') == '0':
return metadata
if a.getElementsByTagName('Directory'):
- metadata_main = a.getElementsByTagName('Directory')[0]
- metadata_type = helpers.get_xml_attr(metadata_main, 'type')
- if metadata_type == 'photo':
- metadata_type = 'photo_album'
+ metadata_main_list = a.getElementsByTagName('Directory')
elif a.getElementsByTagName('Video'):
- metadata_main = a.getElementsByTagName('Video')[0]
- metadata_type = helpers.get_xml_attr(metadata_main, 'type')
+ metadata_main_list = a.getElementsByTagName('Video')
elif a.getElementsByTagName('Track'):
- metadata_main = a.getElementsByTagName('Track')[0]
- metadata_type = helpers.get_xml_attr(metadata_main, 'type')
+ metadata_main_list = a.getElementsByTagName('Track')
elif a.getElementsByTagName('Photo'):
- metadata_main = a.getElementsByTagName('Photo')[0]
- metadata_type = helpers.get_xml_attr(metadata_main, 'type')
+ metadata_main_list = a.getElementsByTagName('Photo')
else:
logger.debug(u"Tautulli Pmsconnect :: Metadata failed")
return {}
+ if sync_id and len(metadata_main_list) > 1:
+ for metadata_main in metadata_main_list:
+ if helpers.get_xml_attr(metadata_main, 'ratingKey') == rating_key:
+ break
+ else:
+ metadata_main = metadata_main_list[0]
+
+ metadata_type = helpers.get_xml_attr(metadata_main, 'type')
+ if metadata_type == 'photo':
+ metadata_type = 'photo_album'
+
section_id = helpers.get_xml_attr(a, 'librarySectionID')
library_name = helpers.get_xml_attr(a, 'librarySectionTitle')
@@ -1386,7 +1391,7 @@ class PmsConnect(object):
else:
session_details = {'session_id': '',
'bandwidth': '',
- 'location': 'Unknown'
+ 'location': 'wan' if player_details['local'] == '0' else 'lan'
}
# Get the transcode details
@@ -1459,16 +1464,24 @@ class PmsConnect(object):
if media_type not in ('photo', 'clip') and not session.getElementsByTagName('Session') \
and helpers.get_xml_attr(session, 'ratingKey').isdigit() and transcode_decision == 'direct play':
plex_tv = plextv.PlexTV()
+ parent_rating_key = helpers.get_xml_attr(session, 'parentRatingKey')
+ grandparent_rating_key = helpers.get_xml_attr(session, 'grandparentRatingKey')
+
synced_items = plex_tv.get_synced_items(client_id_filter=player_details['machine_id'],
- rating_key_filter=rating_key)
+ rating_key_filter=[rating_key, parent_rating_key, grandparent_rating_key])
if synced_items:
- sync_id = synced_items[0]['sync_id']
+ synced_item_details = synced_items[0]
+ sync_id = synced_item_details['sync_id']
synced_xml = self.get_sync_item(sync_id=sync_id, output_format='xml')
synced_xml_head = synced_xml.getElementsByTagName('MediaContainer')
if synced_xml_head[0].getElementsByTagName('Track'):
- synced_session_data = synced_xml_head[0].getElementsByTagName('Track')[0]
+ synced_xml_items = synced_xml_head[0].getElementsByTagName('Track')
elif synced_xml_head[0].getElementsByTagName('Video'):
- synced_session_data = synced_xml_head[0].getElementsByTagName('Video')[0]
+ synced_xml_items = synced_xml_head[0].getElementsByTagName('Video')
+
+ for synced_session_data in synced_xml_items:
+ if helpers.get_xml_attr(synced_session_data, 'ratingKey') == rating_key:
+ break
# Figure out which version is being played
if sync_id:
@@ -1661,7 +1674,7 @@ class PmsConnect(object):
part_id = helpers.get_xml_attr(stream_media_parts_info, 'id')
if sync_id:
- metadata_details = self.get_metadata_details(sync_id=sync_id, cache_key=session_key)
+ metadata_details = self.get_metadata_details(rating_key=rating_key, sync_id=sync_id, cache_key=session_key)
else:
metadata_details = self.get_metadata_details(rating_key=rating_key, cache_key=session_key)
@@ -1735,49 +1748,55 @@ class PmsConnect(object):
# Get the quality profile
if media_type in ('movie', 'episode', 'clip') and 'stream_bitrate' in stream_details:
- stream_bitrate = helpers.cast_to_int(stream_details['stream_bitrate'])
- source_bitrate = helpers.cast_to_int(source_media_details.get('bitrate'))
-
- try:
- quailtiy_bitrate = min(b for b in common.VIDEO_QUALITY_PROFILES if stream_bitrate <= b <= source_bitrate)
- quality_profile = common.VIDEO_QUALITY_PROFILES[quailtiy_bitrate]
- except ValueError:
+ if sync_id:
quality_profile = 'Original'
- if sync_id:
+ synced_item_bitrate = helpers.cast_to_int(synced_item_details['video_bitrate'])
try:
- synced_bitrate = min(b for b in common.VIDEO_QUALITY_PROFILES if source_bitrate <= b)
+ synced_bitrate = max(b for b in common.VIDEO_QUALITY_PROFILES if b <= synced_item_bitrate)
synced_version_profile = common.VIDEO_QUALITY_PROFILES[synced_bitrate]
except ValueError:
synced_version_profile = 'Original'
else:
synced_version_profile = ''
+ stream_bitrate = helpers.cast_to_int(stream_details['stream_bitrate'])
+ source_bitrate = helpers.cast_to_int(source_media_details.get('bitrate'))
+ try:
+ quailtiy_bitrate = min(
+ b for b in common.VIDEO_QUALITY_PROFILES if stream_bitrate <= b <= source_bitrate)
+ quality_profile = common.VIDEO_QUALITY_PROFILES[quailtiy_bitrate]
+ except ValueError:
+ quality_profile = 'Original'
+
if stream_details['optimized_version']:
optimized_version_profile = '{} Mbps {}'.format(round(source_bitrate / 1000.0, 1),
- plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(source_media_details['video_resolution'], source_media_details['video_resolution']))
+ plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(source_media_details['video_resolution'],
+ source_media_details['video_resolution']))
else:
optimized_version_profile = ''
elif media_type == 'track' and 'stream_bitrate' in stream_details:
- stream_bitrate = helpers.cast_to_int(stream_details['stream_bitrate'])
- source_bitrate = helpers.cast_to_int(source_media_details.get('bitrate'))
-
- try:
- quailtiy_bitrate = min(b for b in common.AUDIO_QUALITY_PROFILES if stream_bitrate <= b <= source_bitrate)
- quality_profile = common.AUDIO_QUALITY_PROFILES[quailtiy_bitrate]
- except ValueError:
+ if sync_id:
quality_profile = 'Original'
- if sync_id:
+ synced_item_bitrate = helpers.cast_to_int(synced_item_details['audio_bitrate'])
try:
- synced_bitrate = min(b for b in common.AUDIO_QUALITY_PROFILES if source_bitrate <= b)
+ synced_bitrate = max(b for b in common.AUDIO_QUALITY_PROFILES if b <= synced_item_bitrate)
synced_version_profile = common.AUDIO_QUALITY_PROFILES[synced_bitrate]
except ValueError:
synced_version_profile = 'Original'
else:
synced_version_profile = ''
+ stream_bitrate = helpers.cast_to_int(stream_details['stream_bitrate'])
+ source_bitrate = helpers.cast_to_int(source_media_details.get('bitrate'))
+ try:
+ quailtiy_bitrate = min(b for b in common.AUDIO_QUALITY_PROFILES if stream_bitrate <= b <= source_bitrate)
+ quality_profile = common.AUDIO_QUALITY_PROFILES[quailtiy_bitrate]
+ except ValueError:
+ quality_profile = 'Original'
+
optimized_version_profile = ''
elif media_type == 'photo':