Makes the External Link unclickable if the bsky post was deleted because opening a deleted post is a waste of time.
// ==UserScript== // @name Miniflux detect deleted bluesky posts // @namespace https://reader.miniflux.app/ // @version 3 // @description Makes the External Link unclickable if the bsky post was deleted because opening a deleted post is a waste of time. // @author Tehhund // @match *://*.miniflux.app/* // @icon https://www.google.com/s2/favicons?sz=64&domain=miniflux.app // @run-at document-start // @grant GM.xmlHttpRequest // @license MIT // ==/UserScript== /* jshint esversion: 8 */ const detect = async () => { if (window.location.href.includes(`/entry/`)) { // Only run when viewing a single entry. If this runs when viewing a list of entries it slams bsky with too many requests and triggers HTTP 429 errors. const links = [...document.getElementsByTagName(`a`)]; for (const link of links) { if (link.href.includes(`bsky.app`) && (link.textContent.includes(`External link`))) { const url = link.href; console.log(url); GM.xmlHttpRequest({ method: "GET", url: url, headers: { "User-Agent": "Mozilla/5.0", // If not specified, navigator.userAgent will be used. "Accept": "text/xml" // If not specified, browser defaults will be used. }, onload: function (response) { console.log(response.responseText); if (response.responseText.includes`<title>Bluesky</title>`) { // This exact text only appears on deleted posts. Live posts have the user's handle here. const newSpan = document.createElement(`span`); newSpan.textContent = `No ${link.textContent}`; link.insertAdjacentElement(`beforebegin`, newSpan); link.remove(); } } }); } } } } window.addEventListener("DOMContentLoaded", detect);