Miru 中文文档 下载 App

Mirv 扩展文件结构与元数据注释

一个完整扩展的骨架

Mirv 扩展由两部分组成:

  1. 元数据注释块:// ==MiruExtension== ... // ==/MiruExtension== 之间的内容;
  2. Extension 子类:导出一个继承自 Extension 基类的类,重写需要的方法。

完整模板:

// ==MiruExtension==
// @name My First Extension
// @version v0.0.1
// @author YourName
// @lang zh-cn
// @icon https://example.com/icon.png
// @package com.example.myext
// @type bangumi
// @webSite https://example.com
// ==/MiruExtension==

export default class extends Extension {
  async load() { /* 初始化 */ }
  async latest(page) { /* 最近更新列表 */ }
  async search(kw, page) { /* 搜索 */ }
  async detail(url) { /* 详情页 */ }
  async watch(url) { /* 观看内容 */ }
}

元数据字段详解

字段必填说明
@name✅扩展显示名称,用户在 Mirv 界面看到的名字
@version✅扩展版本号,格式 v0.0.1
@webSite✅扩展目标站点的 URL,Mirv 用于展示和请求头 Referer
@package✅扩展唯一标识,必须和文件名一致(如 com.example.myext → 文件名必须是 com.example.myext.js)
@type✅bangumi(视频)/ manga(漫画)/ fikushon(小说)三选一
@author❌作者名
@lang❌扩展主要语言,如 zh-cn / en
@icon❌扩展图标 URL

@package 为什么和文件名必须一致

Mirv 在加载扩展时会校验 @package 字段和文件名。这个机制的目的:

如果你忘记了 @package 或文件名对不上,Mirv 会加载失败并在日志里提示。

@type 决定消费端

@type 是 Mirv 扩展里最重要的字段之一——它决定了 Mirv 用哪个消费端来渲染你的扩展返回的数据:

@type bangumi   → 视频播放器  → watch() 返回 { type: "hls" | "mp4", url }
@type manga     → 漫画阅读器  → watch() 返回 { urls: string[] }
@type fikushon  → 小说阅读器  → watch() 返回 { content: string[], title, subtitle }

一个扩展文件只能声明一种 @type。想同时做视频和漫画源?写两个扩展文件,各自声明 @type。

注释格式注意

元数据注释块必须用精确的格式:

Mirv 用正则表达式解析这一段注释,格式稍微错一点就可能解析失败。