Greasy Fork is available in English.

虎牙Plus

虎牙自动领取任务经验、开宝箱,复制直播流链接,简化页面,去广告, 夜间模式,自动进入剧场模式, 我的订阅页面视频预览

  1. 'use strict';
  2. // ==UserScript==
  3. // @name 虎牙Plus
  4. // @namespace http://tampermonkey.net/
  5. // @icon https://www.huya.com/favicon.ico
  6. // @version 1.0.39
  7. // @description 虎牙自动领取任务经验、开宝箱,复制直播流链接,简化页面,去广告, 夜间模式,自动进入剧场模式, 我的订阅页面视频预览
  8. // @author Francis
  9. // @match *://*.huya.com/*
  10. // @grant GM_setClipboard
  11. // @grant GM_xmlhttpRequest
  12. // @grant unsafeWindow
  13. // @license MIT
  14. // @require https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.1/flv.min.js
  15. // @noframes
  16. // ==/UserScript==
  17.  
  18. let $;
  19.  
  20. function addUi(){
  21. let style = document.createElement('style');
  22. style.appendChild(document.createTextNode(`
  23. span.copy-stream-link:after {
  24. display: none;
  25. position: absolute;
  26. content: "";
  27. right: -20px;
  28. top: 6px;
  29. width: 18px;
  30. height: 18px;
  31. overflow: hidden;
  32. background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0YjMyYjVhNy1jMThjLTg2NDItYjRlMy04NzdmMjFiZjkzZTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEJCNDhFNEIxMDZBMTFFN0IzQUNGNTM3RTZBMjEyRTQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEJCNDhFNEExMDZBMTFFN0IzQUNGNTM3RTZBMjEyRTQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MmFlNTQ3NDgtZjlmZS04NjQwLTg0ZTgtMmY4ZTcwYjc2YTkyIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6NWE5YjI1YjQtZmE1ZC0xMWU2LWI1MmYtYWM2NWYxZGRlZjQ2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KzIZ1wAAAz9JREFUeNqslm1IU1EYx5/dzSW+pWVZppimzV7pzZWVIhGFZiIEgmFlREGmH4qEJOhFqEVf+tCXviiCZC/4Icga0ocwIyURcmnO2ZIyM9+auqnb1NnzXM5sm7u719wffrC7c+7zP+fc55zzyDQN+0BEMiQNOYYcQBKRCNZmQr4iH5A6pBGZ8xVM4aONQwqRMmbiTVEMGkgpM9cgVYhDKKg3xSPNSIUPM29KZO80sxiSDDOQj0gK/L9SWIx0McMjSD0SCUsXxXiDHBUyVCG1iBL8JyWLqfI0lCPVSCj4WWtDN4ekxp6uZh7zWXpmid9sYfpzSkhbfwHU6/JBJuNSekZbCn+bOysUbJ+V+dNsTYgKspNvQmRQPMw4bKDt0gCaXcOmSgXLpER/GMnwC+2NLYD09eeBkylganoMajuuQt94u3PLpJNhlj/MgpUrISf5FsSF7+GfLfZheKIrhpHJ767dsshwv1gwGm3YstUwav3ltT0ufDea3eZNSeO2ATQrAdNUr2fXVDJM8j3yFZC76Q6sCk6AZ58vQ7/5i1u7OuYkZMQX4aD4JASzbRBq2i7h4Pq8hdvIuRzECxQdugUKd1ZB7PIdEKgIg/ztD/nfzizMSS6HQwkl82a2GQs8b78iZEaKEDy8t0ZlQmZSGci5gH+7WB4EedseQH33fdgVfYIfkFPTDismSCkMTRhB7LYwsRPfTQOWLrDOmPkldVUAFwjZqhseveegTl8OvWOfxNLBREva7a1laOIb1OiK+GwTU0PPI+gafislmQ1k2CTUSilNCUBZJ6SOwXpo6q2WunuayPCVrx5/pn6gaRGMWfth4bIbQGu4K3bJu+o1Gb5jN7WgaP89bruI++rn/H+UkS86r+PRZZdqRh6NHBvePbHetKz0TWnGJK1B4zYACSIPh/zw2Rh60LEjLtrXG/bZSdBjclhsQ6AbeLkYs1akmCbnvA9nkVN0BIq9OWEfgZa+p4sxo5gFzMPtxtcjeTQRP95UdhZTL1TTaJFcKTOVOLNcFtNn1aZlt3/rEsxaWQyt1LqUlkCNnEOMizAysnfUrssotfKmyrmSVdEHkePs7tzgUeobWalPafteqOJ26q8AAwB8rQG0tt5ioQAAAABJRU5ErkJggg==);
  33. background-size: 18px 18px;
  34. }
  35.  
  36. span.copy-stream-link.copy-success:after {
  37. display: block;
  38. }
  39.  
  40. .huya-plus-btn{
  41. display: block;
  42. font-size: 11px;
  43. padding:0 10px;
  44. color:#b08444;
  45. background:#FFD29E;
  46. border-radius:15px;
  47. user-select: none;
  48. transition:all .5s;
  49. }
  50.  
  51. .huya-plus-btn:hover{
  52. color:#FFF;
  53. background:#ffa801;
  54. }
  55.  
  56. #huya-ab,
  57. .player-banner-gift,
  58. #player-marquee-wrap,
  59. .room-gg-chat,
  60. .room-mod-ggTop,
  61. #hy-nav-download,
  62. .hy-nav-kaibo,
  63. #J_roomGameBuy,
  64. .jump-to-phone,
  65. #week-star-btn,
  66. .g-gift,
  67. #J_bigStreamerStage,
  68. #J_hySide,
  69. .room-business-game,
  70. #J_hostChannel,
  71. #J_BusinessGameRoot,
  72. #sidebarBanner,
  73. .mod-news-section,
  74. .mod-index-list>.live-box,
  75. #J_adCategory,
  76. #huya-ab-fixed,
  77. #player-full-input
  78. {
  79. display:none !important;
  80. }
  81.  
  82. body,
  83. .duya-header-wrap,
  84. #main_col,
  85. .room-hd-l,
  86. .player-gift-wrap,
  87. .chat-room__ft,
  88. .jspPane,
  89. #J_profileNotice>div,
  90. .week-rank__btn,
  91. .J_msg,
  92. .chat-room__list,
  93. .msg-nobleEnter,
  94. .msg-nobleEnter>div,
  95. .msg-nobleSpeak,
  96. .player-face-arrow,
  97. #player-gift-tip,
  98. .jspVerticalBar,
  99. .illegal-report,
  100. .subscribe-hd.sub-on,
  101. .huya-plus-btn,
  102. #player-gift-tip bottom,
  103. #player-gift-tip btn,
  104. .fansBadge-box,
  105. .nav-expand-list,
  106. .tt-user-card,
  107. .share-entrance,
  108. .search-suggest,
  109. .u-links,
  110. .entrance-expand,
  111. .gameBuy-bd,
  112. .guide-to-app,
  113. .chat-room__wrap,
  114. #J_profileNotice,
  115. .msg-onTVLottery,
  116. .room-core,
  117. .msg-noble,
  118. #J_box_msgOfKing,
  119. .msg-of-king,
  120. .subscribe-hd.sub-on,
  121. .nav-expand-game dd a,
  122. .subscribe-hd.sub-on,
  123. .match-item,
  124. .hy-nav-link,
  125. .hy-nav-title,
  126. .nav-user-title,
  127. #J_roomTitle,
  128. .msg,
  129. .subscribe-hd.sub-on,
  130. .cont-item,
  131. .week-rank__btn,
  132. .week-rank-name,
  133. .msg-nobleEnter,
  134. .peo-name,
  135. .search-item,
  136. .history-bd .new-clickstat,
  137. .from,
  138. .to,
  139. .nav-expand-game dd a,
  140. .hy-header-match-preview-name,
  141. #pub_msg_input,
  142. #search-bar-input:focus,
  143. .msg-noble,
  144. #J_box_msgOfKing,
  145. #J_hyUserCard .u-assets,
  146. .room-sidebar,
  147. .duya-header-wrap,
  148. .week-rank__unit,
  149. .chat-room__input,
  150. .chatNotice,
  151. #J_profileNotice,
  152. .plaer-face-icon-bg,
  153. .chat-room__ft__chat,
  154. #tipsOrchat,
  155. .week-rank__btn.active,
  156. #pub_msg_input,
  157. #search-bar-input,
  158. .week-rank__bd li,
  159. .subscribe-live-item,
  160. .subscribe-live-item .txt .msg-row .nick,
  161. .list-hd .title,
  162. .match_body_wrap
  163. {
  164. transition: background .3s, background-color .3s, color .3s, border-color .3s;
  165. }
  166.  
  167. .live-box .box-hd .more-list li,
  168. .live-box .box-hd .more-list li:hover,
  169. .night-mode .mod-list .box-hd .filter dd .tag-layer,
  170. .nav-expand-game dd a{
  171. border-color: #464646 !important;
  172. }
  173.  
  174. body.night-mode,
  175. .night-mode .duya-header-wrap,
  176. .night-mode #main_col,
  177. .night-mode .room-hd-l,
  178. .night-mode .player-gift-wrap,
  179. .night-mode .chat-room__ft,
  180. .night-mode .jspPane,
  181. .night-mode #J_profileNotice>div,
  182. .night-mode .week-rank__btn,
  183. .night-mode .J_msg,
  184. .night-mode .chat-room__list,
  185. .night-mode .msg-nobleEnter,
  186. .night-mode .msg-nobleEnter>div,
  187. .night-mode .msg-nobleSpeak,
  188. .night-mode .player-face-arrow,
  189. .night-mode #player-gift-tip,
  190. .night-mode .jspVerticalBar,
  191. .night-mode .illegal-report,
  192. .night-mode .subscribe-hd.sub-on,
  193. .night-mode #player-gift-tip bottom,
  194. .night-mode #player-gift-tip btn,
  195. .night-mode .fansBadge-box,
  196. .night-mode .nav-expand-list,
  197. .night-mode .tt-user-card,
  198. .night-mode .share-entrance,
  199. .night-mode .search-suggest,
  200. .night-mode .u-links,
  201. .night-mode .entrance-expand,
  202. .night-mode .gameBuy-bd,
  203. .night-mode .guide-to-app,
  204. .night-mode .chat-room__wrap,
  205. .night-mode #J_profileNotice,
  206. .night-mode .msg-onTVLottery,
  207. .night-mode .room-core,
  208. .night-mode .msg-noble,
  209. .night-mode .match_body_wrap,
  210. .night-mode #J_roomHdR,
  211. .night-mode .msg-watchTogetherVip,
  212. .night-mode .room-weeklyRankList-content>div,
  213. .night-mode .room-weeklyRankList-nav-item,
  214. .night-mode .huya-footer,
  215. .night-mode .program-preview-box,
  216. .night-mode .program-preview-box .preview-bd,
  217. .night-mode .star-box .star-content,
  218. .night-mode div[class^="box-noble-level-"]
  219. {
  220. background-color: rgb(47, 48, 53) !important;
  221. }
  222.  
  223. .night-mode #J_box_msgOfKing,
  224. .night-mode .msg-of-king
  225. {
  226. background: rgb(47, 48, 53) !important;
  227. }
  228.  
  229. .night-mode .subscribe-hd.sub-on,
  230. .night-mode .nav-expand-game dd a,
  231. .night-mode .subscribe-live-item,
  232. .night-mode .room-weeklyRankList-nav-item.room-weeklyRankList-nav-item-active,
  233. .night-mode .game-live-item,
  234. .night-mode .game-live-item .txt .num,
  235. .night-mode .j_anchor_label,
  236. .night-mode .g-gameCard-item,
  237. .night-mode .mod-list .box-hd .filter dd .tag-layer
  238. {
  239. background-color: #464646 !important;
  240. }
  241.  
  242. .night-mode .subscribe-hd.sub-on,
  243. .night-mode .match-item,
  244. .night-mode .mod-list .box-hd .title a,
  245. .night-mode .game-live-item a.title,
  246. .night-mode .j_index-game-title,
  247. .night-mode .live-box .box-hd .more-list li a,
  248. .night-mode .live-box_funny .box-hd .title span,
  249. .night-mode .g-gameCard-fullName
  250. {
  251. color: #8e8a8a !important;
  252. }
  253.  
  254. .night-mode .hy-nav-link,
  255. .night-mode .hy-nav-title,
  256. .night-mode .nav-user-title,
  257. .night-mode #J_roomTitle,
  258. .night-mode .msg,
  259. .night-mode .subscribe-hd.sub-on,
  260. .night-mode .cont-item,
  261. .night-mode .week-rank__btn,
  262. .night-mode .week-rank-name,
  263. .night-mode .msg-nobleEnter,
  264. .night-mode .peo-name,
  265. .night-mode .search-item,
  266. .night-mode .history-bd .new-clickstat,
  267. .night-mode .from,
  268. .night-mode .to,
  269. .night-mode .nav-expand-game dd a,
  270. .night-mode .hy-header-match-preview-name,
  271. .night-mode #pub_msg_input,
  272. .night-mode #search-bar-input:focus,
  273. .night-mode .msg-noble,
  274. .night-mode #J_box_msgOfKing,
  275. .night-mode #J_hyUserCard .u-assets,
  276. .night-mode .follow-ctrl,
  277. .night-mode .subscribe-live-item .txt .msg-row .nick,
  278. .night-mode .list-hd .title,
  279. .night-mode .nick,
  280. .night-mode .fansBadge-hig,
  281. .night-mode .room-weeklyRankList-nav-item,
  282. .night-mode .room-weeklyRankList-content>div,
  283. .night-mode .g-gameCard-fullName:hover,
  284. .night-mode #chat-room__list span[class^="msg-text-"]
  285. {
  286. color: #E7E7E7 !important;
  287. }
  288.  
  289. .night-mode .room-sidebar,
  290. .night-mode .duya-header-wrap,
  291. .night-mode .week-rank__unit,
  292. .night-mode .chat-room__input,
  293. .night-mode .chatNotice,
  294. .night-mode #J_profileNotice,
  295. .night-mode .plaer-face-icon-bg,
  296. .night-mode .chat-room__ft__chat,
  297. .night-mode #tipsOrchat
  298. {
  299. border-color: #3e3e3e !important;
  300. }
  301.  
  302. .night-mode .week-rank__btn.active,
  303. .night-mode #pub_msg_input,
  304. .night-mode #J_weekRankList li:hover,
  305. .night-mode #J_fansRankList li:hover,
  306. .night-mode .seat-item:hover,
  307. .night-mode #search-bar-input,
  308. .night-mode .search-item:hover,
  309. .night-mode .video-link:hover,
  310. .night-mode .history-bd .new-clickstat:hover,
  311. .night-mode .video-item:hover,
  312. .night-mode .match-item:hover,
  313. .night-mode .hy-header-match-preview li:hover,
  314. .night-mode .week-rank__bd li:hover,
  315. .night-mode .follow-ctrl,
  316. .night-mode #J_roomWeeklyRankListRoot ul>li:hover,
  317. .night-mode [class^="seat-item-"]:hover
  318. {
  319. background-color: #565656 !important;
  320. }
  321.  
  322. .night-mode .msg-bubble
  323. {
  324. background-image: none !important;
  325. }
  326.  
  327. .night-mode .subscribe-live-item:hover{
  328. box-shadow: 2px 2px 10px #565656 !important;
  329. }
  330.  
  331. .night-mode-btn-wrapper,.setting-btn-wrapper{
  332. position: fixed;
  333. right: 20px;
  334. margin-left: 10px;
  335. height: 60px;
  336. display: flex;
  337. align-items: center;
  338. justify-content: center;
  339. }
  340.  
  341. .night-mode-switch-btn,.setting-btn{
  342. width: 26px;
  343. height: 26px;
  344. border-radius: 13px;
  345. }
  346.  
  347. .huyaplus-page-full-mode #player-wrap{
  348. height: 100% !important;
  349. }
  350.  
  351. .huyaplus-page-full-mode #player-gift-wrap{
  352. position: relative;
  353. bottom: 0px !important;
  354. transition: all .5s;
  355. }
  356.  
  357. .huyaplus-page-full-mode #player-ctrl-wrap{
  358. position: relative;
  359. bottom: 0 !important;
  360. transition: all .5s !important;
  361. }
  362.  
  363. #player-ctrl-wrap.show, #player-gift-wrap.show{
  364. bottom: 100px !important;
  365. }
  366.  
  367. .night-mode-icon,.setting-icon{
  368. fill: #8A8A8A;
  369. }
  370.  
  371. .night-mode .night-mode-icon,.night-mode .setting-icon{
  372. fill: #AEAEAE;
  373. }
  374.  
  375. .setting-panel-wrapper{
  376. visibility: hidden;
  377. width: 200px;
  378. height: 0;
  379. position: absolute;
  380. top: 100%;
  381. background: #777777;
  382. padding: 10px;
  383. transition: height .3s;
  384. border-bottom-right-radius:5px;
  385. border-bottom-left-radius:5px;
  386. }
  387.  
  388. .setting-btn-wrapper:hover .setting-panel-wrapper{
  389. visibility: visible;
  390. height: 200px;
  391. }
  392.  
  393. .video-previewing .item-mask,
  394. .video-previewing .btn-link__hover_i{
  395. visibility: hidden;
  396. }
  397.  
  398. .shield-keyword-pane{
  399. padding: 15px;
  400. }
  401.  
  402. .shield-keyword-pane #shield-keyword{
  403. display: flex;
  404. align-items: center;
  405. }
  406.  
  407. .shield-keyword-pane #shield-keyword-input{
  408. width: 100%;
  409. height: 75px;
  410. margin-top: 5px;
  411. resize: none;
  412. outline: none;
  413. background: #565656;
  414. color: #E7E7E7;
  415. padding: 2px 10px;
  416. box-sizing: border-box;
  417. overflow: overlay;
  418. }
  419.  
  420. .shield-keyword-pane #shield-keyword-input:disabled{
  421. cursor: not-allowed;
  422. }
  423.  
  424. .player-ctrl-wrap .player-danmu-pane .shield-keyword-pane .danmu-shield-cbox {
  425. display: inline-block;
  426. width: 10px;
  427. height: 10px;
  428. border: 1px solid #999;
  429. }
  430.  
  431. ::-webkit-scrollbar
  432. {
  433. width:5px;
  434. height:5px;
  435. background-color:transparent;;
  436. }
  437.  
  438. ::-webkit-scrollbar-track
  439. {
  440. -webkit-box-shadow:inset 0 0 1px rgba(0,0,0,0.3);
  441. border-radius:2px;
  442. background-color:transparent;
  443. }
  444.  
  445. ::-webkit-scrollbar-thumb
  446. {
  447. border-radius:2px;
  448. -webkit-box-shadow:inset 0 0 1px rgba(0,0,0,.3);
  449. background-color: #df8300;
  450. }
  451.  
  452. .huyaplus-player-control-btn{
  453. width:20px;
  454. height:20px;
  455. margin-left: 10px;
  456. background-size: 20px 20px;
  457. }
  458.  
  459. #huyaplus-player-control{
  460. display:flex;
  461. align-items: center;
  462. width:90px;
  463. height:24px;
  464. }
  465.  
  466. #player-mirror-btn{
  467. background-image: url(data:image/png;base64,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);
  468. }
  469.  
  470. #player-mirror-btn:hover{
  471. background-image: url(data:image/png;base64,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);
  472. }
  473.  
  474. #player-rotate-btn{
  475. background-image: url(data:image/png;base64,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);
  476. }
  477.  
  478. #player-rotate-btn:hover{
  479. background-image: url(data:image/png;base64,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);
  480. }
  481.  
  482. #player-video>#hy-video {
  483. transition: transform .5s;
  484. transform-origin: center;
  485. }
  486.  
  487. .huyaplus-copy-stream-wrapper{
  488. height: 28px;
  489. cursor: pointer;
  490. display: flex;
  491. position: absolute;
  492. right: 90px;
  493. top: 30px;
  494. z-index: 1000;
  495. background: transparent;
  496. }
  497.  
  498. .huyaplus-copy-stream-wrapper .copy-stream-link{
  499. position: relative;
  500. }
  501.  
  502. .huyaplus-copy-stream-wrapper .huyaplus-copy-stream-btn
  503. {
  504. line-height: 28px;
  505. margin-right: 20px;
  506. font-weight: 500;
  507. font-size: 12px;
  508. color: #FFF;
  509. background: rgba(34,34,34,.6);
  510. }
  511.  
  512. .huyaplus-copy-stream-wrapper .huyaplus-copy-stream-btn:hover
  513. {
  514. background: #ff9600;
  515. }
  516.  
  517. .quick-chat-bar-wrapper{
  518. width: 100%;
  519. height: 40px;
  520. position: absolute;
  521. bottom: 200px;
  522. background: transparent;
  523. display: flex;
  524. justify-content:center;
  525. }
  526.  
  527. .quick-chat-bar-wrapper .quick-chat-input-wrapper{
  528. width: 400px;
  529. height: 100%;
  530. }
  531.  
  532. .quick-chat-bar-wrapper #quick-chat-input{
  533. display: block;
  534. width: 100%;
  535. height: 100%;
  536. background: #FFF;
  537. outline: none;
  538. border:none;
  539. padding: 5px 10px;
  540. box-sizing: border-box;
  541. border-top-left-radius: 5px;
  542. border-bottom-left-radius: 5px;
  543. }
  544.  
  545. .quick-chat-bar-wrapper .quick-chat-input-count {
  546. background: #fff;
  547. padding: 0 10px;
  548. line-height: 40px;
  549. color: #a0a0a0;
  550. }
  551.  
  552. .quick-chat-bar-wrapper .quick-chat-send-btn{
  553. width: 80px;
  554. height: 100%;
  555. line-height: 40px;
  556. text-align: center;
  557. background: #ff9600;
  558. color: #FFF;
  559. border-top-right-radius: 5px;
  560. border-bottom-right-radius: 5px;
  561. }
  562.  
  563. .ele-hide{
  564. display: none;
  565. }
  566.  
  567. .quick-chat-send-btn.div-disabled{
  568. cursor: not-allowed;
  569. background: #919191;
  570. }
  571.  
  572. #videoContainer{
  573. outline: none;
  574. }
  575.  
  576. #player-joysound-btn{
  577. background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjIgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+am95c291bmQvbm9ybWFsPC90aXRsZT4KICAgIDxnIGlkPSJqb3lzb3VuZC9ub3JtYWwiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuNzg1NzUwLCAwLjcxNDIyNSkiIGZpbGw9IiNGRkZGRkYiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNi40Mjg2LDAgTDE2LjQyODYsOS42NDMgQzE2LjQyODYsMTQuMTM0NTUyNyAxMi44MjMzNjY3LDE3Ljc4NDI4OCA4LjM0ODkzNjE4LDE3Ljg1NjE2OTYgTDguMTg3MTgxNTMsMTcuODU3MjU2MSBMOC4xODcxODE1MywxNy44NTcyNTYxIEw3Ljg1NzEsMTcuODU3MjU2MSBMNy44NTcxMzg5NiwxNy44NDk2NDEgQzMuNDkyMzgwMTMsMTcuNjYyMDc0NCAwLDE0LjA1MzEzNDEgMCw5LjY0MzA1IEMwLDUuMTEzMTE1MDUgMy42ODQ0MDAyLDEuNDI4NTUgOC4yMTQyNSwxLjQyODU1IEM5LjcwMDc5OTEzLDEuNDI4NTUgMTEuMDk2Mjk4NSwxLjgyNTM1NTAyIDEyLjMwMDQxNTEsMi41MTg2MjMzMSBDMTIuNzQ5NTY4NywxLjA2MDE2NjAxIDE0LjEwODIyMzYsMCAxNS43MTQzNSwwIEwxNi40Mjg2LDAgWiBNOC4yMTQyNSwyLjQyODU1IEM0LjIzNjY5NDk2LDIuNDI4NTUgMSw1LjY2NTM4OTc4IDEsOS42NDMwNSBDMSwxMy41MDA3NTA4IDQuMDQ0NzczOCwxNi42NjE3MzMzIDcuODU3MDg4OTksMTYuODQ4NTY2OCBMNy44NTcwNjI1NCwxNC41NzUwMTcgQzYuNzcyOTg2NzEsMTQuNDk3MzEwMyA1Ljc4NDYxNzE5LDE0LjA2ODc0NzcgNS4wMDUxODMxMSwxMy40MDI1NTc4IEw0LjkyMjQ3Njk3LDEzLjMzMDI3NjIgTDQuODA0OTI0NjgsMTMuMjIxNzk0MSBDMy44NTkyOTc1OSwxMi4zMjA2MjgzIDMuMjY5MjUsMTEuMDQ5NTQ5NiAzLjI2OTI1LDkuNjQzMDI1IEMzLjI2OTI1LDYuOTE1ODgyNjMgNS40ODcxMDc2Myw0LjY5ODAyNSA4LjIxNDI1LDQuNjk4MDI1IEM5LjgxNDAwNzU2LDQuNjk4MDI1IDExLjIzODQ1MjcsNS40NjEyMTIzMyAxMi4xNDI3NjQ1LDYuNjQyNzEyMTUgTDEyLjE0Mjc2NDUsMy41OTQ2NDQ5MSBDMTEuMDExNTg5NiwyLjg1NzM2NzY1IDkuNjYxOTk0NDksMi40Mjg1NSA4LjIxNDI1LDIuNDI4NTUgWiBNOC4yMTQyNSw1LjY5ODAyNSBDNi4wMzkzOTIzNyw1LjY5ODAyNSA0LjI2OTI1LDcuNDY4MTY3MzcgNC4yNjkyNSw5LjY0MzAyNSBDNC4yNjkyNSwxMS42Njk1MzczIDUuODA2NDgyNjQsMTMuMzQ0NzQ5OCA3Ljc3NTg4ODE1LDEzLjU2MzU2NzIgTDcuODU3MSwxMy41NzE1IEw4LjIxNDM1LDEzLjU3MTUgQzEwLjM0OTYsMTMuNTcxNSAxMi4wODY4NSwxMS44NjggMTIuMTQxNiw5Ljc0NiBMMTIuMTQyNjQ2OCw5LjY0MyBMMTIuMTQyNjQ2OCw5LjI4MjMzMjMzIEMxMS45NTk4NTg1LDcuMjc1NzUwMjYgMTAuMjY3NDgyMyw1LjY5ODAyNSA4LjIxNDI1LDUuNjk4MDI1IFogTTguMjE0MjUsNy41MDAwMjUgQzkuMzk2MTkyODQsNy41MDAwMjUgMTAuMzU3LDguNDYwOTMzMDkgMTAuMzU3LDkuNjQzMDI1IEMxMC4zNTcsMTAuODI0OTE3NCA5LjM5NjE0MjM3LDExLjc4NTc3NSA4LjIxNDI1LDExLjc4NTc3NSBDNy4wMzIxODIxNSwxMS43ODU3NzUgNi4wNzE1LDEwLjgyNDk5MTkgNi4wNzE1LDkuNjQzMDI1IEM2LjA3MTUsOC40NjA4NTg1NSA3LjAzMjEzMTY5LDcuNTAwMDI1IDguMjE0MjUsNy41MDAwMjUgWiBNOC4yMTQyNSw4LjUwMDAyNSBDNy41ODQ0NjM0OCw4LjUwMDAyNSA3LjA3MTUsOS4wMTMwOTYyNyA3LjA3MTUsOS42NDMwMjUgQzcuMDcxNSwxMC4yNzI3MzA3IDcuNTg0NDkwNDIsMTAuNzg1Nzc1IDguMjE0MjUsMTAuNzg1Nzc1IEM4Ljg0Mzg1NzYzLDEwLjc4NTc3NSA5LjM1NywxMC4yNzI2MzI2IDkuMzU3LDkuNjQzMDI1IEM5LjM1Nyw5LjAxMzE5NDMzIDguODQzODg0NTcsOC41MDAwMjUgOC4yMTQyNSw4LjUwMDAyNSBaIiBpZD0i5b2i54q2Ij48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=");
  578. background-size: 24px;
  579. background-repeat: no-repeat;
  580. }
  581.  
  582. #player-joysound-btn.active{
  583. background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjJweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjIgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8dGl0bGU+am95c291bmQvc2VsZWN0ZWQ8L3RpdGxlPgogICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSI1MCUiIHkxPSIwJSIgeDI9IjUwJSIgeTI9IjEwMCUiIGlkPSJsaW5lYXJHcmFkaWVudC0xIj4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0YwQ0I5NSIgb2Zmc2V0PSIwJSI+PC9zdG9wPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjRTlCRTgwIiBvZmZzZXQ9IjEwMCUiPjwvc3RvcD4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPC9kZWZzPgogICAgPGcgaWQ9ImpveXNvdW5kL3NlbGVjdGVkIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i57yW57uEIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjc4NTc1MCwgMC43MTQyMjUpIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8cGF0aCBkPSJNMTYuNDI4NiwwIEwxNi40Mjg2LDkuNjQzIEMxNi40Mjg2LDE0LjEzNDU1MjcgMTIuODIzMzY2NywxNy43ODQyODggOC4zNDg5MzYxOCwxNy44NTYxNjk2IEw4LjE4NzE4MTUzLDE3Ljg1NzI1NjEgTDguMTg3MTgxNTMsMTcuODU3MjU2MSBMNy44NTcxLDE3Ljg1NzI1NjEgTDcuODU3MTM4OTYsMTcuODQ5NjQxIEMzLjQ5MjM4MDEzLDE3LjY2MjA3NDQgMCwxNC4wNTMxMzQxIDAsOS42NDMwNSBDMCw1LjExMzExNTA1IDMuNjg0NDAwMiwxLjQyODU1IDguMjE0MjUsMS40Mjg1NSBDOS43MDA3OTkxMywxLjQyODU1IDExLjA5NjI5ODUsMS44MjUzNTUwMiAxMi4zMDA0MTUxLDIuNTE4NjIzMzEgQzEyLjc0OTU2ODcsMS4wNjAxNjYwMSAxNC4xMDgyMjM2LDAgMTUuNzE0MzUsMCBMMTYuNDI4NiwwIFogTTguMjE0MjUsMi40Mjg1NSBDNC4yMzY2OTQ5NiwyLjQyODU1IDEsNS42NjUzODk3OCAxLDkuNjQzMDUgQzEsMTMuNTAwNzUwOCA0LjA0NDc3MzgsMTYuNjYxNzMzMyA3Ljg1NzA4ODk5LDE2Ljg0ODU2NjggTDcuODU3MDYyNTQsMTQuNTc1MDE3IEM2Ljc3Mjk4NjcxLDE0LjQ5NzMxMDMgNS43ODQ2MTcxOSwxNC4wNjg3NDc3IDUuMDA1MTgzMTEsMTMuNDAyNTU3OCBMNC45MjI0NzY5NywxMy4zMzAyNzYyIEw0LjgwNDkyNDY4LDEzLjIyMTc5NDEgQzMuODU5Mjk3NTksMTIuMzIwNjI4MyAzLjI2OTI1LDExLjA0OTU0OTYgMy4yNjkyNSw5LjY0MzAyNSBDMy4yNjkyNSw2LjkxNTg4MjYzIDUuNDg3MTA3NjMsNC42OTgwMjUgOC4yMTQyNSw0LjY5ODAyNSBDOS44MTQwMDc1Niw0LjY5ODAyNSAxMS4yMzg0NTI3LDUuNDYxMjEyMzMgMTIuMTQyNzY0NSw2LjY0MjcxMjE1IEwxMi4xNDI3NjQ1LDMuNTk0NjQ0OTEgQzExLjAxMTU4OTYsMi44NTczNjc2NSA5LjY2MTk5NDQ5LDIuNDI4NTUgOC4yMTQyNSwyLjQyODU1IFogTTguMjE0MjUsNS42OTgwMjUgQzYuMDM5MzkyMzcsNS42OTgwMjUgNC4yNjkyNSw3LjQ2ODE2NzM3IDQuMjY5MjUsOS42NDMwMjUgQzQuMjY5MjUsMTEuNjY5NTM3MyA1LjgwNjQ4MjY0LDEzLjM0NDc0OTggNy43NzU4ODgxNSwxMy41NjM1NjcyIEw3Ljg1NzEsMTMuNTcxNSBMOC4yMTQzNSwxMy41NzE1IEMxMC4zNDk2LDEzLjU3MTUgMTIuMDg2ODUsMTEuODY4IDEyLjE0MTYsOS43NDYgTDEyLjE0MjY0NjgsOS42NDMgTDEyLjE0MjY0NjgsOS4yODIzMzIzMyBDMTEuOTU5ODU4NSw3LjI3NTc1MDI2IDEwLjI2NzQ4MjMsNS42OTgwMjUgOC4yMTQyNSw1LjY5ODAyNSBaIE04LjIxNDI1LDcuNTAwMDI1IEM5LjM5NjE5Mjg0LDcuNTAwMDI1IDEwLjM1Nyw4LjQ2MDkzMzA5IDEwLjM1Nyw5LjY0MzAyNSBDMTAuMzU3LDEwLjgyNDkxNzQgOS4zOTYxNDIzNywxMS43ODU3NzUgOC4yMTQyNSwxMS43ODU3NzUgQzcuMDMyMTgyMTUsMTEuNzg1Nzc1IDYuMDcxNSwxMC44MjQ5OTE5IDYuMDcxNSw5LjY0MzAyNSBDNi4wNzE1LDguNDYwODU4NTUgNy4wMzIxMzE2OSw3LjUwMDAyNSA4LjIxNDI1LDcuNTAwMDI1IFogTTguMjE0MjUsOC41MDAwMjUgQzcuNTg0NDYzNDgsOC41MDAwMjUgNy4wNzE1LDkuMDEzMDk2MjcgNy4wNzE1LDkuNjQzMDI1IEM3LjA3MTUsMTAuMjcyNzMwNyA3LjU4NDQ5MDQyLDEwLjc4NTc3NSA4LjIxNDI1LDEwLjc4NTc3NSBDOC44NDM4NTc2MywxMC43ODU3NzUgOS4zNTcsMTAuMjcyNjMyNiA5LjM1Nyw5LjY0MzAyNSBDOS4zNTcsOS4wMTMxOTQzMyA4Ljg0Mzg4NDU3LDguNTAwMDI1IDguMjE0MjUsOC41MDAwMjUgWiIgaWQ9IuW9oueKtiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+");
  584. background-size: 24px;
  585. background-repeat: no-repeat;
  586. }
  587. `));
  588.  
  589. document.head.appendChild(style);
  590. }
  591.  
  592. async function addCopyStreamContent(){
  593. await waitLoad(()=>$("#videoContainer").length > 0);
  594.  
  595. const openWithPlayerBtn = isMacOS() ? `<span class="huya-plus-btn open-with-iina huyaplus-copy-stream-btn">IINA打开</span>`: `<span class="huya-plus-btn open-with-potplayer huyaplus-copy-stream-btn">PotPlayer打开</span>`;
  596. let copyStreamHtml = `<div class="huyaplus-copy-stream-wrapper">
  597. <span class="huya-plus-btn copy-stream-link huyaplus-copy-stream-btn">直播流</span>
  598. ${openWithPlayerBtn}
  599. </div>`;
  600. $("#videoContainer").prepend(copyStreamHtml);
  601.  
  602. document.querySelector('.copy-stream-link').onclick = async e=>{
  603. GM_setClipboard(await getStreamUrl());
  604. showCopySuccessIcon();
  605. };
  606.  
  607. $(".open-with-iina").click(async ()=>{
  608. openStreamWithIINA(await getStreamUrl());
  609. });
  610.  
  611. $(".open-with-potplayer").click(async ()=>{
  612. openStreamWithPotPlayer(await getStreamUrl());
  613. });
  614. }
  615.  
  616. async function getStreamUrl(){
  617. let url = window.location.href;
  618. let streamUrl = sessionStorage.getItem(url)
  619. if(!streamUrl || streamUrl.length === 0){
  620. streamUrl = await doGetStreamUrl(url).catch(e=>{console.error(e)});
  621. if(streamUrl && streamUrl.length > 0){
  622. sessionStorage.setItem(url, streamUrl);
  623. } else {
  624. alert("获取直播流失败");
  625. throw new Error("获取直播流失败");
  626. }
  627. }
  628.  
  629. let ibitrate = getCurrentIbitrate();
  630. return convertStreamIbitrate(streamUrl, ibitrate)
  631. }
  632.  
  633. function getCurrentIbitrate(){
  634. return $(".player-videotype-list>li.on").attr('ibitrate');
  635. }
  636.  
  637. function convertStreamIbitrate(streamUrl, ibitrate){
  638. let ibit = parseInt(ibitrate);
  639. if(!isNaN(ibit)){
  640. if(ibit > 0){
  641. if(streamUrl.indexOf() != -1){
  642. streamUrl = streamUrl.replace(/(ratio=)(\d+)&/, `$1${ibit}&`);
  643. } else {
  644. streamUrl += `&ratio=${ibit}`
  645. }
  646. } else {
  647. streamUrl = streamUrl.replace(/(ratio=)(\d+)&/, '');
  648. }
  649. }
  650. return streamUrl;
  651. }
  652.  
  653. async function doGetStreamUrl(url){
  654. try{
  655. let mobileHtml = await new Promise((resolve,reject)=>{
  656. GM_xmlhttpRequest({
  657. method: 'GET',
  658. headers: {
  659. 'user-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
  660. },
  661. url: url,
  662. responseType: 'text',
  663. onload: resp=>{
  664. resolve(resp.responseText);
  665. },
  666. onerror: e => {
  667. reject(e);
  668. }
  669. })
  670. });
  671. let roomInfoJson = /\<script\>\s*window\.HNF_GLOBAL_INIT\s*=\s*(.+)\<\/script\>/.exec(mobileHtml)[1];
  672. let roomInfo = JSON.parse(roomInfoJson);
  673. let liveInfo = roomInfo.roomInfo.tLiveInfo.tLiveStreamInfo;
  674. let streamInfo = liveInfo.vStreamInfo.value.filter(sinfo => sinfo.sStreamName && sinfo.sStreamName.length > 0)[0];
  675. let bitrateInfo = liveInfo.vBitRateInfo.value;
  676. let streamUrl = buildStreamUrl(streamInfo, bitrateInfo);
  677. streamUrl = streamUrl.replace('http', 'https');
  678. return streamUrl;
  679. }catch(e){
  680. throw e;
  681. }
  682. }
  683.  
  684. async function doGetStreamUrlV2(){
  685. let config = unsafeWindow.hyPlayerConfig;
  686. let streamInfo = config.stream.data[0].gameStreamInfoList.filter(it=>it.sStreamName)[0]
  687. let bitrateInfo = config.stream.vMultiStreamInfo;
  688. let streamUrl = buildStreamUrl(streamInfo, bitrateInfo);
  689. streamUrl = streamUrl.replace('http://', 'https://').replace("&amp;", "&");
  690. return streamUrl;
  691. }
  692.  
  693. function buildStreamUrl(streamInfo, bitrateInfo){
  694. let sortedBitrate = bitrateInfo.map(it=>it.iBitRate).filter(it=>it>0).sort((it1,it2)=>it1-it2);
  695. return `${streamInfo.sFlvUrl}/${streamInfo.sStreamName}.${streamInfo.sFlvUrlSuffix}?ratio=${sortedBitrate[0]}&${streamInfo.sFlvAntiCode}`;
  696. }
  697.  
  698. function isMacOS(){
  699. var UserAgent = navigator.userAgent.toLowerCase();
  700. return /mac os/.test(UserAgent);
  701. }
  702.  
  703. function showCopySuccessIcon(){
  704. $('span.copy-stream-link').addClass('copy-success');
  705. setTimeout(()=>{$('span.copy-stream-link').removeClass('copy-success');},1000)
  706. }
  707.  
  708. function autoReceiveBoxReward(){
  709. let rewardBtns = $(".player-box-list .player-box-stat3").filter((i,it)=>$(it).css("visibility") === 'visible');
  710. if(rewardBtns.size() > 0){
  711. let btn = $(rewardBtns[0]);
  712. btn.click();
  713. let waitComplete = ()=>{
  714. if(btn.css("visibility") === 'hidden'){
  715. $("#player-box").hide();
  716. console.log("开启宝箱");
  717. autoReceiveBoxReward();
  718. } else {
  719. setTimeout(waitComplete,1000);
  720. }
  721. };
  722. setTimeout(waitComplete,1000);
  723. }
  724. }
  725.  
  726. function cleanPage(){
  727. $(".room-gg-chat").remove();
  728. $(".room-footer").remove();
  729. }
  730.  
  731. function chat(msg){
  732. $("#player-full-input-txt").val(msg);
  733. $("#player-full-input-btn").click();
  734. let sendTimeout = parseInt($("#chatRoom .msg_send_time").text());
  735. return isNaN(sendTimeout) ? 0 : sendTimeout;
  736. }
  737.  
  738. function openStreamWithPotPlayer(streamUrl){
  739. openStreamWithPlayer("PotPlayer://", streamUrl);
  740. }
  741.  
  742. function openStreamWithIINA(streamUrl){
  743. openStreamWithPlayer("iina://weblink?url=", encodeURIComponent(streamUrl))
  744. }
  745.  
  746. function openStreamWithPlayer(playerUrlSchema, streamUrl){
  747. window.open(`${playerUrlSchema}${streamUrl}`, "_self")
  748. }
  749.  
  750. function jqueryLoaded(){
  751. $ = unsafeWindow.$
  752. return $;
  753. }
  754.  
  755. function pageLoaded(){
  756. if($(".tasks .status").size() == 0){
  757. $(".nav-user-title").mouseenter()
  758. }
  759. return $(".box-icon-word").size() > 0 && $(".tasks .status").size() > 0
  760. }
  761.  
  762. async function waitLoad(conditionFunc, timeout = 10000){
  763. return new Promise(function(resolve,reject){
  764. let w = ()=>{
  765. if(conditionFunc()){
  766. resolve();
  767. } else {
  768. if(timeout > 0){
  769. setTimeout(w, 1000);
  770. timeout -= 1000;
  771. } else {
  772. reject("wait load timeout");
  773. }
  774. }
  775. }
  776. w();
  777. });
  778. }
  779.  
  780. let switchDay = ()=>{
  781. document.body.classList.remove('night-mode');
  782. localStorage.setItem("night-mode",false);
  783. }
  784.  
  785. let switchNight = ()=>{
  786. document.body.classList.add('night-mode');
  787. localStorage.setItem("night-mode",true);
  788. }
  789.  
  790. function autoNightMode(){
  791. if(localStorage.getItem("night-mode") === 'true'){
  792. switchNight();
  793. }
  794. }
  795.  
  796. function addNightModeSwitcher(){
  797. $(".duya-header-bd").append(`
  798. <div class="night-mode-btn-wrapper" title="夜间模式">
  799. <div class="night-mode-switch-btn">
  800. <svg t="1594304048678" class="night-mode-icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13479" width="26" height="26"><path d="M884.466526 372.574316v-226.357895h-222.585263L512 0 362.172632 146.216421H160.175158V362.172632L0 512l160.175158 149.827368v208.734316H362.172632L512 1024l149.827368-153.438316h222.639158V661.827368l139.587369-149.827368-139.587369-139.425684z m-362.172631 407.44421c-50.553263 3.610947-89.088-5.389474-123.472842-21.288421A271.845053 271.845053 0 0 0 557.271579 512c0-109.568-65.212632-203.722105-158.450526-246.730105a270.551579 270.551579 0 0 1 113.178947-24.899369c149.827368 0 271.629474 121.802105 271.629474 271.629474 0 149.827368-121.802105 268.018526-261.281685 268.018526z" p-id="13480"></path></svg>
  801. </div>
  802. </div>
  803. `)
  804.  
  805. $(".night-mode-switch-btn").click(()=>{
  806. if(document.body.classList.contains("night-mode")){
  807. switchDay();
  808. } else {
  809. switchNight();
  810. }
  811. })
  812. }
  813.  
  814. function settings(){
  815. $("#J_global_user_tips").before(`
  816. <div class="setting-btn-wrapper" title="设置">
  817. <div class="setting-btn">
  818. <svg t="1594304610163" class="setting-icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14953" width="26" height="26"><path d="M972.635487 631.216851L892.207069 548.741164a368.50839 368.50839 0 0 0 1.754802-37.216423 372.456694 372.456694 0 0 0-1.754802-37.216423l80.428418-82.18322a51.181721 51.181721 0 0 0 18.791004-69.82649l-76.699465-132.926241a51.181721 51.181721 0 0 0-69.82649-18.86412l-111.576152 28.73488a385.105891 385.105891 0 0 0-64.488968-37.289539L638.053267 51.181721a51.181721 51.181721 0 0 0-51.181721-51.181721h-153.545163a51.181721 51.181721 0 0 0-51.18172 51.181721l-30.78215 111.064334a384.082256 384.082256 0 0 0-64.488968 37.216423L175.297394 170.727597a51.181721 51.181721 0 0 0-69.826491 18.86412L29.063906 322.517958a51.181721 51.181721 0 0 0 18.86412 69.82649l80.428418 82.183221a368.50839 368.50839 0 0 0-1.754802 37.216422c0 12.502963 0.584934 24.859693 1.754802 37.216423l-80.428418 82.18322a51.181721 51.181721 0 0 0-18.86412 69.826491L105.76337 833.896466a51.181721 51.181721 0 0 0 69.826491 18.86412l111.576151-28.734881a385.252124 385.252124 0 0 0 64.488968 37.216423l30.78215 111.064334a51.181721 51.181721 0 0 0 51.18172 51.181721h153.545163a51.181721 51.181721 0 0 0 51.181721-51.181721l30.782149-111.064334a383.570439 383.570439 0 0 0 64.488968-37.216423l111.503035 28.734881a51.181721 51.181721 0 0 0 69.82649-18.86412l76.699465-132.926241a51.181721 51.181721 0 0 0-19.010354-69.753374z m-462.536522 59.663263a179.20914 179.20914 0 0 1-179.062906-179.062906 179.20914 179.20914 0 0 1 179.062906-179.062906 179.20914 179.20914 0 0 1 179.062906 179.062906 179.282256 179.282256 0 0 1-179.062906 179.062906z m0 0" p-id="14954"></path></svg>
  819. </div>
  820. <div class="setting-panel-wrapper">
  821. <div class="setting-panel">
  822. <label>直播流清晰度: </label>
  823. <input id="video-type-bd" type="radio" name="videoType"><label for="video-type-bd">超清</label>
  824. <input id="video-type-hd" type="radio" name="videoType"><label for="video-type-hd">高清</label>
  825. <input id="video-type-dvd" type="radio" name="videoType"><label for="video-type-dvd">流畅</label>
  826. </div>
  827. </div>
  828. </div>
  829. `)
  830. }
  831.  
  832. // 自动领取礼物掉落的宝箱
  833. let receiveTimer;
  834. function autoReceiveTreasure(){
  835. if($("#J_treasureChestContainer .btn").size() === 0){
  836. return;
  837. }
  838. let alreadyChat = false;
  839. let receive = ()=>{
  840. if($("#J_treasureChestContainer .btn.usable").size() > 0){
  841. $("#J_treasureChestContainer .btn.usable").click()
  842. clearInterval(receiveTimer);
  843. receiveTimer = undefined;
  844. } else if($("#J_treasureChestContainer .btn").size() > 0) {
  845. if(!alreadyChat){
  846. //chat('666')
  847. alreadyChat = true;
  848. }
  849. } else {
  850. clearInterval(receiveTimer);
  851. receiveTimer = undefined;
  852. }
  853. }
  854. if(!receiveTimer){
  855. receiveTimer = setInterval(receive, 100);
  856. }
  857. }
  858.  
  859. function addEventListener(){
  860. $("#player-fullpage-btn").click(()=>{
  861. setTimeout(()=>{
  862. if($(".player-narrowpage").size() > 0){
  863. $("#videoContainer").addClass("huyaplus-page-full-mode");
  864. } else {
  865. $("#videoContainer").removeClass("huyaplus-page-full-mode");
  866. $("#player-ctrl-wrap, #player-gift-wrap").removeClass("show");
  867. }
  868. })
  869. })
  870.  
  871. $("#player-fullscreen-btn").click(()=>{
  872. setTimeout(()=>{
  873. if($(".player-narrowscreen").size() > 0 && $(".player-narrowpage").size() > 0){
  874. $("#videoContainer").removeClass("huyaplus-page-full-mode");
  875. $("#player-ctrl-wrap, #player-gift-wrap").removeClass("show");
  876. } else if($(".player-narrowpage").size() > 0){
  877. $("#videoContainer").addClass("huyaplus-page-full-mode");
  878. }
  879. })
  880. })
  881.  
  882. $("#player-video").dblclick(()=>{
  883. setTimeout(()=>{
  884. if($(".player-narrowpage").size() > 0){
  885. $("#videoContainer").addClass("huyaplus-page-full-mode");
  886. } else {
  887. $("#videoContainer").removeClass("huyaplus-page-full-mode");
  888. $("#player-ctrl-wrap, #player-gift-wrap").removeClass("show");
  889. }
  890. })
  891. })
  892.  
  893. let copeStreamBtn = $(".huyaplus-copy-stream-wrapper .huyaplus-copy-stream-btn");
  894. let hideCopyStreamBtn = setTimeout(()=>{
  895. copeStreamBtn.hide();
  896. }, 2000);
  897. let shouldHideCopyStreamBtn = true;
  898.  
  899. let hideTimeout, shouldHide = true;
  900. $(".room-player").on("mousemove",".huyaplus-page-full-mode", throttle(()=>{
  901. $("#player-ctrl-wrap, #player-gift-wrap").addClass("show");
  902. clearTimeout(hideTimeout);
  903. let hideFn = ()=>{
  904. if(shouldHide){
  905. $("#player-ctrl-wrap, #player-gift-wrap").removeClass("show");
  906. } else {
  907. hideTimeout = setTimeout(hideFn, 1000);
  908. }
  909. };
  910. hideTimeout = setTimeout(hideFn, 1000);
  911. },500)).on("mousemove", "#player-video", throttle(()=>{
  912. copeStreamBtn.show();
  913. clearTimeout(hideCopyStreamBtn)
  914. hideCopyStreamBtn = setTimeout(()=>{
  915. if(shouldHideCopyStreamBtn){
  916. copeStreamBtn.hide();
  917. }
  918. }, 1100)
  919. }, 500))
  920.  
  921. $("#player-gift-wrap,#player-ctrl-wrap").mouseenter(()=>{
  922. shouldHide = false;
  923. }).mouseleave(()=>{
  924. shouldHide = true;
  925. })
  926.  
  927. copeStreamBtn.mouseenter(()=>{
  928. shouldHideCopyStreamBtn = false;
  929. }).mouseleave(()=>{
  930. shouldHideCopyStreamBtn = true;
  931. })
  932. }
  933.  
  934. function throttle(fn,delay){
  935. let valid = true;
  936. return function() {
  937. if(!valid){
  938. return false;
  939. }
  940. fn();
  941. valid = false;
  942. setTimeout(() => {
  943. valid = true;
  944. }, delay);
  945. }
  946. }
  947.  
  948. function addStreamVideoPreview(){
  949. let previewTimeout,flvPlayer;
  950. $("body").on('mouseenter','.subscribe-live-item', function(e){
  951. previewTimeout = setTimeout(()=>{
  952. let streamUrl = $(e.target).parent().get(0).href;
  953. $(e.target).parent().prepend(`<video muted="true" id="video-preview" style='width: 100%;height: 100%;display:none;'></video>`)
  954. doGetStreamUrl(streamUrl).then(videoUrl=>{
  955. //if(Hls.isSupported()) {
  956. // videoUrl = convertStreamIbitrate(videoUrl, 500);
  957. // var video = document.getElementById('video-preview');
  958. // hls = new Hls();
  959. // hls.loadSource(videoUrl);
  960. // hls.attachMedia(video);
  961. // hls.on(Hls.Events.MANIFEST_PARSED,function() {
  962. // let video = document.getElementById('video-preview');
  963. // if(video){
  964. // $(video).show();
  965. // video.play();
  966. // toggleLiveItemMask($(e.target).parent(), false)
  967. // }
  968. // });
  969. //}
  970. if (flvjs.isSupported()) {
  971. var videoElement = document.getElementById('video-preview');
  972. flvPlayer = flvjs.createPlayer({
  973. type: 'flv',
  974. isLive: true,
  975. url: videoUrl
  976. });
  977. flvPlayer.attachMediaElement(videoElement);
  978. flvPlayer.load();
  979. flvPlayer.play();
  980. $(videoElement).show();
  981. toggleLiveItemMask($(e.target).parent(), false)
  982. }
  983. }).catch(e=>{
  984. console.log("Video Preview failed", e)
  985. })
  986. }, 1000)
  987. });
  988.  
  989. $("body").on('mouseleave','.subscribe-live-item', function(e){
  990. clearTimeout(previewTimeout);
  991. $("#video-preview").remove();
  992. toggleLiveItemMask($(".video-previewing"), true)
  993. if(flvPlayer){
  994. flvPlayer.destroy();
  995. }
  996. });
  997. }
  998.  
  999. function toggleLiveItemMask(liveItemEle, show){
  1000. if(show){
  1001. liveItemEle.removeClass('video-previewing')
  1002. } else {
  1003. liveItemEle.addClass('video-previewing')
  1004. }
  1005. }
  1006.  
  1007. function autoMaxIbitrate(){
  1008. let el = $('.player-videotype-list>li:first');
  1009. if(el.length === 1){
  1010. el.click();
  1011. }
  1012. }
  1013.  
  1014. function getConfigKey(key){
  1015. return `huya_plus_config_${key}`;
  1016. }
  1017.  
  1018. function setConfig(key, value){
  1019. localStorage.setItem(getConfigKey(key), value || "");
  1020. }
  1021.  
  1022. function getConfig(key){
  1023. return localStorage.getItem(getConfigKey(key)) || "";
  1024. }
  1025.  
  1026. let filterByKeyword = getConfig("filterByKeyword") === 'true';
  1027. let filterHistoryDanmu = localStorage.getItem("shieldHistoryDanmu") === '1';
  1028. let filterKeywordList = getConfig("filterKeywordList").split(',');
  1029.  
  1030. function addDanmuFilterUI(){
  1031. let danmuSettingPane = $(".player-danmu-pane");
  1032. danmuSettingPane.height(danmuSettingPane.height() + 110);
  1033. $(".danmu-shield-area #shield-history").show();
  1034. let html = `<div class="shield-keyword-pane">
  1035. <div id="shield-keyword" class="shield-cked">
  1036. <div class="danmu-shield-cbox"></div>
  1037. <em>屏蔽关键词</em>
  1038. </div>
  1039. <textarea id="shield-keyword-input" placeholder="填写弹幕屏蔽关键词,每行一个"></textarea>
  1040. </div>`
  1041. danmuSettingPane.prepend(html);
  1042.  
  1043. let keywordShieldSwitch = $("#shield-keyword");
  1044. let keywordShieldInput = $("#shield-keyword-input");
  1045. if(filterByKeyword !== keywordShieldSwitch.hasClass("shield-cked")){
  1046. keywordShieldSwitch.toggleClass("shield-cked");
  1047. }
  1048. keywordShieldInput.attr("disabled", !filterByKeyword);
  1049.  
  1050. if(filterKeywordList && filterKeywordList.length > 0){
  1051. keywordShieldInput.val(filterKeywordList.join("\n"));
  1052. }
  1053.  
  1054. keywordShieldSwitch.click(()=>{
  1055. keywordShieldSwitch.toggleClass("shield-cked");
  1056. filterByKeyword = keywordShieldSwitch.hasClass("shield-cked");
  1057. setConfig("filterByKeyword", filterByKeyword)
  1058. keywordShieldInput.attr("disabled", !filterByKeyword);
  1059. });
  1060.  
  1061. keywordShieldInput.blur(()=>{
  1062. let keywordInput = keywordShieldInput.val();
  1063. filterKeywordList = keywordInput.split('\n').map(it=>it.trim()).filter(it=>it&&it.length > 0);
  1064. setConfig("filterKeywordList", filterKeywordList.join(','));
  1065. });
  1066.  
  1067. let shieldHistorySwitch = $("#shield-history");
  1068. shieldHistorySwitch.click(()=>{
  1069. filterHistoryDanmu = !filterHistoryDanmu;
  1070. })
  1071. }
  1072.  
  1073. let danmuFilterTimer;
  1074. function danmuFilter(){
  1075. setTimeout(addDanmuFilterUI, 10000);
  1076.  
  1077. if(danmuFilterTimer){
  1078. clearInterval(danmuFilterTimer);
  1079. }
  1080. danmuFilterTimer = setInterval(()=>{
  1081. let danmuList = $('#danmudiv>.danmu-item')
  1082. let danmuTextList=[];
  1083. for(let i = 0; i < danmuList.length; i++){
  1084. let danmuItem = $(danmuList.get(i));
  1085. let danmuText = danmuItem.find('span').get(0).innerText;
  1086. if(filterHistoryDanmu && danmuTextList.indexOf(danmuText) > -1){
  1087. console.log(`过滤重复弹幕:${danmuText}`)
  1088. danmuItem.remove()
  1089. continue;
  1090. }
  1091. danmuTextList.push(danmuText)
  1092. if(filterByKeyword && filterKeywordList && filterKeywordList.length > 0){
  1093. for(let keyword of filterKeywordList){
  1094. if(danmuText.indexOf(keyword) > -1){
  1095. console.log(`过滤关键词(${keyword})弹幕:${danmuText}`)
  1096. danmuItem.remove()
  1097. }
  1098. }
  1099. }
  1100. }
  1101. }, 100)
  1102. }
  1103.  
  1104. function addPlayerControlBtn(){
  1105. let playerControlHtml = `<div id="huyaplus-player-control">
  1106. <div class="huyaplus-player-control-btn" id="player-mirror-btn" title="视频镜像"/>
  1107. <div class="huyaplus-player-control-btn" id="player-rotate-btn" title="视频旋转"/>
  1108. <div class="huyaplus-player-control-btn" id="player-joysound-btn" title="joysound音效增强"></div>
  1109. </div>`;
  1110. $(".player-ctrl-btn").prepend(playerControlHtml);
  1111.  
  1112. let rotateCount = 0;
  1113. let mirror = false;
  1114. let scale = "scale(1)";
  1115. $("#videoContainer").on("click", "#player-mirror-btn", ()=>{
  1116. let videoEle = $("#player-video>#hy-video");
  1117. if(!videoEle.hasClass("huya-plus-transformed")){
  1118. mirror = false;
  1119. rotateCount = 0;
  1120. scale = "scale(1)";
  1121. }
  1122.  
  1123. mirror = !mirror;
  1124. let rotateY = mirror ? "rotateY(180deg)" : "rotateY(0deg)";
  1125. $("#player-video>#hy-video").css("transform", `${rotateY}rotateZ(${rotateCount * 90}deg)${scale}`)
  1126. .addClass("huya-plus-transformed");
  1127. }).on("click", "#player-rotate-btn", ()=>{
  1128. let videoEle = $("#player-video>#hy-video");
  1129. if(!videoEle.hasClass("huya-plus-transformed")){
  1130. mirror = false;
  1131. rotateCount = 0;
  1132. }
  1133.  
  1134. let rotateY = mirror ? "rotateY(180deg)" : "rotateY(0deg)";
  1135. if(rotateCount % 2 === 0){
  1136. let scaleValue = videoEle.height() / videoEle.width();
  1137. scale = `scale(${scaleValue})`;
  1138. } else {
  1139. scale = "scale(1)";
  1140. }
  1141. videoEle.css("transform", `${rotateY}rotateZ(${++rotateCount * 90}deg)${scale}`)
  1142. .addClass("huya-plus-transformed");
  1143. })
  1144.  
  1145. if(localStorage.getItem("Ex_isJoysound") === '1'){
  1146. $("#player-joysound-btn").addClass("active");
  1147. }
  1148.  
  1149. $("#player-joysound-btn").click(e=>{
  1150. if(unsafeWindow.hasInstalledJoysound){
  1151. let enabled = localStorage.getItem("Ex_isJoysound");
  1152. if(enabled === '1'){
  1153. unsafeWindow.disableJoysound();
  1154. $("#player-joysound-btn").removeClass("active");
  1155. } else {
  1156. unsafeWindow.enableJoysound();
  1157. $("#player-joysound-btn").addClass("active");
  1158. }
  1159. } else if(confirm("启用此功能需要安装Joysound视频音效增强脚本,是否前往安装?")){
  1160. unsafeWindow.open("https://greatest.deepsurf.us/zh-CN/scripts/439845-joysound%E8%A7%86%E9%A2%91%E9%9F%B3%E6%95%88%E5%A2%9E%E5%BC%BA");
  1161. }
  1162. })
  1163. }
  1164.  
  1165. function addQuickChatBar(){
  1166. let quickChatBarHtml = `
  1167. <div class="quick-chat-bar-wrapper ele-hide">
  1168. <div class="quick-chat-input-wrapper">
  1169. <input id="quick-chat-input" type="text" autocomplete="off" placeholder="请输入弹幕,Enter键发送"/>
  1170. </div>
  1171. <div class="quick-chat-input-count">0/30</div>
  1172. <div class="quick-chat-send-btn" id="quick-chat-send-btn">发送(enter)</div>
  1173. </div>
  1174. `;
  1175. $("#videoContainer").append(quickChatBarHtml);
  1176. let wrapper = $(".quick-chat-bar-wrapper");
  1177. let input = $("#quick-chat-input");
  1178. $("#videoContainer").attr("tabindex","999").focus().keyup(e=>{
  1179. let isFullPage = $(".player-narrowpage").size() > 0 || $(".player-narrowscreen").size() > 0;
  1180. if(e.keyCode === 13){
  1181. if(!wrapper.hasClass("ele-hide")){
  1182. wrapper.toggleClass("ele-hide");
  1183. } else if(isFullPage){
  1184. wrapper.toggleClass("ele-hide");
  1185. if(!wrapper.hasClass("ele-hide")){
  1186. input.focus();
  1187. }
  1188. }
  1189. e.stopPropagation();
  1190. }
  1191. });
  1192.  
  1193. let tooFast = false;
  1194. let countInput = true;
  1195. input.keyup(e=>{
  1196. if(e.keyCode === 13){
  1197. let text = input.val();
  1198. if(text && text.length > 0){
  1199. if(!tooFast){
  1200. let sendTimeout = chat(text);
  1201. if(sendTimeout === 0){
  1202. wrapper.addClass("ele-hide");
  1203. $("#videoContainer").focus();
  1204. input.val("");
  1205. setInputCount(0);
  1206. } else {
  1207. tooFast = true;
  1208. $("#quick-chat-send-btn").toggleClass("div-disabled");
  1209. let disableTimer = setInterval(()=>{
  1210. if(sendTimeout > 0){
  1211. $("#quick-chat-send-btn").text(`倒计时:${sendTimeout}`);
  1212. sendTimeout--;
  1213. } else {
  1214. $("#quick-chat-send-btn").text("发送(enter)").toggleClass("div-disabled");
  1215. clearInterval(disableTimer);
  1216. tooFast = false;
  1217. }
  1218. }, 1000);
  1219. }
  1220. }
  1221. } else {
  1222. wrapper.toggleClass("ele-hide");
  1223. $("#videoContainer").focus();
  1224. }
  1225. e.stopPropagation();
  1226. }
  1227. }).on('compositionend', e => {
  1228. checkInputCount();
  1229. setInputCount(input.val().length);
  1230. countInput = true;
  1231. }).on('input', e => {
  1232. if(countInput) {
  1233. checkInputCount();
  1234. setInputCount(input.val().length);
  1235. }
  1236. }).on('compositionstart', e => {
  1237. countInput = false;
  1238. })
  1239.  
  1240. let setInputCount = cnt => $(".quick-chat-input-count").text(`${cnt}/30`);
  1241. let checkInputCount = ()=>{
  1242. let text = input.val();
  1243. if(text.length >= 30) {
  1244. input.val(text.substring(0, 30));
  1245. }
  1246. }
  1247. }
  1248.  
  1249. async function initPlayer(){
  1250. await waitLoad(()=>$("#player-fullpage-btn").length > 0)
  1251. setTimeout(autoMaxIbitrate, 100)
  1252. setTimeout(()=>$("#player-fullpage-btn").click(), 1000)
  1253. setTimeout(addPlayerControlBtn, 1000)
  1254. setTimeout(addQuickChatBar, 1000)
  1255. }
  1256.  
  1257. let count = 0;
  1258. let timer,treasureTimer;
  1259. (async function() {
  1260. await waitLoad(jqueryLoaded)
  1261. cleanPage();
  1262. autoNightMode();
  1263. addNightModeSwitcher();
  1264. //settings();
  1265. addUi();
  1266. addStreamVideoPreview();
  1267.  
  1268. if($("#liveRoomObj").length > 0){
  1269. await addCopyStreamContent();
  1270. if(treasureTimer) clearInterval(treasureTimer)
  1271. treasureTimer = setInterval(autoReceiveTreasure, 30000)
  1272.  
  1273. await initPlayer();
  1274. addEventListener();
  1275. //danmuFilter();
  1276.  
  1277. let intervalInMills = 60 * 1000;
  1278. let task = ()=>{
  1279. autoReceiveBoxReward();
  1280. };
  1281. task();
  1282. if(timer) clearInterval(timer);
  1283. timer = setInterval(task,intervalInMills);
  1284. }
  1285. })();