diff --git a/data/interfaces/default/mobile_devices_table.html b/data/interfaces/default/mobile_devices_table.html index 6ccec57b..df605971 100644 --- a/data/interfaces/default/mobile_devices_table.html +++ b/data/interfaces/default/mobile_devices_table.html @@ -55,7 +55,7 @@ DOCUMENTATION :: END }) } return deferred; - } + }; function checkQRAddress(url) { var parser = document.createElement('a'); @@ -82,7 +82,7 @@ DOCUMENTATION :: END verifiedDevice = false; getPlexPyURL().then(function (url) { - checkQRAddress(url) + checkQRAddress(url); $.get('generate_api_key', { device: true }).then(function (token) { $('#api_qr_address').val(url); @@ -120,7 +120,7 @@ DOCUMENTATION :: END $('#api_qr_address').change(function () { var url = $(this).val(); - checkQRAddress(url) + checkQRAddress(url); $('#api_qr_code').empty().qrcode({ text: url + '|' + $('#api_qr_token').val() diff --git a/data/interfaces/default/notifier_config.html b/data/interfaces/default/notifier_config.html index a70fc5d4..e6d68bc6 100644 --- a/data/interfaces/default/notifier_config.html +++ b/data/interfaces/default/notifier_config.html @@ -433,16 +433,30 @@ }); % if notifier['agent_name'] == 'facebook': + if (location.protocol !== 'https:') { + $('#tabs-config .form-group:first').prepend( + '
' + + '' + + '

Facebook requires HTTPS for authorization. ' + + 'Please enable HTTPS for Tautulli under Web Interface.

' + + '
' + ); + $('#facebook_redirect_uri').val('HTTPS not enabled'); + + } else { + $('#facebook_redirect_uri').val(location.href.split('/settings')[0] + '/facebook_redirect'); + } + function disableFacebookRequest() { - if ($('#facebook_app_id').val() !== '' && $('#facebook_app_secret').val() !== '') { $('#facebook_facebookStep1').prop('disabled', false); } - else { $('#facebook_facebookStep1').prop('disabled', true); } + if ($('#facebook_app_id').val() !== '' && $('#facebook_app_secret').val() !== '') { $('#facebook_facebook_auth').prop('disabled', false); } + else { $('#facebook_facebook_auth').prop('disabled', true); } } disableFacebookRequest(); $('#facebook_app_id, #facebook_app_secret').on('change', function () { disableFacebookRequest(); }); - $('#facebook_facebookStep1').click(function () { + $('#facebook_facebook_auth').click(function () { // Remove trailing '/' from Facebook redirect URI if ($('#facebook_redirect_uri') && $('#facebook_redirect_uri').val().endsWith('/')) { $('#facebook_redirect_uri').val($('#facebook_redirect_uri').val().slice(0, -1)); @@ -450,7 +464,7 @@ var facebook_token; $.ajax({ - url: 'facebookStep1', + url: 'facebook_auth', data: { app_id: $('#facebook_app_id').val(), app_secret: $('#facebook_app_secret').val(), diff --git a/data/interfaces/default/settings.html b/data/interfaces/default/settings.html index 383138f4..31aa6181 100644 --- a/data/interfaces/default/settings.html +++ b/data/interfaces/default/settings.html @@ -969,6 +969,9 @@

Add a new notification agent, or configure an existing notification agent by clicking the settings icon on the right.

+

+ Please see the Notification Agents Guide for instructions on setting up each notification agent. +


Loading notification agents...
@@ -983,7 +986,7 @@

Database Import

-

Click a button below to import an exisiting database from another app.

+

Click a button below to import an existing database from another app.

diff --git a/plexpy/notifiers.py b/plexpy/notifiers.py index 2a045f2b..04979b5f 100644 --- a/plexpy/notifiers.py +++ b/plexpy/notifiers.py @@ -143,6 +143,10 @@ def available_notification_agents(): 'name': 'join', 'id': AGENT_IDS['join'] }, + {'label': 'Kodi', + 'name': 'xbmc', + 'id': AGENT_IDS['xbmc'] + }, {'label': 'Notify My Android', 'name': 'nma', 'id': AGENT_IDS['nma'] @@ -159,10 +163,10 @@ def available_notification_agents(): 'name': 'prowl', 'id': AGENT_IDS['prowl'] }, - {'label': 'Pushalot', - 'name': 'pushalot', - 'id': AGENT_IDS['pushalot'] - }, + # {'label': 'Pushalot', + # 'name': 'pushalot', + # 'id': AGENT_IDS['pushalot'] + # }, {'label': 'Pushbullet', 'name': 'pushbullet', 'id': AGENT_IDS['pushbullet'] @@ -187,10 +191,6 @@ def available_notification_agents(): 'name': 'twitter', 'id': AGENT_IDS['twitter'] }, - {'label': 'XBMC', - 'name': 'xbmc', - 'id': AGENT_IDS['xbmc'] - }, {'label': 'Zapier', 'name': 'zapier', 'id': AGENT_IDS['zapier'] @@ -199,7 +199,7 @@ def available_notification_agents(): # OSX Notifications should only be visible if it can be used if OSX().validate(): - agents.append({'label': 'OSX Notify', + agents.append({'label': 'macOS Notification Center', 'name': 'osx', 'id': AGENT_IDS['osx'] }) @@ -1441,7 +1441,7 @@ class FACEBOOK(Notifier): plexpy.CONFIG.FACEBOOK_TOKEN = 'temp' return facebook.auth_url(app_id=app_id, - canvas_url=redirect_uri + '/facebookStep2', + canvas_url=redirect_uri, perms=['user_managed_groups','publish_actions']) def _get_credentials(self, code=''): @@ -1455,7 +1455,7 @@ class FACEBOOK(Notifier): # Request user access token api = facebook.GraphAPI(version='2.12') response = api.get_access_token_from_code(code=code, - redirect_uri=redirect_uri + '/facebookStep2', + redirect_uri=redirect_uri, app_id=app_id, app_secret=app_secret) access_token = response['access_token'] @@ -1519,25 +1519,11 @@ class FACEBOOK(Notifier): return self._post_facebook(**data) def return_config_options(self): - config_option = [{'label': 'Instructions', - 'description': 'Step 1: Visit ' - 'Facebook Developers to add a new app using basic setup.
' - 'Step 2: Click Add Product on the left, then Get Started' - 'for Facebook Login.
' - 'Step 3: Fill in Valid OAuth redirect URIs with your Tautulli URL (e.g. http://localhost:8181).
' - 'Step 4: Click App Review on the left and toggle "make public" to Yes.
' - 'Step 5: Fill in the Tautulli URL below with the exact same URL from Step 3.
' - 'Step 6: Fill in the App ID and App Secret below.
' - 'Step 7: Click the Request Authorization button below to retrieve your access token.
' - 'Step 8: Fill in your Access Token below if it is not filled in automatically.
' - 'Step 9: Fill in your Group ID number below. It can be found in the URL of your group page.', - 'input_type': 'help' - }, - {'label': 'Tautulli URL', + config_option = [{'label': 'OAuth Redirect URI', 'value': self.config['redirect_uri'], 'name': 'facebook_redirect_uri', - 'description': 'Your Tautulli URL. This will tell Facebook where to redirect you after authorization.\ - (e.g. http://localhost:8181)', + 'description': 'Fill in this address for the "Valid OAuth redirect URIs" ' + 'in your Facebook App.', 'input_type': 'text' }, {'label': 'Facebook App ID', @@ -1554,14 +1540,15 @@ class FACEBOOK(Notifier): }, {'label': 'Request Authorization', 'value': 'Request Authorization', - 'name': 'facebook_facebookStep1', + 'name': 'facebook_facebook_auth', 'description': 'Request Facebook authorization. (Ensure you allow the browser pop-up).', 'input_type': 'button' }, {'label': 'Facebook Access Token', 'value': self.config['access_token'], 'name': 'facebook_access_token', - 'description': 'Your Facebook access token. Automatically filled in after requesting authorization.', + 'description': 'Your Facebook access token. ' + 'Automatically filled in after requesting authorization.', 'input_type': 'text' }, {'label': 'Facebook Group ID', @@ -1760,7 +1747,7 @@ class GROWL(Notifier): config_option = [{'label': 'Growl Host', 'value': self.config['host'], 'name': 'growl_host', - 'description': 'Your Growl hostname.', + 'description': 'Your Growl hostname or IP address.', 'input_type': 'text' }, {'label': 'Growl Password', @@ -1862,7 +1849,7 @@ class HIPCHAT(Notifier): return self.make_request(self.config['hook'], headers=headers, json=data) def return_config_options(self): - config_option = [{'label': 'Hipchat Custom Integrations Full URL', + config_option = [{'label': 'Hipchat Custom Integrations URL', 'value': self.config['hook'], 'name': 'hipchat_hook', 'description': 'Your Hipchat BYO integration URL. You can get a key from' @@ -2317,9 +2304,9 @@ class NMA(Notifier): class OSX(Notifier): """ - OSX notifications + macOS notifications """ - NAME = 'OSX Notify' + NAME = 'macOS' _DEFAULT_CONFIG = {'notify_app': '/Applications/Tautulli' } @@ -2485,7 +2472,7 @@ class PLEX(Notifier): return True def return_config_options(self): - config_option = [{'label': 'Plex Home Theater Host:Port', + config_option = [{'label': 'Plex Home Theater Host Address', 'value': self.config['hosts'], 'name': 'plex_hosts', 'description': 'Host running Plex Home Theater (eg. http://localhost:3005). Separate multiple hosts with commas (,).', @@ -2676,10 +2663,10 @@ class PUSHBULLET(Notifier): return {'': ''} def return_config_options(self): - config_option = [{'label': 'Pushbullet API Key', + config_option = [{'label': 'Pushbullet Access Token', 'value': self.config['api_key'], 'name': 'pushbullet_api_key', - 'description': 'Your Pushbullet API key.', + 'description': 'Your Pushbullet access token.', 'input_type': 'text', 'refresh': True }, @@ -3426,16 +3413,7 @@ class TWITTER(Notifier): return self._send_tweet(body, attachment=poster_url) def return_config_options(self): - config_option = [{'label': 'Instructions', - 'description': 'Step 1: Visit ' - 'Twitter Apps to Create New App. A vaild "Website" is not required.
' - 'Step 2: Go to Keys and Access Tokens and click ' - 'Create my access token.
' - 'Step 3: Fill in the Consumer Key, Consumer Secret, ' - 'Access Token, and Access Token Secret below.', - 'input_type': 'help' - }, - {'label': 'Twitter Consumer Key', + config_option = [{'label': 'Twitter Consumer Key', 'value': self.config['consumer_key'], 'name': 'twitter_consumer_key', 'description': 'Your Twitter consumer key.', @@ -3479,9 +3457,9 @@ class TWITTER(Notifier): class XBMC(Notifier): """ - XBMC notifications + Kodi notifications """ - NAME = 'XBMC' + NAME = 'Kodi' _DEFAULT_CONFIG = {'hosts': '', 'username': '', 'password': '', @@ -3551,22 +3529,22 @@ class XBMC(Notifier): return True def return_config_options(self): - config_option = [{'label': 'XBMC Host:Port', + config_option = [{'label': 'Kodi Host Address', 'value': self.config['hosts'], 'name': 'xbmc_hosts', - 'description': 'Host running XBMC (e.g. http://localhost:8080). Separate multiple hosts with commas (,).', + 'description': 'Host running Kodi (e.g. http://localhost:8080). Separate multiple hosts with commas (,).', 'input_type': 'text' }, - {'label': 'XBMC Username', + {'label': 'Kodi Username', 'value': self.config['username'], 'name': 'xbmc_username', - 'description': 'Username of your XBMC client API (blank for none).', + 'description': 'Username of your Kodi client API (blank for none).', 'input_type': 'text' }, - {'label': 'XBMC Password', + {'label': 'Kodi Password', 'value': self.config['password'], 'name': 'xbmc_password', - 'description': 'Password of your XBMC client API (blank for none).', + 'description': 'Password of your Kodi client API (blank for none).', 'input_type': 'password' }, {'label': 'Notification Duration', diff --git a/plexpy/webserve.py b/plexpy/webserve.py index a3e4b5c7..3af68ea4 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -3191,7 +3191,7 @@ class WebInterface(object): @cherrypy.expose @cherrypy.tools.json_out() @requireAuth(member_of("admin")) - def facebookStep1(self, app_id='', app_secret='', redirect_uri='', **kwargs): + def facebook_auth(self, app_id='', app_secret='', redirect_uri='', **kwargs): cherrypy.response.headers['Cache-Control'] = "max-age=0,no-cache,no-store" facebook_notifier = notifiers.FACEBOOK() @@ -3206,7 +3206,7 @@ class WebInterface(object): @cherrypy.expose @requireAuth(member_of("admin")) - def facebookStep2(self, code='', **kwargs): + def facebook_redirect(self, code='', **kwargs): cherrypy.response.headers['Cache-Control'] = "max-age=0,no-cache,no-store" facebook = notifiers.FACEBOOK()