17993f90eS猫头猫import { 27993f90eS猫头猫 internalSerializeKey, 37993f90eS猫头猫 localPluginPlatform, 45500cea7S猫头猫 sortIndexSymbol, 55500cea7S猫头猫 timeStampSymbol, 67993f90eS猫头猫} from '@/constants/commonConst'; 7*43eb30bfS猫头猫import MediaMeta from '@/core/mediaExtra'; 8242960d3S猫头猫import produce from 'immer'; 90e4173cdS猫头猫import objectPath from 'object-path'; 10242960d3S猫头猫 11242960d3S猫头猫/** 获取mediakey */ 12242960d3S猫头猫export function getMediaKey(mediaItem: ICommon.IMediaBase) { 13242960d3S猫头猫 return `${mediaItem.platform}@${mediaItem.id}`; 14242960d3S猫头猫} 15242960d3S猫头猫 165276aef9S猫头猫/** 解析mediakey */ 175276aef9S猫头猫export function parseMediaKey(key: string): ICommon.IMediaBase { 185276aef9S猫头猫 try { 195276aef9S猫头猫 const str = JSON.parse(key.trim()); 205276aef9S猫头猫 let platform, id; 215276aef9S猫头猫 if (typeof str === 'string') { 225276aef9S猫头猫 [platform, id] = str.split('@'); 235276aef9S猫头猫 } else { 245276aef9S猫头猫 platform = str?.platform; 255276aef9S猫头猫 id = str?.id; 265276aef9S猫头猫 } 275276aef9S猫头猫 if (!platform || !id) { 284060c00aS猫头猫 throw new Error('mediakey不完整'); 295276aef9S猫头猫 } 305276aef9S猫头猫 return { 315276aef9S猫头猫 platform, 325276aef9S猫头猫 id, 335276aef9S猫头猫 }; 345276aef9S猫头猫 } catch (e: any) { 355276aef9S猫头猫 throw e; 365276aef9S猫头猫 } 375276aef9S猫头猫} 385276aef9S猫头猫 390e4173cdS猫头猫/** 比较两media是否相同 */ 40242960d3S猫头猫export function isSameMediaItem( 41242960d3S猫头猫 a: ICommon.IMediaBase | null | undefined, 42242960d3S猫头猫 b: ICommon.IMediaBase | null | undefined, 43242960d3S猫头猫) { 4480b610c3S猫头猫 return a && b && a.id == b.id && a.platform === b.platform; 45242960d3S猫头猫} 46242960d3S猫头猫 470e4173cdS猫头猫/** 查找是否存在 */ 480e4173cdS猫头猫export function includesMedia( 490e4173cdS猫头猫 a: ICommon.IMediaBase[] | null | undefined, 500e4173cdS猫头猫 b: ICommon.IMediaBase | null | undefined, 510e4173cdS猫头猫) { 520e4173cdS猫头猫 if (!a || !b) { 530e4173cdS猫头猫 return false; 540e4173cdS猫头猫 } 550e4173cdS猫头猫 return a.findIndex(_ => isSameMediaItem(_, b)) !== -1; 560e4173cdS猫头猫} 570e4173cdS猫头猫 58242960d3S猫头猫/** 获取复位的mediaItem */ 595281926bS猫头猫export function resetMediaItem<T extends Partial<ICommon.IMediaBase>>( 608b88e961S猫头猫 mediaItem: T, 61242960d3S猫头猫 platform?: string, 628b88e961S猫头猫 newObj?: boolean, 638b88e961S猫头猫): T { 647993f90eS猫头猫 // 本地音乐不做处理 657993f90eS猫头猫 if ( 667993f90eS猫头猫 mediaItem.platform === localPluginPlatform || 677993f90eS猫头猫 platform === localPluginPlatform 687993f90eS猫头猫 ) { 697993f90eS猫头猫 return newObj ? {...mediaItem} : mediaItem; 707993f90eS猫头猫 } 718b88e961S猫头猫 if (!newObj) { 72242960d3S猫头猫 mediaItem.platform = platform ?? mediaItem.platform; 730e4173cdS猫头猫 mediaItem[internalSerializeKey] = undefined; 74242960d3S猫头猫 return mediaItem; 75242960d3S猫头猫 } else { 76242960d3S猫头猫 return produce(mediaItem, _ => { 77242960d3S猫头猫 _.platform = platform ?? mediaItem.platform; 780e4173cdS猫头猫 _[internalSerializeKey] = undefined; 79242960d3S猫头猫 }); 80242960d3S猫头猫 } 81242960d3S猫头猫} 828b88e961S猫头猫 835276aef9S猫头猫export function mergeProps( 845276aef9S猫头猫 mediaItem: ICommon.IMediaBase, 855276aef9S猫头猫 props: Record<string, any> | undefined, 8674d0cf81S猫头猫 anotherProps?: Record<string, any> | undefined | null, 875276aef9S猫头猫) { 885276aef9S猫头猫 return props 895276aef9S猫头猫 ? { 908b88e961S猫头猫 ...mediaItem, 915276aef9S猫头猫 ...props, 9274d0cf81S猫头猫 ...(anotherProps ?? {}), 9374d0cf81S猫头猫 id: mediaItem.id, 9474d0cf81S猫头猫 platform: mediaItem.platform, 955276aef9S猫头猫 } 965276aef9S猫头猫 : mediaItem; 978b88e961S猫头猫} 980e4173cdS猫头猫 990e4173cdS猫头猫export enum InternalDataType { 1000e4173cdS猫头猫 LOCALPATH = 'localPath', 1010e4173cdS猫头猫} 1020e4173cdS猫头猫 1030e4173cdS猫头猫export function setInternalData<T extends ICommon.IMediaBase>( 1040e4173cdS猫头猫 mediaItem: T, 1050e4173cdS猫头猫 key: InternalDataType, 1060e4173cdS猫头猫 value: string | number | undefined | null, 1070e4173cdS猫头猫): T { 1080e4173cdS猫头猫 return produce(mediaItem, draft => { 1090e4173cdS猫头猫 objectPath.set(draft, `${internalSerializeKey}.${key}`, value); 1100e4173cdS猫头猫 }); 1110e4173cdS猫头猫} 1120e4173cdS猫头猫 1130e4173cdS猫头猫export function getInternalData<T>( 1140e4173cdS猫头猫 mediaItem: ICommon.IMediaBase | null | undefined, 1150e4173cdS猫头猫 key: InternalDataType, 1160e4173cdS猫头猫): T | undefined { 1170e4173cdS猫头猫 if (!mediaItem) { 1180e4173cdS猫头猫 return undefined; 1190e4173cdS猫头猫 } 1200e4173cdS猫头猫 return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`); 1210e4173cdS猫头猫} 12234a18328S猫头猫 12334a18328S猫头猫export function trimInternalData( 12434a18328S猫头猫 mediaItem: ICommon.IMediaBase | null | undefined, 12534a18328S猫头猫) { 12634a18328S猫头猫 if (!mediaItem) { 12734a18328S猫头猫 return undefined; 12834a18328S猫头猫 } 12934a18328S猫头猫 return { 13034a18328S猫头猫 ...mediaItem, 13134a18328S猫头猫 [internalSerializeKey]: undefined, 13234a18328S猫头猫 }; 13334a18328S猫头猫} 13497f16fdcS猫头猫 13597f16fdcS猫头猫/** 关联歌词 */ 13697f16fdcS猫头猫export async function associateLrc( 13797f16fdcS猫头猫 musicItem: ICommon.IMediaBase, 13897f16fdcS猫头猫 linkto: ICommon.IMediaBase, 13997f16fdcS猫头猫) { 14097f16fdcS猫头猫 if (!musicItem || !linkto) { 14197f16fdcS猫头猫 throw new Error(''); 14297f16fdcS猫头猫 } 143*43eb30bfS猫头猫 144*43eb30bfS猫头猫 MediaMeta.update(musicItem, { 14597f16fdcS猫头猫 associatedLrc: linkto, 14697f16fdcS猫头猫 }); 14797f16fdcS猫头猫} 1485500cea7S猫头猫 1495500cea7S猫头猫export function sortByTimestampAndIndex(array: any[], newArray = false) { 1505500cea7S猫头猫 if (newArray) { 1515500cea7S猫头猫 array = [...array]; 1525500cea7S猫头猫 } 1535500cea7S猫头猫 return array.sort((a, b) => { 1545500cea7S猫头猫 const ts = a[timeStampSymbol] - b[timeStampSymbol]; 1555500cea7S猫头猫 if (ts !== 0) { 1565500cea7S猫头猫 return ts; 1575500cea7S猫头猫 } 1585500cea7S猫头猫 return a[sortIndexSymbol] - b[sortIndexSymbol]; 1595500cea7S猫头猫 }); 1605500cea7S猫头猫} 161