* 从消息中提取媒体信息
(message: Api.Message)
| 283 | |
| 284 | try { |
| 285 | // 处理图片 |
| 286 | if (message.media instanceof Api.MessageMediaPhoto) { |
| 287 | const buffer = await client.downloadMedia(message.media, {}); |
| 288 | if (buffer && Buffer.isBuffer(buffer)) { |
| 289 | const detectedMime = detectImageMime(buffer); |
| 290 | if (detectedMime) { |
| 291 | return { |
| 292 | base64: buffer.toString('base64'), |
| 293 | mimeType: detectedMime, |
| 294 | mediaType: 'photo', |
| 295 | }; |
| 296 | } |
| 297 | } |
| 298 | } |
| 299 | |
| 300 | // 处理文档类型(贴纸、图片文件等) |
| 301 | if (message.media instanceof Api.MessageMediaDocument) { |
| 302 | const doc = message.media.document; |
| 303 | if (!(doc instanceof Api.Document)) return null; |
| 304 | |
| 305 | const mimeType = doc.mimeType || ''; |
| 306 | |
| 307 | // 检测是否为贴纸 |
| 308 | const isSticker = doc.attributes?.some( |
| 309 | (a: any) => a instanceof Api.DocumentAttributeSticker |
| 310 | ); |
| 311 | |
| 312 | // TGS 动态贴纸 - 尝试渲染第一帧 |
| 313 | if (mimeType === TGS_MIME) { |
| 314 | const buffer = await client.downloadMedia(message.media, {}); |
| 315 | if (buffer && Buffer.isBuffer(buffer)) { |
| 316 | const pngBuffer = await extractTgsFirstFrame(buffer); |
| 317 | if (pngBuffer) { |
| 318 | return { |
| 319 | base64: pngBuffer.toString('base64'), |
| 320 | mimeType: 'image/png', |
| 321 | mediaType: 'sticker', |
| 322 | isAnimated: true, |
| 323 | }; |
| 324 | } |
| 325 | } |
| 326 | return null; |
| 327 | } |
| 328 | |
| 329 | // 视频贴纸 (WebM) - 提取第一帧 |
| 330 | if (mimeType === WEBM_MIME) { |
| 331 | const buffer = await client.downloadMedia(message.media, {}); |
| 332 | if (buffer && Buffer.isBuffer(buffer)) { |
| 333 | const pngBuffer = await extractWebmFirstFrame(buffer); |
| 334 | if (pngBuffer) { |
| 335 | return { |
| 336 | base64: pngBuffer.toString('base64'), |
| 337 | mimeType: 'image/png', |
| 338 | mediaType: 'sticker', |
| 339 | isAnimated: true, |
| 340 | }; |
| 341 | } |
| 342 | } |
no test coverage detected