koishi-plugin-adapter-iirose
Version:
[IIROSE-蔷薇花园](https://iirose.com/)适配器
225 lines (204 loc) • 5.71 kB
text/typescript
import PublicMessage from './PublicMessage';
import { musicOrigin } from '../../bot/event';
import { encode } from '../../utils/entities';
/**
* 构建媒体卡片消息
* @param type 媒体类型, 'music' 或 'video'
* @param title 标题
* @param singer 艺术家
* @param cover 封面URL
* @param color 颜色
* @param duration 时长 (秒)
* @param BitRate 比特率 (可选, 默认 320)
* @param origin 来源平台 (可选)
* @returns {any}
*/
export default (
type: 'music' | 'video',
title: string,
singer: string,
cover: string,
color: string,
duration: number,
BitRate: number = 320,
origin?: musicOrigin['origin']
) =>
{
/**
* 解析比特率
* @param bitrate 比特率
* @returns {string | number}
*/
function parseBitrate(bitrate: number)
{
switch (bitrate)
{
case 10000:
return '1e4';
case 20000:
return '2e4';
case 30000:
return '3e4';
default:
return bitrate;
}
}
/**
* 将时长(秒)转换为文本格式
* @param duration 时长(秒)
* @returns {string}
*/
function durationToText(duration: number)
{
const secondsInMinute = 60;
const secondsInHour = secondsInMinute * 60;
const secondsInDay = secondsInHour * 24;
const secondsInYear = secondsInDay * 365;
const secondsInMillennium = secondsInYear * 1000;
const secondsInTenThousandYears = secondsInMillennium * 10;
const secondsInHundredThousandYears = secondsInTenThousandYears * 10;
const secondsInMillionYears = secondsInHundredThousandYears * 10;
const secondsInTenMillionYears = secondsInMillionYears * 10;
const secondsInHundredMillionYears = secondsInTenMillionYears * 10;
const secondsInBillionYears = secondsInHundredMillionYears * 10;
const billionYears = Math.floor(duration / secondsInBillionYears);
duration %= secondsInBillionYears;
const hundredMillionYears = Math.floor(duration / secondsInHundredMillionYears);
duration %= secondsInHundredMillionYears;
const tenMillionYears = Math.floor(duration / secondsInTenMillionYears);
duration %= secondsInTenMillionYears;
const millionYears = Math.floor(duration / secondsInMillionYears);
duration %= secondsInMillionYears;
const hundredThousandYears = Math.floor(duration / secondsInHundredThousandYears);
duration %= secondsInHundredThousandYears;
const tenThousandYears = Math.floor(duration / secondsInTenThousandYears);
duration %= secondsInTenThousandYears;
const millennia = Math.floor(duration / secondsInMillennium);
duration %= secondsInMillennium;
const years = Math.floor(duration / secondsInYear);
duration %= secondsInYear;
const days = Math.floor(duration / secondsInDay);
duration %= secondsInDay;
const hours = Math.floor(duration / secondsInHour);
duration %= secondsInHour;
const minutes = Math.floor(duration / secondsInMinute);
const seconds = duration % secondsInMinute;
let text = '';
if (billionYears > 0)
{
text += `${billionYears}亿年 `;
}
if (hundredMillionYears > 0)
{
text += `${hundredMillionYears}亿年 `;
}
if (tenMillionYears > 0)
{
text += `${tenMillionYears}千万年 `;
}
if (millionYears > 0)
{
text += `${millionYears}百万年 `;
}
if (hundredThousandYears > 0)
{
text += `${hundredThousandYears}十万年 `;
}
if (tenThousandYears > 0)
{
text += `${tenThousandYears}万年 `;
}
if (millennia > 0)
{
text += `${millennia}千年 `;
}
if (years > 0)
{
text += `${years}年 `;
}
if (days > 0)
{
text += `${days}天 `;
}
if (hours > 0)
{
text += `${hours}小时 `;
}
if (minutes > 0)
{
text += `${minutes}分钟 `;
}
if (seconds > 0)
{
text += `${seconds}秒`;
}
return text.trim();
}
const typeMap = {
music: "=0",
video: "=1",
netease: "@0",
xiamimusic: "@1",
qqmusic: "@2",
qianqianmusic: "@3",
kugoumusic: "@4",
ximalayafm: "@5",
lizhifm: "@6",
echohuisheng: "@7",
fivesing: "@8",
iqiyi: "*0",
tencentvideo: "*1",
youtube: "*2",
bilibili: "*3",
mangotv: "*4",
tiktok: "*5",
kuaishou: "*6",
onesixthreemv: "*7",
bilibililive: "*8"
};
let data: string;
let t: string;
if (origin && origin !== 'null' && origin !== 'undefined')
{
t = origin;
} else
{
t = type;
}
title = encode(title);
singer = encode(singer);
color = encode(color);
if (type === 'music')
{
if (!BitRate)
{
data = `m__4${typeMap[t]}>${title}>${singer}>${cover}>${color}>>11451${durationToText(duration)}`;
} else
{
data = `m__4${typeMap[t]}>${title}>${singer}>${cover}>${color}>${parseBitrate(BitRate)}`;
}
} else
{
if (!BitRate)
{
data = `m__4${typeMap[t]}>${title}>${singer}>${cover}>${color}>>11451${durationToText(duration)}`;
} else
{
data = `m__4${typeMap[t]}>${title}>${singer}>${cover}>${color}>>${parseBitrate(BitRate)}>>${durationToText(duration)}`;
}
}
return PublicMessage(data, color);
};
/**
* 将秒数格式化为 mm:ss
* @param seconds 秒数
* @returns {string}
*/
function formatSeconds(seconds: number): string
{
const minutes: number = Math.floor(seconds / 60);
const remainingSeconds: number = seconds % 60;
const formattedMinutes: string = minutes < 10 ? `0${minutes}` : `${minutes}`;
const formattedSeconds: string = remainingSeconds < 10 ? `0${remainingSeconds}` : `${remainingSeconds}`;
return `${formattedMinutes}:${formattedSeconds}`;
}