媒体音量增强器

调整媒体音量与滤波器,增强倍数最高 20 倍,设置可记住并自动应用。部分网站可能无效、无声音或无法播放,可选择禁用。

  1. // ==UserScript==
  2. // @name Media Volume Booster
  3. // @name:zh-TW 媒體音量增強器
  4. // @name:zh-CN 媒体音量增强器
  5. // @name:en Media Volume Booster
  6. // @version 0.0.41
  7. // @author Canaan HS
  8. // @description 調整媒體音量與濾波器,增強倍數最高 20 倍,設置可記住並自動應用。部分網站可能無效、無聲音或無法播放,可選擇禁用。
  9. // @description:zh-TW 調整媒體音量與濾波器,增強倍數最高 20 倍,設置可記住並自動應用。部分網站可能無效、無聲音或無法播放,可選擇禁用。
  10. // @description:zh-CN 调整媒体音量与滤波器,增强倍数最高 20 倍,设置可记住并自动应用。部分网站可能无效、无声音或无法播放,可选择禁用。
  11. // @description:en Adjust media volume and filters with enhancement factor up to 20x. Settings are saved and auto-applied. May not work on some sites (causing no sound or playback issues). Can be disabled if needed.
  12.  
  13. // @noframes
  14. // @match *://*/*
  15. // @icon https://cdn-icons-png.flaticon.com/512/16108/16108408.png
  16.  
  17. // @license MPL-2.0
  18. // @namespace https://greasyfork.org/users/989635
  19.  
  20. // @run-at document-body
  21. // @grant GM_setValue
  22. // @grant GM_getValue
  23. // @grant GM_deleteValue
  24. // @grant GM_getResourceURL
  25. // @grant GM_registerMenuCommand
  26. // @grant GM_addValueChangeListener
  27. // @resource Img https://cdn-icons-png.flaticon.com/512/11243/11243783.png
  28. // @require https://update.greasyfork.org/scripts/487608/1580134/SyntaxLite_min.js
  29. // ==/UserScript==
  30. (async () => {
  31. async function y() {
  32. function h() { u.classList.replace("open", "close"); v.classList.replace("open", "close"); setTimeout(() => { g.remove() }, 800) } if (!Syn.$q("#Booster_Modal_Background")) {
  33. var g = Syn.createElement("div", { id: "Booster_Modal_Background" }); g.attachShadow({ mode: "open" }).$iHtml(`
  34. <style id="Booster-Menu">
  35. :host {
  36. --primary-color: #3a7bfd;
  37. --secondary-color: #00d4ff;
  38. --text-color: #ffffff;
  39. --slider-track: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
  40. --background-dark: #1a1f2c;
  41. --background-panel: #252b3a;
  42. --highlight-color: #00e5ff;
  43. --border-radius: 12px;
  44. }
  45. Booster_Modal_Background {
  46. top: 0;
  47. left: 0;
  48. opacity: 0;
  49. width: 100%;
  50. height: 100%;
  51. display: flex;
  52. z-index: 9999;
  53. overflow: auto;
  54. position: fixed;
  55. align-items: center;
  56. justify-content: center;
  57. backdrop-filter: blur(5px);
  58. -webkit-backdrop-filter: blur(5px);
  59. transition: opacity 0.4s ease;
  60. background-color: rgba(0, 0, 0, 0.4);
  61. }
  62. Booster_Modal_Background.open {
  63. animation: fadeIn 0.4s ease forwards;
  64. }
  65. Booster_Modal_Background.close {
  66. animation: fadeOut 0.4s ease forwards;
  67. }
  68. .Booster-Modal-Content {
  69. min-width: 420px;
  70. max-width: 460px;
  71. width: 100%;
  72. padding: 20px;
  73. padding-inline-end: 10px;
  74. overflow-y: auto;
  75. scrollbar-gutter: stable;
  76. text-align: center;
  77. border-radius: var(--border-radius);
  78. background-color: var(--background-dark);
  79. border: 1px solid rgba(78, 164, 255, 0.3);
  80. box-shadow:
  81. inset -6px 0 10px -8px rgba(0, 0, 0, 0.5),
  82. 0 10px 30px rgba(0, 0, 0, 0.5),
  83. 0 0 15px rgba(0, 212, 255, 0.2);
  84. color: var(--text-color);
  85. opacity: 0;
  86. max-height: 85vh;
  87. transform: scale(0.9);
  88. transition: all 0.5s ease;
  89. }
  90. .Booster-Modal-Content.open {
  91. animation: scaleIn 0.5s ease forwards;
  92. }
  93. .Booster-Modal-Content.close {
  94. animation: shrinkFadeOut 0.8s ease forwards;
  95. }
  96. .Booster-Modal-Content::-webkit-scrollbar {
  97. width: 8px;
  98. }
  99. .Booster-Modal-Content::-webkit-scrollbar-thumb {
  100. background: rgba(255, 255, 255, 0.2);
  101. border-radius: 8px;
  102. }
  103. .Booster-Modal-Content::-webkit-scrollbar-track {
  104. background: rgba(0, 0, 0, 0.1);
  105. }
  106. .Booster-Title {
  107. margin-top: 0;
  108. color: var(--secondary-color);
  109. font-size: 22px;
  110. font-weight: 600;
  111. letter-spacing: 0.5px;
  112. margin-bottom: 20px;
  113. text-shadow: 0 0 10px rgba(0, 212, 255, 0.4);
  114. opacity: 0;
  115. transform: translateY(-10px);
  116. animation: slideDown 0.4s ease 0.3s forwards;
  117. }
  118. .Booster-Multiplier {
  119. margin: 1.5rem 0;
  120. font-size: 22px;
  121. font-weight: 500;
  122. opacity: 0;
  123. animation: fadeIn 0.5s ease 0.4s forwards;
  124. }
  125. .Booster-Multiplier img {
  126. width: 24px;
  127. margin-right: 8px;
  128. vertical-align: middle;
  129. }
  130. .Booster-Multiplier span {
  131. display: flex;
  132. align-items: center;
  133. justify-content: center;
  134. }
  135. #Booster-CurrentValue {
  136. color: var(--highlight-color);
  137. font-weight: 700;
  138. margin: 0 5px;
  139. font-size: 26px;
  140. }
  141. .Booster-Slider {
  142. -webkit-appearance: none;
  143. appearance: none;
  144. width: 90%;
  145. height: 6px;
  146. cursor: pointer;
  147. margin: 2rem 0 3.5rem 0;
  148. background: var(--slider-track);
  149. border-radius: 3px;
  150. outline: none;
  151. opacity: 0;
  152. animation: progressIn 0.8s ease 0.5s forwards;
  153. }
  154. .Booster-Slider::-webkit-slider-thumb {
  155. -webkit-appearance: none;
  156. appearance: none;
  157. width: 16px;
  158. height: 16px;
  159. border-radius: 50%;
  160. background: var(--secondary-color);
  161. cursor: pointer;
  162. box-shadow: 0 0 8px rgba(0, 212, 255, 0.6);
  163. }
  164. .Booster-Slider::-moz-range-thumb {
  165. width: 16px;
  166. height: 16px;
  167. border-radius: 50%;
  168. background: var(--secondary-color);
  169. cursor: pointer;
  170. border: none;
  171. box-shadow: 0 0 8px rgba(0, 212, 255, 0.6);
  172. }
  173. .Booster-Slider::-moz-range-progress {
  174. background: var(--slider-track);
  175. border-radius: 3px;
  176. height: 6px;
  177. }
  178. .Booster-Buttons {
  179. display: flex;
  180. justify-content: flex-end;
  181. margin-top: 20px;
  182. gap: 10px;
  183. opacity: 0;
  184. animation: fadeIn 0.5s ease 0.7s forwards;
  185. }
  186. .Booster-Modal-Button {
  187. color: var(--text-color);
  188. cursor: pointer;
  189. font-size: 15px;
  190. font-weight: 500;
  191. padding: 8px 16px;
  192. border-radius: 6px;
  193. background-color: rgba(58, 123, 253, 0.2);
  194. border: 1px solid rgba(78, 164, 255, 0.3);
  195. transition: all 0.2s ease;
  196. outline: none;
  197. }
  198. .Booster-Modal-Button:hover {
  199. background-color: rgba(58, 123, 253, 0.4);
  200. box-shadow: 0 0 10px rgba(0, 212, 255, 0.4);
  201. transform: translateY(-2px);
  202. }
  203. #Booster-Sound-Save {
  204. background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
  205. border: none;
  206. position: relative;
  207. overflow: hidden;
  208. }
  209. #Booster-Sound-Save:hover {
  210. box-shadow: 0 0 15px rgba(0, 212, 255, 0.6);
  211. }
  212. #Booster-Sound-Save:after {
  213. content: "";
  214. position: absolute;
  215. top: -50%;
  216. left: -60%;
  217. width: 20%;
  218. height: 200%;
  219. opacity: 0;
  220. transform: rotate(30deg);
  221. background: rgba(255, 255, 255, 0.13);
  222. background: linear-gradient(
  223. to right,
  224. rgba(255, 255, 255, 0.13) 0%,
  225. rgba(255, 255, 255, 0.13) 77%,
  226. rgba(255, 255, 255, 0.5) 92%,
  227. rgba(255, 255, 255, 0.0) 100%
  228. );
  229. }
  230. #Booster-Sound-Save:hover:after {
  231. opacity: 1;
  232. left: 130%;
  233. transition: left 0.7s ease, opacity 0.5s ease;
  234. }
  235. .Booster-Accordion {
  236. background-color: var(--background-panel);
  237. color: var(--text-color);
  238. cursor: pointer;
  239. padding: 12px 15px;
  240. width: 100%;
  241. text-align: left;
  242. border: none;
  243. outline: none;
  244. transition: 0.3s;
  245. border-radius: 8px;
  246. margin-bottom: 8px;
  247. font-weight: 500;
  248. display: flex;
  249. justify-content: space-between;
  250. align-items: center;
  251. opacity: 0;
  252. transform: translateY(10px);
  253. }
  254. .Booster-Accordion:nth-of-type(1) {
  255. animation: slideUp 0.4s ease 0.5s forwards;
  256. }
  257. .Booster-Accordion:nth-of-type(2) {
  258. animation: slideUp 0.4s ease 0.6s forwards;
  259. }
  260. .Booster-Accordion:nth-of-type(3) {
  261. animation: slideUp 0.4s ease 0.7s forwards;
  262. }
  263. .Booster-Accordion:nth-of-type(4) {
  264. animation: slideUp 0.4s ease 0.8s forwards;
  265. }
  266. .Booster-Accordion:after {
  267. content: '+';
  268. color: var(--secondary-color);
  269. font-weight: bold;
  270. float: right;
  271. margin-left: 5px;
  272. }
  273. .Booster-Accordion.active {
  274. border-bottom-left-radius: 0;
  275. border-bottom-right-radius: 0;
  276. margin-bottom: 0;
  277. }
  278. .Booster-Accordion.active:after {
  279. content: "-";
  280. }
  281. .Booster-Panel {
  282. max-height: 0;
  283. overflow: hidden;
  284. padding: 0 15px;
  285. margin-top: 0;
  286. margin-bottom: 8px;
  287. transition: max-height 0.3s ease-out;
  288. background-color: var(--background-panel);
  289. border-radius: 0 0 8px 8px;
  290. }
  291. .Booster-Panel.active {
  292. margin-bottom: 15px;
  293. padding: 10px 15px 15px;
  294. }
  295. .Booster-Control-Group {
  296. margin-bottom: 15px;
  297. }
  298. .Booster-Control-Label {
  299. display: flex;
  300. justify-content: space-between;
  301. margin-bottom: 5px;
  302. font-size: 14px;
  303. color: rgba(255, 255, 255, 0.8);
  304. }
  305. .Booster-Value {
  306. color: var(--highlight-color);
  307. font-weight: 600;
  308. }
  309. .Booster-Mini-Slider {
  310. -webkit-appearance: none;
  311. appearance: none;
  312. width: 100%;
  313. height: 4px;
  314. background: var(--slider-track);
  315. border-radius: 2px;
  316. outline: none;
  317. }
  318. .Booster-Mini-Slider::-webkit-slider-thumb {
  319. -webkit-appearance: none;
  320. appearance: none;
  321. width: 12px;
  322. height: 12px;
  323. border-radius: 50%;
  324. background: var(--secondary-color);
  325. cursor: pointer;
  326. }
  327. .Booster-Mini-Slider::-moz-range-thumb {
  328. width: 12px;
  329. height: 12px;
  330. border-radius: 50%;
  331. background: var(--secondary-color);
  332. cursor: pointer;
  333. border: none;
  334. }
  335. .Booster-Mini-Slider::-moz-range-progress {
  336. background: var(--slider-track);
  337. border-radius: 2px;
  338. height: 4px;
  339. }
  340. @keyframes fadeIn {
  341. from {
  342. opacity: 0;
  343. }
  344. to {
  345. opacity: 1;
  346. }
  347. }
  348. @keyframes fadeOut {
  349. from {
  350. opacity: 1;
  351. }
  352. to {
  353. opacity: 0;
  354. pointer-events: none;
  355. }
  356. }
  357. @keyframes scaleIn {
  358. from {
  359. transform: scale(0.9);
  360. opacity: 0;
  361. }
  362. to {
  363. transform: scale(1);
  364. opacity: 1;
  365. }
  366. }
  367. @keyframes shrinkFadeOut {
  368. from {
  369. transform: scale(1);
  370. opacity: 1;
  371. }
  372. to {
  373. transform: scale(0.5);
  374. opacity: 0;
  375. }
  376. }
  377. @keyframes slideUp {
  378. from {
  379. transform: translateY(10px);
  380. opacity: 0;
  381. }
  382. to {
  383. transform: translateY(0);
  384. opacity: 1;
  385. }
  386. }
  387. @keyframes slideDown {
  388. from {
  389. transform: translateY(-10px);
  390. opacity: 0;
  391. }
  392. to {
  393. transform: translateY(0);
  394. opacity: 1;
  395. }
  396. }
  397. @keyframes progressIn {
  398. from {
  399. width: 0%;
  400. opacity: 0;
  401. }
  402. to {
  403. width: 90%;
  404. opacity: 1;
  405. }
  406. }
  407. </style>
  408.  
  409. <Booster_Modal_Background id="Booster-Modal-Menu">
  410. <div class="Booster-Modal-Content">
  411. <h2 class="Booster-Title">${c("\u97f3\u91cf\u589e\u5f37\u5668")}</h2>
  412.  
  413. <div class="Booster-Multiplier">
  414. <span>
  415. <img src="${GM_getResourceURL("Img")}">${c("\u589e\u5f37\u500d\u6578 ")}
  416. <span id="Gain-Value" class="Booster-Value">${d.Gain}</span>${c(" \u500d")}
  417. </span>
  418. <input type="range" id="Gain" class="Booster-Slider" min="0" max="20.0" value="${d.Gain}" step="0.1">
  419. </div>
  420.  
  421. <button class="Booster-Accordion">${c("\u4f4e\u983b\u8a2d\u5b9a")}</button>
  422. <div class="Booster-Panel">
  423. <div class="Booster-Control-Group">
  424. <div class="Booster-Control-Label">
  425. <span>${c("\u589e\u76ca")}</span>
  426. <span id="LowFilterGain-Value" class="Booster-Value">${d.LowFilterGain}</span>
  427. </div>
  428. <input type="range" id="LowFilterGain" class="Booster-Mini-Slider" min="-12" max="12" value="${d.LowFilterGain}" step="0.1">
  429. </div>
  430.  
  431. <div class="Booster-Control-Group">
  432. <div class="Booster-Control-Label">
  433. <span>${c("\u983b\u7387")}</span>
  434. <span id="LowFilterFreq-Value" class="Booster-Value">${d.LowFilterFreq}</span>
  435. </div>
  436. <input type="range" id="LowFilterFreq" class="Booster-Mini-Slider" min="20" max="1000" value="${d.LowFilterFreq}" step="20">
  437. </div>
  438. </div>
  439.  
  440. <button class="Booster-Accordion">${c("\u4e2d\u983b\u8a2d\u5b9a")}</button>
  441. <div class="Booster-Panel">
  442. <div class="Booster-Control-Group">
  443. <div class="Booster-Control-Label">
  444. <span>${c("\u589e\u76ca")}</span>
  445. <span id="MidFilterGain-Value" class="Booster-Value">${d.MidFilterGain}</span>
  446. </div>
  447. <input type="range" id="MidFilterGain" class="Booster-Mini-Slider" min="-12" max="12" value="${d.MidFilterGain}" step="0.1">
  448. </div>
  449.  
  450. <div class="Booster-Control-Group">
  451. <div class="Booster-Control-Label">
  452. <span>${c("\u983b\u7387")}</span>
  453. <span id="MidFilterFreq-Value" class="Booster-Value">${d.MidFilterFreq}</span>
  454. </div>
  455. <input type="range" id="MidFilterFreq" class="Booster-Mini-Slider" min="200" max="8000" value="${d.MidFilterFreq}" step="100">
  456. </div>
  457.  
  458. <div class="Booster-Control-Group">
  459. <div class="Booster-Control-Label">
  460. <span>${c("Q\u503c")}</span>
  461. <span id="MidFilterQ-Value" class="Booster-Value">${d.MidFilterQ}</span>
  462. </div>
  463. <input type="range" id="MidFilterQ" class="Booster-Mini-Slider" min="0.5" max="5" value="${d.MidFilterQ}" step="0.1">
  464. </div>
  465. </div>
  466.  
  467. <button class="Booster-Accordion">${c("\u9ad8\u983b\u8a2d\u5b9a")}</button>
  468. <div class="Booster-Panel">
  469. <div class="Booster-Control-Group">
  470. <div class="Booster-Control-Label">
  471. <span>${c("\u589e\u76ca")}</span>
  472. <span id="HighFilterGain-Value" class="Booster-Value">${d.HighFilterGain}</span>
  473. </div>
  474. <input type="range" id="HighFilterGain" class="Booster-Mini-Slider" min="-12" max="12" value="${d.HighFilterGain}" step="0.1">
  475. </div>
  476.  
  477. <div class="Booster-Control-Group">
  478. <div class="Booster-Control-Label">
  479. <span>${c("\u983b\u7387")}</span>
  480. <span id="HighFilterFreq-Value" class="Booster-Value">${d.HighFilterFreq}</span>
  481. </div>
  482. <input type="range" id="HighFilterFreq" class="Booster-Mini-Slider" min="2000" max="22000" value="${d.HighFilterFreq}" step="500">
  483. </div>
  484. </div>
  485.  
  486. <button class="Booster-Accordion">${c("\u52d5\u614b\u58d3\u7e2e")}</button>
  487. <div class="Booster-Panel">
  488. <div class="Booster-Control-Group">
  489. <div class="Booster-Control-Label">
  490. <span>${c("\u58d3\u7e2e\u7387")}</span>
  491. <span id="CompressorRatio-Value" class="Booster-Value">${d.CompressorRatio}</span>
  492. </div>
  493. <input type="range" id="CompressorRatio" class="Booster-Mini-Slider" min="1" max="30" value="${d.CompressorRatio}" step="0.1">
  494. </div>
  495.  
  496. <div class="Booster-Control-Group">
  497. <div class="Booster-Control-Label">
  498. <span>${c("\u904e\u6e21\u53cd\u61c9")}</span>
  499. <span id="CompressorKnee-Value" class="Booster-Value">${d.CompressorKnee}</span>
  500. </div>
  501. <input type="range" id="CompressorKnee" class="Booster-Mini-Slider" min="0" max="40" value="${d.CompressorKnee}" step="1">
  502. </div>
  503.  
  504. <div class="Booster-Control-Group">
  505. <div class="Booster-Control-Label">
  506. <span>${c("\u95be\u503c")}</span>
  507. <span id="CompressorThreshold-Value" class="Booster-Value">${d.CompressorThreshold}</span>
  508. </div>
  509. <input type="range" id="CompressorThreshold" class="Booster-Mini-Slider" min="-60" max="0" value="${d.CompressorThreshold}" step="1">
  510. </div>
  511.  
  512. <div class="Booster-Control-Group">
  513. <div class="Booster-Control-Label">
  514. <span>${c("\u8d77\u97f3\u901f\u5ea6")}</span>
  515. <span id="CompressorAttack-Value" class="Booster-Value">${d.CompressorAttack}</span>
  516. </div>
  517. <input type="range" id="CompressorAttack" class="Booster-Mini-Slider" min="0.001" max="0.5" value="${d.CompressorAttack}" step="0.001">
  518. </div>
  519.  
  520. <div class="Booster-Control-Group">
  521. <div class="Booster-Control-Label">
  522. <span>${c("\u91cb\u653e\u901f\u5ea6")}</span>
  523. <span id="CompressorRelease-Value" class="Booster-Value">${d.CompressorRelease}</span>
  524. </div>
  525. <input type="range" id="CompressorRelease" class="Booster-Mini-Slider" min="0.01" max="2" value="${d.CompressorRelease}" step="0.01">
  526. </div>
  527. </div>
  528.  
  529. <div class="Booster-Buttons">
  530. <button class="Booster-Modal-Button" id="Booster-Menu-Close">${c("\u95dc\u9589")}</button>
  531. <button class="Booster-Modal-Button" id="Booster-Sound-Save">${c("\u4fdd\u5b58")}</button>
  532. </div>
  533. </div>
  534. </Booster_Modal_Background>
  535. `); document.body.appendChild(g); var n = g.shadowRoot, u = n.querySelector("Booster_Modal_Background"), v = n.querySelector(".Booster-Modal-Content"); u.classList.add("open"); v.classList.add("open"); var x = { ...Object.fromEntries([...n.querySelectorAll(".Booster-Value")].map(a => [a.id, a])) }; v.addEventListener("input", a => { var f = a.target; a = f.id; f = f.value; x[`${a}-Value`].textContent = f; C(a, f) }); u.addEventListener("click", a => {
  536. const f = a.target; a.stopPropagation(); f.classList.contains("Booster-Accordion") ? (f.classList.toggle("active"),
  537. a = f.nextElementSibling, a.style.maxHeight ? (a.style.maxHeight = null, a.classList.remove("active")) : (a.style.maxHeight = a.scrollHeight + "px", a.classList.add("active"))) : "Booster-Sound-Save" === f.id ? (Syn.sV(Syn.domain, d), h()) : "Booster-Menu-Close" !== f.id && "Booster-Modal-Menu" !== f.id || h()
  538. })
  539. }
  540. } const { Transl: c } = function () {
  541. const h = Syn.TranslMatcher({
  542. Traditional: {}, Simplified: {
  543. "\ud83d\udcdc \u83dc\u55ae\u71b1\u9375": "\ud83d\udcdc \u83dc\u5355\u70ed\u952e", "\ud83d\udee0\ufe0f \u8abf\u6574\u83dc\u55ae": "\ud83d\udee0\ufe0f \u8c03\u6574\u83dc\u5355",
  544. "\u274c \u7981\u7528\u589e\u5e45": "\u274c \u7981\u7528\u589e\u5e45", "\u2705 \u555f\u7528\u589e\u5e45": "\u2705 \u542f\u7528\u589e\u5e45", "\u589e\u5f37\u932f\u8aa4": "\u589e\u5f3a\u9519\u8bef", "\u97f3\u91cf\u589e\u5f37\u5668": "\u97f3\u91cf\u589e\u5f3a\u5668", "\u589e\u5f37\u500d\u6578 ": "\u589e\u5f3a\u500d\u6570 ", " \u500d": " \u500d", "\u589e\u76ca": "\u589e\u76ca", "\u983b\u7387": "\u9891\u7387", "Q\u503c": "Q\u503c", "\u4f4e\u983b\u8a2d\u5b9a": "\u4f4e\u9891\u8bbe\u7f6e", "\u4e2d\u983b\u8a2d\u5b9a": "\u4e2d\u9891\u8bbe\u7f6e",
  545. "\u9ad8\u983b\u8a2d\u5b9a": "\u9ad8\u9891\u8bbe\u7f6e", "\u52d5\u614b\u58d3\u7e2e": "\u52a8\u6001\u538b\u7f29", "\u58d3\u7e2e\u7387": "\u538b\u7f29\u7387", "\u904e\u6e21\u53cd\u61c9": "\u8fc7\u6e21\u53cd\u5e94", "\u95be\u503c": "\u9608\u503c", "\u8d77\u97f3\u901f\u5ea6": "\u8d77\u97f3\u901f\u5ea6", "\u91cb\u653e\u901f\u5ea6": "\u91ca\u653e\u901f\u5ea6", "\u95dc\u9589": "\u5173\u95ed", "\u4fdd\u5b58": "\u4fdd\u5b58", "\u4e0d\u652f\u63f4\u97f3\u983b\u589e\u5f37\u7bc0\u9ede": "\u4e0d\u652f\u6301\u97f3\u9891\u589e\u5f3a\u8282\u70b9",
  546. "\u6dfb\u52a0\u589e\u5f37\u7bc0\u9ede\u6210\u529f": "\u6dfb\u52a0\u589e\u5f3a\u8282\u70b9\u6210\u529f", "\u71b1\u9375\u547c\u53eb\u8abf\u6574\u83dc\u55ae!!\n\n\u5feb\u6377\u7d44\u5408 : (Alt + B)": "\u70ed\u952e\u8c03\u7528\u8c03\u6574\u83dc\u5355!!\n\n\u5feb\u6377\u7ec4\u5408 : (Alt + B)"
  547. }, English: {
  548. "\ud83d\udcdc \u83dc\u55ae\u71b1\u9375": "\ud83d\udcdc Menu Hotkey", "\ud83d\udee0\ufe0f \u8abf\u6574\u83dc\u55ae": "\ud83d\udee0\ufe0f Adjustment Menu", "\u274c \u7981\u7528\u589e\u5e45": "\u274c Disable Amplification",
  549. "\u2705 \u555f\u7528\u589e\u5e45": "\u2705 Enable Amplification", "\u589e\u5f37\u932f\u8aa4": "Enhancement Error", "\u97f3\u91cf\u589e\u5f37\u5668": "Volume Booster", "\u589e\u5f37\u500d\u6578 ": "Enhancement Factor ", " \u500d": " times", "\u589e\u76ca": "Gain", "\u983b\u7387": "Frequency", "Q\u503c": "Q Factor", "\u4f4e\u983b\u8a2d\u5b9a": "Low Frequency Settings", "\u4e2d\u983b\u8a2d\u5b9a": "Mid Frequency Settings", "\u9ad8\u983b\u8a2d\u5b9a": "High Frequency Settings", "\u52d5\u614b\u58d3\u7e2e": "Dynamic Compression",
  550. "\u58d3\u7e2e\u7387": "Compression Ratio", "\u904e\u6e21\u53cd\u61c9": "Knee", "\u95be\u503c": "Threshold", "\u8d77\u97f3\u901f\u5ea6": "Attack Time", "\u91cb\u653e\u901f\u5ea6": "Release Time", "\u95dc\u9589": "Close", "\u4fdd\u5b58": "Save", "\u4e0d\u652f\u63f4\u97f3\u983b\u589e\u5f37\u7bc0\u9ede": "Audio Enhancement Node Not Supported", "\u6dfb\u52a0\u589e\u5f37\u7bc0\u9ede\u6210\u529f": "Enhancement Node Added Successfully", "\u71b1\u9375\u547c\u53eb\u8abf\u6574\u83dc\u55ae!!\n\n\u5feb\u6377\u7d44\u5408 : (Alt + B)": "Hotkey Menu Opened!!\n\nShortcut Combination: (Alt + B)"
  551. }
  552. });
  553. return { Transl: g => h[g] ?? g }
  554. }(), z = (() => { let h = new Set(Syn.gV("Banned", [])); var g = Syn.gV("BannedDomains_v2"); g && (g = Object.keys(g), Syn.sV("Banned", g), Syn.dV("BannedDomains_v2"), h = new Set(g)); let n = h.has(Syn.$domain); return { IsEnabled: u => u(!n), AddBanned: async () => { n ? h.delete(Syn.$domain) : h.add(Syn.$domain); Syn.sV("Banned", [...h]); location.reload() } } })(), { Start: D, SetControl: C, Parame: d } = function () {
  555. function h(q) {
  556. try {
  557. if (!A) throw Error(c("\u4e0d\u652f\u63f4\u97f3\u983b\u589e\u5f37\u7bc0\u9ede")); p ||= new A; "suspended" ===
  558. p.state && p.resume(); const w = f.length; for (const e of q) {
  559. e.crossOrigin || (e.crossOrigin = "anonymous"); if (e.mediaKeys || e.encrypted || 0 < e.textTracks.length) continue; const k = p.createMediaElementSource(e), b = p.createGain(), r = p.createBiquadFilter(), l = p.createBiquadFilter(), t = p.createBiquadFilter(), m = p.createDynamicsCompressor(); b.gain.value = a.Gain; r.type = "lowshelf"; r.gain.value = a.LowFilterGain; r.frequency.value = a.LowFilterFreq; l.type = "peaking"; l.Q.value = a.MidFilterQ; l.gain.value = a.MidFilterGain; l.frequency.value =
  560. a.MidFilterFreq; t.type = "highshelf"; t.gain.value = a.HighFilterGain; t.frequency.value = a.HighFilterFreq; m.ratio.value = a.CompressorRatio; m.knee.value = a.CompressorKnee; m.threshold.value = a.CompressorThreshold; m.attack.value = a.CompressorAttack; m.release.value = a.CompressorRelease; k.connect(b).connect(r).connect(l).connect(t).connect(m).connect(p.destination); f.push({
  561. Gain: b.gain, LowFilterGain: r.gain, LowFilterFreq: r.frequency, MidFilterQ: l.Q, MidFilterGain: l.gain, MidFilterFreq: l.frequency, HighFilterGain: t.gain,
  562. HighFilterFreq: t.frequency, CompressorRatio: m.ratio, CompressorKnee: m.knee, CompressorThreshold: m.threshold, CompressorAttack: m.attack, CompressorRelease: m.release
  563. }); B.set(e, !0)
  564. } f.length > w && (Syn.Log(c("\u6dfb\u52a0\u589e\u5f37\u7bc0\u9ede\u6210\u529f"), { "Booster Media : ": q }, { collapsed: !1 }), g || (g = !0, E(), Syn.Menu({
  565. [c("\ud83d\udcdc \u83dc\u55ae\u71b1\u9375")]: () => alert(c("\u71b1\u9375\u547c\u53eb\u8abf\u6574\u83dc\u55ae!!\n\n\u5feb\u6377\u7d44\u5408 : (Alt + B)")), [c("\ud83d\udee0\ufe0f \u8abf\u6574\u83dc\u55ae")]: () =>
  566. y()
  567. }, { index: 2 }), Syn.StoreListen([Syn.$domain], e => { e.far && e.key == Syn.$domain && Object.entries(e.nv).forEach(([k, b]) => { v.SetBooster(k, b) }) }))); setTimeout(() => { n.observe(document, u) }, 3E3); return { SetBooster: (e, k) => { a[e] = k; f.forEach(b => { b[e].value = k }) } }
  568. } catch (w) { Syn.Log(c("\u589e\u5f37\u932f\u8aa4"), w, { type: "error", collapsed: !1 }) }
  569. } let g = !1, n = null, u = null, v = null, x = !1; const a = {}, f = [], B = new Map; let p = null; const A = window.AudioContext || window.webkitAudioContext, E = async () => {
  570. Syn.onEvent(document, "keydown", q => {
  571. q.altKey &&
  572. "B" == q.key.toUpperCase() && y()
  573. }, { passive: !0, capture: !0, mark: "Volume-Booster-Hotkey" })
  574. }; return {
  575. Start: function () {
  576. z.IsEnabled(q => {
  577. const w = async e => { Syn.Menu({ [e]: () => z.AddBanned() }) }; if (q) {
  578. const e = Syn.Debounce(k => { const b = [], r = document.createTreeWalker(Syn.body, NodeFilter.SHOW_ELEMENT, { acceptNode: l => { const t = l.tagName; return "VIDEO" !== t && "AUDIO" !== t || B.has(l) ? NodeFilter.FILTER_SKIP : NodeFilter.FILTER_ACCEPT } }); for (; r.nextNode();)b.push(r.currentNode); 0 < b.length && k(b) }, 50); Syn.Observer(document, () => {
  579. e(k => {
  580. n.disconnect(); try {
  581. if (!x) {
  582. x = !0; let b = Syn.gV(Syn.$domain, {}); "number" === typeof b && (b = { Gain: b }); Object.assign(a, {
  583. Gain: b.Gain ?? 1, LowFilterGain: b.LowFilterGain ?? 1.2, LowFilterFreq: b.LowFilterFrequency ?? 200, MidFilterQ: b.MidFilterQ ?? 1, MidFilterGain: b.MidFilterGain ?? 1.6, MidFilterFreq: b.MidFilterFrequency ?? 2E3, HighFilterGain: b.HighFilterGain ?? 1.8, HighFilterFreq: b.HighFilterFreq ?? 1E4, CompressorRatio: b.CompressorRatio ?? 3, CompressorKnee: b.CompressorKnee ?? 4, CompressorThreshold: b.CompressorThreshold ?? -8, CompressorAttack: b.CompressorAttack ??
  584. .03, CompressorRelease: b.CompressorRelease ?? .2
  585. })
  586. } v = h(k)
  587. } catch (b) { Syn.Log("Trigger Error : ", b, { type: "error", collapsed: !1 }) }
  588. })
  589. }, { mark: "Media-Booster", attributes: !1, throttle: 200 }, ({ ob: k, op: b }) => { n = k; u = b; w(c("\u274c \u7981\u7528\u589e\u5e45")) })
  590. } else w(c("\u2705 \u555f\u7528\u589e\u5e45"))
  591. })
  592. }, SetControl: (...q) => v.SetBooster(...q), Parame: a
  593. }
  594. }(); D()
  595. })();