From d2906997929fd3b934cb1d658d75413d7537fbd8 Mon Sep 17 00:00:00 2001 From: PythonCoderAS <13932583+PythonCoderAS@users.noreply.github.com> Date: Sat, 4 Sep 2021 14:12:12 -0400 Subject: [PATCH 1/4] Delete VoidScans [domain certificate expired, likely not coming back] --- src/VoidScans/VoidScans.ts | 136 ------------------------------- src/VoidScans/VoidScansParser.ts | 99 ---------------------- src/VoidScans/includes/icon.svg | 3 - src/tests/VoidScans.test.ts | 80 ------------------ 4 files changed, 318 deletions(-) delete mode 100644 src/VoidScans/VoidScans.ts delete mode 100644 src/VoidScans/VoidScansParser.ts delete mode 100644 src/VoidScans/includes/icon.svg delete mode 100644 src/tests/VoidScans.test.ts diff --git a/src/VoidScans/VoidScans.ts b/src/VoidScans/VoidScans.ts deleted file mode 100644 index 5cb2e8a..0000000 --- a/src/VoidScans/VoidScans.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { - Chapter, - ChapterDetails, - HomeSection, - Manga, MangaTile, MangaUpdates, - PagedResults, - Request, RequestManager, - SearchRequest, - Source, - SourceInfo, TagType, -} from "paperback-extensions-common" -import {VoidScansParser} from "./VoidScansParser"; - -const BASE = "https://voidscans.net/" - -export const VoidScansInfo: SourceInfo = { - icon: "icon.svg", - version: "1.4.2", - name: "VoidScans", - author: "PythonCoderAS", - authorWebsite: "https://github.com/PythonCoderAS", - description: "Extension that pulls manga from VoidScans", - language: "en", - hentaiSource: false, - websiteBaseURL: BASE, - sourceTags: [ - { - text: "Broken", - type: TagType.RED - } - ] -} - -export class VoidScans extends Source { - - private readonly parser: VoidScansParser = new VoidScansParser(); - - - readonly requestManager: RequestManager = createRequestManager({ - requestsPerSecond: 5, - requestTimeout: 10000 - }); - - getMangaShareUrl(mangaId: string): string | null { - return `${BASE}/library/${mangaId}`; - } - - async getHomePageSections(sectionCallback: (section: HomeSection) => void): Promise { - sectionCallback(createHomeSection({ - id: "1", - items: (await this.getWebsiteMangaDirectory(null)).results, - title: "All Manga" - })); - } - - async getWebsiteMangaDirectory(metadata: any): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/library`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - return createPagedResults({ - results: this.parser.parseMangaList($, BASE) - }); - } - - async getChapterDetails(mangaId: string, chapterId: string): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/read/${mangaId}/${chapterId}`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - const pages = this.parser.parsePages($) - return createChapterDetails({ - id: chapterId, - longStrip: false, - mangaId: mangaId, - pages: pages - }) - } - - async getChapters(mangaId: string): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/library/${mangaId}`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - return this.parser.parseChapterList($, mangaId); - } - - async getMangaDetails(mangaId: string): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/library/${mangaId}`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - return this.parser.parseManga($, mangaId); - } - - async searchRequest(query: SearchRequest, metadata: any): Promise { - // TODO: Wait for search to be implemented on the website. - const results = (await this.getWebsiteMangaDirectory(null)).results; - const data: MangaTile[] = []; - for (let i = 0; i < results.length; i++) { - const key = results[i]; - if (query.title) { - if ((key.title.text || "").toLowerCase().includes((query.title.toLowerCase()))) { - data.push(key); - } - } - } - return createPagedResults({ - results: data - }); - } - - - async filterUpdatedManga(mangaUpdatesFoundCallback: (updates: MangaUpdates) => void, time: Date, ids: string[]): Promise { - // TODO: Wait for times to be implemented. - /* - const options: Request = createRequestObject({ - url: `${BASE}`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - mangaUpdatesFoundCallback(createMangaUpdates({ - ids: this.parser.parseUpdatedManga($, BASE, time) - })); - */ - } -} \ No newline at end of file diff --git a/src/VoidScans/VoidScansParser.ts b/src/VoidScans/VoidScansParser.ts deleted file mode 100644 index d1f0d64..0000000 --- a/src/VoidScans/VoidScansParser.ts +++ /dev/null @@ -1,99 +0,0 @@ -import {Chapter, LanguageCode, Manga, MangaStatus, MangaTile} from "paperback-extensions-common"; - -export class VoidScansParser { - parseMangaList($: CheerioStatic, base: string) { - const mangaTiles: MangaTile[] = []; - $("div.col").map((index, element) => { - const link = $("a.btn", element); - const linkId = link.attr("href"); - if (linkId){ - mangaTiles.push(createMangaTile({ - id: linkId.replace(`${base}/library/`, ""), - title: createIconText({ - text: $("h2", element).text() - }), - image: $("img", element).attr("src") || "", - primaryText: createIconText({ - text: $("p.card-text", element).text() - }) - })) - } - }) - return mangaTiles; - } - - parseUpdatedManga($: CheerioStatic, base: string, dateToCheck: Date){ - const ids: string[] = []; - $("div.col").map((index, element) => { - const link = $("a.btn", element); - const linkId = link.attr("href"); - if (linkId){ - const dateUpdated = $("small.text-muted").text(); - const parts = dateUpdated.split(" "); - if (parts.length === 2){ - const date = parts[0]; - const dateParts = date.split("/"); - let day = 0, month = 0, year = 0; - if (dateParts.length === 3){ - year = Number(dateParts[0]); - month = Number(dateParts[1]) - 1; - day = Number(dateParts[2]); - } - const time = parts[1]; - const timeParts = time.split("/"); - let second = 0, minute = 0, hour = 0; - if (timeParts.length === 3){ - hour = Number(timeParts[0]) - minute = Number(timeParts[1]) - second = Number(timeParts[2]) - const dateObj = new Date(Date.UTC(year, month, day, hour, minute, second)); - if (dateObj > dateToCheck){ - ids.push(linkId.replace(`${base}/library/`, "")) - } - } - } - } - }) - return ids; - } - - parsePages($: CheerioStatic): string[] { - const pages: string[] = []; - - $("#slideshow-container img").map((index, element) => { - if (element.attribs["src"]){ - pages.push(element.attribs["src"]) - } - }) - return pages; - } - - parseChapterList($: CheerioStatic, mangaId: string) { - const chapters: Chapter[] = []; - $("ul.list-group").first().children().map((index, element) => { - const link = $(element).first(); - const chapNum = Number(link.text().replace("Chapter ", "")); - const data: Chapter = { - chapNum: chapNum, - id: String(chapNum), - langCode: LanguageCode.ENGLISH, - mangaId: mangaId, - } - chapters.push(createChapter(data)) - }) - return chapters - } - - parseManga($: CheerioStatic, mangaId: string) { - const mangaObj: Manga = { - desc: $("p").first().text().trim(), - id: mangaId, - image: $("img#manga-img").attr("src") || "", - rating: 0, - status: MangaStatus.ONGOING, - titles: [$("h1").first().text()], - } - return createManga(mangaObj) - } - -} \ No newline at end of file diff --git a/src/VoidScans/includes/icon.svg b/src/VoidScans/includes/icon.svg deleted file mode 100644 index 7dde5e8..0000000 --- a/src/VoidScans/includes/icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/tests/VoidScans.test.ts b/src/tests/VoidScans.test.ts deleted file mode 100644 index a66dce6..0000000 --- a/src/tests/VoidScans.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import cheerio from "cheerio"; -import {VoidScans} from "../VoidScans/VoidScans"; -import {APIWrapper, Source} from "paperback-extensions-common"; - -describe("VoidScans Tests", function () { - let wrapper: APIWrapper = new APIWrapper(); - let source: Source = new VoidScans(cheerio); - let chai = require("chai"), - expect = chai.expect; - let chaiAsPromised = require("chai-as-promised"); - chai.use(chaiAsPromised); - - let mangaId = "6"; - - it("Retrieve Manga Details", async () => { - let details = await wrapper.getMangaDetails(source, mangaId); - expect( - details, - "No results found with test-defined ID [" + mangaId + "]" - ).to.exist; - - // Validate that the fields are filled - let data = details; - expect(data.id, "Missing ID").to.be.not.empty; - expect(data.image, "Missing Image").to.exist; - expect(data.status, "Missing Status").to.exist; - expect(data.titles, "Missing Titles").to.be.not.empty; - expect(data.rating, "Missing Rating").to.exist; - expect(data.desc, "Missing Description").to.be.not.empty; - }); - - it("Get Chapters", async () => { - let data = await wrapper.getChapters(source, mangaId); - - expect(data, "No chapters present for: [" + mangaId + "]").to.not.be.empty; - - let entry = data[0]; - expect(entry.id, "No ID present").to.not.be.empty; - expect(entry.chapNum, "No chapter number present").to.exist; - }); - - it("Get Chapter Details", async () => { - let chapters = await wrapper.getChapters(source, mangaId); - let data = await wrapper.getChapterDetails(source, mangaId, chapters[0].id); - - expect(data, "Empty server response").to.not.be.empty; - - expect(data.id, "Missing ID").to.be.not.empty; - expect(data.mangaId, "Missing MangaID").to.be.not.empty; - expect(data.pages, "No pages present").to.be.not.empty; - }); - - it("Testing search", async () => { - let testSearch = createSearchRequest({ - title: "Son", - }); - - let search = await wrapper.searchRequest(source, testSearch); - let result = search.results[0]; - - expect(result, "No response from server").to.exist; - - expect(result.id, "No ID found for search query").to.be.not.empty; - expect(result.title, "No title").to.be.not.empty; - }); - - it("Testing Home Page", async () => { - let result = await wrapper.getHomePageSections(source); - expect(result, "No response from server").to.exist; - let item = result[0]; - expect(item, "Empty response from server").to.exist; - if (item.items) { - let subitem = item.items[0]; - - expect(subitem.id, "No ID found for homepage item").to.not.be.empty; - expect(subitem.title, "No Title found for homepage item").to.not.be.empty; - expect(subitem.image, "No Image found for homepage item").to.not.be.empty; - } - }) -}); \ No newline at end of file From eb457735fd90277421796195b968da4591916bf9 Mon Sep 17 00:00:00 2001 From: PythonCoderAS <13932583+PythonCoderAS@users.noreply.github.com> Date: Sat, 4 Sep 2021 14:12:43 -0400 Subject: [PATCH 2/4] Delete GlitchyComics [domain is parked, likely not coming back] --- src/GlitchyComics/GlitchyComics.ts | 128 ----------------------- src/GlitchyComics/GlitchyComicsParser.ts | 102 ------------------ src/GlitchyComics/includes/icon.png | Bin 36416 -> 0 bytes src/tests/GlitchyComics.test.ts | 84 --------------- 4 files changed, 314 deletions(-) delete mode 100644 src/GlitchyComics/GlitchyComics.ts delete mode 100644 src/GlitchyComics/GlitchyComicsParser.ts delete mode 100644 src/GlitchyComics/includes/icon.png delete mode 100644 src/tests/GlitchyComics.test.ts diff --git a/src/GlitchyComics/GlitchyComics.ts b/src/GlitchyComics/GlitchyComics.ts deleted file mode 100644 index ac5bc68..0000000 --- a/src/GlitchyComics/GlitchyComics.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { - Chapter, - ChapterDetails, - HomeSection, - Manga, MangaUpdates, - PagedResults, - Request, RequestManager, - SearchRequest, - Source, - SourceInfo, -} from "paperback-extensions-common" -import {GlitchyComicsParser} from "./GlitchyComicsParser"; - -const BASE = "https://glitchycomics.com/" - -export const GlitchyComicsInfo: SourceInfo = { - icon: "icon.png", - version: "1.1.2", - name: "GlitchyComics", - author: "PythonCoderAS", - authorWebsite: "https://github.com/PythonCoderAS", - description: "Extension that pulls manga from GlitchyComics", - language: "en", - hentaiSource: false, - websiteBaseURL: BASE -} - -export class GlitchyComics extends Source { - - private readonly parser: GlitchyComicsParser = new GlitchyComicsParser(); - - readonly requestManager: RequestManager = createRequestManager({ - requestsPerSecond: 5, - requestTimeout: 10000 - }); - - getMangaShareUrl(mangaId: string): string | null { - return `${BASE}/${mangaId}`; - } - - async getHomePageSections(sectionCallback: (section: HomeSection) => void): Promise { - sectionCallback(createHomeSection({ - id: "1", - items: (await this.getWebsiteMangaDirectory(null)).results, - title: "All Manga" - })); - } - - async getWebsiteMangaDirectory(metadata: any): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/series-list`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - return createPagedResults({ - results: this.parser.parseMangaList($, BASE) - }); - } - - async getChapterDetails(mangaId: string, chapterId: string): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/${chapterId}`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - return createChapterDetails({ - id: chapterId, - longStrip: true, - mangaId: mangaId, - pages: this.parser.parsePages($) - }) - } - - async getChapters(mangaId: string): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/${mangaId}`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - return this.parser.parseChapterList($, mangaId, BASE); - } - - async getMangaDetails(mangaId: string): Promise { - const options: Request = createRequestObject({ - url: `${BASE}/${mangaId}`, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - return this.parser.parseManga($, mangaId, BASE); - } - - async doSearch(query: SearchRequest, page: number | null = null){ - let url = `${BASE}` - if (page !== null){ - url += `/page/${page}`; - } - if (query.title) { - url += `/?s=${query.title}` - } - const options: Request = createRequestObject({ - url: url, - method: 'GET' - }); - let response = await this.requestManager.schedule(options, 1); - let $ = this.cheerio.load(response.data); - let tiles = this.parser.parseSearchResult($, BASE); - if ($("a.next").length !== 0){ - tiles = tiles.concat(await this.doSearch(query, (page || 1)+1)); - } - return tiles; - } - - async searchRequest(query: SearchRequest, metadata: any): Promise { - return createPagedResults({ - results: await this.doSearch(query) - }); - } - - async filterUpdatedManga(mangaUpdatesFoundCallback: (updates: MangaUpdates) => void, time: Date, ids: string[]): Promise { - mangaUpdatesFoundCallback(createMangaUpdates({ - ids: ids - })); - } -} \ No newline at end of file diff --git a/src/GlitchyComics/GlitchyComicsParser.ts b/src/GlitchyComics/GlitchyComicsParser.ts deleted file mode 100644 index c5bec02..0000000 --- a/src/GlitchyComics/GlitchyComicsParser.ts +++ /dev/null @@ -1,102 +0,0 @@ -import {Chapter, LanguageCode, Manga, MangaStatus, MangaTile} from "paperback-extensions-common"; - -export class GlitchyComicsParser { - parseMangaList($: CheerioStatic, base: string) { - const mangaTiles: MangaTile[] = []; - $("div.vc_row.wpb_row.vc_row-fluid.vc_row-o-equal-height.vc_row-flex").map(((index, element) => { - $("div.wpb_column.vc_column_container.vc_col-sm-3.vc_col-xs-6", element).map(((index1, element1) => { - const link = $("a.vc_single_image-wrapper.vc_box_rounded.vc_box_border_grey", element1).first(); - const cover = $("img", link).first(); - const linkId = link.attr("href") - const imageLink = cover.attr("src") || ""; - if (linkId) { - mangaTiles.push(createMangaTile({ - id: linkId.replace(base + "/", "").replace("category/", ""), - image: imageLink || "", - title: createIconText({ - text: $("a", $("h6.vc_custom_heading", element1).first()).first().text() - }) - })) - } - })) - })) - return mangaTiles; - } - - parsePages($: CheerioStatic) { - const pages: string[] = []; - $("div.wp-block-image img", $("div.s-post-content.s-post-small-el.bb-mb-el").first()).map((index, element) => { - if ("attribs" in element && element.attribs["src"]){ - pages.push(element.attribs["src"]) - } - }) - return pages; - } - - parseChapterList($: CheerioStatic, mangaId: string, base: string) { - const chapters: Chapter[] = []; - $("ul#post-items").first().children().map(((index, element) => { - const header = $("header.entry-header", element).first(); - const link = $("a", header).first(); - const linkId = link.attr("href"); - const time = $("time.entry-date.updated", element).first().attr("datetime"); - if (linkId) { - const data: Chapter = { - chapNum: Number(link.text().replace("Chapter ", "")), - id: linkId.replace(base + "/", ""), - langCode: LanguageCode.ENGLISH, - mangaId: mangaId, - } - if (time) { - data.time = new Date(time); - } - chapters.push(createChapter(data)) - } - })) - return chapters - } - - parseManga($: CheerioStatic, mangaId: string, base: string) { - const authorAndArtistBlock = $("h4.ult-responsive.info-list-heading", $("div.vc_row.wpb_row.vc_inner.vc_row-fluid").first()); - const chapterList = this.parseChapterList($, mangaId, base)[0]; - const mangaObj: Manga = { - artist: authorAndArtistBlock.first().text(), - author: authorAndArtistBlock.last().text(), - desc: $("div.wpb_text_column.wpb_content_element").first().text(), - id: mangaId, - image: $("img.vc_single_image-img.attachment-full").attr("src") || "", - rating: 0, - status: MangaStatus.ONGOING, - titles: [$("h2.vc_custom_heading").first().text()], - } - if (chapterList) { - const lastTime = chapterList.time; - if (lastTime) { - mangaObj.lastUpdate = lastTime.toString(); - } - } - return createManga(mangaObj) - } - - parseSearchResult($: CheerioStatic, base: string) { - if ($("section.no-results.not-found").length !== 0) { - return []; - } else { - const tiles: MangaTile[] = []; - $("li.post-item", $("ul#post-items").first()).map(((index, element) => { - const link = $("a", $("h2.entry-title", element)); - const linkId = link.attr("href"); - if (linkId) { - tiles.push(createMangaTile({ - id: linkId.replace(base + "/", "").replace("category/", ""), - image: "", - title: createIconText({ - text: link.text() - }) - })) - } - })) - return tiles; - } - } -} \ No newline at end of file diff --git a/src/GlitchyComics/includes/icon.png b/src/GlitchyComics/includes/icon.png deleted file mode 100644 index 694fad6b19f31e4bc294f8e518e30ba9bc61ed28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36416 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 diff --git a/src/tests/GlitchyComics.test.ts b/src/tests/GlitchyComics.test.ts deleted file mode 100644 index b8dc9d0..0000000 --- a/src/tests/GlitchyComics.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import cheerio from "cheerio"; -import {GlitchyComics} from "../GlitchyComics/GlitchyComics"; -import {APIWrapper, Source} from "paperback-extensions-common"; - -describe("GlitchyComics Tests", function () { - let wrapper: APIWrapper = new APIWrapper(); - let source: Source = new GlitchyComics(cheerio); - let chai = require("chai"), - expect = chai.expect; - let chaiAsPromised = require("chai-as-promised"); - chai.use(chaiAsPromised); - - let mangaId = "forced-to-become-the-villains-son-in-law"; - - it("Retrieve Manga Details", async () => { - let details = await wrapper.getMangaDetails(source, mangaId); - expect( - details, - "No results found with test-defined ID [" + mangaId + "]" - ).to.exist; - - // Validate that the fields are filled - let data = details; - expect(data.id, "Missing ID").to.be.not.empty; - expect(data.image, "Missing Image").to.exist; - expect(data.status, "Missing Status").to.exist; - expect(data.titles, "Missing Titles").to.be.not.empty; - expect(data.rating, "Missing Rating").to.exist; - expect(data.artist, "Missing Artist").to.be.not.empty; - expect(data.author, "Missing Author").to.be.not.empty; - expect(data.desc, "Missing Description").to.be.not.empty; - expect(data.lastUpdate, "Missing Last Update").to.be.not.empty; - }); - - it("Get Chapters", async () => { - let data = await wrapper.getChapters(source, mangaId); - - expect(data, "No chapters present for: [" + mangaId + "]").to.not.be.empty; - - let entry = data[0]; - expect(entry.id, "No ID present").to.not.be.empty; - expect(entry.chapNum, "No chapter number present").to.exist; - expect(entry.time, "No time present").to.be.a("date"); - }); - - it("Get Chapter Details", async () => { - let chapters = await wrapper.getChapters(source, mangaId); - let data = await wrapper.getChapterDetails(source, mangaId, chapters[0].id); - - expect(data, "Empty server response").to.not.be.empty; - - expect(data.id, "Missing ID").to.be.not.empty; - expect(data.mangaId, "Missing MangaID").to.be.not.empty; - expect(data.pages, "No pages present").to.be.not.empty; - }); - - it("Testing search", async () => { - let testSearch = createSearchRequest({ - title: "Son", - }); - - let search = await wrapper.searchRequest(source, testSearch); - let result = search.results[0]; - - expect(result, "No response from server").to.exist; - - expect(result.id, "No ID found for search query").to.be.not.empty; - expect(result.title, "No title").to.be.not.empty; - }); - - it("Testing Home Page", async () => { - let result = await wrapper.getHomePageSections(source); - expect(result, "No response from server").to.exist; - let item = result[0]; - expect(item, "Empty response from server").to.exist; - if (item.items) { - let subitem = item.items[0]; - - expect(subitem.id, "No ID found for homepage item").to.not.be.empty; - expect(subitem.title, "No Title found for homepage item").to.not.be.empty; - expect(subitem.image, "No Image found for homepage item").to.not.be.empty; - } - }) -}); \ No newline at end of file From b800e12898cea3675e43d04de4d1e7fa95c57044 Mon Sep 17 00:00:00 2001 From: IntermittentlyRupert <4526480+IntermittentlyRupert@users.noreply.github.com> Date: Sun, 12 Sep 2021 19:39:34 +1000 Subject: [PATCH 3/4] fix(catmanga): SearchRequest is now immutable (#9) --- src/CatManga/CatManga.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/CatManga/CatManga.ts b/src/CatManga/CatManga.ts index cc39993..c965a7c 100644 --- a/src/CatManga/CatManga.ts +++ b/src/CatManga/CatManga.ts @@ -15,7 +15,7 @@ const BASE = "https://catmanga.org/" export const CatMangaInfo: SourceInfo = { icon: "icon.png", - version: "1.2.9", + version: "1.2.10", name: "CatManga", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", @@ -101,18 +101,15 @@ export class CatManga extends Source { async searchRequest(query: SearchRequest, metadata: any): Promise { // TODO: Wait for search to be implemented on the website. const results = (await this.getWebsiteMangaDirectory(null)).results; + + let data: MangaTile[]; if (query.title){ - query.title = query.title.replace(/\+/g, " ").trim(); - } - const data: MangaTile[] = []; - for (let i = 0; i < results.length; i++) { - const key = results[i]; - if (query.title) { - if ((key.title.text || "").toLowerCase().includes((query.title.toLowerCase()))) { - data.push(key); - } - } + const filterTitle = query.title.replace(/\+/g, " ").trim().toLowerCase(); + data = results.filter((key) => (key.title.text || "").toLowerCase().includes(filterTitle)) + } else { + data = results; } + console.log(data.length) return createPagedResults({ results: data From e4ce3e4608b5c1353da9ff9815ee730ed06d9505 Mon Sep 17 00:00:00 2001 From: PythonCoderAS <13932583+PythonCoderAS@users.noreply.github.com> Date: Fri, 19 Nov 2021 17:55:11 -0500 Subject: [PATCH 4/4] Deprecate --- README.md | 4 +++- src/CatManga/CatManga.ts | 22 ++++++++++++++++++---- src/DankeFurs/DankeFurs.ts | 6 +++++- src/Dridespoon/Dridespoon.ts | 10 +++++++++- src/Hachirumi/Hachirumi.ts | 6 +++++- src/MahouShoujoBu/MahouShoujoBu.ts | 6 +++++- src/NovelCool/NovelCool.ts | 12 +++++++++--- src/RainOfSnow/RainOfSnow.ts | 12 +++++++++--- src/SenManga/SenManga.ts | 6 +++++- 9 files changed, 68 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index b4ca1c2..96db36f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# PythonCoderAS Sources +**Deprecated: I will no longer update these extensions. Please use other extensions as a replacement.** + +# PythonCoderAS Sources Misc. sources for scanlators and aggregators. # Websites diff --git a/src/CatManga/CatManga.ts b/src/CatManga/CatManga.ts index cc39993..c7234dd 100644 --- a/src/CatManga/CatManga.ts +++ b/src/CatManga/CatManga.ts @@ -2,12 +2,16 @@ import { Chapter, ChapterDetails, HomeSection, - Manga, MangaTile, MangaUpdates, + Manga, + MangaTile, + MangaUpdates, PagedResults, - Request, RequestManager, + Request, + RequestManager, SearchRequest, Source, SourceInfo, + TagType, } from "paperback-extensions-common" import {CatMangaParser} from "./CatMangaParser"; @@ -15,14 +19,24 @@ const BASE = "https://catmanga.org/" export const CatMangaInfo: SourceInfo = { icon: "icon.png", - version: "1.2.9", + version: "1.2.10", name: "CatManga", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", description: "Extension that pulls manga from CatManga", language: "en", hentaiSource: false, - websiteBaseURL: BASE + websiteBaseURL: BASE, + sourceTags: [ + { + text: "Site Down Forever", + type: TagType.RED + }, + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED + } + ] } export class CatManga extends Source { diff --git a/src/DankeFurs/DankeFurs.ts b/src/DankeFurs/DankeFurs.ts index 117d5c0..3741833 100644 --- a/src/DankeFurs/DankeFurs.ts +++ b/src/DankeFurs/DankeFurs.ts @@ -5,7 +5,7 @@ const BASE = "https://danke.moe/" export const DankeFursInfo: SourceInfo = { icon: "icon.png", - version: "1.1.2", + version: "1.1.3", name: "DankeFurs", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", @@ -21,6 +21,10 @@ export const DankeFursInfo: SourceInfo = { { text: "Cloudflare", type: TagType.RED + }, + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED } ] } diff --git a/src/Dridespoon/Dridespoon.ts b/src/Dridespoon/Dridespoon.ts index cb71c0f..ba5ce4e 100644 --- a/src/Dridespoon/Dridespoon.ts +++ b/src/Dridespoon/Dridespoon.ts @@ -21,7 +21,7 @@ const BASE = "http://dridesp.ooo/" export const DridespoonInfo: SourceInfo = { icon: "icon.png", - version: "1.0.0", + version: "1.0.1", name: "Dridespoon", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", @@ -33,6 +33,14 @@ export const DridespoonInfo: SourceInfo = { { text: "Notifications", type: TagType.GREEN + }, + { + text: "Site Down Forever", + type: TagType.RED + }, + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED } ] } diff --git a/src/Hachirumi/Hachirumi.ts b/src/Hachirumi/Hachirumi.ts index caa8237..d7e81aa 100644 --- a/src/Hachirumi/Hachirumi.ts +++ b/src/Hachirumi/Hachirumi.ts @@ -5,7 +5,7 @@ const BASE = "https://hachirumi.com/" export const HachirumiInfo: SourceInfo = { icon: "icon.png", - version: "1.1.0", + version: "1.1.1", name: "Hachirumi", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", @@ -21,6 +21,10 @@ export const HachirumiInfo: SourceInfo = { { text: "Cloudflare", type: TagType.RED + }, + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED } ] } diff --git a/src/MahouShoujoBu/MahouShoujoBu.ts b/src/MahouShoujoBu/MahouShoujoBu.ts index 7edfdae..03b9cd6 100644 --- a/src/MahouShoujoBu/MahouShoujoBu.ts +++ b/src/MahouShoujoBu/MahouShoujoBu.ts @@ -5,7 +5,7 @@ const BASE = "https://mahoushoujobu.com/" export const MahouShoujoBuInfo: SourceInfo = { icon: "icon.png", - version: "1.0.5", + version: "1.0.6", name: "MahouShoujoBu", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", @@ -17,6 +17,10 @@ export const MahouShoujoBuInfo: SourceInfo = { { text: "Notifications", type: TagType.GREEN + }, + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED } ] } diff --git a/src/NovelCool/NovelCool.ts b/src/NovelCool/NovelCool.ts index ba3fcec..e514bb2 100644 --- a/src/NovelCool/NovelCool.ts +++ b/src/NovelCool/NovelCool.ts @@ -9,7 +9,7 @@ import { SearchRequest, Source, SourceInfo, - TagSection, + TagSection, TagType, } from "paperback-extensions-common" import {NovelCoolParser} from "./NovelCoolParser"; @@ -17,14 +17,20 @@ const BASE = "https://www.novelcool.com/" export const NovelCoolInfo: SourceInfo = { icon: "icon.png", - version: "1.0.2", + version: "1.0.3", name: "NovelCool", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", description: "Extension that pulls manga from NovelCool", language: "en", hentaiSource: false, - websiteBaseURL: BASE + websiteBaseURL: BASE, + sourceTags: [ + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED + } + ] } export class NovelCool extends Source { diff --git a/src/RainOfSnow/RainOfSnow.ts b/src/RainOfSnow/RainOfSnow.ts index 3a1c986..741063f 100644 --- a/src/RainOfSnow/RainOfSnow.ts +++ b/src/RainOfSnow/RainOfSnow.ts @@ -7,7 +7,7 @@ import { Request, RequestManager, SearchRequest, Source, - SourceInfo, + SourceInfo, TagType, } from "paperback-extensions-common" import {RainOfSnowParser} from "./RainOfSnowParser"; @@ -15,14 +15,20 @@ const BASE = "https://rainofsnow.com/" export const RainOfSnowInfo: SourceInfo = { icon: "icon.png", - version: "1.4.1", + version: "1.4.2", name: "RainOfSnow", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", description: "Extension that pulls manga from RainOfSnow", language: "en", hentaiSource: false, - websiteBaseURL: BASE + websiteBaseURL: BASE, + sourceTags: [ + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED + } + ] } export class RainOfSnow extends Source { diff --git a/src/SenManga/SenManga.ts b/src/SenManga/SenManga.ts index c0a06eb..2bf41c5 100644 --- a/src/SenManga/SenManga.ts +++ b/src/SenManga/SenManga.ts @@ -17,7 +17,7 @@ const BASE = "https://raw.senmanga.com/" export const SenMangaInfo: SourceInfo = { icon: "icon.png", - version: "1.0.4", + version: "1.0.5", name: "SenManga", author: "PythonCoderAS", authorWebsite: "https://github.com/PythonCoderAS", @@ -29,6 +29,10 @@ export const SenMangaInfo: SourceInfo = { { text: "Notifications", type: TagType.GREEN + }, + { + text: "Deprecated - Will Not Be Updated", + type: TagType.RED } ] }