【发布时间】:2021-12-13 16:37:41
【问题描述】:
例如,我的播客应用有一个所有已下载播客的列表,我如何使用 request() 方法获取已下载的所有 LockCachingAudioSource 的列表?
【问题讨论】:
标签: flutter just-audio
例如,我的播客应用有一个所有已下载播客的列表,我如何使用 request() 方法获取已下载的所有 LockCachingAudioSource 的列表?
【问题讨论】:
标签: flutter just-audio
创建LockCachingAudioSource 实例时,您可以选择要保存它们的位置。如果为此目的创建目录,则可以使用 Dart 的文件 I/O API 获取目录列表。目录列表还将显示部分下载的文件和其他您想要忽略的临时文件。这些有扩展名.mime 和.part。
解释完之后,这里有一个解决方案。首先,在应用初始化期间创建缓存目录:
final cacheDir = File('/your/choice/of/location');
...
await cacheDir.create(recursive: true);
然后对于每个音频源,像这样创建它:
import 'package:path/path.dart' as p;
...
source = LockCachingAudioSource(
uri,
cacheFile: File(p.joinAll([cacheDir, 'yourChoiceOfName.mp3'],
);
现在您可以随时通过列出cacheDir 并忽略任何临时文件来获取下载文件的列表:
final downloadedFiles = (await _getCacheDir()).list().where((f) =>
!['mime', 'part'].contains(f.path.replaceAll(RegExp(r'^.*\.'), '')));
如果您需要将这些文件转换回原始 URI,您可以创建自己的数据库来存储哪个文件对应哪个 URI,或者通过将 URI 编码为 base64 来选择每个缓存文件的文件名或可逆的东西,所以给定一个文件名,然后你可以将它解码回原始 URI。
【讨论】:
LockCachingAudioSource 播放它时没有必要,因为它将 Content-Type 标头存储在.mime 文件中,并在提供缓存文件时恢复该标头,无论文件名或其扩展名如何。还要记住,在网络上,某些 URL 无论如何都没有适当的扩展名。但是如果你想得到这个额外的步骤,你可以用一个文件名替换我解决方案的那部分,并加上你想要的扩展名。