mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-12 16:22:57 -07:00
New pause, resume and buffer notification options.
Reworked notification config in settings menu.
This commit is contained in:
parent
b7baf1a05d
commit
a96482ee3c
9 changed files with 532 additions and 131 deletions
|
@ -1368,7 +1368,7 @@ input[type="color"],
|
|||
}
|
||||
.stacked-configs > li > span > a.toggle-left {
|
||||
color: #444;
|
||||
padding-right: 2px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
.stacked-configs > li > span > a:hover {
|
||||
color: #eee;
|
||||
|
|
98
data/interfaces/default/notification_triggers_modal.html
Normal file
98
data/interfaces/default/notification_triggers_modal.html
Normal file
|
@ -0,0 +1,98 @@
|
|||
<%!
|
||||
from plexpy import helpers
|
||||
%>
|
||||
% if data:
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
|
||||
<h4 class="modal-title" id="notification-triggers-modal-header">${data['name']} Notification Triggers</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<p class="help-block">
|
||||
Watched notifications are only applicable for video items.
|
||||
</p>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" data-size="small" data-id="${data['id']}" data-config-name="${data['config_prefix']}_on_play" ${helpers.checked(data['on_play'])} class="toggle-switches">
|
||||
Notify on playback start
|
||||
</label>
|
||||
<p class="help-block">Trigger notification when a new media item is started.</p>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" data-size="small" data-id="${data['id']}" data-config-name="${data['config_prefix']}_on_stop" ${helpers.checked(data['on_stop'])} class="toggle-switches">
|
||||
Notify on playback stop
|
||||
</label>
|
||||
<p class="help-block">Trigger notification when a media item is stopped.</p>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" data-size="small" data-id="${data['id']}" data-config-name="${data['config_prefix']}_on_pause" ${helpers.checked(data['on_pause'])} class="toggle-switches">
|
||||
Notify on playback pause
|
||||
</label>
|
||||
<p class="help-block">Trigger notification when a media item is paused.</p>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" data-size="small" data-id="${data['id']}" data-config-name="${data['config_prefix']}_on_resume" ${helpers.checked(data['on_resume'])} class="toggle-switches">
|
||||
Notify on playback resume
|
||||
</label>
|
||||
<p class="help-block">Trigger notification when a media item is resumed from a paused state.</p>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" data-size="small" data-id="${data['id']}" data-config-name="${data['config_prefix']}_on_watched" ${helpers.checked(data['on_watched'])} class="toggle-switches">
|
||||
Notify on watched
|
||||
</label>
|
||||
<p class="help-block">Trigger notification when a video item reaches the defined watch percentage.</p>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input type="checkbox" data-size="small" data-id="${data['id']}" data-config-name="${data['config_prefix']}_on_buffer" ${helpers.checked(data['on_buffer'])} class="toggle-switches">
|
||||
Notify on buffer warning
|
||||
</label>
|
||||
<p class="help-block">Trigger notification when a media item triggers the defined buffer threshold.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="button" class="btn btn-bright" data-dismiss="modal" value="Close">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$('.toggle-switches').click(function() {
|
||||
var configToggle = $(this).data('id');
|
||||
var toggle = $(this);
|
||||
if ($(this).is(":checked")) {
|
||||
var data = {};
|
||||
data[$(this).data('config-name')] = 1;
|
||||
$.ajax({
|
||||
url: 'set_notification_config',
|
||||
data: data,
|
||||
async: true,
|
||||
success: function(data) {
|
||||
console.log('success');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
var data = {};
|
||||
data[$(this).data('config-name')] = 0;
|
||||
$.ajax({
|
||||
url: 'set_notification_config',
|
||||
data: data,
|
||||
async: true,
|
||||
success: function(data) {
|
||||
console.log('success');
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
% endif
|
|
@ -5,6 +5,8 @@ from plexpy import notifiers
|
|||
|
||||
available_notification_agents = notifiers.available_notification_agents()
|
||||
%>
|
||||
<%def name="headIncludes()">
|
||||
</%def>
|
||||
|
||||
<%def name="headerIncludes()">
|
||||
</%def>
|
||||
|
@ -79,7 +81,7 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
</div>
|
||||
<p class="help-block">Set your preferred time format. <a href="javascript:void(0)" data-target="#dateTimeOptionsModal" data-toggle="modal">Click here</a> to see the parameter list.</p>
|
||||
</div>
|
||||
<input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully">
|
||||
<p><input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully"></p>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="tabs-2">
|
||||
<div class="padded-header">
|
||||
|
@ -127,7 +129,7 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully">
|
||||
<p><input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully"></p>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="tabs-3">
|
||||
|
||||
|
@ -179,7 +181,7 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
<p class="help-block">Current API key: <strong><br/>${config['api_key']}</strong></p>
|
||||
</div>
|
||||
|
||||
<input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully">
|
||||
<p><input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully"></p>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="tabs-4">
|
||||
|
||||
|
@ -260,7 +262,7 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
<p class="help-block">Refresh the user list when PlexPy starts.</p>
|
||||
</div>
|
||||
|
||||
<input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully">
|
||||
<p><input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully"></p>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="tabs-6">
|
||||
<div class="padded-header">
|
||||
|
@ -304,7 +306,7 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
</div>
|
||||
<p class="help-block"><a href="javascript:void(0)" id="toggle-plexwatch-import-modal" data-target="#plexwatch-import-modal" data-toggle="modal">Click here to Import an existing Plexwatch database.</a></p>
|
||||
|
||||
<input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully">
|
||||
<p><input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully"></p>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="tabs-7">
|
||||
|
||||
|
@ -359,7 +361,30 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
</p>
|
||||
</div>
|
||||
|
||||
<input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully">
|
||||
<div class="padded-header">
|
||||
<h3>Buffer Warnings</h3>
|
||||
</div>
|
||||
<p class="help-block">Note: Buffer warnings only work on certain Plex clients. Android and PlexWeb do not report buffer events accurately or at all.</p>
|
||||
<div class="form-group">
|
||||
<label for="buffer_threshold">Buffer Threshold</label>
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<input type="text" class="form-control" data-parsley-type="integer" id="buffer_threshold" name="buffer_threshold" value="${config['buffer_threshold']}" data-parsley-range="[1,50]" data-parsley-trigger="change" required>
|
||||
</div>
|
||||
</div>
|
||||
<p class="help-block">How many buffer events should we wait before triggering the first warning. Buffer events increment on each monitor ping if play state is buffering.</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="buffer_wait">Buffer Wait</label>
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
<input type="text" class="form-control" data-parsley-type="integer" id="buffer_wait" name="buffer_wait" value="${config['buffer_wait']}" data-parsley-min="0" data-parsley-trigger="change" required>
|
||||
</div>
|
||||
</div>
|
||||
<p class="help-block">The value (in seconds) PlexPy should wait before triggering the next buffer warning. 0 to always trigger.</p>
|
||||
</div>
|
||||
|
||||
<p><input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully"></p>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="tabs-8">
|
||||
|
||||
|
@ -438,6 +463,40 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<div class="link"><i class="fa fa-pause"></i>Playback Pause<i class="fa fa-chevron-down"></i></div>
|
||||
<ul class="submenu">
|
||||
<li>
|
||||
<div class="form-group">
|
||||
<label for="notify_on_pause_subject_text">Subject Line</label>
|
||||
<input class="form-control" type="text" id="notify_on_pause_subject_text" name="notify_on_pause_subject_text" value="${config['notify_on_pause_subject_text']}" data-parsley-trigger="change" required>
|
||||
<p class="help-block">Set a custom subject line.</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="notify_on_pause_body_text">Message Body</label>
|
||||
<input class="form-control" type="text" id="notify_on_pause_body_text" name="notify_on_pause_body_text" value="${config['notify_on_pause_body_text']}" data-parsley-trigger="change" required>
|
||||
<p class="help-block">Set a custom body.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<div class="link"><i class="fa fa-play"></i>Playback Resume<i class="fa fa-chevron-down"></i></div>
|
||||
<ul class="submenu">
|
||||
<li>
|
||||
<div class="form-group">
|
||||
<label for="notify_on_resume_subject_text">Subject Line</label>
|
||||
<input class="form-control" type="text" id="notify_on_resume_subject_text" name="notify_on_resume_subject_text" value="${config['notify_on_resume_subject_text']}" data-parsley-trigger="change" required>
|
||||
<p class="help-block">Set a custom subject line.</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="notify_on_resume_body_text">Message Body</label>
|
||||
<input class="form-control" type="text" id="notify_on_resume_body_text" name="notify_on_resume_body_text" value="${config['notify_on_resume_body_text']}" data-parsley-trigger="change" required>
|
||||
<p class="help-block">Set a custom body.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<div class="link"><i class="fa fa-eye"></i>Watched<i class="fa fa-chevron-down"></i></div>
|
||||
<ul class="submenu">
|
||||
|
@ -455,9 +514,26 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
<div class="link"><i class="fa fa-spinner"></i>Buffer Warnings<i class="fa fa-chevron-down"></i></div>
|
||||
<ul class="submenu">
|
||||
<li>
|
||||
<div class="form-group">
|
||||
<label for="notify_on_buffer_subject_text">Subject Line</label>
|
||||
<input class="form-control" type="text" id="notify_on_buffer_subject_text" name="notify_on_buffer_subject_text" value="${config['notify_on_buffer_subject_text']}" data-parsley-trigger="change" required>
|
||||
<p class="help-block">Set a custom subject line.</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="notify_on_buffer_body_text">Message Body</label>
|
||||
<input class="form-control" type="text" id="notify_on_buffer_body_text" name="notify_on_buffer_body_text" value="${config['notify_on_buffer_body_text']}" data-parsley-trigger="change" required>
|
||||
<p class="help-block">Set a custom body.</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully">
|
||||
<p><input type="button" class="btn btn-bright save-button" value="Save" data-success="Changes saved successfully"></p>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="tabs-9">
|
||||
|
||||
|
@ -465,18 +541,18 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
<h3>Notification Agents</h3>
|
||||
</div>
|
||||
<p class="help-block">
|
||||
Toggle the desired notification option and configure it by selecting the settings icon to the right.
|
||||
Watched notifications are only applicable for video items.
|
||||
Toggle the desired notification options by clicking the bolt icon and configure it by selecting the settings icon to the right.
|
||||
</p>
|
||||
<br/>
|
||||
<ul class="stacked-configs list-unstyled">
|
||||
% for agent in available_notification_agents:
|
||||
<li>
|
||||
<span>
|
||||
<!--<input type="checkbox" name="${agent['config_prefix']}_enabled" id="${agent['config_prefix']}" value="1" ${agent['state']}> ${agent['name']}-->
|
||||
<a class="toggle-left notify-toggle-icon" href="javascript:void(0)" data-toggle="tooltip" data-placement="top" title data-title="Notify on playback start" data-id="${agent['id']}" data-config-name="${agent['config_prefix']}_on_play" data-config-value="${agent['on_play']}"><i class="fa fa-play"></i></a>
|
||||
<a class="toggle-left notify-toggle-icon" href="javascript:void(0)" data-toggle="tooltip" data-placement="top" title data-title="Notify on stop" data-id="${agent['id']}" data-config-name="${agent['config_prefix']}_on_stop" data-config-value="${agent['on_stop']}"><i class="fa fa-stop"></i></a>
|
||||
<a class="toggle-left notify-toggle-icon" href="javascript:void(0)" data-toggle="tooltip" data-placement="top" title data-title="Notify on watched" data-id="${agent['id']}" data-config-name="${agent['config_prefix']}_on_watched" data-config-value="${agent['on_watched']}"><i class="fa fa-eye"></i></a>
|
||||
% if agent['on_play'] or agent['on_stop'] or agent['on_pause'] or agent['on_resume'] or agent['on_buffer'] or agent['on_watched']:
|
||||
<a href="javascript:void(0)" data-target="#notification-triggers-modal" data-id="${agent['id']}" class="toggle-notification-triggers-modal toggle-left active" data-toggle="modal"><i class="fa fa-lg fa-flash"></i></a>
|
||||
% else:
|
||||
<a href="javascript:void(0)" data-target="#notification-triggers-modal" data-id="${agent['id']}" class="toggle-notification-triggers-modal toggle-left" data-toggle="modal"><i class="fa fa-lg fa-flash"></i></a>
|
||||
% endif
|
||||
${agent['name']}
|
||||
% if agent['has_config']:
|
||||
<a href="javascript:void(0)" rel="tooltip" data-target="#notification-config-modal" data-placement="top" title data-title="Open configuration" data-id="${agent['id']}" class="toggle-notification-config-modal toggle-right" data-toggle="modal"><i class="fa fa-lg fa-cog"></i></a>
|
||||
|
@ -661,7 +737,8 @@ available_notification_agents = notifiers.available_notification_agents()
|
|||
</div>
|
||||
</div>
|
||||
<div id="plexwatch-import-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="plexwatch-import-modal"></div>
|
||||
<div id="notification-config-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="notification-setting-modal"></div>
|
||||
<div id="notification-config-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="notification-config-modal"></div>
|
||||
<div id="notification-triggers-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="notification-triggers-modal"></div>
|
||||
<div id="notify-text-sub-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="notify-text-sub-modal">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
|
@ -977,7 +1054,7 @@ $(document).ready(function() {
|
|||
});
|
||||
});
|
||||
|
||||
// Load PlexWatch import modal
|
||||
// Load notification agent config modal
|
||||
$(".toggle-notification-config-modal").click(function() {
|
||||
var configId = $(this).data('id');
|
||||
$.ajax({
|
||||
|
@ -991,100 +1068,18 @@ $(document).ready(function() {
|
|||
});
|
||||
});
|
||||
|
||||
$('.notify-toggle-icon').tooltip();
|
||||
|
||||
$('.notify-toggle-icon').each(function() {
|
||||
if ($(this).data('config-value') == 1) {
|
||||
$(this).addClass("active");
|
||||
}
|
||||
});
|
||||
|
||||
$('.notify-toggle-icon').click(function() {
|
||||
var configToggle = $(this).data('id');
|
||||
var toggle = $(this);
|
||||
if ($(this).hasClass("active")) {
|
||||
var data = {};
|
||||
data[$(this).data('config-name')] = 0;
|
||||
$.ajax({
|
||||
url: 'set_notification_config',
|
||||
data: data,
|
||||
async: true,
|
||||
success: function(data) {
|
||||
toggle.removeClass("active");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
var data = {};
|
||||
data[$(this).data('config-name')] = 1;
|
||||
$.ajax({
|
||||
url: 'set_notification_config',
|
||||
data: data,
|
||||
async: true,
|
||||
success: function(data) {
|
||||
toggle.addClass("active");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if ($("#tv_notify_enable").is(":checked"))
|
||||
{
|
||||
$("#tv_notify_options").show();
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#tv_notify_options").hide();
|
||||
}
|
||||
|
||||
$("#tv_notify_enable").click(function(){
|
||||
if ($("#tv_notify_enable").is(":checked"))
|
||||
{
|
||||
$("#tv_notify_options").slideDown();
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#tv_notify_options").slideUp();
|
||||
}
|
||||
});
|
||||
|
||||
if ($("#movie_notify_enable").is(":checked"))
|
||||
{
|
||||
$("#movie_notify_options").show();
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#movie_notify_options").hide();
|
||||
}
|
||||
|
||||
$("#movie_notify_enable").click(function(){
|
||||
if ($("#movie_notify_enable").is(":checked"))
|
||||
{
|
||||
$("#movie_notify_options").slideDown();
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#movie_notify_options").slideUp();
|
||||
}
|
||||
});
|
||||
|
||||
if ($("#music_notify_enable").is(":checked"))
|
||||
{
|
||||
$("#music_notify_options").show();
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#music_notify_options").hide();
|
||||
}
|
||||
|
||||
$("#music_notify_enable").click(function(){
|
||||
if ($("#music_notify_enable").is(":checked"))
|
||||
{
|
||||
$("#music_notify_options").slideDown();
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#music_notify_options").slideUp();
|
||||
// Load notification triggers config modal
|
||||
$(".toggle-notification-triggers-modal").click(function() {
|
||||
var configId = $(this).data('id');
|
||||
$.ajax({
|
||||
url: 'get_notification_agent_triggers',
|
||||
data: { config_id: configId },
|
||||
cache: false,
|
||||
async: true,
|
||||
complete: function(xhr, status) {
|
||||
$("#notification-triggers-modal").html(xhr.responseText);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('#osxnotifyregister').click(function () {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue