download.ts (72381fc823f297879320aa4df1618f334104d8d6) | download.ts (483fe5856044df91771f8cf65aeb02b7e2f61fad) |
---|---|
1import { 2 internalSerializeKey, 3 supportLocalMediaType, 4} from '@/constants/commonConst'; 5import pathConst from '@/constants/pathConst'; | 1import { 2 internalSerializeKey, 3 supportLocalMediaType, 4} from '@/constants/commonConst'; 5import pathConst from '@/constants/pathConst'; |
6import {addFileScheme, escapeCharacter} from '@/utils/fileUtils'; | 6import {addFileScheme, escapeCharacter, mkdirR} from '@/utils/fileUtils'; |
7import {errorLog} from '@/utils/log'; 8import {isSameMediaItem} from '@/utils/mediaItem'; 9import {getQualityOrder} from '@/utils/qualities'; 10import StateMapper from '@/utils/stateMapper'; 11import Toast from '@/utils/toast'; 12import produce from 'immer'; 13import {InteractionManager} from 'react-native'; | 7import {errorLog} from '@/utils/log'; 8import {isSameMediaItem} from '@/utils/mediaItem'; 9import {getQualityOrder} from '@/utils/qualities'; 10import StateMapper from '@/utils/stateMapper'; 11import Toast from '@/utils/toast'; 12import produce from 'immer'; 13import {InteractionManager} from 'react-native'; |
14import {downloadFile} from 'react-native-fs'; | 14import {downloadFile, exists} from 'react-native-fs'; |
15 16import Config from './config'; 17import LocalMusicSheet from './localMusicSheet'; 18import MediaMeta from './mediaMeta'; 19import Network from './network'; 20import PluginManager from './pluginManager'; 21import {PERMISSIONS, check} from 'react-native-permissions'; | 15 16import Config from './config'; 17import LocalMusicSheet from './localMusicSheet'; 18import MediaMeta from './mediaMeta'; 19import Network from './network'; 20import PluginManager from './pluginManager'; 21import {PERMISSIONS, check} from 'react-native-permissions'; |
22import path from 'path-browserify'; |
|
22// import PQueue from 'p-queue/dist'; 23// import PriorityQueue from 'p-queue/dist/priority-queue'; 24 25// interface IDownloadProgress { 26// progress: number; 27// size: number; 28// } 29 --- 223 unchanged lines hidden (view full) --- 253 _[nextDownloadItem.filename] = { 254 progress: res.bytesWritten, 255 size: res.contentLength, 256 }; 257 }); 258 }, 259 }); 260 nextDownloadItem = {...nextDownloadItem, jobId}; | 23// import PQueue from 'p-queue/dist'; 24// import PriorityQueue from 'p-queue/dist/priority-queue'; 25 26// interface IDownloadProgress { 27// progress: number; 28// size: number; 29// } 30 --- 223 unchanged lines hidden (view full) --- 254 _[nextDownloadItem.filename] = { 255 progress: res.bytesWritten, 256 size: res.contentLength, 257 }; 258 }); 259 }, 260 }); 261 nextDownloadItem = {...nextDownloadItem, jobId}; |
261 // TODO: 检测文件夹是否存在 | 262 263 let folder = path.dirname(targetDownloadPath); 264 let folderExists = await exists(folder); 265 266 if (!folderExists) { 267 await mkdirR(folder); 268 } |
262 try { 263 await promise; 264 /** 下载完成 */ 265 LocalMusicSheet.addMusicDraft({ 266 ...musicItem, 267 [internalSerializeKey]: { 268 localPath: targetDownloadPath, 269 }, --- 31 unchanged lines hidden (view full) --- 301 errorLog('下载失败', { 302 item: { 303 id: nextDownloadItem.musicItem.id, 304 title: nextDownloadItem.musicItem.title, 305 platform: nextDownloadItem.musicItem.platform, 306 quality: nextDownloadItem.quality, 307 }, 308 reason: e?.message ?? e, | 269 try { 270 await promise; 271 /** 下载完成 */ 272 LocalMusicSheet.addMusicDraft({ 273 ...musicItem, 274 [internalSerializeKey]: { 275 localPath: targetDownloadPath, 276 }, --- 31 unchanged lines hidden (view full) --- 308 errorLog('下载失败', { 309 item: { 310 id: nextDownloadItem.musicItem.id, 311 title: nextDownloadItem.musicItem.title, 312 platform: nextDownloadItem.musicItem.platform, 313 quality: nextDownloadItem.quality, 314 }, 315 reason: e?.message ?? e, |
316 targetDownloadPath: targetDownloadPath, |
|
309 }); 310 hasError = true; 311 } 312 removeFromDownloadingQueue(nextDownloadItem); 313 downloadingProgress = produce(downloadingProgress, draft => { 314 if (draft[nextDownloadItem.filename]) { 315 delete draft[nextDownloadItem.filename]; 316 } 317 }); 318 downloadNextAfterInteraction(); 319 if (downloadingMusicQueue.length === 0) { 320 stopNotifyProgress(); 321 LocalMusicSheet.saveLocalSheet(); 322 if (hasError) { 323 try { 324 const perm = await check( 325 PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE, 326 ); 327 if (perm !== 'granted') { | 317 }); 318 hasError = true; 319 } 320 removeFromDownloadingQueue(nextDownloadItem); 321 downloadingProgress = produce(downloadingProgress, draft => { 322 if (draft[nextDownloadItem.filename]) { 323 delete draft[nextDownloadItem.filename]; 324 } 325 }); 326 downloadNextAfterInteraction(); 327 if (downloadingMusicQueue.length === 0) { 328 stopNotifyProgress(); 329 LocalMusicSheet.saveLocalSheet(); 330 if (hasError) { 331 try { 332 const perm = await check( 333 PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE, 334 ); 335 if (perm !== 'granted') { |
328 Toast.success('权限不足,请检查是否授予写入文件的权限'); | 336 Toast.warn('权限不足,请检查是否授予写入文件的权限'); |
329 } else { 330 throw new Error(); 331 } 332 } catch { 333 Toast.success( 334 '部分下载失败,如果重复出现此现象请打开“侧边栏-记录错误日志”辅助排查', 335 ); 336 } --- 69 unchanged lines hidden --- | 337 } else { 338 throw new Error(); 339 } 340 } catch { 341 Toast.success( 342 '部分下载失败,如果重复出现此现象请打开“侧边栏-记录错误日志”辅助排查', 343 ); 344 } --- 69 unchanged lines hidden --- |