loadSubtitle method

Future<void> loadSubtitle({
  1. required Emitter<SubtitleState> emit,
})

Implementation

Future<void> loadSubtitle({
  required Emitter<SubtitleState> emit,
}) async {
  emit(LoadingSubtitle());
  videoPlayerController.addListener(
    () {
      final videoPlayerPosition = videoPlayerController.value.position;
      if (subtitles.subtitles.isNotEmpty &&
          videoPlayerPosition.inMilliseconds >
              subtitles.subtitles.last.endTime.inMilliseconds) {
        add(CompletedShowingSubtitles());
      }

      for (var i = _lastSubtitleIndex; i < subtitles.subtitles.length; i++) {
        final subtitleItem = subtitles.subtitles[i];
        final adjustedStartTime = subtitleItem.startTime.inMilliseconds +
            subtitleController.subtitleDelay;
        final adjustedEndTime = subtitleItem.endTime.inMilliseconds +
            subtitleController.subtitleDelay;

        final validStartTime =
            videoPlayerPosition.inMilliseconds > adjustedStartTime;
        final validEndTime =
            videoPlayerPosition.inMilliseconds < adjustedEndTime;
        final subtitle = validStartTime && validEndTime ? subtitleItem : null;

        if (validStartTime && validEndTime && subtitle != _currentSubtitle) {
          _currentSubtitle = subtitle;
          _lastSubtitleIndex = i;
          break;
        } else if (!_currentSubtitleIsValid(
          videoPlayerPosition: videoPlayerPosition.inMilliseconds,
        )) {
          _currentSubtitle = null;
        }
      }

      add(
        UpdateLoadedSubtitle(
          subtitle: _currentSubtitle,
        ),
      );
    },
  );
}