NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Mastodon Pixiv Preview // @namespace https://onee3.org // @version 0.1.0 // @description Pixiv Open Graph preview images in Mastodon // @copyright 2020, Frederick888 (https://openuserjs.org/users/Frederick888) // @author Frederick888 // @license GPL-3.0-or-later // @homepageURL https://github.com/Frederick888/mastodon-pixiv-preview // @supportURL https://github.com/Frederick888/mastodon-pixiv-preview/issues // @contributionURL https://github.com/Frederick888/mastodon-pixiv-preview/pull // @updateURL https://openuserjs.org/meta/Frederick888/Mastodon_Pixiv_Preview.meta.js // @match https://mastodon.ktachibana.party/* // ==/UserScript== let galleryTemplate = ` <div class="media-gallery"> <div class="media-gallery__item" style="inset: auto; width: 100%; height: 100%;"> <a class="media-gallery__item-thumbnail" href="" target="_blank" rel="noopener noreferrer"> <img src="" srcset="" sizes="250px" style="object-position: 50.5% 20%;" /></a> </div> </div> `; function htmlToElement(html) { var template = document.createElement('template'); html = html.trim(); // Never return a text node of whitespace as the result template.innerHTML = html; return template.content.firstChild; } function addPixivOpenGraph(container, pixivLinkContainer) { /* * Format 1: https://www.pixiv.net/member_illust.php?illust_id=<id>&mode=medium * Format 2: https://www.pixiv.net/artworks/<id> */ let actionBar = container.querySelector('.status__action-bar'); let pixivLink = pixivLinkContainer.getAttribute('href'); let pixivArtworkId = pixivLink.replace(/.*pixiv\.net\/artworks\/(\d+).*|.*pixiv\.net\/.*illust_id=(\d+).*/, '$1$2'); let pixivPreviewLink = 'https://embed.pixiv.net/decorate.php?mode=sns-automator&illust_id=' + pixivArtworkId; let mediaGallery = htmlToElement(galleryTemplate); mediaGallery.querySelector('.media-gallery__item-thumbnail').setAttribute('href', pixivLink); let mediaGalleryImg = mediaGallery.querySelector('img'); mediaGalleryImg.setAttribute('src', pixivPreviewLink); mediaGalleryImg.setAttribute('srcset', pixivPreviewLink + ' 960w ' + pixivPreviewLink + ' 346w'); actionBar.before(mediaGallery); } function mainLoop() { document.querySelectorAll('.status-link.unhandled-link[href*="pixiv.net"]:not([og-pixiv-processed])') .forEach((pixivLinkContainer) => { pixivLinkContainer.setAttribute('og-pixiv-processed', '1'); let container = pixivLinkContainer.closest('.status__wrapper'); if (container.querySelector('.media-gallery:not(.og-pixiv)') === null) { addPixivOpenGraph(container, pixivLinkContainer); } }); } (function () { 'use strict'; if (typeof MutationObserver === 'function') { let observerConfig = { attributes: true, characterData: true, childList: true, subtree: true, }; let body = document.getElementsByTagName('body')[0]; let observer = new MutationObserver(mainLoop); observer.observe(body, observerConfig); } else { mainLoop(); setInterval(mainLoop, 200); } })();