def find_sub_atom(self, *atom_names): reader = self.reader for (last, next_atom) in iter_last(iter(atom_names)): try: (length, stream_atom) = reader.parse("32u 4b") while (stream_atom != next_atom): reader.skip_bytes(length - 8) (length, stream_atom) = reader.parse("32u 4b") if (last): return reader.substream(length - 8) else: reader = reader.substream(length - 8) except IOError: raise KeyError(next_atom)
def set_keys(self, keys): """keys is a [(key, action), ...] list where 'key' and 'action' are both strings""" if (len(keys) > 0): text = [] for (last, (key, action)) in audiotools.iter_last(iter(keys)): text.append(('key', key)) text.append(u" - " + action) if (not last): text.append(u" ") self.status.set_text(text) else: self.status.set_text(u"")
def get_m4a_atom(reader, *atoms): """given a BitstreamReader and atom name strings returns a (size, substream) of the final atom data (not including its 64-bit size/name header) after traversing the parent atoms """ for (last, next_atom) in iter_last(iter(atoms)): try: (length, stream_atom) = reader.parse("32u 4b") while stream_atom != next_atom: reader.skip_bytes(length - 8) (length, stream_atom) = reader.parse("32u 4b") if last: return (length - 8, reader.substream(length - 8)) else: reader = reader.substream(length - 8) except IOError: raise KeyError(next_atom)
def __init__(self, albums, select_item): """takes a list of Album objects and a select_item() callback for when an album or track is selected and returns a tree-like widget for editing an album or tracks""" self.albums = albums self.radios = [] # all our radio button-like checkboxes rows = [] def unselect_others(checkbox, state_change): for radio in self.radios: if (radio is not checkbox): radio.set_state(False, do_callback=False) for album in albums: #the checkbox for selecting an album checkbox = urwid.CheckBox(u"", on_state_change=select_item, user_data=album) urwid.connect_signal(checkbox, "change", unselect_others) self.radios.append(checkbox) #setup album row depending on if it has an album number or not if (album.number != 0): album_digits = len(str(album.number)) rows.append( urwid.Columns( [("fixed", 4, checkbox), ("fixed", album_digits + 1, urwid.Text(u"%%%d.d " % (album_digits) % \ (album.number))), ("fixed", 2, urwid.Text(u": ")), ("weight", 1, album.album_name)])) else: rows.append( urwid.Columns([("fixed", 4, checkbox), ("fixed", 2, urwid.Text(u": ")), ("weight", 1, album.album_name)])) #the largest number of digits in a track_number field track_digits = max([len(str(t.metadata.track_number)) for t in album.tracks]) #setup track rows for (last, track) in audiotools.iter_last(iter(album.tracks)): #the checkbox for selecting a track checkbox = urwid.CheckBox(u"", on_state_change=select_item, user_data=track) urwid.connect_signal(checkbox, "change", unselect_others) self.radios.append(checkbox) #prefixed differently depending on its position if (last): prefix = u" \u2514\u2500" else: prefix = u" \u251c\u2500" #setup track row rows.append( urwid.Columns( [("fixed", len(prefix), urwid.Text(prefix)), ("fixed", 4, checkbox), ("fixed", track_digits + 1, urwid.Text(u"%%%d.d " % (track_digits) % \ (track.metadata.track_number))), ("fixed", 2, urwid.Text(u": ")), ("weight", 1, track.track_name)])) urwid.Pile.__init__(self, rows)