load method

Implementation

Future<MiniProgramMediaPlaybackSession> load(
  MiniProgramMediaPlaybackRequest request,
) async {
  if (_disposed) {
    throw const MiniProgramMediaPlaybackException(
      errorCode: MiniProgramErrorCodes.mediaProviderUnavailable,
      message: 'The media playback manager has been disposed.',
    );
  }
  final key = _key(request.miniProgramId, request.playerId);
  final existing = _sessions[key];
  if (existing != null && existing.sourceKey == request.sourceKey) {
    if (request.autoplay) await existing.play();
    return existing;
  }
  final pending = _pending[key];
  if (pending != null) {
    if (pending.sourceKey == request.sourceKey) return pending.future;
    throw const MiniProgramMediaPlaybackException(
      errorCode: MiniProgramErrorCodes.mediaRequestInProgress,
      message: 'Another media source is loading for this player.',
    );
  }
  final generation = (_generations[key] ?? 0) + 1;
  _generations[key] = generation;
  _sessions.remove(key);
  final future = _replaceSession(key, existing, request, generation);
  _pending[key] = _PendingMediaPlaybackLoad(
    sourceKey: request.sourceKey,
    future: future,
  );
  try {
    return await future;
  } finally {
    if (identical(_pending[key]?.future, future)) {
      _pending.remove(key);
    }
  }
}