示例#1
0
    def track(self, track_id, duration, **kwargs):
        # Check sanity of the request
        self._check_request()

        # Calculate file size, and obtain the header
        duration = int(duration)
        wave_header, filesize = create_wave_header(duration)
        request_range = cherrypy.request.headers.get('Range', '')
        range_l = 0
        range_r = filesize

        # headers
        if request_range and request_range != "bytes=0-":
            # partial request
            cherrypy.response.status = '206 Partial Content'
            cherrypy.response.headers['Content-Type'] = 'audio/x-wav'
            range = cherrypy.request.headers["Range"].split("bytes=")[1].split("-")
            range_l = int(range[0])
            try:
                range_r = int(range[1])
            except:
                range_r = filesize
            chunk = range_r - range_l
            cherrypy.response.headers['Accept-Ranges'] = 'bytes'
            cherrypy.response.headers['Content-Length'] = chunk
            cherrypy.response.headers['Content-Range'] = "bytes %s-%s/%s" % (range_l, range_r, filesize)
        else:
            # full file
            cherrypy.response.headers['Content-Type'] = 'audio/x-wav'
            cherrypy.response.headers['Accept-Ranges'] = 'bytes'
            cherrypy.response.headers['Content-Length'] = filesize

        # If method was GET, write the file content
        if cherrypy.request.method.upper() == 'GET':
            return self.send_audio_stream(track_id, filesize, wave_header, range_l)
示例#2
0
 def silence(self, duration, **kwargs):
     '''stream silence audio for the given duration, used by spotify connect player'''
     duration = float(duration)
     wave_header, filesize = create_wave_header(duration)
     output_buffer = BytesIO()
     output_buffer.write(wave_header)
     output_buffer.write(bytes('\0' * (filesize - output_buffer.tell()), 'utf-8'))
     return cherrypy.lib.static.serve_fileobj(output_buffer.read(), content_type="audio/wav", name="%s.wav" % duration, debug=True)
示例#3
0
 def silence(self, duration, **kwargs):
     '''stream silence audio for the given duration, used by spotify connect player'''
     duration = int(duration)
     wave_header, filesize = create_wave_header(duration)
     output_buffer = StringIO()
     output_buffer.write(wave_header)
     output_buffer.write('\0' * (filesize - output_buffer.tell()))
     return cherrypy.lib.static.serve_fileobj(output_buffer, content_type="audio/wav",
                                              name="%s.wav" % duration, filesize=output_buffer.tell())
示例#4
0
    def track(self, track_id, duration, **kwargs):
        # Check sanity of the request
        self._check_request()

        # Calculate file size, and obtain the header
        duration = int(float(duration))
        wave_header, filesize = create_wave_header(duration)
        request_range = cherrypy.request.headers.get('Range', '')
        # response timeout must be at least the duration of the track: read/write loop
        # checks for timeout and stops pushing audio to player if it occurs
        cherrypy.response.timeout = int(math.ceil(duration * 1.5))

        range_l = 0
        range_r = filesize

        # headers
        if request_range and request_range != "bytes=0-":
            # partial request
            cherrypy.response.status = '206 Partial Content'
            cherrypy.response.headers['Content-Type'] = 'audio/x-wav'
            range = cherrypy.request.headers["Range"].split("bytes=")[1].split(
                "-")
            log_msg(
                "request header range: %s" %
                (cherrypy.request.headers['Range']), xbmc.LOGDEBUG)
            range_l = int(range[0])
            try:
                range_r = int(range[1])
            except:
                range_r = filesize

            cherrypy.response.headers['Accept-Ranges'] = 'bytes'
            cherrypy.response.headers['Content-Length'] = filesize
            cherrypy.response.headers['Content-Range'] = "bytes %s-%s/%s" % (
                range_l, range_r, filesize)
            log_msg(
                "partial request range: %s, length: %s" %
                (cherrypy.response.headers['Content-Range'],
                 cherrypy.response.headers['Content-Length']), xbmc.LOGDEBUG)
        else:
            # full file
            cherrypy.response.headers['Content-Type'] = 'audio/x-wav'
            cherrypy.response.headers['Accept-Ranges'] = 'bytes'
            cherrypy.response.headers['Content-Length'] = filesize
            log_msg("!! Full File. Size : %s " % (filesize), xbmc.LOGDEBUG)

        # If method was GET, write the file content
        if cherrypy.request.method.upper() == 'GET':
            return self.send_audio_stream(track_id, filesize, wave_header,
                                          range_l)