Example #1
0
    def load_ssl_certificate(self, certificate=None, private_key=None):
        if certificate and private_key:
            with open(sickrage.app.https_cert_file, 'w') as cert_out:
                cert_out.write(certificate)

            with open(sickrage.app.https_key_file, 'w') as key_out:
                key_out.write(private_key)
        else:
            if os.path.exists(sickrage.app.https_key_file) and os.path.exists(sickrage.app.https_cert_file):
                if self.is_certificate_valid() and not self.certificate_needs_renewal():
                    return True

            resp = sickrage.app.api.server.get_server_certificate(sickrage.app.config.general.server_id)
            if not resp or 'certificate' not in resp or 'private_key' not in resp:
                if not create_https_certificates(sickrage.app.https_cert_file, sickrage.app.https_key_file):
                    return False

                if not os.path.exists(sickrage.app.https_cert_file) or not os.path.exists(sickrage.app.https_key_file):
                    return False

                return True

            with open(sickrage.app.https_cert_file, 'w') as cert_out:
                cert_out.write(resp['certificate'])

            with open(sickrage.app.https_key_file, 'w') as key_out:
                key_out.write(resp['private_key'])

        sickrage.app.log.info("Loaded SSL certificate successfully, restarting server in 1 minute")

        if self.server:
            # restart after 1 minute
            IOLoop.current().add_timeout(datetime.timedelta(minutes=1), sickrage.app.restart)

        return True
Example #2
0
    def run(self):
        self.started = True

        # load languages
        tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR,
                                                 'messages')

        # clear mako cache folder
        mako_cache = os.path.join(sickrage.app.cache_dir, 'mako')
        if os.path.isdir(mako_cache):
            shutil.rmtree(mako_cache)

        # video root
        if sickrage.app.config.root_dirs:
            root_dirs = sickrage.app.config.root_dirs.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.app.config.web_root:
            sickrage.app.config.web_root = sickrage.app.config.web_root = (
                '/' + sickrage.app.config.web_root.lstrip('/').strip('/'))

        # api root
        self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root,
                                        sickrage.app.config.api_key)

        # tornado setup
        if sickrage.app.config.enable_https:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (sickrage.app.config.https_cert and os.path.exists(
                    sickrage.app.config.https_cert)) or not (
                        sickrage.app.config.https_key
                        and os.path.exists(sickrage.app.config.https_key)):
                if not create_https_certificates(
                        sickrage.app.config.https_cert,
                        sickrage.app.config.https_key):
                    sickrage.app.log.info(
                        "Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.app.config.enable_https = False

            if not (os.path.exists(sickrage.app.config.https_cert)
                    and os.path.exists(sickrage.app.config.https_key)):
                sickrage.app.log.warning(
                    "Disabled HTTPS because of missing CERT and KEY files")
                sickrage.app.config.enable_https = False

        # Load the app
        self.app = Application(
            [
                # api
                (r'%s(/?.*)' % self.api_root, ApiHandler),

                # redirect to web root
                (r"(?!%s)(.*)" % sickrage.app.config.web_root, RedirectHandler,
                 {
                     "url": "%s/{0}" % sickrage.app.config.web_root
                 }),

                # api key
                (r'%s/getkey(/?.*)' % sickrage.app.config.web_root, KeyHandler
                 ),

                # api builder
                (r'%s/api/builder' % sickrage.app.config.web_root,
                 RedirectHandler, {
                     "url": sickrage.app.config.web_root + '/apibuilder/'
                 }),

                # login
                (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler),

                # logout
                (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler
                 ),

                # calendar
                (r'%s/calendar' % sickrage.app.config.web_root, CalendarHandler
                 ),

                # favicon
                (r'%s/(favicon\.ico)' % sickrage.app.config.web_root,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.app.config.gui_static_dir,
                                  'images/favicon.ico')
                 }),

                # images
                (r'%s/images/(.*)' % sickrage.app.config.web_root,
                 StaticImageHandler, {
                     "path":
                     os.path.join(sickrage.app.config.gui_static_dir, 'images')
                 }),

                # css
                (r'%s/css/(.*)' % sickrage.app.config.web_root,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.app.config.gui_static_dir, 'css')
                 }),

                # scss
                (r'%s/scss/(.*)' % sickrage.app.config.web_root,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.app.config.gui_static_dir, 'scss')
                 }),

                # fonts
                (r'%s/fonts/(.*)' % sickrage.app.config.web_root,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.app.config.gui_static_dir, 'fonts')
                 }),

                # javascript
                (r'%s/js/(.*)' % sickrage.app.config.web_root,
                 StaticFileHandler, {
                     "path": os.path.join(sickrage.app.config.gui_static_dir,
                                          'js')
                 }),

                # videos
                (r'%s/videos/(.*)' % sickrage.app.config.web_root,
                 StaticFileHandler, {
                     "path": self.video_root
                 }),
            ] + Route.get_routes(sickrage.app.config.web_root),
            debug=True,
            autoreload=False,
            gzip=sickrage.app.config.web_use_gzip,
            xheaders=sickrage.app.config.handle_reverse_proxy,
            cookie_secret=sickrage.app.config.web_cookie_secret,
            login_url='%s/login/' % sickrage.app.config.web_root)

        self.server = HTTPServer(self.app, no_keep_alive=True)

        if sickrage.app.config.enable_https:
            self.server.ssl_options = {
                "certfile": sickrage.app.config.https_cert,
                "keyfile": sickrage.app.config.https_key
            }

        try:
            self.server.listen(sickrage.app.config.web_port, None)

            sickrage.app.log.info("SiCKRAGE :: STARTED")
            sickrage.app.log.info("SiCKRAGE :: VERSION:[{}]".format(
                sickrage.app.version_updater.version))
            sickrage.app.log.info("SiCKRAGE :: CONFIG:[{}] [v{}]".format(
                sickrage.app.config_file, sickrage.app.config.config_version))
            sickrage.app.log.info("SiCKRAGE :: URL:[{}://{}:{}/]".format(
                ('http', 'https')[sickrage.app.config.enable_https],
                sickrage.app.config.web_host, sickrage.app.config.web_port))

            # launch browser window
            if all([
                    not sickrage.app.no_launch,
                    sickrage.app.config.launch_browser
            ]):
                threading.Thread(
                    None,
                    lambda: launch_browser(
                        ('http', 'https')[sickrage.app.config.enable_https
                                          ], sickrage.app.config.web_host,
                        sickrage.app.config.web_port),
                    name="LAUNCH-BROWSER").start()

            sickrage.app.io_loop.start()
        except socket.error as e:
            sickrage.app.log.warning(e.strerror)
            raise SystemExit
Example #3
0
    def start(self):
        self.started = True

        # clear mako cache folder
        mako_cache = os.path.join(sickrage.CACHE_DIR, 'mako')
        if os.path.isdir(mako_cache):
            shutil.rmtree(mako_cache)

        # video root
        if sickrage.srCore.srConfig.ROOT_DIRS:
            root_dirs = sickrage.srCore.srConfig.ROOT_DIRS.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.srCore.srConfig.WEB_ROOT:
            sickrage.srCore.srConfig.WEB_ROOT = sickrage.srCore.srConfig.WEB_ROOT = (
                '/' + sickrage.srCore.srConfig.WEB_ROOT.lstrip('/').strip('/'))

        # api root
        if not sickrage.srCore.srConfig.API_KEY:
            sickrage.srCore.srConfig.API_KEY = generateApiKey()
        self.api_root = r'%s/api/%s' % (sickrage.srCore.srConfig.WEB_ROOT,
                                        sickrage.srCore.srConfig.API_KEY)

        # tornado setup
        if sickrage.srCore.srConfig.ENABLE_HTTPS:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (sickrage.srCore.srConfig.HTTPS_CERT and os.path.exists(
                    sickrage.srCore.srConfig.HTTPS_CERT)) or not (
                        sickrage.srCore.srConfig.HTTPS_KEY and os.path.exists(
                            sickrage.srCore.srConfig.HTTPS_KEY)):
                if not create_https_certificates(
                        sickrage.srCore.srConfig.HTTPS_CERT,
                        sickrage.srCore.srConfig.HTTPS_KEY):
                    sickrage.srCore.srLogger.info(
                        "Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.srCore.srConfig.ENABLE_HTTPS = False

            if not (os.path.exists(sickrage.srCore.srConfig.HTTPS_CERT)
                    and os.path.exists(sickrage.srCore.srConfig.HTTPS_KEY)):
                sickrage.srCore.srLogger.warning(
                    "Disabled HTTPS because of missing CERT and KEY files")
                sickrage.srCore.srConfig.ENABLE_HTTPS = False

        # Load the app
        self.app = Application(
            [
                # api
                (r'%s(/?.*)' % self.api_root, ApiHandler),

                # api key
                (r'%s/getkey(/?.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 KeyHandler),

                # api builder
                (r'%s/api/builder' % sickrage.srCore.srConfig.WEB_ROOT,
                 RedirectHandler, {
                     "url": sickrage.srCore.srConfig.WEB_ROOT + '/apibuilder/'
                 }),

                # login
                (r'%s/login(/?)' % sickrage.srCore.srConfig.WEB_ROOT,
                 LoginHandler),

                # logout
                (r'%s/logout(/?)' % sickrage.srCore.srConfig.WEB_ROOT,
                 LogoutHandler),

                # calendar
                (r'%s/calendar' % sickrage.srCore.srConfig.WEB_ROOT,
                 CalendarHandler),

                # favicon
                (r'%s/(favicon\.ico)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                  'images/ico/favicon.ico')
                 }),

                # images
                (r'%s/images/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticImageHandler, {
                     "path":
                     os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images')
                 }),

                # css
                (r'%s/css/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                          'css')
                 }),

                # scss
                (r'%s/scss/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                          'scss')
                 }),

                # fonts
                (r'%s/fonts/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'fonts')
                 }),

                # javascript
                (r'%s/js/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                          'js')
                 }),

                # videos
                (r'%s/videos/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path": self.video_root
                 }),
            ] + Route.get_routes(sickrage.srCore.srConfig.WEB_ROOT),
            debug=sickrage.DEBUG,
            autoreload=False,
            gzip=sickrage.srCore.srConfig.WEB_USE_GZIP,
            xheaders=sickrage.srCore.srConfig.HANDLE_REVERSE_PROXY,
            cookie_secret=sickrage.srCore.srConfig.WEB_COOKIE_SECRET,
            login_url='%s/login/' % sickrage.srCore.srConfig.WEB_ROOT)

        self.server = HTTPServer(self.app, no_keep_alive=True)

        if sickrage.srCore.srConfig.ENABLE_HTTPS:
            self.server.ssl_options = {
                "certfile": sickrage.srCore.srConfig.HTTPS_CERT,
                "keyfile": sickrage.srCore.srConfig.HTTPS_KEY
            }

        try:
            self.server.listen(sickrage.srCore.srConfig.WEB_PORT, None)
        except socket.error as e:
            print(e.message)
            raise
Example #4
0
    def start(self):
        self.started = True

        # video root
        self.video_root = None
        if sickrage.srCore.srConfig.ROOT_DIRS:
            root_dirs = sickrage.srCore.srConfig.ROOT_DIRS.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.srCore.srConfig.WEB_ROOT:
            sickrage.srCore.srConfig.WEB_ROOT = sickrage.srCore.srConfig.WEB_ROOT = (
                '/' + sickrage.srCore.srConfig.WEB_ROOT.lstrip('/').strip('/'))

        # api root
        if not sickrage.srCore.srConfig.API_KEY:
            sickrage.srCore.srConfig.API_KEY = generateApiKey()
        self.api_root = r'%s/api/%s' % (sickrage.srCore.srConfig.WEB_ROOT,
                                        sickrage.srCore.srConfig.API_KEY)

        # tornado setup
        if sickrage.srCore.srConfig.ENABLE_HTTPS:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (sickrage.srCore.srConfig.HTTPS_CERT and os.path.exists(
                    sickrage.srCore.srConfig.HTTPS_CERT)) or not (
                        sickrage.srCore.srConfig.HTTPS_KEY and os.path.exists(
                            sickrage.srCore.srConfig.HTTPS_KEY)):
                if not create_https_certificates(
                        sickrage.srCore.srConfig.HTTPS_CERT,
                        sickrage.srCore.srConfig.HTTPS_KEY):
                    sickrage.srCore.srLogger.info(
                        "Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.srCore.srConfig.ENABLE_HTTPS = False

            if not (os.path.exists(sickrage.srCore.srConfig.HTTPS_CERT)
                    and os.path.exists(sickrage.srCore.srConfig.HTTPS_KEY)):
                sickrage.srCore.srLogger.warning(
                    "Disabled HTTPS because of missing CERT and KEY files")
                sickrage.srCore.srConfig.ENABLE_HTTPS = False

        # Load the app
        self.app = Application(
            [],
            debug=False,
            autoreload=False,
            gzip=sickrage.srCore.srConfig.WEB_USE_GZIP,
            xheaders=sickrage.srCore.srConfig.HANDLE_REVERSE_PROXY,
            cookie_secret=sickrage.srCore.srConfig.WEB_COOKIE_SECRET,
            login_url='%s/login/' % sickrage.srCore.srConfig.WEB_ROOT)

        # Main Handlers
        self.app.add_handlers(
            '.*$',
            [
                # webapi handler
                (r'%s(/?.*)' % self.api_root, ApiHandler),

                # webapi key retrieval
                (r'%s/getkey(/?.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 KeyHandler),

                # webapi builder redirect
                (r'%s/api/builder' % sickrage.srCore.srConfig.WEB_ROOT,
                 RedirectHandler, {
                     "url": sickrage.srCore.srConfig.WEB_ROOT + '/apibuilder/'
                 }),

                # webui login/logout handlers
                (r'%s/login(/?)' % sickrage.srCore.srConfig.WEB_ROOT,
                 LoginHandler),
                (r'%s/logout(/?)' % sickrage.srCore.srConfig.WEB_ROOT,
                 LogoutHandler),

                # webui handlers
            ] + Route.get_routes(sickrage.srCore.srConfig.WEB_ROOT))

        # Web calendar handler (Needed because option Unprotected calendar)
        self.app.add_handlers('.*$', [
            (r'%s/calendar' % sickrage.srCore.srConfig.WEB_ROOT,
             CalendarHandler),
        ])

        # Static File Handlers
        self.app.add_handlers(
            ".*$",
            [
                # favicon
                (r'%s/(favicon\.ico)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                  'images/ico/favicon.ico')
                 }),

                # images
                (r'%s.*?/images/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticImageHandler, {
                     "path":
                     os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images')
                 }),

                # css
                (r'%s/css/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                          'css')
                 }),

                # scss
                (r'%s/scss/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                          'scss')
                 }),

                # fonts
                (r'%s/fonts/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path":
                     os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'fonts')
                 }),

                # javascript
                (r'%s/js/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                 StaticFileHandler, {
                     "path": os.path.join(sickrage.srCore.srConfig.GUI_DIR,
                                          'js')
                 }),

                # videos
            ] + [(r'%s/videos/(.*)' % sickrage.srCore.srConfig.WEB_ROOT,
                  StaticFileHandler, {
                      "path": self.video_root
                  })])

        self.server = HTTPServer(self.app, no_keep_alive=True)

        if sickrage.srCore.srConfig.ENABLE_HTTPS:
            self.server.ssl_options = {
                "certfile": sickrage.srCore.srConfig.HTTPS_CERT,
                "keyfile": sickrage.srCore.srConfig.HTTPS_KEY
            }

        try:
            self.server.listen(sickrage.srCore.srConfig.WEB_PORT, None)
        except socket.error as e:
            print(e.message)
            raise

        # launch browser window
        if all(
            [not sickrage.NOLAUNCH, sickrage.srCore.srConfig.LAUNCH_BROWSER]):
            threading.Thread(
                None, lambda: launch_browser(
                    ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS],
                    get_lan_ip(), sickrage.srCore.srConfig.WEB_PORT)).start()

        # clear mako cache folder
        makocache = os.path.join(sickrage.srCore.srConfig.CACHE_DIR, 'mako')
        if os.path.isdir(makocache):
            shutil.rmtree(makocache)

        sickrage.srCore.srLogger.info("SiCKRAGE :: STARTED")
        sickrage.srCore.srLogger.info("SiCKRAGE :: VERSION:[{}]".format(
            sickrage.srCore.VERSIONUPDATER.updater.version))
        sickrage.srCore.srLogger.info("SiCKRAGE :: CONFIG:[{}]".format(
            sickrage.CONFIG_FILE))
        sickrage.srCore.srLogger.info("SiCKRAGE :: URL:[{}://{}:{}/]".format(
            ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS],
            get_lan_ip(), sickrage.srCore.srConfig.WEB_PORT))
Example #5
0
    def run(self):
        self.started = True
        self.io_loop = IOLoop()

        # load languages
        tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages')

        # Check configured web port is correct
        if sickrage.app.config.web_port < 21 or sickrage.app.config.web_port > 65535:
            sickrage.app.config.web_port = 8081

        # clear mako cache folder
        mako_cache = os.path.join(sickrage.app.cache_dir, 'mako')
        if os.path.isdir(mako_cache):
            shutil.rmtree(mako_cache, ignore_errors=True)

        # video root
        if sickrage.app.config.root_dirs:
            root_dirs = sickrage.app.config.root_dirs.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.app.config.web_root:
            sickrage.app.config.web_root = sickrage.app.config.web_root = (
                    '/' + sickrage.app.config.web_root.lstrip('/').strip('/'))

        # api root
        self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root, sickrage.app.config.api_key)

        # tornado setup
        if sickrage.app.config.enable_https:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not create_https_certificates(sickrage.app.config.https_cert, sickrage.app.config.https_key):
                sickrage.app.log.info("Unable to create CERT/KEY files, disabling HTTPS")
                sickrage.app.config.enable_https = False

            if not (os.path.exists(sickrage.app.config.https_cert) and os.path.exists(sickrage.app.config.https_key)):
                sickrage.app.log.warning("Disabled HTTPS because of missing CERT and KEY files")
                sickrage.app.config.enable_https = False

        # Load templates
        mako_lookup = TemplateLookup(
            directories=[sickrage.app.config.gui_views_dir],
            module_directory=os.path.join(sickrage.app.cache_dir, 'mako'),
            filesystem_checks=True,
            strict_undefined=True,
            input_encoding='utf-8',
            output_encoding='utf-8',
            encoding_errors='replace'
        )

        templates = {}
        for root, dirs, files in os.walk(sickrage.app.config.gui_views_dir):
            path = root.split(os.sep)

            for x in sickrage.app.config.gui_views_dir.split(os.sep):
                if x in path:
                    del path[path.index(x)]

            for file in files:
                filename = '{}/{}'.format('/'.join(path), file).lstrip('/')
                templates[filename] = mako_lookup.get_template(filename)

        # Load the app
        self.app = Application(
            debug=True,
            autoreload=False,
            gzip=sickrage.app.config.web_use_gzip,
            cookie_secret=sickrage.app.config.web_cookie_secret,
            login_url='%s/login/' % sickrage.app.config.web_root,
            templates=templates,
            default_handler_class=NotFoundHandler
        )

        # Websocket handler
        self.app.add_handlers('.*$', [
            (r'%s/ws/ui' % sickrage.app.config.web_root, WebSocketUIHandler)
        ])

        # Static File Handlers
        self.app.add_handlers('.*$', [
            # api
            (r'%s/api/(\w{32})(/?.*)' % sickrage.app.config.web_root, ApiHandler),

            # redirect to home
            (r"(%s)(/?)" % sickrage.app.config.web_root, RedirectHandler,
             {"url": "%s/home" % sickrage.app.config.web_root}),

            # api builder
            (r'%s/api/builder' % sickrage.app.config.web_root, RedirectHandler,
             {"url": sickrage.app.config.web_root + '/apibuilder/'}),

            # login
            (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler),

            # logout
            (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler),

            # favicon
            (r'%s/(favicon\.ico)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images/favicon.ico')}),

            # images
            (r'%s/images/(.*)' % sickrage.app.config.web_root, StaticImageHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images')}),

            # css
            (r'%s/css/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'css')}),

            # scss
            (r'%s/scss/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'scss')}),

            # fonts
            (r'%s/fonts/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'fonts')}),

            # javascript
            (r'%s/js/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'js')}),

            # videos
            (r'%s/videos/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": self.video_root}),
        ])

        # Handlers
        self.app.add_handlers('.*$', [
            (r'%s/robots.txt' % sickrage.app.config.web_root, RobotsDotTxtHandler),
            (r'%s/messages.po' % sickrage.app.config.web_root, MessagesDotPoHandler),
            (r'%s/quicksearch.json' % sickrage.app.config.web_root, QuicksearchDotJsonHandler),
            (r'%s/apibuilder(/?)' % sickrage.app.config.web_root, APIBulderHandler),
            (r'%s/setHomeLayout(/?)' % sickrage.app.config.web_root, SetHomeLayoutHandler),
            (r'%s/setPosterSortBy(/?)' % sickrage.app.config.web_root, SetPosterSortByHandler),
            (r'%s/setPosterSortDir(/?)' % sickrage.app.config.web_root, SetPosterSortDirHandler),
            (r'%s/setHistoryLayout(/?)' % sickrage.app.config.web_root, SetHistoryLayoutHandler),
            (r'%s/toggleDisplayShowSpecials(/?)' % sickrage.app.config.web_root, ToggleDisplayShowSpecialsHandler),
            (r'%s/toggleScheduleDisplayPaused(/?)' % sickrage.app.config.web_root, ToggleScheduleDisplayPausedHandler),
            (r'%s/setScheduleSort(/?)' % sickrage.app.config.web_root, SetScheduleSortHandler),
            (r'%s/forceSchedulerJob(/?)' % sickrage.app.config.web_root, ForceSchedulerJobHandler),
            (r'%s/announcements(/?)' % sickrage.app.config.web_root, AnnouncementsHandler),
            (r'%s/announcements/announcementCount(/?)' % sickrage.app.config.web_root, AnnouncementCountHandler),
            (r'%s/announcements/mark-seen(/?)' % sickrage.app.config.web_root, MarkAnnouncementSeenHandler),
            (r'%s/schedule(/?)' % sickrage.app.config.web_root, ScheduleHandler),
            (r'%s/setScheduleLayout(/?)' % sickrage.app.config.web_root, SetScheduleLayoutHandler),
            (r'%s/calendar(/?)' % sickrage.app.config.web_root, CalendarHandler),
            (r'%s/changelog(/?)' % sickrage.app.config.web_root, ChangelogHandler),
            (r'%s/account/link(/?)' % sickrage.app.config.web_root, AccountLinkHandler),
            (r'%s/account/unlink(/?)' % sickrage.app.config.web_root, AccountUnlinkHandler),
            (r'%s/account/is-linked(/?)' % sickrage.app.config.web_root, AccountIsLinkedHandler),
            (r'%s/history(/?)' % sickrage.app.config.web_root, HistoryHandler),
            (r'%s/history/clear(/?)' % sickrage.app.config.web_root, HistoryClearHandler),
            (r'%s/history/trim(/?)' % sickrage.app.config.web_root, HistoryTrimHandler),
            (r'%s/irc(/?)' % sickrage.app.config.web_root, IRCHandler),
            (r'%s/logs(/?)' % sickrage.app.config.web_root, LogsHandler),
            (r'%s/logs/errorCount(/?)' % sickrage.app.config.web_root, ErrorCountHandler),
            (r'%s/logs/warningCount(/?)' % sickrage.app.config.web_root, WarningCountHandler),
            (r'%s/logs/view(/?)' % sickrage.app.config.web_root, LogsViewHandler),
            (r'%s/logs/clearAll(/?)' % sickrage.app.config.web_root, LogsClearAllHanlder),
            (r'%s/logs/clearWarnings(/?)' % sickrage.app.config.web_root, LogsClearWarningsHanlder),
            (r'%s/logs/clearErrors(/?)' % sickrage.app.config.web_root, LogsClearErrorsHanlder),
            (r'%s/browser(/?)' % sickrage.app.config.web_root, WebFileBrowserHandler),
            (r'%s/browser/complete(/?)' % sickrage.app.config.web_root, WebFileBrowserCompleteHandler),
            (r'%s/home(/?)' % sickrage.app.config.web_root, HomeHandler),
            (r'%s/home/showProgress(/?)' % sickrage.app.config.web_root, ShowProgressHandler),
            (r'%s/home/is-alive(/?)' % sickrage.app.config.web_root, IsAliveHandler),
            (r'%s/home/testSABnzbd(/?)' % sickrage.app.config.web_root, TestSABnzbdHandler),
            (r'%s/home/testSynologyDSM(/?)' % sickrage.app.config.web_root, TestSynologyDSMHandler),
            (r'%s/home/testTorrent(/?)' % sickrage.app.config.web_root, TestTorrentHandler),
            (r'%s/home/testFreeMobile(/?)' % sickrage.app.config.web_root, TestFreeMobileHandler),
            (r'%s/home/testTelegram(/?)' % sickrage.app.config.web_root, TestTelegramHandler),
            (r'%s/home/testJoin(/?)' % sickrage.app.config.web_root, TestJoinHandler),
            (r'%s/home/testGrowl(/?)' % sickrage.app.config.web_root, TestGrowlHandler),
            (r'%s/home/testProwl(/?)' % sickrage.app.config.web_root, TestProwlHandler),
            (r'%s/home/testBoxcar2(/?)' % sickrage.app.config.web_root, TestBoxcar2Handler),
            (r'%s/home/testPushover(/?)' % sickrage.app.config.web_root, TestPushoverHandler),
            (r'%s/home/twitterStep1(/?)' % sickrage.app.config.web_root, TwitterStep1Handler),
            (r'%s/home/twitterStep2(/?)' % sickrage.app.config.web_root, TwitterStep2Handler),
            (r'%s/home/testTwitter(/?)' % sickrage.app.config.web_root, TestTwitterHandler),
            (r'%s/home/testTwilio(/?)' % sickrage.app.config.web_root, TestTwilioHandler),
            (r'%s/home/testSlack(/?)' % sickrage.app.config.web_root, TestSlackHandler),
            (r'%s/home/testAlexa(/?)' % sickrage.app.config.web_root, TestAlexaHandler),
            (r'%s/home/testDiscord(/?)' % sickrage.app.config.web_root, TestDiscordHandler),
            (r'%s/home/testKODI(/?)' % sickrage.app.config.web_root, TestKODIHandler),
            (r'%s/home/testPMC(/?)' % sickrage.app.config.web_root, TestPMCHandler),
            (r'%s/home/testPMS(/?)' % sickrage.app.config.web_root, TestPMSHandler),
            (r'%s/home/testLibnotify(/?)' % sickrage.app.config.web_root, TestLibnotifyHandler),
            (r'%s/home/testEMBY(/?)' % sickrage.app.config.web_root, TestEMBYHandler),
            (r'%s/home/testNMJ(/?)' % sickrage.app.config.web_root, TestNMJHandler),
            (r'%s/home/settingsNMJ(/?)' % sickrage.app.config.web_root, SettingsNMJHandler),
            (r'%s/home/testNMJv2(/?)' % sickrage.app.config.web_root, TestNMJv2Handler),
            (r'%s/home/settingsNMJv2(/?)' % sickrage.app.config.web_root, SettingsNMJv2Handler),
            (r'%s/home/getTraktToken(/?)' % sickrage.app.config.web_root, GetTraktTokenHandler),
            (r'%s/home/testTrakt(/?)' % sickrage.app.config.web_root, TestTraktHandler),
            (r'%s/home/loadShowNotifyLists(/?)' % sickrage.app.config.web_root, LoadShowNotifyListsHandler),
            (r'%s/home/saveShowNotifyList(/?)' % sickrage.app.config.web_root, SaveShowNotifyListHandler),
            (r'%s/home/testEmail(/?)' % sickrage.app.config.web_root, TestEmailHandler),
            (r'%s/home/testNMA(/?)' % sickrage.app.config.web_root, TestNMAHandler),
            (r'%s/home/testPushalot(/?)' % sickrage.app.config.web_root, TestPushalotHandler),
            (r'%s/home/testPushbullet(/?)' % sickrage.app.config.web_root, TestPushbulletHandler),
            (r'%s/home/getPushbulletDevices(/?)' % sickrage.app.config.web_root, GetPushbulletDevicesHandler),
            (r'%s/home/serverStatus(/?)' % sickrage.app.config.web_root, ServerStatusHandler),
            (r'%s/home/providerStatus(/?)' % sickrage.app.config.web_root, ProviderStatusHandler),
            (r'%s/home/shutdown(/?)' % sickrage.app.config.web_root, ShutdownHandler),
            (r'%s/home/restart(/?)' % sickrage.app.config.web_root, RestartHandler),
            (r'%s/home/updateCheck(/?)' % sickrage.app.config.web_root, UpdateCheckHandler),
            (r'%s/home/update(/?)' % sickrage.app.config.web_root, UpdateHandler),
            (r'%s/home/verifyPath(/?)' % sickrage.app.config.web_root, VerifyPathHandler),
            (r'%s/home/installRequirements(/?)' % sickrage.app.config.web_root, InstallRequirementsHandler),
            (r'%s/home/branchCheckout(/?)' % sickrage.app.config.web_root, BranchCheckoutHandler),
            (r'%s/home/displayShow(/?)' % sickrage.app.config.web_root, DisplayShowHandler),
            (r'%s/home/togglePause(/?)' % sickrage.app.config.web_root, TogglePauseHandler),
            (r'%s/home/deleteShow' % sickrage.app.config.web_root, DeleteShowHandler),
            (r'%s/home/refreshShow(/?)' % sickrage.app.config.web_root, RefreshShowHandler),
            (r'%s/home/updateShow(/?)' % sickrage.app.config.web_root, UpdateShowHandler),
            (r'%s/home/subtitleShow(/?)' % sickrage.app.config.web_root, SubtitleShowHandler),
            (r'%s/home/updateKODI(/?)' % sickrage.app.config.web_root, UpdateKODIHandler),
            (r'%s/home/updatePLEX(/?)' % sickrage.app.config.web_root, UpdatePLEXHandler),
            (r'%s/home/updateEMBY(/?)' % sickrage.app.config.web_root, UpdateEMBYHandler),
            (r'%s/home/syncTrakt(/?)' % sickrage.app.config.web_root, SyncTraktHandler),
            (r'%s/home/deleteEpisode(/?)' % sickrage.app.config.web_root, DeleteEpisodeHandler),
            (r'%s/home/testRename(/?)' % sickrage.app.config.web_root, TestRenameHandler),
            (r'%s/home/doRename(/?)' % sickrage.app.config.web_root, DoRenameHandler),
            (r'%s/home/searchEpisode(/?)' % sickrage.app.config.web_root, SearchEpisodeHandler),
            (r'%s/home/getManualSearchStatus(/?)' % sickrage.app.config.web_root, GetManualSearchStatusHandler),
            (r'%s/home/searchEpisodeSubtitles(/?)' % sickrage.app.config.web_root, SearchEpisodeSubtitlesHandler),
            (r'%s/home/setSceneNumbering(/?)' % sickrage.app.config.web_root, SetSceneNumberingHandler),
            (r'%s/home/retryEpisode(/?)' % sickrage.app.config.web_root, RetryEpisodeHandler),
            (r'%s/home/fetch_releasegroups(/?)' % sickrage.app.config.web_root, FetchReleasegroupsHandler),
            (r'%s/home/postprocess(/?)' % sickrage.app.config.web_root, HomePostProcessHandler),
            (r'%s/home/postprocess/processEpisode(/?)' % sickrage.app.config.web_root, HomeProcessEpisodeHandler),
            (r'%s/home/addShows(/?)' % sickrage.app.config.web_root, HomeAddShowsHandler),
            (r'%s/home/addShows/searchIndexersForShowName(/?)' % sickrage.app.config.web_root, SearchIndexersForShowNameHandler),
            (r'%s/home/addShows/massAddTable(/?)' % sickrage.app.config.web_root, MassAddTableHandler),
            (r'%s/home/addShows/newShow(/?)' % sickrage.app.config.web_root, NewShowHandler),
            (r'%s/home/addShows/traktShows(/?)' % sickrage.app.config.web_root, TraktShowsHandler),
            (r'%s/home/addShows/popularShows(/?)' % sickrage.app.config.web_root, PopularShowsHandler),
            (r'%s/home/addShows/addShowToBlacklist(/?)' % sickrage.app.config.web_root, AddShowToBlacklistHandler),
            (r'%s/home/addShows/existingShows(/?)' % sickrage.app.config.web_root, ExistingShowsHandler),
            (r'%s/home/addShows/addShowByID(/?)' % sickrage.app.config.web_root, AddShowByIDHandler),
            (r'%s/home/addShows/addNewShow(/?)' % sickrage.app.config.web_root, AddNewShowHandler),
            (r'%s/home/addShows/addExistingShows(/?)' % sickrage.app.config.web_root, AddExistingShowsHandler),
            (r'%s/manage(/?)' % sickrage.app.config.web_root, ManageHandler),
            (r'%s/manage/editShow(/?)' % sickrage.app.config.web_root, EditShowHandler),
            (r'%s/manage/showEpisodeStatuses(/?)' % sickrage.app.config.web_root, ShowEpisodeStatusesHandler),
            (r'%s/manage/episodeStatuses(/?)' % sickrage.app.config.web_root, EpisodeStatusesHandler),
            (r'%s/manage/changeEpisodeStatuses(/?)' % sickrage.app.config.web_root, ChangeEpisodeStatusesHandler),
            (r'%s/manage/setEpisodeStatus(/?)' % sickrage.app.config.web_root, SetEpisodeStatusHandler),
            (r'%s/manage/showSubtitleMissed(/?)' % sickrage.app.config.web_root, ShowSubtitleMissedHandler),
            (r'%s/manage/subtitleMissed(/?)' % sickrage.app.config.web_root, SubtitleMissedHandler),
            (r'%s/manage/downloadSubtitleMissed(/?)' % sickrage.app.config.web_root, DownloadSubtitleMissedHandler),
            (r'%s/manage/backlogShow(/?)' % sickrage.app.config.web_root, BacklogShowHandler),
            (r'%s/manage/backlogOverview(/?)' % sickrage.app.config.web_root, BacklogOverviewHandler),
            (r'%s/manage/massEdit(/?)' % sickrage.app.config.web_root, MassEditHandler),
            (r'%s/manage/massUpdate(/?)' % sickrage.app.config.web_root, MassUpdateHandler),
            (r'%s/manage/failedDownloads(/?)' % sickrage.app.config.web_root, FailedDownloadsHandler),
            (r'%s/manage/manageQueues(/?)' % sickrage.app.config.web_root, ManageQueuesHandler),
            (r'%s/manage/manageQueues/forceBacklogSearch(/?)' % sickrage.app.config.web_root, ForceBacklogSearchHandler),
            (r'%s/manage/manageQueues/forceDailySearch(/?)' % sickrage.app.config.web_root, ForceDailySearchHandler),
            (r'%s/manage/manageQueues/forceFindPropers(/?)' % sickrage.app.config.web_root, ForceFindPropersHandler),
            (r'%s/manage/manageQueues/pauseDailySearcher(/?)' % sickrage.app.config.web_root, PauseDailySearcherHandler),
            (r'%s/manage/manageQueues/pauseBacklogSearcher(/?)' % sickrage.app.config.web_root, PauseBacklogSearcherHandler),
            (r'%s/manage/manageQueues/pausePostProcessor(/?)' % sickrage.app.config.web_root, PausePostProcessorHandler),
            (r'%s/config(/?)' % sickrage.app.config.web_root, ConfigHandler),
            (r'%s/config/reset(/?)' % sickrage.app.config.web_root, ConfigResetHandler),
            (r'%s/config/anime(/?)' % sickrage.app.config.web_root, ConfigAnimeHandler),
            (r'%s/config/anime/saveAnime(/?)' % sickrage.app.config.web_root, ConfigSaveAnimeHandler),
            (r'%s/config/backuprestore(/?)' % sickrage.app.config.web_root, ConfigBackupRestoreHandler),
            (r'%s/config/backuprestore/backup(/?)' % sickrage.app.config.web_root, ConfigBackupHandler),
            (r'%s/config/backuprestore/restore(/?)' % sickrage.app.config.web_root, ConfigRestoreHandler),
            (r'%s/config/backuprestore/saveBackupRestore(/?)' % sickrage.app.config.web_root, SaveBackupRestoreHandler),
            (r'%s/config/general(/?)' % sickrage.app.config.web_root, ConfigGeneralHandler),
            (r'%s/config/general/generateApiKey(/?)' % sickrage.app.config.web_root, GenerateApiKeyHandler),
            (r'%s/config/general/saveRootDirs(/?)' % sickrage.app.config.web_root, SaveRootDirsHandler),
            (r'%s/config/general/saveAddShowDefaults(/?)' % sickrage.app.config.web_root, SaveAddShowDefaultsHandler),
            (r'%s/config/general/saveGeneral(/?)' % sickrage.app.config.web_root, SaveGeneralHandler),
            (r'%s/config/notifications(/?)' % sickrage.app.config.web_root, ConfigNotificationsHandler),
            (r'%s/config/notifications/saveNotifications(/?)' % sickrage.app.config.web_root, SaveNotificationsHandler),
            (r'%s/config/postProcessing(/?)' % sickrage.app.config.web_root, ConfigPostProcessingHandler),
            (r'%s/config/postProcessing/savePostProcessing(/?)' % sickrage.app.config.web_root, SavePostProcessingHandler),
            (r'%s/config/postProcessing/testNaming(/?)' % sickrage.app.config.web_root, TestNamingHandler),
            (r'%s/config/postProcessing/isNamingValid(/?)' % sickrage.app.config.web_root, IsNamingPatternValidHandler),
            (r'%s/config/postProcessing/isRarSupported(/?)' % sickrage.app.config.web_root, IsRarSupportedHandler),
            (r'%s/config/providers(/?)' % sickrage.app.config.web_root, ConfigProvidersHandler),
            (r'%s/config/providers/canAddNewznabProvider(/?)' % sickrage.app.config.web_root, CanAddNewznabProviderHandler),
            (r'%s/config/providers/canAddTorrentRssProvider(/?)' % sickrage.app.config.web_root, CanAddTorrentRssProviderHandler),
            (r'%s/config/providers/getNewznabCategories(/?)' % sickrage.app.config.web_root, GetNewznabCategoriesHandler),
            (r'%s/config/providers/saveProviders(/?)' % sickrage.app.config.web_root, SaveProvidersHandler),
            (r'%s/config/qualitySettings(/?)' % sickrage.app.config.web_root, ConfigQualitySettingsHandler),
            (r'%s/config/qualitySettings/saveQualities(/?)' % sickrage.app.config.web_root, SaveQualitiesHandler),
            (r'%s/config/search(/?)' % sickrage.app.config.web_root, ConfigSearchHandler),
            (r'%s/config/search/saveSearch(/?)' % sickrage.app.config.web_root, SaveSearchHandler),
            (r'%s/config/subtitles(/?)' % sickrage.app.config.web_root, ConfigSubtitlesHandler),
            (r'%s/config/subtitles/get_code(/?)' % sickrage.app.config.web_root, ConfigSubtitleGetCodeHandler),
            (r'%s/config/subtitles/wanted_languages(/?)' % sickrage.app.config.web_root, ConfigSubtitlesWantedLanguagesHandler),
            (r'%s/config/subtitles/saveSubtitles(/?)' % sickrage.app.config.web_root, SaveSubtitlesHandler),
        ])

        # HTTPS Cert/Key object
        ssl_ctx = None
        if sickrage.app.config.enable_https:
            ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
            ssl_ctx.load_cert_chain(sickrage.app.config.https_cert, sickrage.app.config.https_key)

        # Web Server
        self.server = HTTPServer(self.app, ssl_options=ssl_ctx, xheaders=sickrage.app.config.handle_reverse_proxy)

        try:
            self.server.listen(sickrage.app.config.web_port)
        except socket.error as e:
            sickrage.app.log.warning(e.strerror)
            raise SystemExit

        self.io_loop.start()
Example #6
0
    def run(self):
        self.started = True
        self.io_loop = IOLoop()

        # load languages
        tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR,
                                                 'messages')

        # Check configured web port is correct
        if sickrage.app.config.general.web_port < 21 or sickrage.app.config.general.web_port > 65535:
            sickrage.app.config.general.web_port = 8081

        # clear mako cache folder
        mako_cache = os.path.join(sickrage.app.cache_dir, 'mako')
        if os.path.isdir(mako_cache):
            shutil.rmtree(mako_cache, ignore_errors=True)

        # video root
        if sickrage.app.config.general.root_dirs:
            root_dirs = sickrage.app.config.general.root_dirs.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.app.config.general.web_root:
            sickrage.app.config.general.web_root = sickrage.app.config.general.web_root = (
                '/' +
                sickrage.app.config.general.web_root.lstrip('/').strip('/'))

        # api root
        self.api_v1_root = fr'{sickrage.app.config.general.web_root}/api/(?:v1/)?{sickrage.app.config.general.api_v1_key}'
        self.api_v2_root = fr'{sickrage.app.config.general.web_root}/api/v2'

        # tornado setup
        if sickrage.app.config.general.enable_https:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not create_https_certificates(
                    sickrage.app.config.general.https_cert,
                    sickrage.app.config.general.https_key):
                sickrage.app.log.info(
                    "Unable to create CERT/KEY files, disabling HTTPS")
                sickrage.app.config.general.enable_https = False

            if not (os.path.exists(sickrage.app.config.general.https_cert)
                    and os.path.exists(sickrage.app.config.general.https_key)):
                sickrage.app.log.warning(
                    "Disabled HTTPS because of missing CERT and KEY files")
                sickrage.app.config.general.enable_https = False

        # Load templates
        mako_lookup = TemplateLookup(directories=[sickrage.app.gui_views_dir],
                                     module_directory=os.path.join(
                                         sickrage.app.cache_dir, 'mako'),
                                     filesystem_checks=True,
                                     strict_undefined=True,
                                     input_encoding='utf-8',
                                     output_encoding='utf-8',
                                     encoding_errors='replace')

        templates = {}
        for root, dirs, files in os.walk(sickrage.app.gui_views_dir):
            path = root.split(os.sep)

            for x in sickrage.app.gui_views_dir.split(os.sep):
                if x in path:
                    del path[path.index(x)]

            for file in files:
                filename = '{}/{}'.format('/'.join(path), file).lstrip('/')
                templates[filename] = mako_lookup.get_template(filename)

        # Websocket handler
        self.handlers['websocket_handlers'] = [
            (fr'{sickrage.app.config.general.web_root}/ws/ui',
             WebSocketUIHandler)
        ]

        # API v1 Handlers
        self.handlers['api_v1_handlers'] = [
            # api
            (fr'{self.api_v1_root}(/?.*)', ApiHandler),

            # api builder
            (fr'{sickrage.app.config.general.web_root}/api/builder',
             RedirectHandler, {
                 "url": sickrage.app.config.general.web_root + '/apibuilder/'
             }),
        ]

        # API v2 Handlers
        self.handlers['api_v2_handlers'] = [
            (fr'{self.api_v2_root}/ping', ApiPingHandler),
            (fr'{self.api_v2_root}/swagger.json', ApiSwaggerDotJsonHandler, {
                'api_handlers': 'api_v2_handlers',
                'api_version': '2.0.0'
            }),
            (fr'{self.api_v2_root}/config', ApiV2ConfigHandler),
            (fr'{self.api_v2_root}/file-browser', ApiV2FileBrowserHandler),
            (fr'{self.api_v2_root}/postprocess', Apiv2PostProcessHandler),
            (fr'{self.api_v2_root}/retrieve-series-metadata',
             ApiV2RetrieveSeriesMetadataHandler),
            (fr'{self.api_v2_root}/schedule', ApiV2ScheduleHandler),
            (fr'{self.api_v2_root}/series-providers',
             ApiV2SeriesProvidersHandler),
            (fr'{self.api_v2_root}/series-providers/([a-z]+)/search',
             ApiV2SeriesProvidersSearchHandler),
            (fr'{self.api_v2_root}/series-providers/([a-z]+)/languages',
             ApiV2SeriesProvidersLanguagesHandler),
            (fr'{self.api_v2_root}/series', ApiV2SeriesHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)', ApiV2SeriesHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/episodes',
             ApiV2SeriesEpisodesHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/images',
             ApiV2SeriesImagesHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/imdb-info',
             ApiV2SeriesImdbInfoHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/blacklist',
             ApiV2SeriesBlacklistHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/whitelist',
             ApiV2SeriesWhitelistHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/refresh',
             ApiV2SeriesRefreshHandler),
            (fr'{self.api_v2_root}/series/(\d+[-][a-z]+)/update',
             ApiV2SeriesUpdateHandler),
            (fr'{self.api_v2_root}/episodes/rename',
             ApiV2EpisodesRenameHandler),
            (fr'{self.api_v2_root}/episodes/(\d+[-][a-z]+)/search',
             ApiV2EpisodesManualSearchHandler),
        ]

        # New UI Static File Handlers
        self.handlers['new_ui_static_file_handlers'] = [
            # media
            (fr'{sickrage.app.config.general.web_root}/app/static/media/(.*)',
             StaticImageHandler, {
                 "path": os.path.join(sickrage.app.gui_app_dir, 'static',
                                      'media')
             }),

            # css
            (fr'{sickrage.app.config.general.web_root}/app/static/css/(.*)',
             StaticNoCacheFileHandler, {
                 "path": os.path.join(sickrage.app.gui_app_dir, 'static',
                                      'css')
             }),

            # js
            (fr'{sickrage.app.config.general.web_root}/app/static/js/(.*)',
             StaticNoCacheFileHandler, {
                 "path": os.path.join(sickrage.app.gui_app_dir, 'static', 'js')
             }),

            # base
            (fr"{sickrage.app.config.general.web_root}/app/(.*)",
             tornado.web.StaticFileHandler, {
                 "path": sickrage.app.gui_app_dir,
                 "default_filename": "index.html"
             })
        ]

        # Static File Handlers
        self.handlers['static_file_handlers'] = [
            # redirect to home
            (fr"({sickrage.app.config.general.web_root})(/?)", RedirectHandler,
             {
                 "url": f"{sickrage.app.config.general.web_root}/home"
             }),

            # login
            (fr'{sickrage.app.config.general.web_root}/login(/?)', LoginHandler
             ),

            # logout
            (fr'{sickrage.app.config.general.web_root}/logout(/?)',
             LogoutHandler),

            # favicon
            (fr'{sickrage.app.config.general.web_root}/(favicon\.ico)',
             StaticNoCacheFileHandler, {
                 "path":
                 os.path.join(sickrage.app.gui_static_dir,
                              'images/favicon.ico')
             }),

            # images
            (fr'{sickrage.app.config.general.web_root}/images/(.*)',
             StaticImageHandler, {
                 "path": os.path.join(sickrage.app.gui_static_dir, 'images')
             }),

            # css
            (fr'{sickrage.app.config.general.web_root}/css/(.*)',
             StaticNoCacheFileHandler, {
                 "path": os.path.join(sickrage.app.gui_static_dir, 'css')
             }),

            # scss
            (fr'{sickrage.app.config.general.web_root}/scss/(.*)',
             StaticNoCacheFileHandler, {
                 "path": os.path.join(sickrage.app.gui_static_dir, 'scss')
             }),

            # fonts
            (fr'{sickrage.app.config.general.web_root}/fonts/(.*)',
             StaticNoCacheFileHandler, {
                 "path": os.path.join(sickrage.app.gui_static_dir, 'fonts')
             }),

            # javascript
            (fr'{sickrage.app.config.general.web_root}/js/(.*)',
             StaticNoCacheFileHandler, {
                 "path": os.path.join(sickrage.app.gui_static_dir, 'js')
             }),

            # videos
            (fr'{sickrage.app.config.general.web_root}/videos/(.*)',
             StaticNoCacheFileHandler, {
                 "path": self.video_root
             }),
        ]

        # Handlers
        self.handlers['web_handlers'] = [
            (fr'{sickrage.app.config.general.web_root}/robots.txt',
             RobotsDotTxtHandler),
            (fr'{sickrage.app.config.general.web_root}/messages.po',
             MessagesDotPoHandler),
            (fr'{sickrage.app.config.general.web_root}/quicksearch.json',
             QuicksearchDotJsonHandler),
            (fr'{sickrage.app.config.general.web_root}/apibuilder(/?)',
             APIBulderHandler),
            (fr'{sickrage.app.config.general.web_root}/setHomeLayout(/?)',
             SetHomeLayoutHandler),
            (fr'{sickrage.app.config.general.web_root}/setPosterSortBy(/?)',
             SetPosterSortByHandler),
            (fr'{sickrage.app.config.general.web_root}/setPosterSortDir(/?)',
             SetPosterSortDirHandler),
            (fr'{sickrage.app.config.general.web_root}/setHistoryLayout(/?)',
             SetHistoryLayoutHandler),
            (fr'{sickrage.app.config.general.web_root}/toggleDisplayShowSpecials(/?)',
             ToggleDisplayShowSpecialsHandler),
            (fr'{sickrage.app.config.general.web_root}/toggleScheduleDisplayPaused(/?)',
             ToggleScheduleDisplayPausedHandler),
            (fr'{sickrage.app.config.general.web_root}/setScheduleSort(/?)',
             SetScheduleSortHandler),
            (fr'{sickrage.app.config.general.web_root}/forceSchedulerJob(/?)',
             ForceSchedulerJobHandler),
            (fr'{sickrage.app.config.general.web_root}/announcements(/?)',
             AnnouncementsHandler),
            (fr'{sickrage.app.config.general.web_root}/announcements/announcementCount(/?)',
             AnnouncementCountHandler),
            (fr'{sickrage.app.config.general.web_root}/announcements/mark-seen(/?)',
             MarkAnnouncementSeenHandler),
            (fr'{sickrage.app.config.general.web_root}/schedule(/?)',
             ScheduleHandler),
            (fr'{sickrage.app.config.general.web_root}/setScheduleLayout(/?)',
             SetScheduleLayoutHandler),
            (fr'{sickrage.app.config.general.web_root}/calendar(/?)',
             CalendarHandler),
            (fr'{sickrage.app.config.general.web_root}/changelog(/?)',
             ChangelogHandler),
            (fr'{sickrage.app.config.general.web_root}/account/link(/?)',
             AccountLinkHandler),
            (fr'{sickrage.app.config.general.web_root}/account/unlink(/?)',
             AccountUnlinkHandler),
            (fr'{sickrage.app.config.general.web_root}/account/is-linked(/?)',
             AccountIsLinkedHandler),
            (fr'{sickrage.app.config.general.web_root}/history(/?)',
             HistoryHandler),
            (fr'{sickrage.app.config.general.web_root}/history/clear(/?)',
             HistoryClearHandler),
            (fr'{sickrage.app.config.general.web_root}/history/trim(/?)',
             HistoryTrimHandler),
            (fr'{sickrage.app.config.general.web_root}/logs(/?)', LogsHandler),
            (fr'{sickrage.app.config.general.web_root}/logs/errorCount(/?)',
             ErrorCountHandler),
            (fr'{sickrage.app.config.general.web_root}/logs/warningCount(/?)',
             WarningCountHandler),
            (fr'{sickrage.app.config.general.web_root}/logs/view(/?)',
             LogsViewHandler),
            (fr'{sickrage.app.config.general.web_root}/logs/clearAll(/?)',
             LogsClearAllHanlder),
            (fr'{sickrage.app.config.general.web_root}/logs/clearWarnings(/?)',
             LogsClearWarningsHanlder),
            (fr'{sickrage.app.config.general.web_root}/logs/clearErrors(/?)',
             LogsClearErrorsHanlder),
            (fr'{sickrage.app.config.general.web_root}/browser(/?)',
             WebFileBrowserHandler),
            (fr'{sickrage.app.config.general.web_root}/browser/complete(/?)',
             WebFileBrowserCompleteHandler),
            (fr'{sickrage.app.config.general.web_root}/home(/?)', HomeHandler),
            (fr'{sickrage.app.config.general.web_root}/home/showProgress(/?)',
             ShowProgressHandler),
            (fr'{sickrage.app.config.general.web_root}/home/is-alive(/?)',
             IsAliveHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testSABnzbd(/?)',
             TestSABnzbdHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testSynologyDSM(/?)',
             TestSynologyDSMHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testTorrent(/?)',
             TestTorrentHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testFreeMobile(/?)',
             TestFreeMobileHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testTelegram(/?)',
             TestTelegramHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testJoin(/?)',
             TestJoinHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testGrowl(/?)',
             TestGrowlHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testProwl(/?)',
             TestProwlHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testBoxcar2(/?)',
             TestBoxcar2Handler),
            (fr'{sickrage.app.config.general.web_root}/home/testPushover(/?)',
             TestPushoverHandler),
            (fr'{sickrage.app.config.general.web_root}/home/twitterStep1(/?)',
             TwitterStep1Handler),
            (fr'{sickrage.app.config.general.web_root}/home/twitterStep2(/?)',
             TwitterStep2Handler),
            (fr'{sickrage.app.config.general.web_root}/home/testTwitter(/?)',
             TestTwitterHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testTwilio(/?)',
             TestTwilioHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testSlack(/?)',
             TestSlackHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testAlexa(/?)',
             TestAlexaHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testDiscord(/?)',
             TestDiscordHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testKODI(/?)',
             TestKODIHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testPMC(/?)',
             TestPMCHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testPMS(/?)',
             TestPMSHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testLibnotify(/?)',
             TestLibnotifyHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testEMBY(/?)',
             TestEMBYHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testNMJ(/?)',
             TestNMJHandler),
            (fr'{sickrage.app.config.general.web_root}/home/settingsNMJ(/?)',
             SettingsNMJHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testNMJv2(/?)',
             TestNMJv2Handler),
            (fr'{sickrage.app.config.general.web_root}/home/settingsNMJv2(/?)',
             SettingsNMJv2Handler),
            (fr'{sickrage.app.config.general.web_root}/home/getTraktToken(/?)',
             GetTraktTokenHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testTrakt(/?)',
             TestTraktHandler),
            (fr'{sickrage.app.config.general.web_root}/home/loadShowNotifyLists(/?)',
             LoadShowNotifyListsHandler),
            (fr'{sickrage.app.config.general.web_root}/home/saveShowNotifyList(/?)',
             SaveShowNotifyListHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testEmail(/?)',
             TestEmailHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testNMA(/?)',
             TestNMAHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testPushalot(/?)',
             TestPushalotHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testPushbullet(/?)',
             TestPushbulletHandler),
            (fr'{sickrage.app.config.general.web_root}/home/getPushbulletDevices(/?)',
             GetPushbulletDevicesHandler),
            (fr'{sickrage.app.config.general.web_root}/home/serverStatus(/?)',
             ServerStatusHandler),
            (fr'{sickrage.app.config.general.web_root}/home/providerStatus(/?)',
             ProviderStatusHandler),
            (fr'{sickrage.app.config.general.web_root}/home/shutdown(/?)',
             ShutdownHandler),
            (fr'{sickrage.app.config.general.web_root}/home/restart(/?)',
             RestartHandler),
            (fr'{sickrage.app.config.general.web_root}/home/updateCheck(/?)',
             UpdateCheckHandler),
            (fr'{sickrage.app.config.general.web_root}/home/update(/?)',
             UpdateHandler),
            (fr'{sickrage.app.config.general.web_root}/home/verifyPath(/?)',
             VerifyPathHandler),
            (fr'{sickrage.app.config.general.web_root}/home/installRequirements(/?)',
             InstallRequirementsHandler),
            (fr'{sickrage.app.config.general.web_root}/home/branchCheckout(/?)',
             BranchCheckoutHandler),
            (fr'{sickrage.app.config.general.web_root}/home/displayShow(/?)',
             DisplayShowHandler),
            (fr'{sickrage.app.config.general.web_root}/home/togglePause(/?)',
             TogglePauseHandler),
            (fr'{sickrage.app.config.general.web_root}/home/deleteShow',
             DeleteShowHandler),
            (fr'{sickrage.app.config.general.web_root}/home/refreshShow(/?)',
             RefreshShowHandler),
            (fr'{sickrage.app.config.general.web_root}/home/updateShow(/?)',
             UpdateShowHandler),
            (fr'{sickrage.app.config.general.web_root}/home/subtitleShow(/?)',
             SubtitleShowHandler),
            (fr'{sickrage.app.config.general.web_root}/home/updateKODI(/?)',
             UpdateKODIHandler),
            (fr'{sickrage.app.config.general.web_root}/home/updatePLEX(/?)',
             UpdatePLEXHandler),
            (fr'{sickrage.app.config.general.web_root}/home/updateEMBY(/?)',
             UpdateEMBYHandler),
            (fr'{sickrage.app.config.general.web_root}/home/syncTrakt(/?)',
             SyncTraktHandler),
            (fr'{sickrage.app.config.general.web_root}/home/deleteEpisode(/?)',
             DeleteEpisodeHandler),
            (fr'{sickrage.app.config.general.web_root}/home/testRename(/?)',
             TestRenameHandler),
            (fr'{sickrage.app.config.general.web_root}/home/doRename(/?)',
             DoRenameHandler),
            (fr'{sickrage.app.config.general.web_root}/home/searchEpisode(/?)',
             SearchEpisodeHandler),
            (fr'{sickrage.app.config.general.web_root}/home/getManualSearchStatus(/?)',
             GetManualSearchStatusHandler),
            (fr'{sickrage.app.config.general.web_root}/home/searchEpisodeSubtitles(/?)',
             SearchEpisodeSubtitlesHandler),
            (fr'{sickrage.app.config.general.web_root}/home/setSceneNumbering(/?)',
             SetSceneNumberingHandler),
            (fr'{sickrage.app.config.general.web_root}/home/retryEpisode(/?)',
             RetryEpisodeHandler),
            (fr'{sickrage.app.config.general.web_root}/home/fetch_releasegroups(/?)',
             FetchReleasegroupsHandler),
            (fr'{sickrage.app.config.general.web_root}/home/postprocess(/?)',
             HomePostProcessHandler),
            (fr'{sickrage.app.config.general.web_root}/home/postprocess/processEpisode(/?)',
             HomeProcessEpisodeHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows(/?)',
             HomeAddShowsHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/searchSeriesProviderForShowName(/?)',
             SearchSeriesProviderForShowNameHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/massAddTable(/?)',
             MassAddTableHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/newShow(/?)',
             NewShowHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/traktShows(/?)',
             TraktShowsHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/popularShows(/?)',
             PopularShowsHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/addShowToBlacklist(/?)',
             AddShowToBlacklistHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/existingShows(/?)',
             ExistingShowsHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/addShowByID(/?)',
             AddShowByIDHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/addNewShow(/?)',
             AddNewShowHandler),
            (fr'{sickrage.app.config.general.web_root}/home/addShows/addExistingShows(/?)',
             AddExistingShowsHandler),
            (fr'{sickrage.app.config.general.web_root}/manage(/?)',
             ManageHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/editShow(/?)',
             EditShowHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/showEpisodeStatuses(/?)',
             ShowEpisodeStatusesHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/episodeStatuses(/?)',
             EpisodeStatusesHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/changeEpisodeStatuses(/?)',
             ChangeEpisodeStatusesHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/setEpisodeStatus(/?)',
             SetEpisodeStatusHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/showSubtitleMissed(/?)',
             ShowSubtitleMissedHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/subtitleMissed(/?)',
             SubtitleMissedHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/downloadSubtitleMissed(/?)',
             DownloadSubtitleMissedHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/backlogShow(/?)',
             BacklogShowHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/backlogOverview(/?)',
             BacklogOverviewHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/massEdit(/?)',
             MassEditHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/massUpdate(/?)',
             MassUpdateHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/failedDownloads(/?)',
             FailedDownloadsHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/manageQueues(/?)',
             ManageQueuesHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/forceBacklogSearch(/?)',
             ForceBacklogSearchHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/forceDailySearch(/?)',
             ForceDailySearchHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/forceFindPropers(/?)',
             ForceFindPropersHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/pauseDailySearcher(/?)',
             PauseDailySearcherHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/pauseBacklogSearcher(/?)',
             PauseBacklogSearcherHandler),
            (fr'{sickrage.app.config.general.web_root}/manage/manageQueues/pausePostProcessor(/?)',
             PausePostProcessorHandler),
            (fr'{sickrage.app.config.general.web_root}/config(/?)',
             ConfigWebHandler),
            (fr'{sickrage.app.config.general.web_root}/config/reset(/?)',
             ConfigResetHandler),
            (fr'{sickrage.app.config.general.web_root}/config/anime(/?)',
             ConfigAnimeHandler),
            (fr'{sickrage.app.config.general.web_root}/config/anime/saveAnime(/?)',
             ConfigSaveAnimeHandler),
            (fr'{sickrage.app.config.general.web_root}/config/backuprestore(/?)',
             ConfigBackupRestoreHandler),
            (fr'{sickrage.app.config.general.web_root}/config/backuprestore/backup(/?)',
             ConfigBackupHandler),
            (fr'{sickrage.app.config.general.web_root}/config/backuprestore/restore(/?)',
             ConfigRestoreHandler),
            (fr'{sickrage.app.config.general.web_root}/config/backuprestore/saveBackupRestore(/?)',
             SaveBackupRestoreHandler),
            (fr'{sickrage.app.config.general.web_root}/config/general(/?)',
             ConfigGeneralHandler),
            (fr'{sickrage.app.config.general.web_root}/config/general/generateApiKey(/?)',
             GenerateApiKeyHandler),
            (fr'{sickrage.app.config.general.web_root}/config/general/saveRootDirs(/?)',
             SaveRootDirsHandler),
            (fr'{sickrage.app.config.general.web_root}/config/general/saveAddShowDefaults(/?)',
             SaveAddShowDefaultsHandler),
            (fr'{sickrage.app.config.general.web_root}/config/general/saveGeneral(/?)',
             SaveGeneralHandler),
            (fr'{sickrage.app.config.general.web_root}/config/notifications(/?)',
             ConfigNotificationsHandler),
            (fr'{sickrage.app.config.general.web_root}/config/notifications/saveNotifications(/?)',
             SaveNotificationsHandler),
            (fr'{sickrage.app.config.general.web_root}/config/postProcessing(/?)',
             ConfigPostProcessingHandler),
            (fr'{sickrage.app.config.general.web_root}/config/postProcessing/savePostProcessing(/?)',
             SavePostProcessingHandler),
            (fr'{sickrage.app.config.general.web_root}/config/postProcessing/testNaming(/?)',
             TestNamingHandler),
            (fr'{sickrage.app.config.general.web_root}/config/postProcessing/isNamingValid(/?)',
             IsNamingPatternValidHandler),
            (fr'{sickrage.app.config.general.web_root}/config/postProcessing/isRarSupported(/?)',
             IsRarSupportedHandler),
            (fr'{sickrage.app.config.general.web_root}/config/providers(/?)',
             ConfigProvidersHandler),
            (fr'{sickrage.app.config.general.web_root}/config/providers/canAddNewznabProvider(/?)',
             CanAddNewznabProviderHandler),
            (fr'{sickrage.app.config.general.web_root}/config/providers/canAddTorrentRssProvider(/?)',
             CanAddTorrentRssProviderHandler),
            (fr'{sickrage.app.config.general.web_root}/config/providers/getNewznabCategories(/?)',
             GetNewznabCategoriesHandler),
            (fr'{sickrage.app.config.general.web_root}/config/providers/saveProviders(/?)',
             SaveProvidersHandler),
            (fr'{sickrage.app.config.general.web_root}/config/qualitySettings(/?)',
             ConfigQualitySettingsHandler),
            (fr'{sickrage.app.config.general.web_root}/config/qualitySettings/saveQualities(/?)',
             SaveQualitiesHandler),
            (fr'{sickrage.app.config.general.web_root}/config/search(/?)',
             ConfigSearchHandler),
            (fr'{sickrage.app.config.general.web_root}/config/search/saveSearch(/?)',
             SaveSearchHandler),
            (fr'{sickrage.app.config.general.web_root}/config/subtitles(/?)',
             ConfigSubtitlesHandler),
            (fr'{sickrage.app.config.general.web_root}/config/subtitles/get_code(/?)',
             ConfigSubtitleGetCodeHandler),
            (fr'{sickrage.app.config.general.web_root}/config/subtitles/wanted_languages(/?)',
             ConfigSubtitlesWantedLanguagesHandler),
            (fr'{sickrage.app.config.general.web_root}/config/subtitles/saveSubtitles(/?)',
             SaveSubtitlesHandler),
        ]

        # Initialize Tornado application
        self.app = Application(
            handlers=sum(self.handlers.values(), []),
            debug=True,
            autoreload=False,
            gzip=sickrage.app.config.general.web_use_gzip,
            cookie_secret=sickrage.app.config.general.web_cookie_secret,
            login_url='%s/login/' % sickrage.app.config.general.web_root,
            templates=templates,
            default_handler_class=NotFoundHandler)

        # HTTPS Cert/Key object
        ssl_ctx = None
        if sickrage.app.config.general.enable_https:
            ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
            ssl_ctx.load_cert_chain(sickrage.app.config.general.https_cert,
                                    sickrage.app.config.general.https_key)

        # Web Server
        self.server = HTTPServer(
            self.app,
            ssl_options=ssl_ctx,
            xheaders=sickrage.app.config.general.handle_reverse_proxy)

        try:
            self.server.listen(sickrage.app.config.general.web_port,
                               sickrage.app.web_host)
        except socket.error as e:
            sickrage.app.log.warning(e.strerror)
            raise SystemExit

        # launch browser window
        if not sickrage.app.no_launch and sickrage.app.config.general.launch_browser:
            sickrage.app.scheduler.add_job(
                launch_browser,
                args=[('http',
                       'https')[sickrage.app.config.general.enable_https],
                      (get_internal_ip(),
                       sickrage.app.web_host)[sickrage.app.web_host != ''],
                      sickrage.app.config.general.web_port])

        sickrage.app.log.info("SiCKRAGE :: STARTED")
        sickrage.app.log.info(
            f"SiCKRAGE :: APP VERSION:[{sickrage.version()}]")
        sickrage.app.log.info(
            f"SiCKRAGE :: CONFIG VERSION:[v{sickrage.app.config.db.version}]")
        sickrage.app.log.info(
            f"SiCKRAGE :: DATABASE VERSION:[v{sickrage.app.main_db.version}]")
        sickrage.app.log.info(
            f"SiCKRAGE :: DATABASE TYPE:[{sickrage.app.db_type}]")

        sickrage.app.log.info(
            f"SiCKRAGE :: URL:[{('http', 'https')[sickrage.app.config.general.enable_https]}://{(get_internal_ip(), sickrage.app.web_host)[sickrage.app.web_host != '']}:{sickrage.app.config.general.web_port}/{sickrage.app.config.general.web_root}]"
        )

        self.io_loop.start()
Example #7
0
    def __init__(self, **kwargs):
        self.running = True
        self.restart = False
        self.io_loop = IOLoop.instance()

        self.options = {}
        self.options.setdefault('port', 8081)
        self.options.setdefault('host', '0.0.0.0')
        self.options.setdefault('log_dir', None)
        self.options.setdefault('username', '')
        self.options.setdefault('password', '')
        self.options.setdefault('web_root', '/')
        self.options.setdefault('stop_timeout', 3)
        self.options.update(kwargs)

        # video root
        if sickrage.ROOT_DIRS:
            root_dirs = sickrage.ROOT_DIRS.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]
        else:
            self.video_root = None

        # web root
        if self.options[b'web_root']:
            sickrage.WEB_ROOT = self.options[b'web_root'] = ('/' + self.options[b'web_root'].lstrip('/').strip('/'))

        # api root
        if not sickrage.API_KEY:
            sickrage.API_KEY = generateApiKey()
        self.options[b'api_root'] = r'%s/api/%s' % (sickrage.WEB_ROOT, sickrage.API_KEY)

        # tornado setup
        self.enable_https = self.options[b'enable_https']
        self.https_cert = self.options[b'https_cert']
        self.https_key = self.options[b'https_key']

        if self.enable_https:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (self.https_cert and os.path.exists(self.https_cert)) or not (
                        self.https_key and os.path.exists(self.https_key)):
                if not create_https_certificates(self.https_cert, self.https_key):
                    sickrage.LOGGER.info("Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.ENABLE_HTTPS = False
                    self.enable_https = False

            if not (os.path.exists(self.https_cert) and os.path.exists(self.https_key)):
                sickrage.LOGGER.warning("Disabled HTTPS because of missing CERT and KEY files")
                sickrage.ENABLE_HTTPS = False
                self.enable_https = False

        # Load the app
        self.app = Application([],
                               debug=sickrage.DEBUG,
                               autoreload=False,
                               gzip=sickrage.WEB_USE_GZIP,
                               xheaders=sickrage.HANDLE_REVERSE_PROXY,
                               cookie_secret=sickrage.WEB_COOKIE_SECRET,
                               login_url='%s/login/' % self.options[b'web_root'],
                               )

        # Main Handlers
        self.app.add_handlers('.*$', [
            # webapi handler
            (r'%s(/?.*)' % self.options[b'api_root'], ApiHandler),

            # webapi key retrieval
            (r'%s/getkey(/?.*)' % self.options[b'web_root'], KeyHandler),

            # webapi builder redirect
            (r'%s/api/builder' % self.options[b'web_root'], RedirectHandler,
             {"url": self.options[b'web_root'] + '/apibuilder/'}),

            # webui login/logout handlers
            (r'%s/login(/?)' % self.options[b'web_root'], LoginHandler),
            (r'%s/logout(/?)' % self.options[b'web_root'], LogoutHandler),

            # webui handlers
        ] + route.get_routes(self.options[b'web_root']))

        # Web calendar handler (Needed because option Unprotected calendar)
        self.app.add_handlers('.*$', [
            (r'%s/calendar' % self.options[b'web_root'], CalendarHandler),
        ])

        # Static File Handlers
        self.app.add_handlers(".*$", [
            # favicon
            (r'%s/(favicon\.ico)' % self.options[b'web_root'], StaticFileHandler,
             {"path": os.path.join(self.options[b'gui_root'], 'images/ico/favicon.ico')}),

            # images
            (r'%s.*?/images/(.*)' % self.options[b'web_root'], StaticImageHandler,
             {"path": os.path.join(self.options[b'gui_root'], 'images')}),

            # css
            (r'%s/css/(.*)' % self.options[b'web_root'], StaticFileHandler,
             {"path": os.path.join(self.options[b'gui_root'], 'css')}),

            # javascript
            (r'%s/js/(.*)' % self.options[b'web_root'], StaticFileHandler,
             {"path": os.path.join(self.options[b'gui_root'], 'js')}),

            # videos
        ] + [(r'%s/videos/(.*)' % self.options[b'web_root'], StaticFileHandler,
              {"path": self.video_root})])

        # daemonize sickrage
        if sickrage.DAEMONIZE:
            import daemon
            ctx = daemon.DaemonContext()
            ctx.initgroups = False
            ctx.open()

        # write sickrage pidfile
        sickrage.PID = os.getpid()
        if sickrage.CREATEPID:
            with file(sickrage.PIDFILE, 'w+') as pf:
                pf.write(str(sickrage.PID))

        self.io_loop.add_callback(sickrage.Scheduler.start)
Example #8
0
    def start(self):
        self.started = True

        # load languages
        tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages')

        # clear mako cache folder
        mako_cache = os.path.join(sickrage.app.cache_dir, 'mako')
        if os.path.isdir(mako_cache):
            shutil.rmtree(mako_cache)

        # video root
        if sickrage.app.config.root_dirs:
            root_dirs = sickrage.app.config.root_dirs.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.app.config.web_root:
            sickrage.app.config.web_root = sickrage.app.config.web_root = (
                    '/' + sickrage.app.config.web_root.lstrip('/').strip('/'))

        # api root
        self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root, sickrage.app.config.api_key)

        # tornado setup
        if sickrage.app.config.enable_https:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (
                    sickrage.app.config.https_cert and os.path.exists(
                sickrage.app.config.https_cert)) or not (
                    sickrage.app.config.https_key and os.path.exists(sickrage.app.config.https_key)):
                if not create_https_certificates(sickrage.app.config.https_cert,
                                                 sickrage.app.config.https_key):
                    sickrage.app.log.info("Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.app.config.enable_https = False

            if not (os.path.exists(sickrage.app.config.https_cert) and os.path.exists(
                    sickrage.app.config.https_key)):
                sickrage.app.log.warning("Disabled HTTPS because of missing CERT and KEY files")
                sickrage.app.config.enable_https = False

        # Load the app
        self.app = Application(
            debug=True,
            autoreload=False,
            gzip=sickrage.app.config.web_use_gzip,
            cookie_secret=sickrage.app.config.web_cookie_secret,
            login_url='%s/login/' % sickrage.app.config.web_root)

        # Websocket handler
        self.app.add_handlers(".*$", [
            (r'%s/ws/ui' % sickrage.app.config.web_root, WebSocketUIHandler)
        ])

        # Static File Handlers
        self.app.add_handlers('.*$', [
            # api
            (r'%s/api/(\w{32})(/?.*)' % sickrage.app.config.web_root, ApiHandler),

            # redirect to home
            (r"(%s)" % sickrage.app.config.web_root, RedirectHandler,
             {"url": "%s/home" % sickrage.app.config.web_root}),

            # api builder
            (r'%s/api/builder' % sickrage.app.config.web_root, RedirectHandler,
             {"url": sickrage.app.config.web_root + '/apibuilder/'}),

            # login
            (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler),

            # logout
            (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler),

            # calendar
            (r'%s/calendar' % sickrage.app.config.web_root, CalendarHandler),

            # favicon
            (r'%s/(favicon\.ico)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images/favicon.ico')}),

            # images
            (r'%s/images/(.*)' % sickrage.app.config.web_root, StaticImageHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images')}),

            # css
            (r'%s/css/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'css')}),

            # scss
            (r'%s/scss/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'scss')}),

            # fonts
            (r'%s/fonts/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'fonts')}),

            # javascript
            (r'%s/js/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": os.path.join(sickrage.app.config.gui_static_dir, 'js')}),

            # videos
            (r'%s/videos/(.*)' % sickrage.app.config.web_root, StaticNoCacheFileHandler,
             {"path": self.video_root}),
        ])

        # Web Handlers
        self.app.add_handlers('.*$', Route.get_routes(sickrage.app.config.web_root))

        # HTTPS Cert/Key object
        ssl_ctx = None
        if sickrage.app.config.enable_https:
            ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
            ssl_ctx.load_cert_chain(sickrage.app.config.https_cert, sickrage.app.config.https_key)

        # Web Server
        self.server = HTTPServer(self.app, ssl_options=ssl_ctx, xheaders=sickrage.app.config.handle_reverse_proxy)

        try:
            self.server.listen(sickrage.app.config.web_port)

            sickrage.app.log.info(
                "SiCKRAGE :: STARTED")
            sickrage.app.log.info(
                "SiCKRAGE :: VERSION:[{}]".format(sickrage.version()))
            sickrage.app.log.info(
                "SiCKRAGE :: CONFIG:[{}] [v{}]".format(sickrage.app.config_file, sickrage.app.config.config_version))
            sickrage.app.log.info(
                "SiCKRAGE :: DATABASE:[v{}]".format(sickrage.app.main_db.version))
            sickrage.app.log.info(
                "SiCKRAGE :: URL:[{}://{}:{}{}]".format(('http', 'https')[sickrage.app.config.enable_https],
                                                        sickrage.app.config.web_host, sickrage.app.config.web_port,
                                                        sickrage.app.config.web_root))
        except socket.error as e:
            sickrage.app.log.warning(e.strerror)
            raise SystemExit
Example #9
0
    def __init__(self, **kwargs):
        self.running = True
        self.restart = False
        self.io_loop = IOLoop.instance()

        self.options = {}
        self.options.setdefault('port', 8081)
        self.options.setdefault('host', '0.0.0.0')
        self.options.setdefault('log_dir', None)
        self.options.setdefault('username', '')
        self.options.setdefault('password', '')
        self.options.setdefault('web_root', '/')
        self.options.setdefault('stop_timeout', 3)
        self.options.update(kwargs)

        # video root
        if sickrage.ROOT_DIRS:
            root_dirs = sickrage.ROOT_DIRS.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]
        else:
            self.video_root = None

        # web root
        if self.options[b'web_root']:
            sickrage.WEB_ROOT = self.options[b'web_root'] = (
                '/' + self.options[b'web_root'].lstrip('/').strip('/'))

        # api root
        if not sickrage.API_KEY:
            sickrage.API_KEY = generateApiKey()
        self.options[b'api_root'] = r'%s/api/%s' % (sickrage.WEB_ROOT,
                                                    sickrage.API_KEY)

        # tornado setup
        self.enable_https = self.options[b'enable_https']
        self.https_cert = self.options[b'https_cert']
        self.https_key = self.options[b'https_key']

        if self.enable_https:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (self.https_cert
                    and os.path.exists(self.https_cert)) or not (
                        self.https_key and os.path.exists(self.https_key)):
                if not create_https_certificates(self.https_cert,
                                                 self.https_key):
                    sickrage.LOGGER.info(
                        "Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.ENABLE_HTTPS = False
                    self.enable_https = False

            if not (os.path.exists(self.https_cert)
                    and os.path.exists(self.https_key)):
                sickrage.LOGGER.warning(
                    "Disabled HTTPS because of missing CERT and KEY files")
                sickrage.ENABLE_HTTPS = False
                self.enable_https = False

        # Load the app
        self.app = Application(
            [],
            debug=sickrage.DEBUG,
            autoreload=False,
            gzip=sickrage.WEB_USE_GZIP,
            xheaders=sickrage.HANDLE_REVERSE_PROXY,
            cookie_secret=sickrage.WEB_COOKIE_SECRET,
            login_url='%s/login/' % self.options[b'web_root'],
        )

        # Main Handlers
        self.app.add_handlers(
            '.*$',
            [
                # webapi handler
                (r'%s(/?.*)' % self.options[b'api_root'], ApiHandler),

                # webapi key retrieval
                (r'%s/getkey(/?.*)' % self.options[b'web_root'], KeyHandler),

                # webapi builder redirect
                (r'%s/api/builder' % self.options[b'web_root'],
                 RedirectHandler, {
                     "url": self.options[b'web_root'] + '/apibuilder/'
                 }),

                # webui login/logout handlers
                (r'%s/login(/?)' % self.options[b'web_root'], LoginHandler),
                (r'%s/logout(/?)' % self.options[b'web_root'], LogoutHandler),

                # webui handlers
            ] + route.get_routes(self.options[b'web_root']))

        # Web calendar handler (Needed because option Unprotected calendar)
        self.app.add_handlers('.*$', [
            (r'%s/calendar' % self.options[b'web_root'], CalendarHandler),
        ])

        # Static File Handlers
        self.app.add_handlers(
            ".*$",
            [
                # favicon
                (r'%s/(favicon\.ico)' % self.options[b'web_root'],
                 StaticFileHandler, {
                     "path":
                     os.path.join(self.options[b'gui_root'],
                                  'images/ico/favicon.ico')
                 }),

                # images
                (r'%s.*?/images/(.*)' % self.options[b'web_root'],
                 StaticImageHandler, {
                     "path": os.path.join(self.options[b'gui_root'], 'images')
                 }),

                # css
                (r'%s/css/(.*)' % self.options[b'web_root'], StaticFileHandler,
                 {
                     "path": os.path.join(self.options[b'gui_root'], 'css')
                 }),

                # javascript
                (r'%s/js/(.*)' % self.options[b'web_root'], StaticFileHandler,
                 {
                     "path": os.path.join(self.options[b'gui_root'], 'js')
                 }),

                # videos
            ] + [(r'%s/videos/(.*)' % self.options[b'web_root'],
                  StaticFileHandler, {
                      "path": self.video_root
                  })])

        # daemonize sickrage
        if sickrage.DAEMONIZE:
            import daemon
            ctx = daemon.DaemonContext()
            ctx.initgroups = False
            ctx.open()

        # write sickrage pidfile
        sickrage.PID = os.getpid()
        if sickrage.CREATEPID:
            with file(sickrage.PIDFILE, 'w+') as pf:
                pf.write(str(sickrage.PID))

        self.io_loop.add_callback(sickrage.Scheduler.start)
Example #10
0
    def run(self):
        self.started = True

        # load languages
        tornado.locale.load_gettext_translations(sickrage.LOCALE_DIR, 'messages')

        # clear mako cache folder
        mako_cache = os.path.join(sickrage.app.cache_dir, 'mako')
        if os.path.isdir(mako_cache):
            shutil.rmtree(mako_cache)

        # video root
        if sickrage.app.config.root_dirs:
            root_dirs = sickrage.app.config.root_dirs.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.app.config.web_root:
            sickrage.app.config.web_root = sickrage.app.config.web_root = (
                '/' + sickrage.app.config.web_root.lstrip('/').strip('/'))

        # api root
        self.api_root = r'%s/api/%s' % (sickrage.app.config.web_root, sickrage.app.config.api_key)

        # tornado setup
        if sickrage.app.config.enable_https:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (
                        sickrage.app.config.https_cert and os.path.exists(
                        sickrage.app.config.https_cert)) or not (
                        sickrage.app.config.https_key and os.path.exists(sickrage.app.config.https_key)):
                if not create_https_certificates(sickrage.app.config.https_cert,
                                                 sickrage.app.config.https_key):
                    sickrage.app.log.info("Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.app.config.enable_https = False

            if not (os.path.exists(sickrage.app.config.https_cert) and os.path.exists(
                    sickrage.app.config.https_key)):
                sickrage.app.log.warning("Disabled HTTPS because of missing CERT and KEY files")
                sickrage.app.config.enable_https = False

        # Load the app
        self.app = Application(
            [
                # api
                (r'%s(/?.*)' % self.api_root, ApiHandler),

                # redirect to web root
                (r"(?!%s)(.*)" % sickrage.app.config.web_root, RedirectHandler,
                 {"url": "%s/{0}" % sickrage.app.config.web_root}),

                # api key
                (r'%s/getkey(/?.*)' % sickrage.app.config.web_root, KeyHandler),

                # api builder
                (r'%s/api/builder' % sickrage.app.config.web_root, RedirectHandler,
                 {"url": sickrage.app.config.web_root + '/apibuilder/'}),

                # login
                (r'%s/login(/?)' % sickrage.app.config.web_root, LoginHandler),

                # logout
                (r'%s/logout(/?)' % sickrage.app.config.web_root, LogoutHandler),

                # calendar
                (r'%s/calendar' % sickrage.app.config.web_root, CalendarHandler),

                # favicon
                (r'%s/(favicon\.ico)' % sickrage.app.config.web_root, StaticFileHandler,
                 {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images/favicon.ico')}),

                # images
                (r'%s/images/(.*)' % sickrage.app.config.web_root, StaticImageHandler,
                 {"path": os.path.join(sickrage.app.config.gui_static_dir, 'images')}),

                # css
                (r'%s/css/(.*)' % sickrage.app.config.web_root, StaticFileHandler,
                 {"path": os.path.join(sickrage.app.config.gui_static_dir, 'css')}),

                # scss
                (r'%s/scss/(.*)' % sickrage.app.config.web_root, StaticFileHandler,
                 {"path": os.path.join(sickrage.app.config.gui_static_dir, 'scss')}),

                # fonts
                (r'%s/fonts/(.*)' % sickrage.app.config.web_root, StaticFileHandler,
                 {"path": os.path.join(sickrage.app.config.gui_static_dir, 'fonts')}),

                # javascript
                (r'%s/js/(.*)' % sickrage.app.config.web_root, StaticFileHandler,
                 {"path": os.path.join(sickrage.app.config.gui_static_dir, 'js')}),

                # videos
                (r'%s/videos/(.*)' % sickrage.app.config.web_root, StaticFileHandler,
                 {"path": self.video_root}),
            ] + Route.get_routes(sickrage.app.config.web_root),
            debug=True,
            autoreload=False,
            gzip=sickrage.app.config.web_use_gzip,
            xheaders=sickrage.app.config.handle_reverse_proxy,
            cookie_secret=sickrage.app.config.web_cookie_secret,
            login_url='%s/login/' % sickrage.app.config.web_root)

        self.server = HTTPServer(self.app, no_keep_alive=True)

        if sickrage.app.config.enable_https: self.server.ssl_options = {
            "certfile": sickrage.app.config.https_cert,
            "keyfile": sickrage.app.config.https_key
        }

        try:
            self.server.listen(sickrage.app.config.web_port, None)

            sickrage.app.log.info(
                "SiCKRAGE :: STARTED")
            sickrage.app.log.info(
                "SiCKRAGE :: VERSION:[{}]".format(sickrage.app.version_updater.version))
            sickrage.app.log.info(
                "SiCKRAGE :: CONFIG:[{}] [v{}]".format(sickrage.app.config_file, sickrage.app.config.config_version))
            sickrage.app.log.info(
                "SiCKRAGE :: URL:[{}://{}:{}/]".format(
                    ('http', 'https')[sickrage.app.config.enable_https],
                    sickrage.app.config.web_host, sickrage.app.config.web_port))

            # launch browser window
            if all([not sickrage.app.no_launch, sickrage.app.config.launch_browser]):
                threading.Thread(None,
                                 lambda: launch_browser(
                                     ('http', 'https')[sickrage.app.config.enable_https],
                                     sickrage.app.config.web_host,
                                     sickrage.app.config.web_port
                                 ), name="LAUNCH-BROWSER").start()

            sickrage.app.io_loop.start()
        except socket.error as e:
            sickrage.app.log.warning(e.strerror)
            raise SystemExit
Example #11
0
    def start(self):
        self.started = True

        # video root
        self.video_root = None
        if sickrage.srCore.srConfig.ROOT_DIRS:
            root_dirs = sickrage.srCore.srConfig.ROOT_DIRS.split('|')
            self.video_root = root_dirs[int(root_dirs[0]) + 1]

        # web root
        if sickrage.srCore.srConfig.WEB_ROOT:
            sickrage.srCore.srConfig.WEB_ROOT = sickrage.srCore.srConfig.WEB_ROOT = (
                '/' + sickrage.srCore.srConfig.WEB_ROOT.lstrip('/').strip('/'))

        # api root
        if not sickrage.srCore.srConfig.API_KEY:
            sickrage.srCore.srConfig.API_KEY = generateApiKey()
        self.api_root = r'%s/api/%s' % (sickrage.srCore.srConfig.WEB_ROOT, sickrage.srCore.srConfig.API_KEY)

        # tornado setup
        if sickrage.srCore.srConfig.ENABLE_HTTPS:
            # If either the HTTPS certificate or key do not exist, make some self-signed ones.
            if not (
                        sickrage.srCore.srConfig.HTTPS_CERT and os.path.exists(
                        sickrage.srCore.srConfig.HTTPS_CERT)) or not (
                        sickrage.srCore.srConfig.HTTPS_KEY and os.path.exists(sickrage.srCore.srConfig.HTTPS_KEY)):
                if not create_https_certificates(sickrage.srCore.srConfig.HTTPS_CERT,
                                                 sickrage.srCore.srConfig.HTTPS_KEY):
                    sickrage.srCore.srLogger.info("Unable to create CERT/KEY files, disabling HTTPS")
                    sickrage.srCore.srConfig.ENABLE_HTTPS = False

            if not (os.path.exists(sickrage.srCore.srConfig.HTTPS_CERT) and os.path.exists(
                    sickrage.srCore.srConfig.HTTPS_KEY)):
                sickrage.srCore.srLogger.warning("Disabled HTTPS because of missing CERT and KEY files")
                sickrage.srCore.srConfig.ENABLE_HTTPS = False

        # Load the app
        self.app = Application([],
                               debug=False,
                               autoreload=False,
                               gzip=sickrage.srCore.srConfig.WEB_USE_GZIP,
                               xheaders=sickrage.srCore.srConfig.HANDLE_REVERSE_PROXY,
                               cookie_secret=sickrage.srCore.srConfig.WEB_COOKIE_SECRET,
                               login_url='%s/login/' % sickrage.srCore.srConfig.WEB_ROOT)

        # Main Handlers
        self.app.add_handlers('.*$', [
            # webapi handler
            (r'%s(/?.*)' % self.api_root, ApiHandler),

            # webapi key retrieval
            (r'%s/getkey(/?.*)' % sickrage.srCore.srConfig.WEB_ROOT, KeyHandler),

            # webapi builder redirect
            (r'%s/api/builder' % sickrage.srCore.srConfig.WEB_ROOT, RedirectHandler,
             {"url": sickrage.srCore.srConfig.WEB_ROOT + '/apibuilder/'}),

            # webui login/logout handlers
            (r'%s/login(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LoginHandler),
            (r'%s/logout(/?)' % sickrage.srCore.srConfig.WEB_ROOT, LogoutHandler),

            # webui handlers
        ] + Route.get_routes(sickrage.srCore.srConfig.WEB_ROOT))

        # Web calendar handler (Needed because option Unprotected calendar)
        self.app.add_handlers('.*$', [
            (r'%s/calendar' % sickrage.srCore.srConfig.WEB_ROOT, CalendarHandler),
        ])

        # Static File Handlers
        self.app.add_handlers(".*$", [
            # favicon
            (r'%s/(favicon\.ico)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler,
             {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images/ico/favicon.ico')}),

            # images
            (r'%s.*?/images/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticImageHandler,
             {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'images')}),

            # css
            (r'%s/css/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler,
             {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'css')}),

            # scss
            (r'%s/scss/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler,
             {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'scss')}),

            # fonts
            (r'%s/fonts/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler,
             {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'fonts')}),

            # javascript
            (r'%s/js/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler,
             {"path": os.path.join(sickrage.srCore.srConfig.GUI_DIR, 'js')}),

            # videos
        ] + [(r'%s/videos/(.*)' % sickrage.srCore.srConfig.WEB_ROOT, StaticFileHandler,
              {"path": self.video_root})])

        self.server = HTTPServer(self.app, no_keep_alive=True)

        if sickrage.srCore.srConfig.ENABLE_HTTPS: self.server.ssl_options = {
            "certfile": sickrage.srCore.srConfig.HTTPS_CERT,
            "keyfile": sickrage.srCore.srConfig.HTTPS_KEY
        }

        try:
            self.server.listen(sickrage.srCore.srConfig.WEB_PORT, None)
        except socket.error as e:
            print(e.message)
            raise

        # launch browser window
        if all([not sickrage.NOLAUNCH, sickrage.srCore.srConfig.LAUNCH_BROWSER]):
            threading.Thread(None,
                             lambda: launch_browser(
                                 ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS],
                                 get_lan_ip(),
                                 sickrage.srCore.srConfig.WEB_PORT
                             )).start()

        # clear mako cache folder
        makocache = os.path.join(sickrage.srCore.srConfig.CACHE_DIR, 'mako')
        if os.path.isdir(makocache):
            shutil.rmtree(makocache)

        sickrage.srCore.srLogger.info("SiCKRAGE :: STARTED")
        sickrage.srCore.srLogger.info("SiCKRAGE :: VERSION:[{}]".format(sickrage.srCore.VERSIONUPDATER.updater.version))
        sickrage.srCore.srLogger.info("SiCKRAGE :: CONFIG:[{}]".format(sickrage.CONFIG_FILE))
        sickrage.srCore.srLogger.info("SiCKRAGE :: URL:[{}://{}:{}/]".format(
            ('http', 'https')[sickrage.srCore.srConfig.ENABLE_HTTPS],
            get_lan_ip(), sickrage.srCore.srConfig.WEB_PORT))