module sites.hentaicafe;
import config.downloaderconfig;
import sites.basesite;
/++
+ This class handles downloads for the site `hentai.cafe`
+/
class HentaiCafe : BaseSite
{
protected:
import std.net.curl : get;
import std.conv : to;
import std.regex : regex, match;
import core.stdc.stdlib : exit, EXIT_FAILURE;
/++
+ Gets the image urls from the supplied json
+ each derived site class should override this class
+ if the image urls aren't stored in the way this method
+ expects them to be
+/
string[] getUrlsFromJson(string json)
{
string[] urls;
// Parse the json
JSONValue parsedJson = parseJSON(json);
// Extract the urls of the images
foreach(JSONValue val; parsedJson.array)
urls ~= val["url"].str.replace("\\", "");
return urls;
}
/++
+ This function gets the name of the the manga by the url
+/
override string getNameFromUrl(string url)
{
// Get the site html as a string
string siteContent = to!string(get(url));
// Find the name of the manga
auto nameRegex = `
(.*)
`.regex;
auto nameMatch = match(siteContent, nameRegex);
// Return only the name not the html tags
return nameMatch.captures[1];
}
/++
+ This function returns a list of all the image urls by
+ parsing the html
+/
override string[] getImageUrlsFromBase(string url)
{
// Check if the url is a hentai.cafe comic url
if(indexOf(url, "/hc.fyi/") == -1)
{
writefln(`[!] The given url doesn't contain "/hc.fyi/" it was ignored!`);
// FIXME: no! :<
exit(EXIT_FAILURE);
}
// regex patterns for finding urls
auto comicRegex = `\"(https://hentai.cafe/manga/read/.*)\" title`.regex;
auto jsonInfoRegex = `var pages = \[(.*)\]`.regex;
// Get page html
string comicHTML = to!string(get(url));
// Find the url in the html mess
auto comicUrlMatch = match(comicHTML, comicRegex);
// Sanitize the url
string comicURL = comicUrlMatch.captures[0];
comicURL = split(comicURL, " ")[0].replace("\"", "");
// Get the first manga page to extract the json with the page infos
string mangaPageHTML = to!string(get(comicURL));
// Get the json data of the page
auto jsonMatch = match(mangaPageHTML, jsonInfoRegex);
string jsonData = jsonMatch.captures[0];
// Sanitize json
jsonData = split(jsonData, "=")[1];
return getUrlsFromJson(jsonData);
}
/++
+ This constructor just calls the inherited constructor
+/
public this(Config config)
{
super(config);
}
}