【问题标题】:How to get a list of all cached audio?如何获取所有缓存音频的列表?
【发布时间】:2021-12-13 16:37:41
【问题描述】:

例如,我的播客应用有一个所有已下载播客的列表,我如何使用 request() 方法获取已下载的所有 LockCachingAudioSource 的列表?

【问题讨论】:

    标签: flutter just-audio


    【解决方案1】:

    创建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。

    【讨论】:

    • 但“yourChoiceOfName.mp3”中的名称扩展必须与 uri 中的音频文件类型匹配,对吗?因为来自 uri 的音频可以是 m4a 文件之类的。
    • 通过LockCachingAudioSource 播放它时没有必要,因为它将 Content-Type 标头存储在.mime 文件中,并在提供缓存文件时恢复该标头,无论文件名或其扩展名如何。还要记住,在网络上,某些 URL 无论如何都没有适当的扩展名。但是如果你想得到这个额外的步骤,你可以用一个文件名替换我解决方案的那部分,并加上你想要的扩展名。
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2016-05-31
    相关资源
    最近更新 更多