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