Medium to Freedium

30/06/2024, 11:35:39

// ==UserScript==
// @name        Medium to Freedium
// @namespace   Violentmonkey Scripts
// @match       *://*.medium.com/*
// @grant       none
// @version     1.3
// @description 30/06/2024, 11:35:39
// @require     https://unpkg.com/@violentmonkey/url
// @include     /.*\..*\..*\/.*/
// @license     MIT
// ==/UserScript==

const { onNavigate } = VM;

function handleNavigate() {
  /* The script is also run on two subdomains as some Medium articles are on those.
     As Medium is an SPA, we have to use `onNavigate`
     However, we might not be on an article */
  if (window.location.hostname === "medium.com") {
  if (!/.*\:\/\/.*medium\.com\/.*\/.*/.test(window.location.href)) {
    return;
  }
  }

  /* As mentioned earlier, we might be on two nested subdomains that are a Medium article. We can check this:
     the include patterns are setup to match that */
  document.querySelectorAll("meta").forEach((el) => {
    if (el.getAttribute("content") === "Medium") {
      onMedium();
      return;
    }
  });
}

// Watch route change
VM.onNavigate(handleNavigate);

// Call it once for the initial state
handleNavigate();

function onMedium() {
  // Remove all elements from the page
  document.body.innerHTML = '';
  document.head.innerHTML = '';

  // Add custom styles to prevent FOUC
  const style = document.createElement('style');
  style.innerHTML = "body { background-color: rgb(31, 41, 55); }";
  document.head.appendChild(style);

  // Redirect to Freedium
  const redirectTo = `https://freedium.cfd/${window.location.hostname}/${window.location.pathname}`;
  window.location.replace(redirectTo);
}