From 6f0e679ba463a233e9550c39757198d5936180b4 Mon Sep 17 00:00:00 2001 From: Rider21 <58046032+Rider21@users.noreply.github.com> Date: Sat, 23 Mar 2024 06:20:00 +0300 Subject: [PATCH] Add zelluloza source. (#842) * zelluloza * Update zelluloza.ts * Update zelluloza.ts --- icons/src/ru/zelluloza/icon.png | Bin 0 -> 23797 bytes plugins/russian/zelluloza.ts | 440 ++++++++++++++++++++++++++++++++ 2 files changed, 440 insertions(+) create mode 100644 icons/src/ru/zelluloza/icon.png create mode 100644 plugins/russian/zelluloza.ts diff --git a/icons/src/ru/zelluloza/icon.png b/icons/src/ru/zelluloza/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c5babc64102bda39db0897cb5454f65702d92e GIT binary patch literal 23797 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, + ): Promise { + const sort = showLatestNovels ? "0.0" : filters?.sort?.value || "6.0"; + const genres = filters?.genres?.value || ""; + + const body = await fetchApi(this.site + "/ajaxcall/", { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Referer: this.site + "/top/freebooks/", + Origin: this.site, + }, + method: "POST", + body: qs.stringify({ + op: "morebooks", + par1: "", + par2: `125:0:${genres}:0.${sort}.0.0.0.0.0.0.0.0.0.1.s.1..:${pageNo}`, + par4: "", + }), + }).then((res) => res.text()); + const loadedCheerio = parseHTML(body); + const novels: Plugin.NovelItem[] = []; + + loadedCheerio('div[style="display: flex"]').each((index, element) => { + novels.push({ + name: loadedCheerio(element).find('span[itemprop="name"]').text() || "", + cover: + this.site + + loadedCheerio(element).find('img[class="shadow"]').attr("src"), + path: ( + loadedCheerio(element).find('img[class="shadow"]').attr("onclick") || + "" + ).replace(/\D/g, ""), + }); + }); + + return novels; + } + + async parseNovel(novelPath: string): Promise { + const body = await fetchApi(this.resolveUrl(novelPath, true)) + .then((res) => res.text()); + const loadedCheerio = parseHTML(body); + + const novel: Plugin.SourceNovel = { + path: novelPath, + name: loadedCheerio('span[itemprop="name"]').text(), + cover: this.site + loadedCheerio('img[class="shadow"]').attr("src"), + genres: loadedCheerio(".gnres").text()?.split?.(": ")?.[1], + summary: + loadedCheerio("#bann_full").text() || + loadedCheerio("#bann_short").text(), + author: loadedCheerio(".author_link").text(), + status: loadedCheerio(".tech_decription").text().includes("Пишется") + ? NovelStatus.Ongoing + : NovelStatus.Completed, + }; + + const chapters: Plugin.ChapterItem[] = []; + loadedCheerio('ul[class="g0"] div[class="w800_m"]').each( + (chapterIndex, element) => { + const isFree = loadedCheerio(element).find('div[class="chaptfree"]').length; + if (isFree) { + const chapter = loadedCheerio(element).find('a[class="chptitle"]'); + const releaseDate = loadedCheerio(element) + .find('div[class="stat"]') + .text(); + chapters.push({ + name: chapter.text().trim(), + path: (chapter.attr("href") || "").split("/").slice(2, 4).join("/"), + releaseTime: this.parseDate(releaseDate), + chapterNumber: chapterIndex + 1, + }); + } + }, + ); + + novel.chapters = chapters; + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const [bookID, chapterID] = chapterPath.split("/"); + const body = await fetchApi(this.site + "/ajaxcall/", { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Referer: this.resolveUrl(chapterPath), + Origin: this.site, + }, + method: "POST", + body: qs.stringify({ + op: "getbook", + par1: bookID, + par2: chapterID, + }), + }).then((res) => res.text()); + + const encrypted = body.split("")[0].split("\n"); + const decrypted = encrypted + .map((str) => decrypt(str)) + .join("") + .replace(/\r/g, "") + .trim(); + + const chapterText = decrypted //cosmetic filters + .replace(/\[\*]([\s\S]*?)\[\/]/g, "$1") + .replace(/\[_]([\s\S]*?)\[\/]/g, "$1") + .replace(/\[-]([\s\S]*?)\[\/]/g, "$1") + .replace(/\[~]([\s\S]*?)\[\/]/g, "$1"); /* + .replace(/\[!]([\s\S]*?)\[\/]/g, '$1') + .replace(/\[ctr]([\s\S]*?)\[\/]/g, "
$1
") + .replace(/\[rht]([\s\S]*?)\[\/]/g, '$1') + .replace(/\[grn]([\s\S]*?)\[\/]/g, '$1') + .replace(/\[red]([\s\S]*?)\[\/]/g, '$1') + .replace(/\[blu]([\s\S]*?)\[\/]/g, '$1') + .replace(/\[gry]([\s\S]*?)\[\/]/g, '$1') + .replace(/\[geo]([\s\S]*?)\[\/]/g, '$1') + .replace(/\[gld]([\s\S]*?)\[\/]/g, '$1');*/ + + return chapterText; + } + + async searchNovels( + searchTerm: string, + pageNo: number, + ): Promise { + const body = await fetchApi(this.site + "/ajaxcall/", { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Referer: this.site + "/search/done/#result", + Origin: this.site, + }, + method: "POST", + body: qs.stringify({ + op: "morebooks", + par1: searchTerm, + par2: "206:0:0:0.0.0.0.0.0.0.10.0.0.0.0.0..0..:" + pageNo, + par4: "", + }), + }).then((res) => res.text()); + const loadedCheerio = parseHTML(body); + const novels: Plugin.NovelItem[] = []; + + loadedCheerio('div[style="display: flex"]').each((index, element) => { + novels.push({ + name: loadedCheerio(element).find('span[itemprop="name"]').text() || "", + cover: + this.site + + loadedCheerio(element).find('img[class="shadow"]').attr("src"), + path: ( + loadedCheerio(element).find('img[class="shadow"]').attr("onclick") || + "" + ).replace(/\D/g, ""), + }); + }); + + return novels; + } + + parseDate = (dateString: string | undefined = "") => { + const [, day, month, year, hour, minute] = + dateString.match(/(\d{2})\.(\d{2})\.(\d{4})г (\d{2}):(\d{2})/) || []; + + if (day && month && year && hour && minute) { + return dayjs( + year + "-" + month + "-" + day + " " + hour + ":" + minute, + ).format("LLL"); + } + + return null; + }; + + fetchImage = fetchFile; + resolveUrl = (path: string, isNovel?: boolean) => + this.site + "/books/" + path; + + filters = { + sort: { + label: "Сортировка", + value: "6.0", + options: [ + { label: "Топ-недели", value: "6.0" }, + { label: "Бестселеры", value: "5.0" }, + { label: "Популярные у читателей", value: "2.0" }, + { label: "Книжные новинки", value: "0.0" }, + { label: "Законченные книги", value: "0.1" }, + ], + type: FilterTypes.Picker, + }, + genres: { + label: "Жанры", + value: "", + options: [ + { label: "Все", value: "" }, + { label: "16+", value: "204" }, + { label: "18+", value: "100" }, + { label: "Авантюра", value: "347" }, + { label: "Альтернативная история", value: "55" }, + { label: "Ангст", value: "463" }, + { label: "Аниме", value: "405" }, + { label: "Антиутопия", value: "21" }, + { label: "Апокалипсис", value: "368" }, + { label: "Аудиокнига", value: "391" }, + { label: "Байки", value: "435" }, + { label: "Бизнес-книги", value: "522" }, + { label: "Биография", value: "52" }, + { label: "Биопанк", value: "379" }, + { label: "Боевая фантастика", value: "512" }, + { label: "Боевик", value: "61" }, + { label: "Боевые искусства", value: "142" }, + { label: "Бояръ-аниме", value: "433" }, + { label: "Вбоквелл", value: "372" }, + { label: "Вестерн", value: "96" }, + { label: "Война миров", value: "137" }, + { label: "Восточное фэнтези", value: "505" }, + { label: "Городское фентези", value: "63" }, + { label: "Городское фэнтези", value: "520" }, + { label: "Готика", value: "83" }, + { label: "Детективы", value: "4" }, + { label: "Детские книги", value: "8" }, + { label: "Документальные книги", value: "351" }, + { label: "Дом и дача", value: "534" }, + { label: "Дорожные истории", value: "41" }, + { label: "Драма", value: "47" }, + { label: "Древняя литература", value: "529" }, + { label: "Женский психологический роман", value: "186" }, + { label: "Женский роман", value: "141" }, + { label: "Зарубежная классика", value: "524" }, + { label: "Здоровье и красота", value: "533" }, + { label: "Изучение языков", value: "537" }, + { label: "Иронический детектив", value: "85" }, + { label: "Исследования", value: "156" }, + { label: "Историческая литература", value: "3" }, + { label: "Исторический любовный роман", value: "518" }, + { label: "Историческое фэнтези", value: "90" }, + { label: "Киберпанк", value: "7" }, + { label: "Классическая литература", value: "9" }, + { label: "Книга-игра", value: "371" }, + { label: "Книги для родителей", value: "535" }, + { label: "Комедия", value: "80" }, + { label: "Конкурсные сборники", value: "349" }, + { label: "Короткий любовный роман", value: "517" }, + { label: "Космическая фантастика", value: "513" }, + { label: "Космоопера", value: "58" }, + { label: "Криминальная проза", value: "35" }, + { label: "Криптоистория", value: "400" }, + { label: "Ксенофантастика", value: "102" }, + { label: "Культура и искусство", value: "536" }, + { label: "Легенды", value: "161" }, + { label: "Лирика", value: "49" }, + { label: "ЛитРПГ", value: "62" }, + { label: "Любовная фантастика", value: "516" }, + { label: "Любовное фэнтези", value: "515" }, + { label: "Любовный роман", value: "46" }, + { label: "Магический реализм", value: "42" }, + { label: "Матриархат", value: "385" }, + { label: "Медицина", value: "57" }, + { label: "Мелодрама", value: "45" }, + { label: "Мемуары", value: "532" }, + { label: "Метафизика", value: "430" }, + { label: "Милитари", value: "126" }, + { label: "Мистика", value: "22" }, + { label: "Морские приключения", value: "211" }, + { label: "Мотивация", value: "135" }, + { label: "Научная фантастика", value: "122" }, + { label: "Научно-популярная", value: "43" }, + { label: "Ненаучная фантастика", value: "387" }, + { label: "Новелла", value: "498" }, + { label: "Нон-фикшн", value: "507" }, + { label: "Нуар", value: "121" }, + { label: "О войне", value: "136" }, + { label: "Оккультизм", value: "424" }, + { label: "Параллельные миры", value: "438" }, + { label: "Пародия", value: "108" }, + { label: "Подростковая фантастика", value: "27" }, + { label: "Подростковый роман", value: "388" }, + { label: "Подростковый ужастик", value: "110" }, + { label: "Постапокалипсис", value: "82" }, + { label: "Постапокалиптика", value: "67" }, + { label: "Поэзия", value: "44" }, + { label: "Превращение", value: "170" }, + { label: "Приключение", value: "497" }, + { label: "Приключения", value: "5" }, + { label: "Природа и животные", value: "538" }, + { label: "Проза", value: "95" }, + { label: "Производственный роман", value: "148" }, + { label: "Психология", value: "31" }, + { label: "Путешествия", value: "383" }, + { label: "Рассказы", value: "101" }, + { label: "Реализм", value: "422" }, + { label: "РеалРПГ", value: "442" }, + { label: "Религия", value: "188" }, + { label: "Робинзонада", value: "434" }, + { label: "Романтика", value: "130" }, + { label: "Романтическая фантастика", value: "501" }, + { label: "Русская классика", value: "523" }, + { label: "Рыцарский роман", value: "112" }, + { label: "Символизм", value: "439" }, + { label: "Сказки", value: "93" }, + { label: "Славянское фэнтези", value: "508" }, + { label: "Сновидения", value: "428" }, + { label: "Современный любовный роман", value: "519" }, + { label: "Социально-психологическая фантастика", value: "98" }, + { label: "Спорт", value: "147" }, + { label: "Справочники", value: "528" }, + { label: "Стимпанк", value: "56" }, + { label: "Субкультура", value: "209" }, + { label: "Сюрреализм", value: "26" }, + { label: "Тёмное фэнтези", value: "437" }, + { label: "Техномагия", value: "159" }, + { label: "Триллер", value: "6" }, + { label: "Трэш", value: "162" }, + { label: "Ужасы", value: "531" }, + { label: "Утопия", value: "191" }, + { label: "Учебник", value: "411" }, + { label: "Фантастика", value: "1" }, + { label: "Фантастический боевик", value: "38" }, + { label: "Фанфик", value: "111" }, + { label: "Философия", value: "461" }, + { label: "Фурри", value: "394" }, + { label: "Фэнтези", value: "2" }, + { label: "Хентай", value: "441" }, + { label: "Хобби и досуг", value: "530" }, + { label: "Хоррор", value: "86" }, + { label: "Чёрный юмор", value: "73" }, + { label: "Эзотерика", value: "30" }, + { label: "Экшн", value: "94" }, + { label: "Эпическое фэнтези", value: "499" }, + { label: "Эротика", value: "19" }, + { label: "Эссе", value: "353" }, + { label: "ЭТТИ", value: "502" }, + { label: "Юмористическая литература", value: "20" }, + { label: "Юмористическая фантастика", value: "514" }, + { label: "Юмористическое фэнтези", value: "521" }, + { label: "EVE - Миры Содружества", value: "99" }, + ], + type: FilterTypes.Picker, + }, + } satisfies Filters; +} + +const alphabet: { [key: string]: string } = { + "~": "0", + "H": "1", + "^": "2", + "@": "3", + "f": "4", + "0": "5", + "5": "6", + "n": "7", + "r": "8", + "=": "9", + "W": "a", + "L": "b", + "7": "c", + " ": "d", + "u": "e", + "c": "f", +}; + +function decrypt(encrypt: string) { + if (!encrypt) return ""; + const hexArray = []; + + for (let j = 0; j < encrypt.length; j += 2) { + const firstChar = encrypt.substring(j, j + 1); + const secondChar = encrypt.substring(j + 1, j + 2); + hexArray.push(alphabet[firstChar] + alphabet[secondChar]); + } + + return "

" + hexToUtf8(hexArray) + "

"; +} + +function hexToUtf8(hexArray: string[]) { + let index = 0; + let result = ""; + + while (index < hexArray.length) { + const currentHex = parseInt(hexArray[index], 16) & 0xff; + + if (currentHex < 128) { + if (currentHex < 16) { + switch (currentHex) { + case 9: + result += " "; + break; + case 13: + result += "\r"; + break; + case 10: + result += "\n"; + break; + } + } else { + result += String.fromCharCode(currentHex); + } + index++; + } else if (currentHex > 191 && currentHex < 224) { + if (index + 1 < hexArray.length) { + const nextHex = parseInt(hexArray[index + 1], 16) & 0xff; + result += String.fromCharCode( + ((currentHex & 31) << 6) | (nextHex & 63), + ); + } + index += 2; + } else { + if (index + 2 < hexArray.length) { + const nextHex = parseInt(hexArray[index + 1], 16) & 0xff; + const thirdHex = parseInt(hexArray[index + 2], 16) & 0xff; + result += String.fromCharCode( + ((currentHex & 15) << 12) | ((nextHex & 63) << 6) | (thirdHex & 63), + ); + } + index += 3; + } + } + + return result; +} + +export default new Zelluloza();