xref: /MusicFree/src/utils/mediaItem.ts (revision 9501a53846abeb6e52d388c9c5031f73671944ef)
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) {
74    return props
75        ? {
76              ...mediaItem,
77              ...props,
78          }
79        : mediaItem;
80}
81
82export enum InternalDataType {
83    LOCALPATH = 'localPath',
84}
85
86export function setInternalData<T extends ICommon.IMediaBase>(
87    mediaItem: T,
88    key: InternalDataType,
89    value: string | number | undefined | null,
90): T {
91    return produce(mediaItem, draft => {
92        objectPath.set(draft, `${internalSerializeKey}.${key}`, value);
93    });
94}
95
96export function getInternalData<T>(
97    mediaItem: ICommon.IMediaBase | null | undefined,
98    key: InternalDataType,
99): T | undefined {
100    if (!mediaItem) {
101        return undefined;
102    }
103    return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`);
104}
105