From 90056bcce2025260d4685033ad8da28782ad2267 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Wed, 15 Jan 2020 11:38:50 -0800 Subject: [PATCH] Indicate HDR content on activity cards --- .../default/current_activity_instance.html | 29 +++++++++------ data/interfaces/default/index.html | 8 +++-- plexpy/pmsconnect.py | 35 +++++++++++++++++++ 3 files changed, 59 insertions(+), 13 deletions(-) diff --git a/data/interfaces/default/current_activity_instance.html b/data/interfaces/default/current_activity_instance.html index f02b39f7..c69b295e 100644 --- a/data/interfaces/default/current_activity_instance.html +++ b/data/interfaces/default/current_activity_instance.html @@ -226,17 +226,24 @@ DOCUMENTATION :: END
  • Video
    - % if data['media_type'] in ('movie', 'episode', 'clip'): + % if data['media_type'] in ('movie', 'episode', 'clip') and data['stream_video_decision']: + <% + if data['video_dynamic_range'] == 'HDR': + video_dynamic_range = ' ' + data['video_dynamic_range'] + stream_video_dynamic_range = ' ' + data['stream_video_dynamic_range'] + else: + video_dynamic_range = stream_video_dynamic_range = '' + %> % if data['stream_video_decision'] == 'transcode': <% hw_d = ' (HW)' if data['transcode_hw_decoding'] else '' hw_e = ' (HW)' if data['transcode_hw_encoding'] else '' %> - Transcode (${data['video_codec'].upper()}${hw_d} ${data['video_full_resolution']} ${data['stream_video_codec'].upper()}${hw_e} ${data['stream_video_full_resolution']}) + Transcode (${data['video_codec'].upper()}${hw_d} ${data['video_full_resolution']}${video_dynamic_range} ${data['stream_video_codec'].upper()}${hw_e} ${data['stream_video_full_resolution']}${stream_video_dynamic_range}) % elif data['stream_video_decision'] == 'copy': - Direct Stream (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']}) + Direct Stream (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']}${stream_video_dynamic_range}) % else: - Direct Play (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']}) + Direct Play (${data['stream_video_codec'].upper()} ${data['stream_video_full_resolution']}${stream_video_dynamic_range}) % endif % elif data['media_type'] == 'photo': Direct Play (${data['width']}x${data['height']}) @@ -248,12 +255,14 @@ DOCUMENTATION :: END
  • Audio
    - % if data['stream_audio_decision'] == 'transcode': - Transcode (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) - % elif data['stream_audio_decision'] == 'copy': - Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) - % else: - Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) + % if data['stream_audio_decision']: + % if data['stream_audio_decision'] == 'transcode': + Transcode (${AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} ${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) + % elif data['stream_audio_decision'] == 'copy': + Direct Stream (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) + % else: + Direct Play (${AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) + % endif % endif
  • diff --git a/data/interfaces/default/index.html b/data/interfaces/default/index.html index 24e9ae5d..d6b479d5 100644 --- a/data/interfaces/default/index.html +++ b/data/interfaces/default/index.html @@ -437,6 +437,8 @@ var video_decision = ''; if (['movie', 'episode', 'clip'].indexOf(s.media_type) > -1 && s.stream_video_decision) { + var v_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.video_dynamic_range : ''; + var sv_bd = (s.video_dynamic_range === 'HDR') ? ' ' + s.stream_video_dynamic_range : ''; var v_res= ''; switch (s.video_resolution.toLowerCase()) { case 'sd': @@ -462,11 +464,11 @@ if (s.stream_video_decision === 'transcode') { var hw_d = (s.transcode_hw_decoding === 1) ? ' (HW)' : ''; var hw_e = (s.transcode_hw_encoding === 1) ? ' (HW)' : ''; - video_decision = 'Transcode (' + s.video_codec.toUpperCase() + hw_d + ' ' + v_res + ' ' + s.stream_video_codec.toUpperCase() + hw_e + ' ' + sv_res + ')'; + video_decision = 'Transcode (' + s.video_codec.toUpperCase() + hw_d + ' ' + v_res + v_bd + ' ' + s.stream_video_codec.toUpperCase() + hw_e + ' ' + sv_res + sv_bd + ')'; } else if (s.stream_video_decision === 'copy') { - video_decision = 'Direct Stream (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + ')'; + video_decision = 'Direct Stream (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + sv_bd + ')'; } else { - video_decision = 'Direct Play (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + ')'; + video_decision = 'Direct Play (' + s.stream_video_codec.toUpperCase() + ' ' + sv_res + sv_bd + ')'; } } else if (s.media_type === 'photo') { video_decision = 'Direct Play (' + s.width + 'x' + s.height + ')'; diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index 485b378e..f81f35e3 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -1262,6 +1262,11 @@ class PmsConnect(object): 'video_codec_level': helpers.get_xml_attr(stream, 'level'), 'video_bitrate': helpers.get_xml_attr(stream, 'bitrate'), 'video_bit_depth': helpers.get_xml_attr(stream, 'bitDepth'), + 'video_chroma_subsampling': helpers.get_xml_attr(stream, 'chromaSubsampling'), + 'video_color_primaries': helpers.get_xml_attr(stream, 'colorPrimaries'), + 'video_color_range': helpers.get_xml_attr(stream, 'colorRange'), + 'video_color_space': helpers.get_xml_attr(stream, 'colorSpace'), + 'video_color_trc': helpers.get_xml_attr(stream, 'colorTrc'), 'video_frame_rate': helpers.get_xml_attr(stream, 'frameRate'), 'video_ref_frames': helpers.get_xml_attr(stream, 'refFrames'), 'video_height': helpers.get_xml_attr(stream, 'height'), @@ -1698,6 +1703,11 @@ class PmsConnect(object): video_id = helpers.get_xml_attr(video_stream_info, 'id') video_details = {'stream_video_bitrate': helpers.get_xml_attr(video_stream_info, 'bitrate'), 'stream_video_bit_depth': helpers.get_xml_attr(video_stream_info, 'bitDepth'), + 'stream_video_chroma_subsampling': helpers.get_xml_attr(video_stream_info, 'chromaSubsampling'), + 'stream_video_color_primaries': helpers.get_xml_attr(video_stream_info, 'colorPrimaries'), + 'stream_video_color_range': helpers.get_xml_attr(video_stream_info, 'colorRange'), + 'stream_video_color_space': helpers.get_xml_attr(video_stream_info, 'colorSpace'), + 'stream_video_color_trc': helpers.get_xml_attr(video_stream_info, 'colorTrc'), 'stream_video_codec_level': helpers.get_xml_attr(video_stream_info, 'level'), 'stream_video_ref_frames': helpers.get_xml_attr(video_stream_info, 'refFrames'), 'stream_video_language': helpers.get_xml_attr(video_stream_info, 'language'), @@ -1708,6 +1718,11 @@ class PmsConnect(object): else: video_details = {'stream_video_bitrate': '', 'stream_video_bit_depth': '', + 'stream_video_chroma_subsampling': '', + 'stream_video_color_primaries': '', + 'stream_video_color_range': '', + 'stream_video_color_space': '', + 'stream_video_color_trc': '', 'stream_video_codec_level': '', 'stream_video_ref_frames': '', 'stream_video_language': '', @@ -1886,6 +1901,11 @@ class PmsConnect(object): 'video_codec_level': '', 'video_bitrate': '', 'video_bit_depth': '', + 'video_chroma_subsampling': '', + 'video_color_primaries': '', + 'video_color_range': '', + 'video_color_space': '', + 'video_color_trc': '', 'video_frame_rate': '', 'video_ref_frames': '', 'video_height': '', @@ -1969,6 +1989,21 @@ class PmsConnect(object): stream_details['stream_video_resolution'], stream_details['stream_video_resolution'] + (video_details['stream_video_scan_type'][:1] or 'p')) + if helpers.cast_to_int(source_video_details['video_bit_depth']) > 8 \ + and source_video_details['video_color_space'] == 'bt2020nc': + stream_details['video_dynamic_range'] = 'HDR' + else: + stream_details['video_dynamic_range'] = 'SDR' + + if helpers.cast_to_int(video_details['stream_video_bit_depth']) > 8 \ + and video_details['stream_video_color_space'] == 'bt2020nc': + stream_details['stream_video_dynamic_range'] = 'HDR' + else: + stream_details['stream_video_dynamic_range'] = 'SDR' + else: + stream_details['video_dynamic_range'] = '' + stream_details['stream_video_dynamic_range'] = '' + # Get the quality profile if media_type in ('movie', 'episode', 'clip') and 'stream_bitrate' in stream_details: if sync_id: