Initial push (copy from private UserScripts)
Some checks are pending
Node.js CI / build (push) Waiting to run
Some checks are pending
Node.js CI / build (push) Waiting to run
This commit is contained in:
commit
81b336ff1a
13 changed files with 3586 additions and 0 deletions
8
.babelrc
Normal file
8
.babelrc
Normal file
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"presets": [
|
||||
"@babel/preset-env"
|
||||
],
|
||||
"plugins": [
|
||||
["inline-json", {}]
|
||||
]
|
||||
}
|
46
.forgejo/workflows/nodejs-ci.yml
Normal file
46
.forgejo/workflows/nodejs-ci.yml
Normal file
|
@ -0,0 +1,46 @@
|
|||
name: Node.js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
schedule:
|
||||
- cron: "0 0 */1 * *" # Every day at midnight UTC
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '21.5.0'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
|
||||
- name: Build project
|
||||
run: npm run build
|
||||
|
||||
- name: Temporarily allow build directory
|
||||
run: |
|
||||
sed -i '/^build\//d' .gitignore
|
||||
|
||||
- name: Stage build artifacts
|
||||
run: |
|
||||
git add build/
|
||||
git restore --staged .gitignore
|
||||
|
||||
- name: Commit and push changes
|
||||
run: |
|
||||
git config --global user.name 'forgejo-actions[bot]'
|
||||
git config --global user.email 'forgejo-actions[bot]@forgejo.localhost'
|
||||
git commit -m 'Build and commit changes'
|
||||
git push
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
node_modules
|
||||
build/
|
4
.prettierrc
Normal file
4
.prettierrc
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"tabWidth": 2,
|
||||
"useTabs": false
|
||||
}
|
197
build.js
Normal file
197
build.js
Normal file
|
@ -0,0 +1,197 @@
|
|||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const http = require("http");
|
||||
const https = require("https");
|
||||
const { execSync } = require("child_process");
|
||||
|
||||
const srcDir = "src";
|
||||
const outDir = "build";
|
||||
|
||||
const downloads = [
|
||||
{
|
||||
url: "https://coomer.su/api/v1/creators.txt",
|
||||
out: path.join(srcDir, "coomer.su.json"),
|
||||
dont_redownload: true,
|
||||
after: function (pathd) {
|
||||
let data = fs.readFileSync(pathd, "utf8");
|
||||
let creators = JSON.parse(data);
|
||||
let newCreators = {};
|
||||
for (let i = 0; i < creators.length; i++) {
|
||||
/*
|
||||
{"id":"carbcollector","name":"carbcollector","service":"onlyfans","indexed":1703401003,"updated":1705076060,"favorited":19}
|
||||
*/
|
||||
let creator = creators[i];
|
||||
let id = creator.id;
|
||||
let service = creator.service;
|
||||
let name = creator.name;
|
||||
let creatorObj = {
|
||||
id: id,
|
||||
name: name,
|
||||
};
|
||||
if (newCreators[service] === undefined) {
|
||||
newCreators[service] = [];
|
||||
}
|
||||
newCreators[service].push(creatorObj);
|
||||
}
|
||||
let ret = JSON.stringify(newCreators);
|
||||
fs.writeFileSync(path.join(srcDir, "coomer.su-modded.json"), ret);
|
||||
console.log(
|
||||
"coomer.su-modded.json is " +
|
||||
(data.length - ret.length) +
|
||||
" smaller, roughly " +
|
||||
Math.round(((data.length - ret.length) / data.length) * 100) +
|
||||
"%"
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
url: "https://kemono.su/api/v1/creators.txt",
|
||||
out: path.join(srcDir, "kemono.su.json"),
|
||||
dont_redownload: true,
|
||||
after: function (pathd) {
|
||||
let data = fs.readFileSync(pathd, "utf8");
|
||||
let creators = JSON.parse(data);
|
||||
let newCreators = {};
|
||||
for (let i = 0; i < creators.length; i++) {
|
||||
/*
|
||||
{"id":"carbcollector","name":"carbcollector","service":"onlyfans","indexed":1703401003,"updated":1705076060,"favorited":19}
|
||||
*/
|
||||
let creator = creators[i];
|
||||
let id = creator.id;
|
||||
let service = creator.service;
|
||||
if (service === "discord") continue;
|
||||
let name = creator.name;
|
||||
let creatorObj = {
|
||||
id: id,
|
||||
name: name,
|
||||
};
|
||||
if (newCreators[service] === undefined) {
|
||||
newCreators[service] = [];
|
||||
}
|
||||
newCreators[service].push(creatorObj);
|
||||
}
|
||||
let ret = JSON.stringify(newCreators);
|
||||
fs.writeFileSync(path.join(srcDir, "kemono.su-modded.json"), ret);
|
||||
console.log(
|
||||
"kemono.su-modded.json is " +
|
||||
(data.length - ret.length) +
|
||||
" smaller, roughly " +
|
||||
Math.round(((data.length - ret.length) / data.length) * 100) +
|
||||
"%"
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
function getRemoteFile(file, url) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let localFile = fs.createWriteStream(file);
|
||||
const client = url.startsWith("https") ? https : http;
|
||||
const request = client.get(url, function (response) {
|
||||
// var len = parseInt(response.headers['content-length'], 10);
|
||||
// var cur = 0;
|
||||
// var total = len / 1048576; //1048576 - bytes in 1 Megabyte
|
||||
|
||||
// response.on('data', function(chunk) {
|
||||
// cur += chunk.length;
|
||||
// showProgress(file, cur, len, total);
|
||||
// });
|
||||
|
||||
response.on("end", function () {
|
||||
console.log("[" + url + "] Download complete => " + file);
|
||||
resolve();
|
||||
});
|
||||
|
||||
response.pipe(localFile);
|
||||
localFile.on("finish", () => localFile.close());
|
||||
localFile.on("error", (err) => {
|
||||
fs.unlink(file); // Delete the file async if there's an error
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
|
||||
request.on("error", (err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function downloadFiles() {
|
||||
for (let i = 0; i < downloads.length; i++) {
|
||||
let download = downloads[i];
|
||||
let file = download.out;
|
||||
let url = download.url;
|
||||
if (download.dont_redownload) {
|
||||
if (fs.statSync(file).isFile()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
await getRemoteFile(file, url);
|
||||
download.after(file);
|
||||
}
|
||||
}
|
||||
|
||||
async function buildScript(scriptPath) {
|
||||
const scriptName = path.basename(scriptPath, ".user.js");
|
||||
const metaPath = path.join(srcDir, `${scriptName}.meta.js`);
|
||||
const outPath = path.join(outDir, `${scriptName}.user.js`);
|
||||
const tempPath = path.join(outDir, `${scriptName}.user.temp.js`);
|
||||
const minifiedPath = path.join(outDir, `${scriptName}.min.user.js`);
|
||||
|
||||
if (!fs.existsSync(metaPath)) {
|
||||
console.error(`Meta file not found: ${metaPath}`);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`Compiling ${scriptPath}`);
|
||||
// Compile the script with Babel
|
||||
execSync(`npx babel ${scriptPath} -o ${tempPath}`);
|
||||
|
||||
// Read and prepend the meta content
|
||||
let metaContentOriginal = fs
|
||||
.readFileSync(metaPath, "utf8")
|
||||
.replace(/{{UNIXDATE}}/gim, Date.now());
|
||||
let metaContent = metaContentOriginal.replace(
|
||||
/{{FILE_URL}}/gim,
|
||||
`https://git.bowu.dev/bowu/UserScripts/raw/branch/main/build/${scriptName}.user.js`
|
||||
);
|
||||
let metaMiniContent = metaContentOriginal.replace(
|
||||
/{{FILE_URL}}/gim,
|
||||
`https://git.bowu.dev/bowu/UserScripts/raw/branch/main/build/${scriptName}.min.user.js`
|
||||
);
|
||||
const scriptContent = fs.readFileSync(tempPath, "utf8");
|
||||
fs.writeFileSync(outPath, `${metaContent}\n${scriptContent}`);
|
||||
console.log(`Built: ${outPath}`);
|
||||
|
||||
// Minify the script while preserving comments in the meta file
|
||||
const Terser = require("terser");
|
||||
const minifiedResult = await Terser.minify(scriptContent, {
|
||||
output: {
|
||||
comments: false, // Do not keep comments in the minified output
|
||||
},
|
||||
});
|
||||
|
||||
if (minifiedResult.error) {
|
||||
console.error(`Error minifying script: ${minifiedResult.error}`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Prepend the meta content to the minified script
|
||||
fs.writeFileSync(minifiedPath, `${metaMiniContent}\n${minifiedResult.code}`);
|
||||
console.log(`Minified: ${minifiedPath}`);
|
||||
|
||||
fs.unlinkSync(tempPath);
|
||||
}
|
||||
|
||||
function buildAll() {
|
||||
const files = fs.readdirSync(srcDir);
|
||||
files.forEach((file) => {
|
||||
if (file.endsWith(".user.js")) {
|
||||
buildScript(path.join(srcDir, file));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
(async function () {
|
||||
await downloadFiles();
|
||||
buildAll();
|
||||
})();
|
3016
package-lock.json
generated
Normal file
3016
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
25
package.json
Normal file
25
package.json
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "userscripts",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"build": "node build.js",
|
||||
"watch": "chokidar 'src/**/*.js' -c 'npm run build'"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.24.8",
|
||||
"@babel/core": "^7.24.9",
|
||||
"@babel/preset-env": "^7.25.0",
|
||||
"babel-plugin-inline-json": "^2.1.0",
|
||||
"babel-plugin-inline-json-import": "^0.3.2",
|
||||
"chokidar-cli": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"babel-plugin-import-json-value": "^0.1.2",
|
||||
"terser": "^5.31.3"
|
||||
}
|
||||
}
|
1
src/coomer.su-modded.json
Normal file
1
src/coomer.su-modded.json
Normal file
File diff suppressed because one or more lines are too long
1
src/coomer.su.json
Normal file
1
src/coomer.su.json
Normal file
File diff suppressed because one or more lines are too long
17
src/free-porn.meta.js
Normal file
17
src/free-porn.meta.js
Normal file
|
@ -0,0 +1,17 @@
|
|||
// ==UserScript==
|
||||
// @name 🦜 We like free things / PORN edition
|
||||
// @namespace Bowud Scripts
|
||||
// @match https://boosty.to/*
|
||||
// @match https://candfans.jp/*
|
||||
// @match https://fansly.com/*
|
||||
// @match https://fantia.jp/*
|
||||
// @match https://onlyfans.com/*
|
||||
// @match https://patreon.com/*
|
||||
// @match https://www.patreon.com/*
|
||||
// @match https://*.gumroad.com/*
|
||||
// @match https://*.fanbox.cc/*
|
||||
// @match https://subscribestar.adult/*
|
||||
// @grant none
|
||||
// @downloadURL {{FILE_URL}}
|
||||
// @version {{UNIXDATE}}
|
||||
// ==/UserScript==
|
267
src/free-porn.user.js
Normal file
267
src/free-porn.user.js
Normal file
|
@ -0,0 +1,267 @@
|
|||
(function (coomerCreators, kemonoCreators) {
|
||||
const coomerDomain = "coomer.su";
|
||||
const kemonoDomain = "kemono.su";
|
||||
const config = {
|
||||
creators: {
|
||||
...coomerCreators,
|
||||
...kemonoCreators,
|
||||
},
|
||||
domains: {
|
||||
"onlyfans.com": [coomerDomain, "onlyfans"],
|
||||
"fansly.com": [coomerDomain, "fansly"],
|
||||
"candfans.jp": [coomerDomain, "candfans"],
|
||||
"patreon.com": [kemonoDomain, "patreon"],
|
||||
"fantia.jp": [kemonoDomain, "fantia"],
|
||||
"boosty.to": [kemonoDomain, "boosty"],
|
||||
"gumroad.com": [kemonoDomain, "gumroad"],
|
||||
"subscribestar.adult": [kemonoDomain, "subscribestar"],
|
||||
"fanbox.cc": [kemonoDomain, "fanbox"],
|
||||
},
|
||||
handlers: {
|
||||
onlyfans: () => {
|
||||
console.log("[🦜] onlyfans called");
|
||||
},
|
||||
fansly: () => {
|
||||
console.log("[🦜] fansly called");
|
||||
},
|
||||
candfans: () => {
|
||||
console.log("[🦜] candfans called");
|
||||
// Find an image with a similar url to this
|
||||
// data-src="https://image.candfans.jp/user/154310/profile/i0YW0NNR864lVp7s7dHYhfg25rqJgeLx2ulzAEMG.png"
|
||||
let imgs = document.querySelectorAll("img[data-src]");
|
||||
let pattern =
|
||||
/https:\/\/image\.candfans\.jp\/user\/(\d+)\/profile\/.*\.\w+/i;
|
||||
let id;
|
||||
for (let i = 0; i < imgs.length; i++) {
|
||||
let img = imgs[i];
|
||||
let src = img.getAttribute("data-src");
|
||||
let match = src.match(pattern);
|
||||
if (match) {
|
||||
id = match[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!id) return;
|
||||
let dd = figureDomain();
|
||||
let dCreators = config.creators[dd[1]];
|
||||
for (const key in dCreators) {
|
||||
if (Object.hasOwnProperty.call(dCreators, key)) {
|
||||
const creator = dCreators[key];
|
||||
if (creator.id === id) {
|
||||
clearInterval(looper);
|
||||
let dest = locationGen(dd[0], dd[1], id);
|
||||
if (confirm("Redirecting to " + dest)) {
|
||||
location.href = dest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
patreon: () => {
|
||||
console.log("[🦜] patreon called");
|
||||
let parsed = new URL(location.href);
|
||||
let id = parsed.searchParams.get("u");
|
||||
let dd = figureDomain();
|
||||
let dCreators = config.creators[dd[1]];
|
||||
for (const key in dCreators) {
|
||||
if (Object.hasOwnProperty.call(dCreators, key)) {
|
||||
const creator = dCreators[key];
|
||||
if (creator.id === id) {
|
||||
clearInterval(looper);
|
||||
let dest = locationGen(dd[0], dd[1], id);
|
||||
if (confirm("Redirecting to " + dest)) {
|
||||
location.href = dest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
fantia: () => {
|
||||
console.log("[🦜] fantia called");
|
||||
// https://fantia.jp/fanclubs/83679
|
||||
let parsed = new URL(location.href);
|
||||
let id = parsed.pathname.split("/")[2];
|
||||
clearInterval(looper);
|
||||
let dd = figureDomain();
|
||||
let dest = locationGen(dd[0], dd[1], id);
|
||||
if (confirm("Redirecting to " + dest)) {
|
||||
location.href = dest;
|
||||
}
|
||||
},
|
||||
boosty: () => {
|
||||
console.log("[🦜] boosty called");
|
||||
// https://boosty.to/temikmiu
|
||||
let parsed = new URL(location.href);
|
||||
let id = parsed.pathname.split("/")[1];
|
||||
clearInterval(looper);
|
||||
let dd = figureDomain();
|
||||
let dCreators = config.creators[dd[1]];
|
||||
for (const key in dCreators) {
|
||||
if (Object.hasOwnProperty.call(dCreators, key)) {
|
||||
const creator = dCreators[key];
|
||||
if (creator.id === id) {
|
||||
clearInterval(looper);
|
||||
let dest = locationGen(dd[0], dd[1], id);
|
||||
if (confirm("Redirecting to " + dest)) {
|
||||
location.href = dest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
gumroad: () => {
|
||||
console.log("[🦜] gumroad called");
|
||||
let id = JSON.parse(
|
||||
document.querySelector(`script[data-component-name="Profile"]`)
|
||||
.textContent
|
||||
).creator_profile.external_id;
|
||||
clearInterval(looper);
|
||||
let dd = figureDomain();
|
||||
let dCreators = config.creators[dd[1]];
|
||||
for (const key in dCreators) {
|
||||
if (Object.hasOwnProperty.call(dCreators, key)) {
|
||||
const creator = dCreators[key];
|
||||
if (creator.id === id) {
|
||||
clearInterval(looper);
|
||||
let dest = locationGen(dd[0], dd[1], id);
|
||||
if (confirm("Redirecting to " + dest)) {
|
||||
location.href = dest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
subscribestar: () => {
|
||||
console.log("[🦜] subscribestar called");
|
||||
// https://subscribestar.adult/slugbox
|
||||
let parsed = new URL(location.href);
|
||||
let id = parsed.pathname.split("/")[1];
|
||||
clearInterval(looper);
|
||||
let dd = figureDomain();
|
||||
let dCreators = config.creators[dd[1]];
|
||||
for (const key in dCreators) {
|
||||
if (Object.hasOwnProperty.call(dCreators, key)) {
|
||||
const creator = dCreators[key];
|
||||
if (creator.id === id) {
|
||||
clearInterval(looper);
|
||||
let dest = locationGen(dd[0], dd[1], id);
|
||||
if (confirm("Redirecting to " + dest)) {
|
||||
location.href = dest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
fanbox: () => {
|
||||
console.log("[🦜] fanbox called");
|
||||
// <script type="application/ld+json">[{"@context":"http:\/\/schema.org","@type":"CollectionPage","author":{"@type":"Person","name":"M\u3060S\u305f\u308d\u3046","url":"https:\/\/msmspc.fanbox.cc\/"},"description":"M\u3060S\u305f\u308d\u3046\u3067\u3059\u3002\u8910\u8272\u30a4\u30e9\u30b9\u30c8\u30ec\u30fc\u30bf\u30fc\u3068\u3057\u3066\u6d3b\u52d5\u3057\u3066\u304a\u308a\u307e\u3059\u3002\n\n\u3053\u3053\u3067\u306fR18 \u30e9\u30d5\u30fb\u4e0b\u66f8\u304d\u30fb\u3089\u304f\u304c\u304d\u30fb\u8584\u3044\u4fee\u6b63\u30fb\u540c\u4eba\u8a8c\u3092\u30d7\u30e9\u30f3\u5225\u306b\u898b\u3089\u308c\u307e\u3059\u3002\n\u4eca\u307e\u3067\u306b\u7121\u6148\u60b2\u306a\u4fee\u6b63\u3055\u308c\u305f\u300c\u8584\u3044\u4fee\u6b63\u753b\u50cf\u300d\u3092\u4e0a\u3052\u3066\u3044\u304d\u307e\u3059\u3002\npixiv\u898f\u5b9a\u306e\u7bc4\u56f2\u5185\u3067\u306e\u4fee\u6b63\u306a\u306e\u3067\u3054\u4e86\u627f\u304f\u3060\u3055\u3044\u307e\u3059\u3088\u3046\u304a\u9858\u3044\u81f4\u3057\u307e\u3059\u3002\n\n","headline":"M\u3060S\u305f\u308d\u3046","image":"https:\/\/pixiv.pximg.net\/c\/1200x630_90_a2_g5\/fanbox\/public\/images\/creator\/3316400\/cover\/mZXFThZDHXtQspHbtZGwBLTl.jpeg","mainEntityOfPage":"https:\/\/msmspc.fanbox.cc\/","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","height":"56","url":"https:\/\/s.pximg.net\/common\/image\/fanbox\/logo_s.png","width":"411"},"name":"pixivFANBOX"}},{"@context":"http:\/\/schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","item":{"@id":"https:\/\/msmspc.fanbox.cc\/","name":"M\u3060S\u305f\u308d\u3046"},"position":1}]}]</script>
|
||||
let el = document.querySelector("script[type='application/ld+json']");
|
||||
let dat = JSON.parse(el.textContent);
|
||||
// 'https://pixiv.pximg.net/c/1200x630_90_a2_g5/fanbox/public/images/creator/3316400/cover/mZXFThZDHXtQspHbtZGwBLTl.jpeg'
|
||||
// 3316400 = id
|
||||
let img = dat[0].image;
|
||||
let pattern =
|
||||
/https:\/\/.*\/fanbox\/public\/images\/creator\/(\d+)\/cover\/.*\.\w+/i;
|
||||
let match = img.match(pattern);
|
||||
if (!match) return;
|
||||
let id = match[1];
|
||||
let dd = figureDomain();
|
||||
let dCreators = config.creators[dd[1]];
|
||||
for (const key in dCreators) {
|
||||
if (Object.hasOwnProperty.call(dCreators, key)) {
|
||||
const creator = dCreators[key];
|
||||
if (creator.id === id) {
|
||||
clearInterval(looper);
|
||||
let dest = locationGen(dd[0], dd[1], id);
|
||||
if (confirm("Redirecting to " + dest)) {
|
||||
location.href = dest;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
function locationGen(domain, service, id) {
|
||||
let l = `https://${domain}/${service}/user/${id}`;
|
||||
return l;
|
||||
}
|
||||
function figureDomain() {
|
||||
for (const key in config.domains) {
|
||||
if (config.domains.hasOwnProperty(key)) {
|
||||
const domain = config.domains[key];
|
||||
if (location.host.endsWith("." + key) || location.host == key) {
|
||||
return domain;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
// coomerCreators = null; // This is to reduce memory costs
|
||||
// kemonoCreators = null; // This is to reduce memory costs
|
||||
// function fn() {
|
||||
// const domains = {
|
||||
// "onlyfans.com": [coomerDomain, "onlyfans"],
|
||||
// "fansly.com": [coomerDomain, "fansly"],
|
||||
// "candfans.jp": [coomerDomain, "candfans"],
|
||||
// "patreon.com": [kemonoDomain, "patreon"],
|
||||
// "fantia.jp": [kemonoDomain, "fantia"],
|
||||
// };
|
||||
// if (domains[location.host]) {
|
||||
// const service = domains[location.host][1];
|
||||
// let id = location.pathname.split("/")[2];
|
||||
// if (service === "candfans") {
|
||||
// // Find an image with a similar url to this
|
||||
// // data-src="https://image.candfans.jp/user/154310/profile/i0YW0NNR864lVp7s7dHYhfg25rqJgeLx2ulzAEMG.png"
|
||||
// let imgs = document.querySelectorAll("img[data-src]");
|
||||
// let pattern =
|
||||
// /https:\/\/image\.candfans\.jp\/user\/(\d+)\/profile\/.*\.\w+/i;
|
||||
// for (let i = 0; i < imgs.length; i++) {
|
||||
// let img = imgs[i];
|
||||
// let src = img.getAttribute("data-src");
|
||||
// let match = src.match(pattern);
|
||||
// if (match) {
|
||||
// id = match[1];
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// } else if (service === "patreon") {
|
||||
// // https://www.patreon.com/user?u=5564244
|
||||
// let parsed = new URL(location.href);
|
||||
// id = parsed.searchParams.get("u");
|
||||
// } else if (service == "fantia") {
|
||||
// // https://fantia.jp/fanclubs/83679
|
||||
// let parsed = new URL(location.href);
|
||||
// id = parsed.pathname.split("/")[2];
|
||||
// }
|
||||
// let dCreators = creators[domains[location.host]];
|
||||
// for (const key in dCreators) {
|
||||
// if (Object.hasOwnProperty.call(dCreators, key)) {
|
||||
// const creator = dCreators[key];
|
||||
// if (creator.id === id) {
|
||||
// clearInterval(looper);
|
||||
// let dest = locationGen(domains[location.host][0], service, id);
|
||||
// if (confirm("Redirecting to " + dest)) {
|
||||
// location.href = dest;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
function fn() {
|
||||
let dd = figureDomain();
|
||||
if (dd === null) return;
|
||||
let [destDomain, service] = dd;
|
||||
config.handlers[service]();
|
||||
}
|
||||
let looper = setInterval(fn, 1000);
|
||||
fn();
|
||||
})(require("./coomer.su-modded.json"), require("./kemono.su-modded.json"));
|
1
src/kemono.su-modded.json
Normal file
1
src/kemono.su-modded.json
Normal file
File diff suppressed because one or more lines are too long
1
src/kemono.su.json
Normal file
1
src/kemono.su.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue