xref: /MusicFree/src/entry/bootstrap.ts (revision 1e2631083b0ce6e38aebceb471bdedfb47fc5083)
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';
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    trace('文件夹初始化完成');
42    // 加载配置
43    await Promise.all([
44        Config.setup(),
45        MediaMeta.setup(),
46        MusicSheet.setup(),
47        Network.setup(),
48    ]);
49    trace('配置初始化完成');
50    // 加载插件
51    try {
52        await TrackPlayer.setupPlayer({
53            maxCacheSize:
54                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
55        });
56    } catch (e: any) {
57        if (
58            e?.message !==
59            'The player has already been initialized via setupPlayer.'
60        ) {
61            throw e;
62        }
63    }
64    await TrackPlayer.updateOptions({
65        progressUpdateEventInterval: 0.4,
66        stopWithApp: false,
67        alwaysPauseOnInterruption: true,
68        capabilities: [
69            Capability.Play,
70            Capability.Pause,
71            Capability.SkipToNext,
72            Capability.SkipToPrevious,
73        ],
74        compactCapabilities: [
75            Capability.Play,
76            Capability.Pause,
77            Capability.SkipToNext,
78            Capability.SkipToPrevious,
79        ],
80        notificationCapabilities: [
81            Capability.Play,
82            Capability.Pause,
83            Capability.SkipToNext,
84            Capability.SkipToPrevious,
85        ],
86    });
87    trace('播放器初始化完成');
88    await Cache.setup();
89    trace('缓存初始化完成');
90    await Download.setup();
91    trace('下载初始化完成');
92    await PluginManager.setup();
93    trace('插件初始化完成');
94    await MusicQueue.setup();
95    trace('播放列表初始化完成');
96
97    ErrorUtils.setGlobalHandler(error => {
98        errorLog('未捕获的错误', error);
99    });
100}
101
102/** 初始化 */
103async function setupFolder() {
104    await Promise.all([
105        checkAndCreateDir(pathConst.dataPath),
106        checkAndCreateDir(pathConst.logPath),
107        checkAndCreateDir(pathConst.cachePath),
108        checkAndCreateDir(pathConst.storagePath),
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