mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-16 02:02:58 -07:00
Update Android app device registration
This commit is contained in:
parent
203a6d47b4
commit
896922de4f
4 changed files with 75 additions and 41 deletions
|
@ -49,7 +49,7 @@
|
||||||
<li role="presentation"><a href="#tabs-notification_agents" aria-controls="tabs-notification_agents" role="tab" data-toggle="tab">Notification Agents</a></li>
|
<li role="presentation"><a href="#tabs-notification_agents" aria-controls="tabs-notification_agents" role="tab" data-toggle="tab">Notification Agents</a></li>
|
||||||
<li role="presentation"><a href="#tabs-extra_settings" aria-controls="tabs-extra_settings" role="tab" data-toggle="tab">Extra Settings</a></li>
|
<li role="presentation"><a href="#tabs-extra_settings" aria-controls="tabs-extra_settings" role="tab" data-toggle="tab">Extra Settings</a></li>
|
||||||
<li role="presentation"><a href="#tabs-import_backups" aria-controls="tabs-import_backups" role="tab" data-toggle="tab">Import & Backups</a></li>
|
<li role="presentation"><a href="#tabs-import_backups" aria-controls="tabs-import_backups" role="tab" data-toggle="tab">Import & Backups</a></li>
|
||||||
<li role="presentation"><a href="#tabs-remote_app" aria-controls="tabs-remote_app" role="tab" data-toggle="tab">PlexPy Remote App</a></li>
|
<li role="presentation"><a href="#tabs-android_app" aria-controls="tabs-android_app" role="tab" data-toggle="tab">PlexPy Android App</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
|
@ -1087,10 +1087,10 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div role="tabpanel" class="tab-pane" id="tabs-remote_app">
|
<div role="tabpanel" class="tab-pane" id="tabs-android_app">
|
||||||
|
|
||||||
<div class="padded-header">
|
<div class="padded-header">
|
||||||
<h3>PlexPy Remote App</h3>
|
<h3>PlexPy Android App</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
@ -1103,8 +1103,8 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Link the App</label>
|
<label>Register the App</label>
|
||||||
<p class="help-block">Link the app to your PlexPy server by scanning a QR code.</p>
|
<p class="help-block">Register the app to your PlexPy server by scanning a QR code.</p>
|
||||||
<div class="btn-group" style="display: table-cell; vertical-align: middle;">
|
<div class="btn-group" style="display: table-cell; vertical-align: middle;">
|
||||||
<button class="btn btn-form" type="button" id="generate_qr" data-target="#api-qr-modal" data-toggle="modal">Generate QR Code</button>
|
<button class="btn btn-form" type="button" id="generate_qr" data-target="#api-qr-modal" data-toggle="modal">Generate QR Code</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2366,12 +2366,12 @@
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
|
||||||
<h4 class="modal-title">Link PlexPy Remote App</h4>
|
<h4 class="modal-title">Register PlexPy Android App</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<label>Instructions</label>
|
<label>Instructions</label>
|
||||||
<p class="help-block">
|
<p class="help-block">
|
||||||
Scan the QR code below with the PlexPy Remote app to automatically link it with the server.
|
Scan the QR code below with the PlexPy Android app to automatically register it with the server.
|
||||||
</p>
|
</p>
|
||||||
<label>QR Code</label>
|
<label>QR Code</label>
|
||||||
<pre id="api_qr_code" style="text-align: center"></pre>
|
<pre id="api_qr_code" style="text-align: center"></pre>
|
||||||
|
@ -3025,7 +3025,7 @@ $(document).ready(function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
$("a[data-tab-destination]").click(function () {
|
$('body').on('click', 'a[data-tab-destination]', function () {
|
||||||
var tab = $(this).data('tab-destination');
|
var tab = $(this).data('tab-destination');
|
||||||
$("a[href=#" + tab + "]").click();
|
$("a[href=#" + tab + "]").click();
|
||||||
});
|
});
|
||||||
|
|
|
@ -534,6 +534,12 @@ def dbcheck():
|
||||||
'media_info TEXT)'
|
'media_info TEXT)'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# mobile_devices table :: This table keeps record of devices linked with the mobile app
|
||||||
|
c_db.execute(
|
||||||
|
'CREATE TABLE IF NOT EXISTS mobile_devices (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
||||||
|
'device_token TEXT NOT NULL UNIQUE, device_name TEXT, friendly_name TEXT)'
|
||||||
|
)
|
||||||
|
|
||||||
# Upgrade sessions table from earlier versions
|
# Upgrade sessions table from earlier versions
|
||||||
try:
|
try:
|
||||||
c_db.execute('SELECT started FROM sessions')
|
c_db.execute('SELECT started FROM sessions')
|
||||||
|
|
|
@ -341,13 +341,13 @@ class API2:
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def register_android_app(self, notifier_id=None, device_token='', **kwargs):
|
def register_device(self, device_name='', device_token='', **kwargs):
|
||||||
""" Registers the PlexPy Android App for notifications.
|
""" Registers the PlexPy Android App for notifications.
|
||||||
|
|
||||||
```
|
```
|
||||||
Required parameters:
|
Required parameters:
|
||||||
notifier_id (int): The notifier id of the PlexPy Android App notifier
|
|
||||||
device_token (str): The device token of the PlexPy Android App
|
device_token (str): The device token of the PlexPy Android App
|
||||||
|
device_name (str): The device name of the PlexPy Android App
|
||||||
|
|
||||||
Optional parameters:
|
Optional parameters:
|
||||||
None
|
None
|
||||||
|
@ -356,10 +356,8 @@ class API2:
|
||||||
None
|
None
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
import notifiers
|
if not device_name:
|
||||||
|
self._api_msg = 'Device registartion failed: no device name provided.'
|
||||||
if not notifier_id:
|
|
||||||
self._api_msg = 'Device registartion failed: no notifier id provided.'
|
|
||||||
self._api_result_type = 'error'
|
self._api_result_type = 'error'
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -368,24 +366,23 @@ class API2:
|
||||||
self._api_result_type = 'error'
|
self._api_result_type = 'error'
|
||||||
return
|
return
|
||||||
|
|
||||||
if notifier_id:
|
db = database.MonitorDatabase()
|
||||||
notifier = notifiers.get_notifier_config(notifier_id=notifier_id)
|
|
||||||
if not notifier or notifier['agent_id'] != 21:
|
|
||||||
self._api_msg = 'Device registartion failed: Incorrect notifier id provided'
|
|
||||||
self._api_result_type = 'error'
|
|
||||||
return
|
|
||||||
|
|
||||||
config = {'androidapp_api_key': notifier['config']['api_key'],
|
keys = {'device_token': device_token}
|
||||||
'androidapp_device_token': device_token}
|
values = {'device_name': device_name}
|
||||||
|
|
||||||
if notifiers.set_notifier_config(notifier_id=notifier_id, agent_id=notifier['agent_id'], **config):
|
|
||||||
self._api_msg = 'Device registration successful.'
|
|
||||||
self._api_result_type = 'success'
|
|
||||||
return
|
|
||||||
|
|
||||||
else:
|
try:
|
||||||
self._api_msg = 'Device registration failed.'
|
db.upsert(table_name='mobile_devices', key_dict=keys, value_dict=values)
|
||||||
self._api_result_type = 'error'
|
except Exception as e:
|
||||||
|
logger.warn(u"PlexPy APIv2 :: Failed to register mobile device in the database: %s." % e)
|
||||||
|
self._api_msg = 'Device registartion failed: database error.'
|
||||||
|
self._api_result_type = 'error'
|
||||||
|
return
|
||||||
|
|
||||||
|
logger.info(u"PlexPy APIv2 :: Registered mobile device in the database: %s." % device_name)
|
||||||
|
self._api_msg = 'Device registration successful.'
|
||||||
|
self._api_result_type = 'success'
|
||||||
|
return
|
||||||
|
|
||||||
def _api_make_md(self):
|
def _api_make_md(self):
|
||||||
""" Tries to make a API.md to simplify the api docs. """
|
""" Tries to make a API.md to simplify the api docs. """
|
||||||
|
|
|
@ -663,7 +663,7 @@ class Notifier(object):
|
||||||
|
|
||||||
class ANDROIDAPP(Notifier):
|
class ANDROIDAPP(Notifier):
|
||||||
"""
|
"""
|
||||||
PlexPy Android App notifications
|
PlexPy Android app notifications
|
||||||
"""
|
"""
|
||||||
_DEFAULT_CONFIG = {'api_key': '',
|
_DEFAULT_CONFIG = {'api_key': '',
|
||||||
'device_token': ''
|
'device_token': ''
|
||||||
|
@ -687,29 +687,60 @@ class ANDROIDAPP(Notifier):
|
||||||
request_status = response.status
|
request_status = response.status
|
||||||
|
|
||||||
if request_status == 200:
|
if request_status == 200:
|
||||||
logger.info(u"PlexPy Notifiers :: Android App notification sent.")
|
logger.info(u"PlexPy Notifiers :: Android app notification sent.")
|
||||||
return True
|
return True
|
||||||
elif request_status >= 400 and request_status < 500:
|
elif request_status >= 400 and request_status < 500:
|
||||||
logger.warn(u"PlexPy Notifiers :: Android App notification failed: [%s] %s" % (request_status, response.reason))
|
logger.warn(u"PlexPy Notifiers :: Android app notification failed: [%s] %s" % (request_status, response.reason))
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
logger.warn(u"PlexPy Notifiers :: Android App notification failed.")
|
logger.warn(u"PlexPy Notifiers :: Android app notification failed.")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_devices(self):
|
||||||
|
db = database.MonitorDatabase()
|
||||||
|
|
||||||
|
try:
|
||||||
|
query = 'SELECT * FROM mobile_devices'
|
||||||
|
result = db.select(query=query)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warn(u"PlexPy Notifiers :: Unable to retrieve Android app devices list: %s." % e)
|
||||||
|
return {'': ''}
|
||||||
|
|
||||||
|
devices = {}
|
||||||
|
for device in result:
|
||||||
|
if device['friendly_name']:
|
||||||
|
devices['device_token'] = device['friendly_name']
|
||||||
|
else:
|
||||||
|
devices['device_token'] = device['device_name']
|
||||||
|
|
||||||
|
return devices
|
||||||
|
|
||||||
def return_config_options(self):
|
def return_config_options(self):
|
||||||
|
devices = self.get_devices()
|
||||||
|
|
||||||
|
if not devices:
|
||||||
|
devices_config = {'label': 'Device',
|
||||||
|
'description': 'No devices registered. ' \
|
||||||
|
'<a data-tab-destination="tabs-android_app" data-toggle="tab" data-dismiss="modal" ' \
|
||||||
|
'style="cursor: pointer;">Register the Android app with PlexPy.</a>',
|
||||||
|
'input_type': 'help'
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
devices_config = {'label': 'Device',
|
||||||
|
'value': self.config['device_token'],
|
||||||
|
'name': 'androidapp_device_token',
|
||||||
|
'description': 'Set your Android app device.',
|
||||||
|
'input_type': 'select',
|
||||||
|
'select_options': devices
|
||||||
|
}
|
||||||
|
|
||||||
config_option = [{'label': 'Pushy API Key',
|
config_option = [{'label': 'Pushy API Key',
|
||||||
'value': self.config['api_key'],
|
'value': self.config['api_key'],
|
||||||
'name': 'androidapp_api_key',
|
'name': 'androidapp_api_key',
|
||||||
'description': 'Your Pushy API key.',
|
'description': 'Your Pushy API key.',
|
||||||
'input_type': 'text'
|
'input_type': 'text'
|
||||||
},
|
},
|
||||||
{'label': 'Device Token',
|
devices_config
|
||||||
'value': self.config['device_token'],
|
|
||||||
'name': 'androidapp_device_token',
|
|
||||||
'description': 'Your Android App device token. Filled in automatically after registering the deivce in the app.',
|
|
||||||
'input_type': 'text',
|
|
||||||
'readonly': True
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
return config_option
|
return config_option
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue