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