Esempio n. 1
0
class Controller:
    def __init__(self, display):
        self.display = display
        self.view = View(self.display)
        self.album_index = 0
        self.album_selected_index = 0
        self.media_index = 0
        self.media_position = 0.0
        self.media_duration = 0.0
        self.lastUpdate = 0.0
        self.keyDownTime = time.time()
        self.albumMode = True
        home = expanduser("~")
        self.rootFolder = "/home/pi/media"  #os.path.join(home, "media")
        self.busy = False
        self.lastChannel = -1
        if 'arm' in platform.machine():
            self.buttons = Buttons()

    def setup(self):
        self.view.welcome()
        self.vlcInstance = vlc.Instance()
        self.player = Player(self.vlcInstance)
        self.player.set_volume(36)

        self.player.set_event_end_callback(self.media_end_reached)
        self.player.set_event_position_changed_callback(
            self.media_position_changed)
        self.repo = MusicRepo(self.rootFolder, self.vlcInstance)
        self.repo.load_all()
        self.folders = self.repo.get_albums()
        if 'arm' in platform.machine():
            self.buttons.start_thread()

    def media_end_reached(self, event):
        #print("end reached")
        event = pygame.event.Event(pygame.KEYUP)
        event.key = pygame.K_RIGHT
        event.fileend = True
        pygame.event.post(event)

    def media_position_changed(self, event):
        #print("position changed")
        event = pygame.event.Event(pygame.KEYUP)
        event.key = pygame.K_s
        pygame.event.post(event)

    def loop(self):
        self.show_albums()
        while True:
            try:
                for event in pygame.event.get():
                    pygame.event.clear()
                    if event.type == pygame.QUIT:
                        self.run = False
                        return
                    elif event.type == pygame.KEYDOWN:
                        self.keyDownTime = time.time()

                    elif event.type == pygame.KEYUP:
                        if event.key == pygame.K_q:
                            pygame.quit()
                            sys.exit(0)
                        elif event.key == pygame.K_s:
                            self.save_position()
                        elif event.key == pygame.K_ESCAPE:
                            #print("back")
                            self.albumMode = True
                            self.show_albums()
                        elif event.key == pygame.K_p:
                            #print("enter / play-pause")
                            if time.time() > self.keyDownTime + 1:
                                if not self.albumMode:
                                    #print("reset")
                                    self.media_position = 0
                                    self.play_media_file()
                            else:
                                if self.albumMode:
                                    #print("open album")
                                    self.album_index = self.album_selected_index
                                    fileAndPosition = self.repo.load_position_and_file(
                                        self.album_index)
                                    self.media_index = fileAndPosition[
                                        'fileIndex']
                                    self.media_position = fileAndPosition[
                                        'position']
                                    self.play_media_file()
                                else:
                                    #print("toggle play")
                                    self.player.play_pause()
                        elif event.key == pygame.K_UP:
                            #print("volume +")
                            self.player.volume_up()
                        elif event.key == pygame.K_DOWN:
                            #print("volume -")
                            self.player.volume_down()
                        elif event.key == pygame.K_LEFT:
                            #print("left")
                            if self.albumMode:
                                if self.album_selected_index > 0:
                                    self.album_selected_index -= 1
                                self.show_albums()
                            else:
                                if self.media_index > 0:
                                    self.media_index -= 1
                                    self.media_position = 0
                                    self.play_media_file()
                        elif event.key == pygame.K_RIGHT:
                            #print("right")
                            if self.albumMode:
                                if self.album_selected_index < len(
                                        self.folders) - 1:
                                    self.album_selected_index += 1
                                self.show_albums()
                            else:
                                self.next_media_file(event)
            except:
                print("Failed")
                if 'arm' in platform.machine():
                    self.buttons.close()
                return

    def next_media_file(self, event):
        size = self.repo.get_num_of_files(self.folders[self.album_index])
        if self.media_index + 1 < size:
            self.media_position = 0
            self.media_index += 1
            self.play_media_file()
        elif hasattr(event, 'fileend'):
            self.media_position = 0
            self.media_index = 0
            self.save_position()
            self.show_albums()

    def play_media_file(self):
        files = self.repo.get_mediafiles(self.folders[self.album_index])
        meta = files[self.media_index]
        image = self.repo.get_cover(self.folders[self.album_index])
        self.media_duration = meta.duration
        if self.media_position > 1.0:
            self.media_position = 0
        self.view.new_media(image, meta.title, meta.artist, meta.album,
                            meta.track, meta.duration, self.media_position)
        self.player.set_file(meta.filename, self.media_position)
        self.albumMode = False

    def save_position(self):
        if self.player.is_playing():
            if time.time() > self.lastUpdate + 1:
                self.media_position = self.player.get_position()
                if not self.albumMode:
                    self.view.draw_position_bar(self.media_position,
                                                self.media_duration)
                self.repo.save_position(self.album_index, self.media_index,
                                        self.media_position)
                self.lastUpdate = time.time()

    def show_albums(self):
        centerIndex = self.album_selected_index

        if centerIndex - 1 < 0:
            image1 = None
        else:
            image1 = self.repo.get_cover(self.folders[centerIndex - 1])

        image2 = self.repo.get_cover(self.folders[centerIndex])

        if centerIndex + 1 > len(self.folders) - 1:
            image3 = None
        else:
            image3 = self.repo.get_cover(self.folders[centerIndex + 1])

        self.view.album_selection(image1, image2, image3)