隐私重定向器

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

目前为 2025-01-06 提交的版本。查看 最新版本

  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.1
  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. } else {
  813. newURL = `${scheme}${selectedInstance}`;
  814. }
  815. break;
  816.  
  817. default:
  818. break;
  819. }
  820.  
  821. window.location.replace(newURL);
  822. }
  823. }
  824.  
  825. async function redirectDeviantart() {
  826. window.stop();
  827. let pathname = window.location.pathname;
  828. let query = window.location.search;
  829. let parts = pathname.split("/").filter((n) => n);
  830. let pathnameMatch = "";
  831. selectedInstance = await getrandom(Instances.skunkyart);
  832.  
  833. let patterns = {
  834. post: /\/art\/\S+/,
  835. tag: /\/tag\/\S+/,
  836. search: /(?<=\?q=)[^&]+/,
  837. gallery: /\/\w+\/gallery$/,
  838. gallery_folder: /\/\w+\/gallery\/\d+/,
  839. favorites: /\/(\w+)\/favourites/,
  840. profile: /^\/(\w+)$/,
  841. };
  842.  
  843. if (deviantart[0]) {
  844. if (patterns.post.test(pathname)) {
  845. pathnameMatch = `/post/${parts[0].toLowerCase()}/${parts[2]}`;
  846. } else if (patterns.tag.test(pathname)) {
  847. pathnameMatch = `/search?q=${parts[1]}&type=tag`;
  848. } else if (pathname.startsWith("/search")) {
  849. query = query.match(patterns.search)[0];
  850. pathnameMatch = `/search?q=${query}&type=all`;
  851. } else if (patterns.gallery.test(pathname)) {
  852. pathnameMatch = `/group_user?type=gallery&q=${parts[0]}`;
  853. } else if (patterns.gallery_folder.test(pathname)) {
  854. pathnameMatch = `/group_user?folder=${parts[2]}&q=${parts[0]}&type=g`;
  855. } else if (patterns.favorites.test(pathname)) {
  856. pathnameMatch = `/group_user?q=${pathname.match(patterns.favorites)[1]}&type=favorites`;
  857. } else if (patterns.profile.test(pathname)) {
  858. pathnameMatch = `/group_user?type=about&q=${pathname.match(patterns.profile)[1]}`;
  859. }
  860. }
  861.  
  862. newURL = `${scheme}${selectedInstance}${pathnameMatch}`;
  863. window.location.replace(newURL);
  864. }
  865.  
  866. async function redirectDeepl() {
  867. if (deepl[0]) {
  868. window.stop();
  869. selectedInstance = await getrandom(Instances.mozhi);
  870. if (window.location.hash) {
  871. let hash_parts = window.location.hash.substring(1).split("/");
  872. let pathname = `?text=${hash_parts[2]}&from=${hash_parts[0]}&to=${
  873. hash_parts[1]
  874. }&engine=deepl`;
  875. newURL = `${scheme}${selectedInstance}${pathname}`;
  876. }
  877.  
  878. window.location.replace(newURL);
  879. }
  880. }
  881.  
  882. async function redirectTumblr() {
  883. if (tumblr[0]) {
  884. window.stop();
  885. selectedInstance = await getrandom(Instances.priviblur);
  886. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  887. window.location.search
  888. }${hash}`;
  889. window.location.replace(newURL);
  890. }
  891. }
  892.  
  893. async function redirectReuters() {
  894. if (reuters[0]) {
  895. window.stop();
  896. selectedInstance = await getrandom(Instances.neuters);
  897. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  898. window.location.search
  899. }${hash}`;
  900. window.location.replace(newURL);
  901. }
  902. }
  903.  
  904. async function redirectWikipedia() {
  905. if (wikipedia[0]) {
  906. window.stop();
  907. let langCode = /^([a-z\-]+)\./.exec(window.location.hostname)[1];
  908.  
  909. selectedInstance = wikipedia[1]
  910. ? `${farsideInstance}/wikiless`
  911. : await getrandom(Instances.wikiless);
  912.  
  913. if (langCode === "www") langCode = "en";
  914. newURL = `${scheme}${selectedInstance}${window.location.pathname}?lang=${
  915. langCode
  916. }${hash}`;
  917. window.location.replace(newURL);
  918. }
  919. }
  920.  
  921. async function redirectImdb() {
  922. if (imdb[0]) {
  923. window.stop();
  924.  
  925. selectedInstance = imdb[1]
  926. ? `${farsideInstance}/libremdb`
  927. : await getrandom(Instances.libremdb);
  928.  
  929. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  930. window.location.search
  931. }${hash}`;
  932.  
  933. window.location.replace(newURL);
  934. }
  935. }
  936.  
  937. async function redirectQuora() {
  938. if (quora[0]) {
  939. window.stop();
  940.  
  941. selectedInstance = quora[1]
  942. ? `${farsideInstance}/quetre`
  943. : await getrandom(Instances.quetre);
  944.  
  945. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  946. window.location.search
  947. }${hash}`;
  948.  
  949. window.location.replace(newURL);
  950. }
  951. }
  952.  
  953. async function redirectFandom() {
  954. if (fandom[0]) {
  955. window.stop();
  956. const fandomName = window.location.hostname.replace(/\..+/, "");
  957. selectedInstance = await getrandom(Instances.breezewiki);
  958.  
  959. let pathname = window.location.pathname;
  960. if (fandomName !== "www") pathname = `/${fandomName}${pathname}`;
  961. newURL = `${scheme}${selectedInstance}${pathname}${window.location.search}${
  962. hash
  963. }`;
  964.  
  965. window.location.replace(newURL);
  966. }
  967. }
  968.  
  969. async function redirectGoogle() {
  970. if (
  971. google[0] &&
  972. window.location.hostname.startsWith("www") &&
  973. window.location.pathname.startsWith("/search")
  974. ) {
  975. window.stop();
  976.  
  977. selectedInstance = google[1]
  978. ? `${farsideInstance}/${googleFrontend}`
  979. : (selectedInstance = await getrandom(Instances[googleFrontend]));
  980.  
  981. let pathname = window.location.pathname;
  982. if (googleFrontend === "librey" && pathname === "/search")
  983. pathname += ".php";
  984. const params = new URLSearchParams(window.location.search);
  985. const query = params.entries().q;
  986. const search = query ? `?q=${query}` : window.location.search;
  987. newURL = `${scheme}${selectedInstance}${pathname}${search}${hash}`;
  988. window.location.replace(newURL);
  989. }
  990. }
  991.  
  992. async function redirectGoodreads() {
  993. if (goodreads[0]) {
  994. window.stop();
  995.  
  996. selectedInstance = await getrandom(Instances.biblioreads);
  997.  
  998. if (window.location.pathname.startsWith("/search")) {
  999. const params = new URLSearchParams(search);
  1000. search = `/${params.get("q")}`;
  1001. }
  1002. newURL = `${scheme}${selectedInstance}${window.location.pathname}${search}${
  1003. hash
  1004. }`;
  1005. window.location.replace(newURL);
  1006. }
  1007. }
  1008.  
  1009. async function redirectStackoverflow() {
  1010. if (
  1011. stackoverflow[0] &&
  1012. (window.location.pathname.startsWith("/questions/") ||
  1013. window.location.pathname === "/")
  1014. ) {
  1015. window.stop();
  1016. selectedInstance = stackoverflow[1]
  1017. ? `${farsideInstance}/anonymousoverflow`
  1018. : await getrandom(Instances.anonymousoverflow);
  1019.  
  1020. newURL = `${scheme}${selectedInstance}${window.location.pathname}${
  1021. window.location.search
  1022. }${hash}`;
  1023. window.location.replace(newURL);
  1024. }
  1025. }
  1026.  
  1027. async function redirectBandcamp() {
  1028. if (bandcamp[0]) {
  1029. // thanks to libredirect
  1030.  
  1031. selectedInstance = await getrandom(Instances.tent);
  1032. const params = new URLSearchParams(window.location.search);
  1033. const artist = window.location.hostname.replace(/\..+/, "");
  1034. const regex = /^\/([^\/]+?)\/(.+)/.exec(window.location.pathname);
  1035. const audio = /^\/stream\/([a-f0-9]+?)\/([^\/]+?)\/([0-9]+)/.exec(
  1036. window.location.pathname,
  1037. );
  1038. const image = /^\/img\/(.+)/.exec(window.location.pathname);
  1039. let searchpath = "";
  1040.  
  1041. switch (true) {
  1042. case window.location.pathname === "/search":
  1043. searchpath = `/search.php?query=${params.get("q")}`;
  1044. break;
  1045. case window.location.hostname.search(/(daily)?\.bandcamp\.com/) > 0:
  1046. if (window.location.pathname === "/") {
  1047. searchpath = `/artist.php?name=${artist}`;
  1048. } else if (regex.length > 2) {
  1049. searchpath = `/release.php?artist=${artist}&type=${regex[1]}&name=${regex[2]}`;
  1050. }
  1051. break;
  1052. case window.location.hostname === "f4.bcbits.com":
  1053. if (image.length > 1) searchpath = `/image.php?file=${image[1]}`;
  1054. break;
  1055. case window.location.hostname === "t4.bcbits.com":
  1056. if (audio.length > 3)
  1057. searchpath = `/audio.php?directory=${audio[1]}&format=${
  1058. audio[2]
  1059. }&file=${audio[3]}&token=${params.get("token")}`;
  1060. break;
  1061. default:
  1062. return;
  1063. }
  1064. window.stop();
  1065. newURL = `${scheme}${selectedInstance}${searchpath}`;
  1066. window.location.replace(newURL);
  1067. }
  1068. }
  1069.  
  1070. async function redirectGenius() {
  1071. if (genius[0]) {
  1072. const pathname = window.location.pathname;
  1073. selectedInstance = await getrandom(Instances[geniusFrontend]);
  1074.  
  1075. await Promise.any(
  1076. [
  1077. ["lyrics", pathname.endsWith("-lyrics")],
  1078. ["album", pathname.startsWith("/albums/")],
  1079. ["artist", pathname.startsWith("/artists/")],
  1080. [, ["/", "/search"].includes(pathname)],
  1081. ].map(async ([key, value]) => {
  1082. if (value) {
  1083. const searchpath =
  1084. geniusFrontend === "intellectual" && key
  1085. ? `/${key}?path=${pathname.slice(1)}`
  1086. : `${pathname}${window.location.search}`;
  1087. window.stop();
  1088. newURL = `${scheme}${selectedInstance}${searchpath}${hash}`;
  1089. window.location.replace(newURL);
  1090. }
  1091. }),
  1092. );
  1093. }
  1094. }
  1095.  
  1096. async function redirectPinterest() {
  1097. if (pinterest[0]) {
  1098. selectedInstance = await getrandom(Instances.binternet);
  1099.  
  1100. let searchpath = "";
  1101. if (window.location.hostname === "i.pinimg.com") {
  1102. searchpath = `/image_proxy.php?url=${window.location.href}`;
  1103. } else if (window.location.pathname.startsWith("/search")) {
  1104. searchpath = `${window.location.pathname
  1105. .replace("search", "search.php")
  1106. .replace("/pins/", "")}${window.location.search}`;
  1107. } else if (window.location.pathname !== "/") return;
  1108.  
  1109. window.stop();
  1110. newURL = `${scheme}${selectedInstance}${searchpath}`;
  1111. window.location.replace(newURL);
  1112. }
  1113. }
  1114.  
  1115. async function redirectSoundcloud() {
  1116. if (soundcloud[0]) {
  1117. window.stop();
  1118. selectedInstance = await getrandom(Instances.tubo);
  1119.  
  1120. let searchpath = "/kiosk?serviceId=1";
  1121. if (window.location.pathname !== "/")
  1122. searchpath = `/stream?url=${window.location.href}`;
  1123. newURL = `${scheme}${selectedInstance}${searchpath}`;
  1124. window.location.replace(newURL);
  1125. }
  1126. }
  1127.  
  1128. async function redirectPixiv() {
  1129. if (pixiv[0]) {
  1130. window.stop();
  1131. selectedInstance = await getrandom(Instances.pixivfe);
  1132.  
  1133. const pathname = window.location.pathname.replace(/^\/\w{2}\//, "/");
  1134. newURL = `${scheme}${selectedInstance}${pathname}${window.location.search}`;
  1135. window.location.replace(newURL);
  1136. }
  1137. }
  1138.  
  1139. async function redirectTwitch() {
  1140. if (twitch[0]) {
  1141. window.stop();
  1142. selectedInstance = await getrandom(Instances.safetwitch);
  1143.  
  1144. const pathname =
  1145. window.location.pathname == "/search"
  1146. ? window.location.pathname + "/"
  1147. : window.location.pathname;
  1148.  
  1149. let searchpath =
  1150. window.location.pathname == "/search"
  1151. ? window.location.search.replace("term", "query")
  1152. : window.location.search;
  1153.  
  1154. newURL = `${scheme}${selectedInstance}${pathname}${searchpath}`;
  1155. window.location.replace(newURL);
  1156. }
  1157. }
  1158.  
  1159. const urlHostname = window.location.hostname;
  1160.  
  1161. switch (urlHostname) {
  1162. case "www.instagram.com":
  1163. redirectInstagram();
  1164. break;
  1165.  
  1166. case "twitter.com":
  1167. case "mobile.twitter.com":
  1168. case "x.com":
  1169. case "mobile.x.com":
  1170. redirectTwitter();
  1171. break;
  1172.  
  1173. case "www.youtube.com":
  1174. case "m.youtube.com":
  1175. case "www.youtube-nocookie.com":
  1176. redirectYoutube(youtubeFrontend);
  1177. break;
  1178.  
  1179. case "www.tiktok.com":
  1180. redirectTiktok();
  1181. break;
  1182.  
  1183. case "music.youtube.com":
  1184. redirectYoutube(youtubeMusicFrontend);
  1185. break;
  1186.  
  1187. case "news.ycombinator.com":
  1188. redirectHackerNews();
  1189. break;
  1190.  
  1191. case "translate.google.com":
  1192. redirectGTranslate();
  1193. break;
  1194.  
  1195. case "www.reuters.com":
  1196. redirectReuters();
  1197. break;
  1198.  
  1199. case "www.imdb.com":
  1200. case "m.imdb.com":
  1201. redirectImdb();
  1202. break;
  1203.  
  1204. case "www.quora.com":
  1205. redirectQuora();
  1206. break;
  1207.  
  1208. case "www.google.com":
  1209. redirectGoogle();
  1210. break;
  1211.  
  1212. case "www.goodreads.com":
  1213. redirectGoodreads();
  1214. break;
  1215.  
  1216. case "genius.com":
  1217. redirectGenius();
  1218. break;
  1219.  
  1220. case "stackoverflow.com":
  1221. redirectStackoverflow();
  1222. break;
  1223.  
  1224. case "f4.bcbits.com":
  1225. case "t4.bcbits.com":
  1226. redirectBandcamp();
  1227. break;
  1228.  
  1229. case "www.deviantart.com":
  1230. redirectDeviantart();
  1231. break;
  1232.  
  1233. case "i.pinimg.com":
  1234. redirectPinterest();
  1235. break;
  1236.  
  1237. case "soundcloud.com":
  1238. case "m.soundcloud.com":
  1239. redirectSoundcloud();
  1240. break;
  1241.  
  1242. case "www.pixiv.net":
  1243. redirectPixiv();
  1244. break;
  1245.  
  1246. case "www.deepl.com":
  1247. redirectDeepl();
  1248. break;
  1249.  
  1250. case "twitch.tv":
  1251. case "www.twitch.tv":
  1252. redirectTwitch();
  1253. break;
  1254.  
  1255. case urlHostname.includes("reddit.com") ? urlHostname : 0:
  1256. redirectReddit();
  1257. break;
  1258.  
  1259. case urlHostname.includes("medium.com") ? urlHostname : 0:
  1260. redirectMedium(mediumFrontend);
  1261. break;
  1262.  
  1263. case urlHostname.includes("imgur.com") ? urlHostname : 0:
  1264. case urlHostname.includes("imgur.io") ? urlHostname : 0:
  1265. redirectImgur();
  1266. break;
  1267.  
  1268. case urlHostname.includes("wikipedia.org") ? urlHostname : 0:
  1269. redirectWikipedia();
  1270. break;
  1271.  
  1272. case urlHostname.includes("fandom.com") ? urlHostname : 0:
  1273. redirectFandom();
  1274. break;
  1275.  
  1276. case urlHostname.includes("bandcamp.com") ? urlHostname : 0:
  1277. redirectBandcamp();
  1278. break;
  1279.  
  1280. case urlHostname.includes("pinterest.com") ? urlHostname : 0:
  1281. redirectPinterest();
  1282. break;
  1283.  
  1284. case urlHostname.includes("tumblr.com") ? urlHostname : 0:
  1285. redirectTumblr();
  1286. break;
  1287. }
  1288.  
  1289. // export module for the test in github action
  1290. typeof module !== "undefined"
  1291. ? (module.exports = { Instances: Instances })
  1292. : true;

QingJ © 2025

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