mirror of
https://github.com/kodjodevf/mangayomi-extensions.git
synced 2026-02-14 10:51:17 +00:00
add more langs
This commit is contained in:
committed by
GitHub
parent
a27d7bf2f6
commit
e38e417ad4
@@ -1,6 +1,6 @@
|
|||||||
const mangayomiSources = [{
|
const mangayomiSources = [{
|
||||||
"name": "Webtoons",
|
"name": "Webtoons",
|
||||||
"lang": "en",
|
"langs": ["en", "fr", "id", "th", "es", "zh", "de"],
|
||||||
"baseUrl": "https://www.webtoons.com",
|
"baseUrl": "https://www.webtoons.com",
|
||||||
"apiUrl": "",
|
"apiUrl": "",
|
||||||
"iconUrl": "https://upload.wikimedia.org/wikipedia/commons/0/09/Naver_Line_Webtoon_logo.png",
|
"iconUrl": "https://upload.wikimedia.org/wikipedia/commons/0/09/Naver_Line_Webtoon_logo.png",
|
||||||
@@ -10,7 +10,7 @@ const mangayomiSources = [{
|
|||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"dateFormat": "",
|
"dateFormat": "",
|
||||||
"dateFormatLocale": "",
|
"dateFormatLocale": "",
|
||||||
"pkgPath": "https://github.com/kodjodevf/mangayomi-extensions/blob/main/javascript/manga/src/all/webtoons.js"
|
"pkgPath": "manga/src/all/webtoons.js"
|
||||||
}];
|
}];
|
||||||
|
|
||||||
class DefaultExtension extends MProvider {
|
class DefaultExtension extends MProvider {
|
||||||
@@ -23,11 +23,11 @@ class DefaultExtension extends MProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async getItem(url, p) {
|
async getItem(url, selector) {
|
||||||
const res = await new Client().get(this.source.baseUrl + url, this.headers);
|
const res = await new Client().get(this.source.baseUrl + url, this.headers);
|
||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
const mangas = [];
|
const mangas = [];
|
||||||
const elements = doc.select(p);
|
const elements = doc.select(selector);
|
||||||
for (const element of elements) {
|
for (const element of elements) {
|
||||||
const linkElement = element.selectFirst("a");
|
const linkElement = element.selectFirst("a");
|
||||||
const imageElement = linkElement.selectFirst("img");
|
const imageElement = linkElement.selectFirst("img");
|
||||||
@@ -53,7 +53,7 @@ class DefaultExtension extends MProvider {
|
|||||||
async getPopular(page) {
|
async getPopular(page) {
|
||||||
const baseUrl = this.source.baseUrl;
|
const baseUrl = this.source.baseUrl;
|
||||||
const client = new Client();
|
const client = new Client();
|
||||||
const res = await client.get(`${baseUrl}/en/originals`);
|
const res = await client.get(`${baseUrl}/${this.langCode()}/originals`);
|
||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
|
|
||||||
const days = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"];
|
const days = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"];
|
||||||
@@ -99,8 +99,7 @@ class DefaultExtension extends MProvider {
|
|||||||
|
|
||||||
async getLatestUpdates(page) {
|
async getLatestUpdates(page) {
|
||||||
const Day = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];
|
const Day = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY'];
|
||||||
|
const list = await this.getItem(`/${this.langCode()}/originals?sortOrder=UPDATE`, "div.daily_section._list_" + Day[new Date().getDay()] + " li");
|
||||||
const list = await this.getItem(`/en/originals?sortOrder=UPDATE`, "div.daily_section._list_" + Day[new Date().getDay()] + " li");
|
|
||||||
return {
|
return {
|
||||||
list: list,
|
list: list,
|
||||||
hasNextPage: false
|
hasNextPage: false
|
||||||
@@ -119,8 +118,8 @@ class DefaultExtension extends MProvider {
|
|||||||
let list = [];
|
let list = [];
|
||||||
|
|
||||||
if (query !== "") {
|
if (query !== "") {
|
||||||
list_originals = await this.getItem(`/en/search?keyword=${keyword}&searchType=` + type_originals + `&page=${page}`, fetch_originals);
|
list_originals = await this.getItem(`/${this.langCode()}/search?keyword=${keyword}&searchType=` + type_originals + `&page=${page}`, fetch_originals);
|
||||||
list_canvas = await this.getItem(`/en/search?keyword=${keyword}&searchType=` + type_canvas + `&page=${page}`, fetch_canvas);
|
list_canvas = await this.getItem(`/${this.langCode()}/search?keyword=${keyword}&searchType=` + type_canvas + `&page=${page}`, fetch_canvas);
|
||||||
if (filters) { }
|
if (filters) { }
|
||||||
list = list_originals.concat(list_canvas);
|
list = list_originals.concat(list_canvas);
|
||||||
} else {
|
} else {
|
||||||
@@ -135,22 +134,10 @@ class DefaultExtension extends MProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getDetail(url) {
|
async getDetail(url) {
|
||||||
function formatDateString(dateStr) {
|
|
||||||
const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
||||||
const parts = dateStr.split(' ');
|
|
||||||
|
|
||||||
if (parts.length === 3) {
|
|
||||||
const month = months.indexOf(parts[0]) + 1;
|
|
||||||
const day = parts[1].replace(',', '');
|
|
||||||
const year = parts[2];
|
|
||||||
return `${year}-${month.toString().padStart(2, '0')}-${day.padStart(2, '0')}`;
|
|
||||||
}
|
|
||||||
return dateStr;
|
|
||||||
}
|
|
||||||
const res = await new Client().get(url);
|
const res = await new Client().get(url);
|
||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
const info = doc.selectFirst("div.cont_box");
|
const info = doc.selectFirst("div.cont_box");
|
||||||
const cover = info.selectFirst("span.thmb img").attr('src') ?? (info.selectFirst("div.detail_body.banner").attr('style').match(/url\(["']?([^"')]+)["']?\)/))[1];
|
const cover = info.selectFirst("div.detail_body")?.attr("style")?.substringAfter("url(")?.substringBeforeLast(")") ?? info.selectFirst("span.thmb img").attr('src');
|
||||||
const title = info.selectFirst("h1.subj, h3.subj").text.trim();
|
const title = info.selectFirst("h1.subj, h3.subj").text.trim();
|
||||||
const genre = Array.from(info.select("p.genre")).map(el => el.text) != '' ? Array.from(info.select("p.genre")).map(el => el.text) : [info.selectFirst("div.info h2").text];
|
const genre = Array.from(info.select("p.genre")).map(el => el.text) != '' ? Array.from(info.select("p.genre")).map(el => el.text) : [info.selectFirst("div.info h2").text];
|
||||||
const author = info.selectFirst("div.author_area").text.replace(/\s+/g, ' ').replace(/author info/g, '').trim() ?? info.selectFirst("a.author").text;
|
const author = info.selectFirst("div.author_area").text.replace(/\s+/g, ' ').replace(/author info/g, '').trim() ?? info.selectFirst("a.author").text;
|
||||||
@@ -175,7 +162,7 @@ class DefaultExtension extends MProvider {
|
|||||||
for (const element of elements) {
|
for (const element of elements) {
|
||||||
tester = element.selectFirst("span.tx").text.trim();
|
tester = element.selectFirst("span.tx").text.trim();
|
||||||
const dateString = element.selectFirst("span.date").text.trim();
|
const dateString = element.selectFirst("span.date").text.trim();
|
||||||
const date = new Date(formatDateString(dateString));
|
const date = new Date(this.formatDateString(dateString, this.source.lang));
|
||||||
const millisecondsSinceEpoch = date.getTime();
|
const millisecondsSinceEpoch = date.getTime();
|
||||||
const millisecondsString = millisecondsSinceEpoch.toString();
|
const millisecondsString = millisecondsSinceEpoch.toString();
|
||||||
chapters.push({
|
chapters.push({
|
||||||
@@ -190,16 +177,88 @@ class DefaultExtension extends MProvider {
|
|||||||
name: title,
|
name: title,
|
||||||
link: url,
|
link: url,
|
||||||
genre: genre,
|
genre: genre,
|
||||||
imageUrl: cover,
|
|
||||||
description: desc,
|
description: desc,
|
||||||
|
imageUrl: cover,
|
||||||
author: author,
|
author: author,
|
||||||
status: status,
|
status: status,
|
||||||
episodes: chapters
|
episodes: chapters
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
langCode() {
|
||||||
|
return {
|
||||||
|
en: "en",
|
||||||
|
fr: "fr",
|
||||||
|
id: "id",
|
||||||
|
th: "th",
|
||||||
|
es: "es",
|
||||||
|
zh: "zh-hant",
|
||||||
|
de: "de"
|
||||||
|
}[this.source.lang];
|
||||||
|
}
|
||||||
|
|
||||||
|
formatDateString(dateStr, lang) {
|
||||||
|
// Month translations for supported languages
|
||||||
|
const monthTranslations = {
|
||||||
|
en: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
||||||
|
fr: ["janv.", "fév.", "mars.", "avr.", "mai.", "juin.", "juil.", "août.", "sept.", "oct.", "nov.", "déc."],
|
||||||
|
id: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agt", "Sep", "Okt", "Nov", "Des"],
|
||||||
|
th: ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."],
|
||||||
|
es: ["ene.", "feb.", "mar.", "abr.", "may.", "jun.", "jul.", "ago.", "sep.", "oct.", "nov.", "dic."],
|
||||||
|
zh: [], // No need for month names; uses yyyy年MM月dd日 format
|
||||||
|
de: [] // No need for month names; uses dd.MM.yyyy format
|
||||||
|
};
|
||||||
|
const months = monthTranslations[lang];
|
||||||
|
let parts;
|
||||||
|
let month;
|
||||||
|
let day;
|
||||||
|
let year;
|
||||||
|
// Handle formats based on the language
|
||||||
|
switch (lang) {
|
||||||
|
case "zh":
|
||||||
|
// Expected format: yyyy年MM月dd日
|
||||||
|
const match = dateStr.match(/(\d{4})年(\d{1,2})月(\d{1,2})日/);
|
||||||
|
year = match[1];
|
||||||
|
month = match[2];
|
||||||
|
day = match[3];
|
||||||
|
case "de":
|
||||||
|
// Expected format: dd.MM.yyyy
|
||||||
|
parts = dateStr.split('.');
|
||||||
|
if (parts.length === 3) {
|
||||||
|
month = parts[1];
|
||||||
|
day = parts[0];
|
||||||
|
year = parts[2];
|
||||||
|
}
|
||||||
|
case "es":
|
||||||
|
case "fr":
|
||||||
|
case "id":
|
||||||
|
case "th":
|
||||||
|
// Expected format: dd MMM yyyy
|
||||||
|
parts = dateStr.split(' ');
|
||||||
|
if (parts.length === 3) {
|
||||||
|
month = months.indexOf(parts[1]) + 1;
|
||||||
|
day = parts[0];
|
||||||
|
year = parts[2];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
parts = dateStr.split(' ');
|
||||||
|
if (parts.length === 3) {
|
||||||
|
month = months.indexOf(parts[0]) + 1;
|
||||||
|
day = parts[1].replace(',', '');
|
||||||
|
year = parts[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!month || !year || !day) {
|
||||||
|
return new Date.toString();
|
||||||
|
}
|
||||||
|
return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
async getPageList(url) {
|
async getPageList(url) {
|
||||||
const preference = new SharedPreferences();
|
|
||||||
const res = await new Client().get(url);
|
const res = await new Client().get(url);
|
||||||
const doc = new Document(res.body);
|
const doc = new Document(res.body);
|
||||||
const urls = [];
|
const urls = [];
|
||||||
@@ -322,7 +381,4 @@ class DefaultExtension extends MProvider {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
getSourcePreferences() {
|
|
||||||
throw new Error("getSourcePreferences not implemented");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user