xref: /MusicFree/src/utils/mediaItem.ts (revision 740e39476f71e0e17304d812ac0a4c4cdc183ed1)
17993f90eS猫头猫import {
27993f90eS猫头猫    internalSerializeKey,
37993f90eS猫头猫    localPluginPlatform,
45500cea7S猫头猫    sortIndexSymbol,
55500cea7S猫头猫    timeStampSymbol,
67993f90eS猫头猫} from '@/constants/commonConst';
743eb30bfS猫头猫import MediaMeta from '@/core/mediaExtra';
85589cdf3S猫头猫import {produce} from 'immer';
90e4173cdS猫头猫import objectPath from 'object-path';
10242960d3S猫头猫
11242960d3S猫头猫/** 获取mediakey */
12242960d3S猫头猫export function getMediaKey(mediaItem: ICommon.IMediaBase) {
13242960d3S猫头猫    return `${mediaItem.platform}@${mediaItem.id}`;
14242960d3S猫头猫}
15242960d3S猫头猫
165276aef9S猫头猫/** 解析mediakey */
175276aef9S猫头猫export function parseMediaKey(key: string): ICommon.IMediaBase {
185276aef9S猫头猫    try {
195276aef9S猫头猫        const str = JSON.parse(key.trim());
205276aef9S猫头猫        let platform, id;
215276aef9S猫头猫        if (typeof str === 'string') {
225276aef9S猫头猫            [platform, id] = str.split('@');
235276aef9S猫头猫        } else {
245276aef9S猫头猫            platform = str?.platform;
255276aef9S猫头猫            id = str?.id;
265276aef9S猫头猫        }
275276aef9S猫头猫        if (!platform || !id) {
284060c00aS猫头猫            throw new Error('mediakey不完整');
295276aef9S猫头猫        }
305276aef9S猫头猫        return {
315276aef9S猫头猫            platform,
325276aef9S猫头猫            id,
335276aef9S猫头猫        };
345276aef9S猫头猫    } catch (e: any) {
355276aef9S猫头猫        throw e;
365276aef9S猫头猫    }
375276aef9S猫头猫}
385276aef9S猫头猫
390e4173cdS猫头猫/** 比较两media是否相同 */
40242960d3S猫头猫export function isSameMediaItem(
41242960d3S猫头猫    a: ICommon.IMediaBase | null | undefined,
42242960d3S猫头猫    b: ICommon.IMediaBase | null | undefined,
43242960d3S猫头猫) {
445589cdf3S猫头猫    // eslint-disable-next-line eqeqeq
4580b610c3S猫头猫    return a && b && a.id == b.id && a.platform === b.platform;
46242960d3S猫头猫}
47242960d3S猫头猫
480e4173cdS猫头猫/** 查找是否存在 */
490e4173cdS猫头猫export function includesMedia(
500e4173cdS猫头猫    a: ICommon.IMediaBase[] | null | undefined,
510e4173cdS猫头猫    b: ICommon.IMediaBase | null | undefined,
520e4173cdS猫头猫) {
530e4173cdS猫头猫    if (!a || !b) {
540e4173cdS猫头猫        return false;
550e4173cdS猫头猫    }
560e4173cdS猫头猫    return a.findIndex(_ => isSameMediaItem(_, b)) !== -1;
570e4173cdS猫头猫}
580e4173cdS猫头猫
59242960d3S猫头猫/** 获取复位的mediaItem */
605281926bS猫头猫export function resetMediaItem<T extends Partial<ICommon.IMediaBase>>(
618b88e961S猫头猫    mediaItem: T,
62242960d3S猫头猫    platform?: string,
638b88e961S猫头猫    newObj?: boolean,
648b88e961S猫头猫): T {
657993f90eS猫头猫    // 本地音乐不做处理
667993f90eS猫头猫    if (
677993f90eS猫头猫        mediaItem.platform === localPluginPlatform ||
687993f90eS猫头猫        platform === localPluginPlatform
697993f90eS猫头猫    ) {
707993f90eS猫头猫        return newObj ? {...mediaItem} : mediaItem;
717993f90eS猫头猫    }
728b88e961S猫头猫    if (!newObj) {
73242960d3S猫头猫        mediaItem.platform = platform ?? mediaItem.platform;
740e4173cdS猫头猫        mediaItem[internalSerializeKey] = undefined;
75242960d3S猫头猫        return mediaItem;
76242960d3S猫头猫    } else {
77242960d3S猫头猫        return produce(mediaItem, _ => {
78242960d3S猫头猫            _.platform = platform ?? mediaItem.platform;
790e4173cdS猫头猫            _[internalSerializeKey] = undefined;
80242960d3S猫头猫        });
81242960d3S猫头猫    }
82242960d3S猫头猫}
838b88e961S猫头猫
845276aef9S猫头猫export function mergeProps(
855276aef9S猫头猫    mediaItem: ICommon.IMediaBase,
865276aef9S猫头猫    props: Record<string, any> | undefined,
8774d0cf81S猫头猫    anotherProps?: Record<string, any> | undefined | null,
885276aef9S猫头猫) {
895276aef9S猫头猫    return props
905276aef9S猫头猫        ? {
918b88e961S猫头猫              ...mediaItem,
925276aef9S猫头猫              ...props,
9374d0cf81S猫头猫              ...(anotherProps ?? {}),
9474d0cf81S猫头猫              id: mediaItem.id,
9574d0cf81S猫头猫              platform: mediaItem.platform,
965276aef9S猫头猫          }
975276aef9S猫头猫        : mediaItem;
988b88e961S猫头猫}
990e4173cdS猫头猫
1000e4173cdS猫头猫export enum InternalDataType {
1010e4173cdS猫头猫    LOCALPATH = 'localPath',
102*740e3947S猫头猫    // 加入歌单时间
103*740e3947S猫头猫    TIMESTAMP = 'timestamp',
104*740e3947S猫头猫    // 如果时间相同,辅助排序
105*740e3947S猫头猫    SORTINDEX = 'sortIndex',
1060e4173cdS猫头猫}
1070e4173cdS猫头猫
1080e4173cdS猫头猫export function setInternalData<T extends ICommon.IMediaBase>(
1090e4173cdS猫头猫    mediaItem: T,
1100e4173cdS猫头猫    key: InternalDataType,
1110e4173cdS猫头猫    value: string | number | undefined | null,
1120e4173cdS猫头猫): T {
1130e4173cdS猫头猫    return produce(mediaItem, draft => {
1140e4173cdS猫头猫        objectPath.set(draft, `${internalSerializeKey}.${key}`, value);
1150e4173cdS猫头猫    });
1160e4173cdS猫头猫}
1170e4173cdS猫头猫
1180e4173cdS猫头猫export function getInternalData<T>(
1190e4173cdS猫头猫    mediaItem: ICommon.IMediaBase | null | undefined,
1200e4173cdS猫头猫    key: InternalDataType,
1210e4173cdS猫头猫): T | undefined {
1220e4173cdS猫头猫    if (!mediaItem) {
1230e4173cdS猫头猫        return undefined;
1240e4173cdS猫头猫    }
1250e4173cdS猫头猫    return objectPath.get(mediaItem, `${internalSerializeKey}.${key}`);
1260e4173cdS猫头猫}
12734a18328S猫头猫
12834a18328S猫头猫export function trimInternalData(
12934a18328S猫头猫    mediaItem: ICommon.IMediaBase | null | undefined,
13034a18328S猫头猫) {
13134a18328S猫头猫    if (!mediaItem) {
13234a18328S猫头猫        return undefined;
13334a18328S猫头猫    }
13434a18328S猫头猫    return {
13534a18328S猫头猫        ...mediaItem,
13634a18328S猫头猫        [internalSerializeKey]: undefined,
13734a18328S猫头猫    };
13834a18328S猫头猫}
13997f16fdcS猫头猫
14097f16fdcS猫头猫/** 关联歌词 */
14197f16fdcS猫头猫export async function associateLrc(
14297f16fdcS猫头猫    musicItem: ICommon.IMediaBase,
14397f16fdcS猫头猫    linkto: ICommon.IMediaBase,
14497f16fdcS猫头猫) {
14597f16fdcS猫头猫    if (!musicItem || !linkto) {
14697f16fdcS猫头猫        throw new Error('');
14797f16fdcS猫头猫    }
14843eb30bfS猫头猫
14972dabe5bS猫头猫    // 如果相同直接断链
15043eb30bfS猫头猫    MediaMeta.update(musicItem, {
15172dabe5bS猫头猫        associatedLrc: isSameMediaItem(musicItem, linkto) ? undefined : linkto,
15297f16fdcS猫头猫    });
15397f16fdcS猫头猫}
1545500cea7S猫头猫
1555500cea7S猫头猫export function sortByTimestampAndIndex(array: any[], newArray = false) {
1565500cea7S猫头猫    if (newArray) {
1575500cea7S猫头猫        array = [...array];
1585500cea7S猫头猫    }
1595500cea7S猫头猫    return array.sort((a, b) => {
1605500cea7S猫头猫        const ts = a[timeStampSymbol] - b[timeStampSymbol];
1615500cea7S猫头猫        if (ts !== 0) {
1625500cea7S猫头猫            return ts;
1635500cea7S猫头猫        }
1645500cea7S猫头猫        return a[sortIndexSymbol] - b[sortIndexSymbol];
1655500cea7S猫头猫    });
1665500cea7S猫头猫}
167