Greasy Fork is available in English.

Gaston's - Video/Image Downloader

Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (συχνά ενημερωμένο)

  1. // ==UserScript==
  2. // @name Gaston's - Video/Image Downloader
  3. // @namespace http://tampermonkey.net
  4. // @version 10.4
  5. // @supportURL https://greatest.deepsurf.us/en/scripts/496975-gaston-s-video-image-downloader/feedback
  6. // @homepageURL https://greatest.deepsurf.us/en/users/689441-gaston
  7. // @description Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  8. // @author gaston1799
  9. // @match *://www.youtube.com/*
  10. // @match *://yt.savetube.me/*
  11. // @match *://production.assets.clips.twitchcdn.net/*
  12. // @match *://www.instagram.com/*
  13. // @match *://music.youtube.com/*
  14. // @match *://y2mate.nu/*
  15. // @match *://www.twitch.tv/*
  16. // @match *://www.socialplug.io/*
  17. // @match *://snapinst.app/*
  18. // @match *://loader.to/*
  19. // @match *://onlymp3.app/*
  20. // @match *://qdownloader.cc/*
  21. // @match *://tubemp4.is/*
  22. // @match *://snapsave.io/*
  23. // @match *://clips.twitch.tv/*
  24. // @match *://twitch.tv/*
  25. // @match *://onlymp3.to/*
  26. // @match *://fastdl.app/*
  27. // @match *://en.onlymp3.app/*
  28. // @match *://clipr.xyz/*
  29. // @match *://studio.youtube.com/*
  30. // @match *://www.yt2conv.com/*
  31. // @match *://soundcloud.com/*
  32. // @match *://sclouddownloader.net/*
  33. // @match *://www.tiktok.com/*
  34. // @match *://en3.onlinevideoconverter.pro/*
  35. // @match *://savetik.co/*
  36. // @match *://yt5s.biz/*
  37. // @match *://sss.instasaverpro.com/*
  38. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  39. // @grant GM_info
  40. // @grant GM_xmlhttpRequest
  41. // @grant GM_getValue
  42. // @grant GM_setValue
  43. // @grant GM_addStyle
  44. // @grant GM_registerMenuCommand
  45. // @grant GM_xmlhttpRequest
  46. // @grant GM_deleteValue
  47. // @grant GM_addValueChangeListener
  48. // @grant GM_removeValueChangeListener
  49. // @require https://update.greatest.deepsurf.us/scripts/439099/1203718/MonkeyConfig%20Modern%20Reloaded.js
  50. // @run-at document-start
  51. // @name:en Gaston's - Video/Image Downloader
  52. // @name:bg Gaston's - видео/изтегляне на изображения
  53. // @name:ar Gaston's - Video/Image Downloader
  54. // @name:de Gaston's - Video/Image Downloader
  55. // @name:cs Gaston's - Video/Image Downloader
  56. // @name:el Gaston's - Video/Image Downloader
  57. // @name:da Gastons - Video/Image Downloader
  58. // @name:fi Gaston's - Video/kuvan lataaja
  59. // @name:eo Gaston's - Video/Bildo -Elŝutilo
  60. // @name:es Gaston's - Video/Image Descarger
  61. // @name:it Gaston's - Downloader di video/immagine
  62. // @name:ko Gaston 's- 비디오/이미지 다운로더
  63. // @name:fr Gaston's - téléchargeur vidéo / image
  64. // @name:hu Gaston's - Videó/kép letöltő
  65. // @name:id Gaston's - Video/Image Downloader
  66. // @name:hr Gaston's - Download Video/Image
  67. // @name:mr गॅस्टनचा - व्हिडिओ/प्रतिमा डाउनलोडर
  68. // @name:ja Gaston's -Video/Image Downloader
  69. // @name:he Gaston's - הורדת וידאו/תמונה
  70. // @name:ka გასტონის - ვიდეო/გამოსახულების ჩამოტვირთვა
  71. // @name:nb Gaston's - Video/Image Downloader
  72. // @name:pt-BR Gaston's - Video/Image Downloader
  73. // @name:th Gaston's - Video/Image Downloader
  74. // @name:ro Gaston's - descărcător video/imagini
  75. // @name:nl Gaston's - Video/Image Downloader
  76. // @name:sr Гастон'с - Видео / Имаге Довнлоадер
  77. // @name:sk Gaston's - Video/Image Downloader
  78. // @name:sv Gaston's - Video/Image Downloader
  79. // @name:ru Gaston's - Video/Image Скачатель
  80. // @name:pl Gaston - pobierca wideo/obrazu
  81. // @name:es-419 Gaston's - Video/Image Downloader
  82. // @name:zh-CN 加斯顿的 - 视频/图像下载器
  83. // @name:vi Gaston's - Trình tải xuống video/hình ảnh
  84. // @name:zh-TW 加斯頓的 - 視頻/圖像下載器
  85. // @name:tr Gaston's - Video/Resim İndirici
  86. // @name:ckb GASTON'S - DOCHOVDLOUNDER
  87. // @name:uk GASTON'S - Відео/зображення завантажувача
  88. // @name:fr-CA Gaston's - téléchargeur vidéo / image
  89. // @name:ug Gaston's - سىن / رەسىم چۈشۈرۈش
  90. // @name:aa Gaston's- Vidiyo/Gaddat oobise
  91. // @name:ae Gaston's - Video/Image Downloader
  92. // @name:ast Gaston's - Video/Image Downloader
  93. // @name:af Gaston's - Video/Image Downloader More actions
  94. // @name:ab Гастон - Авидео/Асахьа Ахҩага
  95. // @name:ay Gaston's - Video/Image Ukax mä jach'a uñacht'äwiwa.
  96. // @name:am ነዳጅ - ቪዲዮ / ምስል ማውረድ
  97. // @name:ak Gaston's - video/mfonini a wɔtwe mfonini .
  98. // @name:av Гастон - Видео/Имаж Скачать
  99. // @name:as Gaston's - Video/Image Downloader
  100. // @name:az Gaston's - Video / Şəkil Yükləyicisi
  101. // @name:bi Gaston's - Video/Image Downloader
  102. // @name:bh Gaston's - Video/Image Downloader
  103. // @name:ca Gaston's - Descàrrega de vídeo/imatge
  104. // @name:bm Gaston's - Video/Image Téléchargeur .
  105. // @name:bs Gaston's - Video / Image Downloadower
  106. // @name:bn গ্যাস্টনের - ভিডিও/চিত্র ডাউনলোডার
  107. // @name:be Gaston's - Загрузка відэа/малюнка
  108. // @name:bo Gaston’s Video/Image Downloader More actions
  109. // @name:ba Гастон - Видео/Һүрәт Скачатель
  110. // @name:br Gaston - Video/Skeudenn Pellgargañ .
  111. // @name:chr Gaston's - Video/Image Downloader
  112. // @name:cr Gaston's - Video/Image Downloader
  113. // @name:cu Gaston's - Video/Image Downloader
  114. // @name:ce Гастон - Видео/Имаж Скачать еш верг More actions
  115. // @name:dv ގޭސްޓަންގެ - ވީޑިއޯ/އިމޭޖް ޑައުންލޯޑަރ
  116. // @name:cv Гастон - Видео/Сăн ÿкерчĕк скачать
  117. // @name:ceb Gaston's - Video / I-imahen nga Downloader
  118. // @name:cy Gaston's - Downloader Fideo/Delwedd
  119. // @name:co Scaricamentu Video / Image di Gaston
  120. // @name:ch Gaston Gaston - Videt/Inagof
  121. // @name:fa Gaston's - Downloader Video/Image
  122. // @name:fy Gaston's - Video / image Downloader
  123. // @name:dz གཱསི་ཊོན་གྱི་ - བརྙན་འཕྲིན་/པར་རིས་ཕབ་ལེན་པ།
  124. // @name:fj Gaston ni Gastos - Video/Image Lavetaki
  125. // @name:ee Gaston ƒe - Video/Nɔnɔmetata ƒe Ðeɖefiamɔ̃ .
  126. // @name:et Gastoni - video/pildi allalaadija
  127. // @name:eu Gaston's - Video / Image Downloader
  128. // @name:fil Gaston's - Video/Image Downloader
  129. // @name:fo Gaston's - Video/Mynd Downloader
  130. // @name:ff Gaston's - Video/Imageer Natal
  131. // @name:gsw-berne Gaston's - Video/Image Downloader
  132. // @name:gl Gaston's - Video/Image Downloader
  133. // @name:gv Gaston - Ta'n Lught-thie Video/Image
  134. // @name:gu ગેસ્ટન - વિડિઓ/ઇમેજ ડાઉનલોડર
  135. // @name:gn Gaston's - vídeo/Ta'angamýi .
  136. // @name:hmn Gaston's - Yees duab / Duab Downloader
  137. // @name:ha Gaston's - Bidiyo / Download Video / Download
  138. // @name:ga Gaston's - Íoslódáil Físeáin/Íomhá
  139. // @name:gd Luchdaich sìos bhidio / ìomhaigh Gaston
  140. // @name:hi गैस्टन - वीडियो/छवि डाउनलोडर
  141. // @name:ia Gaston's - Video/Image Downloader
  142. // @name:ik Gaston's - Video/Image Downloader
  143. // @name:ho Gaston's - Video/Image Downloader
  144. // @name:ie Gaston's - Video/Image Downloader
  145. // @name:hz Gaston's - Video/Image Downloader
  146. // @name:ht Gaston's - Videyo/Imaj Downloader
  147. // @name:hy Գաստոն - տեսանյութ / պատկերի ներբեռնիչ
  148. // @name:iu ᒑᔅᑕᓐ - ᑕᕐᕆᔭᓕᐊᖅ/ᐊᔾᔨᙳᐊᖅ ᖃᕆᑕᐅᔭᒃᑯᑦ ᑎᒍᓯᔾᔪᑎ
  149. // @name:ig Gaston - Video / Imase Downlown
  150. // @name:is Gaston's - Video/Image Downloader
  151. // @name:ki Gaston's - Video/Image Downloader
  152. // @name:kj Gaston's - Video/Image Downloader
  153. // @name:ks Gaston's - Video/Image Downloader
  154. // @name:jv Download Gaston - Video / Gambar Downloader
  155. // @name:kl Gaston's - Video/Assilisassiaq
  156. // @name:kg Ba Gaston - Video/Kupesa bifwanisu
  157. // @name:kn ಗ್ಯಾಸ್ಟನ್ - ವಿಡಿಯೋ/ಇಮೇಜ್ ಡೌನ್‌ಲೋಡರ್
  158. // @name:kr Gastonbe - Video/Sura Downloader
  159. // @name:km Gaston's - ទាញយកវីដេអូ / រូបភាព
  160. // @name:kk Гастонның - бейне / image жүктеушісі
  161. // @name:kw Gaston's - Video/Image Downloader
  162. // @name:lif Gaston's - Video/Image Downloader
  163. // @name:la Gasto - Video / Image Download
  164. // @name:kv Гастон - Видео/Серпас Скачать .
  165. // @name:lg Gaston's - Video/Ekifaananyi ekiwanula .
  166. // @name:lb Gaston's - Video / Bild Downloader More actions
  167. // @name:ln Gaston's - Vidéo/Image Téléchargeur
  168. // @name:ky Гастон - Видео / Сүрөт жүктөөчү
  169. // @name:lo Gaston's - ດາວໂຫລດວິດີໂອ / ຮູບພາບ / ຮູບພາບ
  170. // @name:ku Gaston's - Video / image Downloader
  171. // @name:mo Gaston's - Video/Image Downloader
  172. // @name:mg Gaston's - Video / Sary Downloader
  173. // @name:ml ഗാസ്റ്റൺസ് - വീഡിയോ / ഇമേജ് ഡ download ൺലോഡർ
  174. // @name:mk Гастон - преземач на видео/слика
  175. // @name:mh Gaston - Vidio/Pija
  176. // @name:lv Gaston's - video/attēlu lejupielādētājs More actions
  177. // @name:mi Gaston's - Kaihoko / Whakaahua Whakaahua
  178. // @name:mn Гастоны - видео / зураг татаж авагч
  179. // @name:ms Gaston's - Video/Image Downloader
  180. // @name:lt „Gaston's“ - vaizdo/vaizdo atsisiuntimo priemonė
  181. // @name:nv Gaston's - Video/Image Downloader
  182. // @name:na Gaston's - Video/Image Downloader
  183. // @name:ng Gaston's - Video/Image Downloader
  184. // @name:nn Gaston's - Video/Image Downloader
  185. // @name:nd Gaston's - Video/Image Downloader
  186. // @name:my Gaston ၏ - ဗွီဒီယို / image downloader
  187. // @name:nr 10 U-Ama 1000 .
  188. // @name:mt Gaston's - Video / Image Downloader
  189. // @name:ny Mapata a gaston - kanema / chithunzi More actions
  190. // @name:ne Gaston - भिडियो / छवि डाउनलोडर
  191. // @name:pi Gaston's - Video/Image Downloader
  192. // @name:pt-PT Gaston's - Downloader de vídeo/imagem
  193. // @name:pt Gaston's - Downloader de vídeo/imagem
  194. // @name:os Гастоны - Видео/Ныв скачать
  195. // @name:oc Gaston's - Video/Déleagés d'Image
  196. // @name:ps د ګاسټن - ویډیو / عکس ډاونلوډر
  197. // @name:or ଗ୍ୟାଷ୍ଟନ୍ ର - ଭିଡିଓ / ଇମେଜ୍ ଡାଉନଲୋଡର୍ |
  198. // @name:pa GABTons ਦਾ - ਵੀਡੀਓ / ਚਿੱਤਰ ਡਾ er ਡਰਰ
  199. // @name:om Gaston's - viidiyoo/fakkii downloader .
  200. // @name:qu Gaston's - Video/Imagen Descargar .
  201. // @name:sc Gaston's - Video/Image Downloader
  202. // @name:sco Gaston's - Video/Image Downloader
  203. // @name:sh Gaston's - Video/Image Downloader More actions
  204. // @name:rm Gaston's - Video/Image Downloader
  205. // @name:sg Gaston’s - Vidéo/Mime Télécharger
  206. // @name:rw Gaston's - Video / Ishusho
  207. // @name:se Gaston's - Video/govva.
  208. // @name:sa Gaston's - Video/Image Downloader
  209. // @name:rn Gaston - Video/Ishusho y'Ivyiyumviro
  210. // @name:sd گيسٽن جي - وڊيو / تصويري ڊائون لوڊ ڪندڙ
  211. // @name:sw Gaston's - video/picha ya kupakua
  212. // @name:sn Gaston's - Vhidhiyo / Mufananidzo Downloader
  213. // @name:sq Gaston's - Shkarkues i Video/Imazhit
  214. // @name:si ගැස්ටන්ස් - වීඩියෝ / රූප බාගත කරන්නා
  215. // @name:ss Gaston's - Ividiyo/Sitfombe Umlandziso
  216. // @name:st Gaston's - Download Download Morekisi oa Video
  217. // @name:sl Gaston's - Video/Image Downloader
  218. // @name:so Gaston's - Video / imsit Downloader
  219. // @name:sm Gastton's - Vitio / Ata Downloader
  220. // @name:su Gaston - pidéo / pidéo / gambar
  221. // @name:syr Gaston's - Video/Image Downloader
  222. // @name:tl Gaston's - Video/Image Downloader
  223. // @name:tk Gadon's - Wideo / surat ýükleýjisi
  224. // @name:te గాస్టన్స్ - వీడియో/ఇమేజ్ డౌన్‌లోడ్
  225. // @name:tg Гаста - Видео / зеркашӣ
  226. // @name:ti ጋስቶን - ቪድዮ/ስእሊ ዳውንሎደር
  227. // @name:ts Gaston's - Xifaniso xa vhidiyo/xifaniso .
  228. // @name:to Gaston's - Vitio/'Imisi Downloader
  229. // @name:ta காஸ்டனின் - வீடியோ/பட பதிவிறக்குபவர்
  230. // @name:tn Gaston ya - Video/Setshwantsho sa Ditshwantsho
  231. // @name:tw Gaston's - Video/Image Downloader
  232. // @name:xh I-Gageton-ividiyo / umxholo wokukhuphela
  233. // @name:ur گیسٹن کا - ویڈیو/تصویری ڈاؤن لوڈر
  234. // @name:ty Te mau hoho'a - Te hoho'a/te hoho'a i te mau hoho'a
  235. // @name:yo GASTON - Fidio / Download aworan
  236. // @name:yi Gaston ס - ווידעא / בילד דאָוונלאָאַדער
  237. // @name:uz Gaston's - video / rasmni yuklab olish
  238. // @name:wo Gaston - Video/New-xew
  239. // @name:ve Gaston - Video/Tshifanyiso.
  240. // @name:tt Гастонның - видео / Рәсем йөкләүче
  241. // @name:za Gaston's - Video/Image Downloader
  242. // @name:zu Gaston's - Video / Image Downloader
  243. // @description:ar Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (تم تحديثه بشكل متكرر) يتضمن كتلة yt ad
  244. // @description:en Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  245. // @description:es Instagram/Twitch/YouTube/Tiktok Video/Audio Descarger (actualizado con frecuencia) incluye el bloque de anuncios YT
  246. // @description:cs Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (často aktualizované) zahrnuje YT AD Block
  247. // @description:bg Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (често актуализиран) Включва YT рекламен блок
  248. // @description:eo Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (ofte ĝisdatigita) inkluzivas YT Ad -blokon
  249. // @description:el Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (συχνά ενημερωμένο)
  250. // @description:de Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (häufig aktualisiert) enthält YT -Anzeigenblock Explain More actions
  251. // @description:da Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (ofte opdateret) Inkluderer YT AD -blokken
  252. // @description:fi Instagram/twitch/youtube/tiktok video/audio lataaja (usein päivitetty) sisältää YT -mainoslohkon
  253. // @description:fr Instagram / twitch / youtube / tiktok vidéo / téléchargeur audio (fréquemment mis à jour) comprend un bloc d'annonce YT
  254. // @description:ja Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader(頻繁に更新)には、YT広告ブロックが含まれています
  255. // @description:ko Instagram/Twitch/YouTube/Tiktok 비디오/오디오 다운로더 (자주 업데이트)에는 YT AD 블록이 포함됩니다
  256. // @description:it Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (frequentemente aggiornato) include YT Ad Block
  257. // @description:id Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (sering diperbarui) Termasuk blok iklan YT
  258. // @description:hr Instagram/Twitch/YouTube/Tiktok Video/Audio Download (često ažurirano) uključuje YT AD Block
  259. // @description:he אינסטגרם/טוויץ
  260. // @description:mr इन्स्टाग्राम/ट्विच/यूट्यूब/टिकटोक व्हिडिओ/ऑडिओ डाउनलोडर (वारंवार अद्यतनित) वायटी अ‍ॅड ब्लॉक समाविष्ट करते More actions
  261. // @description:ka Instagram/Twitch/YouTube/Tiktok ვიდეო/აუდიო ჩამოტვირთვა (ხშირად განახლებულია) მოიცავს YT სარეკლამო ბლოკს
  262. // @description:hu Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (gyakran frissítve) tartalmazza az YT hirdetési blokkot
  263. // @description:pt-BR Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block More actions
  264. // @description:nl Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (vaak bijgewerkt) bevat YT -advertentieblok More actions
  265. // @description:nb Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block More actions
  266. // @description:pl Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (często aktualizowany) zawiera blok reklam YT
  267. // @description:th Instagram/Twitch/YouTube/Tiktok วิดีโอ/เสียงดาวน์โหลด (อัปเดตบ่อยครั้ง) รวมถึงบล็อกโฆษณา yt
  268. // @description:ru Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (часто обновляется) включает в себя объявление YT
  269. // @description:sr Инстаграм / Твитцх / ИоуТубе / Тикток Видео / Аудио Довнлоадер (Често ажуриран) укључује ит Ад Ад More actions
  270. // @description:ro Instagram/Twitch/YouTube/Tiktok Video/Downloader audio (actualizat frecvent) include blocul de anunțuri YT
  271. // @description:sk Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (často aktualizované) Zahŕňa blok YT AD
  272. // @description:sv Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (ofta uppdaterad) Inkluderar YT AD -block
  273. // @description:es-419 Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  274. // @description:zh-CN Instagram/Twitch/YouTube/tiktok视频/音频下载器(经常更新)包括YT广告块
  275. // @description:zh-TW Instagram/Twitch/YouTube/tiktok視頻/音頻下載器(經常更新)包括YT廣告塊
  276. // @description:fr-CA Instagram / twitch / youtube / tiktok vidéo / téléchargeur audio (fréquemment mis à jour) comprend un bloc d'annonce YT
  277. // @description:tr Instagram/Twitch/YouTube/Tiktok Video/Ses Downloader (sıklıkla güncellendi) YT reklam bloğunu içerir
  278. // @description:vi Instagram/twitch/youtube/tiktok video/trình tải xuống âm thanh (được cập nhật thường xuyên) bao gồm khối quảng cáo YT
  279. // @description:uk Instagram/twitch/youtube/tiktok відео/аудіо завантажувач (часто оновлений) включає блок yt ad
  280. // @description:ckb Instagram/Twitch/Youtube/Tiktok Video/Audio Downloader (زۆر نوێکراوەتەوە) بلۆکی ڕێکلامەکانی YT لەخۆدەگرێت
  281. // @description:ug Instagram / twitch / YouTube / Tiktok Video / Audio چۈشۈرۈش (دائىم يېڭىلىنىدۇ) YT ئېلاننى ئۆز ئىچىگە ئالىدۇ
  282. // @description:aa Institushin/YouToobe/Tiktook video/Audio downio oobise ( kaxxam asqassaabe)
  283. // @description:ae Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  284. // @description:ast Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  285. // @description:ay Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (Sapa kutiw machaqar tukuyapxi) YT anuncio bloque ukaw utji
  286. // @description:av Инстаграм/YouTube/TikTok Video/Audio Downloader (постоянно обновляется) Включает в себя блок Ad
  287. // @description:af Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (gereeld bygewerk) bevat YT AD -blok
  288. // @description:az Instagram / Twitch / YouTube / Tiktok video / audio yükləyicisi (tez-tez yenilənən) YT reklam blokunu ehtiva edir
  289. // @description:ak Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (wɔtaa yɛ no foforo) YT ad Block ka ho
  290. // @description:am Instagram / Twitch / YouTube / Toutube / Toutube / Touty ማውጫ (ኦዲዮ ማውረድ) የ YT ማስታወቂያ አግድንም ያካትታል
  291. // @description:ab Instagram/Twitch/YouTube/TikTok Авидео/Аудио Алаҟәра (лассы-лассы иҿыцхоит) Иаҵанакуеит YT Ad аблок More actions
  292. // @description:as ইনস্টাগ্ৰাম/Twitch/YouTube/Tiktok Video/Audio Downloader (সঘনাই আপডেট কৰা হৈছে)
  293. // @description:bh Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  294. // @description:bi Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  295. // @description:bn ইনস্টাগ্রাম/টুইচ/ইউটিউব/টিকটোক ভিডিও/অডিও ডাউনলোডার (প্রায়শই আপডেট হওয়া) ওয়াইটি অ্যাড ব্লক অন্তর্ভুক্ত
  296. // @description:bs Instagram / Twitch / YouTube / Tiktok Video / Audio Downloader (često ažurirano) uključuje YT blok oglasa
  297. // @description:bo Instagram/Twitch/YouTube/TikTok བརྙན་འཕྲིན། More actions
  298. // @description:bm Instagram/Twitch/Youtube/Tiktok Video/Audio Downloader (a ka ca a la) yt annonce bloc
  299. // @description:br Instagram/Tritch/YouTube/TikTok Video/Pellgargañ son (hizivaet alies) Blok Ad YT
  300. // @description:ba Instagram/Twitch/YouTube/TikTok видео/Аудио Скачатьс More actions
  301. // @description:be Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (часта абнаўляецца) уключае ў сябе блок аб'яў YT
  302. // @description:ca Instagram/Twitch/YouTube/Tiktok Video/Descàrrega d'àudio (freqüentment actualitzat) inclou el bloc d'anuncis YT More actions
  303. // @description:cu Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  304. // @description:cr Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  305. // @description:chr Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  306. // @description:cy Mae Instagram/Twitch/YouTube/Tiktok Fideo/Downloader Audio (wedi'i ddiweddaru'n aml) yn cynnwys YT Ad Block
  307. // @description:ceb Instagram / twitch / Youtube / Tiktok video / Audio Downloader (kanunay nga gi-update) naglakip sa YT AD Block
  308. // @description:co Instagram / Twitch / Youtube / Tiktok Video / Tiktok Downloader (aghjurnatu spessu) include blocu di l'annunziu YT
  309. // @description:ce Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (кест-кеста карладаьккхина) YT Ad блок юкъаяккха
  310. // @description:dv އިންސްޓަގްރާމް/twitch/youtube/tiktok video/audio downlower (ގިނައިން އަޕްޑޭޓް ކުރެވޭ) YoT AD AD Block
  311. // @description:cv Instagram/Twitch/YouTube/TikTok видео/Audio Downloader (час-часах çĕнетнĕ)
  312. // @description:ch I manma'gås-ta gi i Instagram I Tikeo.
  313. // @description:ff Instagram/Twitch/TikTokTokTok Video/Audio Downloader (ina hesɗitinee no feewi) Ina jeyaa heen blok YT Ad
  314. // @description:ee Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (wowɔa yeyee zi geɖe) lɔ YT ƒe boblododo ƒe mɔxenu ɖe ​​eme
  315. // @description:fj Instagram/Tube/Bok Tok Video/Otio Laveter (vouiliutaki) E oka kina na YT buloko .
  316. // @description:eu Instagram / Twitch / YouTube / Tiktok Video / Audio Downloader (maiz eguneratzen da) yt iragarki blokea biltzen du
  317. // @description:dz ཨིན་ཊར་ནེཊ་/ཊི་ཝིཆ་/ཡུ་ཊུབ་/ཊིཀ་ཊོག་བརྙན་འཕྲིན་/ཨའུ་ཌིའོ་ཕབ་ལེན་འབད་མི་ (འཕྲལ་འཕྲལ་རང་དུས་མཐུན་བཟོ་ཡོདཔ་) གིས་ ཝའི་ཊི་ཨེ་ཌི་བཀག་ཆ་ཚུ་ཚུདཔ་ཨིན།
  318. // @description:fa اینستاگرام/Twitch/YouTube/Tiktok Video/Audio Downloader (که اغلب به روز می شود) شامل YT AD BLOCK است
  319. // @description:fy Instagram / Twitch / Youtube / Tiktok Video / Audio Downloader (Faak bywurke) omfettet YT-ad-blok
  320. // @description:et Instagram/Twitch/YouTube/Tiktok Video/Audio allalaadija (sageli värskendatud) sisaldab YT reklaamiplokki More actions
  321. // @description:fo Instagram/Sknút/Youeibe/TikTok Video/Ljóðdegnloader (ofta dagført) fevnir um YT Ad blokkin
  322. // @description:fil Ang Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (madalas na na -update) ay may kasamang yt ad block
  323. // @description:gsw-berne Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  324. // @description:gl Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (actualizado con frecuencia) Inclúe YT AD Block
  325. // @description:gv Instagram/Twitch/TuTube/TikTok/TikTok Downloader (Reeshey ry-gheddyn) Ta'n block YT Ad Ad Ad Ad Ad Switch
  326. // @description:hi Instagram/Twitch/YouTube/Tiktok वीडियो/ऑडियो डाउनलोडर (अक्सर अपडेट किया गया) में yt विज्ञापन ब्लॉक शामिल है
  327. // @description:ha Instagram / Batunna / Youtube / Tiktok video / Tiktok
  328. // @description:gd Tha Ostagram / Twitch / YouTube / Siktobie Wadeilge / Clisgeadh Fuaim a-nuas (ùrachadh gu tric) a 'toirt a-steach bloc yt ad
  329. // @description:gu ઇન્સ્ટાગ્રામ/ટ્વિચ/યુટ્યુબ/ટિકટોક વિડિઓ/audio ડિઓ ડાઉનલોડર (વારંવાર અપડેટ) માં વાયટી એડ બ્લોક શામેલ છે
  330. // @description:ga Instagram/Twitch/YouTube/Tiktok Video/Downloader Audio (Nuashonraithe go minic) Áirítear Bloc Ad YT
  331. // @description:gn Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (Oñembopyahu jepi) Oike YT AD Bloque More actions
  332. // @description:hmn Instagram / Twitch / Youtube / TikTok video / audio downloader (nquag tshiab) suav nrog yt ad block
  333. // @description:hz Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  334. // @description:ie Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block More actions
  335. // @description:ia Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  336. // @description:hy Instagram / Twitch / YouTube / Tiktok Video / Աուդիո ներբեռնիչ (հաճախ թարմացված) ներառում է YT AD Block
  337. // @description:ik Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  338. // @description:is Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (oft uppfært) Inniheldur YT AD blokk
  339. // @description:ho Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  340. // @description:ht Instagram/Twitch/YouTube/Tiktok Videyo/Audio Downloader (souvan mete ajou) gen ladan yt blòk anons
  341. // @description:iu Instagram/Twitch/YouTube/TikTok ᑕᕐᕆᔭᓕᐊᖅ/ᓂᐱᓕᐅᕐᕕᒃ ᖃᕆᑕᐅᔭᒃᑯᑦ ᑎᒍᓯᔾᔪᑎ (ᓄᑖᖑᓂᖅᓴᖅ ᓄᑖᙳᕆᐊᖅᑕᐅᓯᒪᔪᖅ) ᐃᓚᖃᖅᑐᖅ YT Ad lons .
  342. // @description:ig Instagram / twebe / TIKTOK / Tiktok Video / Audio Downlown (Ugboro ugboro emelitere) gụnyere yt
  343. // @description:kj Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block More actions
  344. // @description:ki Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  345. // @description:ks Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  346. // @description:jv Instagram / twitch / YouTube / Tiktok Video / Audio Downloader (asring dianyari) kalebu blok iklan YT
  347. // @description:kl Instagram/Twitch/YouTube/TikTok-imik Video/Audio Downloader (arlaleriarlugu nutarterneqartoq) YT Adblokkimik ilaqarpoq
  348. // @description:kr Instagram/Twitch/Yiwo/Nyi/TikTok Video/Audio Downloader (nguwusoro bəlintəgəna) Surodən YT Ad block
  349. // @description:kg Instagram/Twing/YouTube/TikTok Video/Downloadeur ya Audite (yina bo ke tulaka mbala mingi na zulu) Yo ke vandaka ti bloque ya Ad Ad .
  350. // @description:kk Instagram / trick / Youtube / Tiktok Video / Audio Downloader (Жиі жаңартылатын)
  351. // @description:km កម្មវិធីទាញយកវីដេអូ / ទាញយកអូឌីយ៉ូ / youtube / youtube / youtube / tiktok
  352. // @description:kn Instagram/Twitch/YouTube/Tiktok video/Ondio downloather (ಆಗಾಗ್ಗೆ ನವೀಕರಿಸಲಾಗುತ್ತದೆ) YT AD ಬ್ಲಾಕ್ ಅನ್ನು ಒಳಗೊಂಡಿದೆ
  353. // @description:lif Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  354. // @description:kw Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  355. // @description:ln Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (mise à jour mbala mingi) Ezali na Bloc ya ba publicités ya YT
  356. // @description:lb Instagram / Twitch / YouTube / Tiktok Video / Audio Downloader (dacks aktualiséiert) enthält YT Ad Block
  357. // @description:la Instagram / Twitch / YouTube / Tiktok Video / Audio Download (Saepe Updated) includit YT ad obstructionum
  358. // @description:kv Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (тшӧкыда выльмӧдӧм) пыртӧ YT Реклама блок
  359. // @description:lg Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (etera okutereezebwa) Mulimu YT Ad Block
  360. // @description:lo Instagram / Twitch / YouTube / Tiktok Video / Audio Downloader (ໄດ້ຮັບການປັບປຸງເລື້ອຍໆ) ລວມມີ PROD AD
  361. // @description:ky Инстаграм / Twitch / YouTube / Tiktok Video / Аудио жүктөөчү (тез-тез жаңыртылган) YT AD блогун камтыйт
  362. // @description:ku Instagram / Twitch / YouTube / Tiktok Video / Audio Downloader (Bi gelemperî nûvekirin) Block YT Ad
  363. // @description:mo Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  364. // @description:lt „Instagram“/„Twitch“/„YouTube“/„Tiktok Video/Audio Downloader“ (dažnai atnaujinami) apima „YT“ skelbimų bloką
  365. // @description:ml Instagram / Twitch / YouTube / tiktok വീഡിയോ / ഓഡിയോ ഡ download ൺലോഡർ (പതിവായി അപ്ഡേറ്റുചെയ്തത്) yt പരസ്യ ബ്ലോക്ക് ഉൾപ്പെടുന്നു
  366. // @description:mg Instagram / twitch / YouTube / Tiktok Video / Audio Downloader (Nohavaozina matetika) dia misy ny YT Ad Block
  367. // @description:mn Instagram / Twitch / Twitch / Twitch / Tiktok / Tiktok видео / аудио татаж авах (байнга шинэчлэгддэг) yt шинэчилсэн зар сурталчилгаа орно
  368. // @description:ms Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (kerap dikemas kini) termasuk blok iklan YT
  369. // @description:mk Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (често ажурирано) Вклучува блок за рекламирање YT
  370. // @description:mh Jerbal/Kaju
  371. // @description:lv Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (bieži atjaunināts) Ietver YT AD bloku
  372. // @description:mi Instagram / Twitch / YouTube / Tiktok Video / Tikiake Audio (Ka whakahoutia tonu) Kei roto i te poraka YT Ad
  373. // @description:na Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  374. // @description:nv Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  375. // @description:nd Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block More actions
  376. // @description:nn Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block More actions
  377. // @description:ng Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  378. // @description:mt Instagram / Twitch / YouTube / Tiktok Video / Audio Downloader (Aġġornat ta 'spiss) Jinkludi YT AD Block
  379. // @description:nr • 100 10.
  380. // @description:ne इन्स्टाग्राम / ट्विच / यूट्यूब / टिकिओक भिडियो / अडियो डाउनलोडर (अक्सर अपडेट) YT विज्ञापन ब्लक समावेश गर्दछ
  381. // @description:my Instagram / Twitch / Tiktok / Tiktok / Tiktok ဗီဒီယို / အသံဒေါင်းလုပ် (မကြာခဏ update လုပ်ခြင်း) တွင် YT ad ကြော်ငြာပိတ်ဆို့ခြင်းပါဝင်သည်
  382. // @description:ny Instagram / Great / Yotube / Tiktok Video / Audio Duvier (pafupipafupi) imaphatikizapo YT Ad block
  383. // @description:pi Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  384. // @description:pt Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (freqüentemente atualizado) Inclui YT AD Block More actions
  385. // @description:pt-PT Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (freqüentemente atualizado) Inclui YT AD Block
  386. // @description:om Instagram/Twitch/YouTube/Tiktok Viidiyoo/Audio Downloader (yeroo baay'ee kan haaromfame) yt ad block of keessaa qaba
  387. // @description:qu Instagram/twitch/youtube/tiktok video/audio descargador (sapa kuti musuqyachisqa) incluye yt bloque de anuncios
  388. // @description:or ଇନଷ୍ଟାଗ୍ରାମ / ଟ୍ୱିଚ୍ / ୟୁଟ୍ୟୁବ୍ / ଟିକ୍ ଡୁଅ / ଅଡିଓ ଡାଉନଲୋଡର୍ (ବାରମ୍ବାର ଅଦ୍ୟତନ) 3t ବିଜ୍ଞାପନ ବ୍ଲକ ଅନ୍ତର୍ଭୂକ୍ତ କରେ |
  389. // @description:ps انسټاګرم / ټویټ / یوټیوب / ټیک کټک ویډیو / آډیو ډاونلوډر (ډیری ځله تازه شوی د YT AD بلاک شامل دی
  390. // @description:pa ਇੰਸਟਾਗ੍ਰਾਮ / ਟਵਿਚ / ਯੂਟਿ? ਬ / ਟਿੱਕਰੋਕ ਵੀਡੀਓ / ਆਡੀਓ ਡਾਉਨਲੋਡਰ (ਅਕਸਰ ਅਪਡੇਟ ਕੀਤੇ) ਵਿੱਚ YT ਵਿਗਿਆਪਨ ਬਲਾਕ ਵਿੱਚ ਸ਼ਾਮਲ ਹੁੰਦਾ ਹੈ
  391. // @description:oc Instagram/Twitt/YouTube/TikTok Video/Deleacteur audio (féctionnée fréquemment) Inclus Bloc d'anóncia YT
  392. // @description:os Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (арæх ноггонд) Æмæ йæм хауы YT Ad блок More actions
  393. // @description:rm Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  394. // @description:sco Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  395. // @description:sh Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  396. // @description:sc Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  397. // @description:rn Instagram/Guhindura/YouTube/TikTok video/Audio Downloader (akenshi yahinduwe) Irimwo na YT Ad block
  398. // @description:se Instagram/Twitch/YouTube/TikTok-video/Juovlaládden (dávjá ođasmahttojuvvon) Sisdoallá YT Ad-lohkki
  399. // @description:sg Instagram/Twibe/YouTube/TikTok Vidéo/Tivertier ti Audio (so a sara ni fani mingi) A yeke wara na yâ ti ni bloc ti YT.
  400. // @description:rw Instagram / Twitch / YouTube / Tiktok Video / Audio Gukuramo (Kuvugurura kenshi) birimo YT Ad Block
  401. // @description:sd انٽامام / ٽوچ / يوٽيوب / ٽڪيٽڪ وڊيو / آڊيو ڊائون لوڊ ڪندڙ (اڪثر تازه ڪاري) يو ٽي ايڊ بلاڪ شامل آهي
  402. // @description:sa Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (प्रायः अद्यतनम्) YT विज्ञापन ब्लॉक शामिल हैं
  403. // @description:sw Instagram/twitch/YouTube/Tiktok Video/Sauti Download (iliyosasishwa mara kwa mara) ni pamoja na block ya tangazo la YT
  404. // @description:sq Instagram/Twitch/YouTube/Tiktok Video/Shkarkues Audio (i azhurnuar shpesh) Përfshinë bllokun e reklamave YT
  405. // @description:si Instagram / twith / youtube / tictok වීඩියෝ / ඕඩියෝ බාගත කරන්නා (නිතර යාවත්කාලීන කිරීම) yt දැන්වීම් වාරණය ඇතුළත් වේ
  406. // @description:su Instagram / Twitch / YouTube / Tiktok Video / Downloader / record
  407. // @description:sn Instagram / Twitch
  408. // @description:ss Instagram/Kufaka/Umuhla/Umutsi/TikTok Video/Audio Downloader (lovame kuvuselelwa) Ufaka ekhatsi i-YT Ad block
  409. // @description:sl Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (pogosto posodobljen) vključuje Blok oglas YT
  410. // @description:st Instagram / Twitch / YouTube / YouTube / Tiktok Video / Audio Download Vedi tsa Audio (e ntlafalitsoeng khafetsa) e kenyeletsa block More actions
  411. // @description:sm Instagram / Twitch / YouTube / Tiktok Vitio / Audio Dicker (masani ona toe faafou) aofia ai YTS Add More actions
  412. // @description:so Instagram / spitch / youtube / tiktok fiidiyowga video / Audio-ka (inta badan la cusbooneysiiyay) waxaa ka mid ah xayeysiiska yt xayeysiiska More actions
  413. // @description:syr Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  414. // @description:tl Ang Instagram/Twitch/YouTube/Tiktok Video/Audio Downloader (madalas na na -update) ay may kasamang yt ad block
  415. // @description:ti Instagram/Twitch/YouTube/TIKTOK ቪድዮ/Audio Downloader (ብተደጋጋሚ ዝተመሓየሸ) YT Ad Block ዘጠቓልል
  416. // @description:tg Instagram / Thewube / YouTube / Tiktuk Videcker / Audio зеркашӣ (зуд-зуд навсозӣ) блоки YT-ро дар бар мегирад
  417. // @description:to Instagram/Taute/ToiTube/Toime'a Vitio/Audio Downloader ('oku toutou fakafo'ou) 'Oku kau ai 'a e poloka YT Ad
  418. // @description:ta Instagram/twitch/youtube/tiktok வீடியோ/ஆடியோ டவுன்லோடர் (அடிக்கடி புதுப்பிக்கப்படுகிறது) yt விளம்பரத் தொகுதியை உள்ளடக்கியது
  419. // @description:tn Instagram/Twitch/YouTube/Vidio yaTokTok/Modumo wa Modumo (e e tlhabolotsweng kgapetsakgapetsa) E akaretsa boloko jwa YT Ad
  420. // @description:ts Instagram/Twitch/YouTube/Tiktok Video/Audio download (nkarhi na nkarhi yi pfuxetiwile) yi katsa na yt ad block
  421. // @description:te Instagram/twitch/youtube/TikTok వీడియో/ఆడియో డౌన్‌లోడ్ (తరచుగా నవీకరించబడింది) YT AD బ్లాక్ కలిగి ఉంటుంది
  422. // @description:tk Instagram / twitch / tikteca
  423. // @description:tw Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  424. // @description:ur انسٹاگرام/ٹویو/یوٹیوب/ٹیکٹوک ویڈیو/آڈیو ڈاؤن لوڈر (کثرت سے تازہ کاری) میں YT AD بلاک شامل ہے
  425. // @description:yi ינסטאַגראַם / טוויטטש / יאָוטובע / טיקטאָק ווידעא / אַודיאָ דאָוונלאָאַדער (אָפט דערהייַנטיקט) כולל יט אַד בלאָק
  426. // @description:tt Инстаграм / Твитт / Youtube / Tiktok Vide / Auio йөкләүче (еш яңартылган) YT реклама блокын үз эченә ала
  427. // @description:ty Te faatupu nei te mau YT A'e i te hoê fare
  428. // @description:wo Instagram/Tube/YouTok/TikTok Video/Audio Downloader (ñu yeesal ko ci anam wu yees) dafay boole YT Adup
  429. // @description:yo Instagram / Twitch / YouTube Fidio / Olumulo Audio (imudojuiwọn nigbagbogbo) pẹlu Dndod Ipolowo YT
  430. // @description:uz Instagram / twitch / YouTube / Tiktok video / Audio dasturxon (tez-tez yangilanadi) YT reklama blokini o'z ichiga oladi
  431. // @description:ve Instagram/Twitch/YouTube/TikTok Video/Audio Downloading (ine ya dzulela u khwiniswa) I katela buḽoko ya YT Ad
  432. // @description:xh I-Instagram / i-witch / i-youtube / i-tiktok ividiyo / i-audio yokukhuphela (ukuhlaziywa rhoqo) kubandakanya ibhloko ye-yt
  433. // @description:za Instagram/Twitch/YouTube/TikTok Video/Audio Downloader (frequently updated) Includes YT Ad block
  434. // @description:zu I-Instagram / Twitch / YouTube / TIKTOK Video / Twiktok Video / Umsindo Wokulanda (Kuvuselelwa njalo) kufaka i-YT AD BLOCK
  435. // ==/UserScript==
  436. !function(){var _GM_getValue=GM_getValue,_GM_setValue=GM_setValue;["https://cdn.jsdelivr.net/gh/naquangaston/HostedFiles@main/UserScripts/Updater.js"].map(url=>{let u=new URL(url);u.protocol='https:';return u.href;}).map(url=>({name:new URL(url).pathname.split('/').pop(),id:new URL(url).pathname,url})).forEach(async e=>{var t=_GM_getValue(e.id),loaded=false;if(t){console.log(e.name,'Loaded',eval(t));loaded=true}else{console.warn(e.name,"wasn't installed. This Userscript may not function as intended.")}console.log('Checking',e.name);await fetch(e.url).then(r=>r.text(),err=>{console.error('Failed:',e.id,err);return null}).then(fetchedScript=>{if(fetchedScript&&_GM_getValue(e.id)!==fetchedScript){_GM_setValue(e.id,fetchedScript);if(!loaded){try{eval(fetchedScript);console.log(e.name,'Has been updated and loaded')}catch(err){console.error(e.name,'Failed to update',err)}}}else{console.log(e.name,'Has been updated in background')}return e})});}();
  437. ! function() {
  438. function onElementReady(e, t) {
  439. new MutationObserver(((o, n) => {
  440. document.querySelectorAll(e).forEach((e => {
  441. t(e), n.disconnect()
  442. }))
  443. })).observe(document.body, {
  444. childList: !0,
  445. subtree: !0
  446. })
  447. }
  448. class videoPlayer {
  449. #e = function() {
  450. return this.isFullScreen
  451. };
  452. #t = function() {
  453. return this.isTheater
  454. };
  455. #o = function() {
  456. return this.isMini
  457. };
  458. set isMini(e) {
  459. e && !this.#o() ? document.querySelector('[title="Miniplayer (i)"]').click() : !e && this.#o() && document.querySelector('[title="Expand (i)"]').click()
  460. }
  461. get isMini() {
  462. return !document.querySelector('[title="Miniplayer (i)"]')
  463. }
  464. set isTheater(e) {
  465. !e && this.#t() ? document.querySelector('[title="Default view (t)"]').click() : e && !this.#t() && document.querySelector('[title="Theater mode (t)"]').click()
  466. }
  467. get isTheater() {
  468. return !document.querySelector('[title="Theater mode (t)"]')
  469. }
  470. set isFullScreen(e = this.#e()) {
  471. e && !this.#e() ? document.querySelector('[title="Full screen (f)"]').click() : !e && this.#e() && document.querySelector('[title="Exit full screen (f)"]').click()
  472. }
  473. get isFullScreen() {
  474. return !document.querySelector('[title="Full screen (f)"]')
  475. }
  476. }
  477. class element {
  478. static get br() {
  479. return new element("br")
  480. }
  481. constructor(e, t = {}) {
  482. if (e instanceof HTMLElement) this.element = e;
  483. else {
  484. this.element = document.createElement(e);
  485. for (let e in t) "className" === e ? this.element.className = t[e] : this.element.setAttribute(e, t[e])
  486. }
  487. }
  488. style(e) {
  489. for (let t in e) this.element.style[t] = e[t];
  490. return this
  491. }
  492. append(e, ...t) {
  493. this.element.append(e.element || e);
  494. for (let e = 0; e < t.length; e++) this.element.append(t[e].element || t[e]);
  495. return this
  496. }
  497. appendTo(e) {
  498. return (e.element || ("string" == typeof e ? document.querySelector(e) : e)).append(this.element), this
  499. }
  500. on(e, t) {
  501. return this.element.addEventListener(e, t), this
  502. }
  503. set(e, t) {
  504. return "className" === e ? ("string" == typeof t && t.startsWith(".") && (t = t.substring(1)), this.element.className = t) : this.element[e] = t, this
  505. }
  506. remove() {
  507. return this.element.remove(), this
  508. }
  509. get(e) {
  510. return this.element[e]
  511. }
  512. get children() {
  513. return Array.from(this.element.children)
  514. }
  515. }
  516.  
  517. function dispatchAllInputEvents(e, t) {
  518. ["focus", "input", "change", "blur"].forEach((o => {
  519. let n = new Event(o, {
  520. bubbles: !0,
  521. isTrusted: !0
  522. });
  523. e[`on${o}`] && e[`on${o}`](n), "input" === o && (e.value = t), e.dispatchEvent(n)
  524. }))
  525. }
  526.  
  527. function downloadFileAsTitle(e, t) {
  528. const o = document.createElement("a");
  529. o.href = e, o.download = t, document.body.appendChild(o), o.click(), document.body.removeChild(o)
  530. }
  531. _element = _e = element,
  532. function() {
  533. Object.assign(this || arguments[0], {
  534. CustomLog: class {
  535. constructor(e) {
  536. this.title = {
  537. body: e || "---",
  538. color: "darkgrey",
  539. size: "1rem"
  540. }, this.body = {
  541. color: "#008f68",
  542. size: "1rem"
  543. }
  544. }
  545. setTitleBody(e) {
  546. return this.title.body = e, this
  547. }
  548. setTitleStyle({
  549. color: e,
  550. size: t
  551. }) {
  552. return void 0 !== e && (this.title.color = e), void 0 !== t && (this.title.size = t), this
  553. }
  554. setBodyStyle({
  555. color: e,
  556. size: t
  557. }) {
  558. return void 0 !== e && (this.body.color = e), void 0 !== t && (this.body.size = t), this
  559. }
  560. log(e = "") {
  561. console.log(`%c${this.title.body} | %c${e}`, `color: ${this.title.color}; font-weight: bold; font-size: ${this.title.size};`, `color: ${this.body.color}; font-weight: bold; font-size: ${this.body.size}; text-shadow: 0 0 5px rgba(0,0,0,0.2);`)
  562. }
  563. }
  564. })
  565. }(top), console.log("ok");
  566. var CurrentPlayingSymbol = "▶",
  567. adev, set_;
  568.  
  569. function getV(e, t) {
  570. return GM_getValue(e) || (GM_setValue(e, t), t)
  571. }
  572.  
  573. function setV(e, t) {
  574. GM_setValue(e, t)
  575. }
  576. async function getFinalUrlFromServer(e) {
  577. try {
  578. const t = await fetch("http://localhost:3000/get-final-url", {
  579. method: "POST",
  580. headers: {
  581. "Content-Type": "application/json"
  582. },
  583. body: JSON.stringify({
  584. url: e
  585. })
  586. });
  587. if (!t.ok) throw new Error("Failed to fetch final URL");
  588. return (await t.json()).finalUrl
  589. } catch (e) {
  590. return console.error("Error:", e), null
  591. }
  592. }
  593.  
  594. function getCurrentVideoID() {
  595. var e;
  596. return [...document.getElementsByClassName("ytp-video-menu-item ytp-button")].forEach(((t, o) => {
  597. t.innerText.startsWith(CurrentPlayingSymbol) && (e = new URL(t.href).searchParams.get("v"))
  598. })), !e && document.getElementsByClassName("ytp-playlist-menu-button ytp-button")[0] ? (console.log("Opening"), document.getElementsByClassName("ytp-playlist-menu-button ytp-button")[0].click(), getCurrentVideoID()) : e ? (console.log("Closiung"), document.getElementsByClassName("ytp-playlist-menu-button ytp-button")[0].click(), e) : console.warn("Not Found!")
  599. }
  600. _getV = getV, _setV = setV, Number.prototype.decimal = function(e) {
  601. return Number(this.toFixed(e))
  602. }, getSoundCloudUrl = () => {
  603. try {
  604. return findhref2(document.querySelector("#app > div.playControls.g-z-index-control-bar.m-visible > section > div > div.playControls__elements > div.playControls__soundBadge.sc-ml-3x > div"))[0].href
  605. } catch {
  606. return
  607. }
  608. }, downloadSC = function() {
  609. GM_setValue("SCinfo", null), GM_setValue("sc", getSoundCloudUrl()), !set_ && (set_ = 1, GM_addValueChangeListener("SCinfo", (function(e, t, o, n) {
  610. console.log({
  611. a: e,
  612. b: t,
  613. c: o,
  614. d: n
  615. }), o && o.name && _downloadFileAsTitle(o.href, o.name)
  616. }))), open("https://sclouddownloader.net/")
  617. };
  618. const sleep = e => new Promise((t => setTimeout(t, e)));
  619. window.sleep = sleep, GM_setValue_ = GM_setValue, GM_getValue_ = GM_getValue, GM_info_ = GM_info;
  620. var UnmutePath = "M3.15,3.85l4.17,4.17L6.16,9H3v6h3.16L12,19.93v-7.22l2.45,2.45c-0.15,0.07-0.3,0.13-0.45,0.18v1.04 c0.43-0.1,0.83-0.27,1.2-0.48l1.81,1.81c-0.88,0.62-1.9,1.04-3.01,1.2v1.01c1.39-0.17,2.66-0.71,3.73-1.49l2.42,2.42l0.71-0.71 l-17-17L3.15,3.85z M11,11.71v6.07L6.52,14H4v-4h2.52l1.5-1.27L11,11.71z M10.33,6.79L9.62,6.08L12,4.07v4.39l-1-1V6.22L10.33,6.79 z M14,8.66V7.62c2,0.46,3.5,2.24,3.5,4.38c0,0.58-0.13,1.13-0.33,1.64l-0.79-0.79c0.07-0.27,0.12-0.55,0.12-0.85 C16.5,10.42,15.44,9.1,14,8.66z M14,5.08V4.07c3.95,0.49,7,3.85,7,7.93c0,1.56-0.46,3.01-1.23,4.24l-0.73-0.73 C19.65,14.48,20,13.28,20,12C20,8.48,17.39,5.57,14,5.08z",
  621. mutePath = "M17.5,12c0,2.14-1.5,3.92-3.5,4.38v-1.04c1.44-0.43,2.5-1.76,2.5-3.34c0-1.58-1.06-2.9-2.5-3.34V7.62 C16,8.08,17.5,9.86,17.5,12z M12,4.07v15.86L6.16,15H3V9h3.16L12,4.07z M11,6.22L6.52,10H4v4h2.52L11,17.78V6.22z M21,12 c0,4.08-3.05,7.44-7,7.93v-1.01c3.39-0.49,6-3.4,6-6.92s-2.61-6.43-6-6.92V4.07C17.95,4.56,21,7.92,21,12z";
  622.  
  623. function downloadFile_(e, t) {
  624. const o = document.createElement("a");
  625. o.href = e, o.download = t, document.body.appendChild(o), o.click(), document.body.removeChild(o)
  626. }
  627. _downloadFileAsTitle = async function(e, t, o, n) {
  628. const l = document.createElement("a");
  629. return l.style.display = "none", document.body.appendChild(l), fetch(e).then((e => e.blob())).then((i => {
  630. const r = URL.createObjectURL(i);
  631. l.href = r, l.download = t, l.target = "_blank", l.click(), URL.revokeObjectURL(r), (o || opener || window).postMessage({
  632. url: e,
  633. title: t,
  634. s: !0
  635. }, "*"), (typeof n).includes("function") && n()
  636. })).catch((n => {
  637. console.error("Error downloading file:", n), (o || opener || window).postMessage({
  638. url: e,
  639. title: t,
  640. s: !1
  641. }, "*")
  642. }))
  643. }, _downloadFile_ = downloadFile_;
  644. const query = function(e, t) {
  645. try {
  646. let n = "undefined" != typeof $ ? $ : document.querySelectorAll;
  647. return t ? [...document.querySelectorAll(e)].filter((e => !(null === el.offsetParent)))[0] : (o = n(e) ? n(e).length ? n(e)[0] : n(e) : null, Object.keys(o).length ? o : null)
  648. } catch {}
  649. var o
  650. };
  651. async function downloadVideo(e, t) {
  652. try {
  653. const o = await fetch(e);
  654. if (!o.ok) throw new Error(`HTTP error! Status: ${o.status}`);
  655. const n = o.url,
  656. l = await o.blob(),
  657. i = window.URL.createObjectURL(l),
  658. r = document.createElement("a");
  659. r.href = i, r.download = t, document.body.appendChild(r), r.click(), document.body.removeChild(r), window.URL.revokeObjectURL(i), console.log(`Video downloaded from: ${n}`)
  660. } catch (e) {
  661. console.error("Failed to download video:", e)
  662. }
  663. }
  664. getElementByAttribute = function(e, t = "aria-label", o = document.body) {
  665. var n = [];
  666. return function o(l) {
  667. l.getAttribute(t) == e ? n.push(l) : l.children.length && ((l = l.children).forEach = [].forEach, l.forEach((e => {
  668. o(e)
  669. })))
  670. }(o), 1 == n.length ? n[0] : n || !1
  671. }, get_aria_label = function(e, t = document.body) {
  672. var o = [];
  673. return function t(n) {
  674. n.getAttribute("aria-label") == e ? o.push(n) : n.children.length && ((n = n.children).forEach = [].forEach, n.forEach((e => {
  675. t(e)
  676. })))
  677. }(t), o[0] || !1
  678. }, getClass = function(e) {
  679. return document.getElementsByClassName("ehlq8k34")[0]
  680. }, async function() {
  681. async function e(e, t = 3e4) {
  682. var o;
  683. for (sleep(t).then((e => o = !0)); !document.querySelector(e) && (await sleep(0), !o););
  684. return document.querySelector(e)
  685. }
  686. return location.href.includes("/embed/") ? (console.log("Attaching to embeder >:]"), e(".ytp-right-controls").then((async e => {
  687. let t = new _e("button", {
  688. id: "embedMP3"
  689. }).appendTo(e).set("innerText", "MP3").on("click", (function() {
  690. let e = getCurrentVideoID() || setElement(location.href);
  691. downloadT(e, !1, !0, !1, !0)
  692. })).style({
  693. position: "fixed",
  694. right: "50%",
  695. top: "80%"
  696. });
  697. for (; !document.getElementById("embedMP3") && document.querySelector(".ytp-right-controls");) console.log("Appended"), t.appendTo(".ytp-right-controls")
  698. }))) : (document.querySelector(".ytp-right-controls"), await e(".playbackSoundBadge__actions", 5e3).then((async t => {
  699. let o = new _e("button", {
  700. id: "GetAudio"
  701. }).appendTo(t).set("innerText", "Download MP3").on("click", (function() {
  702. downloadSC()
  703. }), (e => e));
  704. for (;;) !document.getElementById("GetAudio") && await e(".playbackSoundBadge__actions", 5e3) && await e(".playbackSoundBadge__actions", 5e3).then((e => {
  705. o.appendTo(e), console.log("Added Button")
  706. })), await sleep(0)
  707. })))
  708. }().then(console.log, console.warn),
  709. function() {
  710. const actions = [{
  711. test: e => e.includes("onlymp3.app") || e.includes("onlymp3.to"),
  712. action: async() => {
  713. console.log("Executing onlymp3 action!"), console.log("onlymp3.app");
  714. setInterval((() => {
  715. document.getElementById("error-text").innerText.length > 5 && location.reload()
  716. }), 2e4), console.log("Getting MP3"), tF((function(e = function() {}) {
  717. ! function() {
  718. var [e, t] = name.split(",");
  719. txtUrl.value = `https://www.youtube.com/${"1"==t?"shorts/":"watch?v="}${e}`, getListFormats()
  720. }(), tF((function(e = function() {}) {
  721. ! function() {
  722. var e = videoTitle.innerText.split("\n"),
  723. t = e.map((e => e.match(/[:\d]+/gi))).filter((e => !!e)).pop().pop(),
  724. o = e[0].split("Title: ")[1],
  725. n = findhref2(videoTitle.parentNode)[0].href,
  726. l = {
  727. id: setElement(location.href),
  728. href: n,
  729. title: o,
  730. length: t
  731. };
  732. (opener || window).postMessage(l, "*"), console.log("Poasted")
  733. }()
  734. }), {
  735. callback: close
  736. })
  737. }), {
  738. callback: function() {}
  739. })
  740. }
  741. }, {
  742. test: e => new URL(e).host.includes("tiktok"),
  743. action() {
  744. console.log("OK, let's go2"), addEventListener("load", (function() {
  745. function e() {
  746. const e = abc_("browse-copy", "data-e2e") || abc_("browse-user-avatar", "data-e2e") ? (abc_("browse-copy", "data-e2e") || abc_("browse-user-avatar", "data-e2e")).parentNode : null;
  747. e ? e.querySelector(".tt1") ? console.log("Buttons already exist, chillin'.") : (console.log("Buttons not found, appending now."), e.append(tiktokButton.element), e.append(tiktokButton2.element)) : console.log("Target element not found, fam.")
  748. }
  749. console.log("OK, let's go"), e(), setInterval(e, 4e3)
  750. }))
  751. },
  752. action2() {
  753. console.log("OK lets go2"), addEventListener("load", (function() {
  754. console.log("OK lets go")
  755. }))
  756. }
  757. }, {
  758. test: e => new URL(e).host.includes("youtube"),
  759. action() {
  760. tF((function() {
  761. if (_ex_(), !_ex_()) throw "Cant append buttons yet";
  762. return console.log("Posting"), appendButtons()
  763. }), {
  764. callback: function() {}
  765. })
  766. }
  767. }, {
  768. test: e => new URL(e).host.includes("music"),
  769. action() {
  770. console.log("Added MiniPlayer Toggle with I"), addEventListener("keypress", (function({
  771. isTrusted: e,
  772. ctrlKey: t,
  773. shiftKey: o,
  774. code: n,
  775. target: l,
  776. target: {
  777. tagName: i
  778. }
  779. }) {
  780. ["INPUT", "TEXTAREA"].includes(i) || t || o || !e || "KeyI" != n || (abc_("Close player page") || abc_("Open player page")[1]).click()
  781. }))
  782. }
  783. }, {
  784. test: e => new URL(e).host.includes("laoder.to") && location.href.includes("/api/"),
  785. action() {
  786. console.warn("using loader.to api")
  787. }
  788. }],
  789. domainActions = {
  790. "qdownloader.cc": async() => {
  791. async function e(e, t = 2e4) {
  792. let o = !1;
  793. for (setTimeout((() => {
  794. console.log("TimeOut for", e), o = !0
  795. }), t); !document.querySelector(e) && (console.log("_", e, o), await sleep(500), !o););
  796. if (console.log(e, o), o) throw "NotFound";
  797. return document.querySelector(e)
  798. }! function() {
  799. const e = document.createElement;
  800. document._createElement = function(t, o) {
  801. const n = e.call(document, t, o);
  802. return n._click = n.click, n.click = function() {
  803. if (console.log(n, "was clicked", n.tagName), "A" === n.tagName) {
  804. console.log("Caught", n);
  805. const e = n.download,
  806. t = n.href;
  807. f = {
  808. id: new URL(location.href).searchParams.get("v"),
  809. href: t,
  810. title: e
  811. }
  812. } else n._click.apply(n);
  813. return console.log(n, "was created", n.tagName), n
  814. }, console.log(n, "was created", n.tagName), n
  815. }
  816. }();
  817. try {
  818. await async function() {
  819. if (location.href.includes("vidbutton")) throw "vidbutton";
  820. var t = !1;
  821. GM_setValue("dlbutton", ""), GM_addValueChangeListener("dlbutton", (async function(e, t, o, n) {
  822. console.log({
  823. a: e,
  824. b: t,
  825. c: o,
  826. d: n
  827. }), o.includes("video download successful\ncheck downloads folder") && (await sleep(1e3), close())
  828. }));
  829. const o = await e("#url"),
  830. n = await e("#downloadBtn"),
  831. l = new URL(location.href).searchParams.get("v");
  832. ! function(e, t) {
  833. ["focus", "input", "change", "blur"].forEach((o => {
  834. const n = new Event(o, {
  835. bubbles: !0,
  836. isTrusted: !0
  837. });
  838. e[`on${o}`] && e[`on${o}`](n), "input" === o && (e.value = t), e.dispatchEvent(n)
  839. }))
  840. }(o, `https://www.youtube.com/watch?v=${l}`);
  841. let i = `started_${l}`;
  842. for (GM_addValueChangeListener(i, (async function(e, o, n, l) {
  843. console.log("Started", {
  844. a: e,
  845. b: o,
  846. c: n,
  847. d: l
  848. }), t = n
  849. })), GM_setValue(i, !1), alert(i + " not start"), n.click(); !t;) await sleep(5e3), n.click();
  850. GM_deleteValue(i)
  851. }()
  852. } catch (t) {
  853. "vidbutton" === t ? await async function() {
  854. console.log("Best Quality Video");
  855. let t = `started_${new URL(new URL(location.href).searchParams.get("url")).searchParams.get("v")}`;
  856. GM_setValue(t, !0), await e("#height").then((o => {
  857. GM_setValue(t, !0), height.selectedIndex = height.options.length - 1, dlbutton.click(), window.open = function(e, t, o) {
  858. console.log({
  859. a: e,
  860. b: t,
  861. c: o
  862. })
  863. }, e("#dlbutton").then((e => {
  864. let t = "";
  865. setInterval((() => {
  866. t !== e.innerText && (t = e.innerText, GM_setValue("dlbutton", t))
  867. }), 100)
  868. }))
  869. }))
  870. }() : console.error(t)
  871. }
  872. },
  873. "snapsave.io": async() => {
  874. async function e(e, t = 2e4) {
  875. let o = !1;
  876. for (setTimeout((() => {
  877. console.log("TimeOut for", e), o = !0
  878. }), t); !document.querySelector(e) && (console.log("_", e, o), await sleep(500), !o););
  879. if (console.log(e, o), o) throw "NotFound";
  880. return document.querySelector(e)
  881. }
  882. _wfs = e;
  883. var t = await e("#s_input", 3e4);
  884. if (t) {
  885. console.log("Converting"), id_ = new URL(location.href).searchParams.get("v"), t.value = `https://www.youtube.com/watch?v=${id_}`, ksearchvideo(), setTimeout(ksearchvideo(), 1e3);
  886. var o = await e("#formatSelect");
  887. await e("#btn-action");
  888. o.selectedIndex = 0, o.options[0].selected = !0;
  889. for (var n = await e("#asuccess"); !(n = await e("#asuccess"));) await sleep(0);
  890. for (convertFile(0);
  891. "#" == n.getAttribute("href");) await sleep(0), n = await e("#asuccess");
  892. console.log(n.href);
  893. var l = (await _wfs(".clearfix")).querySelector("h3").innerText,
  894. i = {
  895. id: id_,
  896. href: n.href,
  897. title: l,
  898. length: {}
  899. };
  900. console.log("Posted", i), (opener || window).postMessage(i, "*")
  901. } else alert("Input was not Found"), console.warn("?!!")
  902. },
  903. "soundcloud.com": async() => {
  904. getSoundCloadI = function() {
  905. _setV("SC", getSoundCloudUrl()), open("https://sclouddownloader.net/", "SC").onclose = function(e) {
  906. console.log("Win closed")
  907. }
  908. }
  909. },
  910. "sclouddownloader.net": async function() {
  911. var e = _getV("sc");
  912. async function t(e, t) {
  913. return await new Promise((async(o, n) => {
  914. var l = !1;
  915. setTimeout((() => (l = 0, n())), t);
  916. for (; !document.querySelector(e);)
  917. if (await sleep(), l) {
  918. n();
  919. break
  920. }
  921. return o(document.querySelector(e))
  922. })).then((e => !0), (e => !1))
  923. }
  924. if ("/download-sound-track" == location.pathname) {
  925. for (await t("#trackTitle"); !trackTitle.innerText.length;) await sleep(0);
  926. for (await t("#trackLink"); !trackLink.href.length;) await sleep(0);
  927. var o = {
  928. name: trackTitle.innerText,
  929. href: trackLink.href
  930. };
  931. console.log(o), _setV("SCinfo", o), close()
  932. } else {
  933. if (!_getV("SC")) throw "Bruv";
  934. var n = "#urlInput";
  935. if (await t(n, 2e3), await t(n, 2e3)) {
  936. for (document.querySelector(n).value = e, console.log("EZ url", !!window.formSubmit);
  937. "undefined" == typeof formSubmit;) {
  938. document.querySelector(n).value = e;
  939. try {
  940. await sleep(0), console.log("EZ url", formSubmit), formSubmit()
  941. } catch {}
  942. }
  943. console.log("EZ url", formSubmit), formSubmit(), console.warn("Got"), setInterval((() => {
  944. document.querySelector(n).value = e, formSubmit()
  945. }), 1e3)
  946. }
  947. }
  948. },
  949. "studio.youtube.com": async() => {
  950. var e;
  951. setInterval((() => {
  952. var t;
  953. try {
  954. [...[...document.querySelectorAll("#video-list")].map((e => [e, [...e.classList]])).filter((e => e[1].includes("ytcp-video-section")))[0][0].children[1].children].map((e => [e, [...e.classList], e.tagName])).filter((e => "YTCP-VIDEO-ROW" == e[2])).filter((e => "Public" == e[0].children[0].querySelectorAll(".cell-body.tablecell-visibility.style-scope.ytcp-video-row")[0].innerText)).map((e => e[0].children[0].querySelectorAll(".cell-body.tablecell-visibility.style-scope.ytcp-video-row")[0])).forEach((e => {
  955. console.log(e), e.append(new _e("br").element);
  956. new _e("button").set("innerText", "MP3").on("click", (function(e) {
  957. let t = e.target.parentElement.parentElement.querySelector("#hover-items").children[3];
  958. console.log(t);
  959. const {
  960. id: o,
  961. href: n,
  962. short: l
  963. } = {
  964. href: t.href,
  965. short: t.href.includes("/short"),
  966. id: setElement(t.href)
  967. };
  968. console.log({
  969. id: o,
  970. href: n,
  971. short: l
  972. }), downloadT(o, !1, !0, !1, !1, new URL(n))
  973. }));
  974. var t = new _e("button").set("innerText", "MP4").on("click", (function(e) {
  975. let t = e.target.parentElement.parentElement.querySelector("#hover-items").children[3];
  976. console.log(t);
  977. const {
  978. id: o,
  979. href: n,
  980. short: l
  981. } = {
  982. href: t.href,
  983. short: t.href.includes("/short"),
  984. id: setElement(t.href)
  985. };
  986. console.log({
  987. id: o,
  988. href: n,
  989. short: l
  990. }), downloadT(o, !1, !0, !0, !1, new URL(n))
  991. }));
  992. e.prepend(t.element)
  993. })), t = !0
  994. } catch {
  995. t = !1
  996. }
  997. e != t && (e = t, console.log("Change?", t ? "Found" : "Not FOund"))
  998. }), 0)
  999. },
  1000. "www.socialplug.io": async() => {
  1001. async function e(e, t = 5e3) {
  1002. let o = !1;
  1003. for (setTimeout((() => {
  1004. console.log("TimeOut for", e), o = !0
  1005. }), t); !document.querySelector(e) && (console.log("_", e, o), await sleep(500), !o););
  1006. if (console.log(e, o), o) throw "NotFound";
  1007. return document.querySelector(e)
  1008. }
  1009. location.pathname.split("/")[1] != GM_getValue(document.domain) && (GM_setValue(document.domain, location.pathname.split("/")[1]), console.warn("updated"));
  1010. let [t, o] = name.split(",");
  1011. if (!t.length || !o.length) return console.warn("No info Preset");
  1012. var n = `https://www.youtube.com/${"1"==o?"shorts/":"watch?v="}${t}`;
  1013. for (await e("#video-url"), console.log("Input Loaded"), document.querySelector("#video-url").value = n, await e("#get-video-button"), console.log("GEtting res"), await sleep(100), document.querySelector("#get-video-button").click(), await e("#quality-options", 2e4); !document.getElementById("quality-options").children.length;) await sleep(100);
  1014. for (document.getElementById("quality-options").children[document.getElementById("quality-options").children.length - 1].click(), console.log("Stating Download"); Number(document.querySelector(".indicator").style.width.replace("%", "")) < 100;) await sleep(10), "An error occurred while starting the download" == error.innerText && (document.getElementById("quality-options").children[document.getElementById("quality-options").children.length - 1].click(), console.warn("Stating Download again"), error.innerText = "", await sleep(1e3));
  1015. for (console.log("Done Loading"), console.log("Unloading video"); Number(document.querySelector(".indicator").style.width.replace("%", ""));) await sleep(10);
  1016. close()
  1017. },
  1018. "y2mate.nu": async() => {
  1019. location.pathname.split("/")[1] != GM_getValue("y2mate.nu") && (GM_setValue("y2mate.nu", location.pathname.split("/")[1]), console.warn("updated"), close());
  1020. let id_ = new URL(location.href).searchParams.get("v"),
  1021. IsShort = 1 == new URL(location.href).searchParams.get("s"),
  1022. mp4 = new URL(location.href).searchParams.get("mp4"),
  1023. useT = new URL(location.href).searchParams.get("useT"),
  1024. _ = id_ + mp4 + useT;
  1025. for (id_ || ([id_, IsShort, mp4, useT] = name.split(",").map((e => {
  1026. try {
  1027. return !!eval(e)
  1028. } catch {
  1029. return String(e)
  1030. }
  1031. }))); typeof gB == typeof nonexistent;) await sleep(1);
  1032. async function wfs(e, t = 5e3) {
  1033. let o = !1;
  1034. for (setTimeout((() => {
  1035. console.log("TimeOut for", e), o = !0
  1036. }), t); !document.querySelector(e) && (console.log("_", e, o), await sleep(500), !o););
  1037. if (console.log(e, o), o) throw "NotFound";
  1038. return document.querySelector(e)
  1039. }
  1040. let cr = document.createElement;
  1041. for (window.openN = window.open, window.open = function(...e) {
  1042. console.log(document.domain, "wants to open", e)
  1043. }, document.createElement = function(e, t) {
  1044. let o = cr.call(document, e, t);
  1045. return o._click = o.click, o.click = function() {
  1046. if (console.log(o, "was clicked", o.tagName), "A" == o.tagName) {
  1047. console.log("Caught", o);
  1048. let e = o.download,
  1049. t = o.href;
  1050. f = {
  1051. id: id_,
  1052. href: t,
  1053. title: e
  1054. }, (opener || window).postMessage(f, "*")
  1055. } else o._click.apply(o)
  1056. }, console.log(o, "was created", o.tagName), o
  1057. };
  1058. "complete" != document.readyState;) await sleep(0);
  1059. var initRes = await fetch(`https://d.${gB}/api/v1/init?a=${authorization()}&_=${Math.random()}`),
  1060. {
  1061. convertURL: convertURL
  1062. } = await initRes.json();
  1063. let _title;
  1064. console.log({
  1065. id_: id_,
  1066. mp4: mp4,
  1067. useT: useT,
  1068. IsShort: IsShort
  1069. });
  1070. let post = async(e, t) => {
  1071. console.log("a", e);
  1072. var o = {
  1073. _: _,
  1074. id: id_,
  1075. href: e,
  1076. title: t,
  1077. length: {}
  1078. };
  1079. console.log("Posted", o), (opener || window.parent).postMessage(o, "*"), close()
  1080. };
  1081. async function getInfo(e) {
  1082. var t = await fetch(e || `${convertURL}&v=${id_}&f=mp3&_=${Math.random()}`).then((e => e.json())),
  1083. {
  1084. downloadURL: o,
  1085. redirectURL: n,
  1086. redirect: l,
  1087. title: i,
  1088. error: r
  1089. } = await t;
  1090. return i && i.length && (_title = i), l ? (await sleep(1e3), console.log("Got redirected"), await getInfo(n)) : r ? (await sleep(1e3), console.log("retrying again"), await getInfo()) : o && o.length ? {
  1091. _title: _title,
  1092. downloadURL: o
  1093. } : void 0
  1094. }
  1095. let s = await getInfo();
  1096. console.log(s), await post(s.downloadURL, s._title)
  1097. },
  1098. "tubemp4.is": async() => {
  1099. async function e(e, t = 3e4) {
  1100. var o;
  1101. for (sleep(t).then((e => o = !0)); !document.querySelector(e) && (await sleep(0), !o););
  1102. return document.querySelector(e)
  1103. }
  1104. console.log("ok"), e("#u").then((async t => {
  1105. t.value = `https://www.youtube.com/watch?v=${new URL(location.href).searchParams.get("v")}`, convert.click(), await sleep(200), (await e("#convert")).click(), (await e(".process-button")).click(), e(".download-button").then((e => {
  1106. let t = document.createElement;
  1107. document.createElement = function(e, o) {
  1108. let n = t.call(document, e, o);
  1109. return n._click = n.click, n.click = function() {
  1110. if (console.log(n, "was clicked", n.tagName), "A" == n.tagName) {
  1111. console.log("Caught", n);
  1112. let e = n.download,
  1113. t = n.href;
  1114. f = {
  1115. id: new URL(location.href).searchParams.get("v"),
  1116. href: t,
  1117. title: e
  1118. }, (opener || window).postMessage(f, "*"), close()
  1119. } else n._click.apply(n)
  1120. }, console.log(n, "was created", n.tagName), n
  1121. }, e.click(), console.log("clicked"), setTimeout((() => e.click()), 1e3)
  1122. }))
  1123. })).then(console.log, console.warn)
  1124. },
  1125. "www.yt2conv.com": async() => {
  1126. console.log("Getting MP4");
  1127. let [e, t] = name.split(",");
  1128. tF((function(o = function() {}) {
  1129. document.getElementById("search_txt").value = `https://www.youtube.com/${"1"==t?"shorts/":"watch?v="}${e}`, document.getElementById("btn-submit").click(), console.log(e, t)
  1130. }), {
  1131. callback: function() {}
  1132. }), tF((function(e = function() {}) {
  1133. if (console.log(result.children.length), !result.children.length) throw document.getElementById("btn-submit").click(), "no there"
  1134. }), {
  1135. int: 1e3,
  1136. callback: function() {}
  1137. }), tF((function() {
  1138. document.getElementById("btn-download").click()
  1139. }), {
  1140. callback: function() {}
  1141. }), tF((function() {
  1142. var t = $(".media-heading")[0].innerText,
  1143. o = downloadbtn.href,
  1144. n = {
  1145. id: e,
  1146. href: o,
  1147. title: t,
  1148. length: {}
  1149. };
  1150. console.log("Posted"), (opener || window).postMessage(n, "*")
  1151. }), {
  1152. callback: close
  1153. })
  1154. },
  1155. "yt5s.biz": async() => {
  1156. async function e(e) {
  1157. for (; !document.querySelector(e);) await sleep(0);
  1158. return !0
  1159. }
  1160. let [t, o] = name.split(",");
  1161. if (!t.length || !o.length) return console.warn("No info Preset");
  1162. var n = `https://www.youtube.com/${"1"==o?"shorts/":"watch?v="}${t}`;
  1163. await e("#txt-url"), console.log("Input Loaded"), document.querySelector("#txt-url").value = n, await e("#btn-submit"), console.log("GEtting res"), await sleep(100), document.querySelector("#btn-submit").click(), await e("#video_title"), console.log("Got Res");
  1164. var l = document.querySelector("#video_title").innerText,
  1165. i = [0];
  1166. [...document.querySelector("#result").querySelector("table").querySelectorAll("tr")].forEach((e => {
  1167. var t = e.innerText.match(/(?<res>\d+)(p|P)/i) || {};
  1168. t.groups && (t = Number(t.groups.res), i[0] < t && (i[0] = t, i[1] = findhref2(e)[0].href, i[2] = e))
  1169. }));
  1170. let r = {
  1171. id: t,
  1172. title: l,
  1173. href: i[1],
  1174. mp4: !0,
  1175. res: i[0]
  1176. };
  1177. (opener || window).postMessage(r, "*"), location.href = r.href
  1178. },
  1179. "en3.onlinevideoconverter.pro": async() => {
  1180. let [e, t] = name.split(",");
  1181. if (!e.length || !t.length) return console.Warn("NO info Preset");
  1182. let o = function() {};
  1183. tF((function(o = function() {}) {
  1184. document.getElementById("texturl").value = `https://www.youtube.com/${"1"==t?"shorts/":"watch?v="}${e}`, document.getElementById("convert1").click(), console.log("Searched")
  1185. }), {
  1186. callback: o
  1187. }), tF((function() {
  1188. if ("none" == stepProcess.style.display) throw document.getElementById("convert1").click(), "this";
  1189. console.log("Searching")
  1190. }), {
  1191. callback: o
  1192. }), tF((function() {
  1193. if (0 == document.getElementById("form-app-root").children.length) throw "";
  1194. console.log("loaded");
  1195. var {
  1196. title: t,
  1197. href: o
  1198. } = $("#download-720-MP4") && $("#download-720-MP4")[0] ? $("#download-720-MP4")[0] : $("#download-720-MP4"), n = {
  1199. id: e,
  1200. href: o,
  1201. title: t,
  1202. length: {}
  1203. };
  1204. console.log("Posted"), (opener || window).postMessage(n, "*")
  1205. }), {
  1206. callback: close
  1207. })
  1208. },
  1209. "production.assets.clips.twitchcdn.net": async() => {
  1210. let e = new element("a", {
  1211. href: document.querySelector('[type="video/mp4"]').src,
  1212. download: document.querySelector('[type="video/mp4"]').src.split("/")[5] + ".mp4"
  1213. });
  1214. document.body.append(e.element), e.element.click(), sleep(500).then((t => {
  1215. e.element.remove(), sleep(500).then((e => {
  1216. close()
  1217. }))
  1218. }))
  1219. },
  1220. "clips.twitch.tv": async() => {
  1221. if ("create" === location.pathname.split("/")[1]) return;
  1222. const e = e => new Promise((t => setTimeout(t, e)));
  1223. _wfs = async function(t, o = 2e4) {
  1224. let n = !1;
  1225. for (setTimeout((() => {
  1226. console.log("TimeOut for", t), n = !0
  1227. }), o); !document.querySelector(t) && (console.log("_", t, n), await e(500), !n););
  1228. if (console.log(t, n), n) throw "NotFound";
  1229. return document.querySelector(t)
  1230. }, _copyElm = function(e) {
  1231. if (!(e instanceof Element)) throw new Error("Provided argument is not a DOM element.");
  1232. const t = document.createElement(e.tagName);
  1233. for (let o of e.attributes) t.setAttribute(o.name, o.value);
  1234. return t.style.cssText = e.style.cssText, t.className = e.className, t.innerHTML = e.innerHTML, t
  1235. };
  1236. location.href;
  1237. let t = ".ScCoreButtonLabel-sc-s7h2b7-0",
  1238. o = (await _wfs(".ScCoreButtonLabel-sc-s7h2b7-0")).parentElement.parentElement.parentElement.parentElement;
  1239. async function n(e, t) {
  1240. return await fetch(e).then((e => !0), (e => !1)) ? (new _e("iframe", {
  1241. src: e,
  1242. width: "100%",
  1243. height: "600px",
  1244. frameborder: "0"
  1245. }).appendTo(document.body), console.log(`Embedded ${t} iframe: `, e)) : (console.warn("Embed failed"), open(e, t))
  1246. }[{
  1247. label: "1080P",
  1248. resolution: "1080"
  1249. }, {
  1250. label: "720P",
  1251. resolution: "720"
  1252. }, {
  1253. label: "480P",
  1254. resolution: "480"
  1255. }, {
  1256. label: "360P",
  1257. resolution: "360"
  1258. }, {
  1259. label: "VOD",
  1260. resolution: "VOD"
  1261. }].forEach((({
  1262. label: e,
  1263. resolution: l
  1264. }) => {
  1265. let i = new _e(_copyElm(o)).on("click", (function() {
  1266. i.element.querySelector(t).innerText;
  1267. var o;
  1268. i.element.querySelector(t).innerText = "Please wait...", n((e => e.href)(((o = new URL(location.href)).host = "clipr.xyz", o)), l).then((o => i.element.querySelector(t).innerText = e))
  1269. })).appendTo(o.parentNode);
  1270. i.element.querySelector(t).innerText = e
  1271. }))
  1272. },
  1273. "www.twitch.tv": async() => {
  1274. async function e() {
  1275. const t = await async function(e, t = 3e4) {
  1276. const o = e => new Promise((t => setTimeout(t, e)));
  1277. var n;
  1278. for (o(t).then((e => n = !0)); !document.querySelector(e) && (await o(0), !n););
  1279. return document.querySelector(e)
  1280. }(".rewards-list", 3e3);
  1281. return t || (get_aria_label("Bits and Points Balances") && get_aria_label("Bits and Points Balances").click(), e())
  1282. }
  1283. let t = {};
  1284. async function o() {
  1285. let [, e, t, o] = location.pathname.split("/");
  1286. if ("clip" !== t) return console.warn("User isnt wathcing a clip");
  1287. console.log("User is Watching a CLip");
  1288. const n = e => new Promise((t => setTimeout(t, e)));
  1289. async function l(e, t = 2e4) {
  1290. let o = !1;
  1291. for (setTimeout((() => {
  1292. console.log("TimeOut for", e), o = !0
  1293. }), t); !document.querySelector(e) && (console.log("_", e, o), await n(500), !o););
  1294. if (console.log(e, o), o) throw "NotFound";
  1295. return document.querySelector(e)
  1296. }
  1297. _wfs = l, _wfs_ = l, _copyElm = function(e) {
  1298. if (!(e instanceof Element)) throw new Error("Provided argument is not a DOM element.");
  1299. const t = document.createElement(e.tagName);
  1300. for (let o of e.attributes) t.setAttribute(o.name, o.value);
  1301. return t.style.cssText = e.style.cssText, t.className = e.className, t.innerHTML = e.innerHTML, t
  1302. }, await async function() {
  1303. location.href;
  1304. await _wfs(".Layout-sc-1xcs6mc-0.bMOhzu");
  1305. let n = [...document.querySelectorAll(".Layout-sc-1xcs6mc-0 .bMOhzu")].filter((e => e.querySelector("button") && !e.querySelector("button").disabled))[0],
  1306. l = ".bFxzAY";
  1307. [{
  1308. label: "1080P",
  1309. resolution: "1080"
  1310. }, {
  1311. label: "720P",
  1312. resolution: "720"
  1313. }, {
  1314. label: "480P",
  1315. resolution: "480"
  1316. }, {
  1317. label: "360P",
  1318. resolution: "360"
  1319. }, {
  1320. label: "VOD",
  1321. resolution: "VOD"
  1322. }].forEach((({
  1323. label: i,
  1324. resolution: r
  1325. }) => {
  1326. let a = new _e(_copyElm(n)).on("click", (function() {
  1327. a.element.querySelector(l).innerText;
  1328. var n;
  1329. a.element.querySelector(l).innerText = "Please wait...", [, e, t, o] = location.pathname.split("/"), async function(e, t, o, n) {
  1330. return await fetch(e).then((e => !0), (e => !1)) ? (new _e("iframe", {
  1331. src: e,
  1332. width: "100%",
  1333. height: "600px",
  1334. frameborder: "0"
  1335. }).appendTo(document.body), console.log(`Embedded ${t} iframe: `, e)) : (console.warn("Embed failed"), open(e, t))
  1336. }((e => e.href)(((n = new URL(location.href)).host = "clipr.xyz", n)), r).then((e => a.element.querySelector(l).innerText = i))
  1337. })).appendTo(document.querySelector(".Layout-sc-1xcs6mc-0.hZUoPp"));
  1338. "VOD" === r ? a.element.querySelector(".ScCoreButtonLabel-sc-s7h2b7-0").innerText = i : a.element.querySelector(l).innerText = i
  1339. }))
  1340. }().catch(console.warn)
  1341. }
  1342. var n;
  1343. setRwards = async function() {
  1344. t = {
  1345. bitItems: {},
  1346. rewardItems: {}
  1347. }, [...(await e()).querySelectorAll(".bitsRewardListItem--yx4rk")].forEach((e => {
  1348. let o = e.children[0].children[1].children[1].innerText,
  1349. n = e.children[0],
  1350. l = e.children[0].children[1].children[0].innerText,
  1351. i = () => {
  1352. n.click()
  1353. };
  1354. i.name = l, i.cost = o, i.button = n, t.bitItems[l] = i
  1355. })), [...document.querySelectorAll(".reward-list-item")].forEach((e => {
  1356. let o = e.querySelector("button"),
  1357. [n, l] = [...e.querySelectorAll(".CoreText-sc-1txzju1-0")].map((e => e.innerText)),
  1358. i = () => {
  1359. o.click()
  1360. };
  1361. console.log(n, l), i.name = l, i.cost = n, i.button = o, t.rewardItems[l] = i
  1362. }))
  1363. }, unlockALLRNG = async function() {
  1364. for (;
  1365. "string" != typeof await unlockRNG(););
  1366. console.log("Done")
  1367. }, unlockRNG = async function() {
  1368. const e = e => new Promise((t => setTimeout(t, e)));
  1369. await setRwards();
  1370. let o = document.querySelector('[data-test-selector="bits-balance-string"]') ? document.querySelector('[data-test-selector="bits-balance-string"]').innerText : 0,
  1371. n = document.querySelector('[data-test-selector="copo-balance-string"') ? document.querySelector('[data-test-selector="copo-balance-string"').innerText : 0;
  1372. if (console.log({
  1373. totalPoints: n,
  1374. totalBits: o
  1375. }), !t.rewardItems["Unlock a Random Sub Emote"]) return "Doesnt exist";
  1376. if (!(t.rewardItems["Unlock a Random Sub Emote"].cost <= n)) return "Broke";
  1377. for (t.rewardItems["Unlock a Random Sub Emote"](); !document.getElementById("channel-points-reward-center-body").querySelector(".ScCoreButton-sc-ocjdkq-0");) await e(1e3);
  1378. if (document.getElementById("channel-points-reward-center-body").querySelector(".ScCoreButton-sc-ocjdkq-0").disabled) return get_aria_label("Back") && get_aria_label("Back").click(), "disabled";
  1379. for (; document.getElementById("channel-points-reward-center-body").querySelector(".ScCoreButton-sc-ocjdkq-0");) document.getElementById("channel-points-reward-center-body").querySelector(".ScCoreButton-sc-ocjdkq-0").click(), await e(1e3)
  1380. }, console.log("running points"), async function() {
  1381. let e = !1;
  1382. for (0;;) {
  1383. await sleep(100);
  1384. try {
  1385. document.querySelector('[aria-label="Claim Bonus"]') && (console.log("Bonus claimed"), document.querySelector('[aria-label="Claim Bonus"]').click()), a, get_aria_label("Leave feedback for this Ad") ? (console.log("AdFound"), document.querySelector("video").muted || e || (document.querySelector("video").muted = !0, e = !0)) : get_aria_label("Ad") && e && (document.querySelector("video").muted = !1)
  1386. } catch {}
  1387. }
  1388. }(), setInterval((() => {
  1389. n != location.href && o(), n = location.href
  1390. }), 100)
  1391. },
  1392. "clipr.xyz": async() => {
  1393. let e = name;
  1394. await async function() {
  1395. for (;
  1396. "complete" != document.readyState;) await sleep(0);
  1397. return !0
  1398. }(), logger.log("Loaded");
  1399. let t = ((e = {}) => ([...document.querySelectorAll(".flex.items-center.space-x-4")].filter((e => findhref2(e)[0])).filter((e => findhref2(e)[0].href.includes("clips.twitchcdn.net"))).forEach((t => {
  1400. e[t.querySelector(".space-x-1").innerText.replace("p", "")] = findhref2(t)[0].href
  1401. })), e))()[e];
  1402. logger.log(1);
  1403. let o = document.querySelector("body > div.relative.overflow-hidden > main > div > div.px-4.mx-auto.max-w-7xl.sm\\:px-6.lg\\:px-8 > div.mb-6.space-y-3.lg\\:flex.lg\\:items-center.lg\\:justify-between.lg\\:space-y-0 > div.lg\\:flex.lg\\:items-center > p > span:nth-child(1)").innerText;
  1404. logger.log(2);
  1405. let n = document.querySelector("body > div.relative.overflow-hidden > main > div > div.px-4.mx-auto.max-w-7xl.sm\\:px-6.lg\\:px-8 > div.mb-6.space-y-3.lg\\:flex.lg\\:items-center.lg\\:justify-between.lg\\:space-y-0 > div.lg\\:flex.lg\\:items-center > h2").innerText;
  1406. logger.log(3);
  1407. let l = `@${o} on Twitch | ${n} - ${e}P.mp4`;
  1408. logger.log(`Downloading file as: ${l}`), open(t), logger.log(4), await sleep(4e3), close()
  1409. },
  1410. "snapinst.app": async function() {
  1411. async function e(e, t = 2e4) {
  1412. let o = !1;
  1413. for (setTimeout((() => {
  1414. console.log("TimeOut for", e), o = !0
  1415. }), t); !document.querySelector(e) && (console.log("_", e, o), await sleep(500), !o););
  1416. if (console.log(e, o), o) throw "NotFound";
  1417. return document.querySelector(e)
  1418. }!async function() {
  1419. await e("body");
  1420. const t = document.createElement("canvas");
  1421. t.id = "blackCanvas", Object.assign(t.style, {
  1422. position: "fixed",
  1423. top: "0",
  1424. left: "0",
  1425. width: "100%",
  1426. height: "100%",
  1427. backgroundColor: "black",
  1428. zIndex: "9999",
  1429. pointerEvents: "none"
  1430. }), document.body.appendChild(t);
  1431. const o = () => {
  1432. t.width = window.innerWidth, t.height = window.innerHeight
  1433. };
  1434. o(), window.addEventListener("resize", o);
  1435. const n = t.getContext("2d");
  1436. n.fillStyle = "black", n.fillRect(0, 0, t.width, t.height), console.log("Black overlay canvas created.")
  1437. }();
  1438. let [t, o] = name.split("\n");
  1439. t && o ? (console.warn("Test2"), e("#url").then((n => {
  1440. console.warn("Test3"), n.value = `https://www.instagram.com/${t}/${o}/`, e("#btn-submit").then((t => {
  1441. t.click(), e(".download-bottom").then((async() => {
  1442. await sleep(1e3);
  1443. let e = [...document.querySelectorAll('[class="download-bottom"]')].map((e => findhref2(e)[0])).map((({
  1444. href: e,
  1445. download: t,
  1446. target: o
  1447. }) => ({
  1448. href: e,
  1449. download: t,
  1450. target: o
  1451. })));
  1452. (opener || window).postMessage(e, "*"), close()
  1453. }))
  1454. }))
  1455. }))) : console.warn("no")
  1456. },
  1457. "fastdl.app": async() => {
  1458. onload = async function() {
  1459. const e = {
  1460. url: name,
  1461. input: null
  1462. };
  1463. var t = !1;
  1464. for (setTimeout((() => {
  1465. t = !0
  1466. }), 2e4); !document.querySelector("#search-form-input");)
  1467. if (await sleep(0), t) throw "Cant find input";
  1468. e.input = document.querySelector("#search-form-input"), console.log("Found a"),
  1469. function(e, t) {
  1470. ["focus", "input", "change", "blur"].forEach((o => {
  1471. let n = new Event(o, {
  1472. bubbles: !0,
  1473. isTrusted: !0
  1474. });
  1475. e[`on${o}`] && e[`on${o}`](n), "input" === o && (e.value = t), e.dispatchEvent(n)
  1476. }))
  1477. }(e.input, e.url), document.querySelector(".search-form__button").click(), GM_setValue("instaURL", await async function(e) {
  1478. for (; !document.querySelector(e);) await sleep(0);
  1479. return document.querySelector(e)
  1480. }(".button--filled").then((e => e.href)))
  1481. }
  1482. },
  1483. "www.instagram.com": async() => {
  1484. var e;
  1485. let t = () => (e = function(e) {
  1486. const t = e.match(/https?:\/\/(?:www\.)?instagram\.com\/(?:([^\/]+)\/)?(p|reels|reel)\/([^\/?]+)/);
  1487. return t ? {
  1488. username: t[1] || null,
  1489. a: t[2],
  1490. id: t[3]
  1491. } : null
  1492. }(location.href), open("https://snapinst.app/", `${e.a}\n${e.id}`));
  1493. if (onmessage = async function(e) {
  1494. if ("https://snapinst.app" != e.origin) return void console.log("UNhandled", e);
  1495. let t = e.data;
  1496. for (let e = 0; e < t.length; e++) {
  1497. let {
  1498. href: o,
  1499. download: n,
  1500. target: l
  1501. } = t[e];
  1502. console.log("Got", {
  1503. href: o,
  1504. download: n,
  1505. target: l
  1506. });
  1507. let i = new element("a", {
  1508. href: o,
  1509. download: n,
  1510. target: l
  1511. });
  1512. document.body.append(i.element), i.element.click(), await sleep(500), i.element.remove()
  1513. }
  1514. }, "/call/" == location.pathname) {
  1515. ! function() {
  1516. Object.assign(this || arguments[0], {
  1517. _0x2c68c3: class {
  1518. constructor(e) {
  1519. this._0x2dcc16 = {
  1520. body: e || "---",
  1521. color: "darkgrey",
  1522. size: "1rem"
  1523. }, this._0x2603ce = {
  1524. color: "#008f68",
  1525. size: "1rem"
  1526. }
  1527. }
  1528. _0x54181c(e) {
  1529. return this._0x2dcc16.body = e, this
  1530. }
  1531. _0x40a387({
  1532. _0x4e4744: e,
  1533. _0x2fbd8f: t
  1534. }) {
  1535. return void 0 !== e && (this._0x2dcc16.color = e), void 0 !== t && (this._0x2dcc16.size = t), this
  1536. }
  1537. _0x235d03({
  1538. _0x14e09d: e,
  1539. _0x506311: t
  1540. }) {
  1541. return void 0 !== e && (this._0x2603ce.color = e), void 0 !== t && (this._0x2603ce.size = t), this
  1542. }
  1543. _0x52dfbf(e = "") {
  1544. console.log(`%c${this._0x2dcc16.body} | %c${e}`, `color:${this._0x2dcc16.color}; font-weight:bold; font-size:${this._0x2dcc16.size};`, `color:${this._0x2603ce.color}; font-weight:bold; font-size:${this._0x2603ce.size}; text-shadow: 0 0 5px rgba(0,0,0,0.2);`)
  1545. }
  1546. }
  1547. })
  1548. }(globalThis);
  1549. const e = new _0x2c68c3("InfiniteLoop");
  1550. e._0x52dfbf("Starting infinite loop..."), async function t() {
  1551. await sleep(1e3), async function(e, t) {
  1552. return await new Promise((async(o, n) => {
  1553. var l = !1;
  1554. for (setTimeout((() => (l = 0, n())), t); !document.querySelector(e);)
  1555. if (await sleep(), l) {
  1556. n();
  1557. break
  1558. }
  1559. return o(document.querySelector(e))
  1560. })).then((e => e), (e => !1))
  1561. }(".x6s0dn4 .x78zum5 .x5yr21d .xl56j7k.xh8yej3", 1e5).then((() => {
  1562. [...document.querySelectorAll(".x6s0dn4 .x78zum5 .x5yr21d .xl56j7k.xh8yej3")].forEach((e => e.style.backgroundColor = "green")), e._0x52dfbf("Iteration complete. Next iteration..."), t()
  1563. })).catch((o => {
  1564. e._0x52dfbf(`Error: ${o.message}`), t()
  1565. }))
  1566. }()
  1567. }
  1568.  
  1569. function o() {
  1570. console.log("Appended buttons man");
  1571. var e = new element(document.querySelectorAll(".xh8yej3.x1iyjqo2")[0]),
  1572. o = new element("button", {
  1573. id: "MediaButton"
  1574. }).set("innerText", "Get Media").on("click", t);
  1575. e.append(o)
  1576. }
  1577. tF((function() {
  1578. document.querySelectorAll(".xh8yej3.x1iyjqo2")[0].children
  1579. }), {
  1580. callback: function() {
  1581. o(), setInterval((() => {
  1582. ! function() {
  1583. const e = document.getElementsByTagName("article");
  1584. var o = new element("button", {
  1585. id: "MediaButton"
  1586. }).set("innerText", "Get Media").on("click", t);
  1587. for (const t of e) t.querySelector("#MediaButton") || t.prepend(o.element)
  1588. }(), document.querySelector("#MediaButton") || o(), document.querySelector("._aaqy") && !document.querySelector("._aaqy").querySelector("#MediaButton") && function() {
  1589. var e = new element(document.querySelector("._aaqy")),
  1590. o = new element("button", {
  1591. id: "MediaButton"
  1592. }).set("innerText", "Get Media").on("click", t);
  1593. e.append(o)
  1594. }()
  1595. }))
  1596. }
  1597. }), console.log("Insta ballz")
  1598. },
  1599. "sss.instasaverpro.com": async() => {
  1600. for (await async function(e) {
  1601. for (; !document.querySelector(e);) await sleep(0);
  1602. return !0
  1603. }("#A_downloadUrl"); !document.querySelector("#A_downloadUrl").href.length;) await sleep(0);
  1604. console.log("Done");
  1605. var e = document.querySelector("#myModalLabel").innerText,
  1606. t = {
  1607. href: document.querySelector("#A_downloadUrl").href,
  1608. title: e
  1609. };
  1610. (opener || window).postMessage(t, "*")
  1611. },
  1612. "savetik.co": async() => {
  1613. location.pathname.split("/")[1] != GM_getValue("savetik.co") && GM_setValue("savetik.co", location.pathname.split("/")[1]);
  1614. var [e, t] = name.split(",");
  1615. addEventListener("load", (function() {
  1616. tF((function() {
  1617. s_input.value = e, ksearchvideo(), setTimeout(ksearchvideo, 1e3)
  1618. }), {
  1619. callback() {}
  1620. })
  1621. })), GM_addValueChangeListener(e, (async function(t, o, n, l) {
  1622. console.log({
  1623. a: t,
  1624. b: o,
  1625. c: n,
  1626. d: l
  1627. }), n != o && n && (GM_deleteValue(e), await sleep(5e3), close())
  1628. })), tF((function() {
  1629. document.getElementsByClassName("clearfix")[0].innerText,
  1630. function() {
  1631. console.log("Found");
  1632. let o = document.getElementsByClassName("clearfix")[0].innerText,
  1633. n = findhref2(document.getElementsByClassName("tik-video")[0]).map((e => e.href)),
  1634. l = {
  1635. id: e,
  1636. title: o,
  1637. links: n,
  1638. mp4: 1 == t,
  1639. info: setElement2(e)
  1640. };
  1641. onmessage = function(e) {
  1642. if ("https://www.tiktok.com" == e.origin) {
  1643. var {
  1644. data: {
  1645. s: t,
  1646. url: o,
  1647. title: n
  1648. }
  1649. } = e;
  1650. console.log("Handled", {
  1651. s: t,
  1652. url: o,
  1653. title: n
  1654. }, e), t ? setTimeout(close, 100) : downloadFileAsTitle(o, n, null, close)
  1655. } else console.log("Unhandled Post", e)
  1656. }, (opener || window).postMessage(l, "*")
  1657. }()
  1658. }), {
  1659. callback() {}
  1660. })
  1661. }
  1662. };
  1663.  
  1664. function getTikTokTittle() {
  1665. try {
  1666. return document.querySelector("#app > div.css-14dcx2q-DivBodyContainer.e1irlpdw0 > div:nth-child(4) > div > div.css-1qjw4dg-DivContentContainer.e1mecfx00 > div.css-1stfops-DivCommentContainer.ekjxngi0 > div > div.css-1xlna7p-DivProfileWrapper.ekjxngi4 > div.css-1u3jkat-DivDescriptionContentWrapper.e1mecfx011 > div.css-1nst91u-DivMainContent.e1mecfx01 > div.css-bs495z-DivWrapper.e1mzilcj0 > div > div.css-1d7krfw-DivOverflowContainer.e1mzilcj5 > h1").innerText.replace("Replying to ", "")
  1667. } catch {
  1668. try {
  1669. return document.querySelector("#app > div.css-14dcx2q-DivBodyContainer.e1irlpdw0 > div:nth-child(4) > div > div.css-1qjw4dg-DivContentContainer.e1mecfx00 > div.css-1stfops-DivCommentContainer.ekjxngi0 > div > div.css-1xlna7p-DivProfileWrapper.ekjxngi4 > div.css-1u3jkat-DivDescriptionContentWrapper.e1mecfx011 > div.css-1nst91u-DivMainContent.e1mecfx01 > div.css-bs495z-DivWrapper.e1mzilcj0").innerText.replace("Replying to ", "")
  1670. } catch (e) {
  1671. return abc("browse-video-desc", "data-e2e") ? abc("browse-video-desc", "data-e2e").innerText : document.querySelector("#main-content-video_detail > div > div.css-12kupwv-DivContentContainer.ege8lhx2 > div.css-1senhbu-DivLeftContainer.ege8lhx3 > div.css-1sb4dwc-DivPlayerContainer.eqrezik4 > div.css-3lfoqn-DivDescriptionContentWrapper-StyledDetailContentWrapper.eqrezik15 > div.css-r4nwrj-DivVideoInfoContainer.eqrezik3 > div.css-bs495z-DivWrapper.e1mzilcj0 > div > h1").innerText.replace("Replying to ", "")
  1672. }
  1673. }
  1674. }
  1675.  
  1676. function sk() {
  1677. get_aria_label("Why this ad?").click(), setTimeout((() => {
  1678. document.querySelector("#yDmH0d > c-wiz > div > div > div:nth-child(2) > div.LLEp8b > div > div.rTq3hb > div:nth-child(1) > div > div.ofmULb > div:nth-child(2) > div > button").click(), setTimeout((() => {
  1679. document.querySelector("#VGHGFf > div > div.Eddif > div:nth-child(2) > button > div.VfPpkd-RLmnJb").click()
  1680. }), 1e3)
  1681. }), 1e3)
  1682. }
  1683. setElement2 = function(e) {
  1684. return e.match(/(?<host>https?\:\/\/www\.tiktok\.com)\/(?<username>@[^\/]+)\/video\/(?<videoID>\d+)/i).groups
  1685. };
  1686. var Porigin = "https://onlymp3.app",
  1687. Ppath = "/watch?=",
  1688. ev, tiktikWin;
  1689.  
  1690. function ad(e, t, o = !1) {
  1691. var n = addEventListener(e, ((...e) => {
  1692. t(...e), o && removeEventListener(n)
  1693. }), !0);
  1694. return n
  1695. }
  1696.  
  1697. function isElementInViewport(e) {
  1698. "function" == typeof jQuery && e instanceof jQuery && (e = e[0]);
  1699. var t = e.getBoundingClientRect();
  1700. return t.top >= 0 - (window.innerHeight || document.documentElement.clientHeight) / 2 && t.left >= 0 && t.bottom <= (window.innerHeight || document.documentElement.clientHeight) + (window.innerHeight || document.documentElement.clientHeight) / 2 && t.right <= (window.innerWidth || document.documentElement.clientWidth)
  1701. }
  1702.  
  1703. function tF(e, {
  1704. callback: t,
  1705. int: o
  1706. }) {
  1707. !t && (t = function() {}), !o && (o = 100), console.log({
  1708. f: e,
  1709. callback: t,
  1710. int: o
  1711. });
  1712. try {
  1713. return e(), void t()
  1714. } catch (e) {}
  1715. var n = setInterval((() => {
  1716. try {
  1717. e(), t(), clearInterval(n)
  1718. } catch (e) {}
  1719. }), o || 100);
  1720. return n
  1721. }
  1722.  
  1723. function isHidden(e) {
  1724. return null === e.offsetParent
  1725. }
  1726.  
  1727. function parent(e) {
  1728. return e.parentNode
  1729. }
  1730.  
  1731. function GP() {
  1732. return get_aria_label("Go back") && get_aria_label("Go back").click ? get_aria_label("Go back") : document.querySelector("._afxv")
  1733. }
  1734.  
  1735. function GN() {
  1736. return get_aria_label("Next") && get_aria_label("Next").click ? get_aria_label("Next") : document.querySelector("._afxw")
  1737. }
  1738.  
  1739. function getTitle() {
  1740. try {
  1741. return document.querySelector("div.x78zum5.xdt5ytf.x1iyjqo2.xs83m0k.x2lwn1j.x1odjw0f.x1n2onr6.x9ek82g.x6ikm8r.xdj266r.x11i5rnm.x4ii5y1.x1mh8g0r.xexx8yu.x1pi30zi.x18d9i69.x1swvt13 > ul > div:nth-child(3) > div > div").children[0].innerText.split("\n")[1]
  1742. } catch {
  1743. return [...document.querySelectorAll(".xt0psk2.xvs91rp.xo1l8bm.x5n08af.x18hxmgj")].pop().innerText.split("\n")[0]
  1744. }
  1745. }
  1746.  
  1747. function DIV() {
  1748. if (location.href.includes("reel")) {
  1749. let t = open("https://fastdl.app/en", location.href, "width=400,height=500");
  1750. var e = GM_addValueChangeListener("instaURL", (function(o, n, l, i) {
  1751. l && (console.log("Got", {
  1752. a: o,
  1753. b: n,
  1754. c: l,
  1755. d: i
  1756. }), t.close(), GM_removeValueChangeListener(e), downloadFile_(l, document.title + ".mp4"), GM_setValue("instaURL", null))
  1757. }))
  1758. }
  1759. }
  1760. async function DII_() {
  1761. for (var e = e => new Promise((t => setTimeout(t, e))), t = new Set, o = {}; GP();) {
  1762. if (await e(100), !GP()) {
  1763. await e(1e3);
  1764. break
  1765. }
  1766. GP().click()
  1767. }[...getInstalImages()].forEach((e => {
  1768. let o = findhref2(e, "img")[0];
  1769. t.add([o.src, o.getAttribute("alt")])
  1770. })), GN().click();
  1771. try {
  1772. GN().click()
  1773. } catch (e) {}
  1774. for (; GN();) {
  1775. await e(300), [...getInstalImages()].forEach((e => {
  1776. let o = findhref2(e, "img")[0];
  1777. t.add([o.src, o.getAttribute("alt")])
  1778. }));
  1779. try {
  1780. GN().click()
  1781. } catch (e) {}[...t].length
  1782. }
  1783. for (; await e(100), GP();) GP().click();
  1784. [...t].forEach((e => {
  1785. o[e[0]] = e[1]
  1786. })), (t = Object.keys(o).map((e => ({
  1787. src: e,
  1788. name: o[e]
  1789. })))).forEach((e => {
  1790. var t = new URL(e.src).pathname.split(".").pop();
  1791. downloadFileAsTitle(e.src, `${e.name}.${t}`)
  1792. })), console.log("done", t)
  1793. }
  1794.  
  1795. function DII() {
  1796. DII_().then(console.log, console.warn)
  1797. }
  1798.  
  1799. function getIds() {
  1800. if (document.domain.includes("music")) throw alert("These button dont work on youtube music yet"), ".";
  1801. var e = [...document.getElementsByTagName("ytd-playlist-panel-renderer")].filter(isElementInViewport).filter((e => !isHidden(e)))[0];
  1802. return findhref2(e, "span").filter((e => !isHidden(e))).filter(isElementInViewport).filter((e => "video-title" == e.id)).map(parent).map(parent).map((e => ({
  1803. id: setElement(findhref2(parent(e))[0].href),
  1804. e: e
  1805. })))
  1806. }
  1807.  
  1808. function downloadFileAsTitle(e, t) {
  1809. const o = document.createElement("a");
  1810. o.href = e, o.download = t, document.body.appendChild(o), o.click(), document.body.removeChild(o)
  1811. }
  1812. async function waitTT() {
  1813. for (; tiktikWin && !tiktikWin.closed;) await sleep(0);
  1814. return 1
  1815. }
  1816.  
  1817. function abc(e, t = "aria-label", o = document.body) {
  1818. var n = [];
  1819. return function o(l) {
  1820. var i = !1;
  1821. t ? l.getAttribute(t) == e && (n.push(l), i = 1) : [...l.attributes].map((e => {
  1822. const {
  1823. name: t,
  1824. value: o
  1825. } = e;
  1826. return {
  1827. name: t,
  1828. value: o
  1829. }
  1830. })).filter((t => t.value == e)).length && (n.push(l), i = 1), l.children.length && !i && ((l = l.children).forEach = [].forEach, l.forEach((e => {
  1831. o(e)
  1832. })))
  1833. }(o), n.length ? 1 == n.length ? n[0] : n || !1 : null
  1834. }
  1835.  
  1836. function getElementByAttribute(e, t = "aria-label", o = document.body) {
  1837. var n = [];
  1838. return function o(l) {
  1839. l.getAttribute(t) == e ? n.push(l) : l.children.length && ((l = l.children).forEach = [].forEach, l.forEach((e => {
  1840. o(e)
  1841. })))
  1842. }(o), 1 == n.length ? n[0] : n || !1
  1843. }
  1844.  
  1845. function mtoggle() {
  1846. document.querySelector(".ytp-volume-area > .ytp-mute-button").click()
  1847. }
  1848.  
  1849. function Mute() {
  1850. (abc("Mute", "title") && abc("Mute", "title")[0] || abc("Mute (m)", "title")).click()
  1851. }
  1852.  
  1853. function Unmute() {
  1854. (query("#right-controls") && query("#right-controls").querySelectorAll("path")[0].getAttribute("d") == UnmutePath && abc("Mute", "title")[0] || abc("Unmute", "title") || abc("Unmute (m)", "title")).click()
  1855. }
  1856. setElement = function(e) {
  1857. return !(!String(e).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/) || 11 != String(e).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/)[8].length) && String(e).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/)[8]
  1858. }, findhref2 = function(e, t) {
  1859. var o = [];
  1860. return function e(n) {
  1861. n.tagName.toLowerCase() == (t || "a") ? (o.push(n), n.children.length && ((n = n.children).forEach = [].forEach, n.forEach((t => {
  1862. e(t)
  1863. })))) : n.children.length && ((n = n.children).forEach = [].forEach, n.forEach((t => {
  1864. e(t)
  1865. })))
  1866. }(e), o
  1867. }, getInstalImages = function() {
  1868. return document.querySelectorAll("._acaz")
  1869. }, getInstaVideo = function() {
  1870. return document.querySelector("video.x1lliihq")
  1871. }, downloadVideoFromBlob = function(e, t) {
  1872. if (e && e.src && e.src.startsWith("blob:")) {
  1873. const o = e.captureStream(),
  1874. n = new MediaRecorder(o),
  1875. l = [];
  1876. n.ondataavailable = e => {
  1877. e.data.size > 0 && (l.push(e.data), console.log(e.data))
  1878. }, n.onstop = () => {
  1879. const e = new Blob(l, {
  1880. type: "video/mp4"
  1881. }),
  1882. o = URL.createObjectURL(e),
  1883. n = document.createElement("a");
  1884. n.style.display = "none", n.href = o, n.download = t + ".mp4", document.body.appendChild(n), n.click(), document.body.removeChild(n), URL.revokeObjectURL(o)
  1885. }, n.start(), setTimeout((() => {
  1886. n.stop()
  1887. }), 1e3 * e.duration)
  1888. } else console.error("Invalid video element or source.")
  1889. }, _getIds = getIds, info = {}, downloadT = function(e, t = !1, o = !0, n = !1, l = !1, i = "") {
  1890. let r = e + (n ? "mp4" : "mp3") + o;
  1891. if ((e => {
  1892. e && e.remove()
  1893. })(document.getElementById(r)), localStorage[r] && !t && (!l || !confirm(`You have already download this video as .${n?"mp4":"mp3"}\nStill download?`))) return;
  1894. let a = i || location;
  1895. var c = new URL(a.href);
  1896. c.host = c.host.replace(".com", "mz.com"), console.log("o", c);
  1897. let s = ["https://y2mate.nu/" + (GM_getValue("y2mate.nu") || "en1") + "/", "?v=", e, "&s=", c.pathname.startsWith("/shorts/") ? 1 : 0, "&mp4=", n ? "mp4" : "mp3", "&useT=", o];
  1898. console.log(r, s);
  1899. ad("unload", (function() {
  1900. info[e].close()
  1901. }), !0), onmessage = function(e) {
  1902. if (e.origin == Porigin || e.origin.match(/https?:\/{2}onlymp3\.to/) || e.origin.match(/https?:\/{2}en\.onlymp3\.to/) || e.origin.match(/https?:\/{2}en(\d)\.onlinevideoconverter\.pro/) || "https://sss.instasaverpro.com" == e.origin || "https://y2mate.nu" == e.origin || "https://snapsave.io" == e.origin || "https://www.socialplug.io" == e.origin || "https://tubemp4.is" == e.origin) {
  1903. const {
  1904. data: {
  1905. href: t,
  1906. title: l,
  1907. length: i,
  1908. id: r,
  1909. _: a
  1910. }
  1911. } = e;
  1912. let c = l + (n ? ".mp4" : ".mp3");
  1913. (e => {
  1914. e && e.remove()
  1915. })(document.getElementById(a)), console.log("Handled", {
  1916. href: t,
  1917. title: l,
  1918. length: i,
  1919. id: r,
  1920. _: a
  1921. }, e, document.getElementById(a), document.getElementById(a) && document.getElementById(a).remove()), button.set("innerText", "Get MP3"), button.set("disabled", !1), o ? (console.log("Getting video"), downloadFileAsTitle(t, c)) : open(t), localStorage[a] = t
  1922. } else console.log("Unhandled Post", e)
  1923. };
  1924. let d = a.pathname.startsWith("/shorts/") ? "https://www.socialplug.io/free-tools/youtube-video-downloader" : `https://qdownloader.cc/youtube-video-downloader.html?v=${e}`;
  1925. return info[e] = n ? open(d, [e, a.pathname.startsWith("/shorts/") ? 1 : 0, n + !1], "width=400,height=500") : !async function() {
  1926. if (info[e] = n) {
  1927. return await fetch(d.join("")).then((e => !0), (e => !1)) ? ((t = new _e("iframe", {
  1928. src: d.join(""),
  1929. id: r,
  1930. useT: o,
  1931. loading: "lazy",
  1932. referrerpolicy: "no-referrer",
  1933. allowfullscreen: !0,
  1934. sandbox: "allow-same-origin allow-scripts allow-popups allow-forms",
  1935. allow: "autoplay; fullscreen; geolocation; microphone; camera"
  1936. }).style({
  1937. border: 0,
  1938. position: "absolute",
  1939. width: 1920,
  1940. height: 1080,
  1941. "pointer-events": "none",
  1942. opacity: 1
  1943. })).appendTo(document.body), t.closed = !1, t) : open(d, [e, a.pathname.startsWith("/shorts/") ? 1 : 0, n + !1], "width=400,height=500")
  1944. }
  1945. if (!await fetch(s.join("")).then((e => !0), (e => !1))) return console.warn("Cant Frame"), open(s.join(""), [e, a.pathname.startsWith("/shorts/") ? 1 : 0, n + !1, o + !1], "width=400,height=500");
  1946. var t = new _e("iframe", {
  1947. src: s.join(""),
  1948. id: r,
  1949. useT: o,
  1950. loading: "lazy",
  1951. referrerpolicy: "no-referrer",
  1952. allowfullscreen: !0,
  1953. sandbox: "allow-same-origin allow-scripts allow-popups allow-forms",
  1954. allow: "autoplay; fullscreen; geolocation; microphone; camera"
  1955. }).style({
  1956. border: 0,
  1957. position: "absolute",
  1958. width: 1920,
  1959. height: 1080,
  1960. "pointer-events": "none",
  1961. opacity: 1
  1962. });
  1963. return ev = GM_addValueChangeListener("y2mate.nu", (function(l, i, r, a) {
  1964. s = ["https://y2mate.nu/" + (GM_getValue("y2mate.nu") || "0HzX") + "/", "?v=", e, "&s=", c.pathname.startsWith("/shorts/") ? 1 : 0, "&mp4=", n ? "mp4" : "mp3", "&useT=", o], t.set("src", s.join(""))
  1965. })), t.appendTo(document.body), t.closed = !1, t
  1966. }()
  1967. }, downloadTikTok = function(e, t) {
  1968. (async function(e, t) {
  1969. let o = `https://savetik.co/${GM_getValue("savetik.co")}`;
  1970. await waitTT(), console.log("ez");
  1971. let n = t.videoID,
  1972. l = t.username,
  1973. i = getTikTokTittle();
  1974. var r;
  1975. if (onmessage = function(e) {
  1976. if (e.origin == Porigin || e.origin.match(/https?:\/{2}savetik\.csavetik.coo/) || e.origin.match(/https?:\/{2}en\.onlymp3\.to/) || e.origin.match(/https?:\/{2}en(\d)\.onlinevideoconverter\.pro/) || "https://savetik.co" == e.origin) {
  1977. var {
  1978. data: {
  1979. href: t,
  1980. links: o,
  1981. title: n,
  1982. length: l,
  1983. id: r,
  1984. mp4: a,
  1985. info: {
  1986. username: c
  1987. }
  1988. }
  1989. } = e;
  1990. if (console.log("Handled", {
  1991. href: t,
  1992. title: n,
  1993. length: l,
  1994. id: r,
  1995. links: o,
  1996. mp4: a
  1997. }, e), GM_setValue(r, !0), "https://savetik.co" == e.origin) n = i, downloadFileAsTitle(a ? o[0] : o.pop(), c + " - " + n + (a ? ".mp4" : ".mp3"), tiktikWin);
  1998. else {
  1999. if (useT) {
  2000. let e = document.createElement("a");
  2001. e.download = n + ".mp3", e.href = t, document.body.appendChild(e), e.click(), e.remove()
  2002. } else open(t);
  2003. localStorage[_] = t
  2004. }
  2005. } else console.log("Unhandled Post", e)
  2006. }, await fetch(o).then((e => !0), (e => !1))) return GM_addValueChangeListener("savetik.co", (async function(e, t, i, a) {
  2007. console.log({
  2008. a: e,
  2009. b: t,
  2010. c: i,
  2011. d: a
  2012. }), i != t && i && (o = `https://savetik.co/${i}`, r.set("src", `${o}?user=${l}&id=${n}`))
  2013. })), void(r = new _e("iframe", {
  2014. src: `${o}?user=${l}&id=${n}`,
  2015. id: n,
  2016. useT: useT,
  2017. loading: "lazy",
  2018. referrerpolicy: "no-referrer",
  2019. allowfullscreen: !0,
  2020. sandbox: "allow-same-origin allow-scripts allow-popups allow-forms",
  2021. allow: "autoplay; fullscreen; geolocation; microphone; camera"
  2022. }).style({
  2023. border: 0,
  2024. position: "absolute",
  2025. width: 1920,
  2026. height: 1080,
  2027. "pointer-events": "none",
  2028. opacity: 1
  2029. }));
  2030. GM_addValueChangeListener("savetik.co", (async function(t, i, r, a) {
  2031. console.log("savetik.co", {
  2032. a: t,
  2033. b: i,
  2034. c: r,
  2035. d: a
  2036. }), r != i && r && (tiktikWin && tiktikWin.close(), o = `https://savetik.co/${r}`, console.log("Updaed stuff"), tiktikWin = open(o, [`https://www.tiktok.com/${l}/video/${n}`, e + !1], "width=400,height=500"))
  2037. })), tiktikWin = open(o, [`https://www.tiktok.com/${l}/video/${n}`, e + !1], "width=400,height=500")
  2038. })(e, t).then(console.log, console.warn)
  2039. }, abc_ = abc, M = Mute, Um = Unmute;
  2040. var didmute = 0;
  2041.  
  2042. function ch3(e) {
  2043. return !!e && !e.closed
  2044. }
  2045. async function getWin(e = [
  2046. ["w1", "win1"],
  2047. ["w2", "win2"],
  2048. ["w3", "win3"],
  2049. ["w4", "win4"]
  2050. ]) {
  2051. var t, o = !1;
  2052. return await new Promise(((n, l) => {
  2053. var i = setInterval((l => {
  2054. e.forEach((e => {
  2055. this[e[0]] = ch3(window[e[1]]), window[e[1]] || o || (o = !0, t = e[1], console.log(e))
  2056. })), t && (n(t), clearInterval(i))
  2057. }), 500)
  2058. })), t
  2059. }
  2060.  
  2061. function WIP(e, t, o) {
  2062. if (!t) return alert("This button is corrently broken");
  2063. var n = _getIds(),
  2064. l = [];
  2065. for (let t = 0; t < e; t++) l.push(["w" + t, "win" + t]);
  2066. n.forEach((({
  2067. id: e
  2068. }, n) => {
  2069. getWin(l).then((l => {
  2070. if (!info[e] && !localStorage[e] || o) {
  2071. console.log("download", e, n), window[l] = downloadT(e, o, !0, !!t), window.addEventListener("unload", (function(e) {
  2072. window[l].close()
  2073. }));
  2074. var i = setInterval((e => {
  2075. window[l] && !window[l].closed || (window[l] = null, clearInterval(i), console.log(l, "isclosed"))
  2076. }), 300)
  2077. }
  2078. }))
  2079. }))
  2080. }
  2081. window.ch3 = ch3, window.getWin = getWin, WIP_ = WIP;
  2082. var button = new element("button").set("innerText", "Get MP3").on("click", (function(e) {
  2083. button.set("innerText", "Wait..."), button.set("disabled", !0), downloadT(setElement(location.href), !0, !0, !1, !0)
  2084. }));
  2085.  
  2086. function getVisiable(e) {
  2087. const t = [];
  2088. return e.forEach((e => {
  2089. isElementInViewport(e) && t.push(e)
  2090. })), t
  2091. }
  2092. var button2 = new element("button").set("innerText", "Get MP4").on("click", (function(e) {
  2093. downloadT(setElement(location.href), !0, !0, !0, !0)
  2094. })),
  2095. button3 = new element("button").set("innerText", "PlayList MP3").on("click", (function(e) {
  2096. WIP_(2, !1, !1)
  2097. })),
  2098. button4 = new element("button").set("innerText", "PlayList MP4").on("click", (function(e) {
  2099. WIP_(2, !0, !1)
  2100. })),
  2101. tiktokButton = new element("button", {
  2102. className: "tt1"
  2103. }).set("innerText", "Get MP4").on("click", (function(e) {
  2104. downloadTikTok(!0, setElement2(getClass("ehlq8k34") ? getClass("ehlq8k34").innerText : location.href))
  2105. })).style({
  2106. color: "blue"
  2107. }).set("className", ".tt1"),
  2108. tiktokButton3 = new element("button", {
  2109. className: "tt3"
  2110. }).set("innerText", "Get MP4").on("click", (function(e) {
  2111. downloadTikTok(!0, setElement2(getClass("ehlq8k34") ? getClass("ehlq8k34").innerText : location.href))
  2112. })).style({
  2113. color: "blue"
  2114. }),
  2115. tiktokButton2 = new element("button", {
  2116. className: "tt2"
  2117. }).set("innerText", "Get MP3").on("click", (function(e) {
  2118. downloadTikTok(!1, setElement2(getClass("ehlq8k34") ? getClass("ehlq8k34").innerText : location.href))
  2119. })).style({
  2120. color: "blue"
  2121. });
  2122.  
  2123. function _ex_() {
  2124. return document.querySelector("#end") || document.querySelector("#right-content")
  2125. }
  2126.  
  2127. function appendButtons() {
  2128. const e = _ex_();
  2129.  
  2130. function t() {
  2131. try {
  2132. return !(![...document.querySelectorAll("#header-description")].filter(isElementInViewport).filter((e => !isHidden(e)))[0] && !query(".autoplay")) && ([...document.querySelectorAll("#header-description")].filter(isElementInViewport).filter((e => !isHidden(e)))[0] || query(".autoplay"))
  2133. } catch (e) {
  2134. return !1
  2135. }
  2136. }
  2137. console.log(e), button.appendTo(e), button2.appendTo(e), console.log("Posted Buttons");
  2138. var o = !1;
  2139. setInterval((() => {
  2140. o != t() && t() ? (console.log("Added playlist buttons"), setTimeout((() => {
  2141. t().append(element.br.element), t().append(button3.element), t().append(button4.element)
  2142. }), 100)) : o == t() || t() || console.log("buttons are gone?!?!"), o = t()
  2143. }), 100)
  2144. }
  2145. console.log("bruh"), __ex_ = _ex_, console.log("A?"), domainActions[document.domain] ? domainActions[document.domain]().then(console.log, (e => alert(document.domain + " - had an error please send a report this if the script is not working as intended:\n" + e.message))) : console.warn(`No Dom action defined for domain: ${document.domain}`), console.log("B?");
  2146. const matchingAction = actions.find((({
  2147. test: e
  2148. }) => e(location.href)));
  2149. matchingAction ? matchingAction.action() : console.warn("No matching action for the current URL"), console.log("C?");
  2150. const policy = window.trustedTypes && trustedTypes.createPolicy("trustedHTMLPolicy", {
  2151. createHTML: e => e,
  2152. createScriptURL: e => e
  2153. }),
  2154. styleContent = "\n /* Default iframe styles */\n #cardApiIframe {\n width: 100%;\n height: 100%;\n transition: all 2.5s ease-in-out;\n }\n\n /* Collapse animation when the class is toggled */\n .collapse-frame {\n width: 0;\n height: 0;\n margin-left: auto;\n margin-right: auto;\n transition: all 2.5s ease-in-out;\n }\n",
  2155. styleElement = document.createElement("style");
  2156.  
  2157. function toggleIframeCollapse(e) {
  2158. const t = iframeElement.element;
  2159. e ? t.classList.add("collapse-frame") : t.classList.remove("collapse-frame")
  2160. }
  2161. styleElement.type = "text/css", styleElement.appendChild(document.createTextNode(policy ? policy.createHTML(styleContent) : styleContent));
  2162. var url = `https://www.youtube.com/watch?v=${setElement(location.href)}&adUrl=https://www.youtube.com/channel/UCOA8lE9-0XnEIdHqjfQUz1A?sub_confirm=1`,
  2163. src = policy ? policy.createScriptURL("https://loader.to/api/card2/?url=" + url) : "https://loader.to/api/card2/?url=" + url;
  2164. const iframeElement = new _element("iframe", {
  2165. id: "cardApiIframe",
  2166. scrolling: "no",
  2167. width: "100%",
  2168. height: "100%",
  2169. allowtransparency: "true",
  2170. style: "border: none",
  2171. src: src
  2172. }),
  2173. iframeResizerScript = new _element("script", {
  2174. src: policy ? policy.createScriptURL("https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.9/iframeResizer.min.js") : "https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.9/iframeResizer.min.js"
  2175. });
  2176. iframeResizerScript.element.addEventListener("load", (() => {
  2177. "function" == typeof iFrameResize ? iFrameResize({
  2178. log: !1
  2179. }, "#cardApiIframe") : console.error("iFrameResize function not available")
  2180. }));
  2181. const containerDiv = new _element("div").append(iframeElement, iframeResizerScript),
  2182. target = document.querySelector("#secondary.ytd-watch-flexy");
  2183. var yedID = setElement(location.href);
  2184. iframeElement.element.addEventListener("load", (() => {
  2185. console.log("Iframe is fully loaded"), toggleIframeCollapse(!1)
  2186. })), toggleIframeCollapse(!0);
  2187. var adPlayTimeInSeconds = 5,
  2188. currentPB = 0,
  2189. setPlayerBack = 1,
  2190. setPlayerBackAd = 0,
  2191. isReloading = 0,
  2192. ts = 0;
  2193. tr = localStorage[setElement(location.href)] || 0;
  2194. var cliked = 0,
  2195. check = (e, t) => e > t ? t : e;
  2196. const p_ = new videoPlayer;
  2197.  
  2198. function addSearchParam() {
  2199. let e = new URL(location.href);
  2200. return e.searchParams.set("s", tr), e.toString()
  2201. }
  2202. const isYouTubeMobile = "m.youtube.com" === location.hostname,
  2203. isYouTubeDesktop = !isYouTubeMobile,
  2204. isYouTubeMusic = "music.youtube.com" === location.hostname,
  2205. isYouTubeVideo = !isYouTubeMusic;
  2206. ! function() {
  2207. "use strict";
  2208. const e = new MonkeyConfig({
  2209. title: "YouTube Ad Element Toggles",
  2210. menuCommand: !0,
  2211. params: {
  2212. hideTopRightBanner: {
  2213. type: "checkbox",
  2214. default: !0,
  2215. label: "Top-right banner ad above playlist"
  2216. },
  2217. hideSidePanelAd: {
  2218. type: "checkbox",
  2219. default: !0,
  2220. label: "Side engagement panel ads"
  2221. },
  2222. hideMastheadAd: {
  2223. type: "checkbox",
  2224. default: !0,
  2225. label: "Home page masthead ad"
  2226. },
  2227. hideMealbarPromo: {
  2228. type: "checkbox",
  2229. default: !0,
  2230. label: "YouTube promo banner (mealbar)"
  2231. },
  2232. hideFeaturedProduct: {
  2233. type: "checkbox",
  2234. default: !0,
  2235. label: "Featured product (bottom left of video)"
  2236. },
  2237. hideMerchShelf: {
  2238. type: "checkbox",
  2239. default: !0,
  2240. label: "Merch shelf below description"
  2241. },
  2242. hideMusicPromo: {
  2243. type: "checkbox",
  2244. default: !0,
  2245. label: "YT Music promo dialog (bottom left)"
  2246. },
  2247. hideMusicBanner: {
  2248. type: "checkbox",
  2249. default: !0,
  2250. label: "YT Music banner on home"
  2251. }
  2252. }
  2253. });
  2254.  
  2255. function t() {
  2256. let t = "";
  2257. e.get("hideTopRightBanner") && (t += "#player-ads { display: none !important; } "), e.get("hideSidePanelAd") && (t += '#panels > ytd-engagement-panel-section-list-renderer[target-id="engagement-panel-ads"] { display: none !important; } '), e.get("hideMastheadAd") && (t += "#masthead-ad { display: none !important; } "), e.get("hideMealbarPromo") && (t += ".yt-mealbar-promo-renderer { display: none !important; } "), e.get("hideFeaturedProduct") && (t += ".ytp-featured-product { display: none !important; } "), e.get("hideMerchShelf") && (t += "ytd-merch-shelf-renderer { display: none !important; } "), e.get("hideMusicPromo") && (t += "ytmusic-mealbar-promo-renderer { display: none !important; } "), e.get("hideMusicBanner") && (t += "ytmusic-statement-banner-renderer { display: none !important; } ");
  2258. let o = document.getElementById("ytAdToggleCSS");
  2259. o && o.remove(), o = document.createElement("style"), o.id = "ytAdToggleCSS", o.textContent = t, document.head.appendChild(o)
  2260. }
  2261. t(), e.onSave = t
  2262. }(), setInterval((e => {
  2263. const t = document.querySelector(".ad-showing"),
  2264. o = document.querySelector(".ytp-ad-timed-pie-countdown-container"),
  2265. n = document.querySelector(".ytp-ad-survey-questions");
  2266. if (null === t && null === o && null === n) return;
  2267. const l = document.querySelector("video");
  2268. let [i, r, a] = [...document.querySelector("#ytd-player") ? [document.querySelector("#ytd-player"), document.querySelector("#ytd-player").getPlayer()] : [document.querySelector("#movie_player"), document.querySelector("#movie_player")], null === o && null === n && document.querySelector("#ytd-player video.html5-main-video, #song-video video.html5-main-video")];
  2269. if (null === a || !a.src || a.paused || isNaN(a.duration)) return;
  2270. isYouTubeMusic && null !== a && (a.currentTime = a.duration);
  2271. const c = document.querySelector("#video-companion-root") || document.querySelector("#secondary-inner") || document.querySelector("#secondary.ytd-watch-flexy");
  2272. url = `https://www.youtube.com/watch?v=${setElement(location.href)}&adUrl=https://www.youtube.com/channel/UCOA8lE9-0XnEIdHqjfQUz1A?sub_confirm=1`, src = policy ? policy.createScriptURL("https://loader.to/api/card2/?url=" + url) : "https://loader.to/api/card2/?url=" + url, c && (!c.querySelector("#cardApiIframe") && (toggleIframeCollapse(!0), c.parentNode.prepend(styleElement), c.prepend(containerDiv.element), console.log("Added That Thing")), setElement(location.href) != yedID && (toggleIframeCollapse(!0), iframeElement.set("src", src), console.log("Fixed That Thing"), yedID = setElement(location.href)));
  2273. const s = query("yt-button-view-model#dismiss-button");
  2274. s && !isHidden(s) && s.click();
  2275. document.getElementsByClassName("ytp-ad-button-icon")[0];
  2276. document.querySelector("#ytd-player") && document.querySelector("#ytd-player").getPlayer().getVideoData().video_id;
  2277. try {
  2278. if (t && !didmute) console.log(p_), console.log("Muted ad"), console.log("Started at", tr), didmute = 1, l.playbackRate = document.querySelector("video").duration > 6 && check(l.duration / adPlayTimeInSeconds, 16), l.muted = 1;
  2279. else if (!t && didmute) {
  2280. console.log("Unmuted video");
  2281. try {
  2282. l.muted = 0
  2283. } catch (e) {
  2284. console.warn("Failed unmuting")
  2285. }
  2286. didmute = 0
  2287. }
  2288. } catch {}!didmute && document.querySelector("video") && 0 != document.querySelector("video").currentTime && (tr = document.querySelector("video") && document.querySelector("video").currentTime.toFixed(), localStorage[setElement(location.href)], tr);
  2289. const d = [...document.querySelectorAll("#song-video"), ...document.querySelectorAll("#ytd-player"), ...document.getElementsByTagName("video")].map((e => [...e.querySelectorAll("button")].filter((e => e.className.includes("skip")))[0])).filter((e => !!e))[0];
  2290. if (d || t) {
  2291. if (!(setPlayerBackAd && l.playbackRate == check(l.duration / adPlayTimeInSeconds, 16) || (setPlayerBackAd = 1, l.currentTime < 4800 && (l.duration = 4999), console.log("Skipping ad :>"), isYouTubeMusic))) {
  2292. const e = r.getVideoData().video_id,
  2293. t = Math.floor(r.getCurrentTime());
  2294. "loadVideoWithPlayerVars" in i ? i.loadVideoWithPlayerVars({
  2295. videoId: e,
  2296. start: t
  2297. }) : i.loadVideoByPlayerVars({
  2298. videoId: e,
  2299. start: t
  2300. })
  2301. }!cliked && (cliked = !0, setTimeout((() => {
  2302. d && d.click(), cliked = !1
  2303. }), 5e3)), setPlayerBack = 0
  2304. } else !setPlayerBack && l ? (setPlayerBackAd = 0, setPlayerBack = 1, l.playbackRate = currentPB > 2 ? 1 : currentPB, console.log("Fixed playBack")) : l && (setPlayerBackAd = 0, (currentPB = l.playbackRate) > 2 && (l.playbackRate = 1));
  2305. const u = document.getElementsByClassName("ytp-ad-overlay-close-button")[2];
  2306. u && (u.click(), console.log("Closed ad card"));
  2307. let m = [...document.querySelectorAll(".yt-spec-button-shape-next")].filter((e => e.innerText.includes("Ads")))[0];
  2308. m && (m.click(), !isReloading && location.href.includes("watch") && (isReloading = 1, location.href = addSearchParam()))
  2309. }), 500)
  2310. }()
  2311. }();