Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Streaming files with cherrypy

I am trying to stream a video file using cherrypy. When I go to localhost:8080/stream?video=video.avi it starts downloading, but after a few seconds it just "completes" the download no matter how large the file is. I'm rather new to this and cannot find out why it is doing that. Also, why doesn't it even recognize the file if it is Matroska (.mkv) ?

Here is my Stream class:

class Stream(object):

    @cherrypy.expose
    def default(self, video=None):
        BASE_PATH = ".."
        video = os.path.join(BASE_PATH, video)
        if video == None:
            return "no file specified!"
        if not os.path.exists(video):
            return "file not found!"
        f = open(video)
        size = os.path.getsize(video)
        mime = mimetypes.guess_type(video)[0]
        print(mime)
        cherrypy.response.headers["Content-Type"] = mime
        cherrypy.response.headers["Content-Disposition"] = 'attachment; filename="%s"' % os.path.basename(video)
        cherrypy.response.headers["Content-Length"] = size

        BUF_SIZE = 1024 * 5

        def stream():
            data = f.read(BUF_SIZE)
            while len(data) > 0:
                yield data
                data = f.read(BUF_SIZE)

        return stream()
    default._cp_config = {'response.stream': True}
like image 370
Urho Avatar asked Nov 03 '22 22:11

Urho


1 Answers

I realised that all I needed to do was to change open(video) to open(video, 'rb') so that it would read the file in binary mode. After that the file downloaded completely and worked.

like image 103
Urho Avatar answered Nov 15 '22 04:11

Urho