docs: def _prepare_read(self, start, stop, frames):
          """Seek to start frame and calculate length."""
          if start != 0 and not self.seekable():
              raise ValueError("start is only allowed for seekable files")
          if frames >= 0 and stop is not None:
              raise TypeError("Only one of {frames, stop} may be used")
  
          start, stop, _ = slice(start, stop).indices(self.frames)
          if stop < start:
              stop = start
          if frames < 0:
              frames = stop - start
          if self.seekable():
              self.seek(start, SEEK_SET)
          return frames