<commit_before>## MediaLoader-音视频边下边播组件

## 简介
一行代码就能支持任意播放器的音视频边下边播、缓存自动管理！MediaLoader是一个运行于Android上的音视频加载组件，它实现了音频和视频的边下载边播放、缓存自动管理、预下载等功能，它具有如下几个功能特性：
- 边下载边播放功能，无需等待下载完成后才播放；
- 下载缓存功能，再次播放会使用已有的缓存，不浪费额外流量；
- 支持Android所有主流播放器（如MediaPlayer、VideoView）、第三方播放器（如ExoPlayer、腾讯视频）；
- 缓存自动管理功能，可以设置缓存路径、文件命名规则、最大缓存空间、最大缓存数量等；
- 预下载功能，可以预先下载需要的音视频，支持暂停、继续（断点续传）等操作。

## 功能清单
**边下边播（MediaLoader）**：

|功能|API|
|------|------|
| 创建实例| MediaLoader#getInstance(Context context)|
| 初始化设置| MediaLoader#init(MediaLoaderConfig mediaLoaderConfig)|
| 获取代理url| MediaLoader#getProxyUrl(String url)|
| 是否缓存文件| MediaLoader#isCached(String url)|
| 获取缓存的文件| MediaLoader#getCacheFile(String url)|
| 清除缓存目录| MediaLoader#cleanCacheDir()|
| 添加下载监听器| MediaLoader#addDownloadListener(String url, DownloadListener listener)|
| 删除下载监听器| MediaLoader#removeDownloadListener(String url, DownloadListener listener)|
| 删除下载监听器| MediaLoader#removeDownloadListener(DownloadListener listener)|
| 暂停下载| MediaLoader#pauseDownload(String url)|
| 继续下载| MediaLoader#resumeDownload(String url)|
| 销毁实例| MediaLoader#destroy()|

**MediaLoader初始化设置（MediaLoaderConfig.Builder）**：

|功能|API|
|------|------|
| 设置缓存目录| MediaLoaderConfig.Builder#cacheRootDir(File file)|
| 设置缓存文件命名生成器| MediaLoaderConfig.Builder#cacheFileNameGenerator(FileNameCreator fileNameCreator)|
| 设置最大缓存文件总大小| MediaLoaderConfig.Builder#maxCacheFilesSize(long size)|
| 设置最大缓存文件数量| MediaLoaderConfig.Builder#maxCacheFilesCount(int count)|
| 设置最大缓存文件时间期限| MediaLoaderConfig.Builder#maxCacheFileTimeLimit(long timeLimit)|
| 设置下载线程池数量| MediaLoaderConfig.Builder#downloadThreadPoolSize(int threadPoolSize)|
| 设置下载线程优先级| MediaLoaderConfig.Builder#downloadThreadPriority(int threadPriority)|
| 设置下载ExecutorService| MediaLoaderConfig.Builder#downloadExecutorService(ExecutorService executorService)|
| 创建MediaLoaderConfig实例| MediaLoaderConfig.Builder#build()|

**预下载（DownloadManager）**：

|功能|API|
|------|------|
| 创建实例| DownloadManager#getInstance(Context context)|
| 启动下载| DownloadManager#enqueue(Request request)|
| 启动下载| DownloadManager#enqueue(Request request, DownloadListener listener)|
| 下载是否正在运行| DownloadManager#isRunning(String url)|
| 暂停下载| DownloadManager#pause(String url)|
| 继续下载| DownloadManager#resume(String url)|
| 停止下载| DownloadManager#stop(String url)|
| 暂停所有下载| DownloadManager#pauseAll()|
| 继续所有下载| DownloadManager#resumeAll()|
| 停止所有下载| DownloadManager#stopAll()|
| 是否缓存文件| DownloadManager#isCached(String url)|
| 获取缓存的文件| DownloadManager#getCacheFile(String url)|
| 清除缓存目录| DownloadManager#cleanCacheDir()|


## 快速上手
只要一行代码就能拥有强大功能，将音视频的原有URL替换成代理URL，然后像往常一样使用即可：
```
String proxyUrl = MediaLoader.getInstance(getContext()).getProxyUrl(VIDEO_URL);
videoView.setVideoPath(proxyUrl);
```

## DEMO
DEMO请直接参见源码中的sample工程，它就几种常见的边下边播场景进行展示如何使用，如图所示：
![image](https://github.com/yangwencan2002/MediaLoader/blob/master/sample.png)

## FAQ常见问题
**1、Q：MediaLoader的默认初始化配置是怎么样的？**
A：

|参数名|默认值|
|------|------|
|文件缓存目录|sdcard/Android/data/${application package}/cache/medialoader|
|文件命名规则|MD5(url)|
|最大缓存文件数|500|
|最大缓存空间|500* 1024 * 1024（500M）|
|最大缓存期限|10 * 24 * 60 * 60（10天）|
|下载线程数|3|
|下载线程优先级|Thread.MAX_PRIORITY|

**2、Q：如何更改默认初始化配置？**
A：默认的配置参数相对来说已经比较合理，如果不满足需求可以通过以下代码进行更改：
```
        MediaLoaderConfig mediaLoaderConfig = new MediaLoaderConfig.Builder(this)
                .cacheRootDir(DefaultConfigFactory.createCacheRootDir(this, "my_cache_dir"))
                .cacheFileNameGenerator(new HashCodeFileNameCreator())//组件内置的hash code命名规则
                .maxCacheFilesCount(100)
                .maxCacheFilesSize(100 * 1024 * 1024)
                .maxCacheFileTimeLimit(5 * 24 * 60 * 60)
                .downloadThreadPoolSize(3)
                .downloadThreadPriority(Thread.NORM_PRIORITY)
                .build();
        MediaLoader.getInstance(this).init(mediaLoaderConfig);<commit_msg>README.md<commit_after>## MediaLoader-音视频边下边播组件

## 简介
一行代码就能支持任意播放器的音视频边下边播、缓存自动管理！MediaLoader是一个运行于Android上的音视频加载组件，它实现了音频和视频的边下载边播放、缓存自动管理、预下载等功能，它具有如下几个功能特性：
- 边下载边播放功能，无需等待下载完成后才播放；
- 下载缓存功能，再次播放会使用已有的缓存，不浪费额外流量；
- 支持Android所有主流播放器（如MediaPlayer、VideoView）、第三方播放器（如ExoPlayer、腾讯视频）；
- 缓存自动管理功能，可以设置缓存路径、文件命名规则、最大缓存空间、最大缓存数量等；
- 预下载功能，可以预先下载需要的音视频，支持暂停、继续（断点续传）等操作。

## 功能清单
**边下边播（MediaLoader）**：

|功能|API|
|------|------|
| 创建实例| MediaLoader#getInstance(Context context)|
| 初始化设置| MediaLoader#init(MediaLoaderConfig mediaLoaderConfig)|
| 获取代理url| MediaLoader#getProxyUrl(String url)|
| 是否缓存文件| MediaLoader#isCached(String url)|
| 获取缓存的文件| MediaLoader#getCacheFile(String url)|
| 清除缓存目录| MediaLoader#cleanCacheDir()|
| 添加下载监听器| MediaLoader#addDownloadListener(String url, DownloadListener listener)|
| 删除下载监听器| MediaLoader#removeDownloadListener(String url, DownloadListener listener)|
| 删除下载监听器| MediaLoader#removeDownloadListener(DownloadListener listener)|
| 暂停下载| MediaLoader#pauseDownload(String url)|
| 继续下载| MediaLoader#resumeDownload(String url)|
| 销毁实例| MediaLoader#destroy()|

**MediaLoader初始化设置（MediaLoaderConfig.Builder）**：

|功能|API|
|------|------|
| 设置缓存目录| MediaLoaderConfig.Builder#cacheRootDir(File file)|
| 设置缓存文件命名生成器| MediaLoaderConfig.Builder#cacheFileNameGenerator(FileNameCreator fileNameCreator)|
| 设置最大缓存文件总大小| MediaLoaderConfig.Builder#maxCacheFilesSize(long size)|
| 设置最大缓存文件数量| MediaLoaderConfig.Builder#maxCacheFilesCount(int count)|
| 设置最大缓存文件时间期限| MediaLoaderConfig.Builder#maxCacheFileTimeLimit(long timeLimit)|
| 设置下载线程池数量| MediaLoaderConfig.Builder#downloadThreadPoolSize(int threadPoolSize)|
| 设置下载线程优先级| MediaLoaderConfig.Builder#downloadThreadPriority(int threadPriority)|
| 设置下载ExecutorService| MediaLoaderConfig.Builder#downloadExecutorService(ExecutorService executorService)|
| 创建MediaLoaderConfig实例| MediaLoaderConfig.Builder#build()|

**预下载（DownloadManager）**：

|功能|API|
|------|------|
| 创建实例| DownloadManager#getInstance(Context context)|
| 启动下载| DownloadManager#enqueue(Request request)|
| 启动下载| DownloadManager#enqueue(Request request, DownloadListener listener)|
| 下载是否正在运行| DownloadManager#isRunning(String url)|
| 暂停下载| DownloadManager#pause(String url)|
| 继续下载| DownloadManager#resume(String url)|
| 停止下载| DownloadManager#stop(String url)|
| 暂停所有下载| DownloadManager#pauseAll()|
| 继续所有下载| DownloadManager#resumeAll()|
| 停止所有下载| DownloadManager#stopAll()|
| 是否缓存文件| DownloadManager#isCached(String url)|
| 获取缓存的文件| DownloadManager#getCacheFile(String url)|
| 清除缓存目录| DownloadManager#cleanCacheDir()|


## 快速上手
只要一行代码就能拥有强大功能，将音视频的原有URL替换成代理URL，然后像往常一样使用即可：
```
String proxyUrl = MediaLoader.getInstance(getContext()).getProxyUrl(VIDEO_URL);
videoView.setVideoPath(proxyUrl);
```

## DEMO
DEMO请直接参见源码中的sample工程，它就几种常见的边下边播场景进行展示如何使用，如图所示：
![image](https://github.com/yangwencan2002/MediaLoader/blob/master/sample.png)

## FAQ常见问题
**1. Q：MediaLoader的默认初始化配置是怎么样的？**
A：

|参数名|默认值|
|------|------|
|文件缓存目录|sdcard/Android/data/${application package}/cache/medialoader|
|文件命名规则|MD5(url)|
|最大缓存文件数|500|
|最大缓存空间|500* 1024 * 1024（500M）|
|最大缓存期限|10 * 24 * 60 * 60（10天）|
|下载线程数|3|
|下载线程优先级|Thread.MAX_PRIORITY|

**2. Q：如何更改默认初始化配置？**
A：默认的配置参数相对来说已经比较合理，如果不满足需求可以通过以下代码进行更改：
```
        MediaLoaderConfig mediaLoaderConfig = new MediaLoaderConfig.Builder(this)
                .cacheRootDir(DefaultConfigFactory.createCacheRootDir(this, "my_cache_dir"))
                .cacheFileNameGenerator(new HashCodeFileNameCreator())//组件内置的hash code命名规则
                .maxCacheFilesCount(100)
                .maxCacheFilesSize(100 * 1024 * 1024)
                .maxCacheFileTimeLimit(5 * 24 * 60 * 60)
                .downloadThreadPoolSize(3)
                .downloadThreadPriority(Thread.NORM_PRIORITY)
                .build();
        MediaLoader.getInstance(this).init(mediaLoaderConfig);
{'fraction_non_alphanumeric': 0.13504697286012526, 'fraction_numerical': 0.014874739039665972, 'mean_word_length': 6.918388429752066, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 56, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3967288', 'n_tokens_mistral': 3424, 'n_tokens_neox': 3755, 'n_words': 333}