@@ -71,7 +71,7 @@ export default function performInitialSeekAndPlay(
7171 } : {
7272 mediaElement : IMediaElement ;
7373 playbackObserver : IMediaElementPlaybackObserver ;
74- startTime : number | ( ( ) => number ) ;
74+ startTime : number | ( ( ) => number | undefined ) ;
7575 mustAutoPlay : boolean ;
7676 isDirectfile : boolean ;
7777 onWarning : ( err : IPlayerError ) => void ;
@@ -107,18 +107,37 @@ export default function performInitialSeekAndPlay(
107107 if ( ! isDirectfile || typeof startTime === "number" ) {
108108 const initiallySeekedTime =
109109 typeof startTime === "number" ? startTime : startTime ( ) ;
110- if ( initiallySeekedTime !== 0 ) {
110+ if ( initiallySeekedTime !== 0 && initiallySeekedTime !== undefined ) {
111111 performInitialSeek ( initiallySeekedTime ) ;
112112 }
113113 waitForSeekable ( ) ;
114114 } else {
115115 playbackObserver . listen (
116116 ( obs , stopListening ) => {
117+ const initiallySeekedTime =
118+ typeof startTime === "number" ? startTime : startTime ( ) ;
119+ if (
120+ initiallySeekedTime === undefined &&
121+ obs . readyState < HTMLMediaElement . HAVE_CURRENT_DATA
122+ ) {
123+ /**
124+ * On browser, such as Safari, the HTMLMediaElement.duration
125+ * and HTMLMediaElement.buffered may not be initialized at readyState 1, leading
126+ * to cases where it can be equal to `Infinity`.
127+ * If so, the range in which it is possible to seek is not yet known.
128+ * To solve this, the seek should be done after readyState HAVE_CURRENT_DATA (2),
129+ * at that time the previously mentioned attributes are correctly initialized and
130+ * the range in which it is possible to seek is correctly known.
131+ * If the initiallySeekedTime is still `undefined` when the readyState is >= 2,
132+ * let assume that the initiallySeekedTime will never be known and continue
133+ * the logic without seeking.
134+ */
135+ return ;
136+ }
117137 if ( obs . readyState >= 1 ) {
118138 stopListening ( ) ;
119- const initiallySeekedTime =
120- typeof startTime === "number" ? startTime : startTime ( ) ;
121- if ( initiallySeekedTime !== 0 ) {
139+
140+ if ( initiallySeekedTime !== 0 && initiallySeekedTime !== undefined ) {
122141 if ( canSeekDirectlyAfterLoadedMetadata ) {
123142 performInitialSeek ( initiallySeekedTime ) ;
124143 } else {
0 commit comments