(ss *SeekableStream, offset int64, forceRange ...bool)
| 403 | } |
| 404 | |
| 405 | func NewReadAtSeeker(ss *SeekableStream, offset int64, forceRange ...bool) (model.File, error) { |
| 406 | if cache := ss.GetFile(); cache != nil { |
| 407 | _, err := cache.Seek(offset, io.SeekStart) |
| 408 | if err != nil { |
| 409 | return nil, err |
| 410 | } |
| 411 | return cache, nil |
| 412 | } |
| 413 | r := &RangeReadReadAtSeeker{ |
| 414 | ss: ss, |
| 415 | masterOff: offset, |
| 416 | } |
| 417 | if offset != 0 || utils.IsBool(forceRange...) { |
| 418 | if offset < 0 || offset > ss.GetSize() { |
| 419 | return nil, errors.New("offset out of range") |
| 420 | } |
| 421 | reader, err := r.getReaderAtOffset(offset) |
| 422 | if err != nil { |
| 423 | return nil, err |
| 424 | } |
| 425 | r.readerMap.Store(int64(offset), reader) |
| 426 | } else { |
| 427 | r.readerMap.Store(int64(offset), ss) |
| 428 | } |
| 429 | return r, nil |
| 430 | } |
| 431 | |
| 432 | func NewMultiReaderAt(ss []*SeekableStream) (readerutil.SizeReaderAt, error) { |
| 433 | readers := make([]readerutil.SizeReaderAt, 0, len(ss)) |
no test coverage detected