def select_item(self, s=None): """ Select item from menu :param state: button state """ self.current_item = s.name state = State() state.folder = os.path.join(self.config[COLLECTION][BASE_FOLDER], s.folder[1:]) state.topic = self.collection_topic if state.topic == KEY_FILE: state.file_name = s.file_name elif state.topic == TITLE: state.file_name = self.selector.get_filename_by_title( s.folder, self.title) state.url = os.path.join(state.folder, state.file_name) else: files = self.util.get_audio_files_in_folder(state.folder, False) if files: f = files[0] state.file_name = f.file_name state.url = os.path.join(state.folder, state.file_name) else: state.file_name = None state.url = None state.source = "detail" self.collection_list_menu.select_by_index(s.index) self.go_file_playback(state)
def set_tracks(self, tracks, page): """ Set tracks in menu :param tracks: list of tracks :param page: page number """ if tracks == None: return self.tracks = tracks items = {} start_index = TRACKS_PER_PAGE * (page - 1) end_index = start_index + TRACKS_PER_PAGE layout = GridLayout(self.bb) layout.set_pixel_constraints(TRACK_ROWS, TRACK_COLUMNS, 1, 1) constr = layout.get_next_constraints() fixed_height = int((constr.h * LABEL_HEIGHT_PERCENT) / 100.0) for i, a in enumerate(self.tracks[start_index:end_index]): state = State() state.name = a["title"] state.l_name = state.name state.bgr = self.config[COLORS][COLOR_DARK] state.img_x = None state.img_y = None state.auto_update = True state.show_bgr = True state.show_img = False state.show_label = True state.comparator_item = state.name state.index = i state.fixed_height = fixed_height state.file_name = a["file_name"] items[state.name] = state self.set_items(items, 0, self.play_track, False)
def change_track(self, track_index): """ Change track :param track_index: index track """ a = [AUDIOBOOKS, CD_PLAYER] m = self.config[CURRENT][MODE] if not (m in a): self.config[FILE_PLAYBACK][CURRENT_FILE] = self.get_filename( track_index) self.stop_timer() time.sleep(0.3) s = State() if m == FILE_PLAYBACK: s.playback_mode = self.config[FILE_PLAYBACK][ CURRENT_FILE_PLAYBACK_MODE] s.playlist_track_number = track_index s.index = track_index s.source = ARROW_BUTTON s.file_name = self.get_filename(track_index) if self.cd_album != None: s.album = self.cd_album self.set_current(True, s)
def load_playlist(self, state, playlist_provider, rows, columns): """ Handle playlist :param state: state object defining playlist :param playlist_provider: provider :param rows: menu rows :param columns: menu columns :return: playlist """ n = getattr(state, "file_name", None) if n == None: state.file_name = self.config[FILE_PLAYBACK][FILE_AUDIO] p = playlist_provider(state) if not p: return play_list = [] for i, n in enumerate(p): s = State() s.index = i s.playlist_track_number = i s.file_name = n s.file_type = FILE_AUDIO s.url = state.folder + os.sep + n s.playback_mode = FILE_PLAYLIST play_list.append(s) return self.load_playlist_content(play_list, rows, columns)
def get_cd_tracks_summary(self, cd_drive_name): """ Get the list of CD tracks summaries :param cd_drive_name: CD drive name :return: CD tracks summaries """ drive_id = self.get_cd_drive_id_by_name(cd_drive_name) names = self.get_cd_track_names(drive_id) if not names: return None items = [] for id, cd in enumerate(names): s = State() s.index = id s.playlist_track_number = id s.name = cd s.l_name = s.name s.file_type = FILE_AUDIO s.playback_mode = FILE_AUDIO s.file_name = self.get_cd_track_url(cd_drive_name, id + 1) s.url = s.file_name items.append(s) return items
def set_audio_file(self, new_track, s=None): """ Set new audio file :param new_track: True - new file "param s" button state """ state = State() state.folder = PODCASTS_FOLDER if s.status == STATUS_LOADED: state.url = s.file_name state.original_url = s.url else: state.url = s.url self.config[PLAYER_SETTINGS][PAUSE] = False state.mute = self.config[PLAYER_SETTINGS][MUTE] state.pause = self.config[PLAYER_SETTINGS][PAUSE] state.file_type = FILE_AUDIO state.dont_notify = True state.source = FILE_AUDIO state.playback_mode = FILE_AUDIO state.status = s.status if hasattr(s, "file_name"): state.file_name = s.file_name source = None if s: source = getattr(s, "source", None) if new_track: tt = 0.0 else: tt = self.config[PODCASTS][PODCAST_EPISODE_TIME] if (isinstance(tt, str) and len(tt) != 0) or ( isinstance(tt, float) or (source and source == RESUME)) or isinstance(tt, int): state.track_time = tt self.time_control.slider.set_position(0) if self.file_button and self.file_button.components[ 1] and self.file_button.components[1].content: state.icon_base = self.file_button.components[1].content if s: if self.config[VOLUME_CONTROL][ VOLUME_CONTROL_TYPE] == VOLUME_CONTROL_TYPE_PLAYER: state.volume = s.volume else: state.volume = None if getattr(s, "full_screen_image", None) != None: state.full_screen_image = s.full_screen_image self.notify_play_listeners(state)
def get_cd_track(self): """ Get CD track info for the track defined in the configuration :return: track info """ s = State() cd_drive = self.config[CD_PLAYBACK][CD_DRIVE_NAME] cd_track = self.config[CD_PLAYBACK][CD_TRACK] if cd_drive and cd_track: s.file_name = self.get_cd_track_url(cd_drive, int(cd_track)) s.url = s.file_name return s return None
def get_episodes_from_disk(self, podcast_url): """ Get podcast episodes from disk :param podcast_url: podcast URL :return: dictionary with episodes """ try: podcast = self.summary_cache[podcast_url] podcast_image_url = podcast.image_name episodes = podcast.episodes return episodes except: pass episodes = [] podcast = self.summary_cache[podcast_url] entries = [] for p in self.podcasts_json: if p["url"] == podcast_url: try: entries = p["episodes"] except: pass if len(entries) == 0: return [] for i, entry in enumerate(entries): s = State() s.index = i s.name = entry["name"] s.l_name = s.name s.file_name = entry["filename"] s.description = entry["summary"] s.fixed_height = int(self.episode_button_font_size * 0.8) s.file_type = PODCASTS s.online = podcast.online s.comparator_item = s.index s.bgr = self.config[COLORS][COLOR_DARK] s.show_bgr = True s.podcast_url = podcast_url s.podcast_name = podcast.name s.url = "" s.podcast_image_url = podcast_image_url self.set_episode_icon(s.name, self.episode_button_bb, s, False) episodes.append(s) self.summary_cache[podcast_url].episodes = episodes return episodes
def get_audio_files_from_playlist(self): """ Call player for files in the playlist :return: list of files from playlist """ playlist = self.get_current_playlist() files = [] if playlist: for n in range(len(playlist)): st = State() st.index = st.comparator_item = n st.file_type = FILE_AUDIO st.file_name = playlist[n] files.append(st) return files
def get_audio_files_from_playlist(self): """ Call player for files in the playlist :return: list of files from playlist """ files = [] if getattr(self, "playlist", None): for n in range(len(self.playlist)): st = State() st.index = st.comparator_item = n t = self.playlist[n] st.file_type = FILE_AUDIO st.file_name = t["file_name"] files.append(st) return files
def change_track(self, track_index): """ Change track :param track_index: index track """ self.config[COLLECTION_PLAYBACK][COLLECTION_FILE] = self.get_filename( track_index) self.stop_timer() time.sleep(0.3) s = State() s.playlist_track_number = track_index s.index = track_index s.source = ARROW_BUTTON s.file_name = self.get_filename(track_index) folder = self.current_folder if not folder.endswith(os.sep): folder += os.sep s.folder = os.path.join(self.config[COLLECTION][BASE_FOLDER], folder) s.url = os.path.join(s.folder, s.file_name) self.set_current(True, s)
def get_folder_content(self, folder_name): """ Return the list representing folder content :param folder_name: folder name :return: """ files = [] if not os.path.exists(folder_name): return if folder_name.endswith(":") and WINDOWS in self.platform: folder_name += "\\" self.current_folder = folder_name if folder_name == self.ROOT and WINDOWS in self.platform: disks = self.get_windows_disks() for d in disks: state = State() state.folder = self.current_folder state.file_type = FOLDER state.file_name = d state.url = d files.append(state) return files for f in os.listdir(folder_name): file_path = os.path.join(folder_name, f) real_path = os.path.realpath(file_path) state = State() state.folder = self.current_folder state.file_type = FOLDER state.file_name = f state.url = real_path if os.path.isdir(file_path) and not re.match( RE_HIDDEN_FOLDER_PREFIXES, f): # folder try: folder_image_path = self.get_folder_image_path(real_path) if folder_image_path: state.file_type = FOLDER_WITH_ICON state.file_image_path = folder_image_path files.append(state) except PermissionError: pass elif os.path.isfile(file_path) and not f.startswith("."): # file if self.is_audio_file(f): state.file_type = FILE_AUDIO if self.util.get_image_from_audio_file(file_path): state.has_embedded_image = True else: state.has_embedded_image = False files.append(state) elif self.is_playlist_file(f): # had issues with mplayer and cue files: # https://en.wikipedia.org/wiki/Talk%3ACue_sheet_(computing)#mplayer_have_more_faults # had also issues using cue playlists and vlc python binding p = self.config[AUDIO][CLIENT_NAME] if (p == MPLAYER or p == VLC) and f.endswith(".cue"): continue state.file_type = FILE_PLAYLIST files.append(state) files.sort(key=lambda x: [ int(n) if n.isdigit() else n.lower() for n in split(self.cre, x.file_name) ]) for n, f in enumerate(files): f.comparator_item = n return files
def set_audio_file(self, new_track, s=None): """ Set new audio file :param new_track: True - new audio file :param s: button state object """ state = State() state.playback_mode = FILE_AUDIO state.playlist_track_number = 0 name = url = None if s == None: if self.config[AUDIOBOOKS][BROWSER_TRACK_FILENAME]: name = self.config[AUDIOBOOKS][BROWSER_TRACK_FILENAME] for t in self.playlist: if t["title"].endswith(name): url = t["mp3"] else: i = 0 if s != None: i = s.index t = self.playlist[i] url = t["mp3"] name = t["title"] else: if getattr(s, "track_filename", None): i = self.get_current_track_index( {"file_name": s.track_filename}) elif getattr(s, "playlist_track_number", None): i = s.playlist_track_number else: i = self.current_track_index t = self.playlist[i] url = t["mp3"] name = t["title"] self.config[PLAYER_SETTINGS][PAUSE] = False state.file_name = name self.config[AUDIOBOOKS][BROWSER_TRACK_FILENAME] = t["file_name"] state.mute = self.config[PLAYER_SETTINGS][MUTE] state.pause = self.config[PLAYER_SETTINGS][PAUSE] self.play_button.draw_default_state(None) if self.config[VOLUME_CONTROL][ VOLUME_CONTROL_TYPE] == VOLUME_CONTROL_TYPE_PLAYER: state.volume = self.config[PLAYER_SETTINGS][VOLUME] else: state.volume = None state.file_type = FILE_AUDIO state.dont_notify = True state.source = FILE_AUDIO state.url = url state.mode = AUDIOBOOKS state.playback_mode = FILE_AUDIO state.music_folder = self.config[AUDIO][MUSIC_FOLDER] self.audio_files = self.get_audio_files_from_playlist() if self.config[AUDIOBOOKS][BROWSER_BOOK_TIME]: if new_track: state.track_time = "0" else: state.track_time = self.config[AUDIOBOOKS][BROWSER_BOOK_TIME] self.reset_loading() logging.debug(state.url) self.notify_play_listeners(state)
def get_folder_content(self, folder_name, store_folder_name=True, load_images=True): """ Return the list representing folder content :param folder_name: folder name :param store_folder_name: remember folder name :return: """ files = [] if not os.path.exists(folder_name): return if folder_name.endswith(":") and WINDOWS in self.platform: folder_name += "\\" if store_folder_name: self.current_folder = folder_name if folder_name == self.ROOT and WINDOWS in self.platform: disks = self.get_windows_disks() for d in disks: state = State() state.folder = folder_name state.file_type = FOLDER state.file_name = d state.url = d files.append(state) return files for f in os.listdir(folder_name): file_path = os.path.join(folder_name, f) real_path = os.path.realpath(file_path) state = State() state.folder = folder_name state.file_type = FOLDER state.file_name = f state.url = real_path if os.path.isdir(file_path) and not re.match( RE_HIDDEN_FOLDER_PREFIXES, f): # folder try: folder_image_path = self.util.get_folder_image_path( real_path) if folder_image_path: state.file_type = FOLDER_WITH_ICON state.file_image_path = folder_image_path files.append(state) except PermissionError: pass elif os.path.isfile(file_path) and not f.startswith("."): # file if self.is_audio_file(f): state.file_type = FILE_AUDIO if load_images and self.image_util.get_image_from_audio_file( file_path): state.has_embedded_image = True else: state.has_embedded_image = False files.append(state) elif self.is_playlist_file(f): # had issues using cue playlists and vlc python binding p = self.config[AUDIO][CLIENT_NAME] if p == VLC and f.endswith(".cue"): continue state.file_type = FILE_PLAYLIST files.append(state) if self.config[SORT_BY_TYPE]: files = sorted(files, key=attrgetter("file_type"), reverse=True) else: files = sorted(files, key=attrgetter("file_name"), reverse=False) for n, f in enumerate(files): f.comparator_item = n return files
def set_audio_file(self, new_track, s=None): """ Set new audio file :param new_track: True - new audio file "param s" button state object """ state = State() if s: state.playback_mode = getattr(s, "playback_mode", FILE_AUDIO) state.playlist_track_number = getattr(s, "playlist_track_number", None) if self.config[CURRENT][MODE] == CD_PLAYER and getattr( s, "source", None) != INIT: image_base = getattr(s, "image_base", None) if image_base != None: state.image_base = image_base else: m = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYBACK_MODE] if m: state.playback_mode = m else: state.playback_mode = FILE_AUDIO if self.config[CURRENT][MODE] == AUDIO_FILES: self.current_folder = self.config[FILE_PLAYBACK][CURRENT_FOLDER] if not self.current_folder: return state.folder = self.current_folder state.file_name = self.config[FILE_PLAYBACK][CURRENT_FILE] if state.folder[-1] == os.sep: state.folder = state.folder[:-1] if os.sep in state.file_name: state.url = "\"" + state.file_name + "\"" else: state.url = "\"" + state.folder + os.sep + state.file_name + "\"" state.music_folder = self.config[AUDIO][MUSIC_FOLDER] elif self.config[CURRENT][MODE] == CD_PLAYER: state.file_name = s.file_name state.url = getattr(s, "url", s.file_name) parts = s.file_name.split() self.config[CD_PLAYBACK][CD_DRIVE_NAME] = parts[0][len("cdda:///" ):] id = self.cdutil.get_cd_drive_id_by_name( self.config[CD_PLAYBACK][CD_DRIVE_NAME]) self.config[CD_PLAYBACK][CD_DRIVE_ID] = int(id) self.config[CD_PLAYBACK][CD_TRACK] = int(parts[1].split("=")[1]) self.config[PLAYER_SETTINGS][PAUSE] = False state.mute = self.config[PLAYER_SETTINGS][MUTE] state.pause = self.config[PLAYER_SETTINGS][PAUSE] state.file_type = FILE_AUDIO state.dont_notify = True state.source = FILE_AUDIO if self.config[FILE_PLAYBACK][ CURRENT_FILE_PLAYBACK_MODE] == FILE_AUDIO or self.config[ CURRENT][MODE] == CD_PLAYER: self.audio_files = self.get_audio_files() elif self.config[FILE_PLAYBACK][ CURRENT_FILE_PLAYBACK_MODE] == FILE_PLAYLIST: state.file_name = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYLIST] self.load_playlist(state) state.file_name = self.config[FILE_PLAYBACK][CURRENT_FILE] self.audio_files = self.get_audio_files_from_playlist() state.playback_mode = FILE_PLAYLIST n = getattr(s, "file_name", None) if n: state.file_name = n try: state.playlist_track_number = int(state.file_name) - 1 except: state.playlist_track_number = self.get_current_track_index( state) source = None if s: source = getattr(s, "source", None) if new_track: tt = 0.0 else: if self.config[CURRENT][MODE] == CD_PLAYER: tt = self.config[CD_PLAYBACK][CD_TRACK_TIME] else: tt = self.config[FILE_PLAYBACK][CURRENT_TRACK_TIME] if (isinstance(tt, str) and len(tt) != 0) or ( isinstance(tt, float) or (source and source == RESUME)) or isinstance(tt, int): state.track_time = tt self.time_control.slider.set_position(0) if self.file_button and self.file_button.components[ 1] and self.file_button.components[1].content: state.icon_base = self.file_button.components[1].content if s and s.volume: state.volume = s.volume if self.config[CURRENT][MODE] == CD_PLAYER and s and getattr( s, "source", None) == INIT: try: self.cd_album = self.util.cd_titles[self.config[CD_PLAYBACK] [CD_DRIVE_NAME]] self.set_cd_album_art_image() state.image_base = self.file_button.components[1].content except: self.cd_album = None if getattr(s, "full_screen_image", None) != None: state.full_screen_image = s.full_screen_image song_name = self.get_song_name(s) if song_name != None: state.album = song_name self.notify_play_listeners(state)
def set_audio_file(self, new_track, s=None): """ Set new audio file :param new_track: True - new audio file "param s" button state object """ state = State() state.playback_mode = FILE_AUDIO self.current_folder = s.folder state.folder = self.current_folder state.file_name = s.file_name state.url = s.url if state.folder[-1] == os.sep: state.folder = state.folder[:-1] state.full_screen_image = self.set_audio_file_image( state.url.replace('\"', ""), state.folder) self.config[PLAYER_SETTINGS][PAUSE] = False state.mute = self.config[PLAYER_SETTINGS][MUTE] state.pause = self.config[PLAYER_SETTINGS][PAUSE] self.play_button.draw_default_state(None) state.file_type = FILE_AUDIO state.dont_notify = True folder = self.config[COLLECTION_PLAYBACK][COLLECTION_FOLDER] self.audio_files = self.util.get_audio_files_in_folder(folder, False) source = None if s: source = getattr(s, "source", None) tt = 0.0 if new_track and hasattr(s, "source") and s.source != INIT: tt = 0.0 else: tt = self.config[COLLECTION_PLAYBACK][COLLECTION_TRACK_TIME] if (isinstance(tt, str) and len(tt) != 0) or ( isinstance(tt, float) or (source and source == RESUME)) or isinstance(tt, int): state.track_time = tt if self.show_time_control: self.time_control.slider.set_position(0) if self.file_button and self.file_button.components[ 1] and self.file_button.components[1].content: state.icon_base = self.file_button.components[1].content if self.file_button and hasattr(s, "index"): self.file_button.state.index = s.index else: self.file_button.state.index = 0 if s: if self.config[VOLUME_CONTROL][ VOLUME_CONTROL_TYPE] == VOLUME_CONTROL_TYPE_PLAYER: state.volume = s.volume else: state.volume = None if getattr(s, "full_screen_image", None) != None: state.full_screen_image = s.full_screen_image song_name = self.get_song_name(s) if song_name != None: state.album = song_name self.notify_play_listeners(state)
def turn_page(self): """ Turn page """ topic = self.get_topic() self.current_page_items = self.selector.get_topic_detail_page( topic, self.selection, self.current_page, self.prev_page, self.first_item, self.last_item, PAGE_SIZE) self.prev_page = self.current_page if not self.current_page_items: self.current_page_items = [] return self.current_item = self.current_page_items[0] self.first_item = self.current_item self.last_item = self.current_page_items[len(self.current_page_items) - 1] p = {} for i, f in enumerate(self.current_page_items): s = State() s.index = i s.folder = f if "\x00" in f: f = f.replace("\x00", "") if "/" in f: parts = f.split("/") if len(parts) > 1: last = parts[len(parts) - 1] if len(last) > 6: f = last else: f = parts[len(parts) - 2] + "/" + last s.name = f s.l_name = s.name if self.filename: s.file_name = self.filename if self.title: s.title = self.title p[str(i)] = s self.collection_list_menu.set_items(p, 0, self.select_item, False) keys = list(p.keys()) if len(keys) != 0 and self.navigator and self.total_pages > 1: self.navigator.left_button.change_label(str(self.current_page - 1)) self.navigator.right_button.change_label( str(self.total_pages - self.current_page)) self.collection_list_menu.clean_draw_update() if hasattr(self, "update_observer"): self.collection_list_menu.add_menu_observers( self.update_observer, self.redraw_observer) self.collection_list_menu.unselect() for i, b in enumerate(self.collection_list_menu.buttons.values()): if self.current_item[0] == b.state.name: self.collection_list_menu.select_by_index(b.state.index) return index = (self.current_page - 1) * PAGE_SIZE self.collection_list_menu.select_by_index(index)
def __init__(self, util, get_current_playlist, playlist_provider, listeners, voice_assistant): """ Initializer :param util: utility object :param listeners: file browser listeners """ self.util = util self.config = util.config self.factory = Factory(util) self.bounding_box = util.screen_rect layout = BorderLayout(self.bounding_box) layout.set_percent_constraints(PERCENT_TOP_HEIGHT, PERCENT_BOTTOM_HEIGHT, 0, 0) Screen.__init__(self, util, "", PERCENT_TOP_HEIGHT, voice_assistant, "file_browser_screen_title", True, layout.TOP) current_folder = self.util.file_util.current_folder d = {"current_title": current_folder} if self.config[FILE_PLAYBACK][ CURRENT_FILE_PLAYBACK_MODE] == FILE_PLAYLIST: f = self.config[FILE_PLAYBACK][CURRENT_FOLDER] p = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYLIST] d = f + os.sep + p self.screen_title.set_text(d) rows = self.config[FILE_BROWSER_ROWS] columns = self.config[FILE_BROWSER_COLUMNS] self.filelist = None playback_mode = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYBACK_MODE] if not playback_mode: self.config[FILE_PLAYBACK][ CURRENT_FILE_PLAYBACK_MODE] = playback_mode = FILE_AUDIO button_box = pygame.Rect(0, 0, layout.CENTER.w / columns, layout.CENTER.h / rows) if self.config[ALIGN_BUTTON_CONTENT_X] == 'center': location = TOP else: location = self.config[ALIGN_BUTTON_CONTENT_X] icon_box = self.factory.get_icon_bounding_box(button_box, location, self.config[IMAGE_AREA], self.config[IMAGE_SIZE], self.config[PADDING]) icon_box_without_label = self.factory.get_icon_bounding_box( button_box, location, 100, 100, self.config[PADDING], False) if playback_mode == FILE_AUDIO or playback_mode == FILE_RECURSIVE: folder_content = self.util.load_folder_content( current_folder, rows, columns, icon_box, icon_box_without_label) self.filelist = Page(folder_content, rows, columns) elif playback_mode == FILE_PLAYLIST: s = State() s.folder = self.config[FILE_PLAYBACK][CURRENT_FOLDER] s.music_folder = self.config[AUDIO][MUSIC_FOLDER] s.file_name = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYLIST] pl = self.get_filelist_items(get_current_playlist) if len(pl) == 0: pl = self.util.load_playlist(s, playlist_provider, rows, columns, (icon_box.w, icon_box.h)) else: pl = self.util.load_playlist_content(pl, rows, columns, (icon_box.w, icon_box.h)) self.filelist = Page(pl, rows, columns) self.file_menu = FileMenu(self.filelist, util, playlist_provider, layout.CENTER, location, icon_box, icon_box_without_label) self.file_menu.parent_screen = self self.file_menu.link_borders = self.link_borders self.file_menu.add_change_folder_listener(self.screen_title.set_text) self.file_menu.add_play_file_listener(listeners[KEY_PLAY_FILE]) listeners[GO_LEFT_PAGE] = self.file_menu.page_down listeners[GO_RIGHT_PAGE] = self.file_menu.page_up listeners[GO_USER_HOME] = self.file_menu.switch_to_user_home listeners[GO_ROOT] = self.file_menu.switch_to_root listeners[GO_TO_PARENT] = self.file_menu.switch_to_parent_folder self.navigator = FileNavigator(util, layout.BOTTOM, listeners) left = str(self.filelist.get_left_items_number()) right = str(self.filelist.get_right_items_number()) left_button = self.navigator.get_button_by_name(KEY_PAGE_DOWN) right_button = self.navigator.get_button_by_name(KEY_PAGE_UP) self.back_button = self.navigator.get_button_by_name(KEY_BACK) left_button.change_label(left) right_button.change_label(right) self.file_menu.add_left_number_listener(left_button.change_label) self.file_menu.add_right_number_listener(right_button.change_label) self.add_navigator(self.navigator) self.page_turned = False self.animated_title = True self.file_menu.navigator = self.navigator self.add_menu(self.file_menu) self.link_borders() self.back_button.set_selected(True)
def __init__(self, util, get_current_playlist, playlist_provider, listeners, voice_assistant): """ Initializer :param util: utility object :param listeners: file browser listeners """ self.util = util self.config = util.config self.factory = Factory(util) self.bounding_box = util.screen_rect layout = BorderLayout(self.bounding_box) layout.set_percent_constraints(PERCENT_TOP_HEIGHT, PERCENT_BOTTOM_HEIGHT, 0, 0) Screen.__init__(self, util, "", PERCENT_TOP_HEIGHT, voice_assistant, "file_browser_screen_title", True, layout.TOP) color_dark_light = self.config[COLORS][COLOR_DARK_LIGHT] current_folder = self.util.file_util.current_folder d = {"current_title" : current_folder} if self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYBACK_MODE] == FILE_PLAYLIST: f = self.config[FILE_PLAYBACK][CURRENT_FOLDER] p = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYLIST] d = f + os.sep + p self.screen_title.set_text(d) rows = 3 columns = 3 self.filelist = None playback_mode = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYBACK_MODE] if not playback_mode: self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYBACK_MODE] = playback_mode = FILE_AUDIO if playback_mode == FILE_AUDIO or playback_mode == FILE_RECURSIVE: folder_content = self.util.load_folder_content(current_folder, rows, columns, layout.CENTER) self.filelist = Page(folder_content, rows, columns) elif playback_mode == FILE_PLAYLIST: s = State() s.folder = self.config[FILE_PLAYBACK][CURRENT_FOLDER] s.music_folder = self.config[AUDIO][MUSIC_FOLDER] s.file_name = self.config[FILE_PLAYBACK][CURRENT_FILE_PLAYLIST] pl = self.get_filelist_items(get_current_playlist) if len(pl) == 0: pl = self.util.load_playlist(s, playlist_provider, rows, columns) else: pl = self.util.load_playlist_content(pl, rows, columns) self.filelist = Page(pl, rows, columns) self.file_menu = FileMenu(self.filelist, util, playlist_provider, (0, 0, 0), layout.CENTER) Container.add_component(self, self.file_menu) self.file_menu.add_change_folder_listener(self.screen_title.set_text) self.file_menu.add_play_file_listener(listeners[KEY_PLAY_FILE]) listeners[GO_LEFT_PAGE] = self.file_menu.page_down listeners[GO_RIGHT_PAGE] = self.file_menu.page_up listeners[GO_USER_HOME] = self.file_menu.switch_to_user_home listeners[GO_ROOT] = self.file_menu.switch_to_root listeners[GO_TO_PARENT] = self.file_menu.switch_to_parent_folder self.navigator = Navigator(util, layout.BOTTOM, listeners, color_dark_light) left = str(self.filelist.get_left_items_number()) right = str(self.filelist.get_right_items_number()) self.navigator.left_button.change_label(left) self.navigator.right_button.change_label(right) self.file_menu.add_left_number_listener(self.navigator.left_button.change_label) self.file_menu.add_right_number_listener(self.navigator.right_button.change_label) Container.add_component(self, self.navigator) self.page_turned = False