Twitter media-only filter toggle.

Toggle non-media tweets on and off, for the power-viewer!

As of 2018-03-04. See the latest version.

// ==UserScript==
// @name         Twitter media-only filter toggle.
// @version      0.4
// @description  Toggle non-media tweets on and off, for the power-viewer!
// @author       Cro
// @match        https://twitter.com/*
// @run-at       document-idle
// @grant        GM_setValue
// @grant        GM_getValue
// @namespace https://greasyfork.org/users/10865
// ==/UserScript==

(function() {
    'use strict';
    // Die fast if we cannot hook into the button bar.
    var buttonBar = document.getElementById("global-actions");
    if (buttonBar === null) return;

    var hideIfTarget = function(node)
    {
        if (node.tagName &&
            node.tagName.toLowerCase() == "li" &&
            node.classList.contains("stream-item") &&
            null === node.querySelector("div.AdaptiveMediaOuterContainer"))
        {
            node.hidden = true;
        }
    };

    var observer = new MutationObserver(mutations => mutations.forEach(mutation => mutation.addedNodes.forEach(hideIfTarget)));
    var stream = document.getElementsByClassName("stream")[0];

    // UI
    var li = document.createElement("li");
    var button = document.createElement("button");
    var only = "Only Media Tweets";
    var all = "All Tweets";
    var storageKey = "cro-media-toggle";

    button.onclick = function(event)
    {
        GM_setValue(storageKey, !GM_getValue(storageKey));
        var items = document.querySelectorAll("li.stream-item");

        if (GM_getValue(storageKey))
        {
            button.innerText = only;
            items.forEach(hideIfTarget);
            observer.observe(stream, { childList: true, subtree: true });
        }
        else
        {
            button.innerText = all;
            items.forEach(node => node.hidden = false);
            observer.disconnect();
        }
    };

    buttonBar.appendChild(li);
    li.appendChild(button);
    button.click();
})();