FUSE中的文件流

时间:2014-04-01 10:48:47

标签: python streaming fuse

我正在尝试使用用户空间中的Filesystem在远程文件(媒体)上实现流操作。 我正在使用python-fuse。我有一个远程文件link =http://somelink的链接。我知道文件的大小,并将该大小分配给Stat参数。

我有使用range header从远程文件中读取特定字节的代码。

import urllib2

class HttpFile(object):
    def __init__(self, url):
        self.url = url
        self.offset = 0
        self._size = -1

    def size(self):
        if self._size < 0:
            f = urllib2.urlopen(self.url)
            self._size = int(f.headers["Content-length"])
        return self._size

    def read(self, count=-1):
        req = urllib2.Request(self.url)
        if count < 0:
            end = self.size() - 1
        else:
            end = self.offset + count - 1
        req.headers['Range'] = "bytes=%s-%s" % (self.offset, end)
        f = urllib2.urlopen(req)
        data = f.read()
        # FIXME: should check that we got the range expected, etc.
        chunk = len(data)
        print chunk, count
        if count >= 0:
            assert chunk <= count
        self.offset += chunk
        return data

    def seek(self, offset, whence=0):
        if whence == 0:
            self.offset = offset
        elif whence == 1:
            self.offset += offset
        elif whence == 2:
            self.offset = self.size() + offset
        else:
            raise Exception("Invalid whence")

现在处于FUSE的open操作中。我创建了一个HttpFile的对象:

def open(self, path, flags):
        self.h = HttpFile(link)

我编写了一个read操作来返回所需的字节[offset,size]

def read(self, path, size, offset):
        self.h.seek(offset,whence=0)
        x=self.h.read(size)
        return x

当我挂载此文件系统并调用cat somefilenamegedit somefilename时,如果link对应于文本文件,则效果很好。但是,如果链接是音乐文件,当我尝试调用vlc somefilename时,vlc会播放该歌曲几秒钟然后崩溃。

如何修改read()功能以使其适用于媒体文件。?

0 个答案:

没有答案