# Solo **Repository Path**: joinli/solo ## Basic Information - **Project Name**: Solo - **Description**: 视频浏览器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-10 - **Last Updated**: 2025-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Solo扩展插件文档 ## 插件说明 Solo扩展插件用于增强浏览器视频播放体验。由于浏览器受限于原生webView,导致视频播放体验很不友好。Solo的解决方案是通过编写特定的JavaScript代码,实现原生播放器播放。 ### 插件工作原理 通过DOM操作获取页面中的视频信息(标题、播放链接等),将获取的数据转换为标准JSON格式,发送给Solo原生播放器播放。 插件作为中间层,只用作于统一处理网站播放链接,并不会修改网站内容,所以理论上可以运行在任何公开、无限制的网站上。 ### 插件示例 饭团视频 [点击跳转](https://gitee.com/joinli/solo/blob/master/extension/extension_fantuan.js) ## 插件信息 manifest.json ```json { "name": "饭团视频", "version": 1.0, "home": "https://www.fantuan.run", "matches": "/player", "update": "https://gitee.com/joinli/solo/raw/master/extension/extension_fantuan.js", "author": "JoinLi", "ua": "Mobile" } ``` ### manifest.json 字段说明 - **name**: 插件名称,主键不可重复,要保证唯一性 - **version**: 插件版本号,当前版本为 1.0 - **home**: 插件对应的目标网站 - **matches**: 匹配规则,当URL包含"/player"时激活插件 - **update**: 插件更新地址,用于自动更新功能 - **author**: 插件作者信息 - **ua**: 用户代理设置,设置为"Mobile"以模拟移动端访问,"PC"已电脑端访问 ## 数据格式说明 ### 发送给Solo的JSON数据格式 插件通过 `window.dartJavascriptChannel.postMessage()` 向Solo发送以下格式的JSON数据: ```json { "event": "playData", "data": { "title": "视频名称", "list": [ { "title": "视频源1", "play_list": [ { "name": "节目1", "url": "https://test/player/93555-1-1.html" } ] }, { "title": "视频源2", "play_list": [ { "name": "节目2", "url": "https://test/player/93555-2-1.html" } ] } ] } } ``` ### 数据结构说明 #### 根对象 - **event**: 事件名称,固定为"playData" - **data**: 包含视频数据的对象 #### data 对象 - **title**: 视频标题,从页面标题中提取 - **list**: 视频源列表数组 #### list 数组中的每个元素 - **title**: 视频源名称,格式为"视频源1"、"视频源2"等 - **play_list**: 播放链接列表数组 #### play_list 数组中的每个元素 - **name**: 播放链接的名称(如"HD中字"、"HD英文") - **url**: 播放链接的完整URL地址 ## 实现插件方法 ### 1. 页面生命周期方法 #### onPageStarted() ```javascript function onPageStarted() { // 页面开始加载时的处理逻辑 // 当前为空实现,可根据需要添加初始化代码 } ``` #### onPageFinished() ```javascript function onPageFinished() { // 页面加载完成后的处理逻辑 getPlayData(); // 调用数据获取方法 } ``` ### 2. 核心功能方法 #### getPlayData() 这是插件的核心方法,负责从页面提取视频数据并发送给Solo。 **功能流程:** 1. **获取页面元素** ```javascript const panels = document.querySelectorAll('.module-play-list'); ``` 查找所有包含播放列表的模块 2. **提取视频标题** ```javascript const title = document.title.split(' ')[0].replace("在线播放", ""); ``` 从页面标题中提取视频名称,移除"在线播放"后缀 3. **构建数据结构** ```javascript const result = { title: title, list: [] }; ``` 4. **遍历播放面板** ```javascript panels.forEach((panel, index) => { const panelData = { title: '视频源' + (index + 1).toString(), play_list: [] }; ``` 5. **提取播放链接** ```javascript const links = panel.querySelectorAll('.module-play-list-link'); links.forEach(link => { const name = link.querySelector('span').textContent; const href = link.getAttribute('href'); const url = window.location.origin + href; panelData.play_list.push({ name, url }); }); ``` 6. **发送数据** ```javascript const data = JSON.stringify({ event: 'playData', data: result }); if (window.dartJavascriptChannel) { window.dartJavascriptChannel.postMessage(data); } ``` 7. **自动播放处理** ```javascript const element = document.elementFromPoint(200, 200); if (element.tagName.toLowerCase() === 'iframe') { const iframeDoc = element.contentDocument || element.contentWindow.document; iframeDoc.elementFromPoint(200, 200).click(); } ``` 如果检测到iframe元素,自动点击以触发播放事件 ### 3. 使用说明 1. 插件会在URL包含"/player"的页面自动激活 2. 页面加载完成后自动获取视频数据 3. 数据获取完成后自动发送给Solo ### 4. 注意事项 - 如果网页没有实现自动播放功能,则需要通过模拟点击实现播放 - 插件版本可通过manifest.json中的update字段进行自动更新 - 插件理论上可以正常运行在任何公开、无限制的网站上 - 请遵守相关法律规定。