xref: /MusicFree/src/entry/bootstrap.ts (revision 6704747af84cebd842b258efac7143542722fac5)
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 {Platform, ToastAndroid} from 'react-native';
7import Config from '@/core/config';
8import RNBootSplash from 'react-native-bootsplash';
9import RNFS, {exists, mkdir} from 'react-native-fs';
10import Download from '@/core/download';
11import pathConst from '@/constants/pathConst';
12import {checkAndCreateDir} from '@/utils/fileUtils';
13import {errorLog} from '@/utils/log';
14import MediaMeta from '@/core/mediaMeta';
15import Cache from '@/core/cache';
16import PluginManager from '@/core/pluginManager';
17
18/** app加载前执行
19 * 1. 检查权限
20 * 2. 数据初始化
21 * 3.
22 */
23async function _bootstrap() {
24  // 1. 检查权限
25  const [readStoragePermission, writeStoragePermission] = await Promise.all([
26    check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
27    check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
28  ]);
29  if (
30    !(
31      readStoragePermission === 'granted' &&
32      writeStoragePermission === 'granted'
33    )
34  ) {
35    await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
36    await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
37  }
38
39  // 2. 数据初始化
40  /** 初始化路径 */
41  await setupFolder();
42  // 加载配置
43  await Promise.all([Config.setup(), MediaMeta.setup(), MusicSheet.setup()])
44  // 加载插件
45  try {
46    await TrackPlayer.setupPlayer();
47  } catch (e: any) {
48    if (
49      e?.message !== 'The player has already been initialized via setupPlayer.'
50    ) {
51      throw e;
52    }
53  }
54  await TrackPlayer.updateOptions({
55    progressUpdateEventInterval: 0.4,
56    stopWithApp: false,
57    alwaysPauseOnInterruption: true,
58    capabilities: [
59      Capability.Play,
60      Capability.Pause,
61      Capability.SkipToNext,
62      Capability.SkipToPrevious,
63    ],
64    compactCapabilities: [
65      Capability.Play,
66      Capability.Pause,
67      Capability.SkipToNext,
68      Capability.SkipToPrevious,
69    ],
70    notificationCapabilities: [
71      Capability.Play,
72      Capability.Pause,
73      Capability.SkipToNext,
74      Capability.SkipToPrevious,
75    ],
76  });
77  await Cache.setup()
78  await Download.setup();
79  await PluginManager.setup();
80  await MusicQueue.setup();
81
82
83  ErrorUtils.setGlobalHandler(error => {
84    errorLog('未捕获的错误', error);
85  });
86}
87
88/** 初始化 */
89async function setupFolder() {
90  await Promise.all([
91    checkAndCreateDir(pathConst.dataPath),
92    checkAndCreateDir(pathConst.logPath),
93    checkAndCreateDir(pathConst.cachePath),
94    checkAndCreateDir(pathConst.storagePath),
95    checkAndCreateDir(pathConst.pluginPath),
96    checkAndCreateDir(pathConst.lrcCachePath),
97  ]);
98}
99
100export default async function () {
101  try {
102    await _bootstrap();
103  } catch (e) {
104    errorLog('初始化出错', e);
105    console.log(e);
106  }
107  // 隐藏开屏动画
108  console.log('HIDE');
109  RNBootSplash.hide({fade: true});
110}
111