xref: /MusicFree/src/utils/mediaItem.ts (revision 74d0cf81e0facef3bce793d52c6a2c05a955685a)
1import {internalSerializeKey} from '@/constants/commonConst';
2import produce from 'immer';
3import objectPath from 'object-path';
4
5/** 获取mediakey */
6export function getMediaKey(mediaItem: ICommon.IMediaBase) {
7    return `${mediaItem.platform}@${mediaItem.id}`;
8}
9
10/** 解析mediakey */
11export function parseMediaKey(key: string): ICommon.IMediaBase {
12    try {
13        const str = JSON.parse(key.trim());
14        let platform, id;
15        if (typeof str === 'string') {
16            [platform, id] = str.split('@');
17        } else {
18            platform = str?.platform;
19            id = str?.id;
20        }
21        if (!platform || !id) {
22            throw new Error('mediakey不完整');
23        }
24        return {
25            platform,
26            id,
27        };
28    } catch (e: any) {
29        throw e;
30    }
31}
32
33/** 比较两media是否相同 */
34export function isSameMediaItem(
35    a: ICommon.IMediaBase | null | undefined,
36    b: ICommon.IMediaBase | null | undefined,
37) {
38    return a && b && a.id === b.id && a.platform === b.platform;
39}
40
41/** 查找是否存在 */
42export function includesMedia(
43    a: ICommon.IMediaBase[] | null | undefined,
44    b: ICommon.IMediaBase | null | undefined,
45) {
46    if (!a || !b) {
47        return false;
48    }
49    return a.findIndex(_ => isSameMediaItem(_, b)) !== -1;
50}
51
52/** 获取复位的mediaItem */
53export function resetMediaItem<T extends ICommon.IMediaBase>(
54    mediaItem: T,
55    platform?: string,
56    newObj?: boolean,
57): T {
58    if (!newObj) {
59        mediaItem.platform = platform ?? mediaItem.platform;
60        mediaItem[internalSerializeKey] = undefined;
61        return mediaItem;
62    } else {
63        return produce(mediaItem, _ => {
64            _.platform = platform ?? mediaItem.platform;
65            _[internalSerializeKey] = undefined;
66        });
67    }
68}
69
70export function mergeProps(
71    mediaItem: ICommon.IMediaBase,
72    props: Record<string, any> | undefined,
73    anotherProps?: Record<string, any> | undefined | null,
74) {
75    return props
76        ? {
77              ...mediaItem,
78              ...props,
79              ...(anotherProps ?? {}),
80              id: mediaItem.id,
81              platform: mediaItem.platform,
82          }
83        : mediaItem;
84}
85
86export enum InternalDataType {
87    LOCALPATH = 'localPath',
88}
89
90export function setInternalData<T extends ICommon.IMediaBase>(
91    mediaItem: T,
92    key: InternalDataType,
93    value: string | number | undefined | null,
94): T {
95    return produce(mediaItem, draft => {
96        objectPath.set(draft, `${internalSerializeKey}.${key}`, value);
97    });
98}
99
100export function getInternalData<T>(
101    mediaItem: ICommon.IMediaBase | null | undefined,
102    key: InternalDataType,
103): T | undefined {
104    if (!mediaItem) {
105        return undefined;
106    }
107    return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`);
108}
109