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