17993f90eS猫头猫import { 27993f90eS猫头猫 internalSerializeKey, 37993f90eS猫头猫 localPluginPlatform, 45500cea7S猫头猫 sortIndexSymbol, 55500cea7S猫头猫 timeStampSymbol, 67993f90eS猫头猫} from '@/constants/commonConst'; 743eb30bfS猫头猫import MediaMeta from '@/core/mediaExtra'; 85589cdf3S猫头猫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猫头猫) { 445589cdf3S猫头猫 // eslint-disable-next-line eqeqeq 4580b610c3S猫头猫 return a && b && a.id == b.id && a.platform === b.platform; 46242960d3S猫头猫} 47242960d3S猫头猫 480e4173cdS猫头猫/** 查找是否存在 */ 490e4173cdS猫头猫export function includesMedia( 500e4173cdS猫头猫 a: ICommon.IMediaBase[] | null | undefined, 510e4173cdS猫头猫 b: ICommon.IMediaBase | null | undefined, 520e4173cdS猫头猫) { 530e4173cdS猫头猫 if (!a || !b) { 540e4173cdS猫头猫 return false; 550e4173cdS猫头猫 } 560e4173cdS猫头猫 return a.findIndex(_ => isSameMediaItem(_, b)) !== -1; 570e4173cdS猫头猫} 580e4173cdS猫头猫 59242960d3S猫头猫/** 获取复位的mediaItem */ 605281926bS猫头猫export function resetMediaItem<T extends Partial<ICommon.IMediaBase>>( 618b88e961S猫头猫 mediaItem: T, 62242960d3S猫头猫 platform?: string, 638b88e961S猫头猫 newObj?: boolean, 648b88e961S猫头猫): T { 657993f90eS猫头猫 // 本地音乐不做处理 667993f90eS猫头猫 if ( 677993f90eS猫头猫 mediaItem.platform === localPluginPlatform || 687993f90eS猫头猫 platform === localPluginPlatform 697993f90eS猫头猫 ) { 707993f90eS猫头猫 return newObj ? {...mediaItem} : mediaItem; 717993f90eS猫头猫 } 728b88e961S猫头猫 if (!newObj) { 73242960d3S猫头猫 mediaItem.platform = platform ?? mediaItem.platform; 740e4173cdS猫头猫 mediaItem[internalSerializeKey] = undefined; 75242960d3S猫头猫 return mediaItem; 76242960d3S猫头猫 } else { 77242960d3S猫头猫 return produce(mediaItem, _ => { 78242960d3S猫头猫 _.platform = platform ?? mediaItem.platform; 790e4173cdS猫头猫 _[internalSerializeKey] = undefined; 80242960d3S猫头猫 }); 81242960d3S猫头猫 } 82242960d3S猫头猫} 838b88e961S猫头猫 845276aef9S猫头猫export function mergeProps( 855276aef9S猫头猫 mediaItem: ICommon.IMediaBase, 865276aef9S猫头猫 props: Record<string, any> | undefined, 8774d0cf81S猫头猫 anotherProps?: Record<string, any> | undefined | null, 885276aef9S猫头猫) { 895276aef9S猫头猫 return props 905276aef9S猫头猫 ? { 918b88e961S猫头猫 ...mediaItem, 925276aef9S猫头猫 ...props, 9374d0cf81S猫头猫 ...(anotherProps ?? {}), 9474d0cf81S猫头猫 id: mediaItem.id, 9574d0cf81S猫头猫 platform: mediaItem.platform, 965276aef9S猫头猫 } 975276aef9S猫头猫 : mediaItem; 988b88e961S猫头猫} 990e4173cdS猫头猫 1000e4173cdS猫头猫export enum InternalDataType { 1010e4173cdS猫头猫 LOCALPATH = 'localPath', 102*740e3947S猫头猫 // 加入歌单时间 103*740e3947S猫头猫 TIMESTAMP = 'timestamp', 104*740e3947S猫头猫 // 如果时间相同,辅助排序 105*740e3947S猫头猫 SORTINDEX = 'sortIndex', 1060e4173cdS猫头猫} 1070e4173cdS猫头猫 1080e4173cdS猫头猫export function setInternalData<T extends ICommon.IMediaBase>( 1090e4173cdS猫头猫 mediaItem: T, 1100e4173cdS猫头猫 key: InternalDataType, 1110e4173cdS猫头猫 value: string | number | undefined | null, 1120e4173cdS猫头猫): T { 1130e4173cdS猫头猫 return produce(mediaItem, draft => { 1140e4173cdS猫头猫 objectPath.set(draft, `${internalSerializeKey}.${key}`, value); 1150e4173cdS猫头猫 }); 1160e4173cdS猫头猫} 1170e4173cdS猫头猫 1180e4173cdS猫头猫export function getInternalData<T>( 1190e4173cdS猫头猫 mediaItem: ICommon.IMediaBase | null | undefined, 1200e4173cdS猫头猫 key: InternalDataType, 1210e4173cdS猫头猫): T | undefined { 1220e4173cdS猫头猫 if (!mediaItem) { 1230e4173cdS猫头猫 return undefined; 1240e4173cdS猫头猫 } 1250e4173cdS猫头猫 return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`); 1260e4173cdS猫头猫} 12734a18328S猫头猫 12834a18328S猫头猫export function trimInternalData( 12934a18328S猫头猫 mediaItem: ICommon.IMediaBase | null | undefined, 13034a18328S猫头猫) { 13134a18328S猫头猫 if (!mediaItem) { 13234a18328S猫头猫 return undefined; 13334a18328S猫头猫 } 13434a18328S猫头猫 return { 13534a18328S猫头猫 ...mediaItem, 13634a18328S猫头猫 [internalSerializeKey]: undefined, 13734a18328S猫头猫 }; 13834a18328S猫头猫} 13997f16fdcS猫头猫 14097f16fdcS猫头猫/** 关联歌词 */ 14197f16fdcS猫头猫export async function associateLrc( 14297f16fdcS猫头猫 musicItem: ICommon.IMediaBase, 14397f16fdcS猫头猫 linkto: ICommon.IMediaBase, 14497f16fdcS猫头猫) { 14597f16fdcS猫头猫 if (!musicItem || !linkto) { 14697f16fdcS猫头猫 throw new Error(''); 14797f16fdcS猫头猫 } 14843eb30bfS猫头猫 14972dabe5bS猫头猫 // 如果相同直接断链 15043eb30bfS猫头猫 MediaMeta.update(musicItem, { 15172dabe5bS猫头猫 associatedLrc: isSameMediaItem(musicItem, linkto) ? undefined : linkto, 15297f16fdcS猫头猫 }); 15397f16fdcS猫头猫} 1545500cea7S猫头猫 1555500cea7S猫头猫export function sortByTimestampAndIndex(array: any[], newArray = false) { 1565500cea7S猫头猫 if (newArray) { 1575500cea7S猫头猫 array = [...array]; 1585500cea7S猫头猫 } 1595500cea7S猫头猫 return array.sort((a, b) => { 1605500cea7S猫头猫 const ts = a[timeStampSymbol] - b[timeStampSymbol]; 1615500cea7S猫头猫 if (ts !== 0) { 1625500cea7S猫头猫 return ts; 1635500cea7S猫头猫 } 1645500cea7S猫头猫 return a[sortIndexSymbol] - b[sortIndexSymbol]; 1655500cea7S猫头猫 }); 1665500cea7S猫头猫} 167