xref: /MusicFree/src/entry/bootstrap.ts (revision 8e47be56b0121ae1a9c00382d70902276ffca225)
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';
18import Theme from '@/core/theme';
19
20/** app加载前执行
21 * 1. 检查权限
22 * 2. 数据初始化
23 * 3.
24 */
25async function _bootstrap() {
26    // 1. 检查权限
27    const [readStoragePermission, writeStoragePermission] = await Promise.all([
28        check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
29        check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
30    ]);
31    if (
32        !(
33            readStoragePermission === 'granted' &&
34            writeStoragePermission === 'granted'
35        )
36    ) {
37        await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
38        await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
39    }
40
41    // 2. 数据初始化
42    /** 初始化路径 */
43    await setupFolder();
44    trace('文件夹初始化完成');
45    // 加载配置
46    await Promise.all([
47        Config.setup(),
48        MediaMeta.setup(),
49        MusicSheet.setup(),
50        Network.setup(),
51    ]);
52    trace('配置初始化完成');
53    // 加载插件
54    try {
55        await TrackPlayer.setupPlayer({
56            maxCacheSize:
57                Config.get('setting.basic.maxCacheSize') ?? 1024 * 1024 * 512,
58        });
59    } catch (e: any) {
60        if (
61            e?.message !==
62            'The player has already been initialized via setupPlayer.'
63        ) {
64            throw e;
65        }
66    }
67    await TrackPlayer.updateOptions({
68        icon: ImgAsset.logoTransparent,
69        alwaysPauseOnInterruption: true,
70        progressUpdateEventInterval: 1,
71        capabilities: [
72            Capability.Play,
73            Capability.Pause,
74            Capability.SkipToNext,
75            Capability.SkipToPrevious,
76        ],
77        compactCapabilities: [
78            Capability.Play,
79            Capability.Pause,
80            Capability.SkipToNext,
81            Capability.SkipToPrevious,
82        ],
83        notificationCapabilities: [
84            Capability.Play,
85            Capability.Pause,
86            Capability.SkipToNext,
87            Capability.SkipToPrevious,
88        ],
89    });
90    trace('播放器初始化完成');
91    await Cache.setup();
92    trace('缓存初始化完成');
93    await PluginManager.setup();
94    trace('插件初始化完成');
95    await MusicQueue.setup();
96    trace('播放列表初始化完成');
97    await LocalMusicSheet.setup();
98    trace('本地音乐初始化完成');
99    Theme.setup();
100    trace('主题初始化完成');
101
102    StatusBar.setBackgroundColor('transparent');
103    StatusBar.setTranslucent(true);
104    // Linking.addEventListener('url', (data) => {
105    //     console.log(data);
106    // })
107
108    ErrorUtils.setGlobalHandler(error => {
109        errorLog('未捕获的错误', error);
110    });
111}
112
113/** 初始化 */
114async function setupFolder() {
115    await Promise.all([
116        checkAndCreateDir(pathConst.dataPath),
117        checkAndCreateDir(pathConst.logPath),
118        checkAndCreateDir(pathConst.cachePath),
119        checkAndCreateDir(pathConst.pluginPath),
120        checkAndCreateDir(pathConst.lrcCachePath),
121        checkAndCreateDir(pathConst.downloadPath).then(() => {
122            checkAndCreateDir(pathConst.downloadMusicPath);
123        }),
124    ]);
125}
126
127export default async function () {
128    try {
129        await _bootstrap();
130    } catch (e) {
131        errorLog('初始化出错', e);
132        console.log(e);
133    }
134    // 隐藏开屏动画
135    console.log('HIDE');
136    RNBootSplash.hide({fade: true});
137}
138