import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/widgets.dart'; import 'package:wechat_assets_picker/wechat_assets_picker.dart'; import 'video_batch_upload_config.dart'; import 'video_batch_upload_task.dart'; class VideoBatchUploadPicker { const VideoBatchUploadPicker._(); static Future> pickVideos( BuildContext context, { int maxAssets = VideoBatchUploadConfig.maxAssets, }) async { return pickMedia( context, maxAssets: maxAssets, assetType: VideoBatchUploadAssetType.video, ); } static Future> pickImages( BuildContext context, { int maxAssets = VideoBatchUploadConfig.maxAssets, }) async { return pickMedia( context, maxAssets: maxAssets, assetType: VideoBatchUploadAssetType.image, ); } static Future> pickMedia( BuildContext context, { int maxAssets = VideoBatchUploadConfig.maxAssets, VideoBatchUploadAssetType assetType = VideoBatchUploadAssetType.video, }) async { final List? assets = await AssetPicker.pickAssets( context, pickerConfig: AssetPickerConfig( maxAssets: maxAssets, requestType: _requestType(assetType), ), ); if (assets == null || assets.isEmpty) { return []; } final List tasks = []; for (final AssetEntity asset in assets) { final File? file = await asset.file; if (file == null) { continue; } final Uint8List? thumbnail = await asset.thumbnailDataWithSize( const ThumbnailSize.square(220), quality: 72, ); final int fileSize = await file.length(); tasks.add( VideoBatchUploadTask( id: '${asset.id}_${DateTime.now().microsecondsSinceEpoch}', assetType: assetType, file: file, fileName: _normalizeFileName(asset.title, file.path, assetType), fileSize: fileSize, duration: assetType == VideoBatchUploadAssetType.video ? asset.duration : 0, thumbnail: thumbnail, ), ); } return tasks; } static RequestType _requestType(VideoBatchUploadAssetType assetType) { switch (assetType) { case VideoBatchUploadAssetType.image: return RequestType.image; case VideoBatchUploadAssetType.video: return RequestType.video; } } static String _normalizeFileName( String? assetTitle, String path, VideoBatchUploadAssetType assetType, ) { final String title = (assetTitle ?? '').trim(); if (title.isNotEmpty) { return title; } final List segments = path.split(Platform.pathSeparator); final String fileName = segments.isEmpty ? '' : segments.last.trim(); return fileName.isEmpty ? assetType.defaultFileName : fileName; } }