17993f90eS猫头猫import { 27993f90eS猫头猫 internalSerializeKey, 37993f90eS猫头猫 localPluginPlatform, 47993f90eS猫头猫} from '@/constants/commonConst'; 5*97f16fdcS猫头猫import MediaMeta from '@/core/mediaMeta'; 6242960d3S猫头猫import produce from 'immer'; 70e4173cdS猫头猫import objectPath from 'object-path'; 8242960d3S猫头猫 9242960d3S猫头猫/** 获取mediakey */ 10242960d3S猫头猫export function getMediaKey(mediaItem: ICommon.IMediaBase) { 11242960d3S猫头猫 return `${mediaItem.platform}@${mediaItem.id}`; 12242960d3S猫头猫} 13242960d3S猫头猫 145276aef9S猫头猫/** 解析mediakey */ 155276aef9S猫头猫export function parseMediaKey(key: string): ICommon.IMediaBase { 165276aef9S猫头猫 try { 175276aef9S猫头猫 const str = JSON.parse(key.trim()); 185276aef9S猫头猫 let platform, id; 195276aef9S猫头猫 if (typeof str === 'string') { 205276aef9S猫头猫 [platform, id] = str.split('@'); 215276aef9S猫头猫 } else { 225276aef9S猫头猫 platform = str?.platform; 235276aef9S猫头猫 id = str?.id; 245276aef9S猫头猫 } 255276aef9S猫头猫 if (!platform || !id) { 264060c00aS猫头猫 throw new Error('mediakey不完整'); 275276aef9S猫头猫 } 285276aef9S猫头猫 return { 295276aef9S猫头猫 platform, 305276aef9S猫头猫 id, 315276aef9S猫头猫 }; 325276aef9S猫头猫 } catch (e: any) { 335276aef9S猫头猫 throw e; 345276aef9S猫头猫 } 355276aef9S猫头猫} 365276aef9S猫头猫 370e4173cdS猫头猫/** 比较两media是否相同 */ 38242960d3S猫头猫export function isSameMediaItem( 39242960d3S猫头猫 a: ICommon.IMediaBase | null | undefined, 40242960d3S猫头猫 b: ICommon.IMediaBase | null | undefined, 41242960d3S猫头猫) { 4280b610c3S猫头猫 return a && b && a.id == b.id && a.platform === b.platform; 43242960d3S猫头猫} 44242960d3S猫头猫 450e4173cdS猫头猫/** 查找是否存在 */ 460e4173cdS猫头猫export function includesMedia( 470e4173cdS猫头猫 a: ICommon.IMediaBase[] | null | undefined, 480e4173cdS猫头猫 b: ICommon.IMediaBase | null | undefined, 490e4173cdS猫头猫) { 500e4173cdS猫头猫 if (!a || !b) { 510e4173cdS猫头猫 return false; 520e4173cdS猫头猫 } 530e4173cdS猫头猫 return a.findIndex(_ => isSameMediaItem(_, b)) !== -1; 540e4173cdS猫头猫} 550e4173cdS猫头猫 56242960d3S猫头猫/** 获取复位的mediaItem */ 575281926bS猫头猫export function resetMediaItem<T extends Partial<ICommon.IMediaBase>>( 588b88e961S猫头猫 mediaItem: T, 59242960d3S猫头猫 platform?: string, 608b88e961S猫头猫 newObj?: boolean, 618b88e961S猫头猫): T { 627993f90eS猫头猫 // 本地音乐不做处理 637993f90eS猫头猫 if ( 647993f90eS猫头猫 mediaItem.platform === localPluginPlatform || 657993f90eS猫头猫 platform === localPluginPlatform 667993f90eS猫头猫 ) { 677993f90eS猫头猫 return newObj ? {...mediaItem} : mediaItem; 687993f90eS猫头猫 } 698b88e961S猫头猫 if (!newObj) { 70242960d3S猫头猫 mediaItem.platform = platform ?? mediaItem.platform; 710e4173cdS猫头猫 mediaItem[internalSerializeKey] = undefined; 72242960d3S猫头猫 return mediaItem; 73242960d3S猫头猫 } else { 74242960d3S猫头猫 return produce(mediaItem, _ => { 75242960d3S猫头猫 _.platform = platform ?? mediaItem.platform; 760e4173cdS猫头猫 _[internalSerializeKey] = undefined; 77242960d3S猫头猫 }); 78242960d3S猫头猫 } 79242960d3S猫头猫} 808b88e961S猫头猫 815276aef9S猫头猫export function mergeProps( 825276aef9S猫头猫 mediaItem: ICommon.IMediaBase, 835276aef9S猫头猫 props: Record<string, any> | undefined, 8474d0cf81S猫头猫 anotherProps?: Record<string, any> | undefined | null, 855276aef9S猫头猫) { 865276aef9S猫头猫 return props 875276aef9S猫头猫 ? { 888b88e961S猫头猫 ...mediaItem, 895276aef9S猫头猫 ...props, 9074d0cf81S猫头猫 ...(anotherProps ?? {}), 9174d0cf81S猫头猫 id: mediaItem.id, 9274d0cf81S猫头猫 platform: mediaItem.platform, 935276aef9S猫头猫 } 945276aef9S猫头猫 : mediaItem; 958b88e961S猫头猫} 960e4173cdS猫头猫 970e4173cdS猫头猫export enum InternalDataType { 980e4173cdS猫头猫 LOCALPATH = 'localPath', 990e4173cdS猫头猫} 1000e4173cdS猫头猫 1010e4173cdS猫头猫export function setInternalData<T extends ICommon.IMediaBase>( 1020e4173cdS猫头猫 mediaItem: T, 1030e4173cdS猫头猫 key: InternalDataType, 1040e4173cdS猫头猫 value: string | number | undefined | null, 1050e4173cdS猫头猫): T { 1060e4173cdS猫头猫 return produce(mediaItem, draft => { 1070e4173cdS猫头猫 objectPath.set(draft, `${internalSerializeKey}.${key}`, value); 1080e4173cdS猫头猫 }); 1090e4173cdS猫头猫} 1100e4173cdS猫头猫 1110e4173cdS猫头猫export function getInternalData<T>( 1120e4173cdS猫头猫 mediaItem: ICommon.IMediaBase | null | undefined, 1130e4173cdS猫头猫 key: InternalDataType, 1140e4173cdS猫头猫): T | undefined { 1150e4173cdS猫头猫 if (!mediaItem) { 1160e4173cdS猫头猫 return undefined; 1170e4173cdS猫头猫 } 1180e4173cdS猫头猫 return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`); 1190e4173cdS猫头猫} 12034a18328S猫头猫 12134a18328S猫头猫export function trimInternalData( 12234a18328S猫头猫 mediaItem: ICommon.IMediaBase | null | undefined, 12334a18328S猫头猫) { 12434a18328S猫头猫 if (!mediaItem) { 12534a18328S猫头猫 return undefined; 12634a18328S猫头猫 } 12734a18328S猫头猫 return { 12834a18328S猫头猫 ...mediaItem, 12934a18328S猫头猫 [internalSerializeKey]: undefined, 13034a18328S猫头猫 }; 13134a18328S猫头猫} 132*97f16fdcS猫头猫 133*97f16fdcS猫头猫/** 关联歌词 */ 134*97f16fdcS猫头猫export async function associateLrc( 135*97f16fdcS猫头猫 musicItem: ICommon.IMediaBase, 136*97f16fdcS猫头猫 linkto: ICommon.IMediaBase, 137*97f16fdcS猫头猫) { 138*97f16fdcS猫头猫 if (!musicItem || !linkto) { 139*97f16fdcS猫头猫 throw new Error(''); 140*97f16fdcS猫头猫 } 141*97f16fdcS猫头猫 await MediaMeta.update(musicItem, { 142*97f16fdcS猫头猫 associatedLrc: linkto, 143*97f16fdcS猫头猫 }); 144*97f16fdcS猫头猫 await MediaMeta.update(linkto, [ 145*97f16fdcS猫头猫 ['lrc', linkto.lrc], 146*97f16fdcS猫头猫 ['$.local.localLrc', linkto.$?.local?.localLrc], 147*97f16fdcS猫头猫 ]); 148*97f16fdcS猫头猫} 149