morphbr@718: import os morphbr@718: import subprocess morphbr@718: import fcntl morphbr@718: morphbr@718: import lib.utils as utils morphbr@718: import lib.server as server morphbr@718: morphbr@718: from select import select morphbr@718: morphbr@718: def _setup_mythfilename(self): morphbr@718: # mythtv:mythtv@192.168.3.110:6543/1002_20070426230000.nuv morphbr@718: try: morphbr@718: _mysql = self.args["input"].split("@")[0].split(":") morphbr@718: except IndexError, e: morphbr@718: _mysql = ["mythtv", "mythtv"] morphbr@718: morphbr@718: try: morphbr@718: _args = self.args["input"].split("@")[1].split(":") morphbr@718: except IndexError, e: morphbr@718: _args = self.args["input"].split(":") morphbr@718: morphbr@718: gmyth_dict = {} morphbr@718: gmyth_dict["mysql"] = _mysql morphbr@718: gmyth_dict["backend"] = _args[0] morphbr@718: gmyth_dict["port"] = _args[1].split("/", 1)[0] morphbr@718: morphbr@718: _tmp_file = _args[1].split("/", 1)[1] morphbr@718: morphbr@718: if _tmp_file.find("channel") >= 0: morphbr@718: gmyth_dict["kind"] = "c" morphbr@718: gmyth_dict["cfile"] = _tmp_file.split("=")[1] morphbr@718: else: morphbr@718: gmyth_dict["kind"] = "f" morphbr@718: gmyth_dict["cfile"] = _tmp_file morphbr@718: morphbr@718: self.args["input"] = "-" morphbr@718: return gmyth_dict morphbr@718: # _setup_mythfilename morphbr@718: morphbr@718: def _setup_mythfile(err): morphbr@718: size = err.readline().split("Size:")[1] morphbr@718: flags = fcntl.fcntl (err, fcntl.F_GETFL, 0) | os.O_NONBLOCK morphbr@718: fcntl.fcntl(err, fcntl.F_SETFL, flags) morphbr@718: return size morphbr@718: # _setup_mythfile morphbr@718: morphbr@718: def _setup_gmythcat(self): morphbr@718: gmyth_cat = utils.which("gmyth-cat") morphbr@718: if self.args.has_key("gmyth-cat"): morphbr@718: return [ utils.which("gmyth-cat"), morphbr@718: "-h", self.args["gmyth-cat"]["backend"], morphbr@718: "-p", self.args["gmyth-cat"]["port"], morphbr@718: "-" + self.args["gmyth-cat"]["kind"], morphbr@718: self.args["gmyth-cat"]["cfile"] morphbr@718: ] morphbr@718: else: morphbr@718: self.log.error(self.tid, "URI error") morphbr@718: return [] morphbr@718: # _setup_gmythcat morphbr@718: morphbr@718: def start_myth(self, outfd): morphbr@718: opts = _setup_gmythcat(self) morphbr@718: try: morphbr@718: self.gmyth = subprocess.Popen(opts, stdout=subprocess.PIPE, morphbr@718: stderr=subprocess.PIPE, morphbr@718: close_fds=True) morphbr@718: except Exception, e: morphbr@718: self.log.error(self.tid, "Error executing gmyth-cat: %s" % e) morphbr@718: return False morphbr@718: morphbr@718: if not self._run_mencoder(input=self.gmyth.stdout, morphbr@718: output=subprocess.PIPE): morphbr@718: return False morphbr@718: morphbr@718: if self.args["gmyth-cat"]["kind"] == "f": morphbr@718: try: morphbr@718: size = _setup_mythfile(self.gmyth.stderr) morphbr@718: self.log.debug(self.tid, "Size of file: %s" % size) morphbr@718: except Exception, e: morphbr@718: self.log.error(self.tid, "Problems getting size of file: %s" % e) morphbr@718: return False morphbr@718: morphbr@718: try: morphbr@718: while self.proc and self.proc.poll() == None: morphbr@718: r, w, x = select([self.gmyth.stderr, self.proc.stdout], morphbr@718: [], [], 0) morphbr@718: if self.proc.stdout in r: morphbr@718: d = self.proc.stdout.read(4096) morphbr@718: outfd.write(d) morphbr@718: morphbr@718: if self.gmyth.stderr in r: morphbr@718: partial = self.gmyth.stderr.read(50).split("\n")[-2] morphbr@718: if partial != "": morphbr@718: self.status = utils.progress_bar(self.log, morphbr@718: int(partial), morphbr@718: int(size), 50) morphbr@718: morphbr@718: except IndexError, e: morphbr@718: pass morphbr@718: except Exception, e: morphbr@718: self.log.error(self.tid, "Problems handling data: %s" % e) morphbr@718: return False morphbr@718: morphbr@718: self.log.info(self.tid, "Finished sending data") morphbr@718: return True morphbr@718: # _start_myth()