commit
5e2c1fa812
@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
@ -0,0 +1,38 @@
|
|||||||
|
Pulls random images from lolibooru.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
require("hashloli").randomise(function(datas) {
|
||||||
|
if(!datas)
|
||||||
|
{
|
||||||
|
//Error
|
||||||
|
console.log(this.error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
datas.forEach(function(data) {
|
||||||
|
if(data) {
|
||||||
|
let file_url = data.file_url;
|
||||||
|
//Do stuff
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
randomise() can take a second argument to specify configuration. The default is
|
||||||
|
new require("hashloli").Config();
|
||||||
|
See randomise.js for an example.
|
||||||
|
|
||||||
|
Command line usage:
|
||||||
|
node randomise.js [--verbose] [--debug] [--range=<range>] [--number=<number>] [--page=<page>] [<tags ...>]
|
||||||
|
Echos either the file url or `undefined' if there was an error. Echos full data in JSON if --verbose is supplied, also prints debug and error messages if --debug is supplied.
|
||||||
|
The default range is 5.
|
||||||
|
The default number is 1.
|
||||||
|
The default (max) page is 150.
|
||||||
|
If the number exceeds the range then the range is set equal to the number.
|
||||||
|
|
||||||
|
More advanced example:
|
||||||
|
node randomise.js --verbose --page=10 --number=5 flandre_scarlet blush
|
||||||
|
|
||||||
|
Npm dependancies:
|
||||||
|
xmlhttprequest
|
@ -0,0 +1,113 @@
|
|||||||
|
const xhr = require("xmlhttprequest").XMLHttpRequest;
|
||||||
|
|
||||||
|
const API_URL = "https://lolibooru.moe/post/index.json";
|
||||||
|
|
||||||
|
/*function nodes_of(page, path) {
|
||||||
|
|
||||||
|
const document = parse5.parse(page);
|
||||||
|
const xhtml = xmlser.serializeToString(document);
|
||||||
|
const doc = new dom().parseFromString(xhtml);
|
||||||
|
const select = xpath.useNamespace({"x": "http://www.w3.org/1999/xhtml"});
|
||||||
|
return select(path, doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
function nodes(url, path, cb) {
|
||||||
|
|
||||||
|
const x = new xhr();
|
||||||
|
|
||||||
|
x.onreadystatechange = function() {
|
||||||
|
if(this.readyState===4) {
|
||||||
|
cb(nodes_of(this.responseText, path));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
x.open("GET", url);
|
||||||
|
x.send();
|
||||||
|
}*/
|
||||||
|
|
||||||
|
function query(limit, page, _tags) {
|
||||||
|
if(_tags)
|
||||||
|
{
|
||||||
|
var tags = _tags.join(" ");
|
||||||
|
}
|
||||||
|
return API_URL + "?limit="+limit+"&page="+page+(tags?"&tags="+encodeURIComponent(tags):"");
|
||||||
|
}
|
||||||
|
|
||||||
|
function rin(range) {
|
||||||
|
return Math.floor(Math.random() * (range-1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLoli(puts, number, range, page, tags, cb) {
|
||||||
|
var x = new xhr();
|
||||||
|
|
||||||
|
if(number==0) {
|
||||||
|
puts("Number was 0, returning");
|
||||||
|
cb([]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
x.onreadystatechange = function() {
|
||||||
|
if(this.readyState===4) {
|
||||||
|
let response = JSON.parse(this.responseText);
|
||||||
|
if(response) {
|
||||||
|
puts("Response okay");
|
||||||
|
if(number==1) {
|
||||||
|
let r = rin(range);
|
||||||
|
puts("Running on single (index "+r+")");
|
||||||
|
cb([response[r]]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let resp = Array.from({length: number}, (value,key) => key);
|
||||||
|
puts("Proto resp "+number+ " ar "+ JSON.stringify(resp));
|
||||||
|
for(let i = (number-1);i>=1;i--)
|
||||||
|
{
|
||||||
|
let v = resp[i];
|
||||||
|
let j = rin(i);
|
||||||
|
resp[i] = resp[j];
|
||||||
|
resp[j] = v;
|
||||||
|
}
|
||||||
|
puts("Running on multiple (indecies "+ resp.join(", ")+")");
|
||||||
|
cb(resp.map(v => response[v]));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
puts("Invalid response");
|
||||||
|
cb.error = "Invalid JSON from server";
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
x.open("GET", query(range, page, tags));
|
||||||
|
x.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
function randomiseWith(puts, number, range, maxPage, tags, cb) {
|
||||||
|
let page = Math.floor(Math.random() * (range-1));
|
||||||
|
puts("Using page "+page);
|
||||||
|
if(number > range || number<0) {
|
||||||
|
cb.error = "Invalid range";
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
getLoli(puts, number,range, page, tags, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Config() {
|
||||||
|
this.range = 5;
|
||||||
|
this.page = 150;
|
||||||
|
this.tags = undefined;
|
||||||
|
this.number = 1;
|
||||||
|
this.debug = function(){};
|
||||||
|
}
|
||||||
|
|
||||||
|
var cfg = new Config();
|
||||||
|
exports.defaultConfig = cfg;
|
||||||
|
exports.Config = Config;
|
||||||
|
|
||||||
|
function randomise(cb, conf) {
|
||||||
|
if(conf)
|
||||||
|
var cfg = conf;
|
||||||
|
cfg.debug("Calling with params "+JSON.stringify(cfg));
|
||||||
|
randomiseWith(cfg.debug, cfg.number, cfg.range, cfg.page, cfg.tags, cb);
|
||||||
|
}
|
||||||
|
exports.randomise = randomise;
|
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"name": "hashloli",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"xmlhttprequest": {
|
||||||
|
"version": "1.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
|
||||||
|
"integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "hashloli",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Loli randomiser",
|
||||||
|
"main": "loli.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git@flanchan.moe:hashloli"
|
||||||
|
},
|
||||||
|
"author": "Avril",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"xmlhttprequest": "^1.8.0"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
const loli = require("./loli");
|
||||||
|
|
||||||
|
var cfg = new loli.Config();
|
||||||
|
|
||||||
|
var verbose = false;
|
||||||
|
var debug = false;
|
||||||
|
|
||||||
|
process.argv.forEach(function (val, index, array) {
|
||||||
|
if(index>1) {
|
||||||
|
if (val == "--verbose")
|
||||||
|
verbose = true;
|
||||||
|
else if(val == "--debug")
|
||||||
|
debug = true;
|
||||||
|
else if (/^--number=/.test(val))
|
||||||
|
cfg.number = val.replace(/^--number=/, "");
|
||||||
|
else if (/^--range=/.test(val))
|
||||||
|
cfg.range = val.replace(/^--range=/, "");
|
||||||
|
else if (/^--page=/.test(val))
|
||||||
|
cfg.page = val.replace(/^--page=/, "");
|
||||||
|
else {
|
||||||
|
if(!cfg.tags)
|
||||||
|
cfg.tags = [];
|
||||||
|
cfg.tags.push(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function puts(str) {
|
||||||
|
console.log("DBG "+str);
|
||||||
|
}
|
||||||
|
if (debug)
|
||||||
|
cfg.debug = puts;
|
||||||
|
|
||||||
|
if (cfg.number > cfg.range)
|
||||||
|
cfg.range = cfg.number;
|
||||||
|
|
||||||
|
loli.randomise(function(datas) {
|
||||||
|
if (this.error) {
|
||||||
|
if(verbose)
|
||||||
|
console.log(JSON.stringify([{error: this.error}]));
|
||||||
|
else if(debug) console.log("Error: "+this.error);
|
||||||
|
}
|
||||||
|
else if(verbose)
|
||||||
|
console.log(JSON.stringify(datas));
|
||||||
|
else {
|
||||||
|
datas.forEach(function(data, i, a) {
|
||||||
|
if(data)
|
||||||
|
var url = data.file_url;
|
||||||
|
|
||||||
|
console.log(url);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, cfg);
|
Loading…
Reference in new issue