隐私重定向器

将社交媒体平台重定向到其隐私友好的首页

目前为 2024-12-23 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Privacy Redirector
  3. // @name:bg Пренасочване на поверителността
  4. // @name:br Rediretor de privacidade
  5. // @name:cs Přesměrování soukromí
  6. // @name:de Datenschutz Umleiter
  7. // @name:da Omdirigeringsenhed for privatlivets fred
  8. // @name:et Privaatsuse ümbersuunaja
  9. // @name:es Redirección de privacidad
  10. // @name:fi Yksityisyydensuojan uudelleenohjaus
  11. // @name:fr Redirecteur de confidentialité
  12. // @name:el Επανακατευθυντής απορρήτου
  13. // @name:hu Adatvédelmi átirányító
  14. // @name:id Pengarah Privasi
  15. // @name:it Reindirizzatore di privacy
  16. // @name:ja プライバシーリダイレクト
  17. // @name:lt Privatumo nukreipiklis
  18. // @name:lv Konfidencialitātes pāradresētājs
  19. // @name:nl Privacy-omleiding
  20. // @name:pl Przekierownik prywatności
  21. // @name:pt Redirector de Privacidade
  22. // @name:ro Redirector de confidențialitate
  23. // @name:ru Перенаправление конфиденциальности
  24. // @name:sv Omdirigering av sekretess
  25. // @name:sl Preusmerjevalnik zasebnosti
  26. // @name:sk Presmerovanie súkromia
  27. // @name:tr Gizlilik Yönlendiricisi
  28. // @name:uk Редиректор конфіденційності
  29. // @name:zh 隐私重定向器
  30. // @name:zh-CN 隐私重定向器
  31. // @description Redirect social media platforms to their privacy respecting frontends
  32. // @description:bg Пренасочване на платформите за социални медии към заглавните им страници, съобразени с поверителността
  33. // @description:br Redirecionando as plataformas de mídia social para suas primeiras páginas de privacidade
  34. // @description:cs Přesměrování platforem sociálních médií na jejich titulní stránky šetrné k soukromí
  35. // @description:de Leitet von Social-Media-Plattformen auf deren jeweilige datenschutzfreundlicheren Frontends
  36. // @description:da Omdirigering af sociale medieplatforme til deres privatlivsvenlige forsider
  37. // @description:et Sotsiaalmeediaplatvormide ümbersuunamine nende privaatsussõbralikele esilehtedele
  38. // @description:es Redirigir las plataformas de medios sociales a sus portadas respetuosas con la privacidad
  39. // @description:fi Sosiaalisen median alustojen ohjaaminen yksityisyyden suojaa edistäville etusivuille.
  40. // @description:fr Rediriger les plateformes de médias sociaux vers leurs pages d'accueil respectueuses de la vie privée
  41. // @description:el Αναπροσανατολισμός των πλατφορμών κοινωνικής δικτύωσης στις μπροστινές σελίδες τους που είναι φιλικές προς το απόρρητο
  42. // @description:hu A közösségi médiaplatformok átirányítása az adatvédelem-barát kezdőlapokra
  43. // @description:id Mengarahkan platform media sosial ke halaman depan yang ramah privasi
  44. // @description:it Reindirizzare le piattaforme di social media verso le loro pagine frontali che rispettano la privacy
  45. // @description:ja ソーシャルメディアプラットフォームをプライバシーに配慮したフロントページにリダイレクトする
  46. // @description:lt Socialinės žiniasklaidos platformų nukreipimas į privatumą užtikrinančius pirmuosius puslapius
  47. // @description:lv Sociālo plašsaziņas līdzekļu platformu pāradresēšana uz to privātumam draudzīgajām pirmajām lapām.
  48. // @description:nl Sociale-mediaplatforms omleiden naar hun privacyvriendelijke voorpagina's
  49. // @description:pl Przekierowanie platform mediów społecznościowych na ich przyjazne dla prywatności strony tytułowe
  50. // @description:pt Redireccionar as plataformas de redes sociais para as suas primeiras páginas amigas da privacidade
  51. // @description:ro Redirecționarea platformelor de socializare către paginile lor de început care respectă viața privată
  52. // @description:ru Перенаправление платформ социальных сетей на их главные страницы, дружественные к конфиденциальности
  53. // @description:sv Omdirigera sociala medieplattformar till deras integritetsvänliga förstasidor.
  54. // @description:sl preusmeritev platform družabnih medijev na njihove naslovne strani, ki so prijazne do zasebnosti.
  55. // @description:sk Presmerovanie platforiem sociálnych médií na ich úvodné stránky, ktoré chránia súkromie
  56. // @description:tr Sosyal medya platformlarını, gizliliğe saygı duyan önyüzlerine yönlendirir
  57. // @description:uk Перенаправлення соціальних медіа-платформ на їхні головні сторінки, дружні до приватності
  58. // @description:zh 将社交媒体平台重定向到其隐私友好的首页
  59. // @description:zh-CN 将社交媒体平台重定向到其隐私友好的首页
  60. // @namespace https://github.com/dybdeskarphet/privacy-redirector
  61. // @author Ahmet Arda Kavakcı
  62. // @license GPLv3
  63. // @version 1.6.0
  64. // @downloadURL
  65. // https://raw.githubusercontent.com/dybdeskarphet/privacy-redirector/main/privacy-redirector.user.js
  66. // @supportURL https://github.com/dybdeskarphet/privacy-redirector
  67. // @updateURL
  68. // https://raw.githubusercontent.com/dybdeskarphet/privacy-redirector/main/privacy-redirector.user.js
  69. // @run-at document-start
  70. // @match *://*.bandcamp.com/*
  71. // @match *://*.fandom.com/*
  72. // @match *://*.genius.com/*
  73. // @match *://*.google.com/*
  74. // @match *://*.imdb.com/*
  75. // @match *://*.imgur.com/*
  76. // @match *://*.imgur.io/*
  77. // @match *://*.instagram.com/*
  78. // @match *://*.medium.com/*
  79. // @match *://*.pinterest.com/*
  80. // @match *://*.quora.com/*
  81. // @match *://*.reddit.com/*
  82. // @match *://*.reuters.com/*
  83. // @match *://*.soundcloud.com/*
  84. // @match *://*.tiktok.com/*
  85. // @match *://*.twitch.tv/*
  86. // @match *://*.deepl.com/*
  87. // @match *://*.deviantart.com/*
  88. // @match *://twitch.tv/*
  89. // @match *://*.twitter.com/*
  90. // @match *://*.x.com/*
  91. // @match *://*.tumblr.com/*
  92. // @match *://x.com/*
  93. // @match *://*.wikipedia.org/*
  94. // @match *://*.youtube-nocookie.com/*
  95. // @match *://*.youtube.com/*
  96. // @match *://f4.bcbits.com/*
  97. // @match *://genius.com/*
  98. // @match *://i.pinimg.com/*
  99. // @match *://imgur.com/*
  100. // @match *://instagram.com/*
  101. // @match *://medium.com/*
  102. // @match *://news.ycombinator.com/*
  103. // @match *://reddit.com/*
  104. // @match *://stackoverflow.com/*
  105. // @match *://t4.bcbits.com/*
  106. // @match *://translate.google.com/*
  107. // @match *://twitter.com/*
  108. // @match *://www.goodreads.com/*
  109. // @match *://www.pixiv.net/*
  110. // @match *://youtube.com/*
  111. // @exclude *://*.youtube.com/redirect*
  112. // @exclude *://youtube.com/redirect*
  113. // ==/UserScript==
  114.  
  115. /*
  116. ___ _ _ ___ _____ _____
  117. / _ \| \ | | / _ \| ___| ___|
  118. | | | | \| |_____| | | | |_ | |_
  119. | |_| | |\ |_____| |_| | _| | _|
  120. \___/|_| \_| \___/|_| |_|
  121.  
  122. CHANGE THE RELEVANT VALUE TO "false" TO
  123. DISABLE THE REDIRECTION/FARSIDE FOR THAT
  124. PARTICULAR PLATFORM */
  125.  
  126. // REDIRECTON / FARSIDE
  127.  
  128. let bandcamp = [true, true];
  129. let deepl = [false, true]; // Mozhi Deepl engine doesn't work
  130. let deviantart = [true, false];
  131. let fandom = [true, true];
  132. let genius = [true, true];
  133. let goodreads = [true, false];
  134. let google = [true, true];
  135. let gtranslate = [true, true];
  136. let hackernews = [true, true];
  137. let imdb = [true, true];
  138. let imgur = [true, false];
  139. let instagram = [true, true];
  140. let medium = [true, true];
  141. let pinterest = [true, true];
  142. let pixiv = [true, true];
  143. let quora = [true, false];
  144. let reddit = [true, false];
  145. let reuters = [true, true];
  146. let soundcloud = [true, true];
  147. let stackoverflow = [true, true];
  148. let tiktok = [true, false];
  149. let tumblr = [true, false];
  150. let twitch = [true, true];
  151. let twitter = [true, true];
  152. let wikipedia = [true, false];
  153. let youtube = [true, false];
  154.  
  155. // PREFERRED FRONTEND
  156. let youtubeFrontend = "piped"; // accepts "invidious", "piped", "tubo"
  157. let youtubeMusicFrontend = "hyperpipe"; // accepts "hyperpipe", "invidious", "piped"
  158. let redditFrontend = "libreddit"; // accepts "libreddit", "teddit"
  159. let googleFrontend = "librey"; // accepts "librey", "searx", "searxng"
  160. let googleTranslateFrontend = "mozhi"; // accepts "lingva" (farside available), "mozhi" (no farside)
  161. let geniusFrontend = "intellectual"; // accepts dumb, intellectual
  162. let mediumFrontend = "scribe"; // accepts libmedium, scribe, mediumrip
  163. let hackernewsFrontend = "better"; // accepts better, worker
  164.  
  165. // OTHER SETTINGS
  166. let keepHistory = false; // keeps farside.link in the browser history
  167.  
  168. // // // // // // // // // // // // //
  169.  
  170. /*
  171. ___ _
  172. |_ _|_ __ ___| |_ __ _ _ __ ___ ___ ___
  173. | || '_ \/ __| __/ _` | '_ \ / __/ _ \/ __|
  174. | || | | \__ \ || (_| | | | | (_| __/\__ \
  175. |___|_| |_|___/\__\__,_|_| |_|\___\___||___/
  176.  
  177. LIST OF INSTANCES TO USE IF FARSIDE IS NOT ENABLED
  178. */
  179.  
  180. const Instances = {
  181. anonymousoverflow: [
  182. "code.whatever.social",
  183. "ao.vern.cc",
  184. "overflow.smnz.de",
  185. "overflow.lunar.icu",
  186. "overflow.adminforge.de",
  187. "overflow.projectsegfau.lt",
  188. "ao.bloat.cat",
  189. "anonoverflow.frontendfriendly.xyz",
  190. "ao.owo.si",
  191. "overflow.freedit.eu",
  192. "ao.rootdo.org",
  193. "a.opnxng.com",
  194. "overflow.sudovanilla.com",
  195. "exchange.seitan-ayoub.lol",
  196. "overflow.r4fo.com",
  197. ],
  198. hyperpipe: [
  199. "hyperpipe.surge.sh",
  200. "hyperpipe.onrender.com",
  201. "music.adminforge.de",
  202. "music.pfcd.me",
  203. "hyperpipe.projectsegfau.lt",
  204. "hp.ggtyler.dev",
  205. "hyperpipe.lunar.icu",
  206. "music.seitan-ayoub.lol",
  207. ],
  208. proxigram: [
  209. "proxigram.protokolla.fi",
  210. "proxigram.kyun.li",
  211. "proxigram.lunar.icu",
  212. "ig.opnxng.com",
  213. ],
  214. biblioreads: [
  215. "biblioreads.eu.org",
  216. "biblioreads.vercel.app",
  217. "biblioreads.mooo.com",
  218. "bl.vern.cc",
  219. "biblioreads.lunar.icu",
  220. "read.seitan-ayoub.lol",
  221. ],
  222. binternet: [
  223. "binternet.ahwx.org",
  224. "bn.bloat.cat",
  225. "bn.opnxng.com",
  226. "bn.vern.cc",
  227. ],
  228. breezewiki: [
  229. "breezewiki.com",
  230. "antifandom.com",
  231. "breezewiki.pussthecat.org",
  232. "bw.hamstro.dev",
  233. "bw.projectsegfau.lt",
  234. "breeze.hostux.net",
  235. "bw.artemislena.eu",
  236. "nerd.whatever.social",
  237. "breezewiki.frontendfriendly.xyz",
  238. "breeze.nohost.network",
  239. "z.opnxng.com",
  240. "breezewiki.catsarch.com",
  241. "breeze.mint.lgbt",
  242. "breezewiki.woodland.cafe",
  243. "breezewiki.lunar.icu",
  244. "fandom.adminforge.de",
  245. ],
  246. dumb: [
  247. "dumb.privacydev.net",
  248. "db.vern.cc",
  249. "sing.whatever.social",
  250. "dumb.lunar.icu",
  251. ],
  252. intellectual: [
  253. "intellectual.insprill.net",
  254. "in.bloat.cat",
  255. "intellectual.frontendfriendly.xyz",
  256. ],
  257. invidious: [
  258. "yewtu.be",
  259. "vid.puffyan.us",
  260. "yt.artemislena.eu",
  261. "invidious.flokinet.to",
  262. "invidious.projectsegfau.lt",
  263. "invidious.privacydev.net",
  264. "iv.ggtyler.dev",
  265. "invidious.lunar.icu",
  266. "inv.tux.pizza",
  267. "invidious.protokolla.fi",
  268. "proxied.invidious.fi",
  269. "onion.tube",
  270. "invidious.no-logs.com",
  271. "invidious.io.lol",
  272. "iv.nboeck.de",
  273. "invidious.private.coffee",
  274. "invidious.asir.dev",
  275. "iv.datura.network",
  276. "invidious.fdn.fr",
  277. "invidious.perennialte.ch",
  278. "yt.cdaut.de",
  279. "invidious.einfachzocken.eu",
  280. "yt.drgnz.club",
  281. ],
  282. piped: [
  283. "piped.video",
  284. "cf.piped.video",
  285. "fl.piped.video",
  286. "do.piped.video",
  287. "az.piped.video",
  288. "piped.mha.fi",
  289. "watch.leptons.xyz",
  290. "piped.lunar.icu",
  291. "piped.r4fo.com",
  292. "piped.privacydev.net",
  293. "piped.smnz.de",
  294. "piped.adminforge.de",
  295. "piped.astartes.nl",
  296. "piped.osphost.fi",
  297. "pi.ggtyler.dev",
  298. "piped.seitan-ayoub.lol",
  299. "yt.owo.si",
  300. "piped.minionflo.net",
  301. ],
  302. libmedium: [
  303. "libmedium.batsense.net",
  304. "md.vern.cc",
  305. "medium.hostux.net",
  306. "read.sudovanilla.com",
  307. "libmedium.frontendfriendly.xyz",
  308. ],
  309. libreddit: [
  310. "redditor.fly.dev",
  311. "libreddit.kavin.rocks",
  312. "libreddit.strongthany.cc",
  313. "libreddit.northboot.xyz",
  314. "libreddit.kylrth.com",
  315. "libreddit.tiekoetter.com",
  316. "l.opnxng.com",
  317. "libreddit.projectsegfau.lt",
  318. "libreddit.privacydev.net",
  319. "libreddit.frontendfriendly.xyz",
  320. "libreddit.freedit.eu",
  321. "libreddit.mha.fi",
  322. "lr.artemislena.eu",
  323. "libreddit.nohost.network",
  324. "lr.aeong.one",
  325. "libreddit.lunar.icu",
  326. "snoo.habedieeh.re",
  327. "libreddit.tux.pizza",
  328. "libreddit.perennialte.ch",
  329. "libreddit.private.coffee",
  330. "lr.seitan-ayoub.lol",
  331. "l.bloat.cat",
  332. ],
  333. libremdb: [
  334. "libremdb.iket.me",
  335. "libremdb.pussthecat.org",
  336. "ld.vern.cc",
  337. "binge.whatever.social",
  338. "libremdb.lunar.icu",
  339. "libremdb.jeikobu.net",
  340. "libremdb.nerdyfam.tech",
  341. "libremdb.tux.pizza",
  342. "libremdb.frontendfriendly.xyz",
  343. "d.opnxng.com",
  344. "libremdb.catsarch.com",
  345. ],
  346. librey: [
  347. "search.ahwx.org",
  348. "ly.owo.si",
  349. "librey.danyaal.xyz",
  350. "librey.org",
  351. "search.davidovski.xyz",
  352. "search.funami.tech",
  353. "librex.nohost.network",
  354. "search.pabloferreiro.es",
  355. "librey.baczek.me",
  356. "search.seitan-ayoub.lol",
  357. ],
  358. lingva: [
  359. "lingva.ml",
  360. "lingva.thedaviddelta.com",
  361. "lingva.frontendfriendly.xyz",
  362. "lingva.retiolus.net",
  363. "translate.plausibility.cloud",
  364. "lingva.lunar.icu",
  365. "lingva.garudalinux.org",
  366. "lingva.seitan-ayoub.lol",
  367. ],
  368. mediumrip: ["medium.rip"],
  369. neuters: ["neuters.de", "nu.vern.cc"],
  370. nitter: [
  371. "nitter.net",
  372. "nitter.unixfox.eu",
  373. "nitter.poast.org",
  374. "nitter.privacydev.net",
  375. "nitter.projectsegfau.lt",
  376. "nitter.soopy.moe",
  377. "nitter.rawbit.ninja",
  378. "nitter.freedit.eu",
  379. "nitter.nohost.network",
  380. "nitter.no-logs.com",
  381. "nitter.io.lol",
  382. "nitter.woodland.cafe",
  383. "nitter.perennialte.ch",
  384. "nitter.salastil.com",
  385. "n.opnxng.com",
  386. "nitter.ktachibana.party",
  387. ],
  388. pixivfe: [
  389. "pixivfe.drgns.space",
  390. "pixivfe.ducks.party",
  391. "pixiv.perennialte.ch",
  392. ],
  393. proxitok: [
  394. "proxitok.pabloferreiro.es",
  395. "proxitok.pussthecat.org",
  396. "tok.habedieeh.re",
  397. "proxitok.privacydev.net",
  398. "tok.artemislena.eu",
  399. "tok.adminforge.de",
  400. "cringe.whatever.social",
  401. "proxitok.lunar.icu",
  402. "proxitok.privacy.com.de",
  403. "proxitok.r4fo.com",
  404. "cringe.seitan-ayoub.lol",
  405. "tt.opnxng.com",
  406. "tiktok.wpme.pl",
  407. ],
  408. quetre: [
  409. "quetre.iket.me",
  410. "qr.vern.cc",
  411. "quetre.pussthecat.org",
  412. "quetre.privacydev.net",
  413. "ask.habedieeh.re",
  414. "quetre.blackdrgn.nl",
  415. "quetre.lunar.icu",
  416. "quetre.frontendfriendly.xyz",
  417. "q.opnxng.com",
  418. "quetre.rootdo.org",
  419. "quora.seitan-ayoub.lol",
  420. "ask.sudovanilla.org",
  421. "quetre.smnz.de",
  422. ],
  423. rimgo: [
  424. "rimgo.totaldarkness.net",
  425. "imgur.artemislena.eu",
  426. "rimgo.lunar.icu",
  427. "imgur.010032.xyz",
  428. "rimgo.kling.gg",
  429. "rimgo.projectsegfau.lt",
  430. "rimgo.nohost.network",
  431. "rimgo.catsarch.com",
  432. "rimgo.quantenzitrone.eu",
  433. ],
  434. scribe: [
  435. "scribe.rip",
  436. "scribe.citizen4.eu",
  437. "scribe.bus-hit.me",
  438. "scribe.projectsegfau.lt",
  439. "scribe.rawbit.ninja",
  440. "m.opnxng.com",
  441. ],
  442. teddit: [
  443. "i.opnxng.com",
  444. "teddit.net",
  445. "teddit.rawbit.ninja",
  446. "teddit.pussthecat.org",
  447. "teddit.zaggy.nl",
  448. "t.sneed.network",
  449. "td.vern.cc",
  450. ],
  451. tent: ["tent.sny.sh", "tent.bloat.cat", "tn.vern.cc"],
  452. tubo: ["tubo.media", "tubo.reallyaweso.me", "tubo.ducks.party"],
  453. wikiless: [
  454. "wikiless.tiekoetter.com",
  455. "wikiless.funami.tech",
  456. "wl.vern.cc",
  457. "wiki.froth.zone",
  458. "wikiless.northboot.xyz",
  459. "wikiless.rawbit.ninja",
  460. "wiki.adminforge.de",
  461. "wikiless.rootdo.org",
  462. "w.sneed.network",
  463. "wikiless.r4fo.com",
  464. "wiki.seitan-ayoub.lol",
  465. "wikiless.ditatompel.com",
  466. ],
  467. safetwitch: [
  468. "safetwitch.drgns.space",
  469. "safetwitch.projectsegfau.lt",
  470. "safetwitch.datura.network",
  471. "ttv.vern.cc",
  472. "safetwitch.frontendfriendly.xyz",
  473. "twitch.seitan-ayoub.lol",
  474. "st.ggtyler.dev",
  475. "safetwitch.lunar.icu",
  476. "twitch.sudovanilla.com",
  477. "safetwitch.r4fo.com",
  478. "safetwitch.ducks.party",
  479. "safetwitch.nogafam.fr",
  480. "safetwitch.privacyredirect.com",
  481. ],
  482. searx: [
  483. "search.bus-hit.me",
  484. "search.projectsegfau.lt",
  485. "northboot.xyz",
  486. "opnxng.com",
  487. ],
  488. searxng: [
  489. "search.sapti.me",
  490. "priv.au",
  491. "search.demoniak.ch",
  492. "www.gruble.de",
  493. "searx.divided-by-zero.eu",
  494. "xo.wtf",
  495. "freesearch.club",
  496. "baresearch.org",
  497. "searx.perennialte.ch",
  498. "searx.techsaviours.org",
  499. "search.mdosch.de",
  500. "searx.si",
  501. "searx.namejeff.xyz",
  502. "search.ononoki.org",
  503. "etsi.me",
  504. "searx.work",
  505. "search.smnz.de",
  506. "searx.prvcy.eu",
  507. "searx.headpat.exchange",
  508. ],
  509. hackernews: {
  510. better: "better-hackernews.vercel.app",
  511. worker: "news.workers.tools",
  512. },
  513. mozhi: [
  514. "mozhi.aryak.me",
  515. "translate.bus-hit.me",
  516. "nyc1.mz.ggtyler.dev",
  517. "translate.projectsegfau.lt",
  518. "translate.nerdvpn.de",
  519. "mozhi.ducks.party",
  520. "mozhi.frontendfriendly.xyz",
  521. "mozhi.pussthecat.org",
  522. "mozhi.adminforge.de",
  523. "translate.privacyredirect.com",
  524. "mozhi.canine.tools",
  525. "mozhi.gitro.xyz",
  526. ],
  527. skunkyart: ["art.bloat.cat"],
  528. priviblur: [
  529. "pb.bloat.cat",
  530. "tb.opnxng.com",
  531. "priviblur.pussthecat.org",
  532. "priviblur.thebunny.zone",
  533. "priviblur.gitro.xyz",
  534. "priviblur.canine.tools",
  535. ],
  536. };
  537.  
  538. let farsideInstance = keepHistory ? "farside.link/_" : "farside.link";
  539.  
  540. // // // // // // // // // // // // //
  541.  
  542. const hash = window.location.hash,
  543. scheme = `${window.location.protocol}//`;
  544.  
  545. let debug_mode = false;
  546.  
  547. if (debug_mode) {
  548. alert(
  549. "\n== DEBUG MODE IS ON ==" +
  550. "\nIf you're seeing this" +
  551. "\nset the debug_mode value to" +
  552. "\nfalse for Privacy Redirector." +
  553. "\n======================" +
  554. "\n\nHostname: " +
  555. window.location.hostname +
  556. "\nPath: " +
  557. window.location.pathname +
  558. "\nQuery: " +
  559. window.location.search +
  560. "\nHash: " +
  561. hash,
  562. );
  563. }
  564.  
  565. let selectedInstance = "",
  566. newURL = "";
  567.  
  568. const getrandom = async (instances) =>
  569. instances[Math.floor(Math.random() * instances.length)];
  570.  
  571. async function redirectInstagram() {
  572. if (instagram[0]) {
  573. window.stop();
  574. let pathname = window.location.pathname;
  575. let search = window.location.search;
  576. let params = new URLSearchParams(search);
  577.  
  578. selectedInstance = await getrandom(Instances.proxigram);
  579.  
  580. switch (true) {
  581. case pathname.startsWith("/accounts/login/"):
  582. case pathname.startsWith("/accounts/signup/"):
  583. pathname = pathname.replace(/^\/accounts\/(login|signup)\/[a-z]*/, "");
  584. params.delete("next");
  585. search = params.size ? `?${params}` : "";
  586. break;
  587. case pathname.startsWith("/reel/"):
  588. case pathname.startsWith("/tv/"):
  589. pathname = pathname.replace(/^\/(reel|tv)\//, "/p/");
  590. break;
  591. case pathname.endsWith("/reels/"):
  592. pathname = pathname.replace("/reels", "");
  593. break;
  594. }
  595. newURL = `${scheme}${selectedInstance}${pathname}${search}${hash}`;
  596. window.location.replace(newURL);
  597. }
  598. }
  599.  
  600. async function redirectTwitter() {
  601. if (twitter[0]) {
  602. window.stop();
  603.  
  604. const pathname = window.location.pathname;
  605. let searchpath = `${pathname}${window.location.search}`;
  606.  
  607. selectedInstance = twitter[1]
  608. ? `${farsideInstance}/nitter`
  609. : await getrandom(Instances.nitter);
  610.  
  611. if (pathname === "/i/flow/login")
  612. searchpath = searchpath.replace(
  613. "/i/flow/login?redirect_after_login=",
  614. "",
  615. );
  616.  
  617. if (searchpath.includes("%")) searchpath = decodeURIComponent(searchpath);
  618.  
  619. newURL = `${scheme}${selectedInstance}${searchpath}${hash}`;
  620. window.location.replace(newURL);
  621. }
  622. }
  623.  
  624. async function redirectReddit() {
  625. if (reddit[0] && !window.location.pathname.startsWith("/domain")) {
  626. window.stop();
  627. let pathname = window.location.pathname;
  628. let search = window.location.search;
  629.  
  630. selectedInstance = reddit[1]
  631. ? `${farsideInstance}/${redditFrontend}`
  632. : await getrandom(Instances[redditFrontend]);
  633.  
  634. if (pathname === "/media" && search) {
  635. const params = new URLSearchParams(search);
  636. const mediaURL = new URL(params.get("url"));
  637. if (["i.redd.it", "preview.redd.it"].includes(mediaURL.hostname)) {
  638. pathname = `/img${mediaURL.pathname}`;
  639. search = mediaURL.search;
  640. }
  641. }
  642. newURL = `${scheme}${selectedInstance}${pathname}${search}${hash}`;
  643.  
  644. window.location.replace(newURL);
  645. }
  646. }
  647.  
  648. async function redirectYoutube(frontend) {
  649. if (youtube[0]) {
  650. window.stop();
  651. let searchpath = `${window.location.pathname}${window.location.search}`;
  652. if (window.location.pathname.startsWith("/embed")) {
  653. selectedInstance = youtube[1]
  654. ? `${farsideInstance}/invidious`
  655. : await getrandom(Instances["invidious"]);
  656. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  657. window.location.search
  658. }${hash}`;
  659. window.location.replace(newURL);
  660. } else {
  661. if (frontend !== "tubo") {
  662. selectedInstance =
  663. youtube[1] && frontend !== "hyperpipe"
  664. ? `${farsideInstance}/${frontend}`
  665. : await getrandom(Instances[frontend]);
  666. } else {
  667. selectedInstance = await getrandom(Instances.tubo);
  668.  
  669. searchpath = `/stream?url=${window.location.href}`;
  670. if (
  671. window.location.pathname.startsWith("/@") ||
  672. window.location.pathname.startsWith("/channel")
  673. )
  674. searchpath = `/channel?url=${window.location.href}`;
  675. }
  676. newURL = `${scheme}${selectedInstance}${searchpath}${hash}`;
  677. window.location.replace(newURL);
  678. }
  679. }
  680. }
  681.  
  682. async function redirectTiktok() {
  683. if (tiktok[0]) {
  684. window.stop();
  685. let pathname = window.location.pathname;
  686. selectedInstance = tiktok[1]
  687. ? `${farsideInstance}/proxitok`
  688. : await getrandom(Instances.proxitok);
  689.  
  690. await Promise.any(
  691. [
  692. ["/@/", "/@placeholder/"],
  693. ["/discover/", "/tag/"],
  694. ["/foryou", "/trending"],
  695. ].map(async ([key, value]) => {
  696. if (pathname.startsWith(key)) pathname = pathname.replace(key, value);
  697. }),
  698. );
  699.  
  700. newURL = `${scheme}${selectedInstance}${pathname}${window.location.search}${
  701. hash
  702. }`;
  703. window.location.replace(newURL);
  704. }
  705. }
  706.  
  707. async function redirectImgur() {
  708. if (imgur[0]) {
  709. window.stop();
  710.  
  711. selectedInstance = imgur[1]
  712. ? `${farsideInstance}/rimgo`
  713. : await getrandom(Instances.rimgo);
  714.  
  715. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  716. window.location.search
  717. }${hash}`;
  718.  
  719. window.location.replace(newURL);
  720. }
  721. }
  722.  
  723. async function redirectMedium(frontend) {
  724. if (medium[0]) {
  725. let pathname = window.location.pathname;
  726. const host_path = `${window.location.hostname}${pathname}`;
  727.  
  728. if (
  729. (/^.+?\.medium\.com\/.+/.test(host_path) ||
  730. /^\/@?[^\/]+?\//.test(pathname) ||
  731. host_path === "medium.com/") &&
  732. !(
  733. /^\/(tag|m|hc)\//.test(pathname) ||
  734. /\/(about|followers|following)/.test(pathname)
  735. )
  736. ) {
  737. window.stop();
  738. selectedInstance =
  739. medium[1] && frontend === "scribe"
  740. ? `${farsideInstance}/scribe`
  741. : await getrandom(Instances[frontend]);
  742. const username = window.location.hostname.replace(/\.?medium\.com/, "");
  743. if (username) pathname = `/${username}${pathname}`;
  744. newURL = `${scheme}${selectedInstance}${pathname}${
  745. window.location.search
  746. }${hash}`;
  747. window.location.replace(newURL);
  748. }
  749. }
  750. }
  751.  
  752. async function redirectHackerNews() {
  753. if (hackernews[0]) {
  754. let pathname = window.location.pathname;
  755. if (
  756. ["/newest", "/item", "/user", "/ask", "/show", "/jobs", "/"].includes(
  757. pathname,
  758. )
  759. ) {
  760. if (
  761. hackernewsFrontend === "better" &&
  762. window.location.pathname === "/newest"
  763. )
  764. pathname = "/new";
  765. selectedInstance = Instances.hackernews[hackernewsFrontend];
  766. } else if (
  767. ["/best", "/news", "/submitted", "/threads", "/classic"].includes(
  768. pathname,
  769. )
  770. ) {
  771. selectedInstance = Instances.hackernews.worker;
  772. }
  773. if (selectedInstance) {
  774. window.stop();
  775. newURL = `${scheme}${selectedInstance}${pathname}${window.location.search}`;
  776. window.location.replace(newURL);
  777. }
  778. }
  779. }
  780.  
  781. async function redirectGTranslate() {
  782. if (gtranslate[0]) {
  783. window.stop();
  784. let pathname = window.location.pathname;
  785.  
  786. switch (googleTranslateFrontend) {
  787. case "lingva":
  788. selectedInstance = gtranslate[1]
  789. ? `${farsideInstance}/lingva`
  790. : await getrandom(Instances.lingva);
  791.  
  792. if (window.location.search) {
  793. const params = new URLSearchParams(window.location.search);
  794. pathname = `/${params.get("sl")}/${params.get("tl")}/${params.get(
  795. "text",
  796. )}`;
  797. } else if (/^\/\w+?\/\w+?\/.*/.test(pathname)) {
  798. pathname = pathname.replace(/\+/g, " ");
  799. }
  800. newURL = `${scheme}${selectedInstance}${pathname}`;
  801. break;
  802.  
  803. case "mozhi":
  804. selectedInstance = await getrandom(Instances.mozhi);
  805.  
  806. if (window.location.search) {
  807. const params = new URLSearchParams(window.location.search);
  808. pathname = `?text=${params.get(
  809. "text",
  810. )}&from=${params.get("sl")}&to=${params.get("tl")}&engine=google`;
  811. newURL = `${scheme}${selectedInstance}${pathname}`;
  812. }
  813.  
  814. break;
  815.  
  816. default:
  817. break;
  818. }
  819.  
  820. window.location.replace(newURL);
  821. }
  822. }
  823.  
  824. async function redirectDeviantart() {
  825. window.stop();
  826. let pathname = window.location.pathname;
  827. let query = window.location.search;
  828. let parts = pathname.split("/").filter((n) => n);
  829. let pathnameMatch = "";
  830. selectedInstance = await getrandom(Instances.skunkyart);
  831.  
  832. let patterns = {
  833. post: /\/art\/\S+/,
  834. tag: /\/tag\/\S+/,
  835. search: /(?<=\?q=)[^&]+/,
  836. gallery: /\/\w+\/gallery$/,
  837. gallery_folder: /\/\w+\/gallery\/\d+/,
  838. favorites: /\/(\w+)\/favourites/,
  839. profile: /^\/(\w+)$/,
  840. };
  841.  
  842. if (deviantart[0]) {
  843. if (patterns.post.test(pathname)) {
  844. pathnameMatch = `/post/${parts[0].toLowerCase()}/${parts[2]}`;
  845. } else if (patterns.tag.test(pathname)) {
  846. pathnameMatch = `/search?q=${parts[1]}&type=tag`;
  847. } else if (pathname.startsWith("/search")) {
  848. query = query.match(patterns.search)[0];
  849. pathnameMatch = `/search?q=${query}&type=all`;
  850. } else if (patterns.gallery.test(pathname)) {
  851. pathnameMatch = `/group_user?type=gallery&q=${parts[0]}`;
  852. } else if (patterns.gallery_folder.test(pathname)) {
  853. pathnameMatch = `/group_user?folder=${parts[2]}&q=${parts[0]}&type=g`;
  854. } else if (patterns.favorites.test(pathname)) {
  855. pathnameMatch = `/group_user?q=${pathname.match(patterns.favorites)[1]}&type=favorites`;
  856. } else if (patterns.profile.test(pathname)) {
  857. pathnameMatch = `/group_user?type=about&q=${pathname.match(patterns.profile)[1]}`;
  858. }
  859. }
  860.  
  861. newURL = `${scheme}${selectedInstance}${pathnameMatch}`;
  862. window.location.replace(newURL);
  863. }
  864.  
  865. async function redirectDeepl() {
  866. if (deepl[0]) {
  867. window.stop();
  868. selectedInstance = await getrandom(Instances.mozhi);
  869. if (window.location.hash) {
  870. let hash_parts = window.location.hash.substring(1).split("/");
  871. let pathname = `?text=${hash_parts[2]}&from=${hash_parts[0]}&to=${
  872. hash_parts[1]
  873. }&engine=deepl`;
  874. newURL = `${scheme}${selectedInstance}${pathname}`;
  875. }
  876.  
  877. window.location.replace(newURL);
  878. }
  879. }
  880.  
  881. async function redirectTumblr() {
  882. if (tumblr[0]) {
  883. window.stop();
  884. selectedInstance = await getrandom(Instances.priviblur);
  885. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  886. window.location.search
  887. }${hash}`;
  888. window.location.replace(newURL);
  889. }
  890. }
  891.  
  892. async function redirectReuters() {
  893. if (reuters[0]) {
  894. window.stop();
  895. selectedInstance = await getrandom(Instances.neuters);
  896. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  897. window.location.search
  898. }${hash}`;
  899. window.location.replace(newURL);
  900. }
  901. }
  902.  
  903. async function redirectWikipedia() {
  904. if (wikipedia[0]) {
  905. window.stop();
  906. let langCode = /^([a-z\-]+)\./.exec(window.location.hostname)[1];
  907.  
  908. selectedInstance = wikipedia[1]
  909. ? `${farsideInstance}/wikiless`
  910. : await getrandom(Instances.wikiless);
  911.  
  912. if (langCode === "www") langCode = "en";
  913. newURL = `${scheme}${selectedInstance}${window.location.pathname}?lang=${
  914. langCode
  915. }${hash}`;
  916. window.location.replace(newURL);
  917. }
  918. }
  919.  
  920. async function redirectImdb() {
  921. if (imdb[0]) {
  922. window.stop();
  923.  
  924. selectedInstance = imdb[1]
  925. ? `${farsideInstance}/libremdb`
  926. : await getrandom(Instances.libremdb);
  927.  
  928. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  929. window.location.search
  930. }${hash}`;
  931.  
  932. window.location.replace(newURL);
  933. }
  934. }
  935.  
  936. async function redirectQuora() {
  937. if (quora[0]) {
  938. window.stop();
  939.  
  940. selectedInstance = quora[1]
  941. ? `${farsideInstance}/quetre`
  942. : await getrandom(Instances.quetre);
  943.  
  944. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  945. window.location.search
  946. }${hash}`;
  947.  
  948. window.location.replace(newURL);
  949. }
  950. }
  951.  
  952. async function redirectFandom() {
  953. if (fandom[0]) {
  954. window.stop();
  955. const fandomName = window.location.hostname.replace(/\..+/, "");
  956. selectedInstance = await getrandom(Instances.breezewiki);
  957.  
  958. let pathname = window.location.pathname;
  959. if (fandomName !== "www") pathname = `/${fandomName}${pathname}`;
  960. newURL = `${scheme}${selectedInstance}${pathname}${window.location.search}${
  961. hash
  962. }`;
  963.  
  964. window.location.replace(newURL);
  965. }
  966. }
  967.  
  968. async function redirectGoogle() {
  969. if (
  970. google[0] &&
  971. window.location.hostname.startsWith("www") &&
  972. window.location.pathname.startsWith("/search")
  973. ) {
  974. window.stop();
  975.  
  976. selectedInstance = google[1]
  977. ? `${farsideInstance}/${googleFrontend}`
  978. : (selectedInstance = await getrandom(Instances[googleFrontend]));
  979.  
  980. let pathname = window.location.pathname;
  981. if (googleFrontend === "librey" && pathname === "/search")
  982. pathname += ".php";
  983. const params = new URLSearchParams(window.location.search);
  984. const query = params.entries().q;
  985. const search = query ? `?q=${query}` : window.location.search;
  986. newURL = `${scheme}${selectedInstance}${pathname}${search}${hash}`;
  987. window.location.replace(newURL);
  988. }
  989. }
  990.  
  991. async function redirectGoodreads() {
  992. if (goodreads[0]) {
  993. window.stop();
  994.  
  995. selectedInstance = await getrandom(Instances.biblioreads);
  996.  
  997. if (window.location.pathname.startsWith("/search")) {
  998. const params = new URLSearchParams(search);
  999. search = `/${params.get("q")}`;
  1000. }
  1001. newURL = `${scheme}${selectedInstance}${window.location.pathname}${search}${
  1002. hash
  1003. }`;
  1004. window.location.replace(newURL);
  1005. }
  1006. }
  1007.  
  1008. async function redirectStackoverflow() {
  1009. if (
  1010. stackoverflow[0] &&
  1011. (window.location.pathname.startsWith("/questions/") ||
  1012. window.location.pathname === "/")
  1013. ) {
  1014. window.stop();
  1015. selectedInstance = stackoverflow[1]
  1016. ? `${farsideInstance}/anonymousoverflow`
  1017. : await getrandom(Instances.anonymousoverflow);
  1018.  
  1019. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  1020. window.location.search
  1021. }${hash}`;
  1022. window.location.replace(newURL);
  1023. }
  1024. }
  1025.  
  1026. async function redirectBandcamp() {
  1027. if (bandcamp[0]) {
  1028. // thanks to libredirect
  1029.  
  1030. selectedInstance = await getrandom(Instances.tent);
  1031. const params = new URLSearchParams(window.location.search);
  1032. const artist = window.location.hostname.replace(/\..+/, "");
  1033. const regex = /^\/([^\/]+?)\/(.+)/.exec(window.location.pathname);
  1034. const audio = /^\/stream\/([a-f0-9]+?)\/([^\/]+?)\/([0-9]+)/.exec(
  1035. window.location.pathname,
  1036. );
  1037. const image = /^\/img\/(.+)/.exec(window.location.pathname);
  1038. let searchpath = "";
  1039.  
  1040. switch (true) {
  1041. case window.location.pathname === "/search":
  1042. searchpath = `/search.php?query=${params.get("q")}`;
  1043. break;
  1044. case window.location.hostname.search(/(daily)?\.bandcamp\.com/) > 0:
  1045. if (window.location.pathname === "/") {
  1046. searchpath = `/artist.php?name=${artist}`;
  1047. } else if (regex.length > 2) {
  1048. searchpath = `/release.php?artist=${artist}&type=${regex[1]}&name=${regex[2]}`;
  1049. }
  1050. break;
  1051. case window.location.hostname === "f4.bcbits.com":
  1052. if (image.length > 1) searchpath = `/image.php?file=${image[1]}`;
  1053. break;
  1054. case window.location.hostname === "t4.bcbits.com":
  1055. if (audio.length > 3)
  1056. searchpath = `/audio.php?directory=${audio[1]}&format=${
  1057. audio[2]
  1058. }&file=${audio[3]}&token=${params.get("token")}`;
  1059. break;
  1060. default:
  1061. return;
  1062. }
  1063. window.stop();
  1064. newURL = `${scheme}${selectedInstance}${searchpath}`;
  1065. window.location.replace(newURL);
  1066. }
  1067. }
  1068.  
  1069. async function redirectGenius() {
  1070. if (genius[0]) {
  1071. const pathname = window.location.pathname;
  1072. selectedInstance = await getrandom(Instances[geniusFrontend]);
  1073.  
  1074. await Promise.any(
  1075. [
  1076. ["lyrics", pathname.endsWith("-lyrics")],
  1077. ["album", pathname.startsWith("/albums/")],
  1078. ["artist", pathname.startsWith("/artists/")],
  1079. [, ["/", "/search"].includes(pathname)],
  1080. ].map(async ([key, value]) => {
  1081. if (value) {
  1082. const searchpath =
  1083. geniusFrontend === "intellectual" && key
  1084. ? `/${key}?path=${pathname.slice(1)}`
  1085. : `${pathname}${window.location.search}`;
  1086. window.stop();
  1087. newURL = `${scheme}${selectedInstance}${searchpath}${hash}`;
  1088. window.location.replace(newURL);
  1089. }
  1090. }),
  1091. );
  1092. }
  1093. }
  1094.  
  1095. async function redirectPinterest() {
  1096. if (pinterest[0]) {
  1097. selectedInstance = await getrandom(Instances.binternet);
  1098.  
  1099. let searchpath = "";
  1100. if (window.location.hostname === "i.pinimg.com") {
  1101. searchpath = `/image_proxy.php?url=${window.location.href}`;
  1102. } else if (window.location.pathname.startsWith("/search")) {
  1103. searchpath = `${window.location.pathname
  1104. .replace("search", "search.php")
  1105. .replace("/pins/", "")}${window.location.search}`;
  1106. } else if (window.location.pathname !== "/") return;
  1107.  
  1108. window.stop();
  1109. newURL = `${scheme}${selectedInstance}${searchpath}`;
  1110. window.location.replace(newURL);
  1111. }
  1112. }
  1113.  
  1114. async function redirectSoundcloud() {
  1115. if (soundcloud[0]) {
  1116. window.stop();
  1117. selectedInstance = await getrandom(Instances.tubo);
  1118.  
  1119. let searchpath = "/kiosk?serviceId=1";
  1120. if (window.location.pathname !== "/")
  1121. searchpath = `/stream?url=${window.location.href}`;
  1122. newURL = `${scheme}${selectedInstance}${searchpath}`;
  1123. window.location.replace(newURL);
  1124. }
  1125. }
  1126.  
  1127. async function redirectPixiv() {
  1128. if (pixiv[0]) {
  1129. window.stop();
  1130. selectedInstance = await getrandom(Instances.pixivfe);
  1131.  
  1132. const pathname = window.location.pathname.replace(/^\/\w{2}\//, "/");
  1133. newURL = `${scheme}${selectedInstance}${pathname}${window.location.search}`;
  1134. window.location.replace(newURL);
  1135. }
  1136. }
  1137.  
  1138. async function redirectTwitch() {
  1139. if (twitch[0]) {
  1140. window.stop();
  1141. selectedInstance = await getrandom(Instances.safetwitch);
  1142.  
  1143. const pathname =
  1144. window.location.pathname == "/search"
  1145. ? window.location.pathname + "/"
  1146. : window.location.pathname;
  1147.  
  1148. let searchpath =
  1149. window.location.pathname == "/search"
  1150. ? window.location.search.replace("term", "query")
  1151. : window.location.search;
  1152.  
  1153. newURL = `${scheme}${selectedInstance}${pathname}${searchpath}`;
  1154. window.location.replace(newURL);
  1155. }
  1156. }
  1157.  
  1158. const urlHostname = window.location.hostname;
  1159.  
  1160. switch (urlHostname) {
  1161. case "www.instagram.com":
  1162. redirectInstagram();
  1163. break;
  1164.  
  1165. case "twitter.com":
  1166. case "mobile.twitter.com":
  1167. case "x.com":
  1168. case "mobile.x.com":
  1169. redirectTwitter();
  1170. break;
  1171.  
  1172. case "www.youtube.com":
  1173. case "m.youtube.com":
  1174. case "www.youtube-nocookie.com":
  1175. redirectYoutube(youtubeFrontend);
  1176. break;
  1177.  
  1178. case "www.tiktok.com":
  1179. redirectTiktok();
  1180. break;
  1181.  
  1182. case "music.youtube.com":
  1183. redirectYoutube(youtubeMusicFrontend);
  1184. break;
  1185.  
  1186. case "news.ycombinator.com":
  1187. redirectHackerNews();
  1188. break;
  1189.  
  1190. case "translate.google.com":
  1191. redirectGTranslate();
  1192. break;
  1193.  
  1194. case "www.reuters.com":
  1195. redirectReuters();
  1196. break;
  1197.  
  1198. case "www.imdb.com":
  1199. case "m.imdb.com":
  1200. redirectImdb();
  1201. break;
  1202.  
  1203. case "www.quora.com":
  1204. redirectQuora();
  1205. break;
  1206.  
  1207. case "www.google.com":
  1208. redirectGoogle();
  1209. break;
  1210.  
  1211. case "www.goodreads.com":
  1212. redirectGoodreads();
  1213. break;
  1214.  
  1215. case "genius.com":
  1216. redirectGenius();
  1217. break;
  1218.  
  1219. case "stackoverflow.com":
  1220. redirectStackoverflow();
  1221. break;
  1222.  
  1223. case "f4.bcbits.com":
  1224. case "t4.bcbits.com":
  1225. redirectBandcamp();
  1226. break;
  1227.  
  1228. case "www.deviantart.com":
  1229. redirectDeviantart();
  1230. break;
  1231.  
  1232. case "i.pinimg.com":
  1233. redirectPinterest();
  1234. break;
  1235.  
  1236. case "soundcloud.com":
  1237. case "m.soundcloud.com":
  1238. redirectSoundcloud();
  1239. break;
  1240.  
  1241. case "www.pixiv.net":
  1242. redirectPixiv();
  1243. break;
  1244.  
  1245. case "www.deepl.com":
  1246. redirectDeepl();
  1247. break;
  1248.  
  1249. case "twitch.tv":
  1250. case "www.twitch.tv":
  1251. redirectTwitch();
  1252. break;
  1253.  
  1254. case urlHostname.includes("reddit.com") ? urlHostname : 0:
  1255. redirectReddit();
  1256. break;
  1257.  
  1258. case urlHostname.includes("medium.com") ? urlHostname : 0:
  1259. redirectMedium(mediumFrontend);
  1260. break;
  1261.  
  1262. case urlHostname.includes("imgur.com") ? urlHostname : 0:
  1263. case urlHostname.includes("imgur.io") ? urlHostname : 0:
  1264. redirectImgur();
  1265. break;
  1266.  
  1267. case urlHostname.includes("wikipedia.org") ? urlHostname : 0:
  1268. redirectWikipedia();
  1269. break;
  1270.  
  1271. case urlHostname.includes("fandom.com") ? urlHostname : 0:
  1272. redirectFandom();
  1273. break;
  1274.  
  1275. case urlHostname.includes("bandcamp.com") ? urlHostname : 0:
  1276. redirectBandcamp();
  1277. break;
  1278.  
  1279. case urlHostname.includes("pinterest.com") ? urlHostname : 0:
  1280. redirectPinterest();
  1281. break;
  1282.  
  1283. case urlHostname.includes("tumblr.com") ? urlHostname : 0:
  1284. redirectTumblr();
  1285. break;
  1286. }
  1287.  
  1288. // export module for the test in github action
  1289. typeof module !== "undefined"
  1290. ? (module.exports = { Instances: Instances })
  1291. : true;

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址