xref: /MusicFree/src/entry/bootstrap.ts (revision 8c55a6aa7a01f120247fcb5fabac8ec87ebb57cd)
1import MusicQueue from '@/core/musicQueue';
2import MusicSheet from '@/core/musicSheet';
3import {check, PERMISSIONS, request} from 'react-native-permissions';
4import TrackPlayer, {Capability} from 'react-native-track-player';
5import 'react-native-get-random-values';
6import Config from '@/core/config';
7import RNBootSplash from 'react-native-bootsplash';
8import Download from '@/core/download';
9import pathConst from '@/constants/pathConst';
10import {checkAndCreateDir} from '@/utils/fileUtils';
11import {errorLog, trace} from '@/utils/log';
12import MediaMeta from '@/core/mediaMeta';
13import Cache from '@/core/cache';
14import PluginManager from '@/core/pluginManager';
15import Network from '@/core/network';
16import {ImgAsset} from '@/constants/assetsConst';
17
18/** app加载前执行
19 * 1. 检查权限
20 * 2. 数据初始化
21 * 3.
22 */
23async function _bootstrap() {
24    // 1. 检查权限
25    const [readStoragePermission, writeStoragePermission] = await Promise.all([
26        check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
27        check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
28    ]);
29    if (
30        !(
31            readStoragePermission === 'granted' &&
32            writeStoragePermission === 'granted'
33        )
34    ) {
35        await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
36        await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
37    }
38
39    // 2. 数据初始化
40    /** 初始化路径 */
41    await setupFolder();
42    trace('文件夹初始化完成');
43    // 加载配置
44    await Promise.all([
45        Config.setup(),
46        MediaMeta.setup(),
47        MusicSheet.setup(),
48        Network.setup(),
49    ]);
50    trace('配置初始化完成');
51    // 加载插件
52    try {
53        await TrackPlayer.setupPlayer({
54            maxCacheSize:
55                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
56        });
57    } catch (e: any) {
58        if (
59            e?.message !==
60            'The player has already been initialized via setupPlayer.'
61        ) {
62            throw e;
63        }
64    }
65    await TrackPlayer.updateOptions({
66        icon: ImgAsset.logo,
67        progressUpdateEventInterval: 1,
68        alwaysPauseOnInterruption: true,
69        capabilities: [
70            Capability.Play,
71            Capability.Pause,
72            Capability.SkipToNext,
73            Capability.SkipToPrevious,
74        ],
75        compactCapabilities: [
76            Capability.Play,
77            Capability.Pause,
78            Capability.SkipToNext,
79            Capability.SkipToPrevious,
80        ],
81        notificationCapabilities: [
82            Capability.Play,
83            Capability.Pause,
84            Capability.SkipToNext,
85            Capability.SkipToPrevious,
86        ],
87    });
88    trace('播放器初始化完成');
89    await Cache.setup();
90    trace('缓存初始化完成');
91    await Download.setup();
92    trace('下载初始化完成');
93    await PluginManager.setup();
94    trace('插件初始化完成');
95    await MusicQueue.setup();
96    trace('播放列表初始化完成');
97
98    ErrorUtils.setGlobalHandler(error => {
99        errorLog('未捕获的错误', error);
100    });
101}
102
103/** 初始化 */
104async function setupFolder() {
105    await Promise.all([
106        checkAndCreateDir(pathConst.dataPath),
107        checkAndCreateDir(pathConst.logPath),
108        checkAndCreateDir(pathConst.cachePath),
109        checkAndCreateDir(pathConst.pluginPath),
110        checkAndCreateDir(pathConst.lrcCachePath),
111    ]);
112}
113
114export default async function () {
115    try {
116        await _bootstrap();
117    } catch (e) {
118        errorLog('初始化出错', e);
119        console.log(e);
120    }
121    // 隐藏开屏动画
122    console.log('HIDE');
123    RNBootSplash.hide({fade: true});
124}
125