Greasy Fork is available in English.

MUSIC SIEU CHILL ( muấn thêm nhạc ib discord :taochsgamedekiemgai2207 )

Press "tab" or "]" for Menu 1 , press "[" or "`" for Menu 2

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
  1. // ==UserScript==
  2. // @name MUSIC SIEU CHILL ( muấn thêm nhạc ib discord :taochsgamedekiemgai2207 )
  3. // @namespace http://tampermonkey.net/
  4. // @version 5,5 (beta test )
  5. // @description Press "tab" or "]" for Menu 1 , press "[" or "`" for Menu 2
  6. // @author XUAN & taochsgamedekiemgai2207 ( cre: Zick & Ano master and RektByMateX)
  7. // @match *://*.sploop.io/*
  8. // @match *://*.*/*
  9. // @match *://*.moomoo.io/*
  10. // @match *://*.gemini.google.com/*
  11. // @match *://*.www.crazygames.com/*
  12. // @match *://*.youtube.com/*
  13. // @match *://*.extension/*
  14. // @match *://translate.google.com/*
  15. // @match *://translate.google.cn/*
  16. // @match *://*.edge/*
  17. // @match *://starve.io/*
  18. // @match *://moomoo.io/*
  19. // @match *://sandbox.moomoo.io/*
  20. // @match *://dev.moomoo.io/*
  21. // @match *://*.moomoo.io/*
  22. // @match *://surviv.io/*
  23. // @match *://agar.io/*
  24. // @match *://slither.io/*
  25. // @match *://diep.io/*
  26. // @match *://deeeep.io/*
  27. // @match *://evowars.io/*
  28. // @match *://zombs.io/*
  29. // @match *://paper-io.com/*
  30. // @match *://skribbl.io/*
  31. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
  32. // @require https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.2/signalr.min.js
  33. // @match https://forms.office.com/Pages/ResponsePage.aspx?*
  34. // @match https://shub.edu.vn/*
  35. // @match https://azota.vn/*
  36. // @match https://quilgo.com/*
  37. // @match https://docs.google.com/forms/*
  38. // @match *://agar.io/*
  39. // @match *://sploop.io/*
  40. // @match *://mineenergy.fun/*
  41. // @match *://sandbox.moomoo.io/*
  42. // @match *://starve.io/*
  43. // @match *://taming.io/*
  44. // @match *://arras.io/*
  45. // @match *://*.www.bing.com/*
  46. // @match https://cn.bing.com/*
  47. // @match https://www.bing.com/*
  48. // @match *://*.bing.com/*
  49. // @match *://*/*
  50. // @match https://chat.openai.com/chat
  51. // @match https://www.google.com/*
  52. // @match https://duckduckgo.com/*
  53. // @match https://www.so.com/s*
  54. // @match *://m.so.com/s*
  55. // @match *://www.baidu.com/s*
  56. // @match https://www.baidu.com/*
  57. // @match https://m.baidu.com/*
  58. // @match *://baidu.com/s*
  59. // @match *://yandex.ru/search*
  60. // @match *://yandex.com/search*
  61. // @match https://search.ecnu.cf/search*
  62. // @match https://search.aust.cf/search*
  63. // @match https://search.*.cf/search*
  64. // @match https://* .cf:*/*
  65. // @match *://gooo.azurewebsites.net/*
  66. // @match https://fsoufsou.com/search*
  67. // @match https://www.google.com.hk/*
  68. // @match *://www.sogou.com/*
  69. // @match *://m.sogou.com/*
  70. // @match *://wap.sogou.com/*
  71. // @match *://*.tiangong.cn/*
  72. // @match *://www.bilibili.com/video/*
  73. // @match *://blog.csdn.net/*/article/details/*
  74. // @match *://chatglm.cn/*
  75. // @match *://*.chatgpt.com/*
  76. // @match *://starve.io/*
  77. // @match *://classroom.google.com/*
  78. // @match *://*.moomoo.io/*
  79. // @match *://moomoo.io/*
  80. // @match *://sandbox.moomoo.io/*
  81. // @match *://www.google.com/recaptcha/api2/*
  82. // @match *://diep.io/*
  83. // @match *://www.baidu.com/*
  84. // @match *://baidu.com/*
  85. // @match *://m.baidu.com/*
  86. // @match *://*.greasyfork.org/*
  87. // @match *://*.google.com/*
  88. // @match *://*.azota.vn/*
  89. // @match *://*.chess.com/*
  90. // @match *://*.google.com.vn/*
  91. // @match *://*.poki.com/*
  92. // @match *://*.yahoo.com/*
  93. // @match *://*.search.yahoo.com/*
  94. // @match *://*.roblox.com/*
  95. // @match *://*.battledudes.io/*
  96. // @match *://*.taming.io/*
  97. // @match *://*.starblast.io/*
  98. // @match *://www.baidu.com/*
  99. // @match *://ipv6.baidu.com/*
  100. // @match *://image.baidu.com/search*
  101. // @match *://kaifa.baidu.com/searchPage*
  102. // @match *://*.bing.com/*search*
  103. // @match *://duckduckgo.com/*
  104. // @match *://*.sogou.com/*
  105. // @match *://www.qwant.com/?*
  106. // @match *://www.so.com/s*
  107. // @match *://image.so.com/*
  108. // @match *://so.toutiao.com/search*
  109. // @match *://yandex.com/*search*
  110. // @match *://yandex.ru/*search*
  111. // @match *://www.ecosia.org/*
  112. // @match *://*.search.yahoo.com/search*
  113. // @match *://*.images.search.yahoo.com/search*
  114. // @match *://you.com/search*
  115. // @match *://www.startpage.com/*
  116. // @match *://search.brave.com/*
  117. // @match *://yep.com/*
  118. // @match *://swisscows.com/*
  119. // @match *://search.inetol.net/search*
  120. // @match *://*.google.com/search*
  121. // @match *://*.google.ad/search*
  122. // @match *://*.google.ae/search*
  123. // @match *://*.google.com.af/search*
  124. // @match *://*.google.com.ag/search*
  125. // @match *://*.google.com.ai/search*
  126. // @match *://*.google.al/search*
  127. // @match *://*.google.am/search*
  128. // @match *://*.google.co.ao/search*
  129. // @match *://*.google.com.ar/search*
  130. // @match *://*.google.as/search*
  131. // @match *://*.google.at/search*
  132. // @match *://*.google.com.au/search*
  133. // @match *://*.google.az/search*
  134. // @match *://*.google.ba/search*
  135. // @match *://*.google.com.bd/search*
  136. // @match *://*.google.be/search*
  137. // @match *://*.google.bf/search*
  138. // @match *://*.google.bg/search*
  139. // @match *://*.google.com.bh/search*
  140. // @match *://*.google.bi/search*
  141. // @match *://*.google.bj/search*
  142. // @match *://*.google.com.bn/search*
  143. // @match *://*.google.com.bo/search*
  144. // @match *://*.google.com.br/search*
  145. // @match *://*.google.bs/search*
  146. // @match *://*.google.bt/search*
  147. // @match *://*.google.co.bw/search*
  148. // @match *://*.google.by/search*
  149. // @match *://*.google.com.bz/search*
  150. // @match *://*.google.ca/search*
  151. // @match *://*.google.cd/search*
  152. // @match *://*.google.cf/search*
  153. // @match *://*.google.cg/search*
  154. // @match *://*.google.ch/search*
  155. // @match *://*.google.ci/search*
  156. // @match *://*.google.co.ck/search*
  157. // @match *://*.google.cl/search*
  158. // @match *://*.google.cm/search*
  159. // @match *://*.google.cn/search*
  160. // @match *://*.google.com.co/search*
  161. // @match *://*.google.co.cr/search*
  162. // @match *://*.google.com.cu/search*
  163. // @match *://*.google.cv/search*
  164. // @match *://*.google.com.cy/search*
  165. // @match *://*.google.cz/search*
  166. // @match *://*.google.de/search*
  167. // @match *://*.google.dj/search*
  168. // @match *://*.google.dk/search*
  169. // @match *://*.google.dm/search*
  170. // @match *://*.google.com.do/search*
  171. // @match *://*.google.dz/search*
  172. // @match *://*.google.com.ec/search*
  173. // @match *://*.google.ee/search*
  174. // @match *://*.google.com.eg/search*
  175. // @match *://*.google.es/search*
  176. // @match *://*.google.com.et/search*
  177. // @match *://*.google.fi/search*
  178. // @match *://*.google.com.fj/search*
  179. // @match *://*.google.fm/search*
  180. // @match *://*.google.fr/search*
  181. // @match *://*.google.ga/search*
  182. // @match *://*.google.ge/search*
  183. // @match *://*.google.gg/search*
  184. // @match *://*.google.com.gh/search*
  185. // @match *://*.google.com.gi/search*
  186. // @match *://*.google.gl/search*
  187. // @match *://*.google.gm/search*
  188. // @match *://*.google.gr/search*
  189. // @match *://*.google.com.gt/search*
  190. // @match *://*.google.gy/search*
  191. // @match *://*.google.hk/search*
  192. // @match *://*.google.com.hk/search*
  193. // @match *://*.google.hn/search*
  194. // @match *://*.google.hr/search*
  195. // @match *://*.google.ht/search*
  196. // @match *://*.google.hu/search*
  197. // @match *://*.google.co.id/search*
  198. // @match *://*.google.ie/search*
  199. // @match *://*.google.co.il/search*
  200. // @match *://*.google.im/search*
  201. // @match *://*.google.co.in/search*
  202. // @match *://*.google.iq/search*
  203. // @match *://*.google.is/search*
  204. // @match *://*.google.it/search*
  205. // @match *://*.google.je/search*
  206. // @match *://*.google.com.jm/search*
  207. // @match *://*.google.jo/search*
  208. // @match *://*.google.jp/search*
  209. // @match *://*.google.co.jp/search*
  210. // @match *://*.google.co.ke/search*
  211. // @match *://*.google.com.kh/search*
  212. // @match *://*.google.ki/search*
  213. // @match *://*.google.kg/search*
  214. // @match *://*.google.co.kr/search*
  215. // @match *://*.google.com.kw/search*
  216. // @match *://*.google.kz/search*
  217. // @match *://*.google.la/search*
  218. // @match *://*.google.com.lb/search*
  219. // @match *://*.google.li/search*
  220. // @match *://*.google.lk/search*
  221. // @match *://*.google.co.ls/search*
  222. // @match *://*.google.lt/search*
  223. // @match *://*.google.lu/search*
  224. // @match *://*.google.lv/search*
  225. // @match *://*.google.com.ly/search*
  226. // @match *://*.google.co.ma/search*
  227. // @match *://*.google.md/search*
  228. // @match *://*.google.me/search*
  229. // @match *://*.google.mg/search*
  230. // @match *://*.google.mk/search*
  231. // @match *://*.google.ml/search*
  232. // @match *://*.google.com.mm/search*
  233. // @match *://*.google.mn/search*
  234. // @match *://*.google.ms/search*
  235. // @match *://*.google.com.mt/search*
  236. // @match *://*.google.mu/search*
  237. // @match *://*.google.mv/search*
  238. // @match *://*.google.mw/search*
  239. // @match *://*.google.com.mx/search*
  240. // @match *://*.google.com.my/search*
  241. // @match *://*.google.co.mz/search*
  242. // @match *://*.google.com.na/search*
  243. // @match *://*.google.com.ng/search*
  244. // @match *://*.google.com.ni/search*
  245. // @match *://*.google.ne/search*
  246. // @match *://*.google.nl/search*
  247. // @match *://*.google.no/search*
  248. // @match *://*.google.com.np/search*
  249. // @match *://*.google.nr/search*
  250. // @match *://*.google.nu/search*
  251. // @match *://*.google.co.nz/search*
  252. // @match *://*.google.com.om/search*
  253. // @match *://*.google.com.pa/search*
  254. // @match *://*.google.com.pe/search*
  255. // @match *://*.google.com.pg/search*
  256. // @match *://*.google.com.ph/search*
  257. // @match *://*.google.com.pk/search*
  258. // @match *://*.google.pl/search*
  259. // @match *://*.google.pn/search*
  260. // @match *://*.google.com.pr/search*
  261. // @match *://*.google.ps/search*
  262. // @match *://*.google.pt/search*
  263. // @match *://*.google.com.py/search*
  264. // @match *://*.google.com.qa/search*
  265. // @match *://*.google.ro/search*
  266. // @match *://*.google.ru/search*
  267. // @match *://*.google.rw/search*
  268. // @match *://*.google.com.sa/search*
  269. // @match *://*.google.com.sb/search*
  270. // @match *://*.google.sc/search*
  271. // @match *://*.google.se/search*
  272. // @match *://*.google.com.sg/search*
  273. // @match *://*.google.sh/search*
  274. // @match *://*.google.si/search*
  275. // @match *://*.google.sk/search*
  276. // @match *://*.google.com.sl/search*
  277. // @match *://*.google.sn/search*
  278. // @match *://*.google.so/search*
  279. // @match *://*.google.sm/search*
  280. // @match *://*.google.sr/search*
  281. // @match *://*.google.st/search*
  282. // @match *://*.google.com.sv/search*
  283. // @match *://*.google.td/search*
  284. // @match *://*.google.tg/search*
  285. // @match *://*.google.co.th/search*
  286. // @match *://*.google.com.tj/search*
  287. // @match *://*.google.tl/search*
  288. // @match *://*.google.tm/search*
  289. // @match *://*.google.tn/search*
  290. // @match *://*.google.to/search*
  291. // @match *://*.google.com.tr/search*
  292. // @match *://*.google.tt/search*
  293. // @match *://*.google.com.tw/search*
  294. // @match *://*.google.co.tz/search*
  295. // @match *://*.google.com.ua/search*
  296. // @match *://*.google.co.ug/search*
  297. // @match *://*.google.co.uk/search*
  298. // @match *://*.google.com.uy/search*
  299. // @match *://*.google.co.uz/search*
  300. // @match *://*.google.com.vc/search*
  301. // @match *://*.google.co.ve/search*
  302. // @match *://*.google.vg/search*
  303. // @match *://*.google.co.vi/search*
  304. // @match *://*.google.com.vn/search*
  305. // @match *://*.google.vu/search*
  306. // @match *://*.google.ws/search*
  307. // @match *://*.google.rs/search*
  308. // @match *://*.google.co.za/search*
  309. // @match *://*.google.co.zm/search*
  310. // @match *://*.google.co.zw/search*
  311. // @match *://*.google.cat/search*
  312. // @match *://*.yahoo/*
  313. // @match *://*./*
  314. // @grant none
  315. // ==/UserScript==
  316.  
  317. (function() {
  318. 'use strict';
  319.  
  320. // Create the music menu container
  321. const musicMenuContainer = document.createElement('div');
  322. musicMenuContainer.id = 'musicMenuContainer';
  323. musicMenuContainer.style.position = 'absolute';
  324. musicMenuContainer.style.top = '0';
  325. musicMenuContainer.style.left = '0';
  326. musicMenuContainer.style.width = '250px';
  327. musicMenuContainer.style.maxHeight = '100vh';
  328. musicMenuContainer.style.overflowY = 'auto';
  329. musicMenuContainer.style.backgroundColor = 'rgba(0, 0, 0, 0.51)';
  330. musicMenuContainer.style.color = '#fff';
  331. musicMenuContainer.style.borderRadius = '10px';
  332. musicMenuContainer.style.padding = '20px';
  333. musicMenuContainer.style.zIndex = '9999';
  334. musicMenuContainer.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0,5)';
  335. musicMenuContainer.style.display = 'none'; // Initially hidden
  336.  
  337. // Title for music menu
  338. const musicTitle = document.createElement('h2');
  339. musicTitle.textContent = ' bấm nút " tab hoạc ] " để mở hoạc tắt menu , bấm "[ hay ` " để mở menu số 2';
  340. musicTitle.style.textAlign = 'center';
  341. musicMenuContainer.appendChild(musicTitle);
  342.  
  343. // Volume control
  344. const volumeLabel = document.createElement('label');
  345. volumeLabel.textContent = 'âm thanh:';
  346. musicMenuContainer.appendChild(volumeLabel);
  347.  
  348. const volumeSlider = createSlider(0, 100, 50);
  349. volumeSlider.addEventListener('input', () => {
  350. const volume = volumeSlider.value / 100;
  351. player.setVolume(volume * 100);
  352. });
  353. musicMenuContainer.appendChild(volumeSlider);
  354.  
  355. // Mute/Unmute button
  356. const muteButton = createButton('tắt tiếng', 'rgba(255, 165, 0, 0.5)');
  357. let isMuted = false;
  358. muteButton.addEventListener('click', () => {
  359. isMuted = !isMuted;
  360. player.setVolume(isMuted ? 0 : volumeSlider.value);
  361. muteButton.textContent = isMuted ? 'mở tiếng' : 'tắt tiếng';
  362. });
  363. musicMenuContainer.appendChild(muteButton);
  364.  
  365. // Playback speed control
  366. const speedLabel = document.createElement('label');
  367. speedLabel.textContent = 'tốc độ nhạc:';
  368. musicMenuContainer.appendChild(speedLabel);
  369.  
  370. const speedSelect = createSelect([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9, 2,3,4,5,6,7,8,9,10,100,1000,10000,1000000,1000000], 'x');
  371. speedSelect.addEventListener('change', () => {
  372. player.setPlaybackRate(parseFloat(speedSelect.value));
  373. });
  374. musicMenuContainer.appendChild(speedSelect);
  375.  
  376. // Track progress bar
  377. const progressContainer = document.createElement('div');
  378. const progressBar = document.createElement('input');
  379. progressBar.type = 'range';
  380. progressBar.min = '0';
  381. progressBar.max = '100';
  382. progressBar.value = '0';
  383. progressBar.style.width = '100%';
  384. progressBar.style.marginBottom = '10px';
  385. progressBar.disabled = true;
  386.  
  387. progressBar.addEventListener('input', () => {
  388. const time = (progressBar.value / 100) * player.getDuration();
  389. player.seekTo(time);
  390. });
  391.  
  392. progressContainer.appendChild(progressBar);
  393. musicMenuContainer.appendChild(progressContainer);
  394.  
  395. // Song duration display
  396. const durationDisplay = document.createElement('div');
  397. durationDisplay.textContent = 'thời gian: 0:00 / 0:00';
  398. durationDisplay.style.textAlign = 'center';
  399. musicMenuContainer.appendChild(durationDisplay);
  400.  
  401. // List of music genres and their YouTube links
  402. const musicList = [
  403. { name: 'chill', url: 'https://www.youtube.com/watch?v=PifAHkKlP8E&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=115&ab_channel=%F0%9D%9A%85%F0%9D%9A%92%F0%9D%9A%98%F0%9D%9A%95%F0%9D%9A%8E%F0%9D%9A%9D%F0%9D%9A%9D%F0%9D%9A%8E' },
  404. { name: 'The Right Path', url: 'https://www.youtube.com/watch?v=o_Figo57l8s&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=114&ab_channel=KainRecordings' },
  405. { name: 'Glass Animals', url: 'https://www.youtube.com/watch?v=6APgzehjAQM&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=113' },
  406. { name: 'chill 2', url: 'https://www.youtube.com/watch?v=LAMNfW9v2t0&list=PLRBp0Fe2GpgnIh0AiYKh7o7HnYAej-5ph' },
  407. { name: 'chill 3', url: 'https://www.youtube.com/watch?v=AQbvCfRCFvg&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=111&pp=gAQBiAQB8AUB' },
  408. { name: 'Darkside', url: 'https://www.youtube.com/watch?v=AIikYWUbAB0&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=110' },
  409. { name: 'lovely', url: 'https://www.youtube.com/watch?v=0Ghcjygr66g&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=106' },
  410. { name: 'chill 4', url: 'https://www.youtube.com/watch?v=5yaTVGSXAMc&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=103' },
  411. { name: 'chill 5', url: 'https://www.youtube.com/watch?v=Y6AiKryrDyk&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=104&pp=gAQBiAQB8AUB' },
  412. { name: 'I Want You to Know', url: 'https://www.youtube.com/watch?v=iwPEPqNerPY&ab_channel=BeatPanda' },
  413. { name: 'Tháng Năm Không Quên', url: 'https://www.youtube.com/watch?v=g3s-OdZazbQ&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=102' },
  414. { name: 'Bài Hát Liên Quân', url: 'https://www.youtube.com/watch?v=CxXN5DmI9s4&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=101' },
  415. { name: 'DDTank - Tết Nhà Bà Hoan Parody ', url: 'https://www.youtube.com/watch?v=NRRs9HyfNMc&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=95' },
  416. { name: 'Legendary', url: 'https://www.youtube.com/watch?v=cTlshvPrIZo&list=RDQMBlegB1oalTw&index=19' },
  417. { name: 'ĐẾ VƯƠNG', url: 'https://www.youtube.com/watch?v=qkPgUgkQE4Y&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=93' },
  418. { name: 'Lost Sky', url: 'https://www.youtube.com/watch?v=L7kF4MXXCoA&list=RDQMBlegB1oalTw&index=21' },
  419. { name: 'Tướng Quân ', url: 'https://www.youtube.com/watch?v=U-hAhjg56HU&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=92' },
  420. { name: 'candyland', url: 'https://www.youtube.com/watch?v=IhchfhxvPKI&ab_channel=Tobu' },
  421. { name: 'Vicetone - Nevada', url: 'https://www.youtube.com/watch?v=AnMhdn0wJ4I&list=RDQMBlegB1oalTw&index=25' },
  422. { name: 'Believer ', url: 'https://www.youtube.com/watch?v=FXqp9WiFWzc&list=RDQMBlegB1oalTw&index=17' },
  423. { name: 'On & On', url: 'https://www.youtube.com/watch?v=XsZZQPKLChY&list=RDQMBlegB1oalTw&index=15' },
  424. { name: '💋💜Nevada💜💋', url: 'https://www.youtube.com/watch?v=bLrOTFDU2ZI&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=109&ab_channel=Detective.J' },
  425. { name: 'Legends Never Die', url: 'https://www.youtube.com/watch?v=r6zIGXun57U&list=RDQMBlegB1oalTw&index=3' },
  426. { name: 'nevada', url: 'https://www.youtube.com/watch?v=2jzxIOCYzEM&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=108&ab_channel=Jarctix' },
  427. { name: 'chill 6', url: 'https://www.youtube.com/watch?v=ZzbYaDHkObY&list=RDQMBlegB1oalTw&index=5' },
  428. { name: 'chill 7', url: 'https://www.youtube.com/watch?v=9pO-Cuq7R1Y&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=91&ab_channel=%23phuongmusic.' },
  429. { name: 'chill 8', url: 'https://www.youtube.com/watch?v=o85fLo47FUE&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=90&pp=gAQBiAQB8AUB' },
  430. { name: 'chill 9', url: 'https://www.youtube.com/watch?v=NHDKk1QyfhM&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=89&pp=gAQBiAQB8AUB' },
  431. { name: 'chill 10', url: 'https://www.youtube.com/watch?v=WKtJ7tVgxxs&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=88&pp=gAQBiAQB8AUB' },
  432. { name: 'chill 11', url: 'https://www.youtube.com/watch?v=kkRqgK6GOWs&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=86&pp=gAQBiAQB8AUB' },
  433. { name: 'chill 12', url: 'https://www.youtube.com/watch?v=kkRqgK6GOWs&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=86&pp=gAQBiAQB8AUB' },
  434. { name: 'chill 13', url: 'https://www.youtube.com/watch?v=xZhkxpwkYiA&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=84&pp=gAQBiAQB8AUB' },
  435. { name: 'chill 14', url: 'https://www.youtube.com/watch?v=_0FI0jVeNUQ&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=83&pp=gAQBiAQB8AUB' },
  436. { name: 'chill 15', url: 'https://www.youtube.com/watch?v=w35LzCA0YLY&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=82&pp=gAQBiAQB8AUB' },
  437. { name: 'chill 16', url: 'https://www.youtube.com/watch?v=40EAqsXibhM&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=81&pp=gAQBiAQB8AUB' },
  438. { name: 'chill 17', url: 'https://www.youtube.com/watch?v=J4L-1FLXVLM&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=80&pp=gAQBiAQB8AUB' },
  439. { name: 'chill 18', url: 'https://www.youtube.com/watch?v=_7G-E0N9D0w&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=79&pp=gAQBiAQB8AUB' },
  440. { name: 'chill 19', url: 'https://www.youtube.com/watch?v=-my-C09BdPc&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=77&pp=gAQBiAQB8AUB' },
  441. { name: 'chill 20', url: 'https://www.youtube.com/watch?v=bb5ucM01Em0&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=76&pp=gAQBiAQB8AUB' },
  442. { name: 'chill 21', url: 'https://www.youtube.com/watch?v=7ld_7tRuasg&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=75&pp=gAQBiAQB8AUB' },
  443. { name: 'chill 22', url: 'https://www.youtube.com/watch?v=b0vf8CAh82c&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=73&pp=gAQBiAQB8AUB' },
  444. { name: 'chill 23', url: 'https://www.youtube.com/watch?v=ocfOBZSOwGc&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=72&pp=gAQBiAQB8AUB' },
  445. { name: 'chill 24', url: 'https://www.youtube.com/watch?v=caf7T4AubSE&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=71&pp=gAQBiAQB8AUB' },
  446. { name: 'chill 25', url: 'https://www.youtube.com/watch?v=ZhGWQuqE758&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=65&pp=gAQBiAQB8AUB' },
  447. { name: 'chill 26', url: 'https://www.youtube.com/watch?v=h3aWuBzimTk&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=66&pp=gAQBiAQB8AUB' },
  448. { name: 'chill 27', url: 'https://www.youtube.com/watch?v=RKF4Tn7P-MQ&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=63&pp=gAQBiAQB8AUB' },
  449. { name: 'chill 28', url: 'https://www.youtube.com/watch?v=7bLDnULTyaA&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=61&pp=gAQBiAQB8AUB' },
  450. { name: 'Run Free', url: 'https://www.youtube.com/watch?v=o3KXwe-7A-I&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=60&ab_channel=ATLAST' },
  451. { name: 'Shadow Of The Sun', url: 'https://www.youtube.com/watch?v=HsM9VucuCtw&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=59&ab_channel=AZURA' },
  452. { name: 'Cưới Thôi', url: 'https://www.youtube.com/watch?v=JOWqEpONn9w&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=58' },
  453. { name: 'Ấn Nút Nhớ Thả Giấc Mơ', url: 'https://www.youtube.com/watch?v=sSljdfttEl8&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=58&ab_channel=N26Music%E2%99%AA' },
  454. { name: 'huan BACK HOME', url: 'https://www.youtube.com/watch?v=8Tx36l5MGxg&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=55&pp=gAQBiAQB8AUB' },
  455. { name: 'WAY BACK HOME', url: 'https://www.youtube.com/watch?v=1kehqCLudyg&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=54&pp=gAQBiAQB8AUB' },
  456. { name: 'THAT GIRL', url: 'https://www.youtube.com/watch?v=OUtbNopS4xU&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=53&pp=gAQBiAQB8AUB' },
  457. { name: 'PRETTY GIRL', url: 'https://www.youtube.com/watch?v=ptIXwyxf7XQ&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=52&pp=gAQBiAQB8AUB' },
  458. { name: 'DREAM-SAVE ME', url: 'https://www.youtube.com/watch?v=rREz6DYDXng&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=48&pp=gAQBiAQB8AUB' },
  459. { name: 'ALAN- PLAY', url: 'https://www.youtube.com/watch?v=YQRHrco73g4&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=44&pp=gAQBiAQB8AUB' },
  460. { name: 'NHAC REVIEW PHIM', url: 'https://www.youtube.com/watch?v=ialVTirpQ5Q&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=43&pp=gAQBiAQB8AUB' },
  461. { name: 'LOVE IS GONE', url: 'https://www.youtube.com/watch?v=c6SZy7miyaY&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=42&pp=gAQBiAQB8AUB' },
  462. { name: 'MONODY', url: 'https://www.youtube.com/watch?v=1MZR0BEniIY&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=36&pp=gAQBiAQB8AUB' },
  463. { name: 'STEORT HEAL', url: 'https://www.youtube.com/watch?v=Y1pq2oLXbTQ&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=33&pp=gAQBiAQB8AUB' },
  464. { name: 'CLOSE THE SUN', url: 'https://www.youtube.com/watch?v=VyXm3GTdNf0' },
  465. { name: 'PSYCHO', url: 'https://www.youtube.com/watch?v=YvLRu5vcr68' },
  466. { name: 'Yami', url: 'https://www.youtube.com/watch?v=eTgxYFXP1hc&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=14&ab_channel=C%C3%A0Chua' },
  467. { name: 'RETUNR', url: 'https://www.youtube.com/watch?v=m4Hg_JMtJqI&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=15&pp=gAQBiAQB8AUB' },
  468. { name: 'TOP EDM', url: 'https://www.youtube.com/watch?v=xlTZywrfO7E&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=17&pp=gAQBiAQB8AUB' },
  469. { name: 'HIS THEME', url: 'https://www.youtube.com/watch?v=qOpsp9bJFP4&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=12&pp=gAQBiAQB8AUB' },
  470. { name: 'CHILL 29', url: 'https://www.youtube.com/watch?v=ybgvaC4rfAE&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&ab_channel=%F0%9D%90%92%F0%9D%90%9A%F0%9D%90%9D%F0%9D%90%82%F0%9D%90%A1%F0%9D%90%A2%F0%9D%90%A5%F0%9D%90%A5-%F0%9D%90%94%F0%9D%90%92%F0%9D%90%94%F0%9D%90%8A' },
  471. { name: 'CHILL 30', url: 'https://www.youtube.com/watch?v=-GDI6oT6Jp8&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=2&pp=gAQBiAQB8AUB' },
  472. { name: 'CHILL 31', url: 'https://www.youtube.com/watch?v=6LW7tcryoXs&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=3&pp=gAQBiAQB8AUB' },
  473. { name: 'CHILL 32', url: 'https://www.youtube.com/watch?v=6LW7tcryoXs&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=3&pp=gAQBiAQB8AUB' },
  474. { name: 'CHILL 33', url: 'https://www.youtube.com/watch?v=6I5gYHn-QOk&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=4&pp=gAQBiAQB8AUB' },
  475. { name: 'CHILL 34', url: 'https://www.youtube.com/watch?v=5sG4k7rj6MY&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=5&pp=gAQBiAQB8AUB' },
  476. { name: 'CHILL 35', url: 'https://www.youtube.com/watch?v=0wsMSc5hDQg&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=6&pp=gAQBiAQB8AUB' },
  477. { name: 'CHILL 36', url: 'https://www.youtube.com/watch?v=5TZ33vy_v5w&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=7&pp=gAQBiAQB8AUB' },
  478. { name: 'CHILL 37', url: 'https://www.youtube.com/watch?v=5TZ33vy_v5w&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=7&pp=gAQBiAQB8AUB' },
  479. { name: 'CHILL 38', url: 'https://www.youtube.com/watch?v=gfsUC3F8pYA&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=8&pp=gAQBiAQB8AUB' },
  480. { name: 'CHILL 39', url: 'https://www.youtube.com/watch?v=gfsUC3F8pYA&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=8&pp=gAQBiAQB8AUB' },
  481. { name: 'CHILL 40', url: 'https://www.youtube.com/watch?v=zFx0o4epvPA&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=9&pp=gAQBiAQB8AUB' },
  482. { name: 'intro ( real love )', url: 'https://www.youtube.com/watch?v=66nH4dXp_-o' },
  483. { name: 'in the end', url: 'https://www.youtube.com/watch?v=WNeLUngb-Xg' },
  484. { name: '花火が瞬く夜に', url: 'https://www.youtube.com/watch?v=xZ5Rrrul7h8' },
  485. { name: 'Melancholy', url: 'https://www.youtube.com/watch?v=RxglYGHuqFc' },
  486. { name: '只要和你 坐着不说话也觉得浪漫', url: 'https://www.youtube.com/watch?v=DzbesIaB3Y0' },
  487. { name: 'windy hill', url: 'https://www.youtube.com/watch?v=qV97ux4NA28&pp=ygUKd2luZHkgaGlsbA%3D%3D' },
  488. { name: '海底 của 一支榴莲', url: 'https://www.youtube.com/watch?v=v5gK8np-OTA' },
  489. { name: '下辈子还要和你成个家', url: 'https://www.youtube.com/watch?v=6CMITr9dTws' },
  490. { name: 'past lives', url: 'https://www.youtube.com/watch?v=iNa1n6Gch7E' },
  491. { name: 'lovely', url: 'https://www.youtube.com/watch?v=8VLXHyHRXjc&pp=ygUGbG92ZWx5' },
  492. { name: '送给未来的你', url: 'https://www.youtube.com/watch?v=iQfIcgA8qHg' },
  493. { name: '刚好遇见你 sieu hay', url: 'https://www.youtube.com/watch?v=aEhq4WxBYqM' },
  494. { name: 'ALAN 2', url: 'https://www.youtube.com/watch?v=jlQ2hs0EANo' },
  495. { name: 'top chil tq', url: 'https://www.youtube.com/watch?v=2EmGToTikIY' },
  496. { name: 'My Sunset', url: 'https://www.youtube.com/watch?v=GpkHJlyV7TQ' },
  497. { name: 'Nụ Cười Của Cô Ấy', url: 'https://www.youtube.com/watch?v=wvkGE4mtTB0' },
  498. { name: 'Lifeline', url: 'https://www.youtube.com/watch?v=rWTmSHXVfCM' },
  499. { name: 'dancing with your ghost', url: 'https://www.youtube.com/watch?v=emm0uGDGg2o' },
  500. { name: 'shape of you', url: 'https://www.youtube.com/watch?v=Ksin3zNXvzo' },
  501. { name: 'seasons', url: 'https://www.youtube.com/watch?v=Ymts4ldfPws' },
  502. { name: 'L.I.F.E', url: 'https://www.youtube.com/watch?v=_tSWg-KOslM' },
  503. { name: 'summersong', url: 'https://www.youtube.com/watch?v=HoCw_gaCHXE' },
  504. { name: '芒种" (Mang Chủng)', url: 'https://www.youtube.com/watch?v=vgbrIy08e2w' },
  505. { name: 'china-X', url: 'https://www.youtube.com/watch?v=qgVXS8l5smo' },
  506. { name: 'breathe', url: 'https://www.youtube.com/watch?v=KbT-qpE3Kl4' },
  507. { name: 'dynasty', url: 'https://www.youtube.com/watch?v=5OESzopq3dE' },
  508. { name: 'Giày Cao Gót Màu Đỏ', url: 'https://www.youtube.com/watch?v=NygnIPFch-M' },
  509. { name: '20 EDM tq', url: 'https://www.youtube.com/watch?v=IAMbG8OiExU' },
  510. { name: 'top nhac', url: 'https://www.youtube.com/watch?v=u5WZnV3AoA4' },
  511. { name: 'Closer', url: 'https://www.youtube.com/watch?v=PT2_F-1esPk&ab_channel=ChainsmokersVEVO' },
  512. { name: 'dusk till dawn', url: 'https://www.youtube.com/watch?v=p-eS-_olx9M&ab_channel=7clouds' },
  513. { name: 'Mood ', url: 'https://www.youtube.com/watch?v=f1J4dRTMy9A&ab_channel=7clouds' },
  514. { name: 'royalty', url: 'https://www.youtube.com/watch?v=oOi3oJmfz4o&ab_channel=7clouds' },
  515. { name: 'Nova', url: 'https://www.youtube.com/watch?v=Rq-0NxKUR-Y&ab_channel=SrMichi' },
  516. { name: 'Fight', url: 'https://www.youtube.com/watch?v=EVpm3pHYaV4&ab_channel=BeatBrothers' },
  517. { name: 'First Date', url: 'https://www.youtube.com/watch?v=AVK0BIVqLLc&ab_channel=frad' },
  518. { name: 'Vacation', url: 'https://www.youtube.com/watch?v=TidRG-baYi8&ab_channel=Nh%E1%BA%ADtH%E1%BA%A3oTr%E1%BA%A7n' },
  519. { name: 'anh thanh niên', url: 'https://www.youtube.com/watch?v=HPL74s4VPdk&pp=ygUPYW5oIHRoYW5oIG5pw6pu' },
  520. { name: 'kẹo bông ngòn ', url: 'https://www.youtube.com/watch?v=sHa5nQO3jwA&ab_channel=H2KMusic' },
  521. { name: 'Mây x Gió', url: 'https://www.youtube.com/watch?v=0A6hCfFZVj4&ab_channel=DuzmeMusic' },
  522. { name: 'spectre', url: 'https://www.youtube.com/watch?v=wJnBTPUQS5A' },
  523. { name: 'alone', url: 'https://www.youtube.com/watch?v=1-xGerv5FOk' },
  524. { name: 'faded', url: 'https://www.youtube.com/watch?v=60ItHLz5WEA' },
  525. { name: 'chill 41', url: 'https://www.youtube.com/watch?v=4vayrx6PFCQ&ab_channel=AGNES%F0%9F%94%A5' },
  526. { name: 'chill 42', url: 'https://www.youtube.com/watch?v=icxO53ZyK7A' },
  527. { name: 'chill 43', url: 'https://www.youtube.com/watch?v=AQbvCfRCFvg' },
  528. { name: 'On my way', url: 'https://www.youtube.com/watch?v=ETqXUBFZpkE&ab_channel=LOFI_LINES' },
  529. { name: 'Nothin On Me', url: 'https://www.youtube.com/watch?v=qmbB3uR92j8&ab_channel=H%E1%BB%A7Mu%E1%BB%91iM%E1%BA%B7n' },
  530. { name: 'PIXELS', url: 'https://www.youtube.com/watch?v=EUyQgyzpAbE&ab_channel=brianjcb' },
  531. { name: 'Nothing on you', url: 'https://www.youtube.com/watch?v=U573mlR4rYw&ab_channel=DuskMusicASIA' },
  532. { name: 'So Far Away ', url: 'https://www.youtube.com/watch?v=rA0jSPEoyk4&ab_channel=ITMMUSIC' },
  533. { name: 'sold out', url: 'https://www.youtube.com/watch?v=clKvFcl0zwo&ab_channel=LyricsMusic' },
  534. { name: 'the way still love you', url: 'https://www.youtube.com/watch?v=MsBEu1iWsF4&ab_channel=TopTikTok' },
  535. { name: 'Phonecert mashup', url: 'https://www.youtube.com/watch?v=3onAOL9dY1o&list=LL&index=2&ab_channel=RemixTV' },
  536. { name: 'top tq sieu chill', url: 'https://www.youtube.com/watch?v=TmRvke5Ue-k&ab_channel=Tr.T.Kh%C3%A1nhHuy%E1%BB%81n' },
  537. { name: 'Reverse溯 (版钢琴', url: 'https://www.youtube.com/watch?v=v7xRVTXWkbU&ab_channel=HyQMusic%E3%83%84' },
  538. { name: 'DEATH BED', url: 'https://www.youtube.com/watch?v=jJPMnTXl63E&list=PLB8Tk-JabtWed_6pE4H7yqctxbntnjwEe&index=10&pp=gAQBiAQB8AUB' }
  539. ];
  540.  
  541.  
  542. let currentPlayingID = null;
  543. let currentButton = null;
  544.  
  545. // Initialize music list
  546. const musicItemContainer = document.createElement('div');
  547. musicList.forEach(music => addMusicButton(music));
  548. musicMenuContainer.appendChild(musicItemContainer);
  549. document.body.appendChild(musicMenuContainer);
  550.  
  551. function addMusicButton(music) {
  552. const musicItem = document.createElement('div');
  553. musicItem.style.display = 'flex';
  554. musicItem.style.alignItems = 'center';
  555. musicItem.style.marginBottom = '10px';
  556.  
  557. const musicButton = createButton(music.name + ' (nghe thử xem)', 'rgba(0, 255, 255, 0.5)');
  558.  
  559. musicButton.addEventListener('click', () => {
  560. playMusic(music, musicButton);
  561. });
  562.  
  563. musicItem.appendChild(musicButton);
  564. musicItemContainer.appendChild(musicItem);
  565. }
  566.  
  567. // Play the selected music
  568. function playMusic(music, musicButton) {
  569. if (currentPlayingID && currentButton) {
  570. player.stopVideo();
  571. currentButton.textContent = currentButton.textContent.replace(' (Playing)', ' (Play)');
  572. currentButton.style.color = '#fff'; // Reset color
  573. }
  574. const videoID = extractVideoID(music.url);
  575. if (videoID) {
  576. player.loadVideoById(videoID);
  577. player.playVideo();
  578. currentPlayingID = videoID;
  579. currentButton = musicButton;
  580. musicButton.textContent = music.name + ' (Chill nào)';
  581. musicButton.style.color = 'lightgreen'; // Change color to light green when playing
  582. }
  583. }
  584.  
  585. // Create buttons for volume, speed, etc.
  586. function createButton(text, bgColor) {
  587. const button = document.createElement('button');
  588. button.textContent = text;
  589. button.style.width = '100%';
  590. button.style.padding = '10px';
  591. button.style.backgroundColor = bgColor;
  592. button.style.color = '#fff';
  593. button.style.border = 'none';
  594. button.style.borderRadius = '5px';
  595. button.style.cursor = 'pointer';
  596. button.style.transition = 'background-color 0.3s';
  597.  
  598. button.addEventListener('mouseover', () => {
  599. button.style.backgroundColor = 'rgba(255, 255, 255, 0.5)';
  600. });
  601.  
  602. button.addEventListener('mouseout', () => {
  603. button.style.backgroundColor = bgColor;
  604. });
  605.  
  606. return button;
  607. }
  608.  
  609. // Create a slider
  610. function createSlider(min, max, defaultValue) {
  611. const slider = document.createElement('input');
  612. slider.type = 'range';
  613. slider.min = min;
  614. slider.max = max;
  615. slider.value = defaultValue;
  616. slider.style.width = '100%';
  617. slider.style.marginBottom = '10px';
  618. return slider;
  619. }
  620.  
  621. // Create a select dropdown
  622. function createSelect(options, suffix) {
  623. const select = document.createElement('select');
  624. options.forEach(option => {
  625. const opt = document.createElement('option');
  626. opt.value = option;
  627. opt.textContent = `${option}${suffix}`;
  628. select.appendChild(opt);
  629. });
  630. select.style.width = '100%';
  631. return select;
  632. }
  633.  
  634. // Create Pause/Play Button
  635. const pauseButton = createButton('TẠM DỪNG', 'rgba(0, 255, 0, 0.5)');
  636. pauseButton.addEventListener('click', () => {
  637. if (currentPlayingID) {
  638. const state = player.getPlayerState();
  639. if (state === YT.PlayerState.PLAYING) {
  640. player.pauseVideo();
  641. pauseButton.textContent = 'BẮT ĐẦU '; // Change to play
  642. } else {
  643. player.playVideo();
  644. pauseButton.textContent = 'TẠM DỪNG'; // Change to pause
  645. }
  646. }
  647. });
  648. musicMenuContainer.appendChild(pauseButton);
  649.  
  650. // Create Random Play Button
  651. const randomPlayButton = createButton('ngẫu nhiên BÀI NHẠC', 'rgba(255, 0, 255, 0.5)');
  652. randomPlayButton.addEventListener('click', () => {
  653. const randomIndex = Math.floor(Math.random() * musicList.length);
  654. playMusic(musicList[randomIndex], randomPlayButton);
  655. });
  656. musicMenuContainer.appendChild(randomPlayButton);
  657.  
  658. // Create Stop Music button
  659. const stopButton = createButton('Dừng nhạc', 'rgba(255, 0, 0, 0.5)');
  660. stopButton.addEventListener('click', () => {
  661. if (currentPlayingID) {
  662. player.stopVideo();
  663. currentPlayingID = null;
  664. if (currentButton) {
  665. currentButton.textContent = currentButton.textContent.replace(' (Playing)', ' (Play)');
  666. currentButton.style.color = '#fff'; // Reset color
  667. }
  668. }
  669. });
  670. musicMenuContainer.appendChild(stopButton);
  671.  
  672. // Create an invisible player container
  673. const playerContainer = document.createElement('div');
  674. playerContainer.id = 'musicPlayer';
  675. playerContainer.style.position = 'fixed';
  676. playerContainer.style.bottom = '0';
  677. playerContainer.style.right = '0';
  678. playerContainer.style.width = '0';
  679. playerContainer.style.height = '0';
  680. document.body.appendChild(playerContainer);
  681.  
  682. // Load YouTube IFrame Player API
  683. let tag = document.createElement('script');
  684. tag.src = "https://www.youtube.com/iframe_api";
  685. let firstScriptTag = document.getElementsByTagName('script')[0];
  686. firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
  687.  
  688. // Create YouTube player
  689. let player;
  690. window.onYouTubeIframeAPIReady = function() {
  691. player = new YT.Player('musicPlayer', {
  692. height: '0',
  693. width: '0',
  694. videoId: '',
  695. playerVars: { 'autoplay': 1, 'controls': 0, 'mute': 0 },
  696. events: {
  697. 'onReady': onPlayerReady,
  698. 'onStateChange': onPlayerStateChange
  699. }
  700. });
  701. };
  702.  
  703. function onPlayerReady(event) {
  704. console.log('YouTube Player is ready');
  705. }
  706.  
  707. function onPlayerStateChange(event) {
  708. if (event.data === YT.PlayerState.PLAYING) {
  709. updateDurationDisplay();
  710. setInterval(updateProgressBar, 1000);
  711. }
  712. }
  713.  
  714. // Update duration display and progress bar
  715. function updateDurationDisplay() {
  716. const duration = player.getDuration();
  717. durationDisplay.textContent = `Duration: ${formatTime(player.getCurrentTime())} / ${formatTime(duration)}`;
  718. progressBar.max = duration;
  719. }
  720.  
  721. // Update progress bar
  722. function updateProgressBar() {
  723. if (player && currentPlayingID) {
  724. progressBar.value = player.getCurrentTime();
  725. updateDurationDisplay();
  726. }
  727. }
  728.  
  729. // Format time in MM:SS
  730. function formatTime(seconds) {
  731. const minutes = Math.floor(seconds / 60);
  732. const secs = Math.floor(seconds % 60);
  733. return `${minutes}:${secs < 10 ? '0' + secs : secs}`;
  734. }
  735.  
  736. // Function to extract video ID from YouTube URL
  737. function extractVideoID(url) {
  738. const videoIDMatch = url.match(/(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/);
  739. return videoIDMatch ? videoIDMatch[1] : null;
  740. }
  741.  
  742. // Hide music menu with Esc key
  743. document.addEventListener('keydown', (event) => {
  744. if (event.key === 'Tab') {
  745. musicMenuContainer.style.display = musicMenuContainer.style.display === 'block' ? 'none' : 'block';
  746. }
  747. if (event.key === ']') {
  748. musicMenuContainer.style.display = musicMenuContainer.style.display === 'block' ? 'none' : 'block';
  749. }
  750. if (event.key === '') { // Space for play/pause
  751. pauseButton.click();
  752. }
  753. if (event.key === '') { // '' key to stop
  754. stopButton.click();
  755. }
  756. });
  757.  
  758. // Show the music menu initially (optional)
  759. musicMenuContainer.style.display = 'block';
  760.  
  761. })();
  762. (function () {
  763. 'use strict';
  764.  
  765. const menu = document.createElement('div');
  766. menu.id = 'music-menu';
  767. menu.style.position = 'fixed';
  768. menu.style.top = '0';
  769. menu.style.right = '-300px';
  770. menu.style.width = '250px';
  771. menu.style.height = '100%';
  772. menu.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
  773. menu.style.color = '#fff';
  774. menu.style.fontFamily = 'Arial, sans-serif';
  775. menu.style.padding = '20px';
  776. menu.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.5)';
  777. menu.style.transition = 'right 0.5s ease';
  778. menu.style.zIndex = '10000';
  779. menu.innerHTML = `
  780. <h2 style="text-align: center;" id="music-menu-title">Hudební menu</h2>
  781. <label for="music-url" id="music-url-label">URL písničky (YouTube):</label>
  782. <input id="music-url" type="text" style="width: 100%; margin-bottom: 10px; padding: 5px;" placeholder="cho link ytb vào đây....">
  783. <label for="start-time" id="start-time-label">Start Time Seconds...):</label>
  784. <input id="start-time" type="number" style="width: 100%; margin-bottom: 10px; padding: 5px;" placeholder="giây...">
  785. <button id="play-music" style="width: 100%; padding: 10px; margin-bottom: 10px; background-color: #4CAF50; color: white; border: none; cursor: pointer; font-size: 16px; font-weight: bold; border-radius: 5px;">Přehrát písničku</button>
  786. <button id="start-video" style="width: 100%; padding: 10px; margin-bottom: 10px; background-color: #2196F3; color: white; border: none; cursor: pointer; font-size: 16px; font-weight: bold; border-radius: 5px;">START VIDEO</button>
  787. <button id="stop-music" style="width: 100%; padding: 10px; background-color: #f44336; color: white; border: none; cursor: pointer; font-size: 16px; font-weight: bold; border-radius: 5px;">Zastavit</button>
  788. <div id="video-container" style="margin-top: 20px; display: none;">
  789. <iframe id="video-frame" width="100%" height="200" style="border: none;" src="" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
  790. </div>
  791. <div id="player" style="margin-top: 20px; display: none;"></div>
  792. <div id="warning" style="margin-top: 20px; color: red; font-weight: bold;">
  793. <p id="adblock-warning">POUŽITÍ ADBLOCKU VEDE K NEFUNKČNOSTI VYPNITE HO</p>
  794. <label for="language-select" style="color: white;">Language:</label>
  795. <select id="language-select" style="width: 100%; padding: 5px;">
  796. <option value="cz"eština</option>
  797. <option value="en">English</option>
  798. <option value="ru">Русский</option>
  799. <option value="vi">Tiếng Vit</option>
  800. <option value="ar">العربية</option>
  801. </select>
  802. </div>
  803. <div style="margin-top: 20px; text-align: center; font-weight: bold; color: #FFEB3B;">
  804. Script By <a href="https://www.youtube.com/@RektByMateX" target="_blank" style="color: #FF4081; font-weight: bold; text-decoration: underline;">RektByMateX</a>
  805. </div>
  806. <div style="margin-top: 20px; text-align: center; font-weight: bold; color: #FFEB2B;">
  807. truy cp nhanh (quick access)
  808. </div>
  809. <div style="margin-top: 20px; text-align: center; font-weight: bold; color: #FFEB3B;">
  810. 1 <a href="https://www.youtube.com" target="_blank" style="color: #FF4081; font-weight: bold; text-decoration: underline;">youtube</a>
  811. </div>
  812. <div style="margin-top: 20px; text-align: center; font-weight: bold; color: #FFEB3B;">
  813. 2 <a href="https://translate.google.com" target="_blank" style="color: #FF4081; font-weight: bold; text-decoration: underline;">translate.google</a>
  814. </div>
  815. <div style="margin-top: 20px; text-align: center; font-weight: bold; color: #FFEB3B;">
  816. 3 <a href="https://facebook.com" target="_blank" style="color: #FF4081; font-weight: bold; text-decoration: underline;">facebook</a>
  817. </div>
  818. <div style="margin-top: 20px; text-align: center; font-weight: bold; color: #FFEB3B;">
  819. 4 <a href="https://discord.com/channels/@me" target="_blank" style="color: #FF4081; font-weight: bold; text-decoration: underline;">discord</a>
  820. </div>
  821. <div style="margin-top: 20px; text-align: center; font-weight: bold; color: #FFEB3B;">
  822. 5 <a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ&ab_channel=RickAstley" target="_blank" style="color: #FF4081; font-weight: bold; text-decoration: underline;">hmmmmmm</a>
  823. </div>
  824. `;
  825. document.body.appendChild(menu);
  826.  
  827. let menuVisible = false;
  828. function toggleMenu() {
  829. menu.style.right = menuVisible ? '-300px' : '0';
  830. menuVisible = !menuVisible;
  831. console.log('Menu visible:', menuVisible); // Debugging line
  832. }
  833.  
  834. let player;
  835. function createYouTubePlayer(videoId, startTime) {
  836. if (!player) {
  837. player = new YT.Player('player', {
  838. height: '0',
  839. width: '0',
  840. videoId: videoId,
  841. playerVars: { autoplay: 1, start: startTime },
  842. events: {
  843. onReady: (event) => {
  844. event.target.playVideo();
  845. }
  846. }
  847. });
  848. } else {
  849. player.loadVideoById(videoId, startTime);
  850. }
  851. }
  852.  
  853. function stopYouTubePlayer() {
  854. if (player) {
  855. player.stopVideo();
  856. }
  857. const iframe = document.getElementById('video-frame');
  858. iframe.src = '';
  859. document.getElementById('player').style.display = 'none';
  860. document.getElementById('video-container').style.display = 'none';
  861. }
  862.  
  863. document.getElementById('play-music').addEventListener('click', () => {
  864. const url = document.getElementById('music-url').value;
  865. const startTime = parseInt(document.getElementById('start-time').value) || 0;
  866. const videoId = extractYouTubeVideoId(url);
  867. if (videoId) {
  868. createYouTubePlayer(videoId, startTime);
  869. document.getElementById('player').style.display = 'block';
  870. document.getElementById('video-container').style.display = 'none';
  871. } else {
  872. alert('Neplatný YouTube odkaz.');
  873. }
  874. });
  875.  
  876. document.getElementById('start-video').addEventListener('click', () => {
  877. const url = document.getElementById('music-url').value;
  878. const startTime = parseInt(document.getElementById('start-time').value) || 0;
  879. const videoId = extractYouTubeVideoId(url);
  880. if (videoId) {
  881. const iframe = document.getElementById('video-frame');
  882. iframe.src = `https://www.youtube.com/embed/${videoId}?start=${startTime}&autoplay=1`;
  883. document.getElementById('video-container').style.display = 'block';
  884. document.getElementById('player').style.display = 'none';
  885. } else {
  886. alert('Neplatný YouTube odkaz.');
  887. }
  888. });
  889.  
  890. document.getElementById('stop-music').addEventListener('click', () => {
  891. stopYouTubePlayer();
  892. });
  893.  
  894. document.addEventListener('keydown', (e) => {
  895. if (e.key.toLowerCase() === '[') {
  896. toggleMenu();
  897. }
  898. if (e.key.toLowerCase() === '`') {
  899. toggleMenu();
  900. }
  901. });
  902.  
  903. function extractYouTubeVideoId(url) {
  904. const match = url.match(/(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/);
  905. return match ? match[1] : null;
  906. }
  907.  
  908. const script = document.createElement('script');
  909. script.src = 'https://www.youtube.com/iframe_api';
  910. document.head.appendChild(script);
  911.  
  912. document.getElementById('language-select').addEventListener('change', (e) => {
  913. changeLanguage(e.target.value);
  914. });
  915.  
  916. function changeLanguage(language) {
  917. const translations = {
  918. cz: {
  919. 'music-menu-title': 'Hudební menu',
  920. 'music-url-label': 'URL písničky (YouTube):',
  921. 'start-time-label': 'Začátek (sekundy):',
  922. 'play-music': 'Přehrát písničku',
  923. 'start-video': 'Spustit Video',
  924. 'stop-music': 'Zastavit',
  925. 'adblock-warning': 'POUŽITÍ ADBLOCKU VEDE K NEFUNKČNOSTI VYPNITE HO',
  926. 'language-btn': 'Vyberte jazyk'
  927. },
  928. en: {
  929. 'music-menu-title': 'Music Menu',
  930. 'music-url-label': 'Song URL (YouTube):',
  931. 'start-time-label': 'Start time (seconds):',
  932. 'play-music': 'Play Song',
  933. 'start-video': 'START VIDEO',
  934. 'stop-music': 'Stop',
  935. 'adblock-warning': 'USING ADBLOCK CAUSES FAILURE, PLEASE DISABLE IT',
  936. 'language-btn': 'Languages'
  937. },
  938. ru: {
  939. 'music-menu-title': 'Музыкальное меню',
  940. 'music-url-label': 'URL песни (YouTube):',
  941. 'start-time-label': 'Время начала (секунды):',
  942. 'play-music': 'Воспроизвести песню',
  943. 'start-video': 'Запустить видео',
  944. 'stop-music': 'Остановить',
  945. 'adblock-warning': 'Использование Adblock вызывает сбой, пожалуйста, отключите его',
  946. 'language-btn': 'Языки'
  947. },
  948. vi: {
  949. 'music-menu-title': 'Menu Nhạc',
  950. 'music-url-label': 'URL bài hát (YouTube):',
  951. 'start-time-label': 'Thời gian bắt đầu (giây):',
  952. 'play-music': 'Phát bài hát',
  953. 'start-video': 'Bắt đầu Video',
  954. 'stop-music': 'Dừng',
  955. 'adblock-warning': 'SỬ DỤNG ADBLOCK GÂY LỖI, VUI LÒNG TẮT NÓ',
  956. 'language-btn': 'Ngôn ngữ'
  957. },
  958. ar: {
  959. 'music-menu-title': 'قائمة الموسيقى',
  960. 'music-url-label': 'رابط الأغنية (YouTube):',
  961. 'start-time-label': 'وقت البداية (ثواني):',
  962. 'play-music': 'تشغيل الأغنية',
  963. 'start-video': 'تشغيل الفيديو',
  964. 'stop-music': 'إيقاف',
  965. 'adblock-warning': 'استخدام Adblock يؤدي إلى عطل ، يرجى تعطيله',
  966. 'language-btn': 'اللغات'
  967. }
  968. };
  969.  
  970. const text = translations[language] || translations.en;
  971. document.getElementById('music-menu-title').textContent = text['music-menu-title'];
  972. document.getElementById('music-url-label').textContent = text['music-url-label'];
  973. document.getElementById('start-time-label').textContent = text['start-time-label'];
  974. document.getElementById('play-music').textContent = text['play-music'];
  975. document.getElementById('start-video').textContent = text['start-video'];
  976. document.getElementById('stop-music').textContent = text['stop-music'];
  977. document.getElementById('adblock-warning').textContent = text['adblock-warning'];
  978. document.getElementById('language-btn').textContent = text['language-btn'];
  979. }
  980. })();
  981. (function () {
  982. 'use strict'
  983. const POLL_INTERVAL = 1000
  984. const HUE_RANGE = 120 // Hue range for the gradient (green to red or red to green)
  985. const SATURATION = '80%'
  986. const LIGHTNESS = '88%'
  987. function applyGradientToColumn(table, column) {
  988. const rowCount = table.rows.length
  989. Array.from(table.rows).forEach((row, index) => {
  990. const cell = row.cells[column]
  991. if (!cell) return
  992. // Calculate a hue based on the row index (no need to rely on cell content)
  993. const hue = (index / (rowCount - 1)) * HUE_RANGE
  994. // Apply the gradient color to the cell
  995. cell.style.backgroundColor = `hsl(${HUE_RANGE - hue}, ${SATURATION}, ${LIGHTNESS})`
  996. })
  997. }
  998. function initializeTable(table) {
  999. if (table.hasAttribute('data-gradient-initialized')) return
  1000. table.setAttribute('data-gradient-initialized', 'true')
  1001. const columnCount = table.rows[0]?.cells.length || 0
  1002. for (let col = 0; col < columnCount; col++) {
  1003. applyGradientToColumn(table, col)
  1004. }
  1005. }
  1006. function initializeTables() {
  1007. document.querySelectorAll('table:not([data-gradient-initialized])').forEach(initializeTable)
  1008. }
  1009. // Initial call and setup interval to handle dynamically loaded tables
  1010. initializeTables()
  1011. setInterval(initializeTables, POLL_INTERVAL)
  1012. })();
  1013. (function () {
  1014. 'use strict';
  1015. function getOverlapScore(el) {
  1016. var rect = el.getBoundingClientRect();
  1017. return (
  1018. Math.min(
  1019. rect.bottom,
  1020. window.innerHeight || document.documentElement.clientHeight
  1021. ) - Math.max(0, rect.top)
  1022. );
  1023. }
  1024.  
  1025. function getVideoIdFromVideoElement(video) {
  1026. try {
  1027. for (let k in video.parentElement) {
  1028. if (k.startsWith("__reactProps")) {
  1029. return video.parentElement[k].children.props.videoFBID;
  1030. }
  1031. }
  1032. } catch (e) {
  1033. return null;
  1034. }
  1035. }
  1036.  
  1037. async function getWatchingVideoId() {
  1038. let allVideos = Array.from(document.querySelectorAll("video"));
  1039. let result = [];
  1040.  
  1041. for (let video of allVideos) {
  1042. let videoId = getVideoIdFromVideoElement(video);
  1043. if (videoId) {
  1044. result.push({
  1045. videoId,
  1046. overlapScore: getOverlapScore(video),
  1047. playing: !!(
  1048. video.currentTime > 0 &&
  1049. !video.paused &&
  1050. !video.ended &&
  1051. video.readyState > 2
  1052. ),
  1053. });
  1054. }
  1055. }
  1056.  
  1057. // if there is playing video => return that
  1058. let playingVideo = result.find((_) => _.playing);
  1059. if (playingVideo) return [playingVideo.videoId];
  1060.  
  1061. // else return all videos in-viewport
  1062. return result
  1063. .filter((_) => _.videoId && (_.overlapScore > 0 || _.playing))
  1064. .sort((a, b) => b.overlapScore - a.overlapScore)
  1065. .map((_) => _.videoId);
  1066. }
  1067.  
  1068. async function getVideoUrlFromVideoId(videoId) {
  1069. let dtsg = await getDtsg();
  1070. try {
  1071. return await getLinkFbVideo2(videoId, dtsg);
  1072. } catch (e) {
  1073. return await getLinkFbVideo1(videoId, dtsg);
  1074. }
  1075. }
  1076.  
  1077. async function getLinkFbVideo2(videoId, dtsg) {
  1078. let res = await fetch(
  1079. "https://www.facebook.com/video/video_data_async/?video_id=" + videoId,
  1080. {
  1081. method: "POST",
  1082. headers: { "content-type": "application/x-www-form-urlencoded" },
  1083. body: stringifyVariables({
  1084. __a: "1",
  1085. fb_dtsg: dtsg,
  1086. }),
  1087. }
  1088. );
  1089.  
  1090. let text = await res.text();
  1091. text = text.replace("for (;;);", "");
  1092. let json = JSON.parse(text);
  1093.  
  1094. const { hd_src, hd_src_no_ratelimit, sd_src, sd_src_no_ratelimit } =
  1095. json?.payload || {};
  1096.  
  1097. return hd_src_no_ratelimit || hd_src || sd_src_no_ratelimit || sd_src;
  1098. }
  1099.  
  1100. async function getLinkFbVideo1(videoId, dtsg) {
  1101. let res = await fetchGraphQl("5279476072161634", {
  1102. UFI2CommentsProvider_commentsKey: "CometTahoeSidePaneQuery",
  1103. caller: "CHANNEL_VIEW_FROM_PAGE_TIMELINE",
  1104. displayCommentsContextEnableComment: null,
  1105. displayCommentsContextIsAdPreview: null,
  1106. displayCommentsContextIsAggregatedShare: null,
  1107. displayCommentsContextIsStorySet: null,
  1108. displayCommentsFeedbackContext: null,
  1109. feedbackSource: 41,
  1110. feedLocation: "TAHOE",
  1111. focusCommentID: null,
  1112. privacySelectorRenderLocation: "COMET_STREAM",
  1113. renderLocation: "video_channel",
  1114. scale: 1,
  1115. streamChainingSection: !1,
  1116. useDefaultActor: !1,
  1117. videoChainingContext: null,
  1118. videoID: videoId,
  1119. }, dtsg);
  1120. let text = await res.text();
  1121.  
  1122. let a = JSON.parse(text.split("\n")[0]),
  1123. link = a.data.video.playable_url_quality_hd || a.data.video.playable_url;
  1124.  
  1125. return link;
  1126. }
  1127.  
  1128. function fetchGraphQl(doc_id, variables, dtsg) {
  1129. return fetch("https://www.facebook.com/api/graphql/", {
  1130. method: "POST",
  1131. headers: {
  1132. "content-type": "application/x-www-form-urlencoded",
  1133. },
  1134. body: stringifyVariables({
  1135. doc_id: doc_id,
  1136. variables: JSON.stringify(variables),
  1137. fb_dtsg: dtsg,
  1138. server_timestamps: !0,
  1139. }),
  1140. });
  1141. }
  1142.  
  1143. function stringifyVariables(d, e) {
  1144. let f = [],
  1145. a;
  1146. for (a in d)
  1147. if (d.hasOwnProperty(a)) {
  1148. let g = e ? e + "[" + a + "]" : a,
  1149. b = d[a];
  1150. f.push(
  1151. null !== b && "object" == typeof b
  1152. ? stringifyVariables(b, g)
  1153. : encodeURIComponent(g) + "=" + encodeURIComponent(b)
  1154. );
  1155. }
  1156. return f.join("&");
  1157. }
  1158.  
  1159. async function getDtsg() {
  1160. return require("DTSGInitialData").token;
  1161. }
  1162.  
  1163. function downloadURL(url, name) {
  1164. var link = document.createElement("a");
  1165. link.target = "_blank";
  1166. link.download = name;
  1167. link.href = url;
  1168. document.body.appendChild(link);
  1169. link.click();
  1170. document.body.removeChild(link);
  1171. }
  1172.  
  1173. async function downloadWatchingVideo() {
  1174. try {
  1175. let listVideoId = await getWatchingVideoId();
  1176. if (!listVideoId?.length > 0) throw Error("No video found in the page");
  1177.  
  1178. console.log(listVideoId)
  1179.  
  1180. for (let videoId of listVideoId) {
  1181. let videoUrl = await getVideoUrlFromVideoId(videoId);
  1182. if (videoUrl) downloadURL(videoUrl, "fb_video.mp4");
  1183. }
  1184. } catch (e) {
  1185. alert("ERROR: " + e);
  1186. }
  1187. }
  1188.  
  1189. function resisterMenuCommand() {
  1190. GM_registerMenuCommand("Download watching video", downloadWatchingVideo);
  1191. }
  1192.  
  1193. resisterMenuCommand();
  1194. })();