mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-10 07:22:37 -07:00
Flexbox activity card metadata
This commit is contained in:
parent
1bd2f332d9
commit
d77696be59
2 changed files with 292 additions and 256 deletions
|
@ -762,9 +762,17 @@ a .users-poster-face:hover {
|
||||||
.dashboard-activity-terminate-session:hover {
|
.dashboard-activity-terminate-session:hover {
|
||||||
color: #e9a049;
|
color: #e9a049;
|
||||||
}
|
}
|
||||||
|
.dashboard-activity-info-container {
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 225px;
|
||||||
|
width: 385px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
.dashboard-activity-info-scroller {
|
.dashboard-activity-info-scroller {
|
||||||
height: 225px;
|
height: 225px;
|
||||||
width: 335px;
|
width: 100%;
|
||||||
-webkit-flex-grow: 1;
|
-webkit-flex-grow: 1;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
|
@ -807,7 +815,8 @@ a .users-poster-face:hover {
|
||||||
text-align: right;
|
text-align: right;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
float: left;
|
-webkit-flex-shrink: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.dashboard-activity-info-item .sub-value {
|
.dashboard-activity-info-item .sub-value {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
|
@ -909,38 +918,59 @@ a:hover .dashboard-activity-cover {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
padding: 0px 3px 0 3px;
|
padding: 0px 3px 0 3px;
|
||||||
}
|
}
|
||||||
|
.dashboard-activity-metadata-title-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 25px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.dashboard-activity-metadata-play_state-icon {
|
||||||
|
flex-basis: 25px;
|
||||||
|
-webkit-flex-shrink: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
.dashboard-activity-metadata-title {
|
.dashboard-activity-metadata-title {
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 350px;
|
||||||
|
-webkit-flex-grow: 1;
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
.dashboard-activity-metadata-subtitle-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
line-height: 25px;
|
line-height: 25px;
|
||||||
color: #fff;
|
color: #999;
|
||||||
max-width: 100%;
|
}
|
||||||
|
.dashboard-activity-metadata-media_type-icon {
|
||||||
|
flex-basis: 25px;
|
||||||
|
-webkit-flex-shrink: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.dashboard-activity-metadata-subtitle {
|
.dashboard-activity-metadata-subtitle {
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
font-size: 13px;
|
-webkit-flex-grow: 1;
|
||||||
font-weight: bold;
|
flex-grow: 1;
|
||||||
line-height: 25px;
|
|
||||||
color: #999;
|
|
||||||
max-width: 320px;
|
|
||||||
float: left;
|
|
||||||
}
|
}
|
||||||
.dashboard-activity-metadata-user {
|
.dashboard-activity-metadata-user {
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
font-size: 13px;
|
|
||||||
font-weight: bold;
|
|
||||||
line-height: 25px;
|
|
||||||
color: #999;
|
|
||||||
text-align: right;
|
text-align: right;
|
||||||
width: 124px;
|
max-width: 124px;
|
||||||
float: right;
|
flex-basis: 124px;
|
||||||
|
-webkit-flex-shrink: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.dashboard-activity-metadata-user-thumb {
|
.dashboard-activity-metadata-user-thumb {
|
||||||
background-color: #282828;
|
background-color: #282828;
|
||||||
|
@ -3062,7 +3092,7 @@ pre::-webkit-scrollbar-thumb {
|
||||||
.home-platforms-instance {
|
.home-platforms-instance {
|
||||||
width: calc(100% - 20px);
|
width: calc(100% - 20px);
|
||||||
}
|
}
|
||||||
.dashboard-instance {
|
.dashboard-activity-instance {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,207 +123,209 @@ DOCUMENTATION :: END
|
||||||
</div>
|
</div>
|
||||||
% endif
|
% endif
|
||||||
</div>
|
</div>
|
||||||
<div class="dashboard-activity-info-scroller scrollbar-macosx">
|
<div class="dashboard-activity-info-container">
|
||||||
<div class="dashboard-activity-info">
|
<div class="dashboard-activity-info-scroller scrollbar-macosx">
|
||||||
<ul class="list-unstyled dashboard-activity-info-list">
|
<div class="dashboard-activity-info">
|
||||||
<li class="dashboard-activity-info-item">
|
<ul class="list-unstyled dashboard-activity-info-list">
|
||||||
<div class="sub-heading">Platform</div>
|
<li class="dashboard-activity-info-item">
|
||||||
<div class="sub-value">${data['platform']}</div>
|
<div class="sub-heading">Platform</div>
|
||||||
</li>
|
<div class="sub-value">${data['platform']}</div>
|
||||||
<li class="dashboard-activity-info-item">
|
</li>
|
||||||
<div class="sub-heading">Player</div>
|
<li class="dashboard-activity-info-item">
|
||||||
<div class="sub-value">${data['player']}</div>
|
<div class="sub-heading">Player</div>
|
||||||
</li>
|
<div class="sub-value">${data['player']}</div>
|
||||||
<li class="dashboard-activity-info-item">
|
</li>
|
||||||
<div class="sub-heading">Quality</div>
|
<li class="dashboard-activity-info-item">
|
||||||
<div class="sub-value" id="stream_quality-${sk}">
|
<div class="sub-heading">Quality</div>
|
||||||
% if data['media_type'] != 'photo' and data['quality_profile'] != 'Unknown':
|
<div class="sub-value" id="stream_quality-${sk}">
|
||||||
<%
|
% if data['media_type'] != 'photo' and data['quality_profile'] != 'Unknown':
|
||||||
br = helpers.cast_to_int(data['stream_bitrate']) or ''
|
|
||||||
if br:
|
|
||||||
if br > 1000:
|
|
||||||
br = '(' + str(round(br / 1000.0, 1)) + ' Mbps)'
|
|
||||||
else:
|
|
||||||
br = '(' + str(br) + ' kbps)'
|
|
||||||
%>
|
|
||||||
${data['quality_profile']} ${br}
|
|
||||||
% else:
|
|
||||||
${data['quality_profile']}
|
|
||||||
% endif
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
% if data['optimized_version'] == '1':
|
|
||||||
<li class="dashboard-activity-info-item">
|
|
||||||
<div class="sub-heading">Optimized</div>
|
|
||||||
<div class="sub-value" id="optimized_version-${sk}">
|
|
||||||
${data['optimized_version_profile']}
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
% endif
|
|
||||||
</ul>
|
|
||||||
<ul class="list-unstyled dashboard-activity-info-list">
|
|
||||||
<li class="dashboard-activity-info-item">
|
|
||||||
% if _session['user_group'] == 'admin':
|
|
||||||
<div class="sub-heading"><span class="raw-stream-info-modal" data-toggle="modal" data-target="#raw-stream-info-modal" data-key="${sk}">Stream</span></div>\
|
|
||||||
% else:
|
|
||||||
<div class="sub-heading">Stream</div>
|
|
||||||
% endif
|
|
||||||
<div class="sub-value" id="transcode_decision-${sk}">
|
|
||||||
% if data['transcode_decision'] == 'transcode':
|
|
||||||
Transcode
|
|
||||||
% if data['transcode_throttled'] == '1':
|
|
||||||
(Throttled)
|
|
||||||
% else:
|
|
||||||
(Speed: ${data['transcode_speed']})
|
|
||||||
% endif
|
|
||||||
% elif data['transcode_decision'] == 'copy':
|
|
||||||
Direct Stream
|
|
||||||
% else:
|
|
||||||
Direct Play ${'(Synced)' if data['synced_version'] == '1' else ''}
|
|
||||||
% endif
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li class="dashboard-activity-info-item">
|
|
||||||
<div class="sub-heading">Container</div>
|
|
||||||
<div class="sub-value" id="transcode_container-${sk}">
|
|
||||||
% if data.get('stream_container_decision') == 'transcode':
|
|
||||||
Transcode (${data['container'].upper()} → ${data['stream_container'].upper()})
|
|
||||||
% else:
|
|
||||||
Direct Play (${data['container'].upper()})
|
|
||||||
% endif
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
% if data['media_type'] in ('movie', 'episode', 'clip', 'photo'):
|
|
||||||
<li class="dashboard-activity-info-item">
|
|
||||||
<div class="sub-heading">Video</div>
|
|
||||||
<div class="sub-value" id="video_decision-${sk}">
|
|
||||||
% if data['media_type'] in ('movie', 'episode', 'clip'):
|
|
||||||
% if data.get('stream_video_decision') == 'transcode':
|
|
||||||
<%
|
<%
|
||||||
hw_d = hw_e = ''
|
br = helpers.cast_to_int(data['stream_bitrate']) or ''
|
||||||
if data['transcode_hw_requested'] == '1' and data['transcode_hw_full_pipeline'] == '0':
|
if br:
|
||||||
hw_d = ' (HW)'
|
if br > 1000:
|
||||||
elif data['transcode_hw_requested'] == '1' and data['transcode_hw_full_pipeline'] == '1':
|
br = '(' + str(round(br / 1000.0, 1)) + ' Mbps)'
|
||||||
hw_d = hw_e = ' (HW)'
|
else:
|
||||||
|
br = '(' + str(br) + ' kbps)'
|
||||||
%>
|
%>
|
||||||
Transcode (${data['video_codec'].upper()}${hw_d} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])} → ${data['stream_video_codec'].upper()}${hw_e} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
|
${data['quality_profile']} ${br}
|
||||||
% 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'])})
|
|
||||||
% else:
|
% else:
|
||||||
Direct Play (${data['video_codec'].upper()} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])})
|
${data['quality_profile']}
|
||||||
% endif
|
% endif
|
||||||
% elif data['media_type'] == 'photo':
|
</div>
|
||||||
Direct Play (${data['width']}x${data['height']})
|
</li>
|
||||||
% endif
|
% if data['optimized_version'] == '1':
|
||||||
</div>
|
<li class="dashboard-activity-info-item">
|
||||||
</li>
|
<div class="sub-heading">Optimized</div>
|
||||||
% endif
|
<div class="sub-value" id="optimized_version-${sk}">
|
||||||
% if data['media_type'] in ('movie', 'episode', 'clip', 'track'):
|
${data['optimized_version_profile']}
|
||||||
<li class="dashboard-activity-info-item">
|
</div>
|
||||||
<div class="sub-heading">Audio</div>
|
</li>
|
||||||
<div class="sub-value" id="audio_decision-${sk}">
|
% endif
|
||||||
% if data.get('stream_audio_decision') == 'transcode':
|
</ul>
|
||||||
Transcode (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} → ${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
|
<ul class="list-unstyled dashboard-activity-info-list">
|
||||||
% elif data.get('stream_audio_decision') == 'copy':
|
<li class="dashboard-activity-info-item">
|
||||||
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()})
|
% if _session['user_group'] == 'admin':
|
||||||
|
<div class="sub-heading"><span class="raw-stream-info-modal" data-toggle="modal" data-target="#raw-stream-info-modal" data-key="${sk}">Stream</span></div>\
|
||||||
% else:
|
% else:
|
||||||
Direct Play (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()})
|
<div class="sub-heading">Stream</div>
|
||||||
% endif
|
% endif
|
||||||
</div>
|
<div class="sub-value" id="transcode_decision-${sk}">
|
||||||
</li>
|
% if data['transcode_decision'] == 'transcode':
|
||||||
% endif
|
Transcode
|
||||||
% if data['media_type'] in ('movie', 'episode', 'clip'):
|
% if data['transcode_throttled'] == '1':
|
||||||
<li class="dashboard-activity-info-item">
|
(Throttled)
|
||||||
<div class="sub-heading">Subtitle</div>
|
% else:
|
||||||
<div class="sub-value" id="subtitle_decision-${sk}">
|
(Speed: ${data['transcode_speed']})
|
||||||
% if data['subtitles'] == '1':
|
% endif
|
||||||
% if data['stream_subtitle_decision'] == 'transcode':
|
% elif data['transcode_decision'] == 'copy':
|
||||||
Transcode (${data['subtitle_codec'].upper()} → ${data['stream_subtitle_codec'].upper()})
|
Direct Stream
|
||||||
% elif data['stream_subtitle_decision'] == 'copy':
|
|
||||||
Direct Stream (${data['subtitle_codec'].upper()})
|
|
||||||
% elif data['stream_subtitle_decision'] == 'burn':
|
|
||||||
Burn (${data['subtitle_codec'].upper()})
|
|
||||||
% else:
|
% else:
|
||||||
Direct Play (${data['subtitle_codec'].upper()})
|
Direct Play ${'(Synced)' if data['synced_version'] == '1' else ''}
|
||||||
% endif
|
% endif
|
||||||
% else:
|
</div>
|
||||||
None
|
</li>
|
||||||
% endif
|
<li class="dashboard-activity-info-item">
|
||||||
</div>
|
<div class="sub-heading">Container</div>
|
||||||
</li>
|
<div class="sub-value" id="transcode_container-${sk}">
|
||||||
% endif
|
% if data.get('stream_container_decision') == 'transcode':
|
||||||
</ul>
|
Transcode (${data['container'].upper()} → ${data['stream_container'].upper()})
|
||||||
<ul class="list-unstyled dashboard-activity-info-list">
|
% else:
|
||||||
<li class="dashboard-activity-info-item">
|
Direct Play (${data['container'].upper()})
|
||||||
<div class="sub-heading">Location</div>
|
% endif
|
||||||
<div class="sub-value">
|
</div>
|
||||||
% if data['ip_address'] != 'N/A':
|
</li>
|
||||||
${'LAN' if data['local'] == '1' else 'WAN'}: ${data['ip_address']}
|
% if data['media_type'] in ('movie', 'episode', 'clip', 'photo'):
|
||||||
<a href="#" class="external_ip-modal" data-toggle="modal" data-target="#ip-info-modal" data-ip="${data['ip_address']}">
|
<li class="dashboard-activity-info-item">
|
||||||
<span id="external_ip-${sk}" class="external-ip-tooltip" data-toggle="tooltip" title="Lookup IP" style="display: none;"><i class="fa fa-map-marker"></i></span>
|
<div class="sub-heading">Video</div>
|
||||||
</a>
|
<div class="sub-value" id="video_decision-${sk}">
|
||||||
<script>
|
% if data['media_type'] in ('movie', 'episode', 'clip'):
|
||||||
isPrivateIP("${data['ip_address']}").then(function () {
|
% if data.get('stream_video_decision') == 'transcode':
|
||||||
$("#external_ip-${sk}").hide();
|
<%
|
||||||
}, function () {
|
hw_d = hw_e = ''
|
||||||
$("#external_ip-${sk}").show();
|
if data['transcode_hw_requested'] == '1' and data['transcode_hw_full_pipeline'] == '0':
|
||||||
});
|
hw_d = ' (HW)'
|
||||||
</script>
|
elif data['transcode_hw_requested'] == '1' and data['transcode_hw_full_pipeline'] == '1':
|
||||||
% else:
|
hw_d = hw_e = ' (HW)'
|
||||||
N/A
|
%>
|
||||||
% endif
|
Transcode (${data['video_codec'].upper()}${hw_d} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])} → ${data['stream_video_codec'].upper()}${hw_e} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
|
||||||
</div>
|
% elif data.get('stream_video_decision') == 'copy':
|
||||||
</li>
|
Direct Stream (${data['stream_video_codec'].upper()} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['stream_video_resolution'], data['stream_video_resolution'])})
|
||||||
<li class="dashboard-activity-info-item">
|
% else:
|
||||||
<div class="sub-heading">Bandwidth</div>
|
Direct Play (${data['video_codec'].upper()} ${plexpy.common.VIDEO_RESOLUTION_OVERRIDES.get(data['video_resolution'], data['video_resolution'])})
|
||||||
<div class="sub-value">
|
% endif
|
||||||
% if data['media_type'] != 'photo' and helpers.cast_to_int(data['bandwidth']):
|
% elif data['media_type'] == 'photo':
|
||||||
<%
|
Direct Play (${data['width']}x${data['height']})
|
||||||
bw = helpers.cast_to_int(data['bandwidth'])
|
% endif
|
||||||
if bw != "Unknown":
|
</div>
|
||||||
if bw > 1000:
|
</li>
|
||||||
bw = str(round(bw / 1000.0, 1)) + ' Mbps'
|
% endif
|
||||||
else:
|
% if data['media_type'] in ('movie', 'episode', 'clip', 'track'):
|
||||||
bw = str(bw) + ' kbps'
|
<li class="dashboard-activity-info-item">
|
||||||
%>
|
<div class="sub-heading">Audio</div>
|
||||||
<span id="stream-bandwidth-${sk}">${bw}</span>
|
<div class="sub-value" id="audio_decision-${sk}">
|
||||||
<span id="streaming-brain-${sk}" data-toggle="tooltip" title="Streaming Brain Estimate"><i class="fa fa-info-circle"></i></span>
|
% if data.get('stream_audio_decision') == 'transcode':
|
||||||
% elif data['synced_version'] == '1' or data['channel_stream'] == '1':
|
Transcode (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()} → ${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['stream_audio_codec'], data['stream_audio_codec'].upper())} ${data['stream_audio_channel_layout'].split('(')[0].capitalize()})
|
||||||
<span id="stream-bandwidth-${sk}">None</span>
|
% elif data.get('stream_audio_decision') == 'copy':
|
||||||
% else:
|
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()})
|
||||||
<span id="stream-bandwidth-${sk}">Unknown</span>
|
% else:
|
||||||
% endif
|
Direct Play (${plexpy.common.AUDIO_CODEC_OVERRIDES.get(data['audio_codec'], data['audio_codec'].upper())} ${data['audio_channel_layout'].split('(')[0].capitalize()})
|
||||||
</div>
|
% endif
|
||||||
</li>
|
</div>
|
||||||
</ul>
|
</li>
|
||||||
|
% endif
|
||||||
|
% if data['media_type'] in ('movie', 'episode', 'clip'):
|
||||||
|
<li class="dashboard-activity-info-item">
|
||||||
|
<div class="sub-heading">Subtitle</div>
|
||||||
|
<div class="sub-value" id="subtitle_decision-${sk}">
|
||||||
|
% if data['subtitles'] == '1':
|
||||||
|
% if data['stream_subtitle_decision'] == 'transcode':
|
||||||
|
Transcode (${data['subtitle_codec'].upper()} → ${data['stream_subtitle_codec'].upper()})
|
||||||
|
% elif data['stream_subtitle_decision'] == 'copy':
|
||||||
|
Direct Stream (${data['subtitle_codec'].upper()})
|
||||||
|
% elif data['stream_subtitle_decision'] == 'burn':
|
||||||
|
Burn (${data['subtitle_codec'].upper()})
|
||||||
|
% else:
|
||||||
|
Direct Play (${data['subtitle_codec'].upper()})
|
||||||
|
% endif
|
||||||
|
% else:
|
||||||
|
None
|
||||||
|
% endif
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
% endif
|
||||||
|
</ul>
|
||||||
|
<ul class="list-unstyled dashboard-activity-info-list">
|
||||||
|
<li class="dashboard-activity-info-item">
|
||||||
|
<div class="sub-heading">Location</div>
|
||||||
|
<div class="sub-value">
|
||||||
|
% if data['ip_address'] != 'N/A':
|
||||||
|
${'LAN' if data['local'] == '1' else 'WAN'}: ${data['ip_address']}
|
||||||
|
<a href="#" class="external_ip-modal" data-toggle="modal" data-target="#ip-info-modal" data-ip="${data['ip_address']}">
|
||||||
|
<span id="external_ip-${sk}" class="external-ip-tooltip" data-toggle="tooltip" title="Lookup IP" style="display: none;"><i class="fa fa-map-marker"></i></span>
|
||||||
|
</a>
|
||||||
|
<script>
|
||||||
|
isPrivateIP("${data['ip_address']}").then(function () {
|
||||||
|
$("#external_ip-${sk}").hide();
|
||||||
|
}, function () {
|
||||||
|
$("#external_ip-${sk}").show();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
% else:
|
||||||
|
N/A
|
||||||
|
% endif
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="dashboard-activity-info-item">
|
||||||
|
<div class="sub-heading">Bandwidth</div>
|
||||||
|
<div class="sub-value">
|
||||||
|
% if data['media_type'] != 'photo' and helpers.cast_to_int(data['bandwidth']):
|
||||||
|
<%
|
||||||
|
bw = helpers.cast_to_int(data['bandwidth'])
|
||||||
|
if bw != "Unknown":
|
||||||
|
if bw > 1000:
|
||||||
|
bw = str(round(bw / 1000.0, 1)) + ' Mbps'
|
||||||
|
else:
|
||||||
|
bw = str(bw) + ' kbps'
|
||||||
|
%>
|
||||||
|
<span id="stream-bandwidth-${sk}">${bw}</span>
|
||||||
|
<span id="streaming-brain-${sk}" data-toggle="tooltip" title="Streaming Brain Estimate"><i class="fa fa-info-circle"></i></span>
|
||||||
|
% elif data['synced_version'] == '1' or data['channel_stream'] == '1':
|
||||||
|
<span id="stream-bandwidth-${sk}">None</span>
|
||||||
|
% else:
|
||||||
|
<span id="stream-bandwidth-${sk}">Unknown</span>
|
||||||
|
% endif
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
% if data['media_type'] != 'photo':
|
||||||
|
<div class="dashboard-activity-info-time">
|
||||||
|
% if data['view_offset']:
|
||||||
|
ETA:
|
||||||
|
<span id="stream-eta-${sk}">
|
||||||
|
<script>
|
||||||
|
$("#stream-eta-${sk}").html(moment().add(parseInt("${data['duration']}") - parseInt("${data['view_offset']}"), 'milliseconds').format(time_format));
|
||||||
|
</script>
|
||||||
|
</span><br /><span class="progress_time_offset" id="stream-view-offset-${sk}" data-last_view_offset="${data['view_offset']}" data-view_offset="${data['view_offset']}" data-state="${data['state']}">
|
||||||
|
<script>
|
||||||
|
$("#stream-view-offset-${sk}").html(millisecondsToMinutes(parseInt("${data['view_offset']}"), false));
|
||||||
|
</script>
|
||||||
|
</span> / <span class="progress_time_total" id="stream-duration-${sk}">
|
||||||
|
<script>
|
||||||
|
$("#stream-duration-${sk}").html(millisecondsToMinutes(parseInt("${data['duration']}"), false));
|
||||||
|
</script>
|
||||||
|
</span>
|
||||||
|
% else:
|
||||||
|
ETA: Unknown<br />0:00 / <span class="progress_time_total" id="stream-duration-${sk}">
|
||||||
|
<script>
|
||||||
|
$("#stream-duration-${sk}").html(millisecondsToMinutes(parseInt("${data['duration']}"), false));
|
||||||
|
</script>
|
||||||
|
</span>
|
||||||
|
% endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
% if data['media_type'] != 'photo':
|
|
||||||
<div class="dashboard-activity-info-time">
|
|
||||||
% if data['view_offset']:
|
|
||||||
ETA:
|
|
||||||
<span id="stream-eta-${sk}">
|
|
||||||
<script>
|
|
||||||
$("#stream-eta-${sk}").html(moment().add(parseInt("${data['duration']}") - parseInt("${data['view_offset']}"), 'milliseconds').format(time_format));
|
|
||||||
</script>
|
|
||||||
</span><br /><span class="progress_time_offset" id="stream-view-offset-${sk}" data-last_view_offset="${data['view_offset']}" data-view_offset="${data['view_offset']}" data-state="${data['state']}">
|
|
||||||
<script>
|
|
||||||
$("#stream-view-offset-${sk}").html(millisecondsToMinutes(parseInt("${data['view_offset']}"), false));
|
|
||||||
</script>
|
|
||||||
</span> / <span class="progress_time_total" id="stream-duration-${sk}">
|
|
||||||
<script>
|
|
||||||
$("#stream-duration-${sk}").html(millisecondsToMinutes(parseInt("${data['duration']}"), false));
|
|
||||||
</script>
|
|
||||||
</span>
|
|
||||||
% else:
|
|
||||||
ETA: Unknown<br />0:00 / <span class="progress_time_total" id="stream-duration-${sk}">
|
|
||||||
<script>
|
|
||||||
$("#stream-duration-${sk}").html(millisecondsToMinutes(parseInt("${data['duration']}"), false));
|
|
||||||
</script>
|
|
||||||
</span>
|
|
||||||
% endif
|
% endif
|
||||||
</div>
|
</div>
|
||||||
% endif
|
|
||||||
</div>
|
</div>
|
||||||
<div class="dashboard-activity-progress">
|
<div class="dashboard-activity-progress">
|
||||||
<div class="dashboard-activity-progress-bar">
|
<div class="dashboard-activity-progress-bar">
|
||||||
|
@ -340,8 +342,8 @@ DOCUMENTATION :: END
|
||||||
% else:
|
% else:
|
||||||
<div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${data['user_thumb']});"></div>
|
<div class="dashboard-activity-metadata-user-thumb" style="background-image: url(${data['user_thumb']});"></div>
|
||||||
% endif
|
% endif
|
||||||
<div class="dashboard-activity-metadata-title">
|
<div class="dashboard-activity-metadata-title-container">
|
||||||
<span id="play-state-${sk}" title="${data['state'].capitalize()}">
|
<div id="play-state-${sk}" class="dashboard-activity-metadata-play_state-icon" title="${data['state'].capitalize()}">
|
||||||
% if data['state'] == 'playing':
|
% if data['state'] == 'playing':
|
||||||
<i class="fa fa-fw fa-play"></i>
|
<i class="fa fa-fw fa-play"></i>
|
||||||
% elif data['state'] == 'paused':
|
% elif data['state'] == 'paused':
|
||||||
|
@ -349,8 +351,9 @@ DOCUMENTATION :: END
|
||||||
% elif data['state'] == 'buffering':
|
% elif data['state'] == 'buffering':
|
||||||
<i class="fa fa-fw fa-spinner"></i>
|
<i class="fa fa-fw fa-spinner"></i>
|
||||||
% endif
|
% endif
|
||||||
</span>
|
</div>
|
||||||
% if data['channel_stream'] == '0':
|
<div class="dashboard-activity-metadata-title">
|
||||||
|
% if data['channel_stream'] == '0':
|
||||||
% if data['media_type'] == 'movie':
|
% if data['media_type'] == 'movie':
|
||||||
<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'] == 'episode':
|
% elif data['media_type'] == 'episode':
|
||||||
|
@ -366,16 +369,17 @@ DOCUMENTATION :: END
|
||||||
% else:
|
% else:
|
||||||
<span title="${data['title']}">${data['title']}</span>
|
<span title="${data['title']}">${data['title']}</span>
|
||||||
% endif
|
% endif
|
||||||
% elif data['media_type'] == 'episode' and data['grandparent_title']:
|
% elif data['media_type'] == 'episode' and data['grandparent_title']:
|
||||||
<span title="${data['grandparent_title']}">${data['grandparent_title']}</span>
|
<span title="${data['grandparent_title']}">${data['grandparent_title']}</span>
|
||||||
- <span title="${data['title']}">${data['title']}</span>
|
- <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
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="dashboard-activity-metadata-subtitle">
|
<div class="dashboard-activity-metadata-subtitle-container">
|
||||||
% if data['channel_stream'] == '0':
|
% if data['channel_stream'] == '0':
|
||||||
<span id="media-type-${sk}" title="${data['media_type'].capitalize()}">
|
<div id="media-type-${sk}" class="dashboard-activity-metadata-media_type-icon" title="${data['media_type'].capitalize()}">
|
||||||
% if data['media_type'] == 'movie':
|
% if data['media_type'] == 'movie':
|
||||||
<i class="fa fa-fw fa-film"></i>
|
<i class="fa fa-fw fa-film"></i>
|
||||||
% elif data['media_type'] == 'episode':
|
% elif data['media_type'] == 'episode':
|
||||||
|
@ -387,49 +391,51 @@ DOCUMENTATION :: END
|
||||||
% elif data['media_type'] == 'clip':
|
% elif data['media_type'] == 'clip':
|
||||||
<i class="fa fa-fw fa-video-camera"></i>
|
<i class="fa fa-fw fa-video-camera"></i>
|
||||||
% endif
|
% endif
|
||||||
</span>
|
</div>
|
||||||
% else:
|
% else:
|
||||||
<span id="media-type-${sk}" title="Channel">
|
<div id="media-type-${sk}" title="Channel">
|
||||||
<i class="fa fa-fw fa-cloud"></i>
|
<i class="fa fa-fw fa-cloud"></i>
|
||||||
</span>
|
</div>
|
||||||
% endif
|
% endif
|
||||||
% if data['channel_stream'] == '0':
|
<div class="dashboard-activity-metadata-subtitle">
|
||||||
% if data['media_type'] == 'movie':
|
% if data['channel_stream'] == '0':
|
||||||
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
|
% if data['media_type'] == 'movie':
|
||||||
% elif data['media_type'] == 'episode':
|
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
|
||||||
<a href="info?rating_key=${data['parent_rating_key']}" title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</a>
|
% elif data['media_type'] == 'episode':
|
||||||
· <a href="info?rating_key=${data['rating_key']}" title="Episode ${data['media_index']}" class="sub-heading">E${data['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>
|
||||||
% elif data['media_type'] == 'track':
|
· <a href="info?rating_key=${data['rating_key']}" title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</a>
|
||||||
<a id="metadata-parent_title-${sk}" href="info?rating_key=${data['parent_rating_key']}" title="${data['parent_title']}" class="sub-heading">${data['parent_title']}</a>
|
% elif data['media_type'] == 'track':
|
||||||
% elif data['media_type'] == 'photo':
|
<a id="metadata-parent_title-${sk}" href="info?rating_key=${data['parent_rating_key']}" title="${data['parent_title']}" class="sub-heading">${data['parent_title']}</a>
|
||||||
<span title="${data['title']}" class="sub-heading">${data['title']}</span>
|
% elif data['media_type'] == 'photo':
|
||||||
|
<span title="${data['title']}" class="sub-heading">${data['title']}</span>
|
||||||
|
% else:
|
||||||
|
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
|
||||||
|
% endif
|
||||||
|
% elif data['channel_title']:
|
||||||
|
<span title="${data['channel_title']}" class="sub-heading">${data['channel_title']}</span>
|
||||||
|
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
|
||||||
|
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
|
||||||
|
· <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
|
||||||
|
% elif data['media_type'] == 'episode' and data['originally_available_at']:
|
||||||
|
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
|
||||||
|
% endif
|
||||||
% else:
|
% else:
|
||||||
<span title="${data['year']}" class="sub-heading">${data['year']}</span>
|
<span title="Channel" class="sub-heading">Channel</span>
|
||||||
|
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
|
||||||
|
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
|
||||||
|
· <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
|
||||||
|
% elif data['media_type'] == 'episode' and data['originally_available_at']:
|
||||||
|
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
|
||||||
|
% endif
|
||||||
% endif
|
% endif
|
||||||
% elif data['channel_title']:
|
</div>
|
||||||
<span title="${data['channel_title']}" class="sub-heading">${data['channel_title']}</span>
|
<div class="dashboard-activity-metadata-user">
|
||||||
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
|
% if data['user_id']:
|
||||||
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
|
<a href="user?user_id=${data['user_id']}" title="${data['friendly_name']}">${data['friendly_name']}</a>
|
||||||
· <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
|
% else:
|
||||||
% elif data['media_type'] == 'episode' and data['originally_available_at']:
|
${data['friendly_name']}
|
||||||
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
|
|
||||||
% endif
|
% endif
|
||||||
% else:
|
</div>
|
||||||
<span title="Channel" class="sub-heading">Channel</span>
|
|
||||||
% if data['media_type'] == 'episode' and data['parent_media_index'] and data['media_index']:
|
|
||||||
(<span title="Season ${data['parent_media_index']}" class="sub-heading">S${data['parent_media_index']}</span>
|
|
||||||
· <span title="Episode ${data['media_index']}" class="sub-heading">E${data['media_index']}</span>)
|
|
||||||
% elif data['media_type'] == 'episode' and data['originally_available_at']:
|
|
||||||
(<span title="${data['originally_available_at']}" class="sub-heading">${data['originally_available_at']}</span>)
|
|
||||||
% endif
|
|
||||||
% endif
|
|
||||||
</div>
|
|
||||||
<div class="dashboard-activity-metadata-user">
|
|
||||||
% if data['user_id']:
|
|
||||||
<a href="user?user_id=${data['user_id']}" title="${data['friendly_name']}">${data['friendly_name']}</a>
|
|
||||||
% else:
|
|
||||||
${data['friendly_name']}
|
|
||||||
% endif
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue