From ceccd87036dee8d408adcda815a880e8f2a257ea Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 24 Dec 2024 13:18:02 +0530 Subject: [PATCH 1/7] extension(mangapill): Added popular and latest section --- javascript/manga/src/en/mangapill.js | 112 +++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 javascript/manga/src/en/mangapill.js diff --git a/javascript/manga/src/en/mangapill.js b/javascript/manga/src/en/mangapill.js new file mode 100644 index 00000000..e61e402b --- /dev/null +++ b/javascript/manga/src/en/mangapill.js @@ -0,0 +1,112 @@ +const mangayomiSources = [{ + "name": "Mangapill", + "lang": "en", + "baseUrl": "https://mangapill.com", + "apiUrl": "", + "iconUrl": "https://www.google.com/s2/favicons?sz=64&domain=https://mangapill.com/", + "typeSource": "single", + "isManga": true, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "" +}]; + +class DefaultExtension extends MProvider { + getHeaders(url) { + return { + "Referer": this.source.baseUrl + } + } + async print(msg) { console.log(msg) } + + async getPreference(key) { + const preferences = new SharedPreferences(); + return parseInt(preferences.get(key)) + } + + async getMangaList(slug) { + var url = `${this.source.baseUrl}${slug}` + var res = await new Client().get(url, this.getHeaders()); + var doc = new Document(res.body); + var list = []; + var mangaElements = doc.select("div.grid.gap-3.lg > div") + for (var manga of mangaElements) { + var details = manga.selectFirst('div').select('a'); + var detLen = details.length + details = details[detLen - 1] + + var imageUrl = manga.selectFirst("img").getSrc; + var link = details.getHref; + var name = details.selectFirst('div').text; + list.push({ name, imageUrl, link }); + } + var hasNextPage = false; + return { list, hasNextPage } + } + + async getNavPage(prefKey) { + var val = await this.getPreference(prefKey); + var slug = '' + switch (val) { + case 1: { + slug = 'mangas/new' + break; + } + case 2: { + slug = 'chapters' + break; + } + } + return await this.getMangaList(slug) + } + + async getPopular(page) { + return await this.getNavPage("pref_popular_content"); + } + get supportsLatest() { + throw new Error("supportsLatest not implemented"); + } + async getLatestUpdates(page) { + return await this.getNavPage("pref_latest_content"); + } + async search(query, page, filters) { + throw new Error("search not implemented"); + } + async getDetail(url) { + throw new Error("getDetail not implemented"); + } + // For anime episode video list + async getVideoList(url) { + throw new Error("getVideoList not implemented"); + } + // For manga chapter pages + async getPageList() { + throw new Error("getPageList not implemented"); + } + getFilterList() { + throw new Error("getFilterList not implemented"); + } + getSourcePreferences() { + return [{ + key: 'pref_popular_content', + listPreference: { + title: 'Preferred popular content', + summary: '', + valueIndex: 0, + entries: ["New Mangas", "Recent Chapters"], + entryValues: ["1", "2"] + } + }, { + key: 'pref_latest_content', + listPreference: { + title: 'Preferred latest content', + summary: '', + valueIndex: 1, + entries: ["New Mangas", "Recent Chapters"], + entryValues: ["1", "2"] + } + }, + ]; + } +} From 3e2bca48f9bb11c66b953308469ee47d9d0a3cee Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 24 Dec 2024 13:35:13 +0530 Subject: [PATCH 2/7] extension(mangapill): Added search --- javascript/manga/src/en/mangapill.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/javascript/manga/src/en/mangapill.js b/javascript/manga/src/en/mangapill.js index e61e402b..db21146d 100644 --- a/javascript/manga/src/en/mangapill.js +++ b/javascript/manga/src/en/mangapill.js @@ -6,10 +6,10 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=64&domain=https://mangapill.com/", "typeSource": "single", "isManga": true, - "version": "0.0.1", + "version": "0.0.2", "dateFormat": "", "dateFormatLocale": "", - "pkgPath": "" + "pkgPath": "manga/src/en/mangapill.js" }]; class DefaultExtension extends MProvider { @@ -42,6 +42,9 @@ class DefaultExtension extends MProvider { list.push({ name, imageUrl, link }); } var hasNextPage = false; + if (slug.includes("search?q")) { + hasNextPage = doc.selectFirst(".container.py-3 a.btn.btn-sm").className ? true : false + } return { list, hasNextPage } } @@ -70,8 +73,13 @@ class DefaultExtension extends MProvider { async getLatestUpdates(page) { return await this.getNavPage("pref_latest_content"); } + + async searchManga(query, status, type, page) { + var slug = `search?q=${query}&status=${status}&type=${type}&page=${page}` + return await this.getMangaList(slug) + } async search(query, page, filters) { - throw new Error("search not implemented"); + return await this.searchManga(query, "", "", page); } async getDetail(url) { throw new Error("getDetail not implemented"); From 907373de03fc676d3f066418704164fc4d6453b5 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 24 Dec 2024 19:29:18 +0530 Subject: [PATCH 3/7] extension(mangapill): Added manga details --- javascript/manga/src/en/mangapill.js | 43 ++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/javascript/manga/src/en/mangapill.js b/javascript/manga/src/en/mangapill.js index db21146d..a939fd62 100644 --- a/javascript/manga/src/en/mangapill.js +++ b/javascript/manga/src/en/mangapill.js @@ -6,7 +6,7 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=64&domain=https://mangapill.com/", "typeSource": "single", "isManga": true, - "version": "0.0.2", + "version": "0.0.3", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "manga/src/en/mangapill.js" @@ -18,7 +18,17 @@ class DefaultExtension extends MProvider { "Referer": this.source.baseUrl } } - async print(msg) { console.log(msg) } + print(msg) { console.log(msg) } + + statusCode(status) { + return { + "publishing": 0, + "finished": 1, + "on hiatus": 2, + "discontinued": 3, + "not yet published": 4, + }[status] ?? 5; + } async getPreference(key) { const preferences = new SharedPreferences(); @@ -81,8 +91,35 @@ class DefaultExtension extends MProvider { async search(query, page, filters) { return await this.searchManga(query, "", "", page); } + + async getMangaDetail(slug) { + var link = `${this.source.baseUrl}${slug}` + var res = await new Client().get(link, this.getHeaders()); + var doc = new Document(res.body); + + var mangaName = doc.selectFirst(".mb-3 .font-bold.text-lg").text + var description = doc.selectFirst("meta[name='description']").attr("content") + var imageUrl = doc.selectFirst(".w-full.h-full").getSrc + var statusText = doc.select(".grid.grid-cols-1 > div")[1].selectFirst("div").text + var status = this.statusCode(statusText) + + var genre = [] + var genreList = doc.select("a.mr-1") + for (var gen of genreList) { genre.push(gen.text) } + + var chapters = [] + var chapList = doc.select("div.my-3.grid > a") + for (var chap of chapList) { + var name = chap.text + var url = chap.getHref + chapters.push({ name, url }) + } + return { name: mangaName, description, link, imageUrl, status, genre, chapters } + } + async getDetail(url) { - throw new Error("getDetail not implemented"); + return await this.getMangaDetail(url.substring(1,)); + } // For anime episode video list async getVideoList(url) { From 2672f4b55b05991754ecb0598a4ff7a08be7f006 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 24 Dec 2024 19:53:57 +0530 Subject: [PATCH 4/7] extension(mangapill): Added manga title pref --- javascript/manga/src/en/mangapill.js | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/javascript/manga/src/en/mangapill.js b/javascript/manga/src/en/mangapill.js index a939fd62..2fe44cec 100644 --- a/javascript/manga/src/en/mangapill.js +++ b/javascript/manga/src/en/mangapill.js @@ -6,7 +6,7 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=64&domain=https://mangapill.com/", "typeSource": "single", "isManga": true, - "version": "0.0.3", + "version": "0.0.4", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "manga/src/en/mangapill.js" @@ -36,6 +36,8 @@ class DefaultExtension extends MProvider { } async getMangaList(slug) { + var lang = await this.getPreference("pref_title_lang"); + var url = `${this.source.baseUrl}${slug}` var res = await new Client().get(url, this.getHeaders()); var doc = new Document(res.body); @@ -48,7 +50,10 @@ class DefaultExtension extends MProvider { var imageUrl = manga.selectFirst("img").getSrc; var link = details.getHref; - var name = details.selectFirst('div').text; + var nameSection = details.select('div'); + + var name = (nameSection[1] && lang == 2) ? nameSection[1].text : nameSection[0].text + list.push({ name, imageUrl, link }); } var hasNextPage = false; @@ -93,16 +98,19 @@ class DefaultExtension extends MProvider { } async getMangaDetail(slug) { + var lang = await this.getPreference("pref_title_lang"); + var link = `${this.source.baseUrl}${slug}` var res = await new Client().get(link, this.getHeaders()); var doc = new Document(res.body); var mangaName = doc.selectFirst(".mb-3 .font-bold.text-lg").text + if (doc.selectFirst(".mb-3 .text-sm.text-secondary") && lang == 2) mangaName = doc.selectFirst(".mb-3 .text-sm.text-secondary").text var description = doc.selectFirst("meta[name='description']").attr("content") var imageUrl = doc.selectFirst(".w-full.h-full").getSrc var statusText = doc.select(".grid.grid-cols-1 > div")[1].selectFirst("div").text var status = this.statusCode(statusText) - + var genre = [] var genreList = doc.select("a.mr-1") for (var gen of genreList) { genre.push(gen.text) } @@ -151,7 +159,16 @@ class DefaultExtension extends MProvider { entries: ["New Mangas", "Recent Chapters"], entryValues: ["1", "2"] } - }, + }, { + key: 'pref_title_lang', + listPreference: { + title: 'Preferred title language', + summary: '', + valueIndex: 0, + entries: ["Romaji", "English"], + entryValues: ["1", "2"] + } + } ]; } } From 8ea64c081b3172710f0813d7af0b0b784b1497f2 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Wed, 25 Dec 2024 15:50:26 +0530 Subject: [PATCH 5/7] extension(mangapill): Added search filters --- javascript/manga/src/en/mangapill.js | 98 ++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 4 deletions(-) diff --git a/javascript/manga/src/en/mangapill.js b/javascript/manga/src/en/mangapill.js index 2fe44cec..16de93ab 100644 --- a/javascript/manga/src/en/mangapill.js +++ b/javascript/manga/src/en/mangapill.js @@ -89,12 +89,20 @@ class DefaultExtension extends MProvider { return await this.getNavPage("pref_latest_content"); } - async searchManga(query, status, type, page) { - var slug = `search?q=${query}&status=${status}&type=${type}&page=${page}` + async searchManga(query, status, type, genre, page) { + var slug = `search?q=${query}&status=${status}&type=${type}${genre}&page=${page}` return await this.getMangaList(slug) } async search(query, page, filters) { - return await this.searchManga(query, "", "", page); + var type = filters[0].values[filters[0].state].value + var status = filters[1].values[filters[1].state].value + + var genre = "" + for (var filter of filters[2].state) { + if (filter.state == true) + genre += `&genre=${filter.value}` + } + return await this.searchManga(query, status, type, genre, page); } async getMangaDetail(slug) { @@ -138,7 +146,89 @@ class DefaultExtension extends MProvider { throw new Error("getPageList not implemented"); } getFilterList() { - throw new Error("getFilterList not implemented"); + return [ + { + type_name: "SelectFilter", + name: "Type", + state: 0, + values: [ + ["All", ""], + ["Manga", "manga"], + ["Novel", "novel"], + ["One-Shot", "one-shot"], + ["Doujinshi", "doujinshi"], + ["Manhwa", "manhwa"], + ["Manhua", "manhua"], + ["Oel", "oel"] + ].map(x => ({ type_name: 'SelectOption', name: x[0], value: x[1] })) + }, + { + type_name: "SelectFilter", + name: "Status", + state: 0, + values: [ + ["All", ""], + ["Publishing", "publishing"], + ["Finished", "finished"], + ["On hiatus", "on hiatus"], + ["Discontinued", "discontinued"], + ["Not yet published", "not yet published"] + ].map(x => ({ type_name: 'SelectOption', name: x[0], value: x[1] })) + }, { + type_name: "GroupFilter", + name: "Genre", + state: [ + ["Action", "Action"], + ["Adventure", "Adventure"], + ["Cars", "Cars"], + ["Comedy", "Comedy"], + ["Dementia", "Dementia"], + ["Demons", "Demons"], + ["Doujinshi", "Doujinshi"], + ["Drama", "Drama"], + ["Ecchi", "Ecchi"], + ["Fantasy", "Fantasy"], + ["Game", "Game"], + ["Gender Bender", "Gender Bender"], + ["Harem", "Harem"], + ["Historical", "Historical"], + ["Horror", "Horror"], + ["Isekai", "Isekai"], + ["Josei", "Josei"], + ["Kids", "Kids"], + ["Magic", "Magic"], + ["Martial Arts", "Martial Arts"], + ["Mecha", "Mecha"], + ["Military", "Military"], + ["Music", "Music"], + ["Mystery", "Mystery"], + ["Parody", "Parody"], + ["Police", "Police"], + ["Psychological", "Psychological"], + ["Romance", "Romance"], + ["Samurai", "Samurai"], + ["School", "School"], + ["Sci-Fi", "Sci-Fi"], + ["Seinen", "Seinen"], + ["Shoujo", "Shoujo"], + ["Shoujo Ai", "Shoujo Ai"], + ["Shounen", "Shounen"], + ["Shounen Ai", "Shounen Ai"], + ["Slice of Life", "Slice of Life"], + ["Space", "Space"], + ["Sports", "Sports"], + ["Super Power", "Super Power"], + ["Supernatural", "Supernatural"], + ["Thriller", "Thriller"], + ["Tragedy", "Tragedy"], + ["Vampire", "Vampire"], + ["Yaoi", "Yaoi"], + ["Yuri", "Yuri"] + ].map(x => ({ type_name: 'CheckBox', name: x[0], value: x[1] })) + } + + ]; + } getSourcePreferences() { return [{ From b33aff784f8c41e119b9ae2728f2a70040c32fb7 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Wed, 25 Dec 2024 16:11:47 +0530 Subject: [PATCH 6/7] extension(mangapill): Added get pages --- javascript/manga/src/en/mangapill.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/javascript/manga/src/en/mangapill.js b/javascript/manga/src/en/mangapill.js index 16de93ab..3d757537 100644 --- a/javascript/manga/src/en/mangapill.js +++ b/javascript/manga/src/en/mangapill.js @@ -6,7 +6,7 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=64&domain=https://mangapill.com/", "typeSource": "single", "isManga": true, - "version": "0.0.4", + "version": "0.0.5", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "manga/src/en/mangapill.js" @@ -142,9 +142,24 @@ class DefaultExtension extends MProvider { throw new Error("getVideoList not implemented"); } // For manga chapter pages - async getPageList() { - throw new Error("getPageList not implemented"); + async getPageList(url) { + var link = `${this.source.baseUrl}${url.substring(1,)}` + + var res = await new Client().get(link, this.getHeaders()); + var doc = new Document(res.body); + + var urls = []; + + var pages = doc.select("chapter-page") + for (var page of pages) { + var img = page.selectFirst("img").getSrc + if (img != null) urls.push(img); + } + + return urls } + + getFilterList() { return [ { From a1a349c5d4ad0b1f3d2a97daa38b147bad6ee342 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Wed, 25 Dec 2024 16:13:00 +0530 Subject: [PATCH 7/7] extension(mangapill): release --- javascript/manga/src/en/mangapill.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/javascript/manga/src/en/mangapill.js b/javascript/manga/src/en/mangapill.js index 3d757537..422ee4d0 100644 --- a/javascript/manga/src/en/mangapill.js +++ b/javascript/manga/src/en/mangapill.js @@ -6,7 +6,7 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=64&domain=https://mangapill.com/", "typeSource": "single", "isManga": true, - "version": "0.0.5", + "version": "1.0.0", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "manga/src/en/mangapill.js" @@ -18,7 +18,6 @@ class DefaultExtension extends MProvider { "Referer": this.source.baseUrl } } - print(msg) { console.log(msg) } statusCode(status) { return { @@ -85,6 +84,7 @@ class DefaultExtension extends MProvider { get supportsLatest() { throw new Error("supportsLatest not implemented"); } + async getLatestUpdates(page) { return await this.getNavPage("pref_latest_content"); } @@ -93,6 +93,7 @@ class DefaultExtension extends MProvider { var slug = `search?q=${query}&status=${status}&type=${type}${genre}&page=${page}` return await this.getMangaList(slug) } + async search(query, page, filters) { var type = filters[0].values[filters[0].state].value var status = filters[1].values[filters[1].state].value @@ -141,6 +142,7 @@ class DefaultExtension extends MProvider { async getVideoList(url) { throw new Error("getVideoList not implemented"); } + // For manga chapter pages async getPageList(url) { var link = `${this.source.baseUrl}${url.substring(1,)}` @@ -159,7 +161,6 @@ class DefaultExtension extends MProvider { return urls } - getFilterList() { return [ { @@ -243,8 +244,8 @@ class DefaultExtension extends MProvider { } ]; - } + getSourcePreferences() { return [{ key: 'pref_popular_content',