12 _moduleLogger = logging.getLogger(__name__)
17 def __init__(self, ui):
18 self.storage = FileStorage.FileStorage(path = constants._data_path_)
19 if hildonize.IS_HILDON_SUPPORTED and not hildonize.IS_FREMANTLE_SUPPORTED:
20 import SimpleOSSOPlayer as _SimplePlayer
21 SimplePlayer = _SimplePlayer # silence PyFlakes
23 import SimpleGStreamer as SimplePlayer
24 self.player = SimplePlayer.SimplePlayer(self.next_chapter)
30 def get_books_path(self):
33 def reload(self, booksPath):
34 if self.audiobook is not None:
35 position = self.player.elapsed()
36 self.storage.set_time(self.audiobook.current_chapter, position)
40 def load(self, booksPath):
41 _moduleLogger.info("Loading books from %s" % booksPath)
43 self._bookDir = booksPath
45 self._bookPaths = dict(
46 (self.__format_name(bookPath), bookPath)
47 for bookPath in self._find_books()
49 if self.ui is not None:
50 bookPaths = self._bookPaths.values()
52 self.ui.set_books(bookPaths)
54 lastBookName = self.storage.get_selected()
55 if lastBookName is not None:
56 _moduleLogger.info("continuing book: %s" % lastBookName)
58 bookPath = self._bookPaths[lastBookName]
59 self.set_book(bookPath)
61 _moduleLogger.exception("Audiobook was not found")
63 _moduleLogger.exception("Chapter was not found")
65 _moduleLogger.exception("Audiobook could not be loaded")
67 _moduleLogger.exception("Can you say 'confusion'?")
70 position = self.player.elapsed()
71 if self.audiobook is not None:
72 self.storage.set_time(self.audiobook.current_chapter, position)
76 def __format_name(path):
77 if os.path.isfile(path):
78 return os.path.basename(path).rsplit(".", 1)[0]
80 return os.path.basename(path)
82 def set_book(self, bookPath):
83 oldBookName = self.storage.get_selected()
85 bookName = self.__format_name(bookPath)
86 self.storage.select_book(bookName)
87 chapter_num, _ = self.storage.get_time()
88 self.audiobook = Audiobook.Audiobook(
93 self.storage.select_book(oldBookName)
96 # self.player.set_file(self.audiobook.get_current_chapter())
97 # self.player.seek_time(time)
99 if self.ui is not None:
100 self.ui.set_book(bookPath, self.audiobook.get_cover_img())
101 self.ui.set_chapters(self.audiobook.chapters)
103 chapter_title = self.audiobook.chapters[self.audiobook.current_chapter]
104 self.set_chapter(chapter_title, True)
106 def set_chapter(self, chapter, continuing = False):
107 _moduleLogger.info("set chapter:" + chapter + " : Continuing: " + str(continuing))
108 self.audiobook.set_chapter(chapter)
109 self.player.set_file(self.audiobook.get_current_chapter())
111 self.storage.set_time(self.audiobook.current_chapter, 0)
113 if self.ui is not None:
114 self.ui.set_chapter(self.audiobook.current_chapter)
116 def previous_chapter(self, *args):
117 _moduleLogger.info("Going back a chapter")
119 next_file = self.audiobook.get_previous_chapter()
120 if next_file is not False:
121 self.set_chapter(next_file)
123 else: # the book is over
124 self.storage.set_time(0, 0)
126 def next_chapter(self, *args):
127 _moduleLogger.info("Advancing a chapter")
129 next_file = self.audiobook.get_next_chapter()
130 if next_file is not False:
131 self.set_chapter(next_file)
133 else: # the book is over
134 self.storage.set_time(0, 0)
137 if self.audiobook is not None:
139 _, target_time = self.storage.get_time()
142 self.player.seek_time(target_time)
143 #print self.player.elapsed()
145 print "No book selected, find one in ", self._bookDir
148 position = self.player.elapsed()
151 if self.audiobook is not None:
152 self.storage.set_time(self.audiobook.current_chapter, position)
154 def is_playing(self):
155 return self.player.playing
157 def sleeptimer(self, secs):
158 #print "sleeper", secs
160 #print "now its time to sleep"
163 def start_sleeptimer(self, secs):
164 #print "startin sleep"
165 sleep_thread = threading.Thread(target=self.sleeptimer, args=(secs, ))
167 #print "started sleep"
169 def get_percentage(self):
171 return float(self.player.elapsed()) / float(self.player.duration())
172 except ZeroDivisionError:
175 def seek_percent(self, ratio):
177 target = int(self.player.duration() * ratio) # Calculate where to seek
178 self.player.seek_time(target) # seek
180 position = self.player.elapsed()
181 self.storage.set_time(self.audiobook.current_chapter, target) # save position
184 _moduleLogger.exception("Seek failed")
187 def _find_books(self):
190 os.path.join(self._bookDir, f)
191 for f in os.listdir(self._bookDir)
196 if Audiobook.is_book(path)