xref: /MusicFree/src/utils/mediaItem.ts (revision 97f16fdcdb2970da1e3d4c36ade6bd408f883831)
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