mirror of
https://github.com/SickGear/SickGear.git
synced 2025-01-07 02:23:38 +00:00
Add priority, device, and sound support to Pushover notifier (port from midgetspy/sickbeard)
This commit is contained in:
parent
2fed918e06
commit
b63bbbbb19
6 changed files with 266 additions and 71 deletions
|
@ -9,6 +9,7 @@
|
||||||
* Change startup code cleanup and PEP8
|
* Change startup code cleanup and PEP8
|
||||||
* Change authentication credentials to display more securely on config pages
|
* Change authentication credentials to display more securely on config pages
|
||||||
* Add a "Use as default home page" selector to General Config/Interface/User Interface
|
* Add a "Use as default home page" selector to General Config/Interface/User Interface
|
||||||
|
* Add priority, device, and sound support to Pushover notifier (port from midgetspy/sickbeard)
|
||||||
|
|
||||||
[develop changelog]
|
[develop changelog]
|
||||||
|
|
||||||
|
|
|
@ -857,11 +857,76 @@
|
||||||
</label>
|
</label>
|
||||||
<label>
|
<label>
|
||||||
<span class="component-title"> </span>
|
<span class="component-title"> </span>
|
||||||
<span class="component-desc"><a href="<%= anon_url('https://pushover.net/apps/clone/SickGear') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><b>Click here</b></a> to create a Pushover API key</span>
|
<span class="component-desc"><a href="<%= anon_url('https://pushover.net/apps/') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;"><b>Click here</b></a> to create a Pushover API key</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-pair">
|
||||||
|
<label for="pushover_priority">
|
||||||
|
<span class="component-title">Pushover priority:</span>
|
||||||
|
<select id="pushover_priority" name="pushover_priority" class="form-control input-sm">
|
||||||
|
<option value="-2" #if $sickbeard.PUSHOVER_PRIORITY == -2 then 'selected="selected"' else ""#>Lowest</option>
|
||||||
|
<option value="-1" #if $sickbeard.PUSHOVER_PRIORITY == -1 then 'selected="selected"' else ""#>Low</option>
|
||||||
|
<option value="0" #if $sickbeard.PUSHOVER_PRIORITY == 0 then 'selected="selected"' else ""#>Normal</option>
|
||||||
|
<option value="1" #if $sickbeard.PUSHOVER_PRIORITY == 1 then 'selected="selected"' else ""#>High</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span class="component-title"> </span>
|
||||||
|
<span class="component-desc">priority of Pushover messages from SickGear.</span>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span class="component-title"> </span>
|
||||||
|
<span class="component-desc">overview: <a href="<%= anon_url('https://pushover.net/api#priority') %>" rel="noreferrer" onclick="window.open(this.href, '_blank'); return false;">https://pushover.net/api#priority</a></span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-pair">
|
||||||
|
<label for="pushover_device">
|
||||||
|
<span class="component-title">Pushover device</span>
|
||||||
|
<input type="hidden" name="pushover_device" id="pushover_device" value="$sickbeard.PUSHOVER_DEVICE" size="35" />
|
||||||
|
<select id="pushover_device_list" name="pushover_device_list" class="pull-left form-control input-sm" style="margin-right: 5px;">
|
||||||
|
</select>
|
||||||
|
<input type="button" class="btn btn-inline" value="Refresh Devices" id="getPushoverDevices" />
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span class="component-title"> </span>
|
||||||
|
<span class="component-desc">which device do you want to push to?</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-pair">
|
||||||
|
<label for="pushover_sound">
|
||||||
|
<span class="component-title">Pushover sound</span>
|
||||||
|
<select id="pushover_sound" name="pushover_sound" class="form-control input-sm">
|
||||||
|
<option value="pushover" #if $sickbeard.PUSHOVER_SOUND == "pushover" then 'selected="selected"' else ""#>Pushover (default)</option>
|
||||||
|
<option value="bike" #if $sickbeard.PUSHOVER_SOUND == "bike" then 'selected="selected"' else ""#>Bike</option>
|
||||||
|
<option value="bugle" #if $sickbeard.PUSHOVER_SOUND == "bugle" then 'selected="selected"' else ""#>Bugle</option>
|
||||||
|
<option value="cashregister" #if $sickbeard.PUSHOVER_SOUND == "cashregister" then 'selected="selected"' else ""#>Cash Register</option>
|
||||||
|
<option value="classical" #if $sickbeard.PUSHOVER_SOUND == "classical" then 'selected="selected"' else ""#>Classical</option>
|
||||||
|
<option value="cosmic" #if $sickbeard.PUSHOVER_SOUND == "cosmic" then 'selected="selected"' else ""#>Cosmic</option>
|
||||||
|
<option value="falling" #if $sickbeard.PUSHOVER_SOUND == "falling" then 'selected="selected"' else ""#>Falling</option>
|
||||||
|
<option value="gamelan" #if $sickbeard.PUSHOVER_SOUND == "gamelan" then 'selected="selected"' else ""#>Gamelan</option>
|
||||||
|
<option value="incoming" #if $sickbeard.PUSHOVER_SOUND == "incoming" then 'selected="selected"' else ""#>Incoming</option>
|
||||||
|
<option value="intermission" #if $sickbeard.PUSHOVER_SOUND == "intermission" then 'selected="selected"' else ""#>Intermission</option>
|
||||||
|
<option value="magic" #if $sickbeard.PUSHOVER_SOUND == "magic" then 'selected="selected"' else ""#>Magic</option>
|
||||||
|
<option value="mechanical" #if $sickbeard.PUSHOVER_SOUND == "mechanical" then 'selected="selected"' else ""#>Mechanical</option>
|
||||||
|
<option value="pianobar" #if $sickbeard.PUSHOVER_SOUND == "pianobar" then 'selected="selected"' else ""#>Piano Bar</option>
|
||||||
|
<option value="siren" #if $sickbeard.PUSHOVER_SOUND == "siren" then 'selected="selected"' else ""#>Siren</option>
|
||||||
|
<option value="spacealarm" #if $sickbeard.PUSHOVER_SOUND == "spacealarm" then 'selected="selected"' else ""#>Space Alarm</option>
|
||||||
|
<option value="tugboat" #if $sickbeard.PUSHOVER_SOUND == "tugboat" then 'selected="selected"' else ""#>Tug Boat</option>
|
||||||
|
<option value="alien" #if $sickbeard.PUSHOVER_SOUND == "alien" then 'selected="selected"' else ""#>Alien Alarm (long)</option>
|
||||||
|
<option value="climb" #if $sickbeard.PUSHOVER_SOUND == "climb" then 'selected="selected"' else ""#>Climb (long)</option>
|
||||||
|
<option value="persistent" #if $sickbeard.PUSHOVER_SOUND == "persistent" then 'selected="selected"' else ""#>Persistent (long)</option>
|
||||||
|
<option value="echo" #if $sickbeard.PUSHOVER_SOUND == "echo" then 'selected="selected"' else ""#>Pushover Echo (long)</option>
|
||||||
|
<option value="updown" #if $sickbeard.PUSHOVER_SOUND == "updown" then 'selected="selected"' else ""#>Up Down (long)</option>
|
||||||
|
<option value="none" #if $sickbeard.PUSHOVER_SOUND == "none" then 'selected="selected"' else ""#>None (silent)</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span class="component-title"> </span>
|
||||||
|
<span class="component-desc">select one of the predefined sounds for your notifications</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="testNotification" id="testPushover-result">Click below to test.</div>
|
<div class="testNotification" id="testPushover-result">Click below to test.</div>
|
||||||
<input class="btn" type="button" value="Test Pushover" id="testPushover" />
|
<input class="btn" type="button" value="Test Pushover" id="testPushover" />
|
||||||
<input type="submit" class="config_submitter btn" value="Save Changes" />
|
<input type="submit" class="config_submitter btn" value="Save Changes" />
|
||||||
</div><!-- /content_use_pushover //-->
|
</div><!-- /content_use_pushover //-->
|
||||||
|
|
||||||
|
|
|
@ -113,8 +113,11 @@ $(document).ready(function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#testPushover').click(function () {
|
$('#testPushover').click(function () {
|
||||||
var pushover_userkey = $('#pushover_userkey').val();
|
var pushover_userkey = $.trim($('#pushover_userkey').val());
|
||||||
var pushover_apikey = $('#pushover_apikey').val();
|
var pushover_apikey = $.trim($('#pushover_apikey').val());
|
||||||
|
var pushover_priority = $("#pushover_priority").val();
|
||||||
|
var pushover_device = $("#pushover_device").val();
|
||||||
|
var pushover_sound = $("#pushover_sound").val();
|
||||||
if (!pushover_userkey || !pushover_apikey) {
|
if (!pushover_userkey || !pushover_apikey) {
|
||||||
$('#testPushover-result').html('Please fill out the necessary fields above.');
|
$('#testPushover-result').html('Please fill out the necessary fields above.');
|
||||||
if (!pushover_userkey) {
|
if (!pushover_userkey) {
|
||||||
|
@ -132,13 +135,71 @@ $(document).ready(function(){
|
||||||
$('#pushover_userkey,#pushover_apikey').removeClass('warning');
|
$('#pushover_userkey,#pushover_apikey').removeClass('warning');
|
||||||
$(this).prop('disabled', true);
|
$(this).prop('disabled', true);
|
||||||
$('#testPushover-result').html(loading);
|
$('#testPushover-result').html(loading);
|
||||||
$.get(sbRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey})
|
$.get(sbRoot + '/home/testPushover', {'userKey': pushover_userkey, 'apiKey': pushover_apikey, 'priority': pushover_priority, 'device': pushover_device, 'sound': pushover_sound})
|
||||||
.done(function (data) {
|
.done(function (data) {
|
||||||
$('#testPushover-result').html(data);
|
$('#testPushover-result').html(data);
|
||||||
$('#testPushover').prop('disabled', false);
|
$('#testPushover').prop('disabled', false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function get_pushover_devices (msg) {
|
||||||
|
var pushover_userkey = $.trim($('#pushover_userkey').val());
|
||||||
|
var pushover_apikey = $.trim($('#pushover_apikey').val());
|
||||||
|
if (!pushover_userkey || !pushover_apikey) {
|
||||||
|
$('#testPushover-result').html('Please fill out the necessary fields above.');
|
||||||
|
if (!pushover_userkey) {
|
||||||
|
$('#pushover_userkey').addClass('warning');
|
||||||
|
} else {
|
||||||
|
$('#pushover_userkey').removeClass('warning');
|
||||||
|
}
|
||||||
|
if (!pushover_apikey) {
|
||||||
|
$('#pushover_apikey').addClass('warning');
|
||||||
|
} else {
|
||||||
|
$('#pushover_apikey').removeClass('warning');
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$(this).prop('disabled', true);
|
||||||
|
if (msg) {
|
||||||
|
$('#testPushover-result').html(loading);
|
||||||
|
}
|
||||||
|
var current_pushover_device = $('#pushover_device').val();
|
||||||
|
$.get(sbRoot + "/home/getPushoverDevices", {'userKey': pushover_userkey, 'apiKey': pushover_apikey})
|
||||||
|
.done(function (data) {
|
||||||
|
var devices = jQuery.parseJSON(data || '{}').devices;
|
||||||
|
$('#pushover_device_list').html('');
|
||||||
|
// add default option to send to all devices
|
||||||
|
$('#pushover_device_list').append('<option value="all" selected="selected">-- All Devices --</option>');
|
||||||
|
if (devices) {
|
||||||
|
for (var i = 0; i < devices.length; i++) {
|
||||||
|
// if a device in the list matches our current iden, select it
|
||||||
|
if (current_pushover_device == devices[i]) {
|
||||||
|
$('#pushover_device_list').append('<option value="' + devices[i] + '" selected="selected">' + devices[i] + '</option>');
|
||||||
|
} else {
|
||||||
|
$('#pushover_device_list').append('<option value="' + devices[i] + '">' + devices[i] + '</option>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$('#getPushoverDevices').prop('disabled', false);
|
||||||
|
if (msg) {
|
||||||
|
$('#testPushover-result').html(msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#pushover_device_list').change(function () {
|
||||||
|
$('#pushover_device').val($('#pushover_device_list').val());
|
||||||
|
$('#testPushover-result').html('Don\'t forget to save your new Pushover settings.');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#getPushoverDevices').click(function () {
|
||||||
|
get_pushover_devices('Device list updated. Select specific device to use.');
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($('#use_pushover').prop('checked')) {
|
||||||
|
get_pushover_devices();
|
||||||
|
}
|
||||||
|
|
||||||
$('#testLibnotify').click(function() {
|
$('#testLibnotify').click(function() {
|
||||||
$('#testLibnotify-result').html(loading);
|
$('#testLibnotify-result').html(loading);
|
||||||
$.get(sbRoot + '/home/testLibnotify',
|
$.get(sbRoot + '/home/testLibnotify',
|
||||||
|
|
|
@ -325,6 +325,9 @@ PUSHOVER_NOTIFY_ONDOWNLOAD = False
|
||||||
PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD = False
|
PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD = False
|
||||||
PUSHOVER_USERKEY = None
|
PUSHOVER_USERKEY = None
|
||||||
PUSHOVER_APIKEY = None
|
PUSHOVER_APIKEY = None
|
||||||
|
PUSHOVER_PRIORITY = 0
|
||||||
|
PUSHOVER_DEVICE = None
|
||||||
|
PUSHOVER_SOUND = None
|
||||||
|
|
||||||
USE_LIBNOTIFY = False
|
USE_LIBNOTIFY = False
|
||||||
LIBNOTIFY_NOTIFY_ONSNATCH = False
|
LIBNOTIFY_NOTIFY_ONSNATCH = False
|
||||||
|
@ -491,7 +494,7 @@ def initialize(consoleLogging=True):
|
||||||
WOMBLE, OMGWTFNZBS, OMGWTFNZBS_USERNAME, OMGWTFNZBS_APIKEY, providerList, newznabProviderList, torrentRssProviderList, \
|
WOMBLE, OMGWTFNZBS, OMGWTFNZBS_USERNAME, OMGWTFNZBS_APIKEY, providerList, newznabProviderList, torrentRssProviderList, \
|
||||||
EXTRA_SCRIPTS, USE_TWITTER, TWITTER_USERNAME, TWITTER_PASSWORD, TWITTER_PREFIX, RECENTSEARCH_FREQUENCY, \
|
EXTRA_SCRIPTS, USE_TWITTER, TWITTER_USERNAME, TWITTER_PASSWORD, TWITTER_PREFIX, RECENTSEARCH_FREQUENCY, \
|
||||||
USE_BOXCAR2, BOXCAR2_ACCESSTOKEN, BOXCAR2_NOTIFY_ONDOWNLOAD, BOXCAR2_NOTIFY_ONSUBTITLEDOWNLOAD, BOXCAR2_NOTIFY_ONSNATCH, BOXCAR2_SOUND, \
|
USE_BOXCAR2, BOXCAR2_ACCESSTOKEN, BOXCAR2_NOTIFY_ONDOWNLOAD, BOXCAR2_NOTIFY_ONSUBTITLEDOWNLOAD, BOXCAR2_NOTIFY_ONSNATCH, BOXCAR2_SOUND, \
|
||||||
USE_PUSHOVER, PUSHOVER_USERKEY, PUSHOVER_APIKEY, PUSHOVER_NOTIFY_ONDOWNLOAD, PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD, PUSHOVER_NOTIFY_ONSNATCH, \
|
USE_PUSHOVER, PUSHOVER_USERKEY, PUSHOVER_APIKEY, PUSHOVER_NOTIFY_ONDOWNLOAD, PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD, PUSHOVER_NOTIFY_ONSNATCH, PUSHOVER_PRIORITY, PUSHOVER_DEVICE, PUSHOVER_SOUND, \
|
||||||
USE_LIBNOTIFY, LIBNOTIFY_NOTIFY_ONSNATCH, LIBNOTIFY_NOTIFY_ONDOWNLOAD, LIBNOTIFY_NOTIFY_ONSUBTITLEDOWNLOAD, USE_NMJ, NMJ_HOST, NMJ_DATABASE, NMJ_MOUNT, USE_NMJv2, NMJv2_HOST, NMJv2_DATABASE, NMJv2_DBLOC, USE_SYNOINDEX, \
|
USE_LIBNOTIFY, LIBNOTIFY_NOTIFY_ONSNATCH, LIBNOTIFY_NOTIFY_ONDOWNLOAD, LIBNOTIFY_NOTIFY_ONSUBTITLEDOWNLOAD, USE_NMJ, NMJ_HOST, NMJ_DATABASE, NMJ_MOUNT, USE_NMJv2, NMJv2_HOST, NMJv2_DATABASE, NMJv2_DBLOC, USE_SYNOINDEX, \
|
||||||
USE_SYNOLOGYNOTIFIER, SYNOLOGYNOTIFIER_NOTIFY_ONSNATCH, SYNOLOGYNOTIFIER_NOTIFY_ONDOWNLOAD, SYNOLOGYNOTIFIER_NOTIFY_ONSUBTITLEDOWNLOAD, \
|
USE_SYNOLOGYNOTIFIER, SYNOLOGYNOTIFIER_NOTIFY_ONSNATCH, SYNOLOGYNOTIFIER_NOTIFY_ONDOWNLOAD, SYNOLOGYNOTIFIER_NOTIFY_ONSUBTITLEDOWNLOAD, \
|
||||||
USE_EMAIL, EMAIL_HOST, EMAIL_PORT, EMAIL_TLS, EMAIL_USER, EMAIL_PASSWORD, EMAIL_FROM, EMAIL_NOTIFY_ONSNATCH, EMAIL_NOTIFY_ONDOWNLOAD, EMAIL_NOTIFY_ONSUBTITLEDOWNLOAD, EMAIL_LIST, \
|
USE_EMAIL, EMAIL_HOST, EMAIL_PORT, EMAIL_TLS, EMAIL_USER, EMAIL_PASSWORD, EMAIL_FROM, EMAIL_NOTIFY_ONSNATCH, EMAIL_NOTIFY_ONDOWNLOAD, EMAIL_NOTIFY_ONSUBTITLEDOWNLOAD, EMAIL_LIST, \
|
||||||
|
@ -809,6 +812,10 @@ def initialize(consoleLogging=True):
|
||||||
check_setting_int(CFG, 'Pushover', 'pushover_notify_onsubtitledownload', 0))
|
check_setting_int(CFG, 'Pushover', 'pushover_notify_onsubtitledownload', 0))
|
||||||
PUSHOVER_USERKEY = check_setting_str(CFG, 'Pushover', 'pushover_userkey', '')
|
PUSHOVER_USERKEY = check_setting_str(CFG, 'Pushover', 'pushover_userkey', '')
|
||||||
PUSHOVER_APIKEY = check_setting_str(CFG, 'Pushover', 'pushover_apikey', '')
|
PUSHOVER_APIKEY = check_setting_str(CFG, 'Pushover', 'pushover_apikey', '')
|
||||||
|
PUSHOVER_PRIORITY = check_setting_int(CFG, 'Pushover', 'pushover_priority', 0)
|
||||||
|
PUSHOVER_DEVICE = check_setting_str(CFG, 'Pushover', 'pushover_device', 'all')
|
||||||
|
PUSHOVER_SOUND = check_setting_str(CFG, 'Pushover', 'pushover_sound', 'pushover')
|
||||||
|
|
||||||
USE_LIBNOTIFY = bool(check_setting_int(CFG, 'Libnotify', 'use_libnotify', 0))
|
USE_LIBNOTIFY = bool(check_setting_int(CFG, 'Libnotify', 'use_libnotify', 0))
|
||||||
LIBNOTIFY_NOTIFY_ONSNATCH = bool(check_setting_int(CFG, 'Libnotify', 'libnotify_notify_onsnatch', 0))
|
LIBNOTIFY_NOTIFY_ONSNATCH = bool(check_setting_int(CFG, 'Libnotify', 'libnotify_notify_onsnatch', 0))
|
||||||
LIBNOTIFY_NOTIFY_ONDOWNLOAD = bool(check_setting_int(CFG, 'Libnotify', 'libnotify_notify_ondownload', 0))
|
LIBNOTIFY_NOTIFY_ONDOWNLOAD = bool(check_setting_int(CFG, 'Libnotify', 'libnotify_notify_ondownload', 0))
|
||||||
|
@ -1653,6 +1660,9 @@ def save_config():
|
||||||
new_config['Pushover']['pushover_notify_onsubtitledownload'] = int(PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD)
|
new_config['Pushover']['pushover_notify_onsubtitledownload'] = int(PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD)
|
||||||
new_config['Pushover']['pushover_userkey'] = PUSHOVER_USERKEY
|
new_config['Pushover']['pushover_userkey'] = PUSHOVER_USERKEY
|
||||||
new_config['Pushover']['pushover_apikey'] = PUSHOVER_APIKEY
|
new_config['Pushover']['pushover_apikey'] = PUSHOVER_APIKEY
|
||||||
|
new_config['Pushover']['pushover_priority'] = int(PUSHOVER_PRIORITY)
|
||||||
|
new_config['Pushover']['pushover_device'] = PUSHOVER_DEVICE
|
||||||
|
new_config['Pushover']['pushover_sound'] = PUSHOVER_SOUND
|
||||||
|
|
||||||
new_config['Libnotify'] = {}
|
new_config['Libnotify'] = {}
|
||||||
new_config['Libnotify']['use_libnotify'] = int(USE_LIBNOTIFY)
|
new_config['Libnotify']['use_libnotify'] = int(USE_LIBNOTIFY)
|
||||||
|
|
|
@ -17,23 +17,50 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with SickGear. If not, see <http://www.gnu.org/licenses/>.
|
# along with SickGear. If not, see <http://www.gnu.org/licenses/>.
|
||||||
import httplib
|
|
||||||
import urllib, urllib2
|
import urllib
|
||||||
|
import urllib2
|
||||||
import time
|
import time
|
||||||
|
import socket
|
||||||
|
import base64
|
||||||
|
|
||||||
import sickbeard
|
import sickbeard
|
||||||
from sickbeard import logger
|
from sickbeard import logger
|
||||||
from sickbeard.common import notifyStrings, NOTIFY_SNATCH, NOTIFY_DOWNLOAD, NOTIFY_SUBTITLE_DOWNLOAD, NOTIFY_GIT_UPDATE, NOTIFY_GIT_UPDATE_TEXT
|
from sickbeard.common import notifyStrings, NOTIFY_SNATCH, NOTIFY_DOWNLOAD, NOTIFY_SUBTITLE_DOWNLOAD, NOTIFY_GIT_UPDATE, NOTIFY_GIT_UPDATE_TEXT
|
||||||
from sickbeard.exceptions import ex
|
from sickbeard.exceptions import ex
|
||||||
|
|
||||||
API_URL = "https://api.pushover.net/1/messages.json"
|
API_URL = 'https://api.pushover.net/1/messages.json'
|
||||||
|
DEVICE_URL = 'https://api.pushover.net/1/users/validate.json'
|
||||||
|
|
||||||
|
|
||||||
class PushoverNotifier:
|
class PushoverNotifier:
|
||||||
def test_notify(self, userKey=None, apiKey=None):
|
|
||||||
return self._notifyPushover("This is a test notification from SickGear", 'Test', userKey, apiKey, force=True)
|
|
||||||
|
|
||||||
def _sendPushover(self, msg, title, userKey=None, apiKey=None):
|
def get_devices(self, userKey=None, apiKey=None):
|
||||||
|
# fill in omitted parameters
|
||||||
|
if not userKey:
|
||||||
|
userKey = sickbeard.PUSHOVER_USERKEY
|
||||||
|
if not apiKey:
|
||||||
|
apiKey = sickbeard.PUSHOVER_APIKEY
|
||||||
|
|
||||||
|
data = urllib.urlencode({
|
||||||
|
'token': apiKey,
|
||||||
|
'user': userKey
|
||||||
|
})
|
||||||
|
|
||||||
|
# get devices from pushover
|
||||||
|
try:
|
||||||
|
req = urllib2.Request(DEVICE_URL)
|
||||||
|
handle = urllib2.urlopen(req, data)
|
||||||
|
if handle:
|
||||||
|
result = handle.read()
|
||||||
|
handle.close()
|
||||||
|
return result
|
||||||
|
except urllib2.URLError:
|
||||||
|
return None
|
||||||
|
except socket.timeout:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _sendPushover(self, title, msg, userKey, apiKey, priority, device, sound):
|
||||||
"""
|
"""
|
||||||
Sends a pushover notification to the address provided
|
Sends a pushover notification to the address provided
|
||||||
|
|
||||||
|
@ -44,91 +71,71 @@ class PushoverNotifier:
|
||||||
returns: True if the message succeeded, False otherwise
|
returns: True if the message succeeded, False otherwise
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if userKey == None:
|
# fill in omitted parameters
|
||||||
|
if not userKey:
|
||||||
userKey = sickbeard.PUSHOVER_USERKEY
|
userKey = sickbeard.PUSHOVER_USERKEY
|
||||||
|
if not apiKey:
|
||||||
if apiKey == None:
|
|
||||||
apiKey = sickbeard.PUSHOVER_APIKEY
|
apiKey = sickbeard.PUSHOVER_APIKEY
|
||||||
|
|
||||||
logger.log("Pushover API KEY in use: " + apiKey, logger.DEBUG)
|
|
||||||
|
|
||||||
# build up the URL and parameters
|
# build up the URL and parameters
|
||||||
msg = msg.strip()
|
msg = msg.strip()
|
||||||
|
|
||||||
|
data = urllib.urlencode({
|
||||||
|
'token': apiKey,
|
||||||
|
'title': title,
|
||||||
|
'user': userKey,
|
||||||
|
'message': msg.encode('utf-8'),
|
||||||
|
'priority': priority,
|
||||||
|
'device': device,
|
||||||
|
'sound': sound,
|
||||||
|
'timestamp': int(time.time())
|
||||||
|
})
|
||||||
|
|
||||||
# send the request to pushover
|
# send the request to pushover
|
||||||
try:
|
try:
|
||||||
conn = httplib.HTTPSConnection("api.pushover.net:443")
|
req = urllib2.Request(API_URL)
|
||||||
conn.request("POST", "/1/messages.json",
|
handle = urllib2.urlopen(req, data)
|
||||||
urllib.urlencode({
|
handle.close()
|
||||||
"token": apiKey,
|
|
||||||
"user": userKey,
|
|
||||||
"title": title.encode('utf-8'),
|
|
||||||
"message": msg.encode('utf-8'),
|
|
||||||
'timestamp': int(time.time()),
|
|
||||||
"retry": 60,
|
|
||||||
"expire": 3600,
|
|
||||||
}), {"Content-type": "application/x-www-form-urlencoded"})
|
|
||||||
|
|
||||||
except urllib2.HTTPError, e:
|
|
||||||
# if we get an error back that doesn't have an error code then who knows what's really happening
|
|
||||||
if not hasattr(e, 'code'):
|
|
||||||
logger.log("Pushover notification failed." + ex(e), logger.ERROR)
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
logger.log("Pushover notification failed. Error code: " + str(e.code), logger.ERROR)
|
|
||||||
|
|
||||||
|
except urllib2.URLError, e:
|
||||||
# HTTP status 404 if the provided email address isn't a Pushover user.
|
# HTTP status 404 if the provided email address isn't a Pushover user.
|
||||||
if e.code == 404:
|
if e.code == 404:
|
||||||
logger.log("Username is wrong/not a pushover email. Pushover will send an email to it", logger.WARNING)
|
logger.log(u'PUSHOVER: Username is wrong/not a Pushover email. Pushover will send an email to it', logger.WARNING)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# For HTTP status code 401's, it is because you are passing in either an invalid token, or the user has not added your service.
|
# For HTTP status code 401's, it is because you are passing in either an invalid token, or the user has not added your service.
|
||||||
elif e.code == 401:
|
elif e.code == 401:
|
||||||
|
|
||||||
#HTTP status 401 if the user doesn't have the service added
|
# HTTP status 401 if the user doesn't have the service added
|
||||||
subscribeNote = self._sendPushover(msg, title, userKey, apiKey)
|
subscribeNote = self._sendPushover(title, msg, userKey)
|
||||||
if subscribeNote:
|
if subscribeNote:
|
||||||
logger.log("Subscription send", logger.DEBUG)
|
logger.log(u'PUSHOVER: Subscription sent', logger.DEBUG)
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
logger.log("Subscription could not be send", logger.ERROR)
|
logger.log(u'PUSHOVER: Subscription could not be sent', logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# If you receive an HTTP status code of 400, it is because you failed to send the proper parameters
|
# If you receive an HTTP status code of 400, it is because you failed to send the proper parameters
|
||||||
elif e.code == 400:
|
elif e.code == 400:
|
||||||
logger.log("Wrong data sent to pushover", logger.ERROR)
|
logger.log(u'PUSHOVER: Wrong data sent to Pushover', logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# If you receive a HTTP status code of 429, it is because the message limit has been reached (free limit is 7,500)
|
# If you receive a HTTP status code of 429, it is because the message limit has been reached (free limit is 7,500)
|
||||||
elif e.code == 429:
|
elif e.code == 429:
|
||||||
logger.log("Pushover API message limit reached - try a different API key", logger.ERROR)
|
logger.log(u'PUSHOVER: API message limit reached - try a different API key', logger.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
logger.log("Pushover notification successful.", logger.MESSAGE)
|
# If you receive a HTTP status code of 500, service is unavailable
|
||||||
|
elif e.code == 500:
|
||||||
|
logger.log(u'PUSHOVER: Unable to connect to API, service unavailable', logger.ERROR)
|
||||||
|
return False
|
||||||
|
|
||||||
|
logger.log(u'PUSHOVER: Notification successful.', logger.MESSAGE)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def notify_snatch(self, ep_name, title=notifyStrings[NOTIFY_SNATCH]):
|
def _notifyPushover(self, title, message, userKey=None, apiKey=None, priority=None, device=None, sound=None, force=False):
|
||||||
if sickbeard.PUSHOVER_NOTIFY_ONSNATCH:
|
|
||||||
self._notifyPushover(title, ep_name)
|
|
||||||
|
|
||||||
|
|
||||||
def notify_download(self, ep_name, title=notifyStrings[NOTIFY_DOWNLOAD]):
|
|
||||||
if sickbeard.PUSHOVER_NOTIFY_ONDOWNLOAD:
|
|
||||||
self._notifyPushover(title, ep_name)
|
|
||||||
|
|
||||||
def notify_subtitle_download(self, ep_name, lang, title=notifyStrings[NOTIFY_SUBTITLE_DOWNLOAD]):
|
|
||||||
if sickbeard.PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD:
|
|
||||||
self._notifyPushover(title, ep_name + ": " + lang)
|
|
||||||
|
|
||||||
def notify_git_update(self, new_version = "??"):
|
|
||||||
if sickbeard.USE_PUSHOVER:
|
|
||||||
update_text=notifyStrings[NOTIFY_GIT_UPDATE_TEXT]
|
|
||||||
title=notifyStrings[NOTIFY_GIT_UPDATE]
|
|
||||||
self._notifyPushover(title, update_text + new_version)
|
|
||||||
|
|
||||||
def _notifyPushover(self, title, message, userKey=None, apiKey=None, force=False):
|
|
||||||
"""
|
"""
|
||||||
Sends a pushover notification based on the provided info or SB config
|
Sends a pushover notification based on the provided info or SG config
|
||||||
|
|
||||||
title: The title of the notification to send
|
title: The title of the notification to send
|
||||||
message: The message string to send
|
message: The message string to send
|
||||||
|
@ -136,14 +143,46 @@ class PushoverNotifier:
|
||||||
force: Enforce sending, for instance for testing
|
force: Enforce sending, for instance for testing
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# suppress notifications if the notifier is disabled but the notify options are checked
|
||||||
if not sickbeard.USE_PUSHOVER and not force:
|
if not sickbeard.USE_PUSHOVER and not force:
|
||||||
logger.log("Notification for Pushover not enabled, skipping this notification", logger.DEBUG)
|
logger.log(u'PUSHOVER: Notifications not enabled, skipping this notification', logger.DEBUG)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
logger.log("Sending notification for " + message, logger.DEBUG)
|
# fill in omitted parameters
|
||||||
|
if not userKey:
|
||||||
|
userKey = sickbeard.PUSHOVER_USERKEY
|
||||||
|
if not apiKey:
|
||||||
|
apiKey = sickbeard.PUSHOVER_APIKEY
|
||||||
|
if not priority:
|
||||||
|
priority = sickbeard.PUSHOVER_PRIORITY
|
||||||
|
if not device:
|
||||||
|
device = sickbeard.PUSHOVER_DEVICE
|
||||||
|
if not sound:
|
||||||
|
sound = sickbeard.PUSHOVER_SOUND
|
||||||
|
|
||||||
# self._sendPushover(message, title, userKey, apiKey)
|
logger.log(u'PUSHOVER: Sending notice with details: %s - %s, priority: %s, device: %s, sound: %s' % (title, message, priority, device, sound), logger.DEBUG)
|
||||||
return self._sendPushover(message, title, userKey, apiKey)
|
|
||||||
|
|
||||||
|
return self._sendPushover(title, message, userKey, apiKey, priority, device, sound)
|
||||||
|
|
||||||
|
def test_notify(self, userKey, apiKey, priority, device, sound):
|
||||||
|
return self._notifyPushover('Test', 'This is a test notification from SickGear', userKey, apiKey, priority, device, sound, force=True)
|
||||||
|
|
||||||
|
def notify_snatch(self, ep_name):
|
||||||
|
if sickbeard.PUSHOVER_NOTIFY_ONSNATCH:
|
||||||
|
self._notifyPushover(notifyStrings[NOTIFY_SNATCH], ep_name)
|
||||||
|
|
||||||
|
def notify_download(self, ep_name):
|
||||||
|
if sickbeard.PUSHOVER_NOTIFY_ONDOWNLOAD:
|
||||||
|
self._notifyPushover(notifyStrings[NOTIFY_DOWNLOAD], ep_name)
|
||||||
|
|
||||||
|
def notify_subtitle_download(self, ep_name, lang):
|
||||||
|
if sickbeard.PUSHOVER_NOTIFY_ONSUBTITLEDOWNLOAD:
|
||||||
|
self._notifyPushover(notifyStrings[NOTIFY_SUBTITLE_DOWNLOAD], ep_name + ': ' + lang)
|
||||||
|
|
||||||
|
def notify_git_update(self, new_version = '??'):
|
||||||
|
if sickbeard.USE_PUSHOVER:
|
||||||
|
update_text=notifyStrings[NOTIFY_GIT_UPDATE_TEXT]
|
||||||
|
title=notifyStrings[NOTIFY_GIT_UPDATE]
|
||||||
|
self._notifyPushover(title, update_text + new_version)
|
||||||
|
|
||||||
notifier = PushoverNotifier
|
notifier = PushoverNotifier
|
||||||
|
|
|
@ -657,7 +657,7 @@ class Home(MainHandler):
|
||||||
else:
|
else:
|
||||||
return 'Error sending Boxcar2 notification'
|
return 'Error sending Boxcar2 notification'
|
||||||
|
|
||||||
def testPushover(self, userKey=None, apiKey=None):
|
def testPushover(self, userKey=None, apiKey=None, priority=None, device=None, sound=None):
|
||||||
self.set_header('Cache-Control', 'max-age=0,no-cache,no-store')
|
self.set_header('Cache-Control', 'max-age=0,no-cache,no-store')
|
||||||
|
|
||||||
if None is not userKey and starify(userKey, True):
|
if None is not userKey and starify(userKey, True):
|
||||||
|
@ -666,12 +666,27 @@ class Home(MainHandler):
|
||||||
if None is not apiKey and starify(apiKey, True):
|
if None is not apiKey and starify(apiKey, True):
|
||||||
apiKey = sickbeard.PUSHOVER_APIKEY
|
apiKey = sickbeard.PUSHOVER_APIKEY
|
||||||
|
|
||||||
result = notifiers.pushover_notifier.test_notify(userKey, apiKey)
|
result = notifiers.pushover_notifier.test_notify(userKey, apiKey, priority, device, sound)
|
||||||
if result:
|
if result:
|
||||||
return 'Pushover notification succeeded. Check your Pushover clients to make sure it worked'
|
return 'Pushover notification succeeded. Check your Pushover clients to make sure it worked'
|
||||||
else:
|
else:
|
||||||
return 'Error sending Pushover notification'
|
return 'Error sending Pushover notification'
|
||||||
|
|
||||||
|
def getPushoverDevices(self, userKey=None, apiKey=None):
|
||||||
|
self.set_header('Cache-Control', 'max-age=0,no-cache,no-store')
|
||||||
|
|
||||||
|
if None is not userKey and starify(userKey, True):
|
||||||
|
userKey = sickbeard.PUSHOVER_USERKEY
|
||||||
|
|
||||||
|
if None is not apiKey and starify(apiKey, True):
|
||||||
|
apiKey = sickbeard.PUSHOVER_APIKEY
|
||||||
|
|
||||||
|
result = notifiers.pushover_notifier.get_devices(userKey, apiKey)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
else:
|
||||||
|
return "{}"
|
||||||
|
|
||||||
def twitterStep1(self, *args, **kwargs):
|
def twitterStep1(self, *args, **kwargs):
|
||||||
self.set_header('Cache-Control', 'max-age=0,no-cache,no-store')
|
self.set_header('Cache-Control', 'max-age=0,no-cache,no-store')
|
||||||
|
|
||||||
|
@ -4130,6 +4145,7 @@ class ConfigNotifications(Config):
|
||||||
boxcar2_notify_onsubtitledownload=None, boxcar2_accesstoken=None, boxcar2_sound=None,
|
boxcar2_notify_onsubtitledownload=None, boxcar2_accesstoken=None, boxcar2_sound=None,
|
||||||
use_pushover=None, pushover_notify_onsnatch=None, pushover_notify_ondownload=None,
|
use_pushover=None, pushover_notify_onsnatch=None, pushover_notify_ondownload=None,
|
||||||
pushover_notify_onsubtitledownload=None, pushover_userkey=None, pushover_apikey=None,
|
pushover_notify_onsubtitledownload=None, pushover_userkey=None, pushover_apikey=None,
|
||||||
|
pushover_priority=None, pushover_device=None, pushover_sound=None, pushover_device_list=None,
|
||||||
use_libnotify=None, libnotify_notify_onsnatch=None, libnotify_notify_ondownload=None,
|
use_libnotify=None, libnotify_notify_onsnatch=None, libnotify_notify_ondownload=None,
|
||||||
libnotify_notify_onsubtitledownload=None,
|
libnotify_notify_onsubtitledownload=None,
|
||||||
use_nmj=None, nmj_host=None, nmj_database=None, nmj_mount=None, use_synoindex=None,
|
use_nmj=None, nmj_host=None, nmj_database=None, nmj_mount=None, use_synoindex=None,
|
||||||
|
@ -4222,6 +4238,9 @@ class ConfigNotifications(Config):
|
||||||
key = pushover_apikey.strip()
|
key = pushover_apikey.strip()
|
||||||
if not starify(key, True):
|
if not starify(key, True):
|
||||||
sickbeard.PUSHOVER_APIKEY = key
|
sickbeard.PUSHOVER_APIKEY = key
|
||||||
|
sickbeard.PUSHOVER_PRIORITY = pushover_priority
|
||||||
|
sickbeard.PUSHOVER_DEVICE = pushover_device
|
||||||
|
sickbeard.PUSHOVER_SOUND = pushover_sound
|
||||||
|
|
||||||
sickbeard.USE_LIBNOTIFY = config.checkbox_to_value(use_libnotify)
|
sickbeard.USE_LIBNOTIFY = config.checkbox_to_value(use_libnotify)
|
||||||
sickbeard.LIBNOTIFY_NOTIFY_ONSNATCH = config.checkbox_to_value(libnotify_notify_onsnatch)
|
sickbeard.LIBNOTIFY_NOTIFY_ONSNATCH = config.checkbox_to_value(libnotify_notify_onsnatch)
|
||||||
|
|
Loading…
Reference in a new issue