import 'dart:typed_data'; import 'package:archive/archive.dart'; import 'package:flutter/services.dart'; class AudioCache { // Filename, bytes Map _audioCache = {}; List get keys { return _audioCache.keys.toList(); } Uint8List? operator [](String key) { // ignore case key = key.toLowerCase(); for (var k in _audioCache.keys) { if (k.toLowerCase() == key) { return _audioCache[k]; } } return null; } } class AnnouncementCache extends AudioCache { String _assetLocation = "assets/ibus_recordings.zip"; Future loadAnnouncements(List announcements) async { List _announements = []; // remove any announcements that are already loaded for (var announcement in announcements) { if (!_audioCache.containsKey(announcement.toLowerCase())) { _announements.add(announcement); } } if (_announements.length == 0) { return; } final bytes = await rootBundle.load(_assetLocation); final archive = ZipDecoder().decodeBytes(bytes.buffer.asUint8List()); for (final file in archive) { String filename = file.name; if (filename.contains("/")) { filename = filename.split("/").last; } if (_announements.contains(filename)) { _audioCache[filename.toLowerCase()] = file.content; print("Loaded announcement: $filename"); } } } Future loadAllAnnouncements() async { print("Loading all announcements."); final bytes = await rootBundle.load(_assetLocation); final archive = ZipDecoder().decodeBytes(bytes.buffer.asUint8List()); print("Done decoding zip file."); print("Number of files: ${archive.length}"); for (final file in archive) { if (file.isFile == false) { continue; } String filename = file.name; if (filename.contains("/")) { filename = filename.split("/").last; } _audioCache[filename.toLowerCase()] = file.content; } print("Done loading all announcements."); } }