示例#1
0
    def do_GET(self):
        global g_param
        try:
            dprint(__name__, 2, "http request header:\n{0}", self.headers)
            dprint(__name__, 2, "http request path:\n{0}", self.path)

            # check for PMS address
            PMSaddress = ''
            pms_end = self.path.find(')')
            if self.path.startswith('/PMS(') and pms_end > -1:
                PMSaddress = urllib.unquote_plus(self.path[5:pms_end])
                self.path = self.path[pms_end + 1:]

            # break up path, separate PlexConnect options
            # clean path needed for filetype decoding
            parts = re.split(
                r'[?&]', self.path,
                1)  # should be '?' only, but we do some things different :-)
            if len(parts) == 1:
                self.path = parts[0]
                options = {}
                query = ''
            else:
                self.path = parts[0]

                # break up query string
                options = {}
                query = ''
                parts = parts[1].split('&')
                for part in parts:
                    if part.startswith('PlexConnect'):
                        # get options[]
                        opt = part.split('=', 1)
                        if len(opt) == 1:
                            options[opt[0]] = ''
                        else:
                            options[opt[0]] = urllib.unquote(opt[1])
                    else:
                        # recreate query string (non-PlexConnect) - has to be merged back when forwarded
                        if query == '':
                            query = '?' + part
                        else:
                            query += '&' + part

            # get aTV language setting
            options['aTVLanguage'] = Localize.pickLanguage(
                self.headers.get('Accept-Language', 'en'))

            query = query.replace("yyltyy", "<").replace("yygtyy", ">")

            # add client address - to be used in case UDID is unknown
            if 'X-Forwarded-For' in self.headers:
                options['aTVAddress'] = self.headers['X-Forwarded-For'].split(
                    ',', 1)[0]
            else:
                options['aTVAddress'] = self.client_address[0]

            # get aTV hard-/software parameters
            options['aTVFirmwareVersion'] = self.headers.get(
                'X-Apple-TV-Version', '5.1')
            options['aTVScreenResolution'] = self.headers.get(
                'X-Apple-TV-Resolution', '720')

            dprint(__name__, 2, "pms address:\n{0}", PMSaddress)
            dprint(__name__, 2, "cleaned path:\n{0}", self.path)
            dprint(__name__, 2, "PlexConnect options:\n{0}", options)
            dprint(__name__, 2, "additional arguments:\n{0}", query)

            if 'User-Agent' in self.headers and \
               'AppleTV' in self.headers['User-Agent']:

                # recieve simple logging messages from the ATV
                if 'PlexConnectATVLogLevel' in options:
                    dprint('ATVLogger', int(options['PlexConnectATVLogLevel']),
                           options['PlexConnectLog'])
                    self.send_response(200)
                    self.send_header('Content-type', 'text/plain')
                    self.end_headers()
                    return

                # serve "*.cer" - Serve up certificate file to atv
                if self.path.endswith(".cer"):
                    dprint(__name__, 1, "serving *.cer: " + self.path)
                    if g_param['CSettings'].getSetting('certfile').startswith(
                            '.'):
                        # relative to current path
                        cfg_certfile = sys.path[0] + sep + g_param[
                            'CSettings'].getSetting('certfile')
                    else:
                        # absolute path
                        cfg_certfile = g_param['CSettings'].getSetting(
                            'certfile')
                    cfg_certfile = path.normpath(cfg_certfile)

                    cfg_certfile = path.splitext(cfg_certfile)[0] + '.cer'
                    try:
                        f = open(cfg_certfile, "rb")
                    except:
                        dprint(__name__, 0,
                               "Failed to access certificate: {0}",
                               cfg_certfile)
                        return

                    self.sendResponse(f.read(), 'text/xml', False)
                    f.close()
                    return

                # serve .js files to aTV
                # application, main: ignore path, send /assets/js/application.js
                # otherwise: path should be '/js', send /assets/js/*.js
                dirname = path.dirname(self.path)
                basename = path.basename(self.path)
                if basename in ("application.js", "main.js", "javascript-packed.js", "bootstrap.js") or \
                   basename.endswith(".js") and dirname == '/js':
                    if basename in ("main.js", "javascript-packed.js",
                                    "bootstrap.js"):
                        basename = "application.js"
                    dprint(__name__, 1, "serving /js/{0}", basename)
                    JS = JSConverter(basename, options)
                    self.sendResponse(JS, 'text/javascript', True)
                    return

                # proxy phobos.apple.com to support  PlexConnect main icon
                if "a1.phobos.apple.com" in self.headers['Host']:
                    resource = self.headers['Host'] + self.path
                    icon = g_param['CSettings'].getSetting('icon')
                    if basename.startswith(icon):
                        icon_res = basename[len(
                            icon
                        ):]  # cut string from settings, keeps @720.png/@1080.png
                        resource = sys.path[0] + '/assets/icons/icon' + icon_res
                        dprint(
                            __name__, 1, "serving " + self.headers['Host'] +
                            self.path + " with " + resource)
                        r = open(resource, "rb")
                    else:
                        r = urllib.urlopen('http://' + resource)
                    self.sendResponse(r.read(), 'image/png', False)
                    r.close()
                    return

                # serve "*.jpg" - thumbnails for old-style mainpage
                if self.path.endswith(".jpg"):
                    dprint(__name__, 1, "serving *.jpg: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.sendResponse(f.read(), 'image/jpeg', False)
                    f.close()
                    return

                # serve "*.png" - only png's support transparent colors
                if self.path.endswith(".png"):
                    dprint(__name__, 1, "serving *.png: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.sendResponse(f.read(), 'image/png', False)
                    f.close()
                    return

                # serve subtitle file - transcoded to aTV subtitle json
                if 'PlexConnect' in options and \
                   options['PlexConnect']=='Subtitle':
                    dprint(__name__, 1, "serving subtitle: " + self.path)
                    XML = Subtitle.getSubtitleJSON(PMSaddress,
                                                   self.path + query, options)
                    self.sendResponse(XML, 'application/json', True)
                    return

                # get everything else from XMLConverter - formerly limited to trailing "/" and &PlexConnect Cmds
                if True:
                    dprint(__name__, 1, "serving .xml: " + self.path)
                    XML = XMLConverter.XML_PMS2aTV(PMSaddress,
                                                   self.path + query, options)
                    self.sendResponse(XML, 'text/xml', True)
                    return
                """
                # unexpected request
                self.send_error(403,"Access denied: %s" % self.path)
                """

            else:
                """
                Added Up Page for docker helthcheck
                self.send_error(403,"Not Serving Client %s" % self.client_address[0])
                """
                dprint(__name__, 1, "serving *.html: " + self.path)
                f = open(sys.path[0] + sep + "assets/templates/up.html")
                self.sendResponse(f.read(), 'text/html', False)
                f.close()

        except IOError:
            dprint(__name__, 0, 'File Not Found:\n{0}', traceback.format_exc())
            self.send_error(404, "File Not Found: %s" % self.path)
        except:
            dprint(__name__, 0, 'Internal Server Error:\n{0}',
                   traceback.format_exc())
            self.send_error(500, "Internal Server Error: %s" % self.path)
示例#2
0
    def do_GET(self):
        global g_param
        try:
            dprint(__name__, 2, "http request header:\n{0}", self.headers)
            dprint(__name__, 2, "http request path:\n{0}", self.path)

            # check for PMS address
            PMSaddress = ''
            pms_end = self.path.find(')')
            if self.path.startswith('/PMS(') and pms_end > -1:
                PMSaddress = urllib.unquote_plus(self.path[5:pms_end])
                self.path = self.path[pms_end + 1:]

            # break up path, separate PlexConnect options
            options = {}
            while True:
                cmd_start = self.path.find('&PlexConnect')
                cmd_end = self.path.find('&', cmd_start + 1)

                if cmd_start == -1:
                    break
                if cmd_end > -1:
                    cmd = self.path[cmd_start + 1:cmd_end]
                    self.path = self.path[:cmd_start] + self.path[cmd_end:]
                else:
                    cmd = self.path[cmd_start + 1:]
                    self.path = self.path[:cmd_start]

                parts = cmd.split('=', 1)
                if len(parts) == 1:
                    options[parts[0]] = ''
                else:
                    options[parts[0]] = urllib.unquote(parts[1])

            # break up path, separate additional arguments
            # clean path needed for filetype decoding... has to be merged back when forwarded.
            parts = self.path.split('?', 1)
            if len(parts) == 1:
                args = ''
            else:
                self.path = parts[0]
                args = '?' + parts[1]

            # get aTV language setting
            options['aTVLanguage'] = Localize.pickLanguage(
                self.headers.get('Accept-Language', 'en'))

            # add client address - to be used in case UDID is unknown
            options['aTVAddress'] = self.client_address[0]

            # get aTV hard-/software parameters
            options['aTVFirmwareVersion'] = self.headers.get(
                'X-Apple-TV-Version', '5.1')
            options['aTVScreenResolution'] = self.headers.get(
                'X-Apple-TV-Resolution', '720')

            dprint(__name__, 2, "pms address:\n{0}", PMSaddress)
            dprint(__name__, 2, "cleaned path:\n{0}", self.path)
            dprint(__name__, 2, "PlexConnect options:\n{0}", options)
            dprint(__name__, 2, "additional arguments:\n{0}", args)

            if 'User-Agent' in self.headers and \
               'AppleTV' in self.headers['User-Agent']:

                # recieve simple logging messages from the ATV
                if 'PlexConnectATVLogLevel' in options:
                    dprint('ATVLogger', int(options['PlexConnectATVLogLevel']),
                           options['PlexConnectLog'])
                    self.send_response(200)
                    self.send_header('Content-type', 'text/plain')
                    self.end_headers()
                    return

                # serve "*.cer" - Serve up certificate file to atv
                if self.path.endswith(".cer"):
                    dprint(__name__, 1, "serving *.cer: " + self.path)
                    if g_param['CSettings'].getSetting('certfile').startswith(
                            '.'):
                        # relative to current path
                        cfg_certfile = sys.path[0] + sep + g_param[
                            'CSettings'].getSetting('certfile')
                    else:
                        # absolute path
                        cfg_certfile = g_param['CSettings'].getSetting(
                            'certfile')

                    cfg_certfile = path.splitext(cfg_certfile)[0] + '.cer'
                    try:
                        f = open(cfg_certfile, "rb")
                    except:
                        dprint(__name__, 0,
                               "Failed to access certificate: {0}",
                               cfg_certfile)
                        return

                    self.send_response(200)
                    self.send_header('Content-type', 'text/xml')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve .js files to aTV
                # application, main: ignore path, send /assets/js/application.js
                # otherwise: path should be '/js', send /assets/js/*.js
                dirname = path.dirname(self.path)
                basename = path.basename(self.path)
                if basename in ("application.js", "main.js", "javascript-packed.js") or \
                   basename.endswith(".js") and dirname == '/js':
                    if basename in ("main.js", "javascript-packed.js"):
                        basename = "application.js"
                    dprint(__name__, 1, "serving /js/{0}", basename)
                    JS = JSConverter(basename, options)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/javascript')
                    self.end_headers()
                    self.wfile.write(JS)
                    return

                # serve "*.jpg" - thumbnails for old-style mainpage
                if self.path.endswith(".jpg"):
                    dprint(__name__, 1, "serving *.jpg: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/jpeg')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.png" - only png's support transparent colors
                if self.path.endswith(".png"):
                    dprint(__name__, 1, "serving *.png: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/png')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # get everything else from XMLConverter - formerly limited to trailing "/" and &PlexConnect Cmds
                if True:
                    dprint(__name__, 1, "serving .xml: " + self.path)
                    XML = XMLConverter.XML_PMS2aTV(PMSaddress,
                                                   self.path + args, options)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/xml')
                    self.end_headers()
                    self.wfile.write(XML)
                    return

            else:
                """
                # unexpected request
                self.send_error(403,"Access denied: %s" % self.path)
                """
                self.send_error(
                    403, "Not Serving Client %s" % self.client_address[0])
        except IOError:
            self.send_error(404, "File Not Found: %s" % self.path)
示例#3
0
    def do_GET(self):
        try:
            dprint(__name__, 2, "http request header:\n{0}", self.headers)
            dprint(__name__, 2, "http request path:\n{0}", self.path)
            if self.headers['Host'] == Settings.getHostToIntercept() and \
               self.headers['User-Agent'].startswith("iTunes-AppleTV"):

                # recieve simple logging messages from the ATV
                if self.path.endswith("&atvlogger"):
                    msg = self.path.replace("%20", " ")
                    msg = msg.replace("&lt;", "<")
                    msg = msg.replace("&gt;", ">")
                    msg = msg.replace("&fs;", "/")
                    msg = msg[1:len(msg) - 10]
                    dprint('ATVLogger', 0, msg)
                    return

                # serve "application.js" to aTV
                # disregard the path - it is different for different iOS versions
                if self.path.endswith("application.js"):
                    dprint(__name__, 1, "serving application.js")
                    f = open(sys.path[0] + sep + "assets" + sep +
                             "application.js")
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve all other .js files to aTV
                if self.path.endswith(".js"):
                    dprint(
                        __name__, 1, "serving  " + sys.path[0] + sep +
                        "assets" + self.path.replace('/', sep))
                    f = open(sys.path[0] + sep + "assets" +
                             self.path.replace('/', sep))
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve all .xml files to aTV including "plexconnect.xml" or "plexconnect_oldmenu.xml"
                if self.path.endswith(".xml"):
                    dprint(
                        __name__, 1, "serving " + sys.path[0] + sep +
                        "assets" + self.path.replace('/', sep))
                    f = open(sys.path[0] + sep + "assets" +
                             self.path.replace('/', sep))
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.jpg" - thumbnails for old-style mainpage
                if self.path.endswith(".jpg"):
                    dprint(__name__, 1, "serving *.jpg: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/jpeg')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.png" - only png's support transparent colors
                if self.path.endswith(".png"):
                    dprint(__name__, 1, "serving *.png: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/png')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # path could be a search string
                if self.path.find('search') > -1:
                    dprint(
                        __name__, 1,
                        "Search Query=" + "/search?type=2&query=" +
                        self.path[8:] + "&amp;PlexConnect=Search")
                    XML = XMLConverter.XML_PMS2aTV(
                        self.client_address, "/search?type=4&query=" +
                        self.path[8:] + "&PlexConnect=Search")
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(XML)
                    return

                # get everything else from XMLConverter - formerly limited to trailing "/" and &PlexConnect Cmds
                if True:
                    dprint(__name__, 1, "serving .xml: " + self.path)
                    XML = XMLConverter.XML_PMS2aTV(self.client_address,
                                                   self.path)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(XML)
                    return
                """
                # unexpected request
                self.send_error(403,"Access denied: %s" % self.path)
                """

            else:
                self.send_error(
                    403, "Not Serving Client %s" % self.client_address[0])
        except IOError:
            self.send_error(404, "File Not Found: %s" % self.path)
示例#4
0
    def do_GET(self):
        try:
            dprint(__name__, 2, "http request header:\n{0}", self.headers)
            dprint(__name__, 2, "http request path:\n{0}", self.path)

            # brake up path, separate PlexConnect options
            options = {}
            while True:
                cmd_start = self.path.find('&PlexConnect')
                cmd_end = self.path.find('&', cmd_start + 1)

                if cmd_start == -1:
                    break
                if cmd_end > -1:
                    cmd = self.path[cmd_start + 1:cmd_end]
                    self.path = self.path[:cmd_start] + self.path[cmd_end:]
                else:
                    cmd = self.path[cmd_start + 1:]
                    self.path = self.path[:cmd_start]

                parts = cmd.split('=', 1)
                if len(parts) == 1:
                    options[parts[0]] = ''
                else:
                    options[parts[0]] = urllib.unquote(parts[1])

            # get aTV language setting
            options['aTVLanguages'] = self.headers.get('Accept-Language', 'en')

            dprint(__name__, 2, "cleaned path:\n{0}", self.path)
            dprint(__name__, 2, "request options:\n{0}", options)

            if 'User-Agent' in self.headers and \
               'AppleTV' in self.headers['User-Agent']:

                # recieve simple logging messages from the ATV
                if 'PlexConnectLog' in options:
                    dprint('ATVLogger', 0, options['PlexConnectLog'])
                    self.send_response(200)
                    self.send_header('Content-type', 'text/plain')
                    self.end_headers()
                    return

                # serve "application.js" to aTV
                # disregard the path - it is different for different iOS versions
                if self.path.endswith("application.js"):
                    dprint(__name__, 1, "serving application.js")
                    f = open(sys.path[0] + sep + "assets" + sep + "js" + sep +
                             "application.js")
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve all other .js files to aTV
                if self.path.endswith(".js"):
                    dprint(
                        __name__, 1, "serving  " + sys.path[0] + sep +
                        "assets" + self.path.replace('/', sep))
                    f = open(sys.path[0] + sep + "assets" +
                             self.path.replace('/', sep))
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.jpg" - thumbnails for old-style mainpage
                if self.path.endswith(".jpg"):
                    dprint(__name__, 1, "serving *.jpg: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/jpeg')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.png" - only png's support transparent colors
                if self.path.endswith(".png"):
                    dprint(__name__, 1, "serving *.png: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/png')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # get everything else from XMLConverter - formerly limited to trailing "/" and &PlexConnect Cmds
                if True:
                    dprint(__name__, 1, "serving .xml: " + self.path)
                    XML = XMLConverter.XML_PMS2aTV(self.client_address,
                                                   self.path, options)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/xml')
                    self.end_headers()
                    self.wfile.write(XML)
                    return
                """
                # unexpected request
                self.send_error(403,"Access denied: %s" % self.path)
                """

            else:
                self.send_error(
                    403, "Not Serving Client %s" % self.client_address[0])
        except IOError:
            self.send_error(404, "File Not Found: %s" % self.path)
示例#5
0
    def do_GET(self):
        try:
            dprint(__name__, 2, "http request header:\n{0}", self.headers)
            dprint(__name__, 2, "http request path:\n{0}", self.path)

            # break up path, separate options
            if '?' in self.path:
                (self.path, options) = self.path.split('?')
            elif '&' in self.path:
                (self.path, options) = self.path.split('&', 1)
            else:
                options = ''

            if len(options) > 0:
                options = dict(urlparse.parse_qsl(options))

                for key in options:
                    options[key] = unquote_plus(options[key])
            else:
                options = {}

            dprint(__name__, 2, "cleaned path:\n{0}", self.path)
            dprint(__name__, 2, "request args:\n{0}", options)

            if self.headers['Host'] == g_param['HostToIntercept'] and \
               self.headers['User-Agent'].startswith("iTunes-AppleTV"):

                # recieve simple logging messages from the ATV
                if 'PlexLog' in options:  # self.path.endswith("&atvlogger"):
                    msg = options['PlexLog']
                    msg = msg.replace("%20", " ")
                    msg = msg.replace("&lt;", "<")
                    msg = msg.replace("&gt;", ">")
                    msg = msg.replace("&fs;", "/")
                    msg = msg.replace("&qo;", '"')
                    dprint('ATVLogger', 0, msg)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/plain')
                    self.end_headers()
                    return

                # serve "application.js" to aTV
                # disregard the path - it is different for different iOS versions
                if self.path.endswith("application.js"):
                    dprint(__name__, 1, "serving application.js")
                    f = open(sys.path[0] + sep + "assets" + sep +
                             "application.js")
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve all other .js files to aTV
                if self.path.endswith(".js"):
                    dprint(
                        __name__, 1, "serving  " + sys.path[0] + sep +
                        "assets" + self.path.replace('/', sep))
                    f = open(sys.path[0] + sep + "assets" +
                             self.path.replace('/', sep))
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve all .xml files to aTV including "plexconnect.xml" or "plexconnect_oldmenu.xml"
                if self.path.endswith(".xml"):
                    dprint(
                        __name__, 1, "serving " + sys.path[0] + sep +
                        "assets" + self.path.replace('/', sep))
                    f = open(sys.path[0] + sep + "assets" +
                             self.path.replace('/', sep))
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.jpg" - thumbnails for old-style mainpage
                if self.path.endswith(".jpg"):
                    dprint(__name__, 1, "serving *.jpg: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/jpeg')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.png" - only png's support transparent colors
                if self.path.endswith(".png"):
                    dprint(__name__, 1, "serving *.png: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/png')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # path could be a search string
                if self.path.find('search') > -1:
                    dprint(
                        __name__, 1,
                        "Search Query=" + "/search?type=2&query=" +
                        self.path[8:] + "&amp;PlexConnect=Search")
                    options = {'PlexConnect':'Search', \
                               'type':'4', \
                               'query':self.path[8:] }
                    XML = XMLConverter.XML_PMS2aTV(self.client_address,
                                                   "/search", options)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(XML)
                    return

                # get everything else from XMLConverter - formerly limited to trailing "/" and &PlexConnect Cmds
                if True:
                    dprint(__name__, 1, "serving .xml: " + self.path)
                    XML = XMLConverter.XML_PMS2aTV(self.client_address,
                                                   self.path, options)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(XML)
                    return
                """
                # unexpected request
                self.send_error(403,"Access denied: %s" % self.path)
                """

            else:
                self.send_error(
                    403, "Not Serving Client %s" % self.client_address[0])
        except IOError:
            self.send_error(404, "File Not Found: %s" % self.path)
示例#6
0
    def do_GET(self):
        global g_param
        try:
            dprint(__name__, 2, "http request header:\n{0}", self.headers)
            dprint(__name__, 2, "http request path:\n{0}", self.path)

            # check for PMS address
            PMSaddress = ''
            pms_end = self.path.find(')')
            if self.path.startswith('/PMS(') and pms_end > -1:
                PMSaddress = urllib.unquote_plus(self.path[5:pms_end])
                self.path = self.path[pms_end + 1:]

            # break up path, separate PlexConnect options
            options = {}
            while True:
                cmd_start = self.path.find('&PlexConnect')
                cmd_end = self.path.find('&', cmd_start + 1)

                if cmd_start == -1:
                    break
                if cmd_end > -1:
                    cmd = self.path[cmd_start + 1:cmd_end]
                    self.path = self.path[:cmd_start] + self.path[cmd_end:]
                else:
                    cmd = self.path[cmd_start + 1:]
                    self.path = self.path[:cmd_start]

                parts = cmd.split('=', 1)
                if len(parts) == 1:
                    options[parts[0]] = ''
                else:
                    options[parts[0]] = urllib.unquote(parts[1])

            # break up path, separate additional arguments
            # clean path needed for filetype decoding... has to be merged back when forwarded.
            parts = self.path.split('?', 1)
            if len(parts) == 1:
                args = ''
            else:
                self.path = parts[0]
                args = '?' + parts[1]

            # get aTV language setting
            options['aTVLanguage'] = Localize.pickLanguage(
                self.headers.get('Accept-Language', 'en'))

            # add client address - to be used in case UDID is unknown
            options['aTVAddress'] = self.client_address[0]

            # get aTV hard-/software parameters
            options['aTVFirmwareVersion'] = self.headers.get(
                'X-Apple-TV-Version', '5.1')
            options['aTVScreenResolution'] = self.headers.get(
                'X-Apple-TV-Resolution', '720')

            dprint(__name__, 2, "pms address:\n{0}", PMSaddress)
            dprint(__name__, 2, "cleaned path:\n{0}", self.path)
            dprint(__name__, 2, "PlexConnect options:\n{0}", options)
            dprint(__name__, 2, "additional arguments:\n{0}", args)

            if 'User-Agent' in self.headers and \
               'AppleTV' in self.headers['User-Agent']:

                # serve the plex icon
                if self.headers[
                        'Host'] == 'a1.phobos.apple.com' and self.path.endswith(
                            ".png"):
                    # possible icon
                    basename = path.basename(self.path)
                    iconname, ext = basename.split('.')
                    dprint(__name__, 2, "serving icon {0}", iconname)
                    name, rez = iconname.split('@')
                    dprint(__name__, 2, "icon name: {0} at {1}", name, rez)
                    hosticons = {
                        'www.icloud.com': 'Theater',
                        'atv.hbogo.com': 'HBOGo',
                        'atv.qello.com': 'QelloV2',
                        'appletv.app.hulu.com': 'huluplus',
                        'appletv.vevo.com': 'VevoV1',
                        'apps.sho.com': 'Smithsonian_V2',
                        'watchdisneyjunior.go.com': 'DisneyJR',
                        'watchdisneychannel.go.com': 'DisneyChannel_V2',
                        'watchdisneyxd.go.com': 'DisneyXD_V2',
                        'ssl.weather.com': 'weatherchannel',
                        'secure.marketwatch.com': 'wsj',
                        'trailers.apple.com': 'movie-trailers',
                        'secure.showtimeanytime.com': 'com.showtime.appletv',
                        'vimeo.com': 'vimeo',
                        'd6mhwe3a8uvr5.cloudfront.net': 'skynews',
                        'video.pbs.org': 'PBS_V2',
                        'neulion-a.akamaihd.net': 'MLS_V3',
                        'itunesconnect.apple.com': 'iTunesConnect',
                        'abcnews.go.com': 'ABC_News',
                        'atvapp.willow.tv': 'Willow',
                        'player.aetndigital.com': 'Lifetime_V2',
                        'www.crunchyroll.com': 'CrunchyRollV3',
                        'watchabc.go.com': 'ABC',
                        'appletv.redbull.tv': 'RedBullTV',
                        'neulion-a.akamaihd.net': 'NHL',
                        'appletv.cnbc.com': 'CNBC',
                        'appletv.now.nfl.com': 'NFL_Now',
                        'secure.net.wwe.com': 'WWE',
                        'api-global.netflix.com': 'netflix',
                        'player.aetndigital.com': 'AE_V2',
                        's.yimg.com': 'YahooScreen',
                        'kids.pbs.org': 'PBS_Kids',
                        'kortv.com': 'KORTV_V2',
                        'appletv.crackle.com': 'Crackle',
                        'd1d0j1u9ayd8uc.cloudfront.net': 'ACC_V2',
                        's.cdn.turner.com': 'nba',
                        'player.aetndigital.com': 'History_V2',
                        'aptve.foxneodigital.com': 'FOX_Now',
                        'appletv.flickr.com': 'Flickr',
                        'a248.e.akamai.net': 'ESPNv3',
                        'mobapi.bloomberg.com': 'Bloomberg_V2',
                        's.aolcdn.com': 'AOL_On'
                    }
                    if name == hosticons.get(g_param['HostToIntercept']):
                        dprint(__name__, 2, "getting plex icon")
                        f = open(
                            sys.path[0] + sep + "assets" + sep + "thumbnails" +
                            sep + "icon@" + rez + ".png", "rb")
                        self.send_response(200)
                        self.send_header('Content-type', 'image/png')
                        self.end_headers()
                        self.wfile.write(f.read())
                        f.close()
                        return
                    else:
                        dprint(__name__, 2, "getting app icon")
                        self.send_response(200)
                        self.send_header('Content-type', 'image/png')
                        self.end_headers()
                        self.wfile.write(
                            urllib.urlopen('http://' + self.headers['Host'] +
                                           self.path).read())
                        return
                elif self.headers['Host'] == 'a1.phobos.apple.com':
                    # something other than an icon was requested
                    self.send_response(200)
                    self.send_header('Content-type',
                                     self.headers['Content-type'])
                    self.end_headers()
                    self.wfile.write(
                        urllib.urlopen('http://' + self.headers['Host'] +
                                       self.path).read())
                    return

                # recieve simple logging messages from the ATV
                if 'PlexConnectATVLogLevel' in options:
                    dprint('ATVLogger', int(options['PlexConnectATVLogLevel']),
                           options['PlexConnectLog'])
                    self.send_response(200)
                    self.send_header('Content-type', 'text/plain')
                    self.end_headers()
                    return

                # serve "*.cer" - Serve up certificate file to atv
                if self.path.endswith(".cer"):
                    dprint(__name__, 1, "serving *.cer: " + self.path)
                    if g_param['CSettings'].getSetting('certfile').startswith(
                            '.'):
                        # relative to current path
                        cfg_certfile = sys.path[0] + sep + g_param[
                            'CSettings'].getSetting('certfile')
                    else:
                        # absolute path
                        cfg_certfile = g_param['CSettings'].getSetting(
                            'certfile')
                    cfg_certfile = path.normpath(cfg_certfile)

                    cfg_certfile = path.splitext(cfg_certfile)[0] + '.cer'
                    try:
                        f = open(cfg_certfile, "rb")
                    except:
                        dprint(__name__, 0,
                               "Failed to access certificate: {0}",
                               cfg_certfile)
                        return

                    self.send_response(200)
                    self.send_header('Content-type', 'text/xml')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve .js files to aTV
                # application, main: ignore path, send /assets/js/application.js
                # otherwise: path should be '/js', send /assets/js/*.js
                dirname = path.dirname(self.path)
                basename = path.basename(self.path)
                if basename in ("application.js", "main.js", "javascript-packed.js") or \
                   basename.endswith(".js") and dirname == '/js':
                    if basename in ("main.js", "javascript-packed.js"):
                        basename = "application.js"
                    dprint(__name__, 1, "serving /js/{0}", basename)
                    JS = JSConverter(basename, options)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/javascript')
                    self.end_headers()
                    self.wfile.write(JS)
                    return

                # serve "*.jpg" - thumbnails for old-style mainpage
                if self.path.endswith(".jpg"):
                    dprint(__name__, 1, "serving *.jpg: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/jpeg')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.png" - only png's support transparent colors
                if self.path.endswith(".png"):
                    dprint(__name__, 1, "serving *.png: " + self.path)
                    f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/png')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # get everything else from XMLConverter - formerly limited to trailing "/" and &PlexConnect Cmds
                if True:
                    dprint(__name__, 1, "serving .xml: " + self.path)
                    XML = XMLConverter.XML_PMS2aTV(PMSaddress,
                                                   self.path + args, options)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/xml')
                    self.end_headers()
                    self.wfile.write(XML)
                    return
                """
                # unexpected request
                self.send_error(403,"Access denied: %s" % self.path)
                """

            else:
                self.send_error(
                    403, "Not Serving Client %s" % self.client_address[0])
        except IOError:
            self.send_error(404, "File Not Found: %s" % self.path)
示例#7
0
    def do_GET(self):
        try:
            if self.client_address[0] == Settings.getIP_aTV():

                # serve "application.js" to aTV
                # disregard the path - it is different for different iOS versions
                if self.path.endswith("application.js"):
                    dprint(__name__, 1, "serving application.js")
                    f = open(curdir + sep + "assets" + sep + "application.js")
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "plexconnect.xml" to aTV
                if self.path.endswith("plexconnect.xml"):
                    fVer = self.headers['X-Apple-TV-Version'].split(
                        ".", 2)  # firmware version number
                    firmVersion = fVer[0] + "." + fVer[1]
                    dprint(__name__, 1, "aTV firmware: " + firmVersion)
                    if eval(firmVersion) >= 5.1:
                        dprint(__name__, 1, "serving plexconnect.xml")
                        f = open(curdir + sep + "assets" + sep +
                                 "plexconnect.xml"
                                 )  # Version 5.1 or above use top menu bar
                    else:
                        dprint(__name__, 1, "serving plexconnect_oldmenu.xml")
                        f = open(
                            curdir + sep + "assets" + sep +
                            "plexconnect_oldmenu.xml"
                        )  # Versions 5.0.2 or lower don't use top menu bar
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve "*.jpg" - thumbnails for old-style mainpage
                if self.path.endswith(".jpg"):
                    dprint(__name__, 1, "serving *.jpg: " + self.path)
                    f = open(curdir + sep + "assets" + self.path, "rb")
                    self.send_response(200)
                    self.send_header('Content-type', 'image/jpeg')
                    self.end_headers()
                    self.wfile.write(f.read())
                    f.close()
                    return

                # serve Plex directory structure - make sure to keep the trailing "/"
                if self.path.endswith("/"):
                    dprint(__name__, 1, "serving .xml: " + self.path)
                    XML = XMLConverter.XML_PMS2aTV(self.client_address,
                                                   self.path)
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(XML)
                    return

                # serve Plex media
                if self.path.endswith("&PlexConnect=Play"):
                    dprint(__name__, 1, "serving media: " + self.path)
                    XML = XMLConverter.XML_PlayVideo(
                        self.client_address,
                        self.path[:-len('&PlexConnect=Play')])
                    self.send_response(200)
                    self.send_header('Content-type', 'text/html')
                    self.end_headers()
                    self.wfile.write(XML)
                    return

                # unexpected request
                self.send_error(403, "Access denied: %s" % self.path)

            else:
                self.send_error(
                    403, "Not Serving Client %s" % self.client_address[0])
        except IOError:
            self.send_error(404, "File Not Found: %s" % self.path)
示例#8
0
 def do_GET(self):
     try:
         dprint(__name__, 2, "http request header:\n{0}", self.headers)
         dprint(__name__, 2, "http request path:\n{0}", self.path)
         
         # brake up path, separate PlexConnect options
         options = {}
         while True:
             cmd_start = self.path.find('&PlexConnect')
             cmd_end = self.path.find('&', cmd_start+1)
             
             if cmd_start==-1:
                 break
             if cmd_end>-1:
                 cmd = self.path[cmd_start+1:cmd_end]
                 self.path = self.path[:cmd_start] + self.path[cmd_end:]
             else:
                 cmd = self.path[cmd_start+1:]
                 self.path = self.path[:cmd_start]
             
             parts = cmd.split('=', 1)
             if len(parts)==1:
                 options[parts[0]] = ''
             else:
                 options[parts[0]] = parts[1]
                 
         dprint(__name__, 2, "cleaned path:\n{0}", self.path)
         dprint(__name__, 2, "request options:\n{0}", options)
         
         if self.headers['Host'] == g_param['HostToIntercept'] and \
            self.headers['User-Agent'].startswith("iTunes-AppleTV"):
                                 
             # recieve simple logging messages from the ATV
             if self.path.endswith("&atvlogger"):
                 msg = self.path.replace("%20", " ")
                 msg = msg.replace("&lt;", "<")
                 msg = msg.replace("&gt;", ">")
                 msg = msg.replace("&fs;", "/")
                 msg = msg.replace("&qo;", '"')
                 msg = msg[1:len(msg)-10]
                 dprint('ATVLogger', 0, msg)
                 self.send_response(200)
                 self.send_header('Content-type', 'text/plain')
                 self.end_headers()
                 return
             
             # serve "application.js" to aTV
             # disregard the path - it is different for different iOS versions
             if self.path.endswith("application.js"):
                 dprint(__name__, 1, "serving application.js")
                 f = open(sys.path[0] + sep + "assets" + sep + "application.js")
                 self.send_response(200)
                 self.send_header('Content-type', 'text/html')
                 self.end_headers()
                 self.wfile.write(f.read())
                 f.close()
                 return
             
             # serve all other .js files to aTV
             if self.path.endswith(".js"):
                 dprint(__name__, 1, "serving  " + sys.path[0] + sep + "assets" + self.path.replace('/',sep))
                 f = open(sys.path[0] + sep + "assets" + self.path.replace('/',sep))
                 self.send_response(200)
                 self.send_header('Content-type', 'text/html')
                 self.end_headers()
                 self.wfile.write(f.read())
                 f.close()
                 return
                 
             # serve all .xml files to aTV including "plexconnect.xml" or "plexconnect_oldmenu.xml"
             if self.path.endswith(".xml"):
                 dprint(__name__,1,"serving "+ sys.path[0] + sep + "assets" + self.path.replace('/',sep))
                 f = open(sys.path[0] + sep + "assets" + self.path.replace('/',sep))
                 self.send_response(200)
                 self.send_header('Content-type', 'text/html')
                 self.end_headers()
                 self.wfile.write(f.read())
                 f.close()
                 return
             
             # serve "*.jpg" - thumbnails for old-style mainpage
             if self.path.endswith(".jpg"):
                 dprint(__name__, 1, "serving *.jpg: "+self.path)
                 f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                 self.send_response(200)
                 self.send_header('Content-type', 'image/jpeg')
                 self.end_headers()
                 self.wfile.write(f.read())
                 f.close()
                 return
             
             # serve "*.png" - only png's support transparent colors
             if self.path.endswith(".png"):
                 dprint(__name__, 1, "serving *.png: "+self.path)
                 f = open(sys.path[0] + sep + "assets" + self.path, "rb")
                 self.send_response(200)
                 self.send_header('Content-type', 'image/png')
                 self.end_headers()
                 self.wfile.write(f.read())
                 f.close()
                 return
             
             # get everything else from XMLConverter - formerly limited to trailing "/" and &PlexConnect Cmds
             if True:
                 dprint(__name__, 1, "serving .xml: "+self.path)
                 XML = XMLConverter.XML_PMS2aTV(self.client_address, self.path, options)
                 self.send_response(200)
                 self.send_header('Content-type', 'text/html')
                 self.end_headers()
                 self.wfile.write(XML)
                 return
             
             """
             # unexpected request
             self.send_error(403,"Access denied: %s" % self.path)
             """
         
         else:
             self.send_error(403,"Not Serving Client %s" % self.client_address[0])
     except IOError:
         self.send_error(404,"File Not Found: %s" % self.path)