Play-With-MPV

使用 mpv 播放网页中的视频,并支持 potplayer 及自定义播放器

目前为 2024-11-24 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Play-With-MPV
  3. // @name:zh 使用 MPV 播放
  4. // @namespace https://github.com/LuckyPuppy514
  5. // @version 4.0.9
  6. // @author LuckyPuppy514
  7. // @copyright 2023, Grant LuckyPuppy514 (https://github.com/LuckyPuppy514)
  8. // @license MIT
  9. // @description 使用 mpv 播放网页中的视频,并支持 potplayer 及自定义播放器
  10. // @homepage https://github.com/LuckyPuppy514/Play-With-MPV
  11. // @icon https://www.lckp.top/gh/LuckyPuppy514/pic-bed/common/mpv.png
  12. // @match https://www.bilibili.com/bangumi/play/*
  13. // @match https://www.bilibili.com/video/*
  14. // @match https://www.bilibili.com/festival/*
  15. // @match https://www.bilibili.com/list/*
  16. // @match https://live.bilibili.com/*
  17. // @match https://www.ixigua.com/*
  18. // @match https://yun.nxflv.com/?url=*
  19. // @match https://ddys.art/*
  20. // @match https://ddys.pro/*
  21. // @include *://*.libvio.*
  22. // @include https://*.chinaeast2.cloudapp.chinacloudapi.cn*/*
  23. // @match https://*.cfnode1.xyz/*?url=*
  24. // @include https://www.nivod*.tv/*
  25. // @match https://www.pkmkv.com/py/*
  26. // @match https://www.pkmkv.com/addons/dplayer/?url=*
  27. // @match https://www.btnull.org/py/*
  28. // @match https://www.btnull.to/py/*
  29. // @match https://www.btnull.nu/py/*
  30. // @match https://www.btnull.in/py/*
  31. // @include *://www.*dm.com/play/*
  32. // @match *://www.ntdm8.com/play/*
  33. // @include *://www.mxdm.tv/*
  34. // @include *://www.mxdm*.com/*
  35. // @match https://danmu.yhdmjx.com/*?url=*
  36. // @match https://dick.xfani.com/watch/*
  37. // @match https://dick.xfani.com/addons/dp/player/*
  38. // @match https://player.moedot.net/player/*
  39. // @match https://m3.moedot.net/muiplayer/?url=*
  40. // @match https://www.mgnacg.com/bangumi/*
  41. // @match https://play.mknacg.top:8585/*
  42. // @match https://www.omofun.top/index.php/vod/play/id/*
  43. // @match https://*.omofun.top/?url=*
  44. // @match https://spdcat.net/vodplay/*
  45. // @match https://spdcat.net/addons/dp/player/*
  46. // @match http://www.dm88.me/player/*
  47. // @match https://jianghu.live2008.com/*?url=*
  48. // @match https://www.kk151.com/play/*
  49. // @match https://jx.m3u8.tv/jiexi/?url=*
  50. // @match https://jx.wolongzywcdn.com:65/m3u8.php?url=*
  51. // @match https://www.m3u8.tv.cdn.8old.cn/jx.php?url=*
  52. // @match https://jx.wujinkk.com/dplayer/?url=*
  53. // @match https://www.ikdmjx.com/?url=*
  54. // @match https://hls.kuaibofang.com/?url=*
  55. // @match https://jx.jxbdzyw.com/m3u8/?url=*
  56. // @match https://hdzyk.com/?m=*
  57. // @match https://1080zyk1.com/?m=*
  58. // @match https://1080zyk2.com/?m=*
  59. // @match https://1080zyk3.com/?m=*
  60. // @match https://1080zyk4.com/?m=*
  61. // @match https://1080zyk5.com/?m=*
  62. // @match https://vip.zykbf.com/?url=*
  63. // @match https://*.yzzy-tv1.com/*
  64. // @match https://*.yzzy-tv-cdn.com/*
  65. // @match https://www.bdys10.com/*
  66. // @match https://www.haitu.tv/*
  67. // @include *://*alist*
  68. // @include *://*:5244*
  69. // @match *://*/*.mp4
  70. // @match *://*/*.mkv
  71. // @match *://*/*.flv
  72. // @match https://www.dora-family.com/Resource:TV
  73. // @match https://www.olehdtv.com/*
  74. // @match *://tkznp.com/vodplay/*
  75. // @match *://www.tkznp.com/vodplay/*
  76. // @match *://www.tkznp1.com/vodplay/*
  77. // @match *://www.tkznp2.com/vodplay/*
  78. // @match *://www.tkznp3.com/vodplay/*
  79. // @match *://www.tkznp4.com/vodplay/*
  80. // @match *://www.tkznp5.com/vodplay/*
  81. // @match *://www.tkznp6.com/vodplay/*
  82. // @match https://vip.ckllk.com/?url=*
  83. // @match https://www.anfuns.cc/play/*
  84. // @match https://www.anfuns.cc/vapi/*
  85. // @match https://www.youtube.com/*
  86. // @match https://odysee.com/*
  87. // @match https://rumble.com/*
  88. // @match https://www.bitchute.com/*
  89. // @match https://ani.gamer.com.tw/animeVideo.php?sn=*
  90. // @match https://ok.ru/*
  91. // @match https://tver.jp/*
  92. // @match https://www.lckp.top/play-with-mpv/index.html
  93. // @match https://www.douyin.com/
  94. // @match https://www.douyin.com/video/*
  95. // @match https://www.douyin.com/discover?modal_id=*
  96. // @match https://www.mitang.tv/m/*
  97. // @match https://www.mfan.tv/play/*
  98. // @match https://video1.beijcloud.com/player/?url=*
  99. // @match https://www.tucao.cam/play/*
  100. // @match https://mypikpak.com/drive/*
  101. // @match https://www.icourse163.org/learn/*
  102. // @match https://www.iole.tv/*
  103. // @match https://www.zhihu.com/zvideo/*
  104. // @match *://www.susudm8.com/*
  105. // @match *://susudyy.com/*
  106. // @match *://buding3.com/*
  107. // @match *://buding6.com/*
  108. // @match *://v2.shenjw.com:*/wap.php?url=*
  109. // @match *://u88.xigua88ok.com:*/wap.php?url=*
  110. // @match *://test3.gqyy8.com:*/f/aliplayer.php?url=*
  111. // @match *://v.mksec.cn/*
  112. // @match https://tgbook.coolkv.com/*play*
  113. // @include *://*dsh*.com/*
  114. // @match https://www.twitch.tv/*
  115. // @match https://jiohub.top/watch/*
  116. // @match https://www.agemys.org/play/*
  117. // @include https://vip.sp-flv.com:*?url=*
  118. // @match https://anime.girigirilove.com/*
  119. // @match https://play.girigirilove.top/love?url=*
  120. // @match https://www.cycdm01.top/*
  121. // @match https://player.cycdm01.top/?url=*
  122. // @match https://www.xgcartoon.com/video/*
  123. // @match https://pframe.xgcartoon.com/player.htm?vid=*
  124. // @match https://iframe.mediadelivery.net/*
  125. // @connect api.bilibili.com
  126. // @connect api.live.bilibili.com
  127. // @require https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-y/jquery/3.2.1/jquery.min.js
  128. // @require https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-y/spark-md5/3.0.2/spark-md5.min.js
  129. // @grant GM_setValue
  130. // @grant GM_getValue
  131. // @run-at document-body
  132. // ==/UserScript==
  133.  
  134. "use strict";
  135.  
  136. const INFO = `
  137.  
  138. ▶️🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽◀️
  139. ▶️ ◀️
  140. ▶️ Play-With-MPV ◀️
  141. ▶️ ◀️
  142. ▶️ https://github.com/LuckyPuppy514/Play-With-MPV ◀️
  143. ▶️ ◀️
  144. ▶️ © 2023 LuckyPuppy514 ◀️
  145. ▶️ ◀️
  146. ▶️🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼🔼◀️
  147.  
  148. `;
  149. // gm key
  150. const KEY = {
  151. config: "config",
  152. };
  153. // 默认配置
  154. const DEFAULT_CONFIG = {
  155. player: "mpv",
  156. mpv: {
  157. path: "",
  158. regVersion: "20230514",
  159. },
  160. potplayer: {
  161. path: "",
  162. regVersion: "20230514",
  163. },
  164. proxy: "",
  165. bestQuality: "2160p",
  166. bilibiliCodecs: 12,
  167. playAuto: 0,
  168. closeAuto: 0,
  169. syncStartTime: 0,
  170. subtitlePrefer: "zh-Hans",
  171. customplayer: {
  172. name: "customplayer",
  173. path: "",
  174. params: {
  175. videoUrl: "iina://weblink?url=${EvideoUrl}",
  176. audioUrl: "",
  177. subtitleUrl: "",
  178. title: "",
  179. startTime: "",
  180. referer: "",
  181. origin: "&mpv_http-header-fields=origin%3A%20${Eorigin}",
  182. proxy: "",
  183. other: "",
  184. },
  185. },
  186. transform: {
  187. xOffset: 0,
  188. yOffset: 0,
  189. },
  190. version: "20230922",
  191. };
  192. var currentConfig;
  193. // 视频链接匹配正则
  194. const VIDEO_URL_REGEX =
  195. /https?:\/\/(?![^"^']*http)[^"^']+(\.|%2e)(m3u8|m3u|mp4|mkv|flv|avi)(\?[\w&=-]+|)/g;
  196. // 父子页面方法名
  197. const METHOD = {
  198. pause: "PAUSE",
  199. report: "REPORT",
  200. };
  201. // 时间 ms
  202. const TIME = {
  203. out: 3000,
  204. toast: 3500,
  205. refresh: 600,
  206. reportInterval: 600,
  207. pauseInterval: 2000,
  208. showButton: 5000,
  209. };
  210. // 尝试次数
  211. var tryTime = 0;
  212. const TRY_TIME = {
  213. maxPause: 5,
  214. maxParse: 8,
  215. };
  216. // 播放器配置
  217. const PLAYER = {
  218. mpv: {
  219. name: "mpv",
  220. params: {
  221. videoUrl: 'mpv://"${videoUrl}"',
  222. audioUrl: ' --audio-file="${audioUrl}"',
  223. subtitleUrl: ' --sub-file="${subtitleUrl}"',
  224. title: ' --force-media-title="${title}"',
  225. startTime: " --start=${startTime}",
  226. referer: ' --http-header-fields="referer: ${referer}"',
  227. origin: ' --http-header-fields="origin: ${origin}"',
  228. proxy: " --http-proxy=${proxy} --ytdl-raw-options=proxy=[${proxy}]",
  229. other: " ${other}",
  230. },
  231. },
  232. potplayer: {
  233. name: "potplayer",
  234. params: {
  235. videoUrl: "potplayer://${videoUrl} /current",
  236. subtitleUrl: ' /sub="${subtitleUrl}"',
  237. title: ' /title="${title}"',
  238. startTime: " /seek=${startTime}",
  239. referer: ' /referer="${referer}"',
  240. origin: ' /headers="origin: ${origin}"',
  241. proxy: ' /user_agent="${proxy}"',
  242. },
  243. },
  244. customplayer: {
  245. name: "customplayer",
  246. params: undefined,
  247. },
  248. };
  249. // 页面信息
  250. var page = {
  251. host: undefined,
  252. url: undefined,
  253. isFullScreen: false,
  254. };
  255. // 处理器
  256. var handler;
  257. // 前缀
  258. const PREFIX = "pwm";
  259. // 组件 id
  260. const ID = {
  261. loadingDiv: `${PREFIX}-loading-div`,
  262. toastDiv: `${PREFIX}-toast-div`,
  263. buttonDiv: `${PREFIX}-button-div`,
  264. infoButton: `${PREFIX}-info-button`,
  265. infoDiv: `${PREFIX}-info-div`,
  266. infoTable: `${PREFIX}-info-table`,
  267. mpvPlayButton: `${PREFIX}-mpv-play-button`,
  268. potplayerPlayButton: `${PREFIX}-potplayer-play-button`,
  269. customplayerPlayButton: `${PREFIX}-customplayer-play-button`,
  270. settingButton: `${PREFIX}-setting-button`,
  271. settingDiv: `${PREFIX}-setting-div`,
  272. settingTable: `${PREFIX}-setting-table`,
  273. playerRadio: `${PREFIX}-player-radio`,
  274. softwarePathInput: `${PREFIX}-software-path-input`,
  275. proxyInput: `${PREFIX}-proxy-input`,
  276. bestQualityRadio: `${PREFIX}-best-quality-radio`,
  277. bilibiliCodecsRadio: `${PREFIX}-bilibili-codecs-radio`,
  278. saveButton: `${PREFIX}-save-button`,
  279. downloadButton: `${PREFIX}-download-button`,
  280. deleteButton: `${PREFIX}-delete-button`,
  281. playAutoInput: `${PREFIX}-play-auto-input`,
  282. closeAutoInput: `${PREFIX}-close-auto-input`,
  283. syncStartTimeInput: `${PREFIX}-sync-start-time-input`,
  284. syncStartTimeSpan: `${PREFIX}-sync-start-time-span`,
  285. infoDiv: `${PREFIX}-info-div`,
  286. infoTable: `${PREFIX}-info-table`,
  287. subtitlePreferRadio: `${PREFIX}-subtitle-prefer-radio`,
  288. customplayerSettingButton: `${PREFIX}-customplayer-setting-button`,
  289. customplayerSettingTable: `${PREFIX}-customplayer-setting-table`,
  290. videoUrlParamInput: `${PREFIX}-video-url-param-input`,
  291. audioUrlParamInput: `${PREFIX}-audio-url-param-input`,
  292. subtitleUrlParamInput: `${PREFIX}-subtitle-url-param-input`,
  293. titleParamInput: `${PREFIX}-title-param-input`,
  294. startTimeParamInput: `${PREFIX}-start-time-param-input`,
  295. proxyParamInput: `${PREFIX}-proxy-param-input`,
  296. refererParamInput: `${PREFIX}-referer-param-input`,
  297. originParamInput: `${PREFIX}-origin-param-input`,
  298. nxParserIframe: `${PREFIX}-nx-parser-iframe`,
  299. };
  300. // 组件 class
  301. const CLASS = {
  302. button: `${PREFIX}-button`,
  303. titleSpan: `${PREFIX}-title-span-class`,
  304. titleTd: `${PREFIX}-title-td-class`,
  305. closeButton: `${PREFIX}-cloase-button-class`,
  306. tipSpan: `${PREFIX}-tip-span-class`,
  307. footerSpan: `${PREFIX}-footer-span-class`,
  308. switchLabel: `${PREFIX}-switch-label-class`,
  309. sliderSpan: `${PREFIX}-slider-span-class`,
  310. roundSpan: `${PREFIX}-round-span-class`,
  311. readOnly: `${PREFIX}-read-only-class`,
  312. footerA: `${PREFIX}-footer-a-class`,
  313. infoInput: `${PREFIX}-info-input-class`,
  314. };
  315. // 消息类型
  316. const TOAST_TYPE = {
  317. info: "info",
  318. warn: "warn",
  319. error: "error",
  320. };
  321. // 图标
  322. const ICON_BASE64 = {
  323. customplayer: "url('data:image/png;base64,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')",
  324. back: "url('data:image/png;base64,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')",
  325. };
  326. const CSS = `
  327. #${ID.loadingDiv} {
  328. display: none;
  329. position: fixed;
  330. bottom: 50%;
  331. left: 50%;
  332. z-index: 999999;
  333. transform: translate(-50%, -50%);
  334. background-color: rgba(255, 255, 255, 0);
  335. }
  336. #${ID.loadingDiv} .spinner {
  337. width: 40px;
  338. height: 40px;
  339. background-color: rgba(255, 255, 255, 1);
  340. -webkit-animation: sk-rotateplane 1.2s infinite ease-in-out;
  341. animation: sk-rotateplane 1.2s infinite ease-in-out;
  342. }
  343. @-webkit-keyframes sk-rotateplane {
  344. 0% {
  345. -webkit-transform: perspective(120px)
  346. }
  347.  
  348. 50% {
  349. -webkit-transform: perspective(120px) rotateY(180deg)
  350. }
  351.  
  352. 100% {
  353. -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg)
  354. }
  355. }
  356.  
  357. @keyframes sk-rotateplane {
  358. 0% {
  359. transform: perspective(120px) rotateX(0deg) rotateY(0deg);
  360. -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg)
  361. }
  362.  
  363. 50% {
  364. transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
  365. -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg)
  366. }
  367.  
  368. 100% {
  369. transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
  370. -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
  371. }
  372. }
  373. #${ID.toastDiv} {
  374. display: none;
  375. position: fixed;
  376. bottom: 80%;
  377. left: 50%;
  378. max-width: 60%;
  379. min-width: 150px;
  380. padding: 0 14px;
  381. height: 40px;
  382. color: rgb(255, 255, 255);
  383. line-height: 40px;
  384. text-align: center;
  385. border-radius: 4px;
  386. transform: translate(-50%, -50%);
  387. z-index: 9999999999;
  388. background: rgba(0, 255, 0, .9);
  389. font-size: 14px;
  390. font-weight: blod;
  391. }
  392. /* 按钮 */
  393. #${ID.buttonDiv} {
  394. display: none;
  395. position: fixed;
  396. bottom: 0;
  397. left: 0;
  398. cursor: move;
  399. z-index: 99999;
  400. width: fit-content;
  401. height: 70px;
  402. }
  403. #${ID.buttonDiv}:hover .${CLASS.button} {
  404. visibility: visible !important;
  405. }
  406. .${CLASS.button} {
  407. position: static;
  408. cursor: pointer;
  409. z-index: 99999;
  410. border: none;
  411. border-radius: 50%;
  412. background-size: cover;
  413. background-color: rgba(255, 255, 255, 0);
  414. }
  415. .${CLASS.button}:hover {
  416. transform: scale(1.1);
  417. }
  418. #${ID.potplayerPlayButton} {
  419. width: 42px;
  420. height: 42px;
  421. margin: auto 0;
  422. background-image: url(data:image/png;base64,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)
  423. }
  424. #${ID.mpvPlayButton} {
  425. width: 50px;
  426. height: 50px;
  427. margin: auto 0;
  428. background-image: url(data:image/png;base64,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);
  429. }
  430. #${ID.customplayerPlayButton} {
  431. width: 46px;
  432. height: 46px;
  433. margin: auto 0;
  434. background-image: url(data:image/png;base64,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)
  435. }
  436. /* 设置 */
  437. #${ID.settingButton} {
  438. width: 28px;
  439. height: 28px;
  440. background-image: url(data:image/png;base64,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);
  441. }
  442. #${ID.settingDiv},
  443. #${ID.infoDiv} {
  444. position: fixed;
  445. top: 40%;
  446. left: 50%;
  447. transform: translate(-50%, -50%);
  448. z-index: 999999999;
  449. width: 900px;
  450. height: 520px;
  451. background-color: rgb(65, 146, 247);
  452. display: none;
  453. flex-direction: column;
  454. border-radius: 6px;
  455. align-items: center;
  456. color: rgba(0, 0, 0, .7);
  457. font-family: "微软雅黑";
  458. }
  459. #${ID.infoDiv} {
  460. background-color: rgb(234, 122, 153) !important;
  461. }
  462. #${ID.infoTable},
  463. #${ID.settingTable},
  464. #${ID.customplayerSettingTable} {
  465. width: 800px;
  466. height: 460px;
  467. border-radius: 5px !important;
  468. border: 3px solid rgba(255, 255, 255, 1) !important;
  469. text-align: left;
  470. border-collapse: unset !important;
  471. display: flex;
  472. justify-content: center;
  473. padding-top: 3px;
  474. padding-bottom: 12px;
  475. line-height: 20px !important;
  476. font-weight: normal !important;
  477. }
  478. #${ID.customplayerSettingTable} {
  479. display: none;
  480. }
  481. #${ID.infoTable} td,
  482. #${ID.settingTable} td,
  483. #${ID.customplayerSettingTable} td {
  484. font-size: 14px;
  485. border: 0px solid rgba(255, 255, 255, 0.5);
  486. padding: 19px 0px 0px 0px !important;
  487. }
  488. #${ID.infoTable} td {
  489. padding-top: 16.5px !important;
  490. }
  491. .${CLASS.titleSpan} {
  492. padding-top: 12.5px !important;;
  493. padding-bottom: 12.5px !important;;
  494. font-size: 16px;
  495. font-weight: bold;
  496. color: rgba(255, 255, 255, 1) !important;
  497. }
  498. .${CLASS.closeButton} {
  499. position: absolute;
  500. top: 4px;
  501. right: 8px;
  502. height: 25px;
  503. width: 25px;
  504. border: none;
  505. font-size: 17px !important;
  506. font-weight: normal !important;
  507. background-color: rgba(0, 0, 0, 0);
  508. line-height: 0px;
  509. border-radius: 3px;
  510. transform: scale(1.32, 1);
  511. color: rgba(255, 255, 255, 1);
  512. }
  513. .${CLASS.closeButton}:hover {
  514. font-size: 20px;
  515. background-color: rgba(255, 255, 255, .5);
  516. cursor: pointer;
  517. }
  518. .${CLASS.tipSpan} {
  519. font-size: 12px;
  520. color: yellow;
  521. position: fixed;
  522. }
  523. .${CLASS.titleTd} {
  524. position: relative;
  525. width: 80px;
  526. height: 30px;
  527. border: none;
  528. font-size: 14px;
  529. text-align: center;
  530. color: rgba(255, 255, 255, 1) !important;
  531. cursor: default;
  532. }
  533. #${ID.infoTable} input,
  534. #${ID.settingTable} input,
  535. #${ID.customplayerSettingTable} input {
  536. font-size: 12px !important;
  537. width: 500px;
  538. height: 26px;
  539. border: none;
  540. outline: none;
  541. text-indent: 5px;
  542. padding: 0px !important;
  543. border-radius: 0px !important;
  544. color: rgba(0, 0, 0, 1);
  545. background-color: rgba(255, 255, 255, 1);
  546. cursor: auto;
  547. display: flex !important;
  548. margin-top: 1px !important;
  549. margin-bottom: 1px !important;
  550. border-collapse: unset !important;
  551. }
  552. #${ID.infoTable} input:hover,
  553. #${ID.settingTable} input:hover,
  554. #${ID.customplayerSettingTable} input:hover,
  555. #${ID.infoTable} input:focus-visible,
  556. #${ID.settingTable} input:focus-visible,
  557. #${ID.customplayerSettingTable} input:focus-visible {
  558. box-shadow: none;
  559. }
  560. #${ID.settingTable} input::placeholder,
  561. #${ID.customplayerSettingTable} input::placeholder {
  562. font-size: 12px;
  563. color: rgba(0, 0, 0, .3);
  564. }
  565. #${ID.saveButton} {
  566. font-size: 14px;
  567. margin-left: 83px;
  568. width: 300px;
  569. height: 30px;
  570. border: none;
  571. border-radius: 3px;
  572. color: rgba(255, 255, 255, 1);
  573. background-color: rgba(0, 255, 0, .7);
  574. }
  575. #${ID.downloadButton} {
  576. font-size: x-small;
  577. margin-left: 10px;
  578. width: 100px;
  579. height: 30px;
  580. border: none;
  581. border-radius: 3px;
  582. color: rgba(255, 255, 255, 1);
  583. background-color: rgba(0, 255, 0, .7);
  584. }
  585. #${ID.deleteButton} {
  586. text-decoration: none;
  587. font-size: x-small;
  588. width: 80px;
  589. height: 30px;
  590. border: none;
  591. border-radius: 3px;
  592. color: rgba(255, 255, 255, 1);
  593. background-color: rgba(0,0,0,0);
  594. }
  595. #${ID.saveButton}:hover,
  596. #${ID.downloadButton}:hover {
  597. opacity: .8;
  598. background-color: rgba(0, 255, 0, .8);
  599. cursor: pointer;
  600. }
  601. #${ID.deleteButton}:hover {
  602. opacity: .8;
  603. background-color: rgba(0,0,0,0);
  604. cursor: pointer;
  605. }
  606. .${CLASS.footerSpan} {
  607. margin-top: 8px !important;
  608. margin-bottom: 8px !important;
  609. color: rgba(255, 255, 255, 1);
  610. }
  611. #${ID.infoDiv} a,
  612. .${CLASS.footerSpan} a {
  613. color: rgba(255, 255, 255, 1);
  614. text-decoration: none;
  615. font-size: 14px !important;
  616. font-weight: normal !important;
  617. margin-bottom: 1px;
  618. display: inline-block;
  619. }
  620. /* switch */
  621. .${CLASS.switchLabel} {
  622. position: relative;
  623. display: inline-block;
  624. width: 50px;
  625. height: 21px;
  626. margin-top: 3px;
  627. }
  628. .${CLASS.switchLabel} input {
  629. opacity: 0;
  630. width: 0 !important;
  631. height: 0 !important;
  632. }
  633. .${CLASS.sliderSpan} {
  634. position: absolute;
  635. cursor: pointer;
  636. top: 0;
  637. left: 0;
  638. right: 0;
  639. bottom: 0;
  640. background-color: rgba(255, 255, 255, .6);
  641. -webkit-transition: .4s;
  642. transition: .4s;
  643. }
  644. .${CLASS.sliderSpan}:before {
  645. position: absolute;
  646. content: "";
  647. height: 13px;
  648. width: 13px;
  649. left: 4px;
  650. bottom: 4px;
  651. background-color: rgba(255, 255, 255, 1);
  652. -webkit-transition: .4s;
  653. transition: .4s;
  654. }
  655. #${ID.settingDiv} input:checked + .${CLASS.sliderSpan} {
  656. background-color: rgba(0, 255, 0, .7);
  657. }
  658. #${ID.settingDiv} input:focus + .${CLASS.sliderSpan} {
  659. box-shadow: 0 0 1px rgba(0, 255, 0, .7);
  660. }
  661. #${ID.settingDiv} input:checked + .${CLASS.sliderSpan}:before {
  662. -webkit-transform: translateX(29px);
  663. -ms-transform: translateX(29px);
  664. transform: translateX(29px);
  665. }
  666. .${CLASS.sliderSpan}.${CLASS.roundSpan} {
  667. border-radius: 34px;
  668. }
  669. .${CLASS.sliderSpan}.${CLASS.roundSpan}:before {
  670. border-radius: 50%;
  671. }
  672. .${CLASS.readOnly} {
  673. color: rgba(255, 255, 255, .3) !important;
  674. background-color: rgba(0, 0, 0, .3) !important;
  675. cursor: default !important;
  676. opacity: 1 !important;
  677. }
  678. .${CLASS.readOnly}::placeholder {
  679. color: rgba(255, 255, 255, .3) !important;
  680. }
  681. #${ID.infoButton} {
  682. width: 25px;
  683. height: 25px;
  684. background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAAAXNSR0IArs4c6QAAFTFJREFUeF7tnXt0HPV1x793VpKNBbYle2dlqFMQz0AKcQADxSQhxGBTikkDBtIW2zw0EiY0BDDalWmWwu4KmdY5BWytANuQ0NCE5BD7GIJJAwGcgknjlBDzjAgN2NKuZMnGL8nauT0r2+Fpa3dm9rfzuHOO//DR797fvd97P+c3MzvzG4IcooAosF8FSLQRBUSB/SsggEh3iAIHUEAAkfYQBQQQ6QFRwJoCsoJY002sAqKAABKQQkua1hQQQKzpJlYBUUAACUihJU1rCggg1nQTq4AoIIAEpNCSpjUFBBBruolVQBQQQAJSaEnTmgICiDXdxCogCgggASm0pGlNAQHEmm5iFRAFBJCAFFrStKaAAGJNN7EKiAICSEAKLWlaU0AAsaabWAVEAQEkIIWWNK0pIIBY002sAqKAABKQQkua1hQQQKzpJlYBUUAAKXGhOb589OaBgXozpNUzcz2YDmVwDQE1xKhhDTVg1AB//tcPoA/M/QT0MVE/iPp4+P+cBVEn5bTOSuzuHN96bV+Jww+8ewHEwRboiqZPCxFmMKgexPXEVM/gQx2c4uOu+kDoBKMToE5G7ukNVd3/dXY8PlTCOQPlWgCxUe7MwvajAUzjHM4B0UwCam24c8SUgN0msFojelIzzWcnpBo3OOI4oE4EkCIL393c8VVN4/OHwQBOLdK8HMN/A8azzHgi0mqsKUcAXp5TACmgel2xpZ8D00Ua0SwApxRg4sohDLwcIloJ5FZNTDStc2WQLgtKANlPQTbG0xO1QeyBgvkCl9XNiXCeZaZVQ7mhVYe1Xfu6Ew796EMA+VhVe6Lp40wNcwDMBaPOj0X/ZE60ImfmHpzU2vRMMPItPEsBZK9WXS1LTg9xxRwGzwUwunAJ/TOSgMdMxoORlPGYf7Kyl0ngAck0t88gjeYwcJk9KX1kzfQMKPegnmxa4aOsLKUSWEAyzUunQNMWQMA4QOPQWmK0hVMNKy11lw+MAgfIxnh6TOUgbmYgD8cYH9RQRQrLSKtoC99xVeAu5gMFSDbWcRkzLwBhioqu8tUchB42sSiSMtp8ldcIyQQCkO7YkhMJoaicTjnR2sE67fI9IJnY0tmAthhAKZ+JcqLzvOWD0aKnjKS3gi4+Wl8D0h1t/2ciuq14WcSiMAXooYEq7YbJ8as3Fzbee6N8CUjXTUv1UJW2mIFveK8k3oqYQOtMwg2RRMOvvBV5YdH6DpBMS/sXwZQ/pfpCYRLIKAcU2ArQDXqyYZkDvlzlwleAZGJL5wLavXL7tlw9xik92Rgr1+ylmNc3gGRiHVGAfX/RWIomcNYnrdCTDfOc9Vk+b74AJBNN3w3CdeWTUWb+iAKMNXrKOM8PqngekEys40cAX+yHYvgqB8Lv9IRxotdz8jQgmZb0E2DM8HoR/Bo/A72RpDHRy/l5FpBMLP04gJleFj8gse/Qk0a1V3P1JCCZlo77wXyVV0UPXNyM9XrK8ORtd88Bkmlpvx1MCwPXZN5P+BE9aVzutTQ8BUg2lv4OA3GviSzx7lGAgcWRpPFtL+nhGUAEDi+11YFi9daPiZ4AJBtL38jAXX5pkaDnwWzeEkk1eeK9EtcD0hVrP0cD5Tc804LeWH7K32SaVeeBV3ldDciW+P21g7vNNcx8sp+a4+O5hCaMQ0VdLUKRWgxtzCKX6Udu81Y/p5zPrZOYZoZTDW+4OVFXA5Jpab8fTL68nRsKj0f1uVNR+ZkItIMP+kSPmFt3YOi9LHas/R12v73RzT1kPTaix/VEw99Yd1B6S9cCkoml5wO4p/QSqJ9h9JRjcMjFXy544p0vbsC2lc8XPN5LA4no38KJhhvdGrMrAemOLj2TSMtfd/hu15HaGy9DqHZs0f1gbt+F3uRDRdt5wcAkGHUJo8ONsboSkEysYw3A090omJ2Yxl99ASqPsP5q/M51G7Dtpz5cSQg9RBXT3LitkOsAybSkrwPjbjuN6Ebbg047HgdfOM12aFuWrcbgH96z7ceFDpbpScN115uuAqS3ZdnkHA+uBWiyCwtoOSStejTGN15k6dTq45MOvZtB/7LV4IHdluNxqyExzXLbLo6uAsSvLz6NOukojJ39Fcf68v1Hn8au9W865s89jmitnmywv8w6mJBrAOmOtU+nPT8I+u6o/uopGHO2cw+z7njuZWz/2Qu+0ymfEDNucdPuja4BxK8X5vmij/vH81B13F861tCDb76LLSvyr8P48HDZBbsrAMm2pBuYkfZhuYdTmnDLP0Ab69wda3PbTvSmvudXuUCg9nCyockNCboCkExL+tdg+PZxEgGk6FbfpTGmTEwZrxVt6bBB2QHx++ohp1gWO5bQqieM/IbjZT3KDojfV498deUi3UKPE7owODRFXzS/y4K1YyZlBSQIq0e+UnKb12K/MqJ6ymi1aO2IWVkBCcLqka+S/FBouVdf215VNeWI+Lxdlj3YNCwbIEFZPfbVRx41sdapTNwUSTS2W7O2b1U2QDIt6SfBONd+Ct7xIA8rWqgVYY2eKN82pmUBZHPsvhOHYP6vBbk8byKPuxdfwgpoJ9Umr3m5eEv7FmUBpCvavlAjut1++N70IC9MFVc3k/nWulTjHcVZOTO6LIB0xzpeJPBUZ1Lwphd55bbwujFoXSTZcFrhFs6NVA7I3i9A/dK5FLzvKaCbNhRXOOIv6YnGZ4szsj9aOSDZaPsiJrrJfujiIUgKEPNd4VTjzapzVg9ILP0aA8eqTlTm87YCBLweThrHqc5CKSB7N2Pw4UvVqssWzPlM0zynrrXpFyqzVwtILH0zAZ7YclJlEWSughVI6ElD6c7+igFpf4xAswqWQwaKAh9V4Fd60jhTpShKAcnE0hkAYZUJylz+UoCqKg4Lx69SttWkMkA2NXecGtJ4nb/KJdkoV4D5Sj3VuFzVvMoAybZ0fJuZ/1VVYjKPbxVQ+qUqZYB0x+T6w7ctqzAxImwOJ4wJqqZUBkgmln4bwOGqEvPaPHTQKFREapDr3Qrz/R1eC19pvAQcGk4am1RMqgSQrpsWVWtVY7epSMhLc2hjqzH6C8dg1PFHoOKwDz4nnsv0YeDVd7DrN28g19PvpZSUxFrBoWm1qavXqphMCSA9zR2nmnKB/kE9NUL19KkY88WTRqzxrpdexfY1L8HcUbaX6kaMUfUAjeiKiYkGJfseKQEkE1s6F9CU3XlQXbBi5st/+mDcFTOQf5q30MPcvhNbH34Ku98p6/4FhYZb8nEExMNJ47aSTwRACSDZWLqNAeUPmqkQsNg58nBUHfuZYs2Q69mCzYv/s2g7fxrQQ3qyYY6K3JQAkom2rwbR+SoScvMco048EmMvPcdyiPn9ePP78gb+IDyvJ4yzVOigBhC5gzVcy/HGrOFvElo9zP5t6F30H1bNfWNHoI3hZMNhKhIqOSAcj2vZwUk5Fcm4eY6KSRNQc93XbYe45XtPYvC1d2z78bqDcNWmSorHh0qdR8kB2RhPj6kYxPZSJ+J2/2POOgnVM+y/Nbrzhd9j2yoldzhdLWmOB/RJqeuzpQ6y5IDkv3U+MJjrLXUibvc/9hvTMeqEI2yHObSxB333/sS2H8870PgY/Y7Gkn9FqOSA9LQsPcxk7V3PF8RmAvnTq/xplt2Ddw2i5/YVdt143l4L0dSJtze8VOpESg5I98L0kWTirVIn4nb/46+5EJWH19kO09yyDb1tcqHOJs6LtBol/yJZyQHpvbXjhFyOX7HdGR53IIA4XUC6VE82/NBprx/3V3JAsrfedzLnzF+XOhG3+xdAnK0QMxojKaPkXyUrOSCZlvQ0MJ5zVh7veRNAnK4ZNevJhjud9qp8Bdkcvf/MIcoFficTAcTpVuZmPdnofUCyzfedzJqcYgkgzgJCBCOcMDqc9fpJbyU/xeqNth+fI/p9qRNxu38BxOEKEWbrCeNHDnv9hLuSA9LdvKSetNAfSp2I2/0LIM5WiE2aHmlt+LmzXsuwgmRj6UkMKNumpdSCWfUvgFhV7tPtyNROCbde8z/Oei0DIP3NS2oGtdDmUifidv8CiLMVYjN3ZKT12k5nvZYBEI4vH50dHNxZ6kTc7l8AcbZCVWaudnzrtX3Oei0DIPkpM7E0lzoRt/sXQJytkJ40Sn79nI9YySTZlvQrzDjBWYm85U0AcbRenXrSONJRj/txpgSQTCydf2bmEhUJuXUOAcS5yhDj5+GUMd05j/v3pASQbCz9HQbiKhJy6xwCiHOVYaAjkjQM5zyWGZBMS/oSMEr+5KUKwazOIYBYVe7T7NQ8ZqLsGkR+TQcEEAcBUfQrujJA5E6WAOIgHlD1I6FSQIJ+J0tWEOcQUfUbiFJAMrGO5QDPdU4mb3kSQByr11t60jjaMW8jOFJyF2vPKVaw9+cVQJxqab5bTzZe75S3kfwoAyQb7TiGiV8fKSC//l0AcaayBFwQThqrnfE2shdlgOy9UA/sR3QEkJGbsZARFTmMr73T2FLIWCfGqAUkml4BgpJduZ0Qx0kfAogjaj6hJw2lm6CrBSSWng/gHkek8pgTAcSBgjGiespodcBTwS6UAhLkL00JIAX35P4HEs7SE4bSDUCUArL3OuRVAMc5IJenXAggtsv1mp40PmvbS5EO1APSkk6B0VxknJ4fLoDYLCGhVU8YUZteijZXDkhXy5LTNQ79d9GRetxAALFXQJNyZ9Qlrn3BnpfirZUDMnyaFe14GsRfLj5c71oIIDZqx/SMnmo424YHy6ZlAaQrmv6WRlhsOWoPGgog1otmMm6oSxnfte7BumVZANnUvPTwkKblL9ZHWw/dW5YCiOV67cqZ5mcntTb90bIHG4ZlASQfbzaW/gEDl9mI3VOmAoi1chHwSDhpXG7N2r5V+QBZ2HEBm7zKfgre8CCAWKsTM74WSRmPWbO2b1U2QPauIisZ+Fv7abjfgwBioUZlvDjfF215AQnQKiKAWAAE5jw92VTWDzKWFZAgrSICSNGA/FZPGlOKtnLYoPyABGQVEUCK69xy3tr9cKRlByQoq4gAUhQgf6ysqppSE5/XX5RVCQa7A5AArCI111+Mikit7RLywCB6/qWsp+W2cxjJAQHxcNK4baRxKv7uCkDyiWZi6QcAXKki6XLMMfbvz8Wo4w+3PfXQxh703fsT235c64CxfmgUph0aN3a4IUbXAJJd+MCxzEPPgzHRDcI4HcOYL34e1edNte1254sbsG2l0lcibMdcjAMCXR5ONjxSjE0px7oGkHyS3dH0AiKU/MulpRR0f74rDp2Imvl/Z3vqrQ+vwcCGsjx1YTv2Ahw8opfxV/NPi89VgOw51ep4HuAzCxDTc0PGN16Eysm65bjN93egt/X7lu1dbrgDpjlNb21a76Y4XQdINtpxIRP/1E0iORXL6M8fjUMusf7U9vY167Djl791KhxX+XHThfmHhXEdIHtWEf9esI+bdz6qjvqLopsz1/c+Nt/1g6LtPGHgsgtz9wMSX16H3YNrwPgrTxS4iCBD4fEYd8UMhGrHFmyVv7W75ftrsLvTfx8LZmCQTXNmXWvTLwoWROFAV64ge69FZgL8uEItlE1FVRWoPncqDjrjcyPOuWv9m9j+1Eswt2wbcawXB7DJ8yOtjUvcGrtrAdkLSRTgpFvFsxtXfhUZffKxw7+PhPSaP7vLn04NvvoOdq1/A/nfPXx7EP5dTxj/5Ob8XA3I3uuRQHzfUBtXjQq9Brnercht3urmnnEmNsKacOWmmRSPm844LI0X1wPS17z08N2a9hSAo0ojgXhVrQAB/zfEPHNSqnGD6rmLnc/1gOQT6m7p+Box+/j5imLL5u3xzPz1SKrRE/X0BCD5dsjG0lczcJ+3W0OiB+GbesLwzP7MngFkeCWJpW8moE3azKsKcEpPNsa8FL2nANm7kgT+m+tearAPYqUVerJhntdi9xwgAonXWgwgYGU4aczyXuTDsXvzyMbSspJ4o3RP60njK94I9ZNRehaQfCqZlvR1YNztVfH9Hzf/UE82XurlPD0NyF5ILgEj/2OiHC5SgAjfDSeMG1wUkqVQPA+IQGKp7iU1cuuj61aS9gUgAomV0pfGxk9w5BXyDSAfgmQZgINLU37xeiAF/AaH7wDJJ9QdbT+DSLsT4LOknRUpwNhIGi0IJxoeVjSjsml8tYLsU+3t+PLR1YMDbQB9U5mSwZ1odYh5wQQPPHhopUS+BGSfEJlo+zwmaiP4cyshKwV32CahJ42FDvt0lTtfAzJ8XdK8dAq0UP6Ua7qrlPdwMAzuBGkLIomGH3s4jYJC9z0g+1QY3nNLw81+3ZiuoGo7MYhxT0irbJuQuPJPTrhzu4/AAJIvxPDujebQAj9vcVq6hqOnGOaiSLIx//JaYI5AAbKvqnv23sICv25Q52z38p9A1OaldziczD+QgHzktIuQv9NV/EZVTlbBnb6GwGgP0unUp5Uh0IDkBdkYT08MDfBcIpoDYOR9eNzZzE5G1UNEK3Kce7Au2fSKk4696CvwgOwrGsfjFd2Dk+ZqQB6UaV4sps2Y3zKZH6zMhVZMaLvmXZu+fGMugHxKKTPR9ouhaXPAfIFvKr2/RBgvgc2HMNpcocfn+3N3OhtFFEAOIF5XNH1aSKPZYJ7N/rpO2QKiR0Hmo/odjT+z0T++NxVACijx299aPP7g6jGzwciDck4BJi4dws/lwRiA+ePJiab3XBqkq8ISQIosRzba8SWTeBYBpwM4o0hz5cMZvA6gtSawalLSeFp5AB6fUACxUcBN0WVhTRuYprF2JgN/7RJgXgboeQKeQ1Xo2XD8Kv9tCW+jZsWaCiDFKnaA8fk7YV27ItNCWqge4HpmrgdRPYB6AsIOTvU+CJ1g6iRwp0nUSWR2DmyvWDd58dWbHZwn8K4EEEUtkF3wwCEm7a6nSkwiDtWY4BpiriGghoEagGrAqGHifiL0MaNfA/oY3M/M/RpCfQTO7kZl56TUlVlFYQd+GgEk8C0gAhxIAQFE+kMUOIACAoi0hygggEgPiALWFJAVxJpuYhUQBQSQgBRa0rSmgABiTTexCogCAkhACi1pWlNAALGmm1gFRAEBJCCFljStKSCAWNNNrAKigAASkEJLmtYUEECs6SZWAVFAAAlIoSVNawoIINZ0E6uAKCCABKTQkqY1BQQQa7qJVUAUEEACUmhJ05oCAog13cQqIAoIIAEptKRpTQEBxJpuYhUQBQSQgBRa0rSmgABiTTexCogCAkhACi1pWlNAALGmm1gFRAEBJCCFljStKfD/nS7vI51w7UwAAAAASUVORK5CYII=);
  685. }
  686. #${ID.settingDiv} .tabs {
  687. display: flex;
  688. width: 501px;
  689. height: 28px;
  690. }
  691. #${ID.settingDiv} .tabs>.tab {
  692. flex: 1;
  693. display: flex;
  694. border: 1px solid rgb(65,146,247);
  695. margin: 0;
  696. }
  697. #${ID.settingDiv} .tabs>.tab:after {
  698. background: rgba(0, 0, 0, 0);
  699. color: rgba(0, 0, 0, 0) !important;
  700. }
  701. #${ID.settingDiv} .tab>.tab-input {
  702. width: 0 !important;
  703. height: 0 !important;
  704. margin: 0 !important;
  705. display: none !important;
  706. }
  707. #${ID.settingDiv} .tab>.tab-box {
  708. padding: 4px 0px 0.5px 0px;
  709. width: 100%;
  710. height: 22px;
  711. text-align: center;
  712. transition: 0.3s;
  713. background: rgba(255, 255, 255, 1);
  714. font-size: 12px;
  715. font-weight: normal !important;
  716. display: table !important;
  717. color: #000000B3;
  718. }
  719. #${ID.settingDiv} .tab>.tab-box:hover {
  720. opacity: .8;
  721. cursor: pointer;
  722. }
  723. #${ID.settingDiv} .tab>.tab-input:checked+.tab-box {
  724. color: rgba(255, 255, 255, 1);
  725. background: rgba(0, 255, 0, .7);
  726. }
  727. #${ID.customplayerSettingButton}:hover:after,
  728. #${ID.settingDiv} .${CLASS.titleTd}:hover:after,
  729. .${CLASS.footerA}:hover:after {
  730. position: absolute;
  731. font-size: 12px;
  732. left: 0px;
  733. top: -3px;
  734. padding: 5px 5px 5px 5px !important;
  735. background-color: rgba(0, 0, 0, 0.6);
  736. color: rgba(255, 255, 255, 1);
  737. content: attr(data-tip);
  738. text-align: center;
  739. z-index: 999999;
  740. width: auto !important;
  741. height: auto !important;
  742. white-space: nowrap;
  743. }
  744. #${ID.customplayerSettingButton}:hover:after {
  745. left: -10px !important;
  746. top: -28px !important;
  747. }
  748. .${CLASS.footerA} {
  749. position: relative;
  750. }
  751. .${CLASS.footerA}:hover:after {
  752. left: 0px !important;
  753. top: -27px !important;
  754. }
  755. #${ID.customplayerSettingButton} {
  756. position: absolute;
  757. right: 122px;
  758. top: 76px;
  759. width: 22px;
  760. height: 22px;
  761. border: none;
  762. cursor: pointer;
  763. background-image: ${ICON_BASE64.customplayer};
  764. z-index: 999999;
  765. }
  766. `;
  767. const HTML = `
  768. <div id="${ID.loadingDiv}">
  769. <div class="spinner"></div>
  770. </div>
  771. <div id="${ID.toastDiv}"></div>
  772.  
  773. <div id="${ID.buttonDiv}" draggable="true">
  774. <button id="${ID.infoButton}" class="${CLASS.button}"></button>
  775. <button id="${ID.potplayerPlayButton}" class="${CLASS.button}"></button>
  776. <button id="${ID.mpvPlayButton}" class="${CLASS.button}"></button>
  777. <button id="${ID.customplayerPlayButton}" class="${CLASS.button}"></button>
  778. <button id="${ID.settingButton}" class="${CLASS.button}"></button>
  779. </div>
  780.  
  781. <div id="${ID.infoDiv}">
  782. <span class="${CLASS.titleSpan}">Play-With-MPV<button class="${CLASS.closeButton}">X</button></span>
  783. <table id="${ID.infoTable}">
  784. <tr>
  785. <td colspan="4" style="text-align: center; color: white; font-size: 16px;">本 息</td>
  786. </tr>
  787. <tr>
  788. <td class="${CLASS.titleTd}">视频标题</td>
  789. <td colspan="8">
  790. <input type="text" readonly class="${CLASS.infoInput}">
  791. </td>
  792. </tr>
  793. <tr>
  794. <td class="${CLASS.titleTd}">视频链接</td>
  795. <td colspan="8">
  796. <input type="text" readonly class="${CLASS.infoInput}">
  797. </td>
  798. </tr>
  799. <tr>
  800. <td class="${CLASS.titleTd}">音频链接</td>
  801. <td colspan="8">
  802. <input type="text" readonly class="${CLASS.infoInput}">
  803. </td>
  804. </tr>
  805. <tr>
  806. <td class="${CLASS.titleTd}">字幕链接</td>
  807. <td colspan="8">
  808. <input type="text" readonly class="${CLASS.infoInput}">
  809. </td>
  810. </tr>
  811. <tr>
  812. <td class="${CLASS.titleTd}">referer</td>
  813. <td colspan="8">
  814. <input type="text" readonly class="${CLASS.infoInput}">
  815. </td>
  816. </tr>
  817. <tr>
  818. <td class="${CLASS.titleTd}">origin</td>
  819. <td colspan="8">
  820. <input type="text" readonly class="${CLASS.infoInput}">
  821. </td>
  822. </tr>
  823. <tr><td></td></tr>
  824. <tr>
  825. <td style="text-align: right;">
  826. <a href="https://greasyfork.org/zh-CN/scripts/444056-play-with-mpv" target="_blank">🆕 升级 🆕</a>
  827. </td>
  828. <td style="text-align: right;">
  829. <a href="https://www.lckp.top/play-with-mpv/index.html" target="_blank">🧭 网站导航 🧭</a>
  830. </td>
  831. <td style="text-align: right;">
  832. <a href="https://github.com/LuckyPuppy514/Play-With-MPV" target="_blank">🌟 项目源码 🌟</a>
  833. </td>
  834. <td style="text-align: right;">
  835. <a href="https://github.com/LuckyPuppy514/Play-With-MPV/issues/new" target="_blank">👻 反馈 👻</a>
  836. </td>
  837. </tr>
  838. </table>
  839. <span class="${CLASS.footerSpan}">
  840. <a href="https://greasyfork.org/zh-CN/scripts/444056-play-with-mpv" target="_blank" class="${CLASS.footerA}" data-tip="版本升级"> 🆕 </a>
  841. <a href="https://github.com/LuckyPuppy514/Play-With-MPV" target="_blank" class="${CLASS.footerA}" data-tip="项目源码"> © 2023 LuckyPuppy514 </a>
  842. <a href="https://github.com/LuckyPuppy514/Play-With-MPV/issues/new" target="_blank" class="${CLASS.footerA}" data-tip="问题反馈"> 👻 </a>
  843. </span>
  844. </div>
  845.  
  846. <div id="${ID.settingDiv}">
  847. <span class="${CLASS.titleSpan}">Play-With-MPV<button class="${CLASS.closeButton}">X</button></span>
  848. <button id="${ID.customplayerSettingButton}" class="${CLASS.button}" data-tip="设置自定义播放器"></button>
  849. <table id="${ID.settingTable}">
  850. <tr>
  851. <td class="${CLASS.titleTd}" data-tip="选择 mpv 以外播放器时,部分功能无效">播放软件</td>
  852. <td colspan="8">
  853. <div class="tabs">
  854. <label class="tab">
  855. <input type="radio" name="${ID.playerRadio}" value="${PLAYER.mpv.name}" class="tab-input">
  856. <div class="tab-box">mpv</div>
  857. </label>
  858. <label class="tab">
  859. <input type="radio" name="${ID.playerRadio}" value="${PLAYER.potplayer.name}" class="tab-input">
  860. <div class="tab-box">potplayer</div>
  861. </label>
  862. <label class="tab">
  863. <input type="radio" name="${ID.playerRadio}" value="${PLAYER.customplayer.name}" class="tab-input">
  864. <div class="tab-box">自定义</div>
  865. </label>
  866. </div>
  867. </td>
  868. </tr>
  869. <tr>
  870. <td class="${CLASS.titleTd}" data-tip="mpv.exe 或 PotPlayerMini64.exe 的完整路径">软件路径</td>
  871. <td colspan="8">
  872. <div>
  873. <input id="${ID.softwarePathInput}" type=text placeholder="请输入软件路径,例如:D://mpvnet//mpvnet.exe">
  874. </div>
  875. </td>
  876. </tr>
  877. <tr>
  878. <td class="${CLASS.titleTd}" data-tip="旁路由网关实现代理一般不需要设置">代理设置</td>
  879. <td colspan="8">
  880. <div>
  881. <input id="${ID.proxyInput}" type=text placeholder="请输入代理地址,例如:http://127.0.0.1:10809">
  882. </div>
  883. </td>
  884. </tr>
  885. <tr>
  886. <td class="${CLASS.titleTd}" data-tip="仅适用于B站或使用 yt-dlp 解析的网站,例如:油管,OK,TVer 等">最高画质</td>
  887. <td colspan="8">
  888. <div class="tabs">
  889. <label class="tab">
  890. <input type="radio" name="${ID.bestQualityRadio}" value="unlimited" class="tab-input">
  891. <div class="tab-box" name="${ID.bestQualityRadio}">无限制</div>
  892. </label>
  893. <label class="tab">
  894. <input type="radio" name="${ID.bestQualityRadio}" value="2160p" class="tab-input">
  895. <div class="tab-box" name="${ID.bestQualityRadio}">2160p</div>
  896. </label>
  897. <label class="tab">
  898. <input type="radio" name="${ID.bestQualityRadio}" value="1440p" class="tab-input">
  899. <div class="tab-box" name="${ID.bestQualityRadio}">1440p</div>
  900. </label>
  901. <label class="tab">
  902. <input type="radio" name="${ID.bestQualityRadio}" value="1080p" class="tab-input">
  903. <div class="tab-box" name="${ID.bestQualityRadio}">1080p</div>
  904. </label>
  905. <label class="tab">
  906. <input type="radio" name="${ID.bestQualityRadio}" value="720p" class="tab-input">
  907. <div class="tab-box" name="${ID.bestQualityRadio}">720p</div>
  908. </label>
  909. </div>
  910. </td>
  911. </tr>
  912. <tr>
  913. <td class="${CLASS.titleTd}" data-tip="仅适用于B站">视频编码</td>
  914. <td colspan="8">
  915. <div class="tabs">
  916. <label class="tab">
  917. <input type="radio" name="${ID.bilibiliCodecsRadio}" value="12" class="tab-input">
  918. <div class="tab-box" name="${ID.bilibiliCodecsRadio}">HEVC</div>
  919. </label>
  920. <label class="tab">
  921. <input type="radio" name="${ID.bilibiliCodecsRadio}" value="13" class="tab-input">
  922. <div class="tab-box" name="${ID.bilibiliCodecsRadio}">AV1</div>
  923. </label>
  924. <label class="tab">
  925. <input type="radio" name="${ID.bilibiliCodecsRadio}" value="7" class="tab-input">
  926. <div class="tab-box" name="${ID.bilibiliCodecsRadio}">AVC</div>
  927. </label>
  928. </div>
  929. </td>
  930. </tr>
  931. <tr>
  932. <td class="${CLASS.titleTd}" data-tip="仅适用于B站">首选字幕</td>
  933. <td colspan="8">
  934. <div class="tabs">
  935. <label class="tab">
  936. <input type="radio" name="${ID.subtitlePreferRadio}" value="zh-Hans" class="tab-input">
  937. <div class="tab-box" name="${ID.subtitlePreferRadio}">简体</div>
  938. </label>
  939. <label class="tab">
  940. <input type="radio" name="${ID.subtitlePreferRadio}" value="zh-Hant" class="tab-input">
  941. <div class="tab-box" name="${ID.subtitlePreferRadio}">繁体</div>
  942. </label>
  943. <label class="tab">
  944. <input type="radio" name="${ID.subtitlePreferRadio}" value="en-US" class="tab-input"=>
  945. <div class="tab-box" name="${ID.subtitlePreferRadio}">英语</div>
  946. </label>
  947. <label class="tab">
  948. <input type="radio" name="${ID.subtitlePreferRadio}" value="off" class="tab-input"=>
  949. <div class="tab-box" name="${ID.subtitlePreferRadio}">关闭</div>
  950. </label>
  951. </div>
  952. </td>
  953. </tr>
  954. <tr>
  955. <td class="${CLASS.titleTd}" data-tip="解析成功自动播放">自动播放</td>
  956. <td colspan="2">
  957. <div>
  958. <label class="${CLASS.switchLabel}">
  959. <input type="checkbox" id="${ID.playAutoInput}">
  960. <span class="${CLASS.sliderSpan} ${CLASS.roundSpan}"></span>
  961. </label>
  962. </div>
  963. </td>
  964. <td class="${CLASS.titleTd}" data-tip="播放时自动关闭页面(和自动播放一起开启时修改配置请前往导航页)">自动关闭</td>
  965. <td colspan="2">
  966. <div>
  967. <label class="${CLASS.switchLabel}">
  968. <input type="checkbox" id="${ID.closeAutoInput}">
  969. <span class="${CLASS.sliderSpan} ${CLASS.roundSpan}"></span>
  970. </label>
  971. </div>
  972. </td>
  973. <td class="${CLASS.titleTd}" data-tip="同步网页播放时间">同步时间</td>
  974. <td colspan="2">
  975. <div>
  976. <label class="${CLASS.switchLabel}">
  977. <input type="checkbox" id="${ID.syncStartTimeInput}">
  978. <span class="${CLASS.sliderSpan} ${CLASS.roundSpan}" id="${ID.syncStartTimeSpan}"></span>
  979. </label>
  980. </div>
  981. </td>
  982. </tr>
  983. <tr>
  984. <td colspan="9">
  985. <button id="${ID.saveButton}">保存设置</button>
  986. <button id="${ID.downloadButton}">下载注册表</button>
  987. <button id="${ID.deleteButton}">删除注册表</button>
  988. </td>
  989. </tr>
  990. </table>
  991. <table id="${ID.customplayerSettingTable}">
  992. <tr>
  993. <td class="${CLASS.titleTd}" data-tip="必填(视频格式:yt-dlp / m3u8 / flv / m4s / mp4 / mkv ... 播放器不支持则无法播放对应格式视频)">视频参数</td>
  994. <td colspan="8">
  995. <div>
  996. <input id="${ID.videoUrlParamInput}" type=text placeholder='请输入视频参数,例如:mpv://"$\{videoUrl\}"'>
  997. </div>
  998. </td>
  999. </tr>
  1000. <tr>
  1001. <td class="${CLASS.titleTd}" data-tip="选填(为空则不支持最高画质和视频编码)">音频参数</td>
  1002. <td colspan="8">
  1003. <div>
  1004. <input id="${ID.audioUrlParamInput}" type=text placeholder='请输入音频参数,例如: --audio-file="$\{audioUrl\}"'>
  1005. </div>
  1006. </td>
  1007. </tr>
  1008. <tr>
  1009. <td class="${CLASS.titleTd}" data-tip="选填(为空则无法加载B站外挂字幕)">字幕参数</td>
  1010. <td colspan="8">
  1011. <div>
  1012. <input id="${ID.subtitleUrlParamInput}" type=text placeholder='请输入字幕参数,例如: --sub-file="$\{subtitleUrl\}"'>
  1013. </div>
  1014. </td>
  1015. </tr>
  1016. <tr>
  1017. <td class="${CLASS.titleTd}" data-tip="选填(为空则无法传递标题)">标题参数</td>
  1018. <td colspan="8">
  1019. <div>
  1020. <input id="${ID.titleParamInput}" type=text placeholder='请输入标题参数,例如: --force-media-title="$\{title\}"'>
  1021. </div>
  1022. </td>
  1023. </tr>
  1024. <tr>
  1025. <td class="${CLASS.titleTd}" data-tip="选填(为空则不支持同步时间)">时间参数</td>
  1026. <td colspan="8">
  1027. <div>
  1028. <input id="${ID.startTimeParamInput}" type=text placeholder='请输入时间参数,例如: --start=$\{startTime\}'>
  1029. </div>
  1030. </td>
  1031. </tr>
  1032. <tr>
  1033. <td class="${CLASS.titleTd}" data-tip="选填(为空则不支持代理设置)">代理参数</td>
  1034. <td colspan="8">
  1035. <div>
  1036. <input id="${ID.proxyParamInput}" type=text placeholder='请输入代理参数,例如: --http-proxy=$\{proxy\} --ytdl-raw-options=proxy=[$\{proxy\}]'>
  1037. </div>
  1038. </td>
  1039. </tr>
  1040. <tr>
  1041. <td class="${CLASS.titleTd}" data-tip="选填(为空则无法观看B站和橘子动漫)">referer</td>
  1042. <td colspan="8">
  1043. <div>
  1044. <input id="${ID.refererParamInput}" type=text placeholder='请输入 referer,例如: --http-header-fields="referer: $\{referer\}"'>
  1045. </div>
  1046. </td>
  1047. </tr>
  1048. <tr>
  1049. <td class="${CLASS.titleTd}" data-tip="选填(为空则无法观看巴哈姆特)">origin</td>
  1050. <td colspan="8">
  1051. <div>
  1052. <input id="${ID.originParamInput}" type=text placeholder='请输入 origin,例如: --http-header-fields="origin: $\{origin\}" '>
  1053. </div>
  1054. </td>
  1055. </tr>
  1056. </table>
  1057. <span class="${CLASS.footerSpan}">
  1058. <a href="https://greasyfork.org/zh-CN/scripts/444056-play-with-mpv" target="_blank" class="${CLASS.footerA}" data-tip="版本升级"> 🆕 </a>
  1059. <a href="https://github.com/LuckyPuppy514/Play-With-MPV" target="_blank" class="${CLASS.footerA}" data-tip="项目源码"> © 2023 LuckyPuppy514 </a>
  1060. <a href="https://github.com/LuckyPuppy514/Play-With-MPV/issues/new" target="_blank" class="${CLASS.footerA}" data-tip="问题反馈"> 👻 </a>
  1061. </span>
  1062. </div>
  1063. `;
  1064. const REG = `Windows Registry Editor Version 5.00
  1065. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Google\\Chrome]
  1066. "ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001
  1067.  
  1068. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge]
  1069. "ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001
  1070.  
  1071. [HKEY_CLASSES_ROOT\\\${PLAYER_NAME}]
  1072. @="\${PLAYER_NAME} Protocol"
  1073. "URL Protocol"=""
  1074.  
  1075. [HKEY_CLASSES_ROOT\\\${PLAYER_NAME}\\DefaultIcon]
  1076. @=""
  1077.  
  1078. [HKEY_CLASSES_ROOT\\\${PLAYER_NAME}\\shell]
  1079. @=""
  1080.  
  1081. [HKEY_CLASSES_ROOT\\\${PLAYER_NAME}\\shell\\open]
  1082. @=""
  1083.  
  1084. [HKEY_CLASSES_ROOT\\\${PLAYER_NAME}\\shell\\open\\command]
  1085. @="C:\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe -WindowStyle Hidden -Command \\"& {Add-Type -AssemblyName System.Web;$PARAMS=([System.Web.HTTPUtility]::UrlDecode('%1') -replace '^\${PLAYER_NAME}://'); Start-Process -FilePath \\\\\\\"\${SOFTWARE_PATH}\\\\\\\" -ArgumentList $PARAMS}\\""
  1086. `;
  1087. const REG_DELETE = `Windows Registry Editor Version 5.00
  1088. [-HKEY_CLASSES_ROOT\\\${PLAYER_NAME}]
  1089. `;
  1090.  
  1091. function appendCSS() {
  1092. let css = document.createElement("style");
  1093. css.innerHTML = CSS.trim();
  1094. document.head.appendChild(css);
  1095. }
  1096.  
  1097. function appendHTML() {
  1098. let div = document.createElement("div");
  1099. div.innerHTML = HTML.trim();
  1100. document.body.appendChild(div);
  1101. }
  1102.  
  1103. function loading(visiable) {
  1104. let loadingDiv = document.getElementById(ID.loadingDiv);
  1105. if (visiable) {
  1106. loadingDiv.style.display = "flex";
  1107. setTimeout(() => {
  1108. if (loadingDiv.style.display == "flex") {
  1109. document.getElementById(ID.loadingDiv).style.display = "none";
  1110. toast("超时辣 ...... 😓", TOAST_TYPE.error);
  1111. }
  1112. }, TIME.out);
  1113. } else {
  1114. loadingDiv.style.display = "none";
  1115. }
  1116. }
  1117.  
  1118. function toast(message, type, duration) {
  1119. type = type ? type : TOAST_TYPE.info;
  1120. duration = isNaN(duration) ? TIME.toast : duration;
  1121. let toastDiv = document.getElementById(ID.toastDiv);
  1122. toastDiv.innerHTML = message;
  1123. toastDiv.style.display = "block";
  1124. if (type == TOAST_TYPE.info) {
  1125. toastDiv.style.backgroundColor = "rgba(75, 180 ,54, 1)";
  1126. } else if (type == TOAST_TYPE.warn) {
  1127. toastDiv.style.backgroundColor = "rgba(190, 190, 70, 1)";
  1128. } else if (type == TOAST_TYPE.error) {
  1129. toastDiv.style.backgroundColor = "rgba(210, 51, 35, 1)";
  1130. }
  1131. setTimeout(() => {
  1132. toastDiv.style.display = "none";
  1133. }, duration);
  1134. }
  1135.  
  1136. function playButtonClick(player) {
  1137. if (playDisabled) {
  1138. return;
  1139. }
  1140. if (currentConfig.player != player) {
  1141. let playAuto = currentConfig.playAuto;
  1142. currentConfig.player = player;
  1143. currentConfig.playAuto = 1;
  1144. GM_setValue(KEY.config, currentConfig);
  1145. setTimeout(() => {
  1146. currentConfig.playAuto = playAuto;
  1147. GM_setValue(KEY.config, currentConfig);
  1148. }, TIME.pauseInterval);
  1149. init();
  1150. return;
  1151. }
  1152. if (
  1153. currentConfig.player == PLAYER.mpv.name ||
  1154. currentConfig.player == PLAYER.potplayer.name
  1155. ) {
  1156. let message = undefined;
  1157. if (!currentConfig[currentConfig.player].path) {
  1158. message = "请先进行设置";
  1159. } else if (!currentConfig[currentConfig.player].regVersion) {
  1160. message = "请先下载注册表";
  1161. } else if (
  1162. currentConfig[currentConfig.player].regVersion !=
  1163. DEFAULT_CONFIG[currentConfig.player].regVersion
  1164. ) {
  1165. message = "注册表有更新,请重新下载注册表";
  1166. }
  1167. if (message) {
  1168. toast(message, TOAST_TYPE.warn);
  1169. settingDiv.style.display = "none";
  1170. settingButton.click();
  1171. return;
  1172. }
  1173. }
  1174. loading(true);
  1175. try {
  1176. playLimit();
  1177. handler.play();
  1178. if (
  1179. currentConfig.closeAuto == 1 &&
  1180. page.url !== "https://www.lckp.top/play-with-mpv/index.html"
  1181. ) {
  1182. setTimeout(() => {
  1183. if (history.length === 1) {
  1184. window.location.href = "about:blank";
  1185. window.top.close();
  1186. } else {
  1187. history.back();
  1188. }
  1189. }, 1000);
  1190. } else {
  1191. handler.pause();
  1192. }
  1193. } catch (error) {
  1194. toast("出错辣 ...... 😓", TOAST_TYPE.error);
  1195. console.log(error);
  1196. }
  1197. loading(false);
  1198. }
  1199. // 限制播放按钮点击频率
  1200. var playDisabled = false;
  1201.  
  1202. function playLimit() {
  1203. playDisabled = true;
  1204. setTimeout(() => {
  1205. playDisabled = false;
  1206. }, TIME.pauseInterval);
  1207. }
  1208. //拖动状态
  1209. let isDragging = false;
  1210. //设置悬浮窗位置
  1211. function setPosOffset(xOffset, yOffset, el) {
  1212. el.style.left = xOffset + "px";
  1213. el.style.bottom = yOffset + "px";
  1214. }
  1215.  
  1216. function addListener() {
  1217. let buttonDiv = document.getElementById(ID.buttonDiv);
  1218. let mpvPlayButton = document.getElementById(ID.mpvPlayButton);
  1219. let potplayerPlayButton = document.getElementById(ID.potplayerPlayButton);
  1220. let customplayerPlayButton = document.getElementById(
  1221. ID.customplayerPlayButton
  1222. );
  1223. let settingButton = document.getElementById(ID.settingButton);
  1224. let settingDiv = document.getElementById(ID.settingDiv);
  1225. let settingTable = document.getElementById(ID.settingTable);
  1226. let softwarePathInput = document.getElementById(ID.softwarePathInput);
  1227. let proxyInput = document.getElementById(ID.proxyInput);
  1228. let playAutoInput = document.getElementById(ID.playAutoInput);
  1229. let closeAutoInput = document.getElementById(ID.closeAutoInput);
  1230. let syncStartTimeInput = document.getElementById(ID.syncStartTimeInput);
  1231. let syncStartTimeSpan = document.getElementById(ID.syncStartTimeSpan);
  1232. let downloadButton = document.getElementById(ID.downloadButton);
  1233. let deleteButton = document.getElementById(ID.deleteButton);
  1234. let saveButton = document.getElementById(ID.saveButton);
  1235. let closeButtons = document.getElementsByClassName(CLASS.closeButton);
  1236. let infoButton = document.getElementById(ID.infoButton);
  1237. let infoDiv = document.getElementById(ID.infoDiv);
  1238. let customplayerSettingTable = document.getElementById(
  1239. ID.customplayerSettingTable
  1240. );
  1241. let customplayerSettingButton = document.getElementById(
  1242. ID.customplayerSettingButton
  1243. );
  1244. let videoUrlParamInput = document.getElementById(ID.videoUrlParamInput);
  1245. let audioUrlParamInput = document.getElementById(ID.audioUrlParamInput);
  1246. let subtitleUrlParamInput = document.getElementById(
  1247. ID.subtitleUrlParamInput
  1248. );
  1249. let titleParamInput = document.getElementById(ID.titleParamInput);
  1250. let startTimeParamInput = document.getElementById(ID.startTimeParamInput);
  1251. let proxyParamInput = document.getElementById(ID.proxyParamInput);
  1252. let refererParamInput = document.getElementById(ID.refererParamInput);
  1253. let originParamInput = document.getElementById(ID.originParamInput);
  1254. let infoInputs = document.getElementsByClassName(CLASS.infoInput);
  1255. switchStatus(downloadButton, false);
  1256.  
  1257. //处理窗口拖动事件
  1258. let currentX, currentY;
  1259. let initialX, initialY;
  1260. let lastXOffset, lastYOffset;
  1261.  
  1262. // 在dragStart中存储初始的偏移量
  1263. let dragStart = (e) => {
  1264. initialX = e.offsetX;
  1265. initialY = e.offsetY;
  1266.  
  1267. lastXOffset = e.clientX - e.offsetX;
  1268. lastYOffset = e.clientY - e.offsetY;
  1269. isDragging = true;
  1270. // 拖动过程中不隐藏面板
  1271. showPanelForDuration();
  1272. console.log("开始拖动");
  1273. };
  1274.  
  1275. let dragEnd = (e) => {
  1276. currentX = e.clientX - initialX;
  1277. currentY = e.clientY - initialY;
  1278.  
  1279. // 计算相对上一次偏移量的变化值
  1280. let xOffset = currentX - lastXOffset;
  1281. let yOffset = currentY - lastYOffset;
  1282.  
  1283. // 根据变化值更新配置
  1284. currentConfig.transform.xOffset += xOffset;
  1285. currentConfig.transform.yOffset -= yOffset;
  1286.  
  1287. setPosOffset(
  1288. currentConfig.transform.xOffset,
  1289. currentConfig.transform.yOffset,
  1290. buttonDiv
  1291. );
  1292. GM_setValue(KEY.config, currentConfig);
  1293. console.log(
  1294. "存储偏移量:xOffset " +
  1295. currentConfig.transform.xOffset +
  1296. " yOffset " +
  1297. currentConfig.transform.yOffset
  1298. );
  1299.  
  1300. isDragging = false;
  1301. };
  1302. //修改拖动过程中的光标为可放置的样式,但可能会破坏原有的交互
  1303. //document.addEventListener('dragover', (event) => {
  1304. // event.preventDefault();
  1305. //});
  1306. buttonDiv.addEventListener("dragstart", dragStart);
  1307. buttonDiv.addEventListener("dragend", dragEnd);
  1308.  
  1309. // 播放按钮
  1310. mpvPlayButton.onclick = function () {
  1311. playButtonClick(PLAYER.mpv.name);
  1312. };
  1313. potplayerPlayButton.onclick = function () {
  1314. playButtonClick(PLAYER.potplayer.name);
  1315. };
  1316. customplayerPlayButton.onclick = function () {
  1317. playButtonClick(PLAYER.customplayer.name);
  1318. };
  1319. // 播放快捷键 CTRL + P
  1320. window.onkeydown = async function () {
  1321. if (event.ctrlKey && event.keyCode === 80 && !event.shiftKey) {
  1322. event.preventDefault();
  1323. playButtonClick(currentConfig.player);
  1324. }
  1325. };
  1326. // 设置按钮
  1327. settingButton.onclick = function () {
  1328. let display = settingDiv.style.display;
  1329. if (display == "flex") {
  1330. settingDiv.style.display = "none";
  1331. } else {
  1332. infoDiv.style.display = "none";
  1333. settingDiv.style.display = "flex";
  1334. // 加载配置
  1335. softwarePathInput.value = currentConfig[currentConfig.player].path;
  1336. proxyInput.value = currentConfig.proxy;
  1337. $(
  1338. `input:radio[name="${ID.bestQualityRadio}"][value="${currentConfig.bestQuality}"]`
  1339. ).prop("checked", true);
  1340. $(
  1341. `input:radio[name="${ID.bilibiliCodecsRadio}"][value="${currentConfig.bilibiliCodecs}"]`
  1342. ).prop("checked", true);
  1343. $(
  1344. `input:radio[name="${ID.playerRadio}"][value="${currentConfig.player}"]`
  1345. ).prop("checked", true);
  1346. playAutoInput.checked = currentConfig.playAuto == 1 ? true : false;
  1347. closeAutoInput.checked =
  1348. currentConfig.closeAuto == 1 ? true : false;
  1349. syncStartTimeInput.checked =
  1350. currentConfig.syncStartTime == 1 ? true : false;
  1351. $(
  1352. `input:radio[name="${ID.subtitlePreferRadio}"][value="${currentConfig.subtitlePrefer}"]`
  1353. ).prop("checked", true);
  1354. switchPlayer(
  1355. $(`input:radio[name="${ID.playerRadio}"]:checked`).val()
  1356. );
  1357. }
  1358. };
  1359. // 播放器选择框
  1360. $(`input:radio[name="${ID.playerRadio}"]`).change(function () {
  1361. switchPlayer(this.value);
  1362. });
  1363. // 保存按钮
  1364. saveButton.onclick = function () {
  1365. let playerChecked = $(
  1366. `input:radio[name="${ID.playerRadio}"]:checked`
  1367. ).val();
  1368. if (
  1369. playerChecked == PLAYER.mpv.name ||
  1370. playerChecked == PLAYER.potplayer.name
  1371. ) {
  1372. let oldSoftwarePath = currentConfig[playerChecked].path;
  1373. let newSoftwarePath = softwarePathInput.value;
  1374. if (newSoftwarePath) {
  1375. if (/.*[\u4e00-\u9fa5]+.*/g.test(newSoftwarePath)) {
  1376. toast("软件路径不能包含中文", TOAST_TYPE.error);
  1377. return;
  1378. }
  1379. newSoftwarePath = newSoftwarePath.replace(/[\\|/]+/g, "//");
  1380. if (
  1381. !newSoftwarePath.endsWith(".com") &&
  1382. !newSoftwarePath.endsWith(".exe")
  1383. ) {
  1384. if (!newSoftwarePath.endsWith("//")) {
  1385. newSoftwarePath = newSoftwarePath + "//";
  1386. }
  1387. if (playerChecked == PLAYER.mpv.name) {
  1388. if (
  1389. newSoftwarePath.toLowerCase().indexOf("mpvnet") !=
  1390. -1 ||
  1391. newSoftwarePath.toLowerCase().indexOf("mpv.net") !=
  1392. -1
  1393. ) {
  1394. newSoftwarePath = newSoftwarePath + "mpvnet.exe";
  1395. } else {
  1396. newSoftwarePath = newSoftwarePath + "mpv.exe";
  1397. }
  1398. } else if (playerChecked == PLAYER.potplayer.name) {
  1399. newSoftwarePath =
  1400. newSoftwarePath + "PotPlayerMini64.exe";
  1401. }
  1402. }
  1403. }
  1404. softwarePathInput.value = newSoftwarePath;
  1405. currentConfig[playerChecked].path = newSoftwarePath;
  1406. switchStatus(
  1407. downloadButton,
  1408. softwarePathInput.value ? true : false
  1409. );
  1410. if (oldSoftwarePath != newSoftwarePath) {
  1411. currentConfig[playerChecked].regVersion = "00000000";
  1412. }
  1413. }
  1414. currentConfig.proxy = proxyInput.value;
  1415. currentConfig.bestQuality = $(
  1416. `input:radio[name="${ID.bestQualityRadio}"]:checked`
  1417. ).val();
  1418. currentConfig.bilibiliCodecs = $(
  1419. `input:radio[name="${ID.bilibiliCodecsRadio}"]:checked`
  1420. ).val();
  1421. currentConfig.player = playerChecked;
  1422. currentConfig.subtitlePrefer = $(
  1423. `input:radio[name="${ID.subtitlePreferRadio}"]:checked`
  1424. ).val();
  1425. currentConfig.playAuto = playAutoInput.checked ? 1 : 0;
  1426. currentConfig.closeAuto = closeAutoInput.checked ? 1 : 0;
  1427. currentConfig.syncStartTime = syncStartTimeInput.checked ? 1 : 0;
  1428. updatePlayButtonVisibility(currentConfig);
  1429. GM_setValue(KEY.config, currentConfig);
  1430. if (playAutoInput.checked && closeAutoInput.checked) {
  1431. toast("保存成功,如需修改配置请前往导航页");
  1432. } else {
  1433. toast("保存成功");
  1434. }
  1435. if (currentConfig.playAuto == 1) {
  1436. playLimit();
  1437. }
  1438. if (
  1439. document.getElementById("iptv") &&
  1440. localStorage.category == "iptv"
  1441. ) {
  1442. localStorage.player = JSON.stringify(PLAYER[currentConfig.player]);
  1443. document.getElementById("iptv").click();
  1444. }
  1445. init();
  1446. };
  1447. // 下载按钮
  1448. downloadButton.onclick = function () {
  1449. let playerChecked = $(
  1450. `input:radio[name="${ID.playerRadio}"]:checked`
  1451. ).val();
  1452. currentConfig[playerChecked].regVersion =
  1453. DEFAULT_CONFIG[playerChecked].regVersion;
  1454. GM_setValue(KEY.config, currentConfig);
  1455. let reg = REG.replace(
  1456. "${SOFTWARE_PATH}",
  1457. currentConfig[playerChecked].path
  1458. );
  1459. reg = reg.replace(/\$\{PLAYER_NAME\}/g, playerChecked);
  1460. let a = document.createElement("a");
  1461. let blob = new Blob([reg], {
  1462. type: "application/octet-stream"
  1463. });
  1464. a.href = window.URL.createObjectURL(blob);
  1465. a.download = `${playerChecked}-install.reg`;
  1466. a.click();
  1467. };
  1468. deleteButton.onclick = function () {
  1469. let playerChecked = $(
  1470. `input:radio[name="${ID.playerRadio}"]:checked`
  1471. ).val();
  1472. currentConfig[playerChecked].regVersion = "00000000";
  1473. GM_setValue(KEY.config, currentConfig);
  1474. let reg = REG_DELETE.replace(/\$\{PLAYER_NAME\}/g, playerChecked);
  1475. let a = document.createElement("a");
  1476. let blob = new Blob([reg], {
  1477. type: "application/octet-stream"
  1478. });
  1479. a.href = window.URL.createObjectURL(blob);
  1480. a.download = `${playerChecked}-delete.reg`;
  1481. a.click();
  1482. };
  1483. // 关闭按钮
  1484. for (let closeButton of closeButtons) {
  1485. closeButton.onclick = function () {
  1486. settingDiv.style.display = "none";
  1487. infoDiv.style.display = "none";
  1488. };
  1489. }
  1490. // 信息按钮
  1491. infoButton.onclick = function () {
  1492. let display = infoDiv.style.display;
  1493. if (display == "flex") {
  1494. infoDiv.style.display = "none";
  1495. } else {
  1496. settingDiv.style.display = "none";
  1497. infoDiv.style.display = "flex";
  1498. let title = handler.media.title;
  1499. infoInputs[0].value = title ? title : document.title;
  1500. infoInputs[1].value = handler.media.videoUrl;
  1501. infoInputs[2].value = handler.media.audioUrl;
  1502. infoInputs[3].value = handler.media.subtitleUrl;
  1503. infoInputs[4].value = handler.media.referer;
  1504. infoInputs[5].value = handler.media.origin;
  1505. for (const infoInput of infoInputs) {
  1506. if (infoInput.value) {
  1507. infoInput.style.cursor = "pointer";
  1508. infoInput.onclick = function () {
  1509. this.select();
  1510. navigator.clipboard.writeText(this.value);
  1511. toast("已复制到剪贴板");
  1512. };
  1513. }
  1514. }
  1515. }
  1516. };
  1517. let bestQualityRadios = document.getElementsByName(ID.bestQualityRadio);
  1518. let bilibiliCodecsRadios = document.getElementsByName(
  1519. ID.bilibiliCodecsRadio
  1520. );
  1521. let subtitlePreferRadios = document.getElementsByName(
  1522. ID.subtitlePreferRadio
  1523. );
  1524. // 切换播放器
  1525. function switchPlayer(player) {
  1526. player = PLAYER[player];
  1527. // mpv 和 potplayer 专属
  1528. if (
  1529. player.name == PLAYER.mpv.name ||
  1530. player.name == PLAYER.potplayer.name
  1531. ) {
  1532. switchStatus(softwarePathInput, true);
  1533. softwarePathInput.value = currentConfig[player.name].path;
  1534. if (softwarePathInput.value) {
  1535. switchStatus(downloadButton, true);
  1536. } else {
  1537. switchStatus(downloadButton, false);
  1538. }
  1539. } else {
  1540. switchStatus(softwarePathInput, false);
  1541. switchStatus(downloadButton, false);
  1542. }
  1543. // 代理
  1544. let flag = player.params.proxy ? true : false;
  1545. switchStatus(proxyInput, flag);
  1546. // 音频
  1547. flag = player.params.audioUrl ? true : false;
  1548. for (const radio of bestQualityRadios) {
  1549. switchStatus(radio, flag);
  1550. }
  1551. for (const radio of bilibiliCodecsRadios) {
  1552. switchStatus(radio, flag);
  1553. }
  1554. // 字幕
  1555. flag = player.params.subtitleUrl ? true : false;
  1556. for (const radio of subtitlePreferRadios) {
  1557. switchStatus(radio, flag);
  1558. }
  1559. // 时间
  1560. flag = player.params.startTime ? true : false;
  1561. switchStatus(syncStartTimeSpan, flag);
  1562. switchStatus(syncStartTimeInput, flag);
  1563. }
  1564. // 全屏
  1565. document.addEventListener("fullscreenchange", () => {
  1566. if (document.fullscreenElement) {
  1567. page.isFullScreen = true;
  1568. buttonDiv.style.display = "none";
  1569. } else {
  1570. page.isFullScreen = false;
  1571. if (handler.media.videoUrl) {
  1572. buttonDiv.style.display = "flex";
  1573. }
  1574. }
  1575. });
  1576. // 自定义播放器按钮
  1577. customplayerSettingButton.onclick = function () {
  1578. if (customplayerSettingTable.style.display == "flex") {
  1579. currentConfig.customplayer.params.videoUrl =
  1580. videoUrlParamInput.value;
  1581. currentConfig.customplayer.params.audioUrl =
  1582. audioUrlParamInput.value;
  1583. currentConfig.customplayer.params.subtitleUrl =
  1584. subtitleUrlParamInput.value;
  1585. currentConfig.customplayer.params.title = titleParamInput.value;
  1586. currentConfig.customplayer.params.startTime =
  1587. startTimeParamInput.value;
  1588. currentConfig.customplayer.params.proxy = proxyParamInput.value;
  1589. currentConfig.customplayer.params.referer = refererParamInput.value;
  1590. currentConfig.customplayer.params.origin = originParamInput.value;
  1591. PLAYER.customplayer = currentConfig.customplayer;
  1592. GM_setValue(KEY.config, currentConfig);
  1593. switchPlayer(
  1594. $(`input:radio[name="${ID.playerRadio}"]:checked`).val()
  1595. );
  1596. settingTable.style.display = "flex";
  1597. customplayerSettingTable.style.display = "none";
  1598. customplayerSettingButton.style.backgroundImage =
  1599. ICON_BASE64.customplayer;
  1600. customplayerSettingButton.dataset.tip = "设置自定义播放器";
  1601. } else {
  1602. videoUrlParamInput.value =
  1603. currentConfig.customplayer.params.videoUrl;
  1604. audioUrlParamInput.value =
  1605. currentConfig.customplayer.params.audioUrl;
  1606. subtitleUrlParamInput.value =
  1607. currentConfig.customplayer.params.subtitleUrl;
  1608. titleParamInput.value = currentConfig.customplayer.params.title;
  1609. startTimeParamInput.value =
  1610. currentConfig.customplayer.params.startTime;
  1611. proxyParamInput.value = currentConfig.customplayer.params.proxy;
  1612. refererParamInput.value = currentConfig.customplayer.params.referer;
  1613. originParamInput.value = currentConfig.customplayer.params.origin;
  1614. settingTable.style.display = "none";
  1615. customplayerSettingTable.style.display = "flex";
  1616. customplayerSettingButton.style.backgroundImage = ICON_BASE64.back;
  1617. customplayerSettingButton.dataset.tip = "保存并返回";
  1618. }
  1619. };
  1620. }
  1621. // 切换元素状态
  1622. function switchStatus(element, flag) {
  1623. if (flag) {
  1624. element.readOnly = false;
  1625. element.disabled = false;
  1626. element.classList.remove(CLASS.readOnly);
  1627. } else {
  1628. element.readOnly = true;
  1629. element.disabled = true;
  1630. element.classList.add(CLASS.readOnly);
  1631. }
  1632. }
  1633.  
  1634. function updatePlayButtonVisibility(currentConfig) {
  1635. let mpv_enabled = currentConfig.mpv.path;
  1636. let mpv_button = document.getElementById(ID.mpvPlayButton);
  1637. let potplayer_enabled = currentConfig.potplayer.path;
  1638. let potplayer_button = document.getElementById(ID.potplayerPlayButton);
  1639. let customplayer_enabled = currentConfig.customplayer.params.videoUrl;
  1640. let customplayerplay_button = document.getElementById(
  1641. ID.customplayerPlayButton
  1642. );
  1643. if (!mpv_enabled && !potplayer_enabled && !customplayer_enabled) {
  1644. mpv_button.style.display = "inline";
  1645. potplayer_button.style.display = "inline";
  1646. customplayerplay_button.style.display = "inline";
  1647. return;
  1648. }
  1649. mpv_button.style.display = mpv_enabled ? "inline" : "none";
  1650. potplayer_button.style.display = potplayer_enabled ? "inline" : "none";
  1651. customplayerplay_button.style.display = customplayer_enabled ?
  1652. "inline" :
  1653. "none";
  1654. }
  1655.  
  1656. function sleep(ms) {
  1657. return new Promise((resolve) => setTimeout(resolve, ms));
  1658. }
  1659. // 加载配置
  1660. function loadConfig() {
  1661. let oldConifg = GM_getValue(KEY.config);
  1662. currentConfig = JSON.parse(JSON.stringify(DEFAULT_CONFIG));
  1663. currentConfig.mpv.regVersion = "";
  1664. currentConfig.potplayer.regVersion = "";
  1665. if (!oldConifg) {
  1666. GM_setValue(KEY.config, currentConfig);
  1667. } else {
  1668. if (oldConifg.version != DEFAULT_CONFIG.version) {
  1669. for (const key in oldConifg) {
  1670. currentConfig[key] = oldConifg[key];
  1671. }
  1672. if (!currentConfig.mpv.path && currentConfig.mpvPath) {
  1673. currentConfig.mpv.path = currentConfig.mpvPath;
  1674. delete currentConfig["mpvPath"];
  1675. }
  1676. currentConfig.version = DEFAULT_CONFIG.version;
  1677. GM_setValue(KEY.config, currentConfig);
  1678. } else {
  1679. currentConfig = oldConifg;
  1680. GM_setValue(KEY.config, currentConfig);
  1681. }
  1682. }
  1683. PLAYER.customplayer = currentConfig.customplayer;
  1684. }
  1685.  
  1686. function showPanelForDuration() {
  1687. document.getElementById(ID.infoButton).style.visibility = "visible";
  1688. document.getElementById(ID.settingButton).style.visibility = "visible";
  1689. document.getElementById(ID.mpvPlayButton).style.visibility = "visible";
  1690. document.getElementById(ID.potplayerPlayButton).style.visibility =
  1691. "visible";
  1692. document.getElementById(ID.customplayerPlayButton).style.visibility =
  1693. "visible";
  1694. var hiddenInterval = setInterval(() => {
  1695. if (!isDragging) {
  1696. //拖动时不隐藏
  1697. clearInterval(hiddenInterval);
  1698. document.getElementById(ID.infoButton).style.visibility = "hidden";
  1699. document.getElementById(ID.settingButton).style.visibility =
  1700. "hidden";
  1701. document.getElementById(ID.mpvPlayButton).style.visibility =
  1702. "hidden";
  1703. document.getElementById(ID.potplayerPlayButton).style.visibility =
  1704. "hidden";
  1705. document.getElementById(
  1706. ID.customplayerPlayButton
  1707. ).style.visibility = "hidden";
  1708. }
  1709. }, TIME.showButton);
  1710. }
  1711. class Media {
  1712. constructor() {
  1713. this.title = "";
  1714. this.videoUrl = "";
  1715. this.audioUrl = "";
  1716. this.subtitleUrl = "";
  1717. this.startTime = "";
  1718. this.referer = "";
  1719. this.origin = "";
  1720. this.proxy = "";
  1721. this.other = "";
  1722. }
  1723. setTitle(title) {
  1724. this.title = title;
  1725. }
  1726. setVideoUrl(videoUrl) {
  1727. if (this.check(videoUrl)) {
  1728. this.videoUrl = videoUrl;
  1729. if (!this.title) {
  1730. this.setTitle(document.title);
  1731. }
  1732. let nxParserIframe = document.getElementById(ID.nxParserIframe);
  1733. if (nxParserIframe) {
  1734. document.body.removeChild(nxParserIframe);
  1735. }
  1736. if (document.getElementById(ID.buttonDiv)) {
  1737. document.getElementById(ID.buttonDiv).style.display = "flex";
  1738. if (
  1739. currentConfig.playAuto == 1 &&
  1740. page.url !== "https://www.lckp.top/play-with-mpv/index.html"
  1741. ) {
  1742. playButtonClick(currentConfig.player);
  1743. }
  1744. showPanelForDuration();
  1745. }
  1746. }
  1747. }
  1748. setAudioUrl(audioUrl) {
  1749. this.audioUrl = audioUrl;
  1750. }
  1751. setSubtitleUrl(subtitleUrl) {
  1752. this.subtitleUrl = subtitleUrl;
  1753. }
  1754. setStartTime(startTime) {
  1755. this.startTime = Math.floor(startTime);
  1756. }
  1757. setReferer(referer) {
  1758. this.referer = referer;
  1759. }
  1760. setOrigin(origin) {
  1761. this.origin = origin;
  1762. }
  1763. setProxy(proxy) {
  1764. this.proxy = proxy;
  1765. }
  1766. setOther(other) {
  1767. this.other = other;
  1768. }
  1769. // 检查视频链接是否有效
  1770. check(videoUrl) {
  1771. if (videoUrl && videoUrl.startsWith("http")) {
  1772. if (
  1773. videoUrl.match(/(\.m3u|\.m3u8)/g) &&
  1774. videoUrl != localStorage.iptvUrl
  1775. ) {
  1776. let m3u8 = "";
  1777. $.ajax({
  1778. type: "GET",
  1779. url: videoUrl,
  1780. async: false,
  1781. success: function (res) {
  1782. m3u8 = res;
  1783. },
  1784. });
  1785. if (m3u8 && m3u8.indexOf("png") != -1) {
  1786. console.log(
  1787. "Play-With-MPV:m3u8 链接无法播放:" + videoUrl
  1788. );
  1789. return false;
  1790. }
  1791. }
  1792. if (videoUrl.startsWith("https://www.mp4")) {
  1793. return false;
  1794. }
  1795. return true;
  1796. }
  1797. console.log(`Play-With-MPV:链接无效:${videoUrl}`);
  1798. return false;
  1799. }
  1800. }
  1801. class BaseHandler {
  1802. constructor() {
  1803. loadConfig();
  1804. this.media = new Media();
  1805. this.media.setProxy(currentConfig.proxy);
  1806. for (const key in PLAYER) {
  1807. if (PLAYER[key].name == currentConfig.player) {
  1808. this.player = PLAYER[key];
  1809. break;
  1810. }
  1811. }
  1812. if (window.self == window.top) {
  1813. if (!document.getElementById(ID.buttonDiv)) {
  1814. console.log(INFO);
  1815. appendCSS();
  1816. appendHTML();
  1817. updatePlayButtonVisibility(currentConfig);
  1818. console.log(
  1819. "加载偏移量:xOffset " +
  1820. currentConfig.transform.xOffset +
  1821. " yOffset " +
  1822. currentConfig.transform.yOffset
  1823. );
  1824. setPosOffset(
  1825. currentConfig.transform.xOffset,
  1826. currentConfig.transform.yOffset,
  1827. document.getElementById(ID.buttonDiv)
  1828. );
  1829. addListener();
  1830. }
  1831. document.getElementById(ID.buttonDiv).style.display = "none";
  1832. }
  1833. }
  1834. initCheck() {
  1835. return window.location.href != page.url;
  1836. }
  1837. async parse() {}
  1838. pause() {
  1839. let videos = document.getElementsByTagName("video");
  1840. if (videos && videos.length > 0) {
  1841. let i = 0;
  1842. while (i < TRY_TIME.maxPause) {
  1843. setTimeout(function () {
  1844. for (let video of videos) {
  1845. video.pause();
  1846. }
  1847. }, TIME.pauseInterval * i);
  1848. i++;
  1849. }
  1850. } else if (this.iframe) {
  1851. this.iframe.postMessage({
  1852. method: METHOD.pause
  1853. }, "*");
  1854. }
  1855. }
  1856. play() {
  1857. let link = "";
  1858. for (let key in this.player.params) {
  1859. if (key == "title") {
  1860. continue;
  1861. }
  1862. if (key == "startTime") {
  1863. if (currentConfig.syncStartTime != 1) {
  1864. continue;
  1865. } else {
  1866. let videos = document.getElementsByTagName("video");
  1867. for (let i = 0; i < videos.length; i++) {
  1868. if (videos[i].currentTime != 0) {
  1869. this.media.setStartTime(videos[i].currentTime);
  1870. break;
  1871. }
  1872. }
  1873. }
  1874. }
  1875. let value = this.media[key];
  1876. if (value) {
  1877. let param = this.player.params[key];
  1878. let matchKey = "${" + key + "}";
  1879. while (param.indexOf(matchKey) != -1) {
  1880. param = param.replace(matchKey, value);
  1881. }
  1882. matchKey = "${E" + key + "}";
  1883. while (param.indexOf(matchKey) != -1) {
  1884. param = param.replace(matchKey, encodeURIComponent(value));
  1885. }
  1886. matchKey = "${D" + key + "}";
  1887. while (param.indexOf(matchKey) != -1) {
  1888. param = param.replace(matchKey, decodeURIComponent(value));
  1889. }
  1890. link = link + param;
  1891. }
  1892. }
  1893. if (this.media.title) {
  1894. let maxLength = 1950 - link.length;
  1895. if (maxLength > 3) {
  1896. let title = this.media.title;
  1897. let encodeTitle = encodeURIComponent(title).substring(0, maxLength);
  1898. while(true) {
  1899. try {
  1900. decodeURIComponent(encodeTitle);
  1901. break;
  1902. } catch (error) {
  1903. encodeTitle = encodeTitle.substring(0, encodeTitle.lastIndexOf('%'));
  1904. }
  1905. }
  1906. encodeTitle = encodeTitle + '...';
  1907. let param = this.player.params.title;
  1908. param = param.replace("${title}", encodeTitle);
  1909. link = link + param;
  1910. }
  1911. }
  1912. window.open(link, "_self");
  1913. }
  1914. // 监听子页面事件
  1915. addIframeListener() {
  1916. let that = this;
  1917. window.addEventListener(
  1918. "message",
  1919. function (event) {
  1920. that.iframe = event.source;
  1921. if (event.data.method == METHOD.pause) {
  1922. that.pause();
  1923. } else if (event.data.method == METHOD.report) {
  1924. that.media.setStartTime(event.data.media.startTime);
  1925. if (!that.media.videoUrl) {
  1926. that.media.setVideoUrl(event.data.media.videoUrl);
  1927. }
  1928. }
  1929. },
  1930. false
  1931. );
  1932. }
  1933. // 监听顶层页面事件
  1934. addTopListener() {
  1935. let that = this;
  1936. window.addEventListener(
  1937. "message",
  1938. function (event) {
  1939. if (event.data.method == METHOD.pause) {
  1940. that.pause();
  1941. }
  1942. },
  1943. false
  1944. );
  1945. // 定时上报当前视频信息
  1946. setInterval(() => {
  1947. let video = document.getElementsByTagName("video")[0];
  1948. if (video) {
  1949. this.media.setStartTime(video.currentTime);
  1950. }
  1951. window.top.postMessage({
  1952. method: METHOD.report,
  1953. media: that.media
  1954. },
  1955. "*"
  1956. );
  1957. }, TIME.reportInterval);
  1958. }
  1959. // yt-dlp 支持网站解析器
  1960. ytDlpParser() {
  1961. return page.url;
  1962. }
  1963. // video 元素解析器
  1964. videoParser() {
  1965. let videos = document.getElementsByTagName("video");
  1966. for (let video of videos) {
  1967. let url = video.src;
  1968. if (url && url.startsWith("http")) {
  1969. return url;
  1970. }
  1971. }
  1972. }
  1973. // iframe 元素解析器
  1974. iframeParser() {
  1975. let iframes = document.getElementsByTagName("iframe");
  1976. for (let iframe of iframes) {
  1977. let urls = iframe.src.match(VIDEO_URL_REGEX);
  1978. if (urls && urls.length > 0) {
  1979. return urls[0];
  1980. }
  1981. }
  1982. }
  1983. // html 解析器
  1984. htmlParser() {
  1985. let urls = document.body.innerHTML.match(VIDEO_URL_REGEX);
  1986. if (urls && urls.length > 0) {
  1987. return urls[0];
  1988. }
  1989. }
  1990. // script 解析器
  1991. scriptParser() {
  1992. for (let script of document.scripts) {
  1993. let urls = script.innerHTML.match(VIDEO_URL_REGEX);
  1994. if (urls && urls.length > 0) {
  1995. return urls[0];
  1996. }
  1997. }
  1998. }
  1999. // url 解析器
  2000. urlParser() {
  2001. let urls = page.url.match(VIDEO_URL_REGEX);
  2002. if (urls && urls.length > 0) {
  2003. return urls[0];
  2004. }
  2005. }
  2006. // 诺讯解析
  2007. nxParser() {
  2008. handler.addIframeListener();
  2009. let nxParserIframe = document.getElementById(ID.nxParserIframe);
  2010. if (!nxParserIframe) {
  2011. nxParserIframe = document.createElement("iframe");
  2012. nxParserIframe.id = ID.nxParserIframe;
  2013. nxParserIframe.src = `https://yun.nxflv.com/?url=${page.url}`;
  2014. document.body.appendChild(nxParserIframe);
  2015. }
  2016. }
  2017. }
  2018. // 获取B站视频播放链接
  2019. async function getBilibiliPlayUrl(avid, cid) {
  2020. if (handler.player.name == PLAYER.mpv.name) {
  2021. if (currentConfig.mpv.path.endsWith("mpvnet.exe")) {
  2022. handler.media.setOther(`--script-opts="cid=${cid}"`);
  2023. } else {
  2024. handler.media.setOther(`--script-opts-append="cid=${cid}"`);
  2025. }
  2026. }
  2027. if (
  2028. !handler.player.params.audioUrl ||
  2029. (await getBilibiliVideoDash(avid, cid)) == -1
  2030. ) {
  2031. getBilibiliVideoDurl(avid, cid);
  2032. }
  2033. if (currentConfig.subtitlePrefer != "off") {
  2034. getBilibiliVideoSubtitle(avid, cid);
  2035. setInterval(() => {
  2036. getBilibiliVideoSubtitle(avid, cid);
  2037. }, 10 * 60 * 1000);
  2038. }
  2039. }
  2040. // 获取B站 DASH 格式视频
  2041. async function getBilibiliVideoDash(avid, cid) {
  2042. let result = 0;
  2043. await $.ajax({
  2044. type: "GET",
  2045. url: `https://api.bilibili.com/x/player/playurl?qn=120&otype=json&fourk=1&fnver=0&fnval=4048&avid=${avid}&cid=${cid}`,
  2046. xhrFields: {
  2047. withCredentials: true,
  2048. },
  2049. async: false,
  2050. success: function (res) {
  2051. if (!res.data) {
  2052. toast(
  2053. "该视频需要登录或大会员才可观看",
  2054. TOAST_TYPE.error
  2055. );
  2056. tryTime = TRY_TIME.maxParse;
  2057. return;
  2058. }
  2059. let videoUrl = undefined;
  2060. let audioUrl = undefined;
  2061. let dash = res.data.dash;
  2062. if (!dash) {
  2063. result = -1;
  2064. return;
  2065. }
  2066. let hiRes = dash.flac;
  2067. let dolby = dash.dolby;
  2068. if (hiRes && hiRes.audio) {
  2069. audioUrl = hiRes.audio.baseUrl;
  2070. } else if (dolby && dolby.audio) {
  2071. audioUrl = dolby.audio[0].base_url;
  2072. } else if (dash.audio) {
  2073. audioUrl = dash.audio[0].baseUrl;
  2074. }
  2075. let i = 0;
  2076. while (
  2077. i < dash.video.length &&
  2078. dash.video[i].id >
  2079. BEST_QUALITY.bilibili[currentConfig.bestQuality]
  2080. ) {
  2081. i++;
  2082. }
  2083. videoUrl = dash.video[i].baseUrl;
  2084. let id = dash.video[i].id;
  2085. while (i < dash.video.length) {
  2086. if (dash.video[i].id != id) {
  2087. break;
  2088. }
  2089. if (dash.video[i].codecid == currentConfig.bilibiliCodecs) {
  2090. videoUrl = dash.video[i].baseUrl;
  2091. break;
  2092. }
  2093. i++;
  2094. }
  2095. handler.media.setAudioUrl(audioUrl);
  2096. handler.media.setVideoUrl(videoUrl);
  2097. result = 1;
  2098. },
  2099. });
  2100. return result;
  2101. }
  2102. // 获取B站 FLV / MP4 格式视频
  2103. function getBilibiliVideoDurl(avid, cid) {
  2104. $.ajax({
  2105. type: "GET",
  2106. url: `https://api.bilibili.com/x/player/playurl?qn=120&otype=json&fourk=1&fnver=0&fnval=128&avid=${avid}&cid=${cid}`,
  2107. xhrFields: {
  2108. withCredentials: true,
  2109. },
  2110. async: false,
  2111. success: function (res) {
  2112. if (!res.data) {
  2113. toast(
  2114. "Play-With-MPV 获取视频失败,如未登录请先登录并刷新页面",
  2115. TOAST_TYPE.error
  2116. );
  2117. tryTime = TRY_TIME.maxParse;
  2118. return;
  2119. }
  2120. handler.media.setVideoUrl(res.data.durl[0].url);
  2121. },
  2122. });
  2123. }
  2124. // 获取B站视频字幕
  2125. function getBilibiliVideoSubtitle(avid, cid) {
  2126. $.ajax({
  2127. type: "GET",
  2128. url: `https://api.bilibili.com/x/player/v2?aid=${avid}&cid=${cid}`,
  2129. xhrFields: {
  2130. withCredentials: true,
  2131. },
  2132. async: false,
  2133. success: function (res) {
  2134. if (
  2135. res.code == 0 &&
  2136. res.data.subtitle &&
  2137. res.data.subtitle.subtitles.length > 0
  2138. ) {
  2139. let subtitles = res.data.subtitle.subtitles;
  2140. let url = "https:" + subtitles[0].subtitle_url;
  2141. let lan = subtitles[0].lan;
  2142. for (const subtitle of subtitles) {
  2143. if (
  2144. currentConfig.subtitlePrefer.startsWith("zh") &&
  2145. subtitle.lan.startsWith("zh")
  2146. ) {
  2147. url = "https:" + subtitle.subtitle_url;
  2148. lan = subtitle.lan;
  2149. }
  2150. if (subtitle.lan == currentConfig.subtitlePrefer) {
  2151. url = "https:" + subtitle.subtitle_url;
  2152. lan = subtitle.lan;
  2153. break;
  2154. }
  2155. }
  2156. handler.media.setSubtitleUrl(
  2157. `https://www.lckp.top/common/bilibili/jsonToSrt/?url=${url}&lan=${lan}`
  2158. );
  2159. }
  2160. },
  2161. });
  2162. }
  2163. // 获取B站视频 aid 和 cid
  2164. function getBilibiliVideoId() {
  2165. let hasInitialState = false;
  2166. try {
  2167. if (__INITIAL_STATE__) {
  2168. hasInitialState = true;
  2169. }
  2170. } catch (error) {
  2171. hasInitialState = false;
  2172. }
  2173. if (!hasInitialState) {
  2174. return undefined;
  2175. }
  2176. let video = undefined;
  2177. if (__INITIAL_STATE__.epInfo) {
  2178. video = __INITIAL_STATE__.epInfo;
  2179. } else if (__INITIAL_STATE__.videoData) {
  2180. video = __INITIAL_STATE__.videoData;
  2181. } else if (__INITIAL_STATE__.videoInfo) {
  2182. video = __INITIAL_STATE__.videoInfo;
  2183. }
  2184. let aid = video.aid;
  2185. let cid = video.cid;
  2186. let p = __INITIAL_STATE__.p;
  2187. if (p && p > 1) {
  2188. cid = __INITIAL_STATE__.cidMap[aid].cids[p];
  2189. }
  2190. let videoId = {
  2191. aid: aid,
  2192. cid: cid,
  2193. };
  2194. return videoId;
  2195. }
  2196. const BEST_QUALITY = {
  2197. bilibili: {
  2198. unlimited: 127,
  2199. "2160p": 126,
  2200. "1440p": 116,
  2201. "1080p": 116,
  2202. "720p": 74,
  2203. "480p": 32,
  2204. },
  2205. bilibiliLive: {
  2206. unlimited: 4,
  2207. "2160p": 4,
  2208. "1440p": 4,
  2209. "1080p": 4,
  2210. "720p": 3,
  2211. "480p": 2,
  2212. },
  2213. ytdlp: {
  2214. unlimited: "",
  2215. "2160p": "--ytdl-format=bestvideo[height<=?2160]%2Bbestaudio/best",
  2216. "1440p": "--ytdl-format=bestvideo[height<=?1440]%2Bbestaudio/best",
  2217. "1080p": "--ytdl-format=bestvideo[height<=?1080]%2Bbestaudio/best",
  2218. "720p": "--ytdl-format=bestvideo[height<=?720]%2Bbestaudio/best",
  2219. "480p": "--ytdl-format=bestvideo[height<=?480]%2Bbestaudio/best",
  2220. },
  2221. };
  2222. var websiteList = [{
  2223. // ✅ https://www.bilibili.com/bangumi/play/ep508404
  2224. // ✅ https://www.bilibili.com/bangumi/play/ep319063
  2225. // ✅ https://www.bilibili.com/bangumi/play/ss46555
  2226. name: "B站影视",
  2227. home: ["https://www.bilibili.com"],
  2228. regex: /^https:\/\/www\.bilibili\.com\/bangumi\/play\/.*/g,
  2229. handler: class Handler extends BaseHandler {
  2230. constructor() {
  2231. super();
  2232. this.media.setReferer("https://www.bilibili.com");
  2233. }
  2234. async parse() {
  2235. // 直接从数据中获取 aid 和 cid
  2236. // let videoId = getBilibiliVideoId();
  2237. // if (videoId && videoId.aid && videoId.cid) {
  2238. // getBilibiliPlayUrl(videoId.aid, videoId.cid);
  2239. // return;
  2240. // }
  2241.  
  2242. // 从元素提取 epid 请求接口获取 aid 和 cid
  2243. let epid = page.url.match(/ep(\d+)/);
  2244. if (epid && epid[1]) {
  2245. epid = epid[1];
  2246. } else {
  2247. let epidElementClassNames = [
  2248. "ep-item cursor visited",
  2249. "ep-item cursor",
  2250. "numberListItem_select__WgCVr",
  2251. ];
  2252. let epidElement = undefined;
  2253. for (const className of epidElementClassNames) {
  2254. epidElement = document.getElementsByClassName(className)[0];
  2255. if (epidElement) {
  2256. break;
  2257. }
  2258. }
  2259. if (epidElement) {
  2260. epid = epidElement
  2261. .getElementsByTagName("a")[0]
  2262. .href.match(/ep(\d+)/)[1];
  2263. } else {
  2264. epidElement = document.getElementsByClassName(
  2265. "squirtle-pagelist-select-item active squirtle-blink"
  2266. )[0];
  2267. if (epidElement) {
  2268. epid = epidElement.dataset.value;
  2269. }
  2270. }
  2271. }
  2272. if (!epid) {
  2273. return;
  2274. }
  2275. $.ajax({
  2276. type: "GET",
  2277. url: `https://api.bilibili.com/pgc/view/web/season?ep_id=${epid}`,
  2278. xhrFields: {
  2279. withCredentials: true,
  2280. },
  2281. async: false,
  2282. success: function (res) {
  2283. let currentEpisode;
  2284. let section = res.result.section;
  2285. if (!section) {
  2286. section = new Array();
  2287. }
  2288. section.push({
  2289. episodes: res.result.episodes
  2290. });
  2291. for (let i = section.length - 1; i >= 0; i--) {
  2292. let episodes = section[i].episodes;
  2293. for (const episode of episodes) {
  2294. if (episode.id == epid) {
  2295. currentEpisode = episode;
  2296. break;
  2297. }
  2298. }
  2299. if (currentEpisode) {
  2300. break;
  2301. }
  2302. }
  2303. getBilibiliPlayUrl(
  2304. currentEpisode.aid,
  2305. currentEpisode.cid
  2306. );
  2307. },
  2308. });
  2309. }
  2310. },
  2311. },
  2312. {
  2313. // ✅ https://www.bilibili.com/video/BV1Hd4y1k7Vb
  2314. // ✅ https://www.bilibili.com/video/av2
  2315. // ✅ https://www.bilibili.com/video/BV17Z4y117Qm
  2316. // ✅ https://www.bilibili.com/list/ml1806211634?oid=822115390&bvid=BV1Fg4y1p7Qe
  2317. name: "B站投稿",
  2318. regex: /^https:\/\/www\.bilibili\.com\/(video\/|list.*)(BV|av).*/g,
  2319. handler: class Handler extends BaseHandler {
  2320. constructor() {
  2321. super();
  2322. this.media.setReferer("https://www.bilibili.com");
  2323. }
  2324. initCheck() {
  2325. if (super.initCheck()) {
  2326. let newPageUrl = window.location.href;
  2327. let oldPageUrl = page.url;
  2328. let regex = /(&|\?)vd_source=\w+/;
  2329. if (regex.test(newPageUrl.replace(oldPageUrl, ""))) {
  2330. page.url = newPageUrl;
  2331. return false;
  2332. }
  2333. return true;
  2334. }
  2335. return false;
  2336. }
  2337. async parse() {
  2338. // 直接从数据中获取 aid 和 cid
  2339. // let videoId = getBilibiliVideoId();
  2340. // if (videoId && videoId.aid && videoId.cid) {
  2341. // getBilibiliPlayUrl(videoId.aid, videoId.cid);
  2342. // return;
  2343. // }
  2344.  
  2345. // 通过 bvid/avid 请求接口获取 aid 和 cid
  2346. let param = undefined;
  2347. let bvid = page.url.match(/BV([0-9a-zA-Z]+)/);
  2348. if (bvid && bvid[1]) {
  2349. param = `bvid=${bvid[1]}`;
  2350. } else {
  2351. let avid = page.url.match(/av([0-9]+)/);
  2352. if (avid && avid[1]) {
  2353. param = `aid=${avid[1]}`;
  2354. }
  2355. }
  2356. if (!param) {
  2357. return;
  2358. }
  2359. $.ajax({
  2360. type: "GET",
  2361. url: `https://api.bilibili.com/x/web-interface/view?${param}`,
  2362. xhrFields: {
  2363. withCredentials: true,
  2364. },
  2365. async: false,
  2366. success: function (res) {
  2367. let aid = res.data.aid;
  2368. let cid = res.data.cid;
  2369. let index = page.url.indexOf("?p=");
  2370. if (index != -1 && res.data.pages.length > 1) {
  2371. let p = page.url.substring(index + 3);
  2372. let endIndex = p.indexOf("&");
  2373. if (endIndex != -1) {
  2374. p = p.substring(0, endIndex);
  2375. }
  2376. cid = res.data.pages[p - 1].cid;
  2377. }
  2378. getBilibiliPlayUrl(aid, cid);
  2379. },
  2380. });
  2381. }
  2382. },
  2383. },
  2384. {
  2385. // ✅ https://www.bilibili.com/festival/2023bnj?bvid=BV17G4y1X7vQ
  2386. name: "B站节日",
  2387. regex: /^https:\/\/www\.bilibili\.com\/festival\/.*/g,
  2388. handler: class Handler extends BaseHandler {
  2389. constructor() {
  2390. super();
  2391. this.media.setReferer("https://www.bilibili.com");
  2392. }
  2393. initCheck() {
  2394. if (super.initCheck()) {
  2395. return true;
  2396. }
  2397. let oldvideoId = this.videoId;
  2398. let newvideoId = getBilibiliVideoId();
  2399. if (oldvideoId && oldvideoId.cid != newvideoId.cid) {
  2400. return true;
  2401. }
  2402. return false;
  2403. }
  2404. async parse() {
  2405. let videoId = getBilibiliVideoId();
  2406. if (videoId && videoId.aid && videoId.cid) {
  2407. this.videoId = videoId;
  2408. getBilibiliPlayUrl(videoId.aid, videoId.cid);
  2409. return;
  2410. } else {
  2411. toast(
  2412. "Play-With-MPV 读取视频数据失败,请尝试清理B站缓存后刷新重试",
  2413. TOAST_TYPE.error,
  2414. 5000
  2415. );
  2416. tryTime = TRY_TIME.maxParse;
  2417. }
  2418. }
  2419. },
  2420. },
  2421. {
  2422. // ✅ https://live.bilibili.com/7777
  2423. name: "B站直播",
  2424. home: ["https://live.bilibili.com"],
  2425. regex: /^https:\/\/live\.bilibili\.com\/\d+.*/g,
  2426. handler: class Handler extends BaseHandler {
  2427. async parse() {
  2428. let iframes = document.getElementsByTagName("iframe");
  2429. let roomid = undefined;
  2430. for (let iframe of iframes) {
  2431. let roomids = iframe.src.match(
  2432. /^https:\/\/live\.bilibili\.com.*(roomid=\d+|blanc\/\d+).*/
  2433. );
  2434. if (roomids && roomids[1]) {
  2435. roomid = roomids[1].match(/\d+/)[0];
  2436. break;
  2437. }
  2438. }
  2439. if (!roomid) {
  2440. console.log("Play-With-MPV:找不到 roomid:" + roomid);
  2441. return;
  2442. }
  2443.  
  2444. let that = this;
  2445. $.ajax({
  2446. type: "GET",
  2447. url: `https://api.live.bilibili.com/room/v1/Room/playUrl?quality=${
  2448. BEST_QUALITY.bilibiliLive[currentConfig.bestQuality]
  2449. }&cid=${roomid}`,
  2450. async: false,
  2451. xhrFields: {
  2452. withCredentials: true,
  2453. },
  2454. success: function (res) {
  2455. that.media.setVideoUrl(res.data.durl[0].url);
  2456. },
  2457. });
  2458. }
  2459. },
  2460. },
  2461. {
  2462. // ✅ https://www.ixigua.com/
  2463. name: "西瓜视频",
  2464. home: ["https://www.ixigua.com"],
  2465. regex: /^https:\/\/www\.ixigua\.com\/\d.*/g,
  2466. handler: class Handler extends BaseHandler {
  2467. constructor() {
  2468. super();
  2469. this.media.setReferer("https://www.ixigua.com/");
  2470. }
  2471. async parse() {
  2472. let that = this;
  2473. $.ajax({
  2474. type: "GET",
  2475. url: page.url,
  2476. async: false,
  2477. success: function (res) {
  2478. try {
  2479. let _SSR_HYDRATED_DATA = new Function(
  2480. "return " +
  2481. res.match(
  2482. /<script id="SSR_HYDRATED_DATA"[^<]*window._SSR_HYDRATED_DATA=({[^<]*})[^<]*<\/script>/
  2483. )[1]
  2484. )();
  2485. let packerData =
  2486. _SSR_HYDRATED_DATA.anyVideo.gidInformation
  2487. .packerData;
  2488. let main_url = undefined;
  2489. if (packerData.video) {
  2490. let videoList =
  2491. packerData.video.videoResource.normal
  2492. .video_list;
  2493. if (videoList) {
  2494. let video = undefined;
  2495. for (const key in videoList) {
  2496. if (
  2497. !video ||
  2498. videoList[key].vheight >
  2499. video.vheight
  2500. ) {
  2501. video = videoList[key];
  2502. }
  2503. }
  2504. main_url = video.main_url;
  2505. }
  2506. that.media.setVideoUrl(
  2507. window
  2508. .atob(main_url)
  2509. .replace("http://", "https://")
  2510. );
  2511. return;
  2512. }
  2513. } catch (error) {
  2514. console.error("解析出错:" + error);
  2515. }
  2516. that.nxParser();
  2517. },
  2518. });
  2519. }
  2520. },
  2521. },
  2522. {
  2523. // ✅ https://yun.nxflv.com/?url=https://www.ixigua.com/7186534626612118071
  2524. name: "诺讯解析",
  2525. regex: /^https:\/\/yun\.nxflv\.com\/\?url=.+/g,
  2526. handler: class Handler extends BaseHandler {
  2527. constructor() {
  2528. super();
  2529. this.addTopListener();
  2530. }
  2531. async parse() {
  2532. let url = this.videoParser();
  2533. if (url.startsWith("blob")) {
  2534. for (
  2535. let index = 0; index < sessionStorage.key.length; index++
  2536. ) {
  2537. url = sessionStorage.key(index);
  2538. url = url.match(/http[^#]*/g);
  2539. if (url && url.length > 0) {
  2540. url = url[0];
  2541. }
  2542. }
  2543. }
  2544. this.media.setVideoUrl(url);
  2545. }
  2546. },
  2547. },
  2548. {
  2549. // ✅ https://ddys.art/bleach-thousand-year-blood-war
  2550. name: "低端影视",
  2551. home: ["https://ddys.art", "https://ddys.pro"],
  2552. regex: /^https:\/\/(ddys\.art|ddys\.pro)\/.*/g,
  2553. handler: class Handler extends BaseHandler {
  2554. async parse() {
  2555. let video = document.getElementsByTagName("video")[0];
  2556. if (video.paused) {
  2557. document
  2558. .getElementsByClassName("vjs-big-play-button")[0]
  2559. .click();
  2560. }
  2561. let url = this.videoParser();
  2562. if (url) {
  2563. let index = url.indexOf("?");
  2564. if (index != -1) {
  2565. url =
  2566. url.substring(0, index + 1) +
  2567. encodeURIComponent(url.substring(index + 1));
  2568. }
  2569. this.media.setVideoUrl(url);
  2570. let playing = document.getElementsByClassName(
  2571. "wp-playlist-playing"
  2572. )[0];
  2573. if (playing) {
  2574. let episode = playing.textContent.replace(
  2575. /(\n|\t|\d\.)/g,
  2576. ""
  2577. );
  2578. if (episode != " 全") {
  2579. this.media.title =
  2580. document.getElementsByClassName("post-title")[0]
  2581. .textContent +
  2582. episode +
  2583. " - 低端影视";
  2584. }
  2585. }
  2586. }
  2587. }
  2588. },
  2589. },
  2590. {
  2591. // ✅ https://www.libvio.pro/play/714890512-1-2.html
  2592. name: "LIBVIO",
  2593. home: [
  2594. "https://www.libvio.cc",
  2595. "https://libvio.fun",
  2596. "https://libvio.me",
  2597. "https://www.libvio.me",
  2598. ],
  2599. regex: /^https?:\/\/.*\.libvio\..*\/play.*/g,
  2600. handler: class Handler extends BaseHandler {
  2601. constructor() {
  2602. super();
  2603. this.addIframeListener();
  2604. }
  2605. },
  2606. },
  2607. {
  2608. name: "LIBVIO播放器",
  2609. regex: /^https:\/\/(.*\.chinaeast2\.cloudapp\.chinacloudapi\.cn|.*\.cfnode1\.xyz)(:\d+)?\/.*/g,
  2610. handler: class Handler extends BaseHandler {
  2611. constructor() {
  2612. super();
  2613. this.addTopListener();
  2614. let that = this;
  2615. this.currentUrl = "";
  2616. //拦截请求以更新Url
  2617. const originOpen = XMLHttpRequest.prototype.open;
  2618. XMLHttpRequest.prototype.open = function (
  2619. method,
  2620. url,
  2621. async,
  2622. user,
  2623. password
  2624. ) {
  2625. originOpen.apply(this, arguments);
  2626. if (url.match(VIDEO_URL_REGEX)) {
  2627. that.currentUrl = encodeURIComponent(url);
  2628. }
  2629. };
  2630. }
  2631. async parse() {
  2632. if (this.currentUrl) {
  2633. this.media.setVideoUrl(this.currentUrl);
  2634. } else {
  2635. let url = urls;
  2636. let index = url.indexOf("?");
  2637. if (index != -1) {
  2638. url =
  2639. url.substring(0, index + 1) +
  2640. encodeURIComponent(url.substring(index + 1));
  2641. }
  2642. this.media.setVideoUrl(url);
  2643. }
  2644. }
  2645. },
  2646. },
  2647. {
  2648. // ✅ https://www.nivod.tv/UXEwMmLqnUjHG5e4MwmlvmVnWiAJ9rIQ-RofV7wPhhed3uoi50mYsftLPq4mYyIhB-720-0-0-play.html?x=1
  2649. // ✅ https://www.nivod4.tv/YeClpGXOt58F3QmAp9bx5CnaBrO4txhU-27-0-0-0-play.html?sc=6bb1aa9619ece1f6a00124a66a6fb8b6
  2650. name: "泥视频",
  2651. home: ["https://www.nivod.tv"],
  2652. regex: /^https:\/\/www\.nivod.*\.tv\/.*play\.html?.*/g,
  2653. handler: class Handler extends BaseHandler {
  2654. async parse() {
  2655. this.media.setVideoUrl(__dp.options.video.url);
  2656. this.media.setTitle(document.title);
  2657. }
  2658. },
  2659. },
  2660. {
  2661. // ✅ https://www.pkmkv.com/py/268677-2-11.html
  2662. name: "片库",
  2663. home: ["https://www.pkmkv.com"],
  2664. regex: /^https:\/\/www\.pkmkv\.com\/py\/.*/g,
  2665. handler: class Handler extends BaseHandler {
  2666. constructor() {
  2667. super();
  2668. this.addIframeListener();
  2669. }
  2670. async parse() {
  2671. this.media.setVideoUrl(player_aaaa.url);
  2672. }
  2673. },
  2674. },
  2675. {
  2676. name: "片库播放器",
  2677. regex: /^https:\/\/www\.pkmkv\.com\/addons\/dplayer\/\?url=.*/g,
  2678. handler: class Handler extends BaseHandler {
  2679. constructor() {
  2680. super();
  2681. this.addTopListener();
  2682. }
  2683. },
  2684. },
  2685. {
  2686. // ✅ https://tgbook.coolkv.com/play/1048-0-4.html
  2687. name: "韩剧看看",
  2688. regex: /^https:\/\/tgbook\.coolkv\.com\/play\/.*\.html/g,
  2689. handler: class Handler extends BaseHandler {
  2690. constructor() {
  2691. super();
  2692. this.addIframeListener();
  2693. this.media.setReferer("https://tgbook.coolkv.com/");
  2694. }
  2695. },
  2696. },
  2697. {
  2698. // https://tgbook.coolkv.com/js/player/dm.html
  2699. name: "韩剧看看播放器外层",
  2700. regex: /^https:\/\/tgbook\.coolkv\.com\/js\/player\/dm\.html/g,
  2701. handler: class Handler extends BaseHandler {
  2702. constructor() {
  2703. super();
  2704. this.addTopListener();
  2705. this.addIframeListener();
  2706. }
  2707. },
  2708. },
  2709. {
  2710. // https://tgbook.coolkv.com/js/player/dmplayer/player/index.php?url=https://99vv.yandex.com/file/bz2022/2021/yyyx/yyyx05/playlist.m3u8&next=/play/1048-0-5.html&vid=1048-0-4&nextdz=https://99vv.yandex.com/file/bz2022/2021/yyyx/yyyx06/playlist.m3u8
  2711. name: "韩剧看看播放器",
  2712. regex: /^https:\/\/tgbook\.coolkv\.com\/js\/player\/dmplayer\/player\/index\.php\?url=.*/g,
  2713. handler: class Handler extends BaseHandler {
  2714. constructor() {
  2715. super();
  2716. this.addTopListener();
  2717. }
  2718. async parse() {
  2719. if (
  2720. config.url.indexOf(".m3u8") > 0 ||
  2721. config.url.indexOf(".mp4") > 0 ||
  2722. config.url.indexOf(".flv") > 0
  2723. ) {
  2724. this.media.setVideoUrl(config.url);
  2725. }
  2726. }
  2727. },
  2728. },
  2729. {
  2730. // ✅ https://www.btnull.org/py/BBnLd_9.html?167094
  2731. name: "无名小站",
  2732. home: [
  2733. "https://www.btnull.org",
  2734. "https://www.btnull.to",
  2735. "https://www.btnull.nu",
  2736. "https://www.btnull.in",
  2737. ],
  2738. regex: /^https:\/\/(www.btnull.org|www.btnull.to|www.btnull.nu|www.btnull.in)\/py\/.*/g,
  2739. handler: class Handler extends BaseHandler {
  2740. async parse() {
  2741. this.media.setVideoUrl(this.htmlParser());
  2742. }
  2743. },
  2744. },
  2745. {
  2746. // ✅ https://www.856dm.com/play/6792-1-91.html
  2747. // ✅ http://www.ntdm8.com/play/4973-1-1.html
  2748. name: "樱花动漫网",
  2749. home: ["https://www.856dm.com", "http://www.ntdm8.com"],
  2750. regex: /^https?:\/\/www\.(\d+dm|ntdm8)\.com\/play\/.*/g,
  2751. handler: class Handler extends BaseHandler {
  2752. constructor() {
  2753. super();
  2754. this.addIframeListener();
  2755. }
  2756. },
  2757. },
  2758. {
  2759. // ✅ https://www.mxdm9.com/dongmanplay/8371-1-1.html
  2760. name: "MX动漫网",
  2761. home: ["https://www.mxdm.tv", "https://www.mxdm9.com"],
  2762. regex: /^https?:\/\/www\.mxdm\d*\.(tv|com)\/dongmanplay\/.*/g,
  2763. handler: class Handler extends BaseHandler {
  2764. constructor() {
  2765. super();
  2766. this.addIframeListener();
  2767. }
  2768. },
  2769. },
  2770. {
  2771. name: "樱花动漫网播放器",
  2772. regex: /^https:\/\/danmu\.yhdmjx\.com\/.*php\?url=.*/g,
  2773. handler: class Handler extends BaseHandler {
  2774. constructor() {
  2775. super();
  2776. this.addTopListener();
  2777. //拦截请求以更新Url
  2778. let that = this;
  2779. const originOpen = XMLHttpRequest.prototype.open;
  2780. XMLHttpRequest.prototype.open = function (
  2781. method,
  2782. url,
  2783. async,
  2784. user,
  2785. password
  2786. ) {
  2787. originOpen.apply(this, arguments);
  2788. if (url.match(VIDEO_URL_REGEX)) {
  2789. that.currentUrl = url;
  2790. }
  2791. };
  2792. }
  2793. async parse() {
  2794. this.media.setVideoUrl(this.videoParser());
  2795. if (!this.media.videoUrl && this.currentUrl) {
  2796. this.media.setVideoUrl(this.currentUrl);
  2797. }
  2798. }
  2799. },
  2800. },
  2801. {
  2802. // ✅ https://dick.xfani.com/watch/582/1/11.html
  2803. name: "稀饭动漫",
  2804. home: ["https://dick.xfani.com"],
  2805. regex: /^https:\/\/dick\.xfani\.com\/watch\/.*/g,
  2806. handler: class Handler extends BaseHandler {
  2807. constructor() {
  2808. super();
  2809. this.addIframeListener();
  2810. }
  2811. },
  2812. },
  2813. {
  2814. name: "稀饭动漫播放器",
  2815. regex: /(^https:\/\/dick\.xfani\.com\/addons\/dp\/player\/.*|^https:\/\/m3\.moedot\.net\/muiplayer\/\?url=.*)/g,
  2816. handler: class Handler extends BaseHandler {
  2817. constructor() {
  2818. super();
  2819. this.addTopListener();
  2820. }
  2821. async parse() {
  2822. if (
  2823. config.url.indexOf(".m3u8") > 0 ||
  2824. config.url.indexOf(".mp4") > 0 ||
  2825. config.url.indexOf(".flv") > 0
  2826. ) {
  2827. this.media.setVideoUrl(config.url);
  2828. } else {
  2829. let that = this;
  2830. $.ajax({
  2831. type: "POST",
  2832. url: "api_currentConfig.php",
  2833. data: {
  2834. url: config.url,
  2835. time: config.time,
  2836. key: config.key,
  2837. title: config.title,
  2838. },
  2839. async: false,
  2840. success: function (res) {
  2841. if (res.code == "200") {
  2842. that.media.setVideoUrl(res.url);
  2843. }
  2844. },
  2845. });
  2846. }
  2847. }
  2848. },
  2849. },
  2850. {
  2851. name: "稀饭动漫播放器",
  2852. regex: /^https:\/\/player\.moedot\.net\/player\/.*/g,
  2853. handler: class Handler extends BaseHandler {
  2854. constructor() {
  2855. super();
  2856. this.addTopListener();
  2857. }
  2858. async parse() {
  2859. this.media.setVideoUrl(this.urlParser());
  2860. }
  2861. },
  2862. },
  2863. {
  2864. // ✅ https://www.mgnacg.com/bangumi/426-6-12
  2865. name: "橘子动漫",
  2866. home: ["https://www.mgnacg.com"],
  2867. regex: /^https:\/\/www\.mgnacg\.com\/bangumi\/.*/g,
  2868. handler: class Handler extends BaseHandler {
  2869. constructor() {
  2870. super();
  2871. this.addIframeListener();
  2872. this.media.setReferer("https://play.mknacg.top:8585/");
  2873. }
  2874. },
  2875. },
  2876. {
  2877. name: "橘子动漫播放器",
  2878. regex: /^https:\/\/play\.mknacg\.top:8585\/.*/g,
  2879. handler: class Handler extends BaseHandler {
  2880. constructor() {
  2881. super();
  2882. this.addTopListener();
  2883. }
  2884. async parse() {
  2885. this.media.setVideoUrl(art.option.url);
  2886. }
  2887. },
  2888. },
  2889. {
  2890. // ✅ https://www.omofun.top/index.php/vod/play/id/17295/sid/2/nid/7.html
  2891. name: "OmoFun",
  2892. home: ["https://www.omofun.top"],
  2893. regex: /^https:\/\/www\.omofun\.top\/index.php\/vod\/play\/id\/.*/g,
  2894. handler: class Handler extends BaseHandler {
  2895. constructor() {
  2896. super();
  2897. this.addIframeListener();
  2898. }
  2899. },
  2900. },
  2901. {
  2902. name: "OmoFun播放器",
  2903. regex: /^https:\/\/.*\.omofun\.top\/(player\/|)\?url=.*/g,
  2904. handler: class Handler extends BaseHandler {
  2905. constructor() {
  2906. super();
  2907. this.addTopListener();
  2908. }
  2909. async parse() {
  2910. this.media.setVideoUrl(this.urlParser());
  2911. }
  2912. },
  2913. },
  2914. {
  2915. // ✅ https://spdcat.net/vodplay/135443-1-23
  2916. name: "迅猫动漫",
  2917. home: ["https://spdcat.net"],
  2918. regex: /^https:\/\/spdcat\.net\/vodplay\/.*/g,
  2919. handler: class Handler extends BaseHandler {
  2920. constructor() {
  2921. super();
  2922. this.addIframeListener();
  2923. }
  2924. },
  2925. },
  2926. {
  2927. name: "迅猫动漫播放器",
  2928. regex: /^https:\/\/spdcat\.net\/addons\/dp\/player\/.*/g,
  2929. handler: class Handler extends BaseHandler {
  2930. constructor() {
  2931. super();
  2932. this.addTopListener();
  2933. }
  2934. async parse() {
  2935. this.media.setVideoUrl(config.url);
  2936. setTimeout(() => {
  2937. let conplay =
  2938. document.getElementsByClassName("conplay-jump")[0];
  2939. if (conplay) {
  2940. conplay.click();
  2941. }
  2942. }, 1000);
  2943. }
  2944. },
  2945. },
  2946. {
  2947. // ✅ http://www.dm88.me/player/8480-0-11.html
  2948. name: "樱花动漫",
  2949. home: ["http://www.dm88.me"],
  2950. regex: /^http:\/\/www\.dm88\.me\/player\/.*/g,
  2951. handler: class Handler extends BaseHandler {
  2952. constructor() {
  2953. super();
  2954. this.addIframeListener();
  2955. }
  2956. },
  2957. },
  2958. {
  2959. name: "樱花动漫播放器",
  2960. regex: /^https:\/\/jianghu\.live2008\.com\/.*\?url=.*/g,
  2961. handler: class Handler extends BaseHandler {
  2962. constructor() {
  2963. super();
  2964. this.addTopListener();
  2965. }
  2966. async parse() {
  2967. this.media.setVideoUrl(url);
  2968. }
  2969. },
  2970. },
  2971. {
  2972. // ✅ https://www.kk151.com/play/15257-2-11.html
  2973. name: "动漫之家",
  2974. home: ["https://www.kk151.com"],
  2975. regex: /^https:\/\/www\.kk151\.com\/play\/.*/g,
  2976. handler: class Handler extends BaseHandler {
  2977. constructor() {
  2978. super();
  2979. this.addIframeListener();
  2980. }
  2981. },
  2982. },
  2983. {
  2984. name: "动漫之家播放器",
  2985. regex: /^https:\/\/(www\.ikdmjx\.com\/|jx\.wolongzywcdn\.com:65\/m3u8\.php|hls\.kuaibofang\.com\/|jx\.jxbdzyw\.com\/m3u8\/|www\.m3u8\.tv\.cdn\.8old\.cn\/m3u8tv1127\/api\.php|jx\.wujinkk\.com\/dplayer\/|jx\.m3u8\.tv\/jiexi\/)\?url=.*/g,
  2986. handler: class Handler extends BaseHandler {
  2987. constructor() {
  2988. super();
  2989. this.addTopListener();
  2990. }
  2991. async parse() {
  2992. this.media.setVideoUrl(this.urlParser());
  2993. }
  2994. },
  2995. },
  2996. {
  2997. // ✅ https://hdzyk.com/?m=vod-play-id-27537-src-2-num-11.html
  2998. // ✅ https://1080zyk2.com/?m=vod-play-id-27537-src-2-num-11.html
  2999. name: "优质资源库",
  3000. home: [
  3001. "https://hdzyk.com",
  3002. "https://1080zyk1.com",
  3003. "https://1080zyk2.com",
  3004. "https://1080zyk3.com",
  3005. "https://1080zyk4.com",
  3006. "https://1080zyk5.com",
  3007. ],
  3008. regex: /^https:\/\/(hdzyk\.com|1080zyk[1-5]\.com)\/\?m=.*/g,
  3009. handler: class Handler extends BaseHandler {
  3010. constructor() {
  3011. super();
  3012. this.addIframeListener();
  3013. }
  3014. },
  3015. },
  3016. {
  3017. name: "优质资源库播放器",
  3018. regex: /^https:\/\/vip\.zykbf\.com\/\?url=.*/g,
  3019. handler: class Handler extends BaseHandler {
  3020. constructor() {
  3021. super();
  3022. this.addTopListener();
  3023. }
  3024. async parse() {
  3025. this.media.setVideoUrl(this.urlParser());
  3026. }
  3027. },
  3028. },
  3029. {
  3030. name: "优质资源库播放器",
  3031. regex: /^https:\/\/.*\.(yzzy-tv1|yzzy-tv-cdn)\.com\/.*/g,
  3032. handler: class Handler extends BaseHandler {
  3033. constructor() {
  3034. super();
  3035. this.addTopListener();
  3036. }
  3037. async parse() {
  3038. this.media.setVideoUrl("https://" + location.host + main);
  3039. }
  3040. },
  3041. },
  3042. {
  3043. // ✅ https://www.bdys10.com/play/22729-8.htm
  3044. name: "哔嘀影视",
  3045. home: ["https://www.bdys10.com"],
  3046. regex: /^https:\/\/www\.bdys10\.com\/.*play\/.*/g,
  3047. handler: class Handler extends BaseHandler {
  3048. async parse() {
  3049. this.media.setVideoUrl(this.videoParser());
  3050. if (!this.media.videoUrl) {
  3051. this.media.setVideoUrl(this.htmlParser());
  3052. if (!this.media.videoUrl) {
  3053. this.media.setVideoUrl(this.scriptParser());
  3054. }
  3055. }
  3056. }
  3057. },
  3058. },
  3059. {
  3060. // ✅ https://www.dora-family.com/Resource:TV
  3061. name: "哆啦A梦新番",
  3062. home: ["https://www.dora-family.com/Resource:TV"],
  3063. regex: /^https:\/\/www\.dora-family\.com\/Resource:TV/g,
  3064. handler: class Handler extends BaseHandler {
  3065. initCheck() {
  3066. if (super.initCheck()) {
  3067. return true;
  3068. }
  3069. let oldVideoUrl = this.media.videoUrl;
  3070. let newVideoUrl = this.videoParser();
  3071. if (oldVideoUrl && oldVideoUrl != newVideoUrl) {
  3072. return true;
  3073. }
  3074. return false;
  3075. }
  3076. async parse() {
  3077. this.media.setVideoUrl(this.videoParser());
  3078. }
  3079. },
  3080. },
  3081. {
  3082. // ✅ https://mypikpak.com/drive/all
  3083. name: "PikPak",
  3084. home: ["https://mypikpak.com/drive/all"],
  3085. regex: /^https:\/\/mypikpak\.com\/drive\/.*/g,
  3086. handler: class Handler extends BaseHandler {
  3087. initCheck() {
  3088. if (super.initCheck()) {
  3089. return true;
  3090. }
  3091. let oldVideoUrl = this.media.videoUrl;
  3092. let newVideoUrl = this.videoParser();
  3093. if (oldVideoUrl && oldVideoUrl != newVideoUrl) {
  3094. return true;
  3095. }
  3096. return false;
  3097. }
  3098. async parse() {
  3099. while (document.getElementsByTagName("video").length == 0) {
  3100. await sleep(1000);
  3101. }
  3102. this.media.setVideoUrl(this.videoParser());
  3103. this.media.setTitle(
  3104. document.getElementsByClassName("player-title")[0]
  3105. .textContent
  3106. );
  3107. }
  3108. },
  3109. },
  3110. {
  3111. // ✅ https://www.olehdtv.com/player/vod/1/43671/1
  3112. name: "欧乐影院",
  3113. home: ["https://www.olehdtv.com/"],
  3114. regex: /^https:\/\/www\.olehdtv\.com\/player\/vod\/\d+\/\d+\/\d+/g,
  3115. handler: class Handler extends BaseHandler {
  3116. async parse() {
  3117. let ids = page.url.match(
  3118. /^https:\/\/www\.olehdtv\.com\/player\/vod\/(\d+)\/(\d+)\/(\d+)/
  3119. );
  3120. let id = ids[2];
  3121. let index = ids[3];
  3122. let t = Date.parse(new Date()) / 1e3,
  3123. r = t % 20;
  3124. let _vv = MD5(t - r + "new.olelive.com");
  3125. let that = this;
  3126. $.ajax({
  3127. type: "GET",
  3128. url: `https://api.olelive.com/v1/pub/vod/detail?id=${id}&play=true&_vv=${_vv}`,
  3129. async: false,
  3130. success: function (res) {
  3131. if (res.code == 0) {
  3132. that.media.setVideoUrl(
  3133. res.data.urls[index - 1].url
  3134. );
  3135. }
  3136. },
  3137. });
  3138. }
  3139. play() {
  3140. this.media.setTitle(document.title);
  3141. super.play();
  3142. }
  3143. },
  3144. },
  3145. {
  3146. // ✅ https://www.olehdtv.com/player/live/tv/CCTV5HD/49
  3147. name: "欧乐影院直播",
  3148. home: ["https://www.olehdtv.com/"],
  3149. regex: /^https:\/\/www\.olehdtv\.com\/player\/live\/tv\/[^/]+\/\d+/g,
  3150. handler: class Handler extends BaseHandler {
  3151. async parse() {
  3152. let ids = page.url.match(
  3153. /^https:\/\/www\.olehdtv\.com\/player\/live\/tv\/([^/]+)\/(\d+)/
  3154. );
  3155. let id = ids[2];
  3156. let streamId = ids[1];
  3157. let today = new Date();
  3158. let year = today.getFullYear();
  3159. let month = today.getMonth() + 1;
  3160. if (month < 10) {
  3161. month = "0" + month;
  3162. }
  3163. let day = today.getDate();
  3164. if (day < 10) {
  3165. day = "0" + day;
  3166. }
  3167. let date = year + "-" + month + "-" + day;
  3168. let t = Date.parse(today) / 1e3,
  3169. r = t % 20;
  3170. let _vv = MD5(t - r + "new.olelive.com");
  3171. let that = this;
  3172. $.ajax({
  3173. type: "GET",
  3174. url: `https://api.olelive.com/v1/pub/live/info?date=${date}&streamId=${streamId}&type=tv&id=${id}&_vv=${_vv}`,
  3175. async: false,
  3176. success: function (res) {
  3177. if (res.code == 0) {
  3178. that.media.setVideoUrl(
  3179. res.data.detail.hls.replace("_360", "")
  3180. );
  3181. }
  3182. },
  3183. });
  3184. }
  3185. play() {
  3186. this.media.setTitle(document.title);
  3187. super.play();
  3188. }
  3189. },
  3190. },
  3191. {
  3192. // ✅ https://tkznp.com/vodplay/337990-1-2.html
  3193. name: "天空影视",
  3194. home: [
  3195. "https://tkznp.com/",
  3196. "https://www.tkznp1.com/",
  3197. "https://www.tkznp2.com/",
  3198. "https://www.tkznp3.com/",
  3199. "https://www.tkznp4.com/",
  3200. "https://www.tkznp5.com/",
  3201. "https://www.tkznp6.com/",
  3202. ],
  3203. regex: /^https?:\/\/(|www\.)tkznp(|1|2|3|4|5|6)\.com\/vodplay\/.*/g,
  3204. handler: class Handler extends BaseHandler {
  3205. constructor() {
  3206. super();
  3207. this.addIframeListener();
  3208. }
  3209. },
  3210. },
  3211. {
  3212. name: "天空影视播放器",
  3213. regex: /^https?:\/\/vip\.ckllk\.com\/\?url=.*/g,
  3214. handler: class Handler extends BaseHandler {
  3215. constructor() {
  3216. super();
  3217. this.addTopListener();
  3218. }
  3219. async parse() {
  3220. this.media.setVideoUrl(config.url);
  3221. this.media.setTitle(config.title);
  3222. }
  3223. },
  3224. },
  3225. {
  3226. // ✅ https://www.anfuns.cc/play/1572-1-1.html
  3227. name: "AnFuns",
  3228. home: ["https://www.anfuns.cc"],
  3229. regex: /^https:\/\/www\.anfuns\.cc\/play\/.*/g,
  3230. handler: class Handler extends BaseHandler {
  3231. constructor() {
  3232. super();
  3233. this.addIframeListener();
  3234. }
  3235. },
  3236. },
  3237. {
  3238. name: "AnFuns播放器",
  3239. regex: /^https:\/\/www\.anfuns\.cc\/vapi\/(A0EPlayer|eden)\/\?url=.*/g,
  3240. handler: class Handler extends BaseHandler {
  3241. constructor() {
  3242. super();
  3243. this.addTopListener();
  3244. }
  3245. async parse() {
  3246. let url = config.url;
  3247. if (url) {
  3248. if (
  3249. !url.startsWith("https://fata.peizq.online/cache/") &&
  3250. !url.startsWith("https://media-oss.anfuns.cn/m3u8/")
  3251. ) {
  3252. this.media.setVideoUrl(config.url);
  3253. } else {
  3254. tryTime = TRY_TIME.maxParse;
  3255. }
  3256. }
  3257. }
  3258. },
  3259. },
  3260. {
  3261. // ✅ https://www.youtube.com/watch?v=IkGuTYaTsLo
  3262. name: "YouTube",
  3263. home: ["https://www.youtube.com"],
  3264. regex: /^https:\/\/www\.youtube\.com\/(watch|playlist)\?.*/g,
  3265. handler: class Handler extends BaseHandler {
  3266. async parse() {
  3267. this.media.setOther(
  3268. BEST_QUALITY.ytdlp[currentConfig.bestQuality]
  3269. );
  3270. this.media.setVideoUrl(this.ytDlpParser());
  3271. this.media.setTitle("");
  3272. }
  3273. },
  3274. },
  3275. {
  3276. // ✅ https://odysee.com/@jjlin:8/%E6%9E%97%E4%BF%8A%E5%82%91-jj-lin%E3%80%8Ajj20%E4%B8%96%E7%95%8C%E5%B7%A1%E8%BF%B4%E6%BC%94%E5%94%B1%E6%9C%83%E3%80%8B-2:8
  3277. name: "Odysee",
  3278. home: ["https://odysee.com"],
  3279. regex: /^https:\/\/odysee\.com\/[^$].+/g,
  3280. handler: class Handler extends BaseHandler {
  3281. async parse() {
  3282. this.media.setOther(
  3283. BEST_QUALITY.ytdlp[currentConfig.bestQuality]
  3284. );
  3285. this.media.setVideoUrl(this.ytDlpParser());
  3286. this.media.setTitle("");
  3287. }
  3288. },
  3289. },
  3290. {
  3291. // ✅ https://rumble.com/v2mfr78-valheim-viking-survival-w-chaos-tricks-you-can-affect-my-game-chat-opinions.html
  3292. name: "Rumble",
  3293. home: ["https://rumble.com"],
  3294. regex: /^https:\/\/rumble\.com\/v.+\.html/g,
  3295. handler: class Handler extends BaseHandler {
  3296. async parse() {
  3297. this.media.setOther(
  3298. BEST_QUALITY.ytdlp[currentConfig.bestQuality]
  3299. );
  3300. this.media.setVideoUrl(this.ytDlpParser());
  3301. this.media.setTitle("");
  3302. }
  3303. },
  3304. },
  3305. {
  3306. // ✅ https://www.bitchute.com/video/NoodZjmfKHXS/
  3307. name: "BitChute",
  3308. home: ["https://www.bitchute.com"],
  3309. regex: /^https:\/\/www\.bitchute\.com\/video\/.+/g,
  3310. handler: class Handler extends BaseHandler {
  3311. async parse() {
  3312. this.media.setOther(
  3313. BEST_QUALITY.ytdlp[currentConfig.bestQuality]
  3314. );
  3315. this.media.setVideoUrl(this.ytDlpParser());
  3316. this.media.setTitle("");
  3317. }
  3318. },
  3319. },
  3320. {
  3321. // ✅ https://ani.gamer.com.tw/animeVideo.php?sn=32227
  3322. name: "巴哈姆特",
  3323. home: ["https://ani.gamer.com.tw"],
  3324. regex: /^https:\/\/ani\.gamer\.com\.tw\/animeVideo.php\?sn=.*/g,
  3325. handler: class Handler extends BaseHandler {
  3326. async parse() {
  3327. this.media.setOrigin("https://ani.gamer.com.tw");
  3328. let index = page.url.indexOf("sn=") + 3;
  3329. if (index == -1) {
  3330. return;
  3331. }
  3332. let sn = page.url.substring(index);
  3333. index = sn.indexOf("&");
  3334. if (index != -1) {
  3335. sn = sn.substring(0, index);
  3336. }
  3337. let device = localStorage.ANIME_deviceid;
  3338. let that = this;
  3339. let res;
  3340. $.ajax({
  3341. type: "GET",
  3342. url: `https://ani.gamer.com.tw/ajax/m3u8.php?sn=${sn}&device=${device}`,
  3343. async: false,
  3344. xhrFields: {
  3345. withCredentials: true,
  3346. },
  3347. success: function (json) {
  3348. res = JSON.parse(json);
  3349. },
  3350. });
  3351. if (res.error) {
  3352. if (res.error.code == 1015) {
  3353. let oldDuration = document.getElementsByClassName(
  3354. "vjs-duration-display"
  3355. )[0].innerHTML;
  3356. let newDuration = oldDuration;
  3357. while (oldDuration == newDuration) {
  3358. await sleep(1000);
  3359. newDuration = document.getElementsByClassName(
  3360. "vjs-duration-display"
  3361. )[0].innerHTML;
  3362. }
  3363. tryTime = 0;
  3364. }
  3365. } else {
  3366. that.media.setProxy(currentConfig.proxy);
  3367. that.media.setVideoUrl(res.src);
  3368. }
  3369. }
  3370. },
  3371. },
  3372. {
  3373. // ✅ https://ok.ru/video/2035990725937
  3374. name: "OK",
  3375. home: ["https://ok.ru/video"],
  3376. regex: /^https:\/\/ok\.ru\/video\/\d+/g,
  3377. handler: class Handler extends BaseHandler {
  3378. async parse() {
  3379. this.media.setOther(
  3380. BEST_QUALITY.ytdlp[currentConfig.bestQuality]
  3381. );
  3382. this.media.setVideoUrl(this.ytDlpParser());
  3383. this.media.setTitle("");
  3384. }
  3385. },
  3386. },
  3387. {
  3388. // ✅ https://tver.jp/episodes/epsta1xs0z
  3389. name: "TVer",
  3390. home: ["https://tver.jp"],
  3391. regex: /^https:\/\/tver\.jp\/episodes\/\w+/g,
  3392. handler: class Handler extends BaseHandler {
  3393. async parse() {
  3394. this.media.setOther(
  3395. BEST_QUALITY.ytdlp[currentConfig.bestQuality]
  3396. );
  3397. this.media.setVideoUrl(this.ytDlpParser());
  3398. this.media.setTitle("");
  3399. }
  3400. },
  3401. },
  3402. {
  3403. // ✅ https://www.lckp.top/play-with-mpv/index.html
  3404. name: "电视直播",
  3405. home: ["https://www.lckp.top/play-with-mpv/index.html"],
  3406. regex: /^https?:\/\/(www.lckp.top\/play-with-mpv|127.0.0.1:5502\/web\/tampermonkey\/Play-With-MPV)\/index.html/g,
  3407. handler: class Handler extends BaseHandler {
  3408. async parse() {
  3409. this.media.setVideoUrl(localStorage.iptvUrl);
  3410. localStorage.player = JSON.stringify(this.player);
  3411. this.media.setTitle("");
  3412. }
  3413. },
  3414. },
  3415. {
  3416. // ✅ https://www.douyin.com/
  3417. name: "抖音",
  3418. home: ["https://www.douyin.com/"],
  3419. regex: /^https?:\/\/www\.douyin\.com\/.*/g,
  3420. handler: class Handler extends BaseHandler {
  3421. constructor() {
  3422. super();
  3423. this.index = 0;
  3424. }
  3425. initCheck() {
  3426. if (super.initCheck()) {
  3427. return true;
  3428. }
  3429. let oldVideoUrl = this.media.videoUrl;
  3430. let newVideoUrl = this.videoParser();
  3431. if (oldVideoUrl && oldVideoUrl != newVideoUrl) {
  3432. return true;
  3433. }
  3434. return false;
  3435. }
  3436. async parse() {
  3437. this.media.setVideoUrl(this.videoParser());
  3438. }
  3439. videoParser() {
  3440. let videos = document.getElementsByTagName("video");
  3441. if (videos && videos.length > 0) {
  3442. this.index = videos.length > 2 ? 1 : 0;
  3443. }
  3444. let url = document
  3445. .getElementsByTagName("video")[this.index].getElementsByTagName("source")[0].src;
  3446. if (url) {
  3447. return url;
  3448. }
  3449. }
  3450. },
  3451. },
  3452. {
  3453. // ✅ https://www.mitang.tv/play/kx666U/1/3/
  3454. name: "萌番",
  3455. home: ["https://www.mitang.tv"],
  3456. regex: /^https:\/\/www\.mitang\.tv\/m\/.*/g,
  3457. handler: class Handler extends BaseHandler {
  3458. constructor() {
  3459. super();
  3460. this.addIframeListener();
  3461. }
  3462. },
  3463. },
  3464. {
  3465. name: "萌番播放器",
  3466. regex: /^https:\/\/video1\.beijcloud\.com\/player\/\?url=.*/g,
  3467. handler: class Handler extends BaseHandler {
  3468. constructor() {
  3469. super();
  3470. this.addTopListener();
  3471. }
  3472. async parse() {
  3473. this.media.setVideoUrl(this.scriptParser());
  3474. }
  3475. },
  3476. },
  3477. {
  3478. // ✅ https://www.haitu.tv/vod/play/id/47100/sid/1/nid/4.html
  3479. name: "海兔影院",
  3480. home: ["https://www.haitu.tv"],
  3481. regex: /^https:\/\/www\.haitu\.tv\/vod\/play\/.*/g,
  3482. handler: class Handler extends BaseHandler {
  3483. constructor() {
  3484. super();
  3485. this.addIframeListener();
  3486. }
  3487. },
  3488. },
  3489. {
  3490. name: "海兔影院播放器",
  3491. regex: /^https:\/\/www\.haitu\.tv\/static\/dmku\/player\/index\.php/g,
  3492. handler: class Handler extends BaseHandler {
  3493. constructor() {
  3494. super();
  3495. this.addTopListener();
  3496. }
  3497. async parse() {
  3498. this.media.setVideoUrl(config.url);
  3499. }
  3500. },
  3501. },
  3502. {
  3503. // ✅ https://www.icourse163.org/learn/ZJU-200001?tid=1470096517#/learn/content?type=detail&id=1254347726&cid=1285600901
  3504. name: "中国大学MOOC",
  3505. regex: /^https:\/\/www\.icourse163\.org\/learn\/.*\/learn\/content\?type=detail.*/g,
  3506. handler: class Handler extends BaseHandler {
  3507. async parse() {
  3508. let res = this.htmlParser();
  3509. if (!res) return;
  3510. this.media.setVideoUrl(res);
  3511. this.media.setTitle(
  3512. document.querySelector(".current > .unit-name").innerText
  3513. );
  3514. }
  3515. },
  3516. },
  3517. {
  3518. // ✅ https://www.iole.tv/vodplay/23711-1-1.html
  3519. name: "ioleTV",
  3520. regex: /^https:\/\/www\.iole\.tv\/vodplay\/.+/g,
  3521. handler: class Handler extends BaseHandler {
  3522. constructor() {
  3523. super();
  3524. this.addIframeListener();
  3525. }
  3526. },
  3527. },
  3528. {
  3529. name: "ioleTV播放器",
  3530. regex: /^https:\/\/www\.iole\.tv\/static\/player\/.*\.html/g,
  3531. handler: class Handler extends BaseHandler {
  3532. constructor() {
  3533. super();
  3534. this.addTopListener();
  3535. }
  3536. async parse() {
  3537. this.media.setVideoUrl(parent.MacPlayer.PlayUrl);
  3538. }
  3539. },
  3540. },
  3541. {
  3542. // ✅ https://www.zhihu.com/zvideo/1650574385558937600
  3543. name: "知乎视频",
  3544. regex: /^https:\/\/www\.zhihu\.com\/zvideo\/.+/g,
  3545. handler: class Handler extends BaseHandler {
  3546. constructor() {
  3547. super();
  3548. let that = this;
  3549. this.currentUrl = "";
  3550. //拦截请求以更新Url
  3551. const originOpen = XMLHttpRequest.prototype.open;
  3552. XMLHttpRequest.prototype.open = function (
  3553. method,
  3554. url,
  3555. async,
  3556. user,
  3557. password
  3558. ) {
  3559. originOpen.apply(this, arguments);
  3560. if (url.match(VIDEO_URL_REGEX)) {
  3561. that.currentUrl = url;
  3562. }
  3563. };
  3564. }
  3565. async parse() {
  3566. this.media.setVideoUrl(this.currentUrl);
  3567. }
  3568. },
  3569. },
  3570. {
  3571. // ✅ https://www.tucao.cam/play/h4092670/#1
  3572. name: "吐槽弹幕网",
  3573. regex: /^https:\/\/www\.tucao\.cam\/play\/.*/g,
  3574. handler: class Handler extends BaseHandler {
  3575. async parse() {
  3576. this.media.setVideoUrl(this.videoParser());
  3577. }
  3578. },
  3579. },
  3580. {
  3581. // ✅ http://www.susudm8.com/acg/69815/3.html
  3582. name: "速速电影院",
  3583. regex: /^https?:\/\/(www\.susudm8\.com|susudyy\.com|buding3\.com|buding6\.com)\/.+\.html/g,
  3584. handler: class Handler extends BaseHandler {
  3585. constructor() {
  3586. super();
  3587. this.addIframeListener();
  3588. }
  3589. },
  3590. },
  3591. {
  3592. name: "速速电影院播放器",
  3593. regex: /^https?:\/\/(v2\.shenjw\.com:\d+|u88\.xigua88ok\.com:\d+)\/wap\.php\?url=.+/g,
  3594. handler: class Handler extends BaseHandler {
  3595. constructor() {
  3596. super();
  3597. this.addTopListener();
  3598. }
  3599. async parse() {
  3600. this.media.setVideoUrl(this.videoParser());
  3601. }
  3602. },
  3603. },
  3604. {
  3605. name: "速速电影院播放器",
  3606. regex: /^https?:\/\/test3\.gqyy8\.com:\d+\/f\/aliplayer\.php\?url=.+/g,
  3607. handler: class Handler extends BaseHandler {
  3608. constructor() {
  3609. super();
  3610. this.addTopListener();
  3611. }
  3612. async parse() {
  3613. this.media.setVideoUrl(this.scriptParser());
  3614. }
  3615. },
  3616. },
  3617. {
  3618. // ✅ https://v.mksec.cn/index.php/vod/play/id/165438/sid/2/nid/1.html
  3619. name: "小见子的视频站",
  3620. regex: /^https?:\/\/v\.mksec\.cn\/index\.php\/vod\/play\/.+\.html/g,
  3621. handler: class Handler extends BaseHandler {
  3622. constructor() {
  3623. super();
  3624. this.addIframeListener();
  3625. }
  3626. async parse() {
  3627. this.media.setVideoUrl(player_aaaa.url);
  3628. }
  3629. },
  3630. },
  3631. {
  3632. name: "小见子的视频站播放器",
  3633. regex: /^https?:\/\/v\.mksec\.cn\/static\/player\/dplayer\.html/g,
  3634. handler: class Handler extends BaseHandler {
  3635. constructor() {
  3636. super();
  3637. this.addTopListener();
  3638. }
  3639. async parse() {
  3640. tryTime = TRY_TIME.maxParse;
  3641. }
  3642. },
  3643. },
  3644. {
  3645. // ✅ https://jh642t.dshryadqp.com/index.php/vod/play/id/51434/sid/1/nid/1.html
  3646. name: "大师兄电影网",
  3647. regex: /^https?:\/\/.*dsh.*\.com\/index\.php\/vod\/play\/.+\.html/g,
  3648. handler: class Handler extends BaseHandler {
  3649. constructor() {
  3650. super();
  3651. this.addIframeListener();
  3652. }
  3653. async parse() {
  3654. this.media.setVideoUrl(player_aaaa.url);
  3655. }
  3656. },
  3657. },
  3658. {
  3659. name: "大师兄电影网播放器",
  3660. regex: /^https?:\/\/.*dsh.*\.com\/static\/player\/dplayer\.html/g,
  3661. handler: class Handler extends BaseHandler {
  3662. constructor() {
  3663. super();
  3664. this.addTopListener();
  3665. }
  3666. async parse() {
  3667. tryTime = TRY_TIME.maxParse;
  3668. }
  3669. },
  3670. },
  3671. {
  3672. // ✅ https://www.twitch.tv/yulihong22
  3673. name: "Twitch",
  3674. home: ["https://www.twitch.tv"],
  3675. regex: /^https:\/\/www\.twitch\.tv\/\w+/g,
  3676. handler: class Handler extends BaseHandler {
  3677. async parse() {
  3678. if (page.url.indexOf("/directory") != -1) {
  3679. tryTime = TRY_TIME.maxParse;
  3680. return;
  3681. }
  3682. this.media.setOther(
  3683. BEST_QUALITY.ytdlp[currentConfig.bestQuality]
  3684. );
  3685. this.media.setVideoUrl(this.ytDlpParser());
  3686. this.media.setTitle("");
  3687. }
  3688. },
  3689. },
  3690. {
  3691. // ✅ https://jiohub.top/watch/264
  3692. // ✅ https://jiohub.top/watch/27686
  3693. name: "JOJO",
  3694. home: ["https://jiohub.top"],
  3695. regex: /^https:\/\/jiohub\.top\/watch\/.*/g,
  3696. handler: class Handler extends BaseHandler {
  3697. constructor() {
  3698. super();
  3699. let that = this;
  3700. this.currentUrl = "";
  3701. //拦截请求以更新Url
  3702. const originOpen = XMLHttpRequest.prototype.open;
  3703. XMLHttpRequest.prototype.open = function (
  3704. method,
  3705. url,
  3706. async,
  3707. user,
  3708. password
  3709. ) {
  3710. originOpen.apply(this, arguments);
  3711. if (url.match(VIDEO_URL_REGEX)) {
  3712. that.currentUrl = url;
  3713. }
  3714. };
  3715. }
  3716. async parse() {
  3717. if (this.currentUrl) {
  3718. this.media.setVideoUrl(this.currentUrl);
  3719. } else {
  3720. this.media.setVideoUrl(this.videoParser());
  3721. }
  3722. }
  3723. },
  3724. },
  3725. {
  3726. // ✅ https://www.agemys.org/play/20220403/1/1
  3727. name: "AGE动漫",
  3728. regex: /^https?:\/\/www\.agemys\.org\/play\/.+/g,
  3729. handler: class Handler extends BaseHandler {
  3730. constructor() {
  3731. super();
  3732. this.addIframeListener();
  3733. }
  3734. },
  3735. },
  3736. {
  3737. name: "AGE动漫播放器",
  3738. regex: /^https?:\/\/vip\.sp-flv\.com:\d+\/\?url=.+/g,
  3739. handler: class Handler extends BaseHandler {
  3740. constructor() {
  3741. super();
  3742. this.addTopListener();
  3743. }
  3744. async parse() {
  3745. this.media.setVideoUrl(this.videoParser());
  3746. }
  3747. },
  3748. },
  3749. {
  3750. // ✅ https://anime.girigirilove.com/playGV25353-1-1/
  3751. name: "girigiri爱动漫",
  3752. regex: /^https:\/\/anime\.girigirilove\.com\/play.+/g,
  3753. handler: class Handler extends BaseHandler {
  3754. constructor() {
  3755. super();
  3756. this.addIframeListener();
  3757. }
  3758. },
  3759. },
  3760. {
  3761. name: "girigiri爱动漫播放器",
  3762. regex: /^https:\/\/anime\.girigirilove\.com\/addons\/dp\/player\/dp\.php\?.+/g,
  3763. handler: class Handler extends BaseHandler {
  3764. constructor() {
  3765. super();
  3766. this.addTopListener();
  3767. }
  3768. async parse() {
  3769. this.media.setVideoUrl(config.url);
  3770. }
  3771. },
  3772. },
  3773. {
  3774. name: "girigiri爱动漫播放器",
  3775. regex: /^https:\/\/play\.girigirilove\.top\/love\?url=.+/g,
  3776. handler: class Handler extends BaseHandler {
  3777. constructor() {
  3778. super();
  3779. this.addTopListener();
  3780. }
  3781. async parse() {
  3782. this.media.setVideoUrl(this.urlParser());
  3783. }
  3784. },
  3785. },
  3786. {
  3787. // ✅ https://www.cycdm01.top/watch/3388/1/1.html
  3788. name: "次元城动漫",
  3789. home: ["https://www.cycdm01.top"],
  3790. regex: /^https:\/\/www\.cycdm01\.top\/watch\/.*/g,
  3791. handler: class Handler extends BaseHandler {
  3792. constructor() {
  3793. super();
  3794. this.addIframeListener();
  3795. }
  3796. },
  3797. },
  3798. {
  3799. name: "次元城动漫播放器",
  3800. regex: /^https:\/\/player\.cycdm01\.top\/\?url=.+/g,
  3801. handler: class Handler extends BaseHandler {
  3802. constructor() {
  3803. super();
  3804. this.addTopListener();
  3805. }
  3806. async parse() {
  3807. let url = this.videoParser();
  3808. if (url) {
  3809. let index = url.indexOf("?");
  3810. if (index != -1) {
  3811. url =
  3812. url.substring(0, index + 1) +
  3813. encodeURIComponent(url.substring(index + 1));
  3814. }
  3815. this.media.setVideoUrl(url);
  3816. }
  3817. }
  3818. },
  3819. },
  3820. {
  3821. // ✅ https://www.xgcartoon.com/video/haizeiwangriyu-weitianrongyilang/QMqftG5xrN.html
  3822. name: "西瓜卡通",
  3823. home: ["https://www.xgcartoon.com"],
  3824. regex: /^https:\/\/www\.xgcartoon\.com\/video\/.*/g,
  3825. handler: class Handler extends BaseHandler {
  3826. constructor() {
  3827. super();
  3828. this.addIframeListener();
  3829. }
  3830. },
  3831. },
  3832. {
  3833. // ✅ https://pframe.xgcartoon.com/player.htm?vid=ffc8786e-5da3-46a9-8014-d640a75265b0&autoplay=false
  3834. name: "西瓜卡通播放器",
  3835. regex: /^https:\/\/pframe\.xgcartoon\.com\/player\.htm\?vid=.*/g,
  3836. handler: class Handler extends BaseHandler {
  3837. constructor() {
  3838. super();
  3839. this.addTopListener();
  3840. let that = this;
  3841. this.currentUrl = "";
  3842. //拦截请求以更新Url
  3843. const originOpen = XMLHttpRequest.prototype.open;
  3844. XMLHttpRequest.prototype.open = function (
  3845. method,
  3846. url,
  3847. async,
  3848. user,
  3849. password
  3850. ) {
  3851. originOpen.apply(this, arguments);
  3852. if (url.match(VIDEO_URL_REGEX)) {
  3853. that.currentUrl = url;
  3854. }
  3855. };
  3856. }
  3857. async parse() {
  3858. if (this.currentUrl) {
  3859. this.media.setVideoUrl(this.currentUrl);
  3860. }
  3861. }
  3862. },
  3863. },
  3864. {
  3865. name: "西瓜卡通播放器",
  3866. regex: /^https:\/\/iframe\.mediadelivery\.net\/.*/g,
  3867. handler: class Handler extends BaseHandler {
  3868. constructor() {
  3869. super();
  3870. this.addTopListener();
  3871. }
  3872. async parse() {
  3873. this.media.setVideoUrl(hls.url);
  3874. }
  3875. },
  3876. },
  3877. {
  3878. name: "AList",
  3879. regex: /^https?:\/\/[^\/]+\/.*\.(mp4|mkv|flv)/g,
  3880. handler: class Handler extends BaseHandler {
  3881. async parse() {
  3882. let url = this.videoParser();
  3883. let data = {
  3884. path: decodeURIComponent(location.pathname),
  3885. password: localStorage.getItem("browser-password"),
  3886. };
  3887. if (!url && tryTime < 3) {
  3888. $.ajax({
  3889. type: "POST",
  3890. url: `/api/fs/get`,
  3891. dataType: "json",
  3892. data: JSON.stringify(data),
  3893. xhrFields: {
  3894. withCredentials: true,
  3895. },
  3896. async: false,
  3897. contentType: "application/json",
  3898. success: function (res) {
  3899. if (res.code == 200) {
  3900. url = res.data.raw_url;
  3901. }
  3902. },
  3903. });
  3904. }
  3905. if (url) {
  3906. let index = url.indexOf("?");
  3907. if (index != -1) {
  3908. url =
  3909. url.substring(0, index + 1) +
  3910. encodeURIComponent(url.substring(index + 1));
  3911. }
  3912. this.media.setVideoUrl(url);
  3913. this.media.setTitle(document.title);
  3914. }
  3915. }
  3916. },
  3917. },
  3918. ];
  3919. // 初始化
  3920. async function init(flag) {
  3921. // 加载页面信息
  3922. page = {
  3923. host: window.location.host,
  3924. url: window.location.href,
  3925. isFullScreen: false,
  3926. };
  3927. // 清除 handler
  3928. if (handler) {
  3929. handler = undefined;
  3930. if (document.getElementById(ID.buttonDiv)) {
  3931. document.getElementById(ID.buttonDiv).style.display = "none";
  3932. }
  3933. }
  3934. // 生成 handler
  3935. for (let i = 0; i < websiteList.length; i++) {
  3936. if (page.url.match(websiteList[i].regex)) {
  3937. handler = new websiteList[i].handler();
  3938. break;
  3939. }
  3940. }
  3941. if (flag && page.url.startsWith("https://www.bilibili.com/festival/")) {
  3942. await sleep(1500);
  3943. }
  3944. // 尝试解析页面视频
  3945. if (handler) {
  3946. tryTime = 0;
  3947. while (tryTime < TRY_TIME.maxParse) {
  3948. await sleep(tryTime * 1000 + 700);
  3949. if (!handler.media.videoUrl) {
  3950. try {
  3951. await handler.parse();
  3952. } catch (error) {
  3953. console.log("Play-With-MPV:解析失败:" + error);
  3954. }
  3955. }
  3956. tryTime++;
  3957. }
  3958. } else {
  3959. console.log("Play-With-MPV:暂无此网页解析器(" + page.url + ")");
  3960. }
  3961. }
  3962. // 开始执行
  3963. init();
  3964. setInterval(() => {
  3965. if (handler) {
  3966. if (handler.initCheck()) {
  3967. init(true);
  3968. }
  3969. } else if (window.location.href != page.url) {
  3970. init();
  3971. }
  3972. }, TIME.refresh);