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 ---