handleDownload method

Future<void> handleDownload(
  1. ArgResults argResults
)

Implementation

Future<void> handleDownload(ArgResults argResults) async {
  final args = argResults.rest.sublist(1);
  if (args.isEmpty) _exit('Usage: dl <file-uuid-or-path>');

  await _prepareClient();
  final input = args[0];
  final onConflict = argResults['on-conflict'] as String;

  final isUuid = RegExp(
          r'^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$',
          caseSensitive: false)
      .hasMatch(input);

  if (isUuid) {
    print('\ud83d\udce5 Downloading file by UUID: $input');
    try {
      final result = await client.downloadFile(input);
      final data = result['data'] as Uint8List;
      final filename = result['filename'] as String;
      final file = File(filename);

      if (await file.exists() && onConflict == 'skip' && !force) {
        print('\u23ed\ufe0f  Skipping: $filename (exists)');
        return;
      }

      await file.writeAsBytes(data);
      print('\u2705 Downloaded: $filename (${formatSize(data.length)})');
    } catch (e) {
      _exit('Download failed: $e');
    }
  } else {
    print('\ud83d\udd0d Resolving path: $input');
    try {
      final resolved = await client.resolvePath(input);
      if (resolved['type'] != 'file') {
        _exit("'$input' is not a file. Use 'download-path -r' for folders.");
      }
      final fileUuid = resolved['uuid'];
      final filename = p.basename(input);

      print('\ud83d\udce5 Downloading: $filename');
      await client.downloadFile(fileUuid, savePath: filename);
      print('\u2705 Downloaded: $filename');
    } catch (e) {
      _exit('Download failed: $e');
    }
  }
}