source: server/lib/gutenbach/server/player.py @ c94fa32

no-cups
Last change on this file since c94fa32 was c94fa32, checked in by Quentin Smith <quentin@…>, 12 years ago

Clean up mplayer command line, and log it

  • Property mode set to 100644
File size: 3.8 KB
RevLine 
[eee389a]1import logging
2import threading
3import subprocess
4import time
5
6# initialize logger
7logger = logging.getLogger(__name__)
8
9class Player(threading.Thread):
10
11    def __init__(self, fh, *args, **kwargs):
12        self.lock = threading.RLock()
13
14        with self.lock:
15            super(Player, self).__init__(*args, **kwargs)
16            self.fh = fh
17            self.player = None
18            self._callback = None
[345c476]19            self._paused = False
[2620618]20            self._done = False
21            self._dryrun = False
22            self._dryrun_time = 0.5
[adf8cf0]23            self._lag = 0.01
[eee389a]24
25    @property
26    def is_playing(self):
27        with self.lock:
[2620618]28            if self._dryrun:
29                playing = self.isAlive() and not self.is_done
30            else:
31                playing = self.isAlive() and \
32                          not self.is_done and \
33                          self.player is not None and \
34                          self.player.poll() is None
[eee389a]35        return playing
36
37    @property
[345c476]38    def is_paused(self):
39        with self.lock:
40            paused = self.is_playing and self._paused
41        return paused
42
43    @property
44    def is_done(self):
[2620618]45        return self._done
[345c476]46
47    @property
[eee389a]48    def callback(self):
49        return self._callback
50    @callback.setter
51    def callback(self, val):
52        with self.lock:
53            self._callback = val
54
[adf8cf0]55    def start(self):
56        super(Player, self).start()
57        time.sleep(self._lag)
58
[eee389a]59    def run(self):
60        if self.fh is None:
61            raise ValueError, "file handler is None"
62       
63        logger.info("playing file '%s'" % self.fh.name)
[b8c3505]64
65        with self.lock:
66            self._paused = False
67            self._done = False
[2620618]68
[c94fa32]69        command = "/usr/bin/mplayer -really-quiet -slave".split()+[self.fh.name]
70        logger.info("Running %r", command)
71
[2620618]72        if self._dryrun:
73            step = 0.01
74            while self._dryrun_time > 0:
75                time.sleep(step)
76                self._dryrun_time -= step
77                while self.is_paused:
78                    time.sleep(0.01)
[b8c3505]79
80        else:
81            # open mplayer
[c94fa32]82
[eee389a]83            with self.lock:
[b8c3505]84                self.player = subprocess.Popen(
[c94fa32]85                    command,
[b8c3505]86                    stdin=subprocess.PIPE,
87                    stderr=subprocess.PIPE,
88                    stdout=subprocess.PIPE)
89
90            # wait for mplayer to finish
91            while True:
92                with self.lock:
93                    playing = self.is_playing
94                if not playing:
95                    break
96                time.sleep(0.1)
[345c476]97
[b8c3505]98            logger.info("mplayer finished with code %d" % self.player.returncode)
[2620618]99       
[b8c3505]100            # get output from mplayer and log it
101            with self.lock:
102                stderr = self.player.stderr.read()
103                stdout = self.player.stdout.read()
[eee389a]104           
[b8c3505]105            if stderr.strip() != "":
106                logger.error(stderr)
107            if stdout.strip() != "":
108                logger.debug(stdout)
109
110        with self.lock:
111            if self.callback:
112                self.callback()
113            self._done = True
[eee389a]114
115    def mplayer_pause(self):
116        with self.lock:
117            if self.is_playing:
[2620618]118                if not self._dryrun:
119                    self.player.stdin.write("pause\n")
[345c476]120                self._paused = not(self._paused)
[2620618]121                logger.info("paused: %s", self.is_paused)
122            else:
123                logger.warning("trying to pause non-playing job")
[adf8cf0]124        time.sleep(self._lag)
[eee389a]125               
126    def mplayer_stop(self):
127        with self.lock:
128            if self.is_playing:
[2620618]129                if not self._dryrun:
130                    self.player.stdin.write("quit\n")
131                else:
132                    self._dryrun_time = 0.0
133                logger.info("stopped")
134            else:
135                logger.warning("trying to stop non-playing job")
[b8c3505]136        self.join()
Note: See TracBrowser for help on using the repository browser.