[Userscript] TruyenCV downloader

  Bài viết hay nhất1
Tải truyện từ TruyenCV.com định dạng epub.

Demo



Tải truyện từ TruyenCV

Cài đặt


Dùng một trong các link sau:

  1. https://greasyfork.org/vi/scripts/17826-truyencv-downloader
  2. https://openuserjs.org/scripts/baivong/TruyenCV_downloader
  3. https://github.com/baivong/Userscript/raw/master/truyenCV_downloader/truyenCV_downloader.user.js

Mã nguồn


Code:
// ==UserScript==
// @name         TruyenCV downloader
// @namespace    http://devs.forumvi.com/
// @description  Tải truyện từ truyencv.com định dạng epub
// @version      2.0.2
// @icon         http://i.imgur.com/o5cmtkU.png
// @author       Zzbaivong
// @license      MIT
// @match        http://truyencv.com/*/
// @require      https://code.jquery.com/jquery-3.2.0.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.2/handlebars.min.js
// @require      https://greasyfork.org/scripts/20307-jszip-v2/code/jszip-v2.js?version=196156
// @require      https://greasyfork.org/scripts/29904-jszip-utils/code/jszip-utils.js?version=196137
// @require      https://greasyfork.org/scripts/18532-filesaver/code/FileSaver.js?version=164030
// @require      https://greasyfork.org/scripts/29905-js-epub-maker/code/js-epub-maker.js?version=196139
// @noframes
// @connect      self
// @supportURL   https://github.com/baivong/Userscript/issues
// @run-at       document-idle
// @grant        GM_xmlhttpRequest
// ==/UserScript==

/* global EpubMaker */
(function ($, window, document) {
    'use strict';

    /**
     * Hiển thị liên kết xem online cuối chương
     * [>]
     * @type {Boolean} true
     *                 false
     */
    var readOnline = true;


    function cleanHtml(str) {
        str = str.replace(/&nbsp\;/gm, ' ');
        str = str.replace(/<(br|hr|img)([^>]+)?>/gm, '<$1$2 />');
        return '<p>' + str + '</p>';
    }

    function downloadError(err) {
        $downloadStatus('danger');
        titleError.push(chapTitle);
        console.error(err);
    }

    function saveEbook() {
        if (endDownload) return;
        endDownload = true;

        if (titleError.length) {
            titleError = '<p><strong>Các chương lỗi: </strong>' + titleError.join(', ') + '</p>';
        } else {
            titleError = '';
        }
        beginEnd = '<p>Nội dung từ <strong>' + begin + '</strong> đến <strong>' + end + '</strong></p>';

        epubMaker.withSection(new EpubMaker.Section('note', 'note', {
            content: beginEnd + titleError + '<br /><br />' + credits,
            title: 'Ghi chú'
        }, false, true));

        epubMaker.downloadEpub(function (epubZipContent, filename) {
            document.title = '[⇓] ' + ebookTitle;
            $win.off('beforeunload');
            $download.attr({
                href: window.URL.createObjectURL(epubZipContent),
                download: filename
            }).text('Tải xong').off('click');
            $downloadStatus('success');
        });
    }

    function getContent() {
        if (endDownload) return;
        chapId = chapList[count];

        GM_xmlhttpRequest({
            method: 'GET',
            url: pathname + chapId + '/',
            onload: function (response) {
                var $data = $(response.responseText),
                    $chapter = $data.find('#js-truyencv-content'),
                    $notContent = $chapter.find('script, style, a, div, p:last'),
                    $referrer = $chapter.find('[style]').filter(function () {
                        return (this.style.fontSize === '1px' || this.style.fontSize === '0px' || this.style.color === 'white');
                    });

                if (endDownload) return;

                chapTitle = $data.find('#js-truyencv-read-content .title').text().trim();

                if (!$chapter.length) {
                    downloadError('Missing content.');
                } else {
                    $downloadStatus('warning');

                    if ($notContent.length) $notContent.remove();
                    if ($referrer.length) $referrer.remove();

                    var $img = $chapter.find('img');
                    if ($img.length) $img.replaceWith(function () {
                        return '<br /><a href="' + this.src + '">Click để xem ảnh</a><br />';
                    });

                    epubMaker.withSection(new EpubMaker.Section('chapter', chapId, {
                        content: cleanHtml($chapter.html()) + chapRef(referrer + chapId),
                        title: chapTitle
                    }, true, false));

                    if (count === 0) begin = chapTitle;
                    end = chapTitle;

                    $download.html('Đang tải: ' + Math.floor((count / chapListSize) * 100) + '%');

                    count++;
                    document.title = '[' + count + '] ' + pageName;
                    if (count >= chapListSize) {
                        saveEbook();
                    } else {
                        getContent();
                    }
                }
            },
            onerror: function (err) {
                downloadError(err);
                saveEbook();
            }
        });
    }

    function downloadEbook() {
        var $infoBlock = $('.truyencv-detail-info-block'),
            $ebookType = $infoBlock.find('.categories a');

        ebookTitle = $infoBlock.find('h1').text().trim();
        ebookAuthor = $infoBlock.find('.author').text().trim();
        ebookCover = $infoBlock.find('.img-responsive').attr('src');

        if ($ebookType.length) {
            $ebookType.each(function () {
                ebookType.push($(this).text().trim());
            });
            ebookType = ebookType.join(', ');
            ebookType = '<p><strong>Thể loại:</strong> ' + ebookType + '</p>';
        } else {
            ebookType = '';
        }

        epubMaker = new EpubMaker()
            .withUuid('github.com/baivong/Userscript::truyencv::' + pathname.slice(1, -1))
            .withTemplate('idpf-wasteland')
            .withAuthor(ebookAuthor)
            .withLanguage('vi')
            .withModificationDate(new Date)
            .withCover(ebookCover)
            .withTitle(ebookTitle);

        epubMaker.withSection(new EpubMaker.Section('introduction', 'info', {
            content: '<h1>' + ebookTitle + '</h1><p><strong>Tác giả:</strong> ' + ebookAuthor + '</p>' + ebookType,
            title: 'Giới thiệu'
        }, false, true));

        epubMaker.withSection(new EpubMaker.Section('preamble', 'content', {
            content: cleanHtml($('#truyencv-detail-introduction .brief').html()),
            title: 'Nội dung'
        }, false, true));


        $win.on('beforeunload', function () {
            return 'Truyện đang được tải xuống...';
        });

        $download.one('click', function (e) {
            e.preventDefault();
            saveEbook();
        });

        getContent();
    }


    var pageName = document.title,
        $win = $(window),
        $download = $('<a>', {
            class: 'btn btn-truyencv',
            href: '#download',
            text: 'Tải xuống'
        }),
        $downloadStatus = function (status) {
            $download.removeClass('btn-truyencv btn-primary btn-success btn-info btn-warning btn-danger').addClass('btn-' + status);
        },

        $novelId = $('.basic'),
        chapList = [],
        chapListSize = 0,
        chapId = '',
        chapTitle = '',
        pathname = location.pathname,
        count = 0,
        begin = '',
        end = '',
        endDownload = false,

        ebookTitle = '',
        ebookAuthor = '',
        ebookCover = '',
        ebookType = [],
        beginEnd = '',
        titleError = [],
        referrer = location.origin + pathname,
        credits = '<p>Truyện được tải từ <a href="' + referrer + '">TruyenCV</a></p><p>Userscript được viết bởi: <a href="https://baivong.github.io/">Zzbaivong</a></p>',
        chapRef = function (ref) {
            return readOnline ? '<p><a href="' + ref + '/" target="_blank">[>]</a></p>' : '';
        },

        epubMaker;


    if (!$novelId.length) return;

    $download.appendTo('.info .buttons');
    $download.one('click contextmenu', function (e) {
        e.preventDefault();
        var showChapList = $('.truyencv-detail-block a[href="#truyencv-detail-chap"]');

        document.title = '[...] Vui lòng chờ trong giây lát';

        showChapList = showChapList.attr('onclick');
        showChapList = showChapList.match(/\(([^\(\)]+)\)/)[1];
        showChapList = showChapList.match(/[^',]+/g);

        $.post('/index.php', {
            showChapter: 1,
            media_id: showChapList[0],
            number: showChapList[1],
            page: showChapList[2],
            type: showChapList[3]
        }).done(function (data) {
            chapList = data.match(/(?:href\=")[^"\)]+(?=")/g);
            chapList = chapList.reverse();
            chapList = chapList.map(function (val) {
                val = val.slice(6, -1);
                val = val.replace(referrer, '');
                return val;
            });

            if (e.type === 'contextmenu') {
                var startFrom = prompt('Nhập ID chương truyện bắt đầu tải:', chapList[0]);
                startFrom = chapList.indexOf(startFrom);
                if (startFrom !== -1) chapList = chapList.slice(startFrom);
            }

            chapListSize = chapList.length;
            if (chapListSize > 0) downloadEbook();
        }).fail(function (jqXHR, textStatus) {
            downloadError(textStatus);
        });
    });

})(jQuery, window, document);

Hướng dẫn


Tải truyện


Script hoạt động sẽ tạo ra nút Tải xuống tại trang giới thiệu truyện, click vào sẽ tải bộ truyện đó.
Click chuột phải trên nút Tải xuống và nhập ID của chương cần bắt đầu vào khung nhập liệu, tiến trình sẽ bắt đầu từ chương đó đến cuối danh sách.
Bạn có thể dừng và tải truyện ngay lập tức bằng cách click vào nút Tải xuống khi tiến trình đang chạy.

Đọc truyện


  1. Windows: Book Bazaar Reader.
  2. Linux: FBReader.
  3. Android: AlReader.

Tags: #userscript #truyencv #download #ebook
  Bài viết hay nhất2
Lưu ý rằng là file ebook mobi cỡ 20mb là các web convert online như zamzar sẽ báo lỗi nên với các truyên có số chương lớn thì các bạn nên chia ra sao cho các file còn lại cơ 15mb thôi để có thể convert online. Nếu các bạn muốn 1 file nguyên luôn thì tốt nhất là dùng máy của mình convert.
  Bài viết hay nhất3
Cái files htm mà bạn download về nhiều khi lẫn lộn nhiều code khác nhau nên cần được edit lại trước khi đưa vào MobipocketCreator.

Đây thì mình sẽ chỉ cách làm với Notepad++

Đầu tiên là mở file htm bằng NP++, bạn có thể dùng notepad++ để Open hay là nhấp chuột phải lên file/các file htm cần làm để hiện bảng chọn và ấn vào "Edit with notepad++" ngay dưới "Open"
Khi mở ra bạn sẽ thấy thế này

Trong file co cả <p> và <br> , có các <br> liền nhau làm cho các khoảng giữa dòng bị rộng ra...

Đầu tiên, ta cần chỉnh lại các dòng tiêu đề. Thực tế thì chỉ cần chỉnh lại dòng "<h2 class="title">Chương 1: trong núi thiếu niên</h2>" nhưng nếu bạn muốn dễ quay lại copy tên sách khi làm metadata thì nên làm thế này.

Sau đó thì bỏ các khoảng tab và các khoảng trống liền nhau bằng cách Replace( Ctrl+H). Với khoảng tab thì phải đánh 1 khoảng tab trong văn bản rồi copy vào "Find What:" vì nếu mở bảng Replace thì nó sẽ là phím xuống dòng. Phía dưới "Replace with:" để 1 khoảng spacebar. Sau khi thay thế hết khoảng tab thì thay vào đó bằng 2 khoảng spacebar liền nhau và tiếp tục replace.

***Lưu ý : Ta có thể replace trong nhiều văn bản ở nhiều tab khác nhau khi dùng Notepad++ bằng cách nhấn vào " Replace all in Al opened Documents"

Số chỗ mới vừa được Replace ở dưới ô bên trái. Tốt nhất là nhấn đến khi số này về 0.

Thứ 2: bỏ code  <p> vì truyệncv chủ yếu là sử dụng code <br>. khi sử dụng chung 2 code thì có khi bản truyện của bạn se không đồng nhất  và rất khó điều chỉnh để hòa hợp nhau nên ta chỉ chọn 1 code để lại. Ngoài ra thì sửa dùng code <p> quá tốn thời gian, công sức
Ta cũng dùng Replace : <p> replace with (Ko có gì) và </p> replace with  <br>. Làm đến khi giá trị chỗ sửa về zero.

Thứ 3: xóa các code quảng cáo( mình không rõ lắm là mấy cái này có hiện lên ebook ko do mình toàn xóa hết). Để Replace with: <br> vì một số code sẽ không ở dòng riêng mà ở cuối 1 dòng text. Các code này chủ yếu có div trong đó nên có thê dùng Find(Ctrl+F)"div" để kiểm tra còn chỗ nào có quảng cáo ko


Thứ 4: rút lại số code <br>. Trước khi làm thì hãy nhấn vào đây để loại bỏ hết tất cả các dòng trống có thể có trong file htm (1 số có thể là do edit tạo ra)



2 Replace trên thì trên cùng 1 dòng nên ta có thể để ở "Normal mode" còn các replace sau thì phải dùng Extended hay Regular expression mode( Code "\n" là code quy định. sự xuống dòng trong notepad++).
*** Có nhiều khi replace thứ gì đó ở Extended mode ko đc mà bạn phải chuyển về Regular mode






Thứ 5: loại bỏ một số phần ko cần thiết do converter làm ra.


Trong văn bản có thể có 1 số code lạ làm ảnh hướng

***Lưu ý:
- TRên thanh công cụ có 2 ký hiệu cho 2 kiểu save khác nhau : 1 tờ giấy là chỉ save văn bản đang mở, 3 tờ là save toàn bộ các file đang được mở trong các tab.

- Màu đỏ đỏ của file trên 1 tab là biểu thị file đó đã bị chỉnh sửa mà chưa save lại còn xanh là chưa tác động hay là đã save rồi


Với Phiên bản mới ko còn chon chương để load về đc nữa nên nếu làm kiểu này phải chia file html thành nhiều file nhỏ để convert đc băng zamzar.
Mở New tab trong Notepad++, Copy các mã phần đầu(<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>) và cuối (</body></html>)của file html vào cái tab mới này. Thich thì copy luôn tiêu đê và tác giả qua luôn.
Sau đó chuyển 1 số chương qua sao cho số chương mỗi file vào khoảng 700-800 chương
Save các file mới ở đinh dạng html

Với mobipocket, để chế độ mặc đinh là VIetnamese - International UTF8 vì mặc định của Mobipocket không code đúng tiếng Việt (Nhiều nhất là "Â" đầu từ bị mất)  và nếu không đổi mặc định thì có thể bạn sẽ quên rồi ko hiểu sao ebook mình làm ra lại lạ thế này.

Để thêm 1 file html vào, nhấn vào "html documents"

Trong phần "choose a file" dùng Browse để chọn file html cần làm prc. Nếu chưa chọn ngôn ngữ mặc định là Vietnamese thì lúc này bạn phải chọn nó trong phần Langague.

Image Cover, Nhấn vào "Add an image cover" để chọn cover rồi phải nhớ nhấn Update để lưu cover



Mục Lục: Để tạo mục lục cho sách  ta vào "Table of contents"
Click vào "Add a Table of contents"

Thay "Table of contents" trong khung thành "Mục Lục"
Do đầu các chương chỉ ở mức h2 nên chỉ cân nhập "h2" vào ô First Level:

Metada: Ebook Title (tên sách) , Author( tác giả) .Phải nhớ nhấn Update để lưu cover


Build(Hàng trên-Nhấn vào) : "Standard Compression" có vẻ như là dễ được zamzar chấp nhận hơn

Mở folder chứa file prc mới tạo, sau khi làm xong thì có lựa chọn để mở folder đó ra( Folder đó mặc đinh là My Documents/My Publications)


Lấy File Prc đó đem đi convert bằng zamzar thành epub
Nhớ là chỉ lấy khoảng cỡ 700-800 chương trong 1 file html thì zamzar mới convert đc
  Bài viết hay nhất4
Nếu trong nội dung truyện có dính quảng cáo, lệch dòng, ... bạn cứ báo lỗi trên Github, mình sẽ loại trừ nó ra hết.

Gần đây mình có cập nhật TruyenFull downloader, tải xuống dạng epub, có mục lục, đọc luôn không cần làm thêm gì.
Bạn thử dùng script đó tải vài truyện đọc xem, nếu ổn, mình sẽ cập nhật luôn cho các script khác như: truyenyy, truyencv, yyapp
  Bài viết hay nhất5

@Zzbaivong wrote:Nếu trong nội dung truyện có dính quảng cáo, lệch dòng, ... bạn cứ báo lỗi trên Github, mình sẽ loại trừ nó ra hết.

Gần đây mình có cập nhật TruyenFull downloader, tải xuống dạng epub, có mục lục, đọc luôn không cần làm thêm gì.
Bạn thử dùng script đó tải vài truyện đọc xem, nếu ổn, mình sẽ cập nhật luôn cho các script khác như: truyenyy, truyencv, yyapp

có tải về thành dạng pdf được hem anh :D em rất thích trang truyện full, đọc dịch khá chuẩn
  Bài viết hay nhất6
Được nhưng không làm đâu, truyện chữ thì epub là chuẩn nhất, xem trên điện thoại vẫn tốt. Còn pdf dung lượng file sẽ lớn hơn rất nhiều, xem trên điện thoại chữ bị nhỏ, không hỗ trợ khả năng cuộn theo khung nhìn.
  Bài viết hay nhất7
trước giờ cứ tưởng foxit reader không hỗ trợ file ePub, mới xem thì thấy có  , làm hồi trước giờ có mấy quyển sách chỉ có file epub làm mình không tải được , cảm ơn anh Vong
  Bài viết hay nhất8
Ah, nếu mà bạn nào làm theo kiểu mình thì trên Calibre viewer sẽ hơi khó nhìn do các paragraph liên nhau quá (do điều chỉnh của zamzar nên ko có cách nào).

Để xem rõ hơn thì có thể thêm dòng này vào phần css stylesheet(Nhấn vào Preferences(bánh răng)--> (Tab) User Stylesheet---> Copy&Paste p {margin: 5; padding: 5;}
  Bài viết hay nhất9
Cập nhật v2.0.2:

Sửa lỗi do truyencv cập nhật giao diện.
Tải xuống định dạng epub.
  Bài viết hay nhất10
Nếu bạn nào muốn có file html để tự làm như bản cũ thì có thể extract file epub ra và lấy file xhtml để chuyển vào Mobipcoket Creator
Cho File Tai về đc là cửu tinh bá thể quyết.epub
Bước 1: Lấy file text ra
Nếu bạn ko có 7z hay winrar mà chỉ có mỗi winzip thì đổi đuôi về Cuu Tinh Ba The.zip rồi chọn Extract to "cửu tinh bá thể quyết/". Ta sẽ đc folder chứa các thành phần của file epub.

Mở Folder, CÓ 2 folder" Epub" và " "Meta-Inf" . Mở "EPUB" ra thì ta ta thấy các thành phần

"cửu tinh bá thể quyết-content.xhtml" là file text ta cần lấy. Copy ra nơi khác nếu muốn dùng lại file epub này còn ko thì cứ để đó

Trong này thì có file opf có thể đc mở bởi Mobipocket Creator để sửa lại metadata.Có thể sửa tên truyện, tác giả, nhà xuất bản..(vài thong tin xuất hiện trên thanh thông tin khi mở ebook)

Có cover của truyện

cửu tinh bá thể quyết-nav.xhtml là phần mục lục của truyện khi hiện lên trong khi đọc. Còn cửu tinh bá thể quyết.ncx mới là file Mục Lục mà epub sử dụng( vẫn có thể edit bằng Notepadd++)

Sau khi xử lý xong (thay dổi metadata,thay cover...) thì nén lại thư mục về zip rồi chuyển .zip-->.epub. Ta lại có file epub

Bước  2: xử lý text
Mở bằng Notepad++,ta được kiểu như thế này:

Del phần "Delete"(Từ đầu tới "Giới Thệu")  rồi thay code này vào:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>
Bỏ các khoảng trống bằng

Ta được

Tiếp theo là loại bỏ code section. Trước hết phải mark các line có chữ"section": (Ctrl+F)--> tab "Mark"--> Gõ "section" vào ô Find What:--->Nhớ nhấn chọn ô Bookmark line----> Nhấn "Mark All". Lúc này thì toàn bộ các line có chữ "section" sẽ bị marked

Bỏ các line nay bằng cách vào Menu Bar: "Search"---> Bookmark--->Remove bookmarked lines

Thay "<br /><br />" bằng "<br />"
Thay <br /> bằng <br>
Thay "<br>" bằng "<br>\n". Làm thế này là để cho tách line dài thành các line nhỏ hơn để dễ nhìn và chỉnh sửa. ( Nhớ là phải đánh dấu vào Extended hay Regular expression mới có tác dụng do có thên code "\n" )

Có thể mark các line là tiêu đề chương với key là  <h2> cho dễ phân biệt

Sau đó thì cứ làm như mình chỉ dẫn ở trên để có được file html để cho vào Mobipocket creator
  Bài viết hay nhất11
Do file epub mới tạo ra thực tế chủ yếu là 1 file html thêm chút mắm muối để chuyển thành epub nên sẽ load khá chậm so với file epub hoàn chỉnh. Đ
Đó là do chương trình đọc phải load cả file html với epub mới tạo trong khi Epub chuẩn có nhiều file html nhỏ, ở mội vị trí đọc thì chương trình chỉ load file html tại vị trí đó.

Cách nhanh nhất là convert lại epub này.

Bằng zamzar thì bạn có thể convert nó vế Mobi/PRC/AZW3 (3 cái này thuộc về cùng 1 loại thôi) các định dạng khác chỉ xử lý đc mấy file cỡ nhỏ cỡ 300-400 chương.
Sau khi đã convert ra xong thì down load cai file Mobi/PRC/AZW3 mới tạo về và tiếp tục convert trở lại thành Epub.

Lúc này thì file content sẽ bị chia thành các file nhỏ và Cover là cover mới do máy tạo ra.
Để thay cover thì extract file epub mới tải về ra và thay thế cover_image.jpg bằng cover mà ta mong muốn rồi nén lại, chuyển đuôi từ .zip về .epub
  Bài viết hay nhất12
ZBaivong ơi, phiên bản sau có thể bỏ đi cái date trong opf đc ko?

Do khi sửa metadata bằng mobipocket thì nó luôn báo lỗi format error và phải xóa đi.
  Bài viết hay nhất13
Vấn đề đó mình đã biết, nhưng do dùng thư viện bên thứ 3 nên không chỉnh được nhiều.
Mình cũng phải dùng Calibre chuyển lại epub lần nữa mới đọc trên WP được. PC và Android vẫn đọc được bình thường.
Có thời gian mình sẽ làm lại bộ build epub từ đầu.

Nếu build prc lại bằng Mobipocket thì bạn lấy file content.xhtml replace <h2> thành <h2 class="title">. Sau đó làm theo như hướng dẫn Tạo ebook prc là được. Có điều bị lỗi ký tự phần mục lục, chưa biết tại sao.
Nếu build epub thì cứ để nguyên vậy, dùng Calibre chuyển về epub lần nữa là được.
You cannot reply to topics in this forum