Package elisa :: Package plugins :: Package base :: Package views :: Module player_view
[hide private]
[frames] | no frames]

Source Code for Module elisa.plugins.base.views.player_view

  1  # -*- coding: utf-8 -*- 
  2  # Elisa - Home multimedia server 
  3  # Copyright (C) 2006-2008 Fluendo Embedded S.L. (www.fluendo.com). 
  4  # All rights reserved. 
  5  # 
  6  # This file is available under one of two license agreements. 
  7  # 
  8  # This file is licensed under the GPL version 3. 
  9  # See "LICENSE.GPL" in the root of this distribution including a special 
 10  # exception to use Elisa with Fluendo's plugins. 
 11  # 
 12  # The GPL part of Elisa is also available under a commercial licensing 
 13  # agreement from Fluendo. 
 14  # See "LICENSE.Elisa" in the root directory of this distribution package 
 15  # for details on that license. 
 16   
 17   
 18  __maintainer__ = 'Florian Boucault <florian@fluendo.com>' 
 19  __maintainer2__ = 'Philippe Normand <philippe@fluendo.com>' 
 20   
 21   
 22  from elisa.base_components.view import View 
 23  from elisa.core import common 
 24  from elisa.core import player 
 25  from twisted.internet import reactor, defer 
 26  import gst 
 27  import os 
 28   
29 -class PlayerView(View):
30 """ 31 This class implements a view which can create a 32 Player instance and manage it. 33 This class can be inherited to provide the 34 toolkit dependent display, as well as the 35 GStreamer video and audio sinks 36 """ 37 38 supported_controllers = ('base:player_controller',) 39
40 - def __init__(self):
43
44 - def initialize(self):
50
51 - def _is_playing(self, message, sender):
52 if sender == self.player: 53 self.player.volume = self.controller.model.volume 54 self.controller.model.state = player.STATES.PLAYING
55
56 - def _error(self, message, sender):
57 self._stopped(message, sender)
58
59 - def _stopped(self, message, sender):
60 if sender == self.player: 61 if self.controller.model.state != player.STATES.STOPPED: 62 self.controller.model.state = player.STATES.STOPPED
63
64 - def attribute_set(self, origin, key, old_value, new_value):
65 super(PlayerView, self).attribute_set(origin, key, old_value, new_value) 66 self.debug("attribute %r set to %r", key, new_value) 67 if key == 'state': 68 69 if new_value == player.STATES.PLAYING: 70 self.player.volume = self.controller.model.volume 71 self.state_changed(new_value) 72 self.player.play() 73 elif new_value == player.STATES.PAUSED: 74 self.state_changed(new_value) 75 self.player.pause() 76 elif new_value == player.STATES.STOPPED: 77 self.state_changed(new_value) 78 if self.player.state != player.STATES.STOPPED: 79 self.player.stop() 80 elif key == 'uri': 81 self.player.uri = new_value 82 self.uri_changed(new_value) 83 elif key == 'seek_to': 84 self.seek_to_changed(new_value) 85 elif key == 'volume': 86 self.volume_changed(new_value) 87 elif key == 'muted': 88 self.player.muted = new_value 89 elif key == 'pause_requested': 90 self.pause_requested_changed(new_value) 91 elif key == 'focused': 92 self.focused_changed(new_value) 93 elif key == 'media_type': 94 self.media_type_changed(new_value)
95
96 - def media_type_changed(self, media_type):
97 if media_type and self.player.uri: 98 self._update_subtitle(self.player.uri)
99
100 - def state_changed(self, state):
101 self.player.volume = self.controller.model.volume 102 if self.controller.model.muted: 103 self.player.muted = True 104 else: 105 self.player.muted = False 106 107 self.controller.model.duration = self.player.duration 108 self._update_model_position()
109
110 - def _update_model_position(self):
111 if self.controller.model.duration != self.player.duration: 112 self.controller.model.duration = self.player.duration 113 self.controller.model.position = self.player.position 114 if self.controller.model.state == player.STATES.PLAYING: 115 reactor.callLater(0.5, self._update_model_position)
116
117 - def uri_changed(self, uri):
118 pass
119
120 - def pause_requested_changed(self, value):
121 pass
122
123 - def volume_changed(self, value):
124 self.player.volume = value
125
126 - def seek_to_changed(self, position):
128
129 - def controller_changed(self, old_controller, new_controller):
130 state = self.controller.state 131 if state == player.STATES.PLAYING: 132 self.player.play() 133 elif state == player.STATES.PAUSED: 134 self.player.pause() 135 elif state == player.STATES.STOPPED: 136 self.player.stop()
137
138 - def _update_subtitle(self, uri):
139 """ 140 We only support text 141 """ 142 self.player.subtitle_uri = None 143 144 SUBTITLE_FORMATS = ("asc", "txt", "srt", "smi", "ssa") 145 146 if uri and self.controller.model.media_type == 'video': 147 self.debug("Searching subtitles for %s", uri) 148 149 media_manager = common.application.media_manager 150 filename = uri.filename 151 try: 152 ext_index = filename.index(uri.extension) 153 except ValueError: 154 # extension given but not found 155 self.debug("Extension of %r not found, skipping subtitles "\ 156 " detection", uri) 157 else: 158 basename = uri.filename[:ext_index-1] 159 parent = uri.parent 160 161 def got_children(children, uri): 162 found = False 163 for child_uri, metadata in children: 164 child_basename, dummy = os.path.splitext(child_uri.filename) 165 if child_basename == basename and \ 166 child_uri.extension in SUBTITLE_FORMATS: 167 self.player.subtitle_uri = child_uri 168 self.info("Found subtitles in file: %s", child_uri) 169 found = True 170 break 171 if not found: 172 self.info("No subtitles found for %r", uri)
173 174 dfr = media_manager.get_direct_children(uri.parent, []) 175 dfr.addCallback(got_children, uri.parent)
176