这是媒体盒子(MediaBox)官方插件仓库,欢迎提交插件
10 |(在APP也可查看插件仓库,支持自动下载安装)
11 |插件列表:
12 | 13 | 14 | 15 | 41 | 42 | -------------------------------------------------------------------------------- /pluginReleaseParse/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pluginReleaseParse", 3 | "main": "plugin_release_parse.js", 4 | "version": "1.0.0", 5 | "dependencies": { 6 | "app-info-parser": "^1.1.3", 7 | "node-fetch": "^3.2.3", 8 | "string-format": "^2.0.0" 9 | }, 10 | "scripts": { 11 | "build": "node ./plugin_release_parse.js" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /pluginReleaseParse/plugin_release_parse.js: -------------------------------------------------------------------------------- 1 | const allReleaseApi = "https://api.github.com/repos/{user}/{repo}/releases" 2 | const repoApi = "https://api.github.com/repos/{user}/{repo}" 3 | const github = "github.com/" 4 | const publishDir = "../pages/data" 5 | const tmpDir = "./tmp" 6 | const dataManifestFile = "data_manifest.json" 7 | const dataFileFormat = "data_{page}.json" 8 | const dataPageSize = 2 9 | 10 | let op = { 11 | headers: { 12 | "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36" 13 | } 14 | } 15 | 16 | let releaseMap = {} 17 | let repoMap = {} 18 | 19 | const fs = require("fs") 20 | const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args)) 21 | const format = require('string-format') 22 | const AppInfoParser = require('app-info-parser') 23 | 24 | fs.checkDir = (dirPath, callback) => { 25 | fs.access(dirPath, (err) => { 26 | if (err) 27 | fs.mkdir(dirPath, callback || (() => { })) 28 | else 29 | callback() 30 | }) 31 | } 32 | 33 | let infos = [] 34 | 35 | console.log("#开始解析插件Release列表\n") 36 | 37 | //读取release列表开始解析 38 | //TODO 校验数据集文件去除不需要再次解析的插件 39 | fs.readFile("../plugin_release_list.json", (err, data) => { 40 | if (err) { 41 | console.log("插件Release信息错误 解析结束") 42 | } else { 43 | let json = data.toString() 44 | //console.log(json) 45 | 46 | plugins = JSON.parse(json)["plugins"] 47 | let previewPluginInfo = [] 48 | //console.log(plugins) 49 | plugins.forEach((plugin, index) => { 50 | 51 | let releaseUrl = plugin.release 52 | console.log(`${index + 1}.插件:${releaseUrl}`) 53 | let info = releaseUrl.substring(releaseUrl.indexOf(github) + github.length).split("/") 54 | let user = info[0], repo = info[1] 55 | let repoUrl = format(repoApi, { user: user, repo: repo }) 56 | console.log(`作者:${user} 仓库:${repo}\n`) 57 | 58 | infos.push( 59 | //获取release信息 60 | getReleaseInfo(releaseUrl, user, repo) 61 | //获取release assets信息 62 | .then(releaseInfo => getReleaseAssetsInfo(releaseInfo.assets_url)) 63 | //获取apk信息 64 | .then(releaseAssetsInfo => getApkInfo(releaseAssetsInfo.name, releaseAssetsInfo.browser_download_url)) 65 | //获取仓库信息 66 | .then(previewPluginInfo => getRepoInfo(previewPluginInfo, repoUrl)) 67 | //添加额外信息 68 | .then(previewPluginInfo => { 69 | //添加链接,可选realase和repo链接 70 | previewPluginInfo.repoUrl = releaseUrl 71 | //添加作者 72 | previewPluginInfo.author = user 73 | return previewPluginInfo 74 | }) 75 | ) 76 | }) 77 | 78 | Promise.all(infos).then((datas) => { 79 | //console.log(datas) 80 | //console.log(`数据数量:${datas.length}`) 81 | storePreviewPluginInfo(datas) 82 | }) 83 | } 84 | }); 85 | 86 | /** 87 | * 持久化数据 88 | * @param {Array} infoArray 89 | */ 90 | function storePreviewPluginInfo(infoArray) { 91 | let validData = infoArray.filter((v) => { 92 | return Object.keys(v).length != 0 93 | }) 94 | console.log(`#总数据量:${infoArray.length} 有效数据量:${validData.length}`) 95 | console.log(validData) 96 | 97 | fs.checkDir(publishDir, () => { 98 | try { 99 | //分页存储 100 | for (let i = 0, page = 1; i < validData.length; i += dataPageSize, page++) { 101 | let pageData = validData.slice(i, i + dataPageSize) 102 | let pageDataFile = format(dataFileFormat, { page: page }) 103 | fs.writeFileSync(`${publishDir}/${pageDataFile}`, JSON.stringify(pageData, null, 4), "utf8") 104 | } 105 | //兼容处理:完整存储 106 | fs.writeFileSync(`${publishDir}/data.json`, JSON.stringify(validData, null, 4), "utf8") 107 | //写入Manifest 108 | fs.writeFileSync(`${publishDir}/${dataManifestFile}`, JSON.stringify({ dataLength: validData.length }, null, 4), "utf8") 109 | console.log("#数据生成完毕") 110 | } catch (err) { 111 | console.log(`写入数据失败:${err}`) 112 | } 113 | }) 114 | 115 | } 116 | 117 | function getReleaseInfo(releaseUrl, user, repo) { 118 | let url = format(allReleaseApi, { user: user, repo: repo }) 119 | //console.log(`获取ReleaseInfo: ${url}\n`) 120 | 121 | return new Promise((resolve, reject) => { 122 | 123 | let info = releaseMap[repo] 124 | if (info) { 125 | resolve(info) 126 | return 127 | } 128 | 129 | fetch(url, op).then((resp) => resp.json()).then(data => { 130 | //console.log(data) 131 | for (k in data) { 132 | let release = data[k] 133 | //console.log(release) 134 | if (release.html_url == releaseUrl) { 135 | //做缓存 136 | releaseMap[repo] = release 137 | resolve(release) 138 | return 139 | } 140 | } 141 | console.log(data) 142 | console.log(`仓库:${releaseUrl} 获取失败`) 143 | resolve(null) 144 | }) 145 | 146 | }); 147 | 148 | } 149 | 150 | function getReleaseAssetsInfo(assetsUrl) { 151 | return new Promise((resolve, reject) => { 152 | 153 | fetch(assetsUrl, op).then((resp) => resp.json()).then(data => { 154 | data = data[0] 155 | //console.log("资源") 156 | //console.log(data) 157 | console.log(`成功获取资源: ${data.browser_download_url}`) 158 | resolve(data) 159 | }) 160 | 161 | }) 162 | } 163 | 164 | function getApkInfo(apkName, apkDownloadUrl) { 165 | let apkFile = `${tmpDir}/${apkName}.apk`//统一加上apk以支持任意后缀 166 | return new Promise((resolve, reject) => { 167 | //resolve({ sourcePath: apkDownloadUrl }) 168 | //下载apk文件 169 | fetch(apkDownloadUrl, op).then(res => res.buffer()).then(data => { 170 | 171 | fs.checkDir(tmpDir, () => { 172 | fs.writeFile(apkFile, data, "binary", function (err) { 173 | console.log(err || `apk下载完成:${apkFile}`); 174 | resolve(apkFile) 175 | }) 176 | }) 177 | 178 | }, () => resolve(null)); 179 | }).then((apk) => new Promise((resolve, reject) => { 180 | if (!apk) { 181 | console.log(`下载apk失败:${apkDownloadUrl}`) 182 | return {} 183 | } 184 | console.log(`解析apk信息:${apk}`) 185 | const parser = new AppInfoParser(apk) 186 | parser.parse().then(result => { 187 | result = Object.setPrototypeOf(result, new Object()) 188 | //console.log(result) 189 | let previewPluginInfo = {} 190 | previewPluginInfo.version = result["versionName"] 191 | previewPluginInfo.packageName = result["package"] 192 | previewPluginInfo.iconBase64 = result["icon"] 193 | previewPluginInfo.sourcePath = apkDownloadUrl 194 | let application = Object.setPrototypeOf(result["application"], new Object()) 195 | //console.log(application) 196 | previewPluginInfo.name = application["label"][0] 197 | let metaData = Object.setPrototypeOf(application["metaData"], new Object()) 198 | //console.log(metaData) 199 | for (k in metaData) { 200 | let element = metaData[k] 201 | if (element["name"] == "media_plugin_api_version") { 202 | previewPluginInfo.apiVersion = element["value"] 203 | break 204 | } 205 | } 206 | //console.log(previewPluginInfo) 207 | resolve(previewPluginInfo) 208 | }).catch(err => { 209 | console.log('err ----> ', err) 210 | }) 211 | })) 212 | } 213 | 214 | function getRepoInfo(previewPluginInfo, repoUrl) { 215 | return new Promise((resolve, reject) => { 216 | let info = repoMap[repoUrl] 217 | let addInfo = (data) => { 218 | if (!info) { 219 | repoMap[repoUrl] = data 220 | } 221 | //console.log(data) 222 | previewPluginInfo.repoDesc = data.description 223 | resolve(previewPluginInfo) 224 | } 225 | 226 | if (info) { 227 | addInfo(info) 228 | } else { 229 | fetch(repoUrl, op).then((resp) => resp.json()).then(addInfo) 230 | } 231 | }) 232 | } -------------------------------------------------------------------------------- /plugin_release_list.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | { 4 | "name": "LIBVIO影视", 5 | "release": "https://github.com/feiyeyuanye/LIBVIOVideoPlugin/releases/tag/1.6(6)" 6 | }, 7 | { 8 | "name": "大师兄影视", 9 | "release": "https://github.com/feiyeyuanye/DsxysVodPlugin/releases/tag/1.0(1)" 10 | }, 11 | { 12 | "name": "小宝影视", 13 | "release": "https://github.com/feiyeyuanye/XiaoBaoTVVodPlugin/releases/tag/1.0(1)" 14 | }, 15 | { 16 | "name": "七喜影院", 17 | "release": "https://github.com/feiyeyuanye/QiXiVodPlugin/releases/tag/1.0(1)" 18 | }, 19 | { 20 | "name": "看韩剧", 21 | "release": "https://github.com/feiyeyuanye/KanHJVideoPlugin/releases/tag/1.0(1)" 22 | }, 23 | { 24 | "name": "泥视频", 25 | "release": "https://github.com/feiyeyuanye/NiVodPlugin/releases/tag/1.0(1)" 26 | }, 27 | { 28 | "name": "快看资源网", 29 | "release": "https://github.com/feiyeyuanye/KuaiKanVodPlugin/releases/tag/1.0(1)" 30 | }, 31 | { 32 | "name": "海外看资源站", 33 | "release": "https://github.com/feiyeyuanye/HaiwaikanVodPlugin/releases/tag/1.0(1)" 34 | }, 35 | { 36 | "name": "暴风资源", 37 | "release": "https://github.com/feiyeyuanye/BFZYVodPlugin/releases/tag/1.2(2)" 38 | }, 39 | { 40 | "name": "量子资源", 41 | "release": "https://github.com/feiyeyuanye/LZiZYPlugin/releases/tag/1.0(1)" 42 | }, 43 | { 44 | "name": "次元城动漫", 45 | "release": "https://github.com/feiyeyuanye/CycdmAnimePlugin/releases/tag/1.0(1)" 46 | }, 47 | { 48 | "name": "稀饭动漫", 49 | "release": "https://github.com/feiyeyuanye/XfaniAnimePlugin/releases/tag/1.3(3)" 50 | }, 51 | { 52 | "name": "AnFuns动漫", 53 | "release": "https://github.com/feiyeyuanye/AnFunsAnimePlugin/releases/tag/1.3(3)" 54 | }, 55 | { 56 | "name": "樱花动漫", 57 | "release": "https://github.com/RyensX/SakuraAnimePlugin/releases/tag/1.9(10)" 58 | }, 59 | { 60 | "name": "樱花动漫2", 61 | "release": "https://github.com/RyensX/SakuraAnime2Plugin/releases/tag/1.5(7)" 62 | }, 63 | { 64 | "name": "樱花动漫3", 65 | "release": "https://github.com/feiyeyuanye/SakuraAnime3Plugin/releases/tag/1.7(9)" 66 | }, 67 | { 68 | "name": "AGE动漫", 69 | "release": "https://github.com/feiyeyuanye/AGEAnimePlugin/releases/tag/1.6(6)" 70 | }, 71 | { 72 | "name": "ZzzFun动漫", 73 | "release": "https://github.com/feiyeyuanye/ZzzFunAnimePlugin/releases/tag/1.3(3)" 74 | }, 75 | { 76 | "name": "FreeOk影视", 77 | "release": "https://github.com/feiyeyuanye/FreeOkVideoPlugin/releases/tag/1.3(3)" 78 | }, 79 | { 80 | "name": "Gimy影视", 81 | "release": "https://github.com/MARVEL-LJH/GimyPlugin/releases/tag/1.4.27" 82 | }, 83 | { 84 | "name": "DD影视", 85 | "release": "https://github.com/RyensX/DDVideoPlugin/releases/tag/1.2(4)" 86 | }, 87 | { 88 | "name": "独播影视", 89 | "release": "https://github.com/RyensX/DubokuVideoPlugin/releases/tag/1.0" 90 | } 91 | ] 92 | } 93 | -------------------------------------------------------------------------------- /web_site_project/docs/.vitepress/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | base: '/PluginRepository/', 3 | title: '媒体盒子', 4 | lang: 'zh-CN', 5 | description: '插件化网罗天下媒体', 6 | lastUpdated: true, 7 | 8 | head: [ 9 | ['link', { rel: 'icon', href: '/PluginRepository/logo.png' }], 10 | ['script', { src: 'https://www.googletagmanager.com/gtag/js?id=G-47730WPJWW' }], 11 | ['script', , ` 12 | window.dataLayer = window.dataLayer || []; 13 | function gtag(){dataLayer.push(arguments);} 14 | gtag('js', new Date()); 15 | gtag('config', 'G-47730WPJWW'); 16 | `] 17 | ], 18 | 19 | themeConfig: { 20 | logo: '/logo.png', 21 | outlineTitle: '大纲', 22 | //这里的更新时间是git最后更新时间而不是文档时间,有点问题 23 | lastUpdatedText: "最后更新时间", 24 | nav: nav(), 25 | socialLinks: [ 26 | { icon: 'github', link: 'https://github.com/RyensX/MediaBoxPluginRepository' }, 27 | { 28 | icon: { 29 | //https://github.com/vuejs/vitepress/issues/1053 30 | svg: '' 31 | }, 32 | link: 'https://t.me/MediaBoxGithub' 33 | } 34 | ], 35 | algolia: { 36 | //TODO 37 | indexName: 'mediabox', 38 | appId: '', 39 | apiKey: '', 40 | }, 41 | footer: { 42 | message: 'Released under the GPL-3.0 License.', 43 | copyright: 'Copyright © 2023 Ryens' 44 | } 45 | } 46 | } 47 | 48 | function nav() { 49 | return [ 50 | { text: "下载", link: '/download' }, 51 | { text: '插件仓库', link: '/plugin-repo/plugin-browser' }, 52 | { text: '贡献插件', link: 'https://github.com/RyensX/MediaBoxPluginRepository' }, 53 | { text: '插件开发指南', link: 'https://github.com/RyensX/MediaBox/wiki' }, 54 | ] 55 | } -------------------------------------------------------------------------------- /web_site_project/docs/.vitepress/theme/components/DownloadInfo.vue: -------------------------------------------------------------------------------- 1 | 2 |选择需要下载的版本
7 | 8 |