/[svn.andrew.net.au]/mythtvdotpy/MythTV/Frontend.py
ViewVC logotype

Diff of /mythtvdotpy/MythTV/Frontend.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 9 by apollock, Mon Nov 6 18:14:46 2006 UTC revision 10 by apollock, Mon Nov 6 18:54:11 2006 UTC
# Line 3  Line 3 
3  import socket  import socket
4  import datetime  import datetime
5    
6    class FrontendNotReady(Exception):
7            pass
8    
9    
10    class FrontendCmdFailure(Exception):
11            pass
12    
13    
14  class Frontend:  class Frontend:
15          """Class for operating on a MythTV frontend"""          """Class for operating on a MythTV frontend"""
16    
# Line 11  class Frontend: Line 19  class Frontend:
19                  self.port = port                  self.port = port
20                  self.ready = False                  self.ready = False
21                  self.socket = None                  self.socket = None
22                    # We might as well raise an exception at instantiation if
23                    # the frontend is unavailable
24                    self._connect()
25    
26    
27          def _connect(self):          def _connect(self):
28                  """Create a connection to the frontend"""                  """Create a connection to the frontend"""
29    
30                  self.socket = socket.socket()                  self.socket = socket.socket()
31                  self.socket.connect((self.host, self.port))                  try:
32                            self.socket.connect((self.host, self.port))
33                    except socket.error:
34                            raise FrontendNotReady("Unable to connect to frontend")
35                  if self.socket.recv(4096).splitlines()[-1] == '# ':                  if self.socket.recv(4096).splitlines()[-1] == '# ':
36                          self.ready = True                          self.ready = True
37    
# Line 25  class Frontend: Line 39  class Frontend:
39          def _sendcmd(self, cmd):          def _sendcmd(self, cmd):
40                  """Send a command to the frontend"""                  """Send a command to the frontend"""
41    
42                  #TODO(apollock): raise an exception if not ready                  self._connect()
43                  if self.ready:                  if self.ready:
44                          self.socket.send("%s\r\n" % cmd)                          self.socket.send("%s\r\n" % cmd)
45                          return self.socket.recv(4096).splitlines()                          return self.socket.recv(4096).splitlines()
# Line 34  class Frontend: Line 48  class Frontend:
48          def location(self):          def location(self):
49                  """Return what location the front end is currently in"""                  """Return what location the front end is currently in"""
50    
                 location = {}  
                 self._connect()  
51                  result = self._sendcmd("query location")[0].split(" ")                  result = self._sendcmd("query location")[0].split(" ")
52                  #TODO(apollock): convert date and time to something other                  location = Location()
53                  # than a string                  location.where = result[0]
54                  # Maybe return a location object instead?                  if location.where == 'Playback':
55                            location.program = ProgramInfo()
56                  location['where'] = result[0]                          location.program.what = result[1]
57                            location.program.position = result[2]
58                  if location['where'] == 'Playback':                          location.program.length = result[4]
59                          location['what'] = result[1]                          location.program.speed = result[5]
60                          location['position'] = result[2]                          location.program.chanid = result[6]
                         location['length'] = result[4]  
                         location['speed'] = result[5]  
                         location['chanid'] = result[6]  
61                          recdate = result[7].split("T")[0].split("-")                          recdate = result[7].split("T")[0].split("-")
62                          location['recdate'] = datetime.date(int(recdate[0]), int(recdate[1]), int(recdate[2]))                          location.program.recdate = datetime.date(int(recdate[0]), int(recdate[1]), int(recdate[2]))
63                          rectime = result[7].split("T")[1].split(":")                          rectime = result[7].split("T")[1].split(":")
64                          location['rectime'] = datetime.time(int(rectime[0]), int(rectime[1]), int(rectime[2]))                          location.program.rectime = datetime.time(int(rectime[0]), int(rectime[1]), int(rectime[2]))
65                          if location['what'] == 'Recorded':                          if location.program.what == 'Recorded':
66                                  location['title'] = self.recording(location['chanid'], location['recdate'].isoformat(), location['rectime'].isoformat())                                  try:
67                  elif location['where'] == 'PlaybackBox':                                          location.program.title = self.recording(location.program.chanid, location.program.recdate.isoformat(), location.program.rectime.isoformat())
68                                    except FrontendNotReady:
69                                            location.program.title = None
70                    elif location.where == 'PlaybackBox':
71                          pass                          pass
72                  elif location['where'] == 'MainMenu':                  elif location.where == 'MainMenu':
73                          pass                          pass
74    
75                  return location                  return location
# Line 66  class Frontend: Line 78  class Frontend:
78          def recording(self, chanid, recdate, rectime):          def recording(self, chanid, recdate, rectime):
79                  """Returns recording information for a specified recording"""                  """Returns recording information for a specified recording"""
80    
                 self._connect()  
81                  result = self._sendcmd("query recording %s %sT%s" %                  result = self._sendcmd("query recording %s %sT%s" %
82                          (chanid, recdate, rectime))[0].split(" ")                          (chanid, recdate, rectime))[0].split(" ")
83    
# Line 76  class Frontend: Line 87  class Frontend:
87          def pause(self):          def pause(self):
88                  """Pauses the playback"""                  """Pauses the playback"""
89    
                 self._connect()  
90                  result = self._sendcmd("play speed pause")[0]                  result = self._sendcmd("play speed pause")[0]
91                  if result != "OK":                  if result != "OK":
92                          #TODO(apollock): raise some sort of exception                          #TODO(apollock): raise some sort of exception
93                          pass                          raise FrontendCmdFailure("Frontend said '%s' in response to 'play speed pause' command" % result)
94    
95    
96          def play(self):          def play(self):
97                  """Resumes playback"""                  """Resumes playback"""
                 self._connect()  
98                  result = self._sendcmd("play speed normal")[0]                  result = self._sendcmd("play speed normal")[0]
99                  if result != "OK":                  if result != "OK":
100                          #TODO(apollock): raise some sort of exception                          raise FrontendCmdFailure("Frontend said '%s' in response to 'play speed normal' command" % result)
101                          pass  
102    
103            def isPaused(self):
104                    """Returns if the the frontend is paused or not"""
105                    loc1 = self.location()
106                    if loc1.where != 'Playback':
107                            return False
108                    else:
109                            loc2 = self.location()
110                            if loc2.where != 'Playback':
111                                    return False
112                            else:
113                                    return loc1.program.position == loc2.program.position
114    
115    
116    class Location:
117            """Container for where the frontend currently is"""
118    
119            def __init__(self):
120                    self.program = None
121                    self.where = None
122    
123    
124    class ProgramInfo:
125            """Container for program information"""
126    
127            def __init__(self):
128                    pass

Legend:
Removed from v.9  
changed lines
  Added in v.10

  ViewVC Help
Powered by ViewVC 1.1.22