class DaapSource(gst.BaseSrc): __gsttemplates__ = ( gst.PadTemplate("src", gst.PAD_SRC, gst.PAD_ALWAYS, gst.caps_new_any()), ) __gstdetails__ = ("DAAP plugin", "Foo/Bar", "Read data on DAAP shares", "Philippe Normand ") blocksize = 4096 fd = None def __init__(self, name): self.__gobject_init__() self.curoffset = 0 self._libs = {} self.cnx = daap.DAAPClient() self.set_name(name) def get_library(self, host, port): if (host, port) not in self._libs: self.cnx.connect(host, port) session = self.cnx.login() library = session.library() self._libs[(host, port)] = library return self._libs.get((host, port)) def set_property(self, name, value): if name == 'uri': parsed = media_uri.Uri(value).get_parts() port = int(parsed['port'] or '3689') library = self.get_library(parsed['host'], port) track_id = int(parsed['params'].get('id','1')) track = [ t for t in library.tracks() if t.id == track_id ][0] self.fd = track.request() def do_create(self, offset, size): ## if offset != self.curoffset: ## self.fd.seek(offset, 0) data = self.fd.read(self.blocksize) if data: self.curoffset += len(data) return gst.FLOW_OK, gst.Buffer(data) else: return gst.FLOW_UNEXPECTED, None gobject.type_register(DaapSource) r = gst.element_register(type=DaapSource, elementname="daapsrc", rank=gst.RANK_PRIMARY)