您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Infinite scroll. Reveal all video related galleries at desktop. Galleries url rewritten and redirected to video/image section if available.
当前为
// ==UserScript== // @name Motherless.com Improved // @namespace http://tampermonkey.net/ // @author smartacephale // @license MIT // @version 1.0 // @description Infinite scroll. Reveal all video related galleries at desktop. Galleries url rewritten and redirected to video/image section if available. // @match https://motherless.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=motherless.com // @grant unsafeWindow // ==/UserScript== const LOGO = ` ⡿⣹⡝⣯⡝⣯⡝⣯⠽⣭⢻⣭⢻⣭⢻⣭⢻⡭⢯⡽⡭⢏⡳⣍⡛⡜⡍⢎⡱⢊⠖⡱⢊⡖⣱⢊⠶⡱⢎⠶⣩⣿⢣⠝⣺⢿⣹⣷⣿⣿⣿⣿⢠⢃⠦⡑⢢⠜⣐⠢ ⣟⡧⣟⢮⡽⣖⣻⢼⡻⣜⣳⢎⡷⣎⠷⣎⠷⣙⢧⡚⣥⢋⠶⣡⠞⣱⡘⣣⠱⣋⠼⡱⣉⠶⣡⡛⡼⣱⢫⡝⣶⣯⣏⢞⡥⢫⣝⣯⣟⣾⣿⣽⢂⠣⣌⡑⢣⡘⠤⣃ ⣞⡷⣭⢟⡾⣹⢮⢷⣹⢧⣛⠮⣕⢎⡳⢬⠳⣍⠶⣙⢦⢋⡞⣥⢚⡥⣚⠴⣙⢦⠳⣥⢣⣛⡴⣯⢵⣣⢷⣹⣿⡷⣽⣎⣿⣧⢿⣯⣿⡿⣾⠏⢆⡓⢤⡉⢖⡨⡑⢆ ⣷⡽⣺⣝⠾⣭⣛⣮⢷⣫⡽⣛⡼⣫⡝⣧⢻⣬⢳⢭⡲⣍⠶⣡⠏⡶⣹⡞⣵⢮⣟⡶⣯⣛⣾⡽⣷⡹⢎⣿⣿⣽⣷⣿⢿⣼⣻⣿⣿⢿⠏⡜⢢⢍⡒⠜⡢⡑⡜⢂ ⡵⣹⠳⣞⣻⢧⠿⣜⣧⢯⣷⣯⢷⣳⣽⣚⠷⣎⡟⣮⢳⣎⢷⣣⣛⡴⢣⡜⣩⠝⣚⠿⡹⢭⢏⡿⣶⡹⡭⣿⣯⣿⣿⠿⣛⠻⢿⣿⣿⣿⡘⣌⢣⠒⣌⢣⠱⡑⣌⠣ ⢫⡵⣛⡼⢣⡟⣯⢻⡼⢳⢮⡛⢿⢳⣟⡾⣯⢷⣹⣎⠷⣎⢧⡳⣍⡞⢧⡛⣖⢫⡜⢶⡱⣍⢮⡜⣡⢍⡱⣛⢭⡱⢦⡳⢬⣙⠶⣘⡛⢷⡘⢤⠣⢍⢆⢣⢣⠱⣌⠲ ⣟⡴⣣⡝⢧⡝⢮⣛⡜⣣⢎⡽⣌⠧⣎⡹⢫⠿⣳⣯⣟⡾⣧⢷⣺⡜⣧⡽⣬⢳⠜⣣⠚⣌⠱⡌⡱⢊⠥⣉⠞⡹⢿⡝⢦⣽⢢⠅⣏⠻⡜⢢⡙⡌⢎⢆⢣⠓⠤⠓ ⣯⣝⡳⣎⣗⡚⢧⡳⣜⡱⣎⠶⣭⢞⡶⠽⠧⠟⡶⢭⣻⡽⣯⣟⣳⣟⡷⢫⡱⣃⠞⡤⢋⠤⡓⢬⡑⣎⠶⣱⢮⡱⣣⣞⡧⣛⣬⣳⡌⢣⢍⠢⡑⢌⠢⠌⡂⠜⢠⠃ ⡷⣎⢷⡹⣎⢿⣹⠷⣜⡱⣭⢟⡎⡞⡴⣉⠎⡵⡘⢦⢡⠹⣑⡛⢬⡳⣜⢣⠳⣥⢋⠶⣉⢖⣩⢒⡹⢌⠯⡝⢶⡿⣣⣗⡷⡽⣞⣳⣭⣳⠌⢆⡑⢢⠘⡄⠱⡈⢄⠂ ⡿⣜⢧⡻⣜⢧⡻⣝⣮⢷⡘⢯⡜⡱⢜⢢⡙⠴⣉⢆⢣⡙⣤⠛⢦⣛⡬⢏⡷⢪⡝⢮⡱⢎⢆⠧⣘⠬⡒⣍⢲⡙⢷⣸⢞⡷⣯⡟⣯⢳⡿⢂⠜⡠⢃⠌⡱⠐⡌⢂ ⣷⡹⣎⢷⡹⢎⣽⣋⢯⡹⣜⢣⡜⡱⢊⠦⡙⢦⡑⢎⠦⡱⢆⡛⢦⣛⡼⣫⢞⣧⣛⢮⡵⣋⠞⣬⢱⡊⡵⡘⢦⡙⠦⣍⢚⡼⣱⢏⡟⣫⢆⠱⡨⢐⠡⢊⠔⡡⠘⡄ ⣳⢧⢻⡼⣳⡭⢶⡹⢮⡕⣎⠧⢎⡵⣉⠖⡩⢆⡹⢌⠶⣙⢬⡙⣦⢣⡟⣵⢯⣶⣛⡞⡶⣭⣛⡴⢣⠳⣥⠛⡴⣩⢓⢬⢚⡜⢣⢏⠼⣡⢎⡱⢢⢍⢢⠁⢎⠰⡁⠆ ⡿⣜⣣⣽⢗⡻⢳⣹⢣⢞⡬⢳⣩⠒⣥⢚⡱⢊⡴⢋⡼⣘⢦⢻⡴⣻⣼⢯⡿⣾⡽⣹⡗⣧⢯⣜⢯⡳⣬⣛⡴⢣⢏⡞⡜⣬⢃⢎⠳⣌⢮⡱⢃⡎⢦⡙⢦⠑⡌⣂ ⣾⡰⢧⣟⢮⢵⣫⢖⡏⣞⡜⣣⢖⡹⢤⠳⣘⢇⡞⡱⢎⡵⣋⢷⣹⢳⣞⣻⢽⣳⣟⣷⣻⡽⣞⡽⣎⢷⡳⣎⢷⢫⡞⡼⡱⢆⡫⣌⠳⡜⢦⡝⢣⠞⣢⡙⢆⢣⠒⡌ ⣗⣯⡷⣹⢮⡳⣎⢷⡹⣎⡼⡱⢎⡵⣊⠷⣩⠞⡼⣱⢫⢶⡹⣎⢷⣫⢾⣭⢿⣳⣟⣾⣳⢿⡽⣯⡽⣣⢟⡼⣋⡧⣝⠶⣙⢮⡑⣎⢳⡙⣦⠍⣇⢫⠴⣙⠬⡒⢩⡐ ⣿⢾⣟⡯⢷⣝⡮⢷⣹⢶⣙⢧⡻⣴⢋⡞⣥⢻⡜⣧⣛⣮⢷⣫⢷⣫⣟⡾⣯⢷⣞⡷⣿⣟⣿⣣⢟⡽⣎⢷⡹⢎⣧⢛⡜⡦⡝⣬⢣⡝⢦⢋⡔⢣⠚⡄⠓⡌⢅⠂ ⣿⣻⡼⡽⣏⡾⣝⡿⣜⣧⢻⣎⡷⣭⡻⣜⣳⣏⣾⣳⡽⣞⣯⣳⢯⢶⣯⣽⣯⣟⣾⣻⣿⡽⣶⣛⢮⢳⡎⢷⣩⢏⠶⣩⢞⣱⡙⡦⢏⡼⣋⠖⣌⠣⢍⠢⡑⢌⣂⠣ ⣷⣳⡽⣽⣫⣽⣻⣼⣻⣼⣻⢞⡷⣯⡽⣯⢷⣞⡷⣯⢿⣽⣞⡷⣯⣟⣾⣽⣾⣻⣾⣿⢯⣟⢶⡹⣎⣗⢺⢣⡞⡼⣩⣓⢮⢲⣍⡳⢏⡞⣥⢋⠤⢋⠬⡱⡘⠔⠢⡅ ⣷⣻⢞⣷⣛⡾⣵⣳⣟⡾⣽⢯⣟⣷⣻⣽⣻⢾⣽⣟⣿⣻⣾⣿⣟⣾⣿⣽⣷⣿⣻⣯⣟⢮⡳⣝⠶⣪⢭⣓⢮⠵⡳⡜⣮⠳⣜⡝⣮⡝⡦⢽⣅⢋⢆⠱⣈⢎⡱⢄ ⣷⢯⣟⡾⣽⣻⢷⣻⢾⡽⣯⣟⣾⣳⢟⡾⣽⣻⢾⡽⣞⡿⣽⣿⣿⣿⣾⣿⣯⣿⣿⣳⢏⡷⣝⢮⣛⣥⢳⣎⣏⢾⡱⣛⡴⡻⣜⡞⣵⢺⢩⠃⢏⡸⢌⢒⡡⢂⠖⣈ ⣯⣟⡾⣽⣳⢯⡿⣽⢯⣟⣷⢻⣞⣭⢿⣹⠶⣏⡿⣽⢯⣟⡿⣿⣿⣿⣿⣿⣿⣿⢷⣯⣛⢾⡹⣎⠷⣎⢷⡺⣜⢧⣛⣥⢻⡵⣣⢟⡼⣋⠦⡙⠰⢂⠎⠢⠔⡡⢊⠄ ⡿⣽⣻⢷⣯⠿⣽⣳⣟⡾⣞⠿⣼⢎⡷⣭⢻⡞⣽⣳⣟⡾⣿⣿⣿⣿⣽⡷⢾⣽⣻⢶⣫⣗⣻⣜⡻⣜⢧⡻⣜⢧⡻⣜⡳⣞⡵⣫⢞⣥⣶⣷⣿⣶⣿⣿⣿⣿⣿⣿`.trim(); const SCROLL_RESET_DELAY = 500; //==================================================================================================== function $(x, e = document.body) { return e.querySelector(x); } function parseDOM(html) { const parsed = new DOMParser().parseFromString(html, 'text/html').body; return parsed.children.length > 1 ? parsed : parsed.firstElementChild; } const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36'; function fetchCustomUA(url, ua = MOBILE_UA) { const headers = new Headers({ "User-Agent": ua }); return fetch(url, { headers }); } function fetchHtml(url) { return fetch(url).then((r) => r.text()).then((h) => parseDOM(h)); } function fetchMobHtml(url) { return fetchCustomUA(url).then((r) => r.text()).then((h) => parseDOM(h)); } //==================================================================================================== class Observer { constructor(callback) { this.callback = callback; this.observer = new IntersectionObserver(this.handleIntersection.bind(this)); } observe(target) { this.observer.observe(target); } throttle(target, throttleTime) { this.observer.unobserve(target); setTimeout(() => this.observer.observe(target), throttleTime); } handleIntersection(entries) { for (const entry of entries) { if (entry.isIntersecting) { this.callback(entry.target); } } } static observeWhile(target, callback, throttleTime) { const observer_ = new Observer(async (target) => { const condition = await callback(); if (condition) observer_.throttle(target, throttleTime); }); observer_.observe(target); return observer_; } } //==================================================================================================== class MOTHERLESS_RULES { PAGINATION_TAG = '.pagination_link'; CONTAINER_TAG = '.content-inner'; THUMB_TAG = '.thumb-container'; THUMB_TAG_ = 'thumb-container'; THUMB_PREVIEW_TAG = 'static'; GALLERIES_TAG = '.media-related-galleries'; GALLERY_TAG = '.gallery-container'; GALLERY_MOB_TAG = '.ml-gallery-thumb'; GROUP_TAG = '.group-minibio'; constructor() { console.log('motherless script'); this.PAGINATION = $(this.PAGINATION_TAG); this.PAGINATION_LAST = parseInt(this.PAGINATION?.lastElementChild.previousElementSibling.innerText); this.CONTAINER = $(this.CONTAINER_TAG); } URL_DATA() { const { origin, pathname, search, href } = window.location; const url = new URL(href); const offset = parseInt(url.searchParams.get('page')) || 1; const iteratable_url = (n) => { url.searchParams.set('page', n); return url.href; } return { offset, iteratable_url } } } const RULES = new MOTHERLESS_RULES(); //==================================================================================================== function resetjs() { // restart preview listener const script = Array.from(document.scripts).filter(s => s.src.includes('index_full'))[0]; unsafeWindow.$("a, div, span, ul, li, p, button").off(); unsafeWindow.$.getScript(script.src); } //==================================================================================================== function handleLoadedHTML(nextPageHTML, container) { const thumbs = nextPageHTML.querySelectorAll(RULES.THUMB_TAG); for (const thumb of thumbs) { container.appendChild(thumb); } resetjs(); } //==================================================================================================== class PaginationPageManager { constructor() { //if (!RULES.PAGE_HAS_VIDEO) return; //const container = RULES.PAGINATION || RULES.PAGE_HAS_VIDEO.parentElement; handleLoadedHTML(document.body, RULES.CONTAINER); //previewManager.listen(container.parentElement); //stateLocale.pagIndexLast = RULES.PAGINATION_LAST; //if (!RULES.PAGINATION) return; //RULES.PAGINATION.style.opacity = 0; this.paginationGenerator = this.createNextPageGenerator(); this.paginationObserver = Observer.observeWhile(RULES.PAGINATION, this.generatorConsume, SCROLL_RESET_DELAY); } generatorConsume = async () => { const { value: { url, offset } = {}, done, } = this.paginationGenerator.next(); if (!done) { console.log(url); const nextPageHTML = await fetchHtml(url); const prevScrollPos = document.documentElement.scrollTop; handleLoadedHTML(nextPageHTML, RULES.CONTAINER); //stateLocale.pagIndexCur = offset; window.scrollTo(0, prevScrollPos); } return !this.generatorDone; } createNextPageGenerator() { const { offset, iteratable_url } = RULES.URL_DATA(); //stateLocale.pagIndexCur = offset; function* nextPageGenerator() { for (let c = offset + 1; c <= RULES.PAGINATION_LAST; c++) { const url = iteratable_url(c); yield { url, offset: c }; } } return nextPageGenerator(); } } //==================================================================================================== function fixGalleriesURLs() { const galleries = Array.from(document.querySelectorAll(('.gallery-container .info span:first-child'))); galleries.forEach(s => { const videosCount = parseInt(s.innerText); const header = videosCount > 0 ? '/GV' : '/GI'; const href = s.parentElement.parentElement.href.replace(/\/G/, () => header); s.parentElement.parentElement.href = href; s.parentElement.parentElement.parentElement.previousElementSibling.href = href; }); } //==================================================================================================== function displayAll() { $(RULES.GROUP_TAG).attr('style', 'display: block !important'); $(RULES.GALLERY_TAG).attr('style', 'display: block !important'); } function copyAttributes(target, source) { for (const attr of source.attributes) { target.setAttribute(attr.nodeName, attr.nodeValue); } } function replaceElementTag(e, tagName) { const newTagElement = document.createElement(tagName); copyAttributes(newTagElement, e); newTagElement.innerHTML = e.innerHTML; e.parentNode.replaceChild(newTagElement, e); } function mobileGalleryToDesktop(e) { e.firstElementChild.nextElementSibling.nextElementSibling.remove(); e.firstElementChild.appendChild(e.firstElementChild.nextElementSibling); e.className = 'thumb-container gallery-container'; e.firstElementChild.className = 'desktop-thumb image medium'; e.firstElementChild.firstElementChild.nextElementSibling.className = 'gallery-captions'; replaceElementTag(e.firstElementChild.firstElementChild, 'a'); } async function desktopAddMobGalleries() { const galleries = $(RULES.GALLERIES_TAG); if (galleries) { const galleriesContainer = galleries.firstElementChild.nextElementSibling.firstElementChild; const galleriesCount = galleries.querySelectorAll(RULES.GALLERY_TAG).length; const mobDom = await fetchMobHtml(window.location.href); const mobGalleries = mobDom.querySelectorAll(RULES.GALLERY_MOB_TAG); for (const [i, x] of mobGalleries.entries()) { if (i > galleriesCount - 1) { mobileGalleryToDesktop(x); galleriesContainer.appendChild(x); } } displayAll(); } } //==================================================================================================== (async () => { 'use strict'; console.clear(); console.log(LOGO); await desktopAddMobGalleries(); fixGalleriesURLs(); if (RULES.PAGINATION) { const manager = new PaginationPageManager(); } })();