xref: /MusicFree/src/entry/bootstrap.ts (revision b882a19d884fffa32f7c8cef31652b909dceaa0f)
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:
52                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
53        });
54    } catch (e: any) {
55        if (
56            e?.message !==
57            'The player has already been initialized via setupPlayer.'
58        ) {
59            throw e;
60        }
61    }
62    await TrackPlayer.updateOptions({
63        progressUpdateEventInterval: 0.4,
64        stopWithApp: false,
65        alwaysPauseOnInterruption: true,
66        capabilities: [
67            Capability.Play,
68            Capability.Pause,
69            Capability.SkipToNext,
70            Capability.SkipToPrevious,
71        ],
72        compactCapabilities: [
73            Capability.Play,
74            Capability.Pause,
75            Capability.SkipToNext,
76            Capability.SkipToPrevious,
77        ],
78        notificationCapabilities: [
79            Capability.Play,
80            Capability.Pause,
81            Capability.SkipToNext,
82            Capability.SkipToPrevious,
83        ],
84    });
85    await Cache.setup();
86    await Download.setup();
87    await PluginManager.setup();
88    await MusicQueue.setup();
89
90    ErrorUtils.setGlobalHandler(error => {
91        errorLog('未捕获的错误', error);
92    });
93}
94
95/** 初始化 */
96async function setupFolder() {
97    await Promise.all([
98        checkAndCreateDir(pathConst.dataPath),
99        checkAndCreateDir(pathConst.logPath),
100        checkAndCreateDir(pathConst.cachePath),
101        checkAndCreateDir(pathConst.storagePath),
102        checkAndCreateDir(pathConst.pluginPath),
103        checkAndCreateDir(pathConst.lrcCachePath),
104    ]);
105}
106
107export default async function () {
108    try {
109        await _bootstrap();
110    } catch (e) {
111        errorLog('初始化出错', e);
112        console.log(e);
113    }
114    // 隐藏开屏动画
115    console.log('HIDE');
116    RNBootSplash.hide({fade: true});
117}
118