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':