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
Line 
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
19            self._paused = False
20            self._done = False
21            self._dryrun = False
22            self._dryrun_time = 0.5
23            self._lag = 0.01
24
25    @property
26    def is_playing(self):
27        with self.lock:
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
35        return playing
36
37    @property
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):
45        return self._done
46
47    @property
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
55    def start(self):
56        super(Player, self).start()
57        time.sleep(self._lag)
58
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)
64
65        with self.lock:
66            self._paused = False
67            self._done = False
68
69        command = "/usr/bin/mplayer -really-quiet -slave".split()+[self.fh.name]
70        logger.info("Running %r", command)
71
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)
79
80        else:
81            # open mplayer
82
83            with self.lock:
84                self.player = subprocess.Popen(
85                    command,
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)
97
98            logger.info("mplayer finished with code %d" % self.player.returncode)
99       
100            # get output from mplayer and log it
101            with self.lock:
102                stderr = self.player.stderr.read()
103                stdout = self.player.stdout.read()
104           
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
114
115    def mplayer_pause(self):
116        with self.lock:
117            if self.is_playing:
118                if not self._dryrun:
119                    self.player.stdin.write("pause\n")
120                self._paused = not(self._paused)
121                logger.info("paused: %s", self.is_paused)
122            else:
123                logger.warning("trying to pause non-playing job")
124        time.sleep(self._lag)
125               
126    def mplayer_stop(self):
127        with self.lock:
128            if self.is_playing:
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")
136        self.join()
Note: See TracBrowser for help on using the repository browser.