我正在尝试使用用户空间中的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 somefilename
或gedit somefilename
时,如果link
对应于文本文件,则效果很好。但是,如果链接是音乐文件,当我尝试调用vlc somefilename
时,vlc会播放该歌曲几秒钟然后崩溃。
如何修改read()
功能以使其适用于媒体文件。?