Greasy Fork

Greasy Fork is available in English.

DM5 动漫屋滚动阅读

DM5 动漫屋滚动阅读,展示章节内的所有图片。如果空间允许,会将图片从右到左排列。点击图片切换至下一张。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name          DM5 动漫屋滚动阅读
// @namespace     https://github.com/fym998/
// @description   DM5 动漫屋滚动阅读,展示章节内的所有图片。如果空间允许,会将图片从右到左排列。点击图片切换至下一张。
// @run-at        document-end
// @match         *://www.dm5.com/m*/
// @match         *://www.dm5.cn/m*/
// @exclude-match *://www.dm5.com/manhua-*/
// @exclude-match *://www.dm5.cn/manhua-*/
// @version       1.1.11
// @author        fym998
// @license       GPL-3.0-or-later
// @supportURL    https://github.com/fym998/dm5.user.js/issues
// @icon          https://www.dm5.com/favicon.ico
// @require       https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2
// @require       https://cdn.jsdelivr.net/npm/@violentmonkey/[email protected]
// @require       https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2/dist/solid.min.js
// ==/UserScript==

(function (web, solidJs) {
'use strict';

function styleInject(css, ref) {
  if ( ref === void 0 ) ref = {};
  var insertAt = ref.insertAt;

  if (!css || typeof document === 'undefined') { return; }

  var head = document.head || document.getElementsByTagName('head')[0];
  var style = document.createElement('style');
  style.type = 'text/css';

  if (insertAt === 'top') {
    if (head.firstChild) {
      head.insertBefore(style, head.firstChild);
    } else {
      head.appendChild(style);
    }
  } else {
    head.appendChild(style);
  }

  if (style.styleSheet) {
    style.styleSheet.cssText = css;
  } else {
    style.appendChild(document.createTextNode(css));
  }
}

var css_248z$1 = ".view-paging{display:none}.rightToolBar{display:flex;opacity:.6;&>a{align-items:center;display:flex!important;float:unset;font-weight:700}&>a.logo_3{display:none}}#cp_image{display:none!important}#barChapter>img{border:1px solid;cursor:unset!important}";
styleInject(css_248z$1);

var css_248z = ".style-module_imageflow__-PH8J{align-items:center;display:flex;flex-direction:row-reverse;flex-wrap:wrap;justify-content:center;&>img{border:1px solid;display:block;flex-shrink:1;margin:.5em .25em;max-width:100%;min-height:30vh;min-width:30vw}&>img:not(:last-child){cursor:pointer}}";
var styles = {"imageflow":"style-module_imageflow__-PH8J"};
styleInject(css_248z);

var _tmpl$ = /*#__PURE__*/web.template(`<div>`),
  _tmpl$2 = /*#__PURE__*/web.template(`<img loading=lazy>`);
// stylesheet;

async function fetchImageURLs() {
  const count = DM5_IMAGE_COUNT;
  const ret = Array(count + 1);
  const params = new URLSearchParams({
    cid: DM5_CID.toString(),
    key: document.querySelector('#dm5_key').value,
    language: 1 .toString(),
    gtk: 6 .toString(),
    _cid: DM5_CID.toString(),
    _mid: DM5_MID.toString(),
    _dt: DM5_VIEWSIGN_DT.toString(),
    _sign: DM5_VIEWSIGN.toString()
  });
  for (let i = 1; i <= count; i++) {
    if (ret[i]) continue;
    params.set('page', i.toString());
    const code = await (await fetch(`chapterfun.ashx?${params.toString()}`)).text();
    const URLs = eval(code);
    console.log(params.toString(), URLs);
    URLs.forEach(URL => {
      const page = Number(URL.match(/\/(\d+)_/)[1]);
      ret[page] = URL;
    });
  }
  return ret;
}
function setHistory(page) {
  SetReadHistory(DM5_CID, DM5_MID, page, DM5_USERID);
}
function goToPage(index) {
  window.location.hash = `#ipg${index}`;
}
const ImageFlow = () => {
  const [imageURLs] = solidJs.createResource(fetchImageURLs);
  const imageCount = DM5_IMAGE_COUNT;
  const [currentPage, setCurrentPage] = solidJs.createSignal(DM5_PAGE);
  solidJs.createEffect(() => {
    if (imageURLs()) {
      goToPage(currentPage());
      setHistory(currentPage());
    }
  });
  return (() => {
    var _el$ = _tmpl$();
    web.insert(_el$, web.createComponent(solidJs.For, {
      get each() {
        return imageURLs();
      },
      children: (URL, i) => web.createComponent(solidJs.Show, {
        when: URL,
        get children() {
          var _el$2 = _tmpl$2();
          _el$2.addEventListener("load", () => {
            if (currentPage() === i()) goToPage(i());
          });
          _el$2.$$click = () => {
            if (i() < imageCount) setCurrentPage(i() + 1);
          };
          web.setAttribute(_el$2, "src", URL);
          web.effect(_p$ => {
            var _v$ = `ipg${i()}`,
              _v$2 = `page ${i()}`,
              _v$3 = `page ${i()}`;
            _v$ !== _p$.e && web.setAttribute(_el$2, "id", _p$.e = _v$);
            _v$2 !== _p$.t && web.setAttribute(_el$2, "alt", _p$.t = _v$2);
            _v$3 !== _p$.a && web.setAttribute(_el$2, "title", _p$.a = _v$3);
            return _p$;
          }, {
            e: undefined,
            t: undefined,
            a: undefined
          });
          return _el$2;
        }
      })
    }));
    web.effect(() => web.className(_el$, styles.imageflow));
    return _el$;
  })();
};
const container = document.querySelector('#cp_img, #barChapter');
container.removeAttribute('oncontextmenu');
container.parentElement.removeAttribute('oncontextmenu');
if (container.id === 'cp_img') {
  web.render(ImageFlow, container);
} else if (container.id === 'barChapter') {
  container.querySelectorAll('img').forEach(img => {
    img.removeAttribute('onclick');
  });
}
document.querySelector('footer').style.display = 'none';
const backAnchorHTML = `
<a href=${document.querySelector('a.back').href}>
  <div>退出</div>
</a>`;
document.querySelector('.rightToolBar').insertAdjacentHTML('afterbegin', backAnchorHTML);
const metaViewPointHTML = `<meta name="viewport" content="width=device-width, initial-scale=1">`;
document.head.insertAdjacentHTML('afterbegin', metaViewPointHTML);
web.delegateEvents(["click"]);

})(VM.solid.web, VM.solid);