Skip to content

Commit

Permalink
c++ wrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
JeFaitDesSpaghettis committed Oct 2, 2021
1 parent 89b1fe8 commit db51eac
Show file tree
Hide file tree
Showing 4 changed files with 160 additions and 27 deletions.
32 changes: 16 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,35 @@ Just go [there](https://github.com/JeFaitDesSpaghettis/HMCD/releases) or build i
## Build
To build you'll git cmake and curl development packages.<br/>
Then run these commands:<br/>
&nbsp;&nbsp;&nbsp;&nbsp;```git clone "https://github.com/JeFaitDesSpaghettis/HMCD"```<br/>
&nbsp;&nbsp;&nbsp;&nbsp;```cd "./HMCD"```<br/>
&nbsp;&nbsp;&nbsp;&nbsp;```cmake -G"MinGW Makefiles" -B"./build" -S"./"```<br/>
&nbsp;&nbsp;&nbsp;&nbsp;```cmake --build "./build" -j8```<br/>
&nbsp;&nbsp;&nbsp;&nbsp;```cmake --build "./build" --target install``` (optional)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;```cmake --build "./build" --target uninstall``` (to uninstall)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;`git clone "https://github.com/JeFaitDesSpaghettis/HMCD"`<br/>
&nbsp;&nbsp;&nbsp;&nbsp;`cd "./HMCD"`<br/>
&nbsp;&nbsp;&nbsp;&nbsp;`cmake -G"MinGW Makefiles" -B"./build" -S"./"`<br/>
&nbsp;&nbsp;&nbsp;&nbsp;`cmake --build "./build" -j8`<br/>
&nbsp;&nbsp;&nbsp;&nbsp;`cmake --build "./build" --target install` (optional)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;`cmake --build "./build" --target uninstall` (to uninstall)<br/>

## Explanation
The url of a page uses the following scheme:<br/>
```[XXXXXXXX]/comic/book/[BOOK_ID]/[CHAPTER]/[PAGE].jpg```<br/>
`[XXXXXXXX]/comic/book/[BOOK_ID]/[CHAPTER]/[PAGE].jpg`<br/>
Where:<br/>

+ ```XXXXXXXX``` is the cdn, it can be either<br/>
+ `XXXXXXXX` is the cdn, it can be either<br/>
"https://d2tpbmzklky1cl.cloudfront.net/manga/static" (global)<br/>
OR<br/>
"https://comicstatic.bh3.com/new_static_v2" (china)<br/>
+ ```BOOK_ID``` is an 4 digit integer starting from 1001(and growing up) indicating thebook<br/>
* ```CHAPTER``` is a non zero padded integer starting at 1 indicating the chapter<br/>
+ ```PAGE``` is zero padded 4 digit integer starting at 0001<br/>
+ `BOOK_ID` is an 4 digit integer starting from 1001(and growing up) indicating thebook<br/>
* `CHAPTER` is a non zero padded integer starting at 1 indicating the chapter<br/>
+ `PAGE` is zero padded 4 digit integer starting at 0001<br/>

They will be then downloaded using the following scheme:<br/>
[OUT_DIR]_[BOOK_ID]/Chapter[CHAPTER]/[CHAPTER][PAGE].jpg<br/>
Where:<br/>
+ ```OUT_DIR``` is either "./GBBook" or "./CNBook"<br/>
* ```BOOK_ID``` is an 4 digit integer starting from 1001(and growing up) indicating the book<br/>
+ ```CHAPTER``` is a zero padded 2 digit integer starting at 1 indicating the chapter<br/>
* ```CHAPTER``` is reused again in the page file name for having all pages in one directory<br/>
+ `OUT_DIR` is either "./GBBook" or "./CNBook"<br/>
* `BOOK_ID` is an 4 digit integer starting from 1001(and growing up) indicating the book<br/>
+ `CHAPTER` is a zero padded 2 digit integer starting at 1 indicating the chapter<br/>
* `CHAPTER` is reused again in the page file name for having all pages in one directory<br/>
without having the page names non conflicting<br/>
* ```PAGE``` is zero padded 2 digit integer starting
* `PAGE` is zero padded 2 digit integer starting

## Why?
It allows you to download the official hi3 manhuas releases in a easy way. \
Expand Down
8 changes: 6 additions & 2 deletions include/HMCDCore/HMCD.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ typedef struct _HmcdBook
typedef struct _HmcdServer
{
unsigned int book_count; //!< Number of books available on this server
HMCD_SERVER_ID dl_server; //!< Server identifier indicated by the HMCD_SERVER_ID enum
HMCD_SERVER_ID server_id; //!< Server identifier indicated by the HMCD_SERVER_ID enum
const char* base_url; //!< Base url for books (not ending in /)
char* out_dir; //!< Default output directory
HmcdBook books[]; //!< Array of books available
Expand Down Expand Up @@ -167,10 +167,13 @@ static const HmcdServer HMCD_CN_SERVER =
}
};

// Enable logs to stdout
void hmcd_enable_logs(bool enable);

// Check if logs are enabled
bool hmcd_enabled_logs();

// Return NULL if server_id unrecognized
const char* hmcd_get_server_name(HMCD_SERVER_ID server_id);

// Check that certificate for https is here
Expand All @@ -181,10 +184,11 @@ int hmcd_set_https_cert(CURL* curl_handle, const char* certificate_path);
unsigned long long int hmcd_get_dir_size(const char* dir_name);

// Get chapter count
// Returns 0 on error
unsigned int hmcd_get_chap_cnt(const HmcdServer* target_server, unsigned int book_index);

// Download book
// return != 0 means error
// Return != 0 on error
int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsigned int first_chap, unsigned int last_chap);

#ifdef __cplusplus
Expand Down
120 changes: 120 additions & 0 deletions include/HMCDCore/HMCPPD.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
#ifndef HMCDPPD_HPP
#define HMCDPPD_HPP

#include "HMCD.h"

#include <cstddef>
#include <cstdint>
#include <cstdio>

#include <string>
#include <vector>
#include <stdexcept>
#include <iostream>

namespace hmcppd
{
// Download server
typedef HMCD_SERVER_ID SERVER_ID;

/**
* Structure representing a book
*/
typedef struct _Book
{
std::uint32_t book_id; //!< ID of the book starting at 1001
std::string book_name; //!< Name of the book, may be unicode
}Book;

class DlServer
{
// PUBLIC FUNCTIONS

public: DlServer(SERVER_ID server_id)
{
if (server_id == SERVER_ID::HMCD_CHINA)
dl_server = const_cast<HmcdServer*>(&HMCD_CN_SERVER);
else if (server_id == SERVER_ID::HMCD_GLOBAL)
dl_server = const_cast<HmcdServer*>(&HMCD_GLB_SERVER);
else throw std::runtime_error("Unrecognized server_id = " + std::to_string(server_id) + "\n");
}

public: DlServer() = delete;

public: ~DlServer()
{
;
}

public: void enable_logs(bool enable) { hmcd_enable_logs(enable); }

public: bool enabled_logs() { return hmcd_enabled_logs(); }

public: std::string get_server_name()
{
const char* server_name = hmcd_get_server_name(dl_server->server_id);
if (!server_name)
throw std::runtime_error(
"get_server_name() failed, unrecognized server_id = " + std::to_string(dl_server->server_id) + "\n");
return std::string(server_name);
}

public: std::uint64_t get_dir_size(std::string dir_name)
{ return static_cast<std::uint64_t>(hmcd_get_dir_size(dir_name.c_str())); }

public: unsigned int get_chap_cnt(unsigned int book_index)
{
unsigned int chap_count = hmcd_get_chap_cnt(dl_server, book_index);
if (chap_count == 0)
throw std::runtime_error("get_chap_cnt() failed\n");
return chap_count;
}

public: void dl_book(unsigned int book_index, unsigned int first_chap, unsigned int last_chap)
{
int result = hmcd_dl_book(dl_server, book_index, first_chap, last_chap);
if (result != 0)
throw std::runtime_error("dl_book() failed\n");
}

public: void switch_server()
{
switch (dl_server->server_id)
{
case SERVER_ID::HMCD_CHINA:
dl_server = const_cast<HmcdServer*>(&HMCD_GLB_SERVER);
break;
case SERVER_ID::HMCD_GLOBAL:
dl_server = const_cast<HmcdServer*>(&HMCD_CN_SERVER);
break;
default:
throw std::runtime_error("Unrecognized server_id = " + std::to_string(dl_server->server_id) + "\n");
break;
}
}

// GETTERS - SETTERS

public: std::uint32_t get_book_count() { return dl_server->book_count; }

public: SERVER_ID get_server_id() { return dl_server->server_id; }

public: std::string get_out_dir() { return std::string(dl_server->out_dir); }

public: std::vector<Book> get_books()
{
std::vector<Book> Books;
Books.resize(dl_server->book_count);
for (size_t index = 0; index < dl_server->book_count; index++)
Books[index] = {dl_server->books[index].book_id, std::string(dl_server->books[index].book_name)};
return Books;
}

// VARIABLES

// Server
private: HmcdServer* dl_server = nullptr;
};
}

#endif /* HMCDPPD_HPP */
27 changes: 18 additions & 9 deletions src/HMCDCore/HMCD.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ unsigned long long int hmcd_get_dir_size(const char* dir_name)
for (size_t index = 0; index < file_count; index++)
free(file_list[index]);
free(file_list);
return 0;
}
unsigned long long int total_dir_sz = 0;
for (size_t index = 0; index < file_count; index++)
Expand All @@ -163,6 +164,10 @@ unsigned int hmcd_get_chap_cnt(const HmcdServer* target_server, unsigned int boo
{
HMCD_ASSERT_W_ERR_LOG(book_index < target_server->book_count, "book_index(%i) is out of range", book_index)

#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif

const char* target_base_url = target_server->base_url;
unsigned int book_id = target_server->books[book_index].book_id;
const char* book_name = target_server->books[book_index].book_name;
Expand All @@ -171,7 +176,7 @@ unsigned int hmcd_get_chap_cnt(const HmcdServer* target_server, unsigned int boo
"Getting chapter count of %s (%i %s)...",
book_name,
book_id,
hmcd_get_server_name(target_server->dl_server))
hmcd_get_server_name(target_server->server_id))

CURL* check_handle;
HMCD_CURL_INIT_W_ERR_CHK(check_handle, , 0)
Expand Down Expand Up @@ -212,7 +217,7 @@ unsigned int hmcd_get_chap_cnt(const HmcdServer* target_server, unsigned int boo
"%s (%i %s) has %i chapters",
book_name,
book_id,
hmcd_get_server_name(target_server->dl_server),
hmcd_get_server_name(target_server->server_id),
(chap_count - 1))

curl_easy_cleanup(check_handle);
Expand All @@ -238,6 +243,10 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
{
HMCD_ASSERT_W_ERR_LOG(book_index < target_server->book_count, "book_index(%i) is out of range", book_index)

#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif

const char* target_base_url = target_server->base_url;
const char* target_out_dir = target_server->out_dir;
unsigned int book_id = target_server->books[book_index].book_id;
Expand All @@ -246,7 +255,7 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
HMCD_LOG("Downloading %s (%i %s chapter %i to %i)...",
book_name,
book_id,
hmcd_get_server_name(target_server->dl_server),
hmcd_get_server_name(target_server->server_id),
first_chap,
last_chap);

Expand All @@ -267,7 +276,7 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
{
HMCD_LOG_ERR("hmcd_set_https_cert(dl_handle, \"./cacert.pem\") failed");
curl_easy_cleanup(dl_handle);
return -4;
return -2;
}
curl_easy_setopt(dl_handle, CURLOPT_VERBOSE, 0L);
curl_easy_setopt(dl_handle, CURLOPT_NOPROGRESS, 1L);
Expand Down Expand Up @@ -320,7 +329,7 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
free(chap_dirname);
free(book_dirname);
curl_easy_cleanup(dl_handle);,
-9)
-3)

curl_easy_getinfo(dl_handle, CURLINFO_HTTP_CODE, &http_code);
// If page exists
Expand All @@ -333,7 +342,7 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
free(chap_dirname);
free(book_dirname);
curl_easy_cleanup(dl_handle);,
-6)
-5)

// Download it and write the data
curl_easy_setopt(dl_handle, CURLOPT_URL, page_url);
Expand All @@ -349,7 +358,7 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
free(chap_dirname);
free(book_dirname);
curl_easy_cleanup(dl_handle);,
-10)
-6)

curl_easy_getinfo(dl_handle, CURLINFO_HTTP_CODE, &http_code);
// If somehow we can't get it
Expand Down Expand Up @@ -389,7 +398,7 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
free(chap_dirname);
free(book_dirname);
curl_easy_cleanup(dl_handle);
return -5;
return -4;
}
}
free(chap_url);
Expand All @@ -400,7 +409,7 @@ int hmcd_dl_book(const HmcdServer* target_server, unsigned int book_index, unsig
HMCD_LOG("Downloaded %s (%i %s chapter %i to %i) in %f (seconds)",
book_name,
book_id,
hmcd_get_server_name(target_server->dl_server),
hmcd_get_server_name(target_server->server_id),
first_chap,
last_chap,
elapsed_sec);
Expand Down

0 comments on commit db51eac

Please sign in to comment.