xref: /MusicFree/src/utils/mediaItem.ts (revision 0e4173cd50b15efbe5ce9954996c3697547338df)
1*0e4173cdS猫头猫import {internalSerializeKey} from '@/constants/commonConst';
2242960d3S猫头猫import produce from 'immer';
3*0e4173cdS猫头猫import objectPath from 'object-path';
4242960d3S猫头猫
5242960d3S猫头猫/** 获取mediakey */
6242960d3S猫头猫export function getMediaKey(mediaItem: ICommon.IMediaBase) {
7242960d3S猫头猫    return `${mediaItem.platform}@${mediaItem.id}`;
8242960d3S猫头猫}
9242960d3S猫头猫
105276aef9S猫头猫/** 解析mediakey */
115276aef9S猫头猫export function parseMediaKey(key: string): ICommon.IMediaBase {
125276aef9S猫头猫    try {
135276aef9S猫头猫        const str = JSON.parse(key.trim());
145276aef9S猫头猫        let platform, id;
155276aef9S猫头猫        if (typeof str === 'string') {
165276aef9S猫头猫            [platform, id] = str.split('@');
175276aef9S猫头猫        } else {
185276aef9S猫头猫            platform = str?.platform;
195276aef9S猫头猫            id = str?.id;
205276aef9S猫头猫        }
215276aef9S猫头猫        if (!platform || !id) {
224060c00aS猫头猫            throw new Error('mediakey不完整');
235276aef9S猫头猫        }
245276aef9S猫头猫        return {
255276aef9S猫头猫            platform,
265276aef9S猫头猫            id,
275276aef9S猫头猫        };
285276aef9S猫头猫    } catch (e: any) {
295276aef9S猫头猫        throw e;
305276aef9S猫头猫    }
315276aef9S猫头猫}
325276aef9S猫头猫
33*0e4173cdS猫头猫/** 比较两media是否相同 */
34242960d3S猫头猫export function isSameMediaItem(
35242960d3S猫头猫    a: ICommon.IMediaBase | null | undefined,
36242960d3S猫头猫    b: ICommon.IMediaBase | null | undefined,
37242960d3S猫头猫) {
38242960d3S猫头猫    return a && b && a.id === b.id && a.platform === b.platform;
39242960d3S猫头猫}
40242960d3S猫头猫
41*0e4173cdS猫头猫/** 查找是否存在 */
42*0e4173cdS猫头猫export function includesMedia(
43*0e4173cdS猫头猫    a: ICommon.IMediaBase[] | null | undefined,
44*0e4173cdS猫头猫    b: ICommon.IMediaBase | null | undefined,
45*0e4173cdS猫头猫) {
46*0e4173cdS猫头猫    if (!a || !b) {
47*0e4173cdS猫头猫        return false;
48*0e4173cdS猫头猫    }
49*0e4173cdS猫头猫    return a.findIndex(_ => isSameMediaItem(_, b)) !== -1;
50*0e4173cdS猫头猫}
51*0e4173cdS猫头猫
52242960d3S猫头猫/** 获取复位的mediaItem */
538b88e961S猫头猫export function resetMediaItem<T extends ICommon.IMediaBase>(
548b88e961S猫头猫    mediaItem: T,
55242960d3S猫头猫    platform?: string,
568b88e961S猫头猫    newObj?: boolean,
578b88e961S猫头猫): T {
588b88e961S猫头猫    if (!newObj) {
59242960d3S猫头猫        mediaItem.platform = platform ?? mediaItem.platform;
60*0e4173cdS猫头猫        mediaItem[internalSerializeKey] = undefined;
61242960d3S猫头猫        return mediaItem;
62242960d3S猫头猫    } else {
63242960d3S猫头猫        return produce(mediaItem, _ => {
64242960d3S猫头猫            _.platform = platform ?? mediaItem.platform;
65*0e4173cdS猫头猫            _[internalSerializeKey] = undefined;
66242960d3S猫头猫        });
67242960d3S猫头猫    }
68242960d3S猫头猫}
698b88e961S猫头猫
705276aef9S猫头猫export function mergeProps(
715276aef9S猫头猫    mediaItem: ICommon.IMediaBase,
725276aef9S猫头猫    props: Record<string, any> | undefined,
735276aef9S猫头猫) {
745276aef9S猫头猫    return props
755276aef9S猫头猫        ? {
768b88e961S猫头猫              ...mediaItem,
775276aef9S猫头猫              ...props,
785276aef9S猫头猫          }
795276aef9S猫头猫        : mediaItem;
808b88e961S猫头猫}
81*0e4173cdS猫头猫
82*0e4173cdS猫头猫export enum InternalDataType {
83*0e4173cdS猫头猫    LOCALPATH = 'localPath',
84*0e4173cdS猫头猫}
85*0e4173cdS猫头猫
86*0e4173cdS猫头猫export function setInternalData<T extends ICommon.IMediaBase>(
87*0e4173cdS猫头猫    mediaItem: T,
88*0e4173cdS猫头猫    key: InternalDataType,
89*0e4173cdS猫头猫    value: string | number | undefined | null,
90*0e4173cdS猫头猫): T {
91*0e4173cdS猫头猫    return produce(mediaItem, draft => {
92*0e4173cdS猫头猫        objectPath.set(draft, `${internalSerializeKey}.${key}`, value);
93*0e4173cdS猫头猫    });
94*0e4173cdS猫头猫}
95*0e4173cdS猫头猫
96*0e4173cdS猫头猫export function getInternalData<T>(
97*0e4173cdS猫头猫    mediaItem: ICommon.IMediaBase | null | undefined,
98*0e4173cdS猫头猫    key: InternalDataType,
99*0e4173cdS猫头猫): T | undefined {
100*0e4173cdS猫头猫    if (!mediaItem) {
101*0e4173cdS猫头猫        return undefined;
102*0e4173cdS猫头猫    }
103*0e4173cdS猫头猫    return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`);
104*0e4173cdS猫头猫}
105