@@ -472,12 +472,16 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
472472 return self . partsStateValue. get ( )
473473 }
474474
475+ private var resourceSizeDisposable : Disposable ?
475476 private var completeFetchDisposable : Disposable ?
476477
477478 private var seekTimestamp : Double ?
478479 private var currentLookaheadId : Int = 0
479480 private var lookahead : FFMpegLookahead ?
480481
482+ private var resolvedResourceSize : Int64 ?
483+ private var pendingSeek : ( id: Int , position: Double ) ?
484+
481485 init ( resource: ChunkMediaPlayerV2 . SourceDescription . ResourceDescription ) {
482486 self . resource = resource
483487
@@ -494,16 +498,43 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
494498 }
495499
496500 deinit {
501+ self . resourceSizeDisposable? . dispose ( )
497502 self . completeFetchDisposable? . dispose ( )
498503 }
499504
500505 func seek( id: Int , position: Double ) {
506+ if self . resource. size == 0 && self . resolvedResourceSize == nil {
507+ self . pendingSeek = ( id, position)
508+
509+ if self . resourceSizeDisposable == nil {
510+ self . resourceSizeDisposable = ( self . resource. postbox. mediaBox. resourceData ( self . resource. reference. resource, option: . complete( waitUntilFetchStatus: false ) )
511+ |> deliverOnMainQueue) . start ( next: { [ weak self] data in
512+ guard let self else {
513+ return
514+ }
515+ if data. complete {
516+ if self . resolvedResourceSize == nil {
517+ self . resolvedResourceSize = data. size
518+
519+ if let pendingSeek = self . pendingSeek {
520+ self . seek ( id: pendingSeek. id, position: pendingSeek. position)
521+ }
522+ }
523+ }
524+ } )
525+ }
526+
527+ return
528+ }
529+
501530 self . seekTimestamp = position
502531
503532 self . currentLookaheadId += 1
504533 let lookaheadId = self . currentLookaheadId
505534
506535 let resource = self . resource
536+ let resourceSize = self . resolvedResourceSize ?? Int64 ( resource. size)
537+
507538 let updateState : ( FFMpegLookahead . State ) -> Void = { [ weak self] state in
508539 Queue . mainQueue ( ) . async {
509540 guard let self else {
@@ -559,7 +590,7 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
559590 return ChunkMediaPlayerPartsState . DirectReader. Stream (
560591 mediaBox: resource. postbox. mediaBox,
561592 resource: resource. reference. resource,
562- size: resource . size ,
593+ size: resourceSize ,
563594 index: media. info. index,
564595 seek: ( streamIndex: state. seek. streamIndex, pts: state. seek. pts) ,
565596 maxReadablePts: ( streamIndex: maxReadablePts. streamIndex, pts: maxReadablePts. pts, isEnded: state. isEnded) ,
@@ -602,18 +633,18 @@ final class ChunkMediaPlayerDirectFetchSourceImpl: ChunkMediaPlayerSourceImpl {
602633 ) . startStrict ( )
603634 } ,
604635 getDataInRange: { range, completion in
605- return resource. postbox. mediaBox. resourceData ( resource. reference. resource, size: resource . size , in: range, mode: . complete) . start ( next: { result, isComplete in
636+ return resource. postbox. mediaBox. resourceData ( resource. reference. resource, size: resourceSize , in: range, mode: . complete) . start ( next: { result, isComplete in
606637 completion ( isComplete ? result : nil )
607638 } )
608639 } ,
609640 isDataCachedInRange: { range in
610641 return resource. postbox. mediaBox. internal_resourceDataIsCached (
611642 id: resource. reference. resource. id,
612- size: resource . size ,
643+ size: resourceSize ,
613644 in: range
614645 )
615646 } ,
616- size: self . resource . size
647+ size: resourceSize
617648 )
618649 }
619650
0 commit comments