xref: /MusicFree/src/entry/bootstrap.ts (revision 2489759dfdde34ed4dbfc95452a2bf5cb8a8ca13)
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 pathConst from '@/constants/pathConst';
9import {checkAndCreateDir} from '@/utils/fileUtils';
10import {errorLog, trace} from '@/utils/log';
11import MediaMeta from '@/core/mediaMeta';
12import Cache from '@/core/cache';
13import PluginManager from '@/core/pluginManager';
14import Network from '@/core/network';
15import {ImgAsset} from '@/constants/assetsConst';
16import LocalMusicSheet from '@/core/localMusicSheet';
17import {StatusBar} from 'react-native';
18
19/** app加载前执行
20 * 1. 检查权限
21 * 2. 数据初始化
22 * 3.
23 */
24async function _bootstrap() {
25    // 1. 检查权限
26    const [readStoragePermission, writeStoragePermission] = await Promise.all([
27        check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
28        check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
29    ]);
30    if (
31        !(
32            readStoragePermission === 'granted' &&
33            writeStoragePermission === 'granted'
34        )
35    ) {
36        await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
37        await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
38    }
39
40    // 2. 数据初始化
41    /** 初始化路径 */
42    await setupFolder();
43    trace('文件夹初始化完成');
44    // 加载配置
45    await Promise.all([
46        Config.setup(),
47        MediaMeta.setup(),
48        MusicSheet.setup(),
49        Network.setup(),
50    ]);
51    trace('配置初始化完成');
52    // 加载插件
53    try {
54        await TrackPlayer.setupPlayer({
55            maxCacheSize:
56                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
57        });
58    } catch (e: any) {
59        if (
60            e?.message !==
61            'The player has already been initialized via setupPlayer.'
62        ) {
63            throw e;
64        }
65    }
66    await TrackPlayer.updateOptions({
67        icon: ImgAsset.logoTransparent,
68        progressUpdateEventInterval: 1,
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 PluginManager.setup();
92    trace('插件初始化完成');
93    await MusicQueue.setup();
94    trace('播放列表初始化完成');
95    await LocalMusicSheet.setup();
96    trace('本地音乐初始化完成');
97
98    StatusBar.setBackgroundColor('transparent');
99    StatusBar.setTranslucent(true);
100    // Linking.addEventListener('url', (data) => {
101    //     console.log(data);
102    // })
103
104    ErrorUtils.setGlobalHandler(error => {
105        errorLog('未捕获的错误', error);
106    });
107}
108
109/** 初始化 */
110async function setupFolder() {
111    await Promise.all([
112        checkAndCreateDir(pathConst.dataPath),
113        checkAndCreateDir(pathConst.logPath),
114        checkAndCreateDir(pathConst.cachePath),
115        checkAndCreateDir(pathConst.pluginPath),
116        checkAndCreateDir(pathConst.lrcCachePath),
117        checkAndCreateDir(pathConst.downloadPath).then(() => {
118            checkAndCreateDir(pathConst.downloadMusicPath);
119        }),
120    ]);
121}
122
123export default async function () {
124    try {
125        await _bootstrap();
126    } catch (e) {
127        errorLog('初始化出错', e);
128        console.log(e);
129    }
130    // 隐藏开屏动画
131    console.log('HIDE');
132    RNBootSplash.hide({fade: true});
133}
134