addMediaFile method

Future<bool> addMediaFile(
  1. File file, {
  2. bool notify = true,
  3. bool record = true,
})

Appends file to the end of the timeline. Returns whether it was added.

record adds an undo entry; batch imports pass false and record once.

Implementation

Future<bool> addMediaFile(File file, {bool notify = true, bool record = true}) async {
  try {
    final isImage = _isImageFile(file.path);
    final clipId = 'clip_${DateTime.now().microsecondsSinceEpoch}';

    if (isImage) {
      final img = await decodeImageFromList(await file.readAsBytes());
      final size = Size(img.width.toDouble(), img.height.toDouble());
      img.dispose();
      clipController.addClips([VideoEditorClip(
        id: clipId,
        file: file,
        isImage: true,
        duration: const Duration(seconds: 3),
        startTime: Duration.zero,
        endTime: const Duration(seconds: 3),
        volume: 0,
        playbackSpeed: 1.0,
        thumbnails: [file],
        width: size.width,
        height: size.height,
        hasAudio: false,
      )]);
    } else {
      final info = await VideoRenderService.probe(file);

      clipController.addClips([VideoEditorClip(
        id: clipId,
        file: file,
        isImage: false,
        duration: info.duration,
        startTime: Duration.zero,
        endTime: info.duration,
        volume: 1.0,
        playbackSpeed: 1.0,
        width: info.size.width,
        height: info.size.height,
        hasAudio: info.hasAudio,
      )]);

      // Use queue to process proxies and thumbnails sequentially to prevent iOS crashes
      _addToProcessingQueue(clipId);
    }
    _activeTrack = null;
    _error = null;
    if (record) _saveState();
    if (notify) notifyListeners();
    if (record) _updateVideoPlayerForCurrentClip();
    return true;
  } catch (e) {
    _setError('Failed to read media: $e');
    return false;
  }
}