xref: /MusicFree/src/entry/bootstrap.ts (revision 94a1b1fcf31b7f6a48cb07c4b2c377d2da3a2d79)
1bf6e62f2S猫头猫import MusicQueue from '@/common/musicQueue';
29872db12S猫头猫import MusicSheet from '@/common/musicSheetManager';
3bf6e62f2S猫头猫import {check, PERMISSIONS, request} from 'react-native-permissions';
4bf6e62f2S猫头猫import TrackPlayer, {Capability} from 'react-native-track-player';
5bf6e62f2S猫头猫import {pluginManager} from '../common/pluginManager';
6bf6e62f2S猫头猫import 'react-native-get-random-values';
76c6f45bdS猫头猫import {Platform, ToastAndroid} from 'react-native';
8bf6e62f2S猫头猫import {loadConfig} from '@/common/localConfigManager';
90d39db21S猫头猫import RNBootSplash from 'react-native-bootsplash';
106c6f45bdS猫头猫import RNFS, {exists, mkdir} from 'react-native-fs';
11233cafa6S猫头猫import DownloadManager from '@/common/downloadManager';
126780f402S猫头猫import pathConst from '@/constants/pathConst';
13be0a3650S猫头猫import {checkAndCreateDir} from '@/utils/fileUtils';
14c79c8a57S猫头猫import {errorLog} from '@/common/logManager';
152d0ec5c1S猫头猫import MediaMetaManager from '@/common/mediaMetaManager';
16bf6e62f2S猫头猫
17bf6e62f2S猫头猫/** app加载前执行 */
18*94a1b1fcS猫头猫async function _bootstrap() {
19bf6e62f2S猫头猫  // 检查权限
20bf6e62f2S猫头猫  const [readStoragePermission, writeStoragePermission] = await Promise.all([
21bf6e62f2S猫头猫    check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
22bf6e62f2S猫头猫    check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
23bf6e62f2S猫头猫  ]);
24bf6e62f2S猫头猫  if (
25bf6e62f2S猫头猫    !(
26bf6e62f2S猫头猫      readStoragePermission === 'granted' &&
27bf6e62f2S猫头猫      writeStoragePermission === 'granted'
28bf6e62f2S猫头猫    )
29bf6e62f2S猫头猫  ) {
30bf6e62f2S猫头猫    await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
31bf6e62f2S猫头猫    await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
32bf6e62f2S猫头猫  }
33bf6e62f2S猫头猫
346780f402S猫头猫  /** 初始化路径 */
356780f402S猫头猫  await setupFolder();
36bf6e62f2S猫头猫  // 加载配置
37bf6e62f2S猫头猫  await loadConfig();
38bf6e62f2S猫头猫  // 加载插件
39*94a1b1fcS猫头猫  try {
40*94a1b1fcS猫头猫    await TrackPlayer.setupPlayer();
41*94a1b1fcS猫头猫  } catch (e: any) {
42*94a1b1fcS猫头猫    if (
43*94a1b1fcS猫头猫      e?.message !== 'The player has already been initialized via setupPlayer.'
44*94a1b1fcS猫头猫    ) {
45*94a1b1fcS猫头猫      throw e;
46*94a1b1fcS猫头猫    }
47*94a1b1fcS猫头猫  }
48bf6e62f2S猫头猫
49bf6e62f2S猫头猫  Promise.all([
500d39db21S猫头猫    await pluginManager.setupPlugins(),
512d0ec5c1S猫头猫    await MediaMetaManager.setupMediaMeta(),
520d39db21S猫头猫  ]);
53bf6e62f2S猫头猫  await TrackPlayer.updateOptions({
54*94a1b1fcS猫头猫    progressUpdateEventInterval: 0.4,
55bf6e62f2S猫头猫    stopWithApp: false,
56bf6e62f2S猫头猫    alwaysPauseOnInterruption: true,
57bf6e62f2S猫头猫    capabilities: [
58bf6e62f2S猫头猫      Capability.Play,
59bf6e62f2S猫头猫      Capability.Pause,
60bf6e62f2S猫头猫      Capability.SkipToNext,
61bf6e62f2S猫头猫      Capability.SkipToPrevious,
62bf6e62f2S猫头猫    ],
63bf6e62f2S猫头猫    compactCapabilities: [
64bf6e62f2S猫头猫      Capability.Play,
65bf6e62f2S猫头猫      Capability.Pause,
66bf6e62f2S猫头猫      Capability.SkipToNext,
67bf6e62f2S猫头猫      Capability.SkipToPrevious,
68bf6e62f2S猫头猫    ],
69bf6e62f2S猫头猫    notificationCapabilities: [
70bf6e62f2S猫头猫      Capability.Play,
71bf6e62f2S猫头猫      Capability.Pause,
72bf6e62f2S猫头猫      Capability.SkipToNext,
73bf6e62f2S猫头猫      Capability.SkipToPrevious,
740d39db21S猫头猫    ],
750d39db21S猫头猫  });
76bf6e62f2S猫头猫  await MusicQueue.setupMusicQueue();
770d39db21S猫头猫  await MusicSheet.setupMusicSheet();
78233cafa6S猫头猫  await DownloadManager.setupDownload();
79bf6e62f2S猫头猫
80c79c8a57S猫头猫  ErrorUtils.setGlobalHandler(error => {
81c79c8a57S猫头猫    errorLog('未捕获的错误', error);
82c79c8a57S猫头猫  });
83bf6e62f2S猫头猫}
846c6f45bdS猫头猫
856c6f45bdS猫头猫/** 初始化 */
866c6f45bdS猫头猫async function setupFolder() {
876780f402S猫头猫  await Promise.all([
88be0a3650S猫头猫    checkAndCreateDir(pathConst.dataPath),
897f771613S猫头猫    checkAndCreateDir(pathConst.logPath),
907f771613S猫头猫    checkAndCreateDir(pathConst.cachePath),
91be0a3650S猫头猫    checkAndCreateDir(pathConst.storagePath),
92c79c8a57S猫头猫    checkAndCreateDir(pathConst.pluginPath),
93*94a1b1fcS猫头猫    checkAndCreateDir(pathConst.lrcCachePath),
946780f402S猫头猫  ]);
956c6f45bdS猫头猫}
96*94a1b1fcS猫头猫
97*94a1b1fcS猫头猫export default async function () {
98*94a1b1fcS猫头猫  try {
99*94a1b1fcS猫头猫    await _bootstrap();
100*94a1b1fcS猫头猫  } catch (e) {
101*94a1b1fcS猫头猫    errorLog('初始化出错', e);
102*94a1b1fcS猫头猫    console.log(e);
103*94a1b1fcS猫头猫  }
104*94a1b1fcS猫头猫  // 隐藏开屏动画
105*94a1b1fcS猫头猫  console.log('HIDE');
106*94a1b1fcS猫头猫  RNBootSplash.hide({fade: true});
107*94a1b1fcS猫头猫}
108