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