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