示例#1
0
    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)
示例#2
0
        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"")
示例#3
0
    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)
示例#4
0
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)
示例#5
0
        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)