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