Add channels to activity

This commit is contained in:
JonnyWong16 2017-11-03 19:46:41 -07:00
parent e1dc299cba
commit 67bac92849
5 changed files with 88 additions and 62 deletions

View file

@ -749,8 +749,7 @@ a .users-poster-face:hover {
.dashboard-activity-terminate-session { .dashboard-activity-terminate-session {
width: 100%; width: 100%;
height: 100%; height: 100%;
padding-top: 3px; font-size: 31px;
font-size: 30px;
color: #eee; color: #eee;
text-align: center; text-align: center;
opacity: 0; opacity: 0;

View file

@ -69,46 +69,44 @@ DOCUMENTATION :: END
data-rating_key="${data['rating_key']}" data-parent_rating_key="${data['parent_rating_key']}" data-grandparent_rating_key="${data['grandparent_rating_key']}"> data-rating_key="${data['rating_key']}" data-parent_rating_key="${data['parent_rating_key']}" data-grandparent_rating_key="${data['grandparent_rating_key']}">
<div class="dashboard-activity-container"> <div class="dashboard-activity-container">
<div class="dashboard-activity-background-overlay"> <div class="dashboard-activity-background-overlay">
% if data['media_type'] != 'clip': % if data['channel_stream'] == '0':
<div id="background-${data['session_key']}" class="dashboard-activity-background" style="background-image: url(pms_image_proxy?img=${data['art']}&width=500&height=280&fallback=art&refresh=true);"></div> <div id="background-${data['session_key']}" class="dashboard-activity-background" style="background-image: url(pms_image_proxy?img=${data['art']}&width=500&height=280&fallback=art&refresh=true);"></div>
% else: % else:
% if data['art'].startswith('http'): % if (data['art'] and data['art'].startswith('http')) or (data['thumb'] and data['thumb'].startswith('http')):
<div id="background-${data['session_key']}" class="dashboard-activity-background" style="background-image: url(${data['art']});"></div> <div id="background-${data['session_key']}" class="dashboard-activity-background" style="background-image: url(${data['art']});"></div>
% else: % else:
<!--Hacky solution to escape the image url until I come up with something better--> <!--Hacky solution to escape the image url until I come up with something better-->
<div id="background-${data['session_key']}" class="dashboard-activity-background" style="background-image: url(pms_image_proxy?img=${quote(data['art'])}&width=500&height=280&fallback=art&refresh=true&clip=true);"></div> <div id="background-${data['session_key']}" class="dashboard-activity-background" style="background-image: url(pms_image_proxy?img=${quote(data['art'] or data['thumb'])}&width=500&height=280&fallback=art&refresh=true&clip=true);"></div>
% endif % endif
% endif % endif
<% % if data['channel_stream'] == '0':
if data['media_type'] in ('movie', 'clip'): % if data['media_type'] == 'movie':
rating_key = data['rating_key'] <a id="poster-url-${data['session_key']}" href="info?rating_key=${data['rating_key']}" title="${data['title']}" class="hidden-xs">
title = data['title'] <div id="poster-${data['session_key']}" class="dashboard-activity-poster" style="background-image: url(pms_image_proxy?img=${data['thumb']}&width=300&height=450&fallback=poster&refresh=true);"></div>
thumb = data['thumb']
elif data['media_type'] in ('track', 'photo'):
rating_key = data['parent_rating_key']
title = data['parent_title']
thumb = data['parent_thumb']
elif data['media_type'] in ('episode'):
rating_key = data['grandparent_rating_key']
title = data['grandparent_title']
thumb = data['grandparent_thumb']
else:
rating_key = ''
title = ''
thumb = ''
%>
% if data['rating_key'] and data['media_type'] not in ('photo', 'clip'):
<a id="poster-url-${data['session_key']}" href="info?rating_key=${rating_key}" title="${title}" class="hidden-xs">
<div id="poster-${data['session_key']}" class="dashboard-activity-${'cover' if data['media_type'] == 'track' else 'poster'}" style="background-image: url(pms_image_proxy?img=${thumb}&width=300&height=450&fallback=poster&refresh=true);"></div>
</a> </a>
% elif data['media_type']: % elif data['media_type'] == 'episode':
<div id="poster-${data['session_key']}" class="dashboard-activity-poster" style="background-image: url(pms_image_proxy?img=${thumb}&width=300&height=450&fallback=poster&refresh=true);"></div> <a id="poster-url-${data['session_key']}" href="info?rating_key=${data['grandparent_rating_key']}" title="${data['grandparent_title']}" class="hidden-xs">
<div id="poster-${data['session_key']}" class="dashboard-activity-poster" style="background-image: url(pms_image_proxy?img=${data['grandparent_thumb']}&width=300&height=450&fallback=poster&refresh=true);"></div>
</a>
% elif data['media_type'] == 'track':
<a id="poster-url-${data['session_key']}" href="info?rating_key=${data['parent_rating_key']}" title="${data['parent_title']}" class="hidden-xs">
<div id="poster-${data['session_key']}" class="dashboard-activity-cover" style="background-image: url(pms_image_proxy?img=${data['parent_thumb']}&width=300&height=300&fallback=cover&refresh=true);"></div>
</a>
% elif data['media_type'] in ('photo', 'clip'):
<div id="poster-${data['session_key']}" class="dashboard-activity-poster" style="background-image: url(pms_image_proxy?img=${data['parent_thumb']}&width=300&height=450&fallback=poster&refresh=true);"></div>
% else: % else:
<div id="poster-${data['session_key']}" class="dashboard-activity-poster" style="background-image: url(images/art.png);"></div> <div id="poster-${data['session_key']}" class="dashboard-activity-poster" style="background-image: url(images/art.png);"></div>
% endif % endif
% else:
% if data['channel_icon'].startswith('http'):
<div id="poster-${data['session_key']}" class="dashboard-activity-cover" style="background-image: url(${data['channel_icon']});"></div>
% else:
<div id="poster-${data['session_key']}" class="dashboard-activity-cover" style="background-image: url(pms_image_proxy?img=${data['channel_icon']}&width=300&height=300&fallback=cover&refresh=true);"></div>
% endif
% endif
<div class="dashboard-activity-info-icon"> <div class="dashboard-activity-info-icon">
<% <%
if not _session['user_group'] == 'admin' or data['synced_version'] == '1': if not _session['user_group'] == 'admin' or not data['session_id']:
no_terminate = '-no-terminate' no_terminate = '-no-terminate'
else: else:
no_terminate = '' no_terminate = ''
@ -120,7 +118,7 @@ DOCUMENTATION :: END
</div> </div>
% if _session['user_group'] == 'admin' and plexpy.CONFIG.PMS_PLEXPASS and data['session_id']: % if _session['user_group'] == 'admin' and plexpy.CONFIG.PMS_PLEXPASS and data['session_id']:
<div class="dashboard-activity-terminate-session" id="terminate-button-${data['session_key']}" data-key="${data['session_key']}" data-id="${data['session_id']}" data-toggle="tooltip" title="Terminate Stream"> <div class="dashboard-activity-terminate-session" id="terminate-button-${data['session_key']}" data-key="${data['session_key']}" data-id="${data['session_id']}" data-toggle="tooltip" title="Terminate Stream">
<i class="fa fa-times"></i> <i class="fa fa-times" style="padding-top: 8px;"></i>
</div> </div>
% endif % endif
</div> </div>
@ -180,14 +178,14 @@ DOCUMENTATION :: END
% elif data['transcode_decision'] == 'copy': % elif data['transcode_decision'] == 'copy':
Direct Stream Direct Stream
% else: % else:
Direct Play ${'(Synced)' if data['synced_version'] else ''} Direct Play ${'(Synced)' if data['synced_version'] == '1' else ''}
% endif % endif
</div> </div>
</li> </li>
<li class="dashboard-activity-info-item"> <li class="dashboard-activity-info-item">
<div class="sub-heading">Container</div> <div class="sub-heading">Container</div>
<div class="sub-value" id="transcode_container-${data['session_key']}"> <div class="sub-value" id="transcode_container-${data['session_key']}">
% if data['stream_container_decision'] == 'transcode': % if data.get('stream_container_decision') == 'transcode':
Transcode (${data['container'].upper()} &rarr; ${data['stream_container'].upper()}) Transcode (${data['container'].upper()} &rarr; ${data['stream_container'].upper()})
% else: % else:
Direct Play (${data['container'].upper()}) Direct Play (${data['container'].upper()})
@ -199,7 +197,7 @@ DOCUMENTATION :: END
<div class="sub-heading">Video</div> <div class="sub-heading">Video</div>
<div class="sub-value" id="video_decision-${data['session_key']}"> <div class="sub-value" id="video_decision-${data['session_key']}">
% if data['media_type'] in ('movie', 'episode', 'clip'): % if data['media_type'] in ('movie', 'episode', 'clip'):
% if data['stream_video_decision'] == 'transcode': % if data.get('stream_video_decision') == 'transcode':
<% <%
hw_d = hw_e = '' hw_d = hw_e = ''
if data['transcode_hw_requested'] == '1' and data['transcode_hw_full_pipeline'] == '0': if data['transcode_hw_requested'] == '1' and data['transcode_hw_full_pipeline'] == '0':
@ -208,7 +206,7 @@ DOCUMENTATION :: END
hw_d = hw_e = ' (HW)' hw_d = hw_e = ' (HW)'
%> %>
Transcode (${data['video_codec'].upper()}${hw_d} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])} &rarr; ${data['stream_video_codec'].upper()}${hw_e} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])}) Transcode (${data['video_codec'].upper()}${hw_d} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])} &rarr; ${data['stream_video_codec'].upper()}${hw_e} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
% elif data['stream_video_decision'] == 'copy': % elif data.get('stream_video_decision') == 'copy':
Direct Stream (${data['stream_video_codec'].upper()} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])}) Direct Stream (${data['stream_video_codec'].upper()} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
% else: % else:
Direct Play (${data['video_codec'].upper()} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])}) Direct Play (${data['video_codec'].upper()} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])})
@ -223,9 +221,9 @@ DOCUMENTATION :: END
<li class="dashboard-activity-info-item"> <li class="dashboard-activity-info-item">
<div class="sub-heading">Audio</div> <div class="sub-heading">Audio</div>
<div class="sub-value" id="audio_decision-${data['session_key']}"> <div class="sub-value" id="audio_decision-${data['session_key']}">
% if data['stream_audio_decision'] == 'transcode': % if data.get('stream_audio_decision') == 'transcode':
Transcode (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} &rarr; ${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) Transcode (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} &rarr; ${plexpy.common.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': % elif data.get('stream_audio_decision') == 'copy':
Direct Stream (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()}) Direct Stream (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
% else: % else:
Direct Play (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()}) Direct Play (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()})
@ -278,9 +276,9 @@ DOCUMENTATION :: END
<li class="dashboard-activity-info-item"> <li class="dashboard-activity-info-item">
<div class="sub-heading">Bandwidth</div> <div class="sub-heading">Bandwidth</div>
<div class="sub-value"> <div class="sub-value">
% if data['media_type'] != 'photo' and data['bandwidth']: % if data['media_type'] != 'photo' and helpers.cast_to_int(data['bandwidth']):
<% <%
bw = helpers.cast_to_int(data['bandwidth']) or "Unknown" bw = helpers.cast_to_int(data['bandwidth'])
if bw != "Unknown": if bw != "Unknown":
if bw > 1000: if bw > 1000:
bw = str(round(bw / 1000.0, 1)) + ' Mbps' bw = str(round(bw / 1000.0, 1)) + ' Mbps'
@ -289,7 +287,7 @@ DOCUMENTATION :: END
%> %>
<span id="stream-bandwidth-${data['session_key']}">${bw}</span> <span id="stream-bandwidth-${data['session_key']}">${bw}</span>
<span id="streaming-brain-${data['session_key']}" data-toggle="tooltip" title="Streaming Brain Estimate"><i class="fa fa-info-circle"></i></span> <span id="streaming-brain-${data['session_key']}" data-toggle="tooltip" title="Streaming Brain Estimate"><i class="fa fa-info-circle"></i></span>
% elif data['synced_version'] == '1': % elif data['synced_version'] == '1' or data['channel_stream'] == '1':
<span id="stream-bandwidth-${data['session_key']}">None</span> <span id="stream-bandwidth-${data['session_key']}">None</span>
% else: % else:
<span id="stream-bandwidth-${data['session_key']}">Unknown</span> <span id="stream-bandwidth-${data['session_key']}">Unknown</span>
@ -301,6 +299,7 @@ DOCUMENTATION :: END
</div> </div>
% if data['media_type'] != 'photo': % if data['media_type'] != 'photo':
<div class="dashboard-activity-info-time"> <div class="dashboard-activity-info-time">
% if data['view_offset']:
ETA: ETA:
<span id="stream-eta-${data['session_key']}"> <span id="stream-eta-${data['session_key']}">
<script> <script>
@ -315,6 +314,13 @@ DOCUMENTATION :: END
$("#stream-duration-${data['session_key']}").html(millisecondsToMinutes(parseInt("${data['duration']}"), false)); $("#stream-duration-${data['session_key']}").html(millisecondsToMinutes(parseInt("${data['duration']}"), false));
</script> </script>
</span> </span>
% else:
ETA: Unknown<br />0:00 / <span class="progress_time_total" id="stream-duration-${data['session_key']}">
<script>
$("#stream-duration-${data['session_key']}").html(millisecondsToMinutes(parseInt("${data['duration']}"), false));
</script>
</span>
% endif
</div> </div>
% endif % endif
</div> </div>
@ -343,28 +349,31 @@ DOCUMENTATION :: END
<i class="fa fa-fw fa-spinner"></i>&nbsp; <i class="fa fa-fw fa-spinner"></i>&nbsp;
% endif % endif
</span> </span>
% if data['rating_key']: % if data['channel_stream'] == '0':
% if data['media_type'] == 'episode': % if data['media_type'] == 'movie':
<a href="info?rating_key=${data['rating_key']}" title="${data['title']}">${data['title']}</a>
% elif data['media_type'] == 'episode':
<a href="info?rating_key=${data['grandparent_rating_key']}" title="${data['grandparent_title']}">${data['grandparent_title']}</a> <a href="info?rating_key=${data['grandparent_rating_key']}" title="${data['grandparent_title']}">${data['grandparent_title']}</a>
- <a href="info?rating_key=${data['rating_key']}" title="${data['title']}">${data['title']}</a> - <a href="info?rating_key=${data['rating_key']}" title="${data['title']}">${data['title']}</a>
% elif data['media_type'] == 'movie':
<a href="info?rating_key=${data['rating_key']}" title="${data['title']}">${data['title']}</a>
% elif data['media_type'] == 'clip':
<span title="${data['title']}">${data['title']}</span>
% elif data['media_type'] == 'track': % elif data['media_type'] == 'track':
<a id="metadata-grandparent_title-${data['session_key']}" href="info?rating_key=${data['grandparent_rating_key']}" title="${data['grandparent_title']}">${data['grandparent_title']}</a> <a id="metadata-grandparent_title-${data['session_key']}" href="info?rating_key=${data['grandparent_rating_key']}" title="${data['grandparent_title']}">${data['grandparent_title']}</a>
- <a id="metadata-title-${data['session_key']}" href="info?rating_key=${data['rating_key']}" title="${data['title']}">${data['title']}</a> - <a id="metadata-title-${data['session_key']}" href="info?rating_key=${data['rating_key']}" title="${data['title']}">${data['title']}</a>
% elif data['media_type'] == 'photo': % elif data['media_type'] == 'photo':
<span title="${data['parent_title']}">${data['parent_title']}</span> <span title="${data['parent_title']}">${data['parent_title']}</span>
% elif data['media_type'] == 'clip':
<span title="${data['title']}">${data['title']}</span>
% else: % else:
<span title="${data['title']}">${data['title']}</span> <span title="${data['title']}">${data['title']}</span>
% endif % endif
% elif data['media_type'] == 'episode':
<span title="${data['channel_title']}">${data['channel_title']}</span>
- <span title="${data['title']}">${data['title']}</span>
% else: % else:
${data['title']} <span title="${data['title']}">${data['title']}</span>
% endif % endif
</div> </div>
<div class="dashboard-activity-metadata-subtitle"> <div class="dashboard-activity-metadata-subtitle">
% if data['rating_key']: % if data['channel_stream'] == '0':
<span id="media-type-${data['session_key']}" title="${data['media_type'].capitalize()}"> <span id="media-type-${data['session_key']}" title="${data['media_type'].capitalize()}">
% if data['media_type'] == 'movie': % if data['media_type'] == 'movie':
<i class="fa fa-fw fa-film"></i>&nbsp; <i class="fa fa-fw fa-film"></i>&nbsp;
@ -378,13 +387,17 @@ DOCUMENTATION :: END
<i class="fa fa-fw fa-video-camera"></i>&nbsp; <i class="fa fa-fw fa-video-camera"></i>&nbsp;
% endif % endif
</span> </span>
% else:
<span id="media-type-${data['session_key']}" title="Channel">
<i class="fa fa-fw fa-cloud"></i>&nbsp;
</span>
% endif % endif
% if data['rating_key']: % if data['channel_stream'] == '0':
% if data['media_type'] == 'episode': % if data['media_type'] == 'movie':
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
% elif data['media_type'] == 'episode':
<a href="info?rating_key=${data['parent_rating_key']}" title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</a> <a href="info?rating_key=${data['parent_rating_key']}" title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</a>
&middot; <a href="info?rating_key=${data['rating_key']}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a> &middot; <a href="info?rating_key=${data['rating_key']}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
% elif data['media_type'] == 'movie':
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
% elif data['media_type'] == 'track': % elif data['media_type'] == 'track':
<a id="metadata-parent_title-${data['session_key']}" href="info?rating_key=${data['parent_rating_key']}" title="${data['parent_title']}" class="sub-heading">${data['parent_title']}</a> <a id="metadata-parent_title-${data['session_key']}" href="info?rating_key=${data['parent_rating_key']}" title="${data['parent_title']}" class="sub-heading">${data['parent_title']}</a>
% elif data['media_type'] == 'photo': % elif data['media_type'] == 'photo':
@ -392,6 +405,11 @@ DOCUMENTATION :: END
% else: % else:
<span title="${data['year']}" class="sub-heading">${data['year']}</span> <span title="${data['year']}" class="sub-heading">${data['year']}</span>
% endif % endif
% elif data['media_type'] == 'episode':
<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
&middot; <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>
% elif data['channel_title']:
<span title="${data['channel_title']}" class="sub-heading">${data['channel_title']}</span>
% endif % endif
</div> </div>
<div class="dashboard-activity-metadata-user"> <div class="dashboard-activity-metadata-user">

View file

@ -422,8 +422,8 @@
} }
$('#optimized_version-' + key).html(s.optimized_version_profile); $('#optimized_version-' + key).html(s.optimized_version_profile);
if (s.media_type != 'photo' && s.bandwidth) { if (s.media_type != 'photo' && parseInt(s.bandwidth)) {
var bw = parseInt(s.bandwidth) || 'Unknown'; var bw = parseInt(s.bandwidth);
if (bw != "Unknown") { if (bw != "Unknown") {
if (bw > 1000) { if (bw > 1000) {
bw = (bw / 1000).toFixed(1) + ' Mbps'; bw = (bw / 1000).toFixed(1) + ' Mbps';
@ -496,14 +496,14 @@
setInterval( function(){ setInterval( function(){
$('.progress_time_offset').each(function () { $('.progress_time_offset').each(function () {
if ($(this).data('state') === 'playing') { if ($(this).data('state') === 'playing' && $(this).data('view_offset')) {
var view_offset = parseInt($(this).data('view_offset')); var view_offset = parseInt($(this).data('view_offset'));
var timestamp = millisecondsToMinutes(view_offset, false); var timestamp = millisecondsToMinutes(view_offset, false);
$(this).html(timestamp).data('view_offset', view_offset + 1000) $(this).html(timestamp).data('view_offset', view_offset + 1000)
} }
}); });
$('.progress-bar').each(function () { $('.progress-bar').each(function () {
if ($(this).data('state') === 'playing') { if ($(this).data('state') === 'playing' && $(this).data('view_offset')) {
var view_offset = parseInt($(this).data('view_offset')); var view_offset = parseInt($(this).data('view_offset'));
var duration = parseInt($(this).data('stream_duration')); var duration = parseInt($(this).data('stream_duration'));
var progress_percent = Math.trunc(view_offset / duration * 100) var progress_percent = Math.trunc(view_offset / duration * 100)

View file

@ -61,6 +61,7 @@ AUDIO_CODEC_OVERRIDES = {'truehd': 'TrueHD'}
VIDEO_RESOLUTION_OVERRIDES = {'sd': 'SD', VIDEO_RESOLUTION_OVERRIDES = {'sd': 'SD',
'480': '480p', '480': '480p',
'540': '540p',
'576': '576p', '576': '576p',
'720': '720p', '720': '720p',
'1080': '1080p', '1080': '1080p',

View file

@ -1418,7 +1418,8 @@ class PmsConnect(object):
transcode_decision = 'direct play' transcode_decision = 'direct play'
# Determine if a synced version is being played # Determine if a synced version is being played
if media_type not in ('photo', 'clip') and not session.getElementsByTagName('Session') and transcode_decision == 'direct play': 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':
synced_version = 1 synced_version = 1
else: else:
synced_version = 0 synced_version = 0
@ -1498,7 +1499,7 @@ class PmsConnect(object):
'stream_aspect_ratio': helpers.get_xml_attr(stream_media_info, 'aspectRatio'), 'stream_aspect_ratio': helpers.get_xml_attr(stream_media_info, 'aspectRatio'),
'stream_audio_codec': helpers.get_xml_attr(stream_media_info, 'audioCodec'), 'stream_audio_codec': helpers.get_xml_attr(stream_media_info, 'audioCodec'),
'stream_audio_channels': stream_audio_channels, 'stream_audio_channels': stream_audio_channels,
'stream_audio_channel_layout': audio_details['stream_audio_channel_layout_'] or common.AUDIO_CHANNELS.get(stream_audio_channels, stream_audio_channels), 'stream_audio_channel_layout': audio_details.get('stream_audio_channel_layout_') or common.AUDIO_CHANNELS.get(stream_audio_channels, stream_audio_channels),
'stream_video_codec': helpers.get_xml_attr(stream_media_info, 'videoCodec'), 'stream_video_codec': helpers.get_xml_attr(stream_media_info, 'videoCodec'),
'stream_video_framerate': helpers.get_xml_attr(stream_media_info, 'videoFrameRate'), 'stream_video_framerate': helpers.get_xml_attr(stream_media_info, 'videoFrameRate'),
'stream_video_resolution': stream_video_resolution, 'stream_video_resolution': stream_video_resolution,
@ -1519,7 +1520,9 @@ class PmsConnect(object):
source_media_details = source_media_part_details = \ source_media_details = source_media_part_details = \
source_video_details = source_audio_details = source_subtitle_details = {} source_video_details = source_audio_details = source_subtitle_details = {}
if media_type == 'clip' and not helpers.get_xml_attr(session, 'ratingKey').isdigit(): if not helpers.get_xml_attr(session, 'ratingKey').isdigit():
channel_stream = 1
clip_media = session.getElementsByTagName('Media')[0] clip_media = session.getElementsByTagName('Media')[0]
audio_channels = helpers.get_xml_attr(clip_media, 'audioChannels') audio_channels = helpers.get_xml_attr(clip_media, 'audioChannels')
metadata_details = {'media_type': media_type, metadata_details = {'media_type': media_type,
@ -1565,9 +1568,13 @@ class PmsConnect(object):
'video_resolution': helpers.get_xml_attr(clip_media, 'videoResolution'), 'video_resolution': helpers.get_xml_attr(clip_media, 'videoResolution'),
'audio_codec': helpers.get_xml_attr(clip_media, 'audioCodec'), 'audio_codec': helpers.get_xml_attr(clip_media, 'audioCodec'),
'audio_channels': audio_channels, 'audio_channels': audio_channels,
'audio_channel_layout': common.AUDIO_CHANNELS.get(audio_channels, audio_channels) 'audio_channel_layout': common.AUDIO_CHANNELS.get(audio_channels, audio_channels),
'channel_icon': helpers.get_xml_attr(session, 'sourceIcon'),
'channel_title': helpers.get_xml_attr(session, 'sourceTitle')
} }
else: else:
channel_stream = 0
media_id = helpers.get_xml_attr(stream_media_info, 'id') media_id = helpers.get_xml_attr(stream_media_info, 'id')
part_id = helpers.get_xml_attr(stream_media_parts_info, 'id') part_id = helpers.get_xml_attr(stream_media_parts_info, 'id')
@ -1616,7 +1623,8 @@ class PmsConnect(object):
'view_offset': progress, 'view_offset': progress,
'progress_percent': str(helpers.get_percent(progress, stream_details['stream_duration'])), 'progress_percent': str(helpers.get_percent(progress, stream_details['stream_duration'])),
'quality_profile': quality_profile, 'quality_profile': quality_profile,
'user': user_details['username'] # Keep for backwards compatibility 'user': user_details['username'], # Keep for backwards compatibility
'channel_stream': channel_stream
} }
if 'rating_key' not in session_output: if 'rating_key' not in session_output: