=pod

=encoding utf8

=head1 NAME

L<Novel::Robot> 

download novel /bbs thread 小说/贴子下载器

=head2 site 

support novel/forum website 支持小说/贴子站点

L<Novel::Robot::Parser>

=head2 type 

support robot ouput file type, 支持小说输出形式

L<Novel::Robot::Packer>

=head1 INSTALL

for example, on debian, 以debian环境为例

    apt install parallel calibre cpanminus firefox chromium-browser
    cpanm Novel::Robot

=head2 EXAMPLE

=for test t/01.get_novel_info.t t/02.parser_txt.t t/03.packer.t

    novel-robot -u "https://www.jjwxc.net/onebook.php?novelid=14838" -t html -i 1-3
    novel-robot -s txt -f 作者-书名.txt -t html


=head2 ARG

    Usage: novel-robot [options]

    -s : site, 指定站点

    -u : book url，小说url

    -w : writer name 作者名
    -b : book name，书名
    -f : txt file / txt file dir, 指定文本文件来源(可以是单个目录或文件)

    -t : packer type (html/txt), 小说保存类型，例如txt/html
    -o : output packer filename, 保存的小说文件名

    -i : min_item_num-max_item_num, 只取 x-y 章/楼
    --back_index: back item num, 不取 倒数 back_index 章/楼
    -j : min_page_num-max_page_num, 只取 x-y 页

    --cookie : firefox cookies.sqlite / netscape HTTP cookie file / cookie string, details in Novel::Robot::Browser
    -D : only print info, not download, 只输出信息，不下载
    -c : class, 指定类型 novel, tiezi, page
    -v : verbose

    --progress: 显示进度条(默认不显示)
    -h, --help: 显示帮助

    --agent           : default, firefox (GET), chrome (GET)
    --with_toc        : 小说保存时是否生成目录(默认是)
    --grep_content    : 提取关键字
    --filter_content  : 过滤关键字
    --only_poster     : 贴子只看楼主
    --min_content_word_num : 贴子每楼层最小字数
    --max_process_num : 进程个数 

    --chapter_regex: 指定分割章节的正则表达式(例如："第[ \\t\\d]+章")
    --content_path    : xpath to extract content, 提取content的路径
    --writer_path     : xpath to extract writer, 提取writer的路径
    --book_path       : xpath to extract book, 提取book的路径
    --item_list_path : xpath to extract item_list, 提取item_list的路径
    --content_regex   : regex to extract content, 提取content的正则
    --writer_regex    : regex to extract writer, 提取writer的正则
    --book_regex      : regex to extract book, 提取book的正则

    -B : board_url / board_id  版块url，或版块编号

    -m, --mail_msg : 消息
    -M, --mail_server : 邮件SMTP服务器
    -p, --mail_port : 邮件SMTP服务器端口
    -U, --mail_usr  : 发件人账号
    -P, --mail_pwd  : 发件人密码
    -F, --mail_from : 发件人邮箱
    -T, --mail_to   : 收件人邮箱


=head2 download novel

download novel from url

下载小说

=for test t/01.get_novel_info.t

    novel-robot -u "https://www.jjwxc.net/onebook.php?novelid=14838" -t html
    novel-robot -u "https://www.jjwxc.net/onebook.php?novelid=14838" -t html -i 3-4
    novel-robot -u "https://www.jjwxc.net/onebook.php?novelid=14838" -t html -i 3-
    novel-robot -u "https://www.jjwxc.net/onebook.php?novelid=14838" -t html -i -3

=head3 use cookie

以firefox浏览器为例，先登录对应站点，然后用 L<cookies.txt|https://addons.mozilla.org/zh-CN/firefox/addon/cookies-txt/> 扩展导出cookies.txt，则可以下载当前登录账号所购买的小说；
也可直接指定firefox配置目录下的cookies.sqlite文件；
或者直接使用m.jjwxc.net的cookie字符串

绿晋江 VIP 可通过 C<--cookie> 指定 Netscape cookies.txt、Firefox cookies.sqlite，或直接传入 Cookie 字符串。


=head2 parse txt

parse chapter name with regex, convert txt to ebook 

可指定章节标题的正则式，把txt文件转成电子书

=for test t/02.parser_txt.t t/03.packer.t

    novel-robot -s txt -w 牵机 -b 断情逐妖记 -f dq1.txt -t html
    novel-robot -s txt -w 牵机 -b 断情逐妖记 -f dq1.txt,dq2.txt,dir1 --chapter_regex "第[ \\t\\d]+章" -t html
    novel-robot -s txt -f 飘灯-像妖怪一样自由.txt -t html

=head2 only print info

only print info, but not download, 输出小说信息（不下载）

=for test t/01.get_novel_info.t

    novel-robot -u "https://www.jjwxc.net/onebook.php?novelid=14838" -D

=head2 convert ebook

use L<calibre|https://calibre-ebook.com/> to convert a novel file into epub/mobi/..., default filename format is [writer]-[bookname].[type]

使用calibre将下载的 html 格式小说转换成其他格式的电子书，例如 epub、mobi 等。如果未指定 writer 及 book 选项，则需要将 html 源文件名称设置为 [作者-书名]

=for test t/03.packer.t

    novel-robot -f 天平-风起阿房.html -t epub
    novel-robot -f mxj.html -w 施定柔 -b 迷侠记 -t epub

=head2 send email 

download/convert novel, use calibre-smtp to send ebook to email address : xxx@kindle.com

下载小说并使用calibre-smtp推送到指定邮箱

本地 SMTP 服务使用 C<-T> 和 C<-F>；远程 SMTP 服务另外使用 C<-M>、C<-p>、C<-U> 和 C<-P>。邮箱、账号及密码必须替换为真实配置，因此不提供不可直接运行的占位示例。

=head2 bulk download

下载专栏内的所有小说：

=for test t/04.board_jjwxc.t

    novel-robot -B "https://www.jjwxc.net/oneauthor.php?authorid=14644"

=head1 FUNCTION

=head2 get_novel

=for test t/01.get_novel_info.t

    my $xs = Novel::Robot->new(
    site => 'jjwxc',
    type => 'html', 
    );

    my $index_url = 'https://www.jjwxc.net/onebook.php?novelid=14838';
    $xs->get_novel($index_url);

=head2 get_novel_ref

get novel / forum thread data hash ref 

获取小说/贴子内容，返回一个hash引用

=for test t/02.parser_txt.t

       my $r = $xs->get_novel_ref($url, %opt);

=head2 get_novel_info

get novel index info / forum thread first page info

获取小说/贴子首页信息

=for test t/01.get_novel_info.t

       my $r = $xs->get_novel_info($url);

=cut
