astrXbian/.install/.kodi/addons/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/monitor.py

166 lines
5.9 KiB
Python

# -*- coding: utf-8 -*-
"""
Copyright (C) 2018-2018 plugin.video.youtube
SPDX-License-Identifier: GPL-2.0-only
See LICENSES/GPL-2.0-only for more information.
"""
from six.moves.urllib.parse import unquote
import json
import os
import shutil
import threading
import xbmc
import xbmcaddon
import xbmcvfs
from ..utils import get_http_server, is_httpd_live
from .. import logger
try:
xbmc.translatePath = xbmcvfs.translatePath
except AttributeError:
pass
class YouTubeMonitor(xbmc.Monitor):
# noinspection PyUnusedLocal,PyMissingConstructor
def __init__(self, *args, **kwargs):
self.addon_id = 'plugin.video.youtube'
addon = xbmcaddon.Addon(self.addon_id)
self._whitelist = addon.getSetting('kodion.http.ip.whitelist')
self._httpd_port = int(addon.getSetting('kodion.mpd.proxy.port'))
self._old_httpd_port = self._httpd_port
self._use_httpd = (addon.getSetting('kodion.mpd.videos') == 'true' and addon.getSetting('kodion.video.quality.mpd') == 'true') or \
(addon.getSetting('youtube.api.config.page') == 'true')
self._httpd_address = addon.getSetting('kodion.http.listen')
self._old_httpd_address = self._httpd_address
self.httpd = None
self.httpd_thread = None
if self.use_httpd():
self.start_httpd()
del addon
def onNotification(self, sender, method, data):
if sender == 'plugin.video.youtube' and method.endswith('.check_settings'):
data = json.loads(data)
data = json.loads(unquote(data[0]))
logger.log_debug('onNotification: |check_settings| -> |%s|' % json.dumps(data))
_use_httpd = data.get('use_httpd')
_httpd_port = data.get('httpd_port')
_whitelist = data.get('whitelist')
_httpd_address = data.get('httpd_address')
whitelist_changed = _whitelist != self._whitelist
port_changed = self._httpd_port != _httpd_port
address_changed = self._httpd_address != _httpd_address
if _whitelist != self._whitelist:
self._whitelist = _whitelist
if self._use_httpd != _use_httpd:
self._use_httpd = _use_httpd
if self._httpd_port != _httpd_port:
self._old_httpd_port = self._httpd_port
self._httpd_port = _httpd_port
if self._httpd_address != _httpd_address:
self._old_httpd_address = self._httpd_address
self._httpd_address = _httpd_address
if self.use_httpd() and not self.httpd:
self.start_httpd()
elif self.use_httpd() and (port_changed or whitelist_changed or address_changed):
if self.httpd:
self.restart_httpd()
else:
self.start_httpd()
elif not self.use_httpd() and self.httpd:
self.shutdown_httpd()
elif sender == 'plugin.video.youtube':
logger.log_debug('onNotification: |unknown method|')
def use_httpd(self):
return self._use_httpd
def httpd_port(self):
return int(self._httpd_port)
def httpd_address(self):
return self._httpd_address
def old_httpd_address(self):
return self._old_httpd_address
def old_httpd_port(self):
return int(self._old_httpd_port)
def httpd_port_sync(self):
self._old_httpd_port = self._httpd_port
def start_httpd(self):
if not self.httpd:
logger.log_debug('HTTPServer: Starting |{ip}:{port}|'.format(ip=self.httpd_address(),
port=str(self.httpd_port())))
self.httpd_port_sync()
self.httpd = get_http_server(address=self.httpd_address(), port=self.httpd_port())
if self.httpd:
self.httpd_thread = threading.Thread(target=self.httpd.serve_forever)
self.httpd_thread.daemon = True
self.httpd_thread.start()
sock_name = self.httpd.socket.getsockname()
logger.log_debug('HTTPServer: Serving on |{ip}:{port}|'.format(ip=str(sock_name[0]),
port=str(sock_name[1])))
def shutdown_httpd(self):
if self.httpd:
logger.log_debug('HTTPServer: Shutting down |{ip}:{port}|'.format(ip=self.old_httpd_address(),
port=str(self.old_httpd_port())))
self.httpd_port_sync()
self.httpd.shutdown()
self.httpd.socket.close()
self.httpd_thread.join()
self.httpd_thread = None
self.httpd = None
def restart_httpd(self):
logger.log_debug('HTTPServer: Restarting... |{old_ip}:{old_port}| -> |{ip}:{port}|'
.format(old_ip=self.old_httpd_address(), old_port=str(self.old_httpd_port()),
ip=self.httpd_address(), port=str(self.httpd_port())))
self.shutdown_httpd()
self.start_httpd()
def ping_httpd(self):
return is_httpd_live(port=self.httpd_port())
def remove_temp_dir(self):
try:
path = xbmc.translatePath('special://temp/%s' % self.addon_id).decode('utf-8')
except AttributeError:
path = xbmc.translatePath('special://temp/%s' % self.addon_id)
if os.path.isdir(path):
try:
xbmcvfs.rmdir(path, force=True)
except:
pass
if os.path.isdir(path):
try:
shutil.rmtree(path)
except:
pass
if os.path.isdir(path):
logger.log_debug('Failed to remove directory: {dir}'.format(dir=path.encode('utf-8')))
return False
else:
return True