source: server/lib/gutenbach/server/player.py @ 345c476

no-cups
Last change on this file since 345c476 was 345c476, checked in by Jessica B. Hamrick <jhamrick@…>, 12 years ago

Make status handling better in job.py

  • Property mode set to 100644
File size: 2.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
21    @property
22    def is_playing(self):
23        with self.lock:
24            playing = self.player and self.player.poll() is None
25        return playing
26
27    @property
28    def is_paused(self):
29        with self.lock:
30            paused = self.is_playing and self._paused
31        return paused
32
33    @property
34    def is_done(self):
35        with self.lock:
36            done = self.player and self.player.poll() is not None
37        return done
38
39    @property
40    def callback(self):
41        return self._callback
42    @callback.setter
43    def callback(self, val):
44        with self.lock:
45            self._callback = val
46
47    def run(self):
48        if self.fh is None:
49            raise ValueError, "file handler is None"
50       
51        self.mplayer_play()
52        with self.lock:
53            if self.callback:
54                self.callback()
55
56    def mplayer_play(self):
57        if not self.isAlive():
58            return
59       
60        logger.info("playing file '%s'" % self.fh.name)
61        self._paused = False
62       
63        # open mplayer
64        with self.lock:
65            self.player = subprocess.Popen(
66                "/usr/bin/mplayer -really-quiet -slave %s" % self.fh.name,
67                shell=True,
68                stdin=subprocess.PIPE,
69                stderr=subprocess.PIPE,
70                stdout=subprocess.PIPE)
71
72        # wait for mplayer to finish
73        while True:
74            with self.lock:
75                playing = self.is_playing
76            if not playing:
77                break
78            time.sleep(0.1)
79
80        logger.info("mplayer finished with code %d" % self.player.returncode)
81
82        # get output from mplayer and log it
83        with self.lock:
84            stderr = self.player.stderr.read()
85            stdout = self.player.stdout.read()
86           
87        if stderr.strip() != "":
88            logger.error(stderr)
89        if stdout.strip() != "":
90            logger.debug(stdout)
91
92    def mplayer_pause(self):
93        if not self.isAlive():
94            return
95       
96        with self.lock:
97            if self.is_playing:
98                self.player.stdin.write("pause\n")
99                self._paused = not(self._paused)
100               
101    def mplayer_stop(self):
102        if not self.isAlive():
103            return
104       
105        with self.lock:
106            if self.is_playing:
107                self.player.stdin.write("quit\n")
Note: See TracBrowser for help on using the repository browser.