用户工具

站点工具


mangacon:downloader

漫画控的第三方下载器支持

English Version>>

虽然漫画控提供了一个内置的下载器,但有时你可能需要使用第三方的下载器来下载漫画控解析出的图片。为此,漫画控开放了下载器的接口,你可以使用这些接口来添加第三方下载器的支持。

如果你只是希望在漫画控中使用 迅雷QQ 旋风 作为默认的下载器,可以直接下载下面的组件:

使用方法

  1. 将组件解压缩后,把 MangaDownloader.dll 放置在漫画控文件夹下。
  2. 启动漫画控,在“设置”界面选择你想要的下载器。

需要说明的是,如果你使用的是绿色版的迅雷或旋风,那么可能会无法在列表中找到对应的下载器。建议你使用官方的安装版。

下载器 API

如果你希望漫画控能够支持更多的下载器,那么可以使用漫画控所开放的下载器 API 来自己实现下载器组件。漫画控下载器 API 及 MangaDownloader.dll 的源代码可以从 这里 获得。

组件规范

漫画控的下载器组件需要遵循以下规范:

  1. 该组件必须名为 MangaDownloader.dll。
  2. 该组件必须导出一个名为 McGetDownloaderManager 的函数,其原型如下:
    MangaCon::DownloaderManager* WINAPI McGetDownloaderManager(void);

DownloaderManager 接口

class DownloaderManager
{
public:
    typedef void (WINAPI * EnumProc)(PCSTR pszID, PCWSTR pwzName, PVOID pvParam);
    virtual void WINAPI EnumDownloaders(EnumProc pfnEnum, PVOID pvParam) = 0;
 
    virtual Downloader* WINAPI GetDownloader(PCSTR pszID) = 0;
};

DownloaderManager 是下载器管理接口,由下载组件实现,其方法为:

  • EnumDownloaders:用于枚举下载器的标识(ID)及名称,漫画控会在设置界面调用这个方法。
  • GetDownloader:用于获取指定的下载器接口指针。

Downloader 接口

class Downloader
{
public:
    virtual void WINAPI ClearTasks(void) = 0;
    virtual DownloadTask* WINAPI NewTask(Manga *pManga, PCWSTR pwzVol, PCSTR pszVolURL) = 0;
    virtual void WINAPI CommitTasks(void) = 0;
    virtual void WINAPI SetActive(bool bActive) { /* Nothing */ }
};

Downloader 是下载器接口,由下载组件实现。其各方法说明如下:

  • ClearTasks:清除所有任务。
  • NewTask:新建一个任务。
  • CommitTasks:提交所有任务并启动下载器。
  • SetActive:下载器被启用/禁用。

DownloadTask 接口

class DownloadTask
{
public:
    virtual void WINAPI AddImageURL(PCSTR pszURL, PCSTR pszRef) = 0;
    virtual void WINAPI SetCookies(PCSTR pszCookies) = 0;
    virtual void WINAPI SetHeaders(PCSTR pszHeaders) { /* Nothing */ }
    virtual void WINAPI Done(void) = 0;
};

DownloadTask 是下载任务接口,由下载器组件实现。其各方法说明如下:

  • AddImageURL:添加一个图片链接。
  • SetCookies:设置本任务的 cookies。
  • SetHeaders:设置本任务中 HTTP 请求的额外头部。
  • Done:任务图片添加完毕。

Manga 接口

class Manga
{
public:
    enum InfoType {
        URL = 0,
        RawContent,
        Name,
        Author,
        Cover,
        Intro,
        Category,
        MAX
    };
    virtual bool WINAPI GetInfo(int nInfo, MemObject *pDst) const = 0;
    virtual bool WINAPI GetFinishStatus(bool *bFinished) const = 0;
};

Manga 是漫画对象接口,由漫画控实现。其各成员方法说明如下:

  • GetInfo:用于获取漫画的各种信息。
  • GetFinishStatus:用于获取漫画是否连载完结。

伪代码

最后,这里是一段伪代码,这段代码解说了漫画控内部是如何调用下载器组件的。

Downloader *dl = CurrentDownloader();
 
for (size_t i = 0; i < m_Tasks.size(); ++i) {
    const TaskItem &ti = m_Tasks.at(i);
    DownloadTask *t = dl->NewTask(GetMangaObject(i), ti.m_wsName.c_str(), ti.m_strURL.c_str());
    if (NULL == t)
        break;
 
    if (!ti.Cookie.empty())
        t->SetCookies(ti.Cookie.c_str());
    if (!ti.Headers.empty())
        t->SetHeaders(ti.Headers.c_str());
 
    for (size_t j = 0; j < ti.Images.size(); ++j) {
        const ImageItem& ii = ti.Images.at(j);
        t->AddImageURL(ii.m_strURL.c_str(), ii.m_strRef.c_str());
    }
    t->Done();
}
 
dl->CommitTasks();
最后更改: 2014-05-18 07:36 由 李马

页面工具