πŸ“¦ media_cache_manager

⚑ Helps you to cache and encrypt media (Audio 🎡, Video 🎬, Image πŸ–ΌοΈ, etc...) Permanently or for a specific time.

With just a URL, the DownloadMediaBuilder widget will:

  • πŸ” Search locally for the file.
  • πŸ“‚ If found β†’ File will be returned in a snapshot.
  • ⬇️ If not found β†’ File will be downloaded and stored locally, then returned in a snapshot.

✨ What’s New?

  • πŸ—“οΈ daysToExpire behavior improved.
  • βš™οΈ autoDownload option to enable/disable auto download.
  • πŸ“ Renamed onInit ➝ onInitialize.
  • πŸ”„ Added initial state to DownloadMediaStatus.
  • πŸ” Encrypt & decrypt files with AES.
  • ⏹️ Cancel downloads anytime.
  • πŸ” Retry failed downloads.
  • πŸ”„ Added Encrypting / Decrypting states.
  • 🧩 Refactored DownloadMediaBuilder widget.
  • πŸš€ Optimized plugin imports.

πŸ“₯ Install

Add to your pubspec.yaml:

dependencies:
  media_cache_manager: 

βš™οΈ Android Setup

  1. Open android β†’ app β†’ build.gradle
  2. Add this inside defaultConfig:
multiDexEnabled true
minSdkVersion 20

πŸš€ Initializing Plugin (Required)

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await MediaCacheManager.instance.init();
  runApp(const MyApp());
}

πŸ” Encrypted Files (Optional)

Encrypt media files using AES (OFB mode).

βœ… Enable encryption globally

await MediaCacheManager.instance.setEncryptionPassword("I love flutter");

or directly on init:

await MediaCacheManager.instance.init(encryptionPassword: 'I love flutter');

⚠️ Notes:

  • 🐒 Large files may take more time to en/decrypt.
  • πŸ”’ Files are stored in Temporary Directory, so users & other apps can’t access them.
  • πŸ”‘ Keep passwords safe! The plugin does not cache your file passwords.

πŸ” Encrypt single file

DownloadMediaBuilder(
  url: "https://example.com/sample.jpg",
  encryptionPassword: "this is a password",  
  onSuccess: (snapshot) {
    return Image.file(File(snapshot.filePath!));
  }
)

⏳ File Expiration (Optional)

Make cached files expire automatically after specific days.

await MediaCacheManager.instance.setExpireDate(daysToExpire: 10);

or via init:

await MediaCacheManager.instance.init(daysToExpire: 1);

πŸ“Œ Behavior: If a file is accessed before its expiration β†’ expiration will extend automatically.


⚑ General Usage

DownloadMediaBuilder(
  url: 'https://example.com/sample.jpg',
  onSuccess: (snapshot) {
    return Image.file(File(snapshot.filePath!));
  },
  onLoading: (snapshot) {
    return LinearProgressIndicator(value: snapshot.progress);
  },
),

⏯️ Disable Auto Download

By default, autoDownload = true. You can disable it and control downloads manually:

late DownloadMediaBuilderController controller;

DownloadMediaBuilder(
  url: 'https://example.com/video.mp4',
  autoDownload: false,
  onInitialize: (ctrl) => controller = ctrl,
  onInitial: (_) {
    return ElevatedButton(
      onPressed: controller.getFile,
      child: const Text('Load file'),
    );
  },
  onSuccess: (snapshot) => BetterPlayer.file(snapshot.filePath!),
  onLoading: (snapshot) => LinearProgressIndicator(value: snapshot.progress),
),

⚠️ Handle Loading & Error States

DownloadMediaBuilder(
  url: 'https://example.com/video.mp4',
  onLoading: (snapshot) => LinearProgressIndicator(value: snapshot.progress),
  onSuccess: (snapshot) => BetterPlayer.file(snapshot.filePath!),
  onError: (_) => const Text('❌ Error!'),
),

⏹️ Cancel & πŸ”„ Retry Downloads

late DownloadMediaBuilderController controller;

DownloadMediaBuilder(
  url: 'https://example.com/video.mp4',
  onInitialize: (ctrl) => controller = ctrl,
  onLoading: (snapshot) {
    return Column(
      children: [
        LinearProgressIndicator(value: snapshot.progress),
        ElevatedButton(
          onPressed: controller.cancel,
          child: const Text('Cancel Download'),
        ),
      ],
    );
  },
  onSuccess: (snapshot) => BetterPlayer.file(snapshot.filePath!),
  onError: (_) => const Text('❌ Error!'),
  onCancel: (_) {
    return ElevatedButton(
      onPressed: controller.retry,
      child: const Text('Retry'),
    );
  },
),

πŸ“Œ Notes:

  • ❌ You can only call cancel() if status = loading.
  • πŸ” You can only call retry() if status = canceled.

πŸ“Š Snapshot Explained

DownloadMediaSnapshot contains 3 fields:

  1. Status β†’ Initial, Success, Loading, Error, Canceled, Encrypting, Decrypting.
  2. FilePath β†’ Available if file is downloaded.
  3. Progress β†’ Download progress (0 β†’ 1).