1import { 2 internalSerializeKey, 3 localPluginPlatform, 4} from '@/constants/commonConst'; 5import produce from 'immer'; 6import objectPath from 'object-path'; 7 8/** 获取mediakey */ 9export function getMediaKey(mediaItem: ICommon.IMediaBase) { 10 return `${mediaItem.platform}@${mediaItem.id}`; 11} 12 13/** 解析mediakey */ 14export function parseMediaKey(key: string): ICommon.IMediaBase { 15 try { 16 const str = JSON.parse(key.trim()); 17 let platform, id; 18 if (typeof str === 'string') { 19 [platform, id] = str.split('@'); 20 } else { 21 platform = str?.platform; 22 id = str?.id; 23 } 24 if (!platform || !id) { 25 throw new Error('mediakey不完整'); 26 } 27 return { 28 platform, 29 id, 30 }; 31 } catch (e: any) { 32 throw e; 33 } 34} 35 36/** 比较两media是否相同 */ 37export function isSameMediaItem( 38 a: ICommon.IMediaBase | null | undefined, 39 b: ICommon.IMediaBase | null | undefined, 40) { 41 return a && b && a.id == b.id && a.platform === b.platform; 42} 43 44/** 查找是否存在 */ 45export function includesMedia( 46 a: ICommon.IMediaBase[] | null | undefined, 47 b: ICommon.IMediaBase | null | undefined, 48) { 49 if (!a || !b) { 50 return false; 51 } 52 return a.findIndex(_ => isSameMediaItem(_, b)) !== -1; 53} 54 55/** 获取复位的mediaItem */ 56export function resetMediaItem<T extends ICommon.IMediaBase>( 57 mediaItem: T, 58 platform?: string, 59 newObj?: boolean, 60): T { 61 // 本地音乐不做处理 62 if ( 63 mediaItem.platform === localPluginPlatform || 64 platform === localPluginPlatform 65 ) { 66 return newObj ? {...mediaItem} : mediaItem; 67 } 68 if (!newObj) { 69 mediaItem.platform = platform ?? mediaItem.platform; 70 mediaItem[internalSerializeKey] = undefined; 71 return mediaItem; 72 } else { 73 return produce(mediaItem, _ => { 74 _.platform = platform ?? mediaItem.platform; 75 _[internalSerializeKey] = undefined; 76 }); 77 } 78} 79 80export function mergeProps( 81 mediaItem: ICommon.IMediaBase, 82 props: Record<string, any> | undefined, 83 anotherProps?: Record<string, any> | undefined | null, 84) { 85 return props 86 ? { 87 ...mediaItem, 88 ...props, 89 ...(anotherProps ?? {}), 90 id: mediaItem.id, 91 platform: mediaItem.platform, 92 } 93 : mediaItem; 94} 95 96export enum InternalDataType { 97 LOCALPATH = 'localPath', 98} 99 100export function setInternalData<T extends ICommon.IMediaBase>( 101 mediaItem: T, 102 key: InternalDataType, 103 value: string | number | undefined | null, 104): T { 105 return produce(mediaItem, draft => { 106 objectPath.set(draft, `${internalSerializeKey}.${key}`, value); 107 }); 108} 109 110export function getInternalData<T>( 111 mediaItem: ICommon.IMediaBase | null | undefined, 112 key: InternalDataType, 113): T | undefined { 114 if (!mediaItem) { 115 return undefined; 116 } 117 return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`); 118} 119