Greasy Fork is available in English.

OpEx Countdown Skip

A small script to skip the silly countdown of One Piece Ex website

スクリプトをインストールするには、Tampermonkey, GreasemonkeyViolentmonkey のような拡張機能のインストールが必要です。

You will need to install an extension such as Tampermonkey to install this script.

スクリプトをインストールするには、TampermonkeyViolentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、TampermonkeyUserscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください
// ==UserScript==
// @name        OpEx Countdown Skip
// @name:pt-BR  OpEx Pula Tempo de Espera
// @autor       SecretX
// @namespace   namespace_secretx
// @description A small script to skip the silly countdown of One Piece Ex website
// @description:pt-br Um pequeno script para pular o contador irritante do site OpEx
// @version     2022.11.16
// @match       *://onepiecex.*/download/?*
// @match       *://onepieceex.*/download/?*
// @match       *://onepiecex.*/dw/*/*/*/*
// @match       *://onepieceex.*/dw/*/*/*/*
// @run-at      document-start
// @grant       GM.xmlHttpRequest
// @icon        https://onepieceex.net/favicon/favicon-32x32.png
// @license     GNU LGPLv3
// ==/UserScript==

const opexTorrentRegex = /^\w+:\/\/onepiecee?x\.\w+\/download\/\?\d+$/i;
const opexServerRegex = /^\w+:\/\/onepiecee?x\.\w+\/dw\/(?:\d+\/?)+$/i;

Object.defineProperty(Array.prototype, "firstNotNull", {
    value: function firstNotNull() {
        for (const element of this) if (element != null) return element;
        throw new Error("Array contains no non null element.");
    },
    writable: true,
    configurable: true
});

function isDownloadFromOpexServer() {
    const url = window.location.href;
    return opexServerRegex.test(url);
}

function isDownloadFromTorrentServer() {
    const url = window.location.href;
    return opexTorrentRegex.test(url);
}

// Torrent protector bypass methods

const countElem = () => document.getElementById("contador");

const awaitElem = () => document.getElementById("aguarde");

const countdownScript = () => document.querySelector("body > script:nth-child(4)").innerText;

function firstScriptLineThatMatches(regex) {
    return countdownScript().split("\n")
        .map(line => line.trim().match(regex))
        .firstNotNull();
}

function bypassTorrentProtector() {
    const magnetLinkRegex = /^.+?href="(magnet[^"]+)".*$/i;

    try {
        const magnetLink = firstScriptLineThatMatches(magnetLinkRegex)[1];
        console.info(`Automatically redirecting you to the extracted magnet link from this page: ${magnetLink}`);
        haltAllPageIntervals();
        try {
            countElem().remove();
            awaitElem().innerText = "Protetor desativado =)";
        } catch (e) {}
        window.location.replace(magnetLink);
    } catch (e) {
        console.error(`Oops, this script was not able to automatically grab the magnet link from this page because of an error. Using fallback that set the countdown to 1. ${e}`);
        countElem().innerHTML = 1;
    }
}

// Opex protector bypass methods

function doRequest(httpMethod, url) {
    const hostRegex = /\w+:\/\/((?:\w+\.?)+)/;

    return new Promise((resolve, reject) => {
        GM.xmlHttpRequest({
            method: httpMethod.toUpperCase(),
            url: url,
            onload: resolve,
            onerror: reject,
            responseType: "text",
            timeout: 6000,
            headers: {
                "Accept": "application/json, text/javascript, */*; q=0.01",
                "Accept-Encoding": "gzip, deflate, br",
                "Accept-Language": "en-US,en;q=0.5",
                "Cache-Control": "no-cache",
                "Connection": "keep-alive",
                "DNT": "1",
                "Host": url.match(hostRegex)[1],
                "Origin": window.location.origin,
                "Referer": window.location.origin,
                "Pragma": "no-cache",
                "Sec-Fetch-Dest": "empty",
                "Sec-Fetch-Mode": "cors",
                "Sec-Fetch-Site": "cross-site",
            }
        });
    });
}

function haltAllPageIntervals() {
    // Get a reference to the last interval + 1
    const interval_id = window.setInterval(function(){}, Number.MAX_SAFE_INTEGER);

    // Clear any timeout/interval up to that id
    for (let i = 1; i < interval_id; i++) {
        window.clearInterval(i);
    }
}

function bypassOpexServerProtector() {
    const scriptRegex = /https?:\/\/(?:\w+\.?)+\/\?code=[^'"]+/i;

    const requestUrl = Array.from(document.querySelector("head").children)
        .filter(node => node.nodeName === "SCRIPT")
        .map(node => node.innerText)
        .filter(script => script != null && script.length > 0)
        .map(script => script.match(scriptRegex))
        .firstNotNull()[0];

    if (requestUrl == null || typeof requestUrl !== "string") {
        console.error("Oops, this script was not able to automatically grab the request URL from the header.");
        return;
    }

    doRequest("GET", requestUrl)
        .then(response => {
            try {
                const downloadLink = JSON.parse(response.responseText).link;

                haltAllPageIntervals();
                const loadingDiv = document.getElementById("andamento");
                loadingDiv.setAttribute("style", "width: 100%; background: rgba(65, 26, 26, 0.9) none repeat scroll 0% 0%; display: block !important;");

                const messageButton = document.getElementById("mensagem");
                messageButton.innerText = "Protetor desativado =)"

                const downloadButton = document.getElementById("link");
                downloadButton.href = downloadLink;
                downloadButton.innerText = "Baixar";
                downloadButton.setAttribute("style", "display: inline !important;");
            } catch (e) {
                console.error(`Could not bypass page. Requested URL ${requestUrl}. Status code: ${response.status}. Server response: ${response.responseText}`, e);
            }
        })
        .catch(e => console.error(`Could not bypass page. Requested URL ${requestUrl}`, e));
}

window.addEventListener("DOMContentLoaded", function() {
    'use strict';

    if (isDownloadFromTorrentServer()) {
        bypassTorrentProtector();
    } else if (isDownloadFromOpexServer()) {
        bypassOpexServerProtector();
    }
}, false);