From abd7e06eea6c7af395530a8f563c405c512e47f4 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 8 Dec 2024 18:47:42 +0100 Subject: [PATCH 1/8] AnimeToast partial rewrite in js --- javascript/anime/src/de/animetoast.js | 184 ++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 javascript/anime/src/de/animetoast.js diff --git a/javascript/anime/src/de/animetoast.js b/javascript/anime/src/de/animetoast.js new file mode 100644 index 0000000..c0c9d1f --- /dev/null +++ b/javascript/anime/src/de/animetoast.js @@ -0,0 +1,184 @@ +const mangayomiSources = [{ + "name": "AnimeToast", + "lang": "de", + "baseUrl": "https://www.animetoast.cc", + "apiUrl": "", + "iconUrl": "https://www.animetoast.cc/wp-content/uploads/2018/03/toastfavi-300x300.png", + "typeSource": "single", + "isManga": false, + "isNsfw": false, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "" +}]; + +class DefaultExtension extends MProvider { + + constructor () { + super(); + this.client = new Client(); + } + + async getPopular(page) { + const baseUrl = this.source.baseUrl; + const res = await this.client.get(baseUrl); + const document = new Document(res.body); + const elements = document.select("div.row div.col-md-4 div.video-item"); + const list = await Promise.all( + elements.map(async (element) => { + const name = element.selectFirst("div.item-thumbnail a").attr("title"); + const fullLink = element.selectFirst("div.item-thumbnail a").attr("href"); + const link = fullLink.startsWith(baseUrl) ? fullLink.substring(baseUrl.length) : fullLink; + const detailsRes = await this.client.get(fullLink); + const detailsDoc = new Document(detailsRes.body); + const imageUrl = detailsDoc.selectFirst(".item-content p img").attr("src"); + return { name, imageUrl, link }; + }) + ); + return { + list: list, + hasNextPage: false, + }; + } + + get supportsLatest() { + return false; + } + + async search(query, page, filters) { + const baseUrl = this.source.baseUrl; + const res = await this.client.get(`${baseUrl}/page/${page}/?s=${query}`); + const document = new Document(res.body); + const hasNextPage = document.selectFirst("li.next a")?.attr("href") != null; + const elements = document.select("div.item-thumbnail a[href]"); + const list = await Promise.all( + elements.map(async (element) => { + const name = element.attr("title"); + const fullLink = element.attr("href"); + const link = fullLink.startsWith(baseUrl) ? fullLink.substring(baseUrl.length) : fullLink; + const detailsRes = await this.client.get(fullLink); + const detailsDoc = new Document(detailsRes.body); + const imageUrl = detailsDoc.selectFirst(".item-content p img").attr("src"); + return { name, imageUrl, link }; + }) + ); + return { + list: list, + hasNextPage, + } + } + + async getDetail(url) { + const baseUrl = this.source.baseUrl; + const res = await this.client.get(baseUrl + url); + const document = new Document(res.body); + const name = document.selectFirst("h1").text; + const imageUrl = document.selectFirst(".item-content p img").attr("src"); + const description = document.selectFirst("div.item-content div + p").text; + const genreText = document.xpathFirst('//p[contains(text(),"Genre:")]/text()') || ""; + const genre = genreText.replace("Genre:", "").split(",").map(tag => tag.trim()); + const categoryTag = document.xpath('//*[@rel="category tag"]/text()'); + const status = categoryTag.includes("Airing") ? 0 : 1; + + let episodes = []; + const promises = []; + promises.push(this.episodeFromElement(document, categoryTag)); + for (const p of (await Promise.allSettled(promises))) { + if (p.status == 'fulfilled') { + episodes.push(...p.value); + } + } + episodes.reverse(); + return { description, genre, status, episodes, name, imageUrl }; + } + + async episodeFromElement(element, categoryTag) { + const list = []; + if (categoryTag.includes("Serie")) { + const episodeElements = element.selectFirst("#multi_link_tab0")?.attr("id") != null + ? element.select("#multi_link_tab0 a") + : element.select("#multi_link_tab1 a"); + for (const episodeElement of episodeElements) { + const name = episodeElement.text.trim(); + const link = episodeElement.attr("href"); + const url = link.startsWith(this.source.baseUrl) ? link.substring(this.source.baseUrl.length) : link; + if (name && url) { + list.push({ name, url }); + } + } + } else { + const name = element.selectFirst("h1.light-title").text + const url = element.selectFirst("#multi_link_tab0 a").attr("href"); + if (name && url) { + list.push({ name, url }); + } + } + return list; + } + + async getVideoList(url) { + const baseUrl = this.source.baseUrl; + const res = await this.client.get(baseUrl + url); + const document = new Document(res.body); + const fEp = document.selectFirst("div.tab-pane"); + const videos = []; + const ep = []; + let epcu = 100; + if (fEp.text.includes(":") || fEp.text.includes("-")) { + const tx = document.select("div.tab-pane"); + + for (let e of tx) { + const sUrl = e.selectFirst("a").attr("href"); + const doc = new Document((await this.client.get(sUrl)).body); + const nUrl = doc.selectFirst("#player-embed a").attr("href"); + const nDoc = new Document((await this.client.get(nUrl)).body); + const currentLink = document.selectFirst("div.tab-pane a.current-link")?.text || ""; + const substringAfter = (text, delimiter) => { + const index = text.indexOf(delimiter); + return index !== -1 ? text.substring(index + delimiter.length) : ""; + }; + epcu = parseInt(substringAfter(currentLink, "Ep.")) || 100; + ep = nDoc.select("div.tab-pane a"); + } + } else { + const currentLink = document.selectFirst("div.tab-pane a.current-link")?.text || ""; + const substringAfter = (text, delimiter) => { + const index = text.indexOf(delimiter); + return index !== -1 ? text.substring(index + delimiter.length) : ""; + }; + epcu = parseInt(substringAfter(currentLink, "Ep.")) || 100; + ep = nDoc.select("div.tab-pane a"); + } + } + + getFilterList() { + throw new Error("getFilterList not implemented"); + } + + getSourcePreferences() { + const hosts = ['VOE', 'DoodStream', 'Filemoon', 'Mp4Upload']; + return [ + { + key: 'preferred_hoster', + listPreference: { + title: 'Standard-Hoster', + summary: '', + valueIndex: 0, + entries: hosts, + entryValues: hosts + } + }, + { + key: "hoster_selection", + multiSelectListPreference: { + title: "Hoster auswählen", + summary: "", + entries: hosts, + entryValues: hosts, + values: hosts + } + } + ]; + } +} -- 2.45.2 From 37e3b206a19a51688291b13f237946a46e4b5cf4 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 13 Dec 2024 02:57:21 +0100 Subject: [PATCH 2/8] dateUpload for AniWorld & SerienStream - dateUpload - + improved performance using Promise.all instead of sequentially with the for loops. --- javascript/anime/src/de/aniworld.js | 57 +++++++++++++++++-------- javascript/anime/src/de/serienstream.js | 57 +++++++++++++++++-------- 2 files changed, 78 insertions(+), 36 deletions(-) diff --git a/javascript/anime/src/de/aniworld.js b/javascript/anime/src/de/aniworld.js index ae60b0e..a68f272 100644 --- a/javascript/anime/src/de/aniworld.js +++ b/javascript/anime/src/de/aniworld.js @@ -85,17 +85,10 @@ class DefaultExtension extends MProvider { author = produzent[0].select("li").map(e => e.text).join(", "); } const seasonsElements = document.select("#stream > ul:nth-child(1) > li > a"); - - const promises = []; - const episodes = []; - for (const element of seasonsElements) { - promises.push(this.parseEpisodesFromSeries(element)); - } - for (const p of (await Promise.allSettled(promises))) { - if (p.status == 'fulfilled') { - episodes.push(...p.value); - } - } + const promises = seasonsElements.map(element => this.parseEpisodesFromSeries(element)); + const episodes = (await Promise.allSettled(promises)) + .filter(p => p.status === 'fulfilled') + .flatMap(p => p.value); episodes.reverse(); return { name, imageUrl, description, author, status: 5, genre, episodes }; } @@ -103,16 +96,13 @@ class DefaultExtension extends MProvider { const seasonId = element.getHref; const res = await this.client.get(this.source.baseUrl + seasonId); const episodeElements = new Document(res.body).select("table.seasonEpisodesList tbody tr"); - const list = []; - for (const episodeElement of episodeElements) { - list.push(this.episodeFromElement(episodeElement)); - } - return list; + return Promise.all(episodeElements.map(e => this.episodeFromElement(e))); } - episodeFromElement(element) { + async episodeFromElement(element) { const titleAnchor = element.selectFirst("td.seasonEpisodeTitle a"); const episodeSpan = titleAnchor.selectFirst("span"); const url = titleAnchor.attr("href"); + const dateUpload = await this.getUploadDateFromEpisode(url); const episodeSeasonId = element.attr("data-episode-season-id"); let episode = episodeSpan.text.replace(/'/g, "'"); let name = ""; @@ -122,7 +112,38 @@ class DefaultExtension extends MProvider { const seasonMatch = url.match(/staffel-(\d+)\/episode/); name = `Staffel ${seasonMatch[1]} Folge ${episodeSeasonId} : ${episode}`; } - return name && url ? { name, url } : {}; + return name && url ? { name, url, dateUpload } : {}; + } + async getUploadDateFromEpisode(url) { + const baseUrl = this.source.baseUrl; + const res = await this.client.get(baseUrl + url); + const getLastSundayOfMonth = (year, month) => { + const lastDay = new Date(year, month, 0); + const lastSunday = lastDay.getDate() - lastDay.getDay(); + return new Date(year, month - 1, lastSunday); + }; + const document = new Document(res.body); + const dateString = document.selectFirst('strong[style="color: white;"]').text; + const dateTimePart = dateString.split(", ")[1]; + const [date, time] = dateTimePart.split(" "); + const [day, month, year] = date.split("."); + const [hours, minutes] = time.split(":"); + const dayInt = parseInt(day); + const monthInt = parseInt(month); + const yearInt = parseInt(year); + const hoursInt = parseInt(hours); + const minutesInt = parseInt(minutes); + const lastSundayOfMarch = getLastSundayOfMonth(yearInt, 3); + const lastSundayOfOctober = getLastSundayOfMonth(yearInt, 10); + const jsDate = new Date(yearInt, monthInt - 1, dayInt, hoursInt, minutesInt); + // If Date between lastSundayOfMarch & lastSundayOfOctober -> CEST (MESZ) + const isInDST = jsDate >= lastSundayOfMarch && jsDate < lastSundayOfOctober; + let timeZoneOffset = isInDST ? 0 : 1; + // If it's in CEST, subtract 1 hour from UTC (to get local time in CEST) + const correctedTime = new Date(jsDate.getTime() + (timeZoneOffset - 1) * 60 * 60 * 1000); + // Convert to epoch time + const epochTime = Math.floor(correctedTime.getTime() / 1000); + return epochTime.toString(); // dateUpload is a string containing date expressed in millisecondsSinceEpoch. } async getVideoList(url) { const baseUrl = this.source.baseUrl; diff --git a/javascript/anime/src/de/serienstream.js b/javascript/anime/src/de/serienstream.js index 72b6887..63220a0 100644 --- a/javascript/anime/src/de/serienstream.js +++ b/javascript/anime/src/de/serienstream.js @@ -85,17 +85,10 @@ class DefaultExtension extends MProvider { author = produzent[0].select("li").map(e => e.text).join(", "); } const seasonsElements = document.select("#stream > ul:nth-child(1) > li > a"); - - const promises = []; - const episodes = []; - for (const element of seasonsElements) { - promises.push(this.parseEpisodesFromSeries(element)); - } - for (const p of (await Promise.allSettled(promises))) { - if (p.status == 'fulfilled') { - episodes.push(...p.value); - } - } + const promises = seasonsElements.map(element => this.parseEpisodesFromSeries(element)); + const episodes = (await Promise.allSettled(promises)) + .filter(p => p.status === 'fulfilled') + .flatMap(p => p.value); episodes.reverse(); return { name, imageUrl, description, author, status: 5, genre, episodes }; } @@ -103,16 +96,13 @@ class DefaultExtension extends MProvider { const seasonId = element.getHref; const res = await this.client.get(this.source.baseUrl + seasonId); const episodeElements = new Document(res.body).select("table.seasonEpisodesList tbody tr"); - const list = []; - for (const episodeElement of episodeElements) { - list.push(this.episodeFromElement(episodeElement)); - } - return list; + return Promise.all(episodeElements.map(e => this.episodeFromElement(e))); } - episodeFromElement(element) { + async episodeFromElement(element) { const titleAnchor = element.selectFirst("td.seasonEpisodeTitle a"); const episodeSpan = titleAnchor.selectFirst("span"); const url = titleAnchor.attr("href"); + const dateUpload = await this.getUploadDateFromEpisode(url); const episodeSeasonId = element.attr("data-episode-season-id"); let episode = episodeSpan.text.replace(/'/g, "'"); let name = ""; @@ -122,7 +112,38 @@ class DefaultExtension extends MProvider { const seasonMatch = url.match(/staffel-(\d+)\/episode/); name = `Staffel ${seasonMatch[1]} Folge ${episodeSeasonId} : ${episode}`; } - return name && url ? { name, url } : {}; + return name && url ? { name, url, dateUpload } : {}; + } + async getUploadDateFromEpisode(url) { + const baseUrl = this.source.baseUrl; + const res = await this.client.get(baseUrl + url); + const getLastSundayOfMonth = (year, month) => { + const lastDay = new Date(year, month, 0); + const lastSunday = lastDay.getDate() - lastDay.getDay(); + return new Date(year, month - 1, lastSunday); + }; + const document = new Document(res.body); + const dateString = document.selectFirst('strong[style="color: white;"]').text; + const dateTimePart = dateString.split(", ")[1]; + const [date, time] = dateTimePart.split(" "); + const [day, month, year] = date.split("."); + const [hours, minutes] = time.split(":"); + const dayInt = parseInt(day); + const monthInt = parseInt(month); + const yearInt = parseInt(year); + const hoursInt = parseInt(hours); + const minutesInt = parseInt(minutes); + const lastSundayOfMarch = getLastSundayOfMonth(yearInt, 3); + const lastSundayOfOctober = getLastSundayOfMonth(yearInt, 10); + const jsDate = new Date(yearInt, monthInt - 1, dayInt, hoursInt, minutesInt); + // If Date between lastSundayOfMarch & lastSundayOfOctober -> CEST (MESZ) + const isInDST = jsDate >= lastSundayOfMarch && jsDate < lastSundayOfOctober; + let timeZoneOffset = isInDST ? 0 : 1; + // If it's in CEST, subtract 1 hour from UTC (to get local time in CEST) + const correctedTime = new Date(jsDate.getTime() + (timeZoneOffset - 1) * 60 * 60 * 1000); + // Convert to epoch time + const epochTime = Math.floor(correctedTime.getTime() / 1000); + return epochTime.toString(); // dateUpload is a string containing date expressed in millisecondsSinceEpoch. } async getVideoList(url) { const baseUrl = this.source.baseUrl; -- 2.45.2 From 44c8514b4ed8390e8c6b4010a1b526195d0fe496 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Fri, 13 Dec 2024 03:01:41 +0100 Subject: [PATCH 3/8] Revert "AnimeToast partial rewrite in js" This reverts commit abd7e06eea6c7af395530a8f563c405c512e47f4. --- javascript/anime/src/de/animetoast.js | 184 -------------------------- 1 file changed, 184 deletions(-) delete mode 100644 javascript/anime/src/de/animetoast.js diff --git a/javascript/anime/src/de/animetoast.js b/javascript/anime/src/de/animetoast.js deleted file mode 100644 index c0c9d1f..0000000 --- a/javascript/anime/src/de/animetoast.js +++ /dev/null @@ -1,184 +0,0 @@ -const mangayomiSources = [{ - "name": "AnimeToast", - "lang": "de", - "baseUrl": "https://www.animetoast.cc", - "apiUrl": "", - "iconUrl": "https://www.animetoast.cc/wp-content/uploads/2018/03/toastfavi-300x300.png", - "typeSource": "single", - "isManga": false, - "isNsfw": false, - "version": "0.0.1", - "dateFormat": "", - "dateFormatLocale": "", - "pkgPath": "" -}]; - -class DefaultExtension extends MProvider { - - constructor () { - super(); - this.client = new Client(); - } - - async getPopular(page) { - const baseUrl = this.source.baseUrl; - const res = await this.client.get(baseUrl); - const document = new Document(res.body); - const elements = document.select("div.row div.col-md-4 div.video-item"); - const list = await Promise.all( - elements.map(async (element) => { - const name = element.selectFirst("div.item-thumbnail a").attr("title"); - const fullLink = element.selectFirst("div.item-thumbnail a").attr("href"); - const link = fullLink.startsWith(baseUrl) ? fullLink.substring(baseUrl.length) : fullLink; - const detailsRes = await this.client.get(fullLink); - const detailsDoc = new Document(detailsRes.body); - const imageUrl = detailsDoc.selectFirst(".item-content p img").attr("src"); - return { name, imageUrl, link }; - }) - ); - return { - list: list, - hasNextPage: false, - }; - } - - get supportsLatest() { - return false; - } - - async search(query, page, filters) { - const baseUrl = this.source.baseUrl; - const res = await this.client.get(`${baseUrl}/page/${page}/?s=${query}`); - const document = new Document(res.body); - const hasNextPage = document.selectFirst("li.next a")?.attr("href") != null; - const elements = document.select("div.item-thumbnail a[href]"); - const list = await Promise.all( - elements.map(async (element) => { - const name = element.attr("title"); - const fullLink = element.attr("href"); - const link = fullLink.startsWith(baseUrl) ? fullLink.substring(baseUrl.length) : fullLink; - const detailsRes = await this.client.get(fullLink); - const detailsDoc = new Document(detailsRes.body); - const imageUrl = detailsDoc.selectFirst(".item-content p img").attr("src"); - return { name, imageUrl, link }; - }) - ); - return { - list: list, - hasNextPage, - } - } - - async getDetail(url) { - const baseUrl = this.source.baseUrl; - const res = await this.client.get(baseUrl + url); - const document = new Document(res.body); - const name = document.selectFirst("h1").text; - const imageUrl = document.selectFirst(".item-content p img").attr("src"); - const description = document.selectFirst("div.item-content div + p").text; - const genreText = document.xpathFirst('//p[contains(text(),"Genre:")]/text()') || ""; - const genre = genreText.replace("Genre:", "").split(",").map(tag => tag.trim()); - const categoryTag = document.xpath('//*[@rel="category tag"]/text()'); - const status = categoryTag.includes("Airing") ? 0 : 1; - - let episodes = []; - const promises = []; - promises.push(this.episodeFromElement(document, categoryTag)); - for (const p of (await Promise.allSettled(promises))) { - if (p.status == 'fulfilled') { - episodes.push(...p.value); - } - } - episodes.reverse(); - return { description, genre, status, episodes, name, imageUrl }; - } - - async episodeFromElement(element, categoryTag) { - const list = []; - if (categoryTag.includes("Serie")) { - const episodeElements = element.selectFirst("#multi_link_tab0")?.attr("id") != null - ? element.select("#multi_link_tab0 a") - : element.select("#multi_link_tab1 a"); - for (const episodeElement of episodeElements) { - const name = episodeElement.text.trim(); - const link = episodeElement.attr("href"); - const url = link.startsWith(this.source.baseUrl) ? link.substring(this.source.baseUrl.length) : link; - if (name && url) { - list.push({ name, url }); - } - } - } else { - const name = element.selectFirst("h1.light-title").text - const url = element.selectFirst("#multi_link_tab0 a").attr("href"); - if (name && url) { - list.push({ name, url }); - } - } - return list; - } - - async getVideoList(url) { - const baseUrl = this.source.baseUrl; - const res = await this.client.get(baseUrl + url); - const document = new Document(res.body); - const fEp = document.selectFirst("div.tab-pane"); - const videos = []; - const ep = []; - let epcu = 100; - if (fEp.text.includes(":") || fEp.text.includes("-")) { - const tx = document.select("div.tab-pane"); - - for (let e of tx) { - const sUrl = e.selectFirst("a").attr("href"); - const doc = new Document((await this.client.get(sUrl)).body); - const nUrl = doc.selectFirst("#player-embed a").attr("href"); - const nDoc = new Document((await this.client.get(nUrl)).body); - const currentLink = document.selectFirst("div.tab-pane a.current-link")?.text || ""; - const substringAfter = (text, delimiter) => { - const index = text.indexOf(delimiter); - return index !== -1 ? text.substring(index + delimiter.length) : ""; - }; - epcu = parseInt(substringAfter(currentLink, "Ep.")) || 100; - ep = nDoc.select("div.tab-pane a"); - } - } else { - const currentLink = document.selectFirst("div.tab-pane a.current-link")?.text || ""; - const substringAfter = (text, delimiter) => { - const index = text.indexOf(delimiter); - return index !== -1 ? text.substring(index + delimiter.length) : ""; - }; - epcu = parseInt(substringAfter(currentLink, "Ep.")) || 100; - ep = nDoc.select("div.tab-pane a"); - } - } - - getFilterList() { - throw new Error("getFilterList not implemented"); - } - - getSourcePreferences() { - const hosts = ['VOE', 'DoodStream', 'Filemoon', 'Mp4Upload']; - return [ - { - key: 'preferred_hoster', - listPreference: { - title: 'Standard-Hoster', - summary: '', - valueIndex: 0, - entries: hosts, - entryValues: hosts - } - }, - { - key: "hoster_selection", - multiSelectListPreference: { - title: "Hoster auswählen", - summary: "", - entries: hosts, - entryValues: hosts, - values: hosts - } - } - ]; - } -} -- 2.45.2 From 423e1da501a6928da01442b32968abb9c97cf02e Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 15 Dec 2024 18:51:08 +0100 Subject: [PATCH 4/8] Corrected dateupload. --- javascript/anime/src/de/aniworld.js | 4 +--- javascript/anime/src/de/serienstream.js | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/javascript/anime/src/de/aniworld.js b/javascript/anime/src/de/aniworld.js index a68f272..2a09de3 100644 --- a/javascript/anime/src/de/aniworld.js +++ b/javascript/anime/src/de/aniworld.js @@ -141,9 +141,7 @@ class DefaultExtension extends MProvider { let timeZoneOffset = isInDST ? 0 : 1; // If it's in CEST, subtract 1 hour from UTC (to get local time in CEST) const correctedTime = new Date(jsDate.getTime() + (timeZoneOffset - 1) * 60 * 60 * 1000); - // Convert to epoch time - const epochTime = Math.floor(correctedTime.getTime() / 1000); - return epochTime.toString(); // dateUpload is a string containing date expressed in millisecondsSinceEpoch. + return String(correctedTime.valueOf()); // dateUpload is a string containing date expressed in millisecondsSinceEpoch. } async getVideoList(url) { const baseUrl = this.source.baseUrl; diff --git a/javascript/anime/src/de/serienstream.js b/javascript/anime/src/de/serienstream.js index 63220a0..e382cef 100644 --- a/javascript/anime/src/de/serienstream.js +++ b/javascript/anime/src/de/serienstream.js @@ -141,9 +141,7 @@ class DefaultExtension extends MProvider { let timeZoneOffset = isInDST ? 0 : 1; // If it's in CEST, subtract 1 hour from UTC (to get local time in CEST) const correctedTime = new Date(jsDate.getTime() + (timeZoneOffset - 1) * 60 * 60 * 1000); - // Convert to epoch time - const epochTime = Math.floor(correctedTime.getTime() / 1000); - return epochTime.toString(); // dateUpload is a string containing date expressed in millisecondsSinceEpoch. + return String(correctedTime.valueOf()); // dateUpload is a string containing date expressed in millisecondsSinceEpoch. } async getVideoList(url) { const baseUrl = this.source.baseUrl; -- 2.45.2 From bab407b3e3a887fecdbc0a8bb1353a432cd6ed95 Mon Sep 17 00:00:00 2001 From: NBA2K1 <78034913+NBA2K1@users.noreply.github.com> Date: Sun, 15 Dec 2024 19:07:54 +0100 Subject: [PATCH 5/8] Version++ --- javascript/anime/src/de/aniworld.js | 2 +- javascript/anime/src/de/serienstream.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/javascript/anime/src/de/aniworld.js b/javascript/anime/src/de/aniworld.js index 2a09de3..fbfd7e2 100644 --- a/javascript/anime/src/de/aniworld.js +++ b/javascript/anime/src/de/aniworld.js @@ -7,7 +7,7 @@ const mangayomiSources = [{ "typeSource": "single", "isManga": false, "isNsfw": false, - "version": "0.3.1", + "version": "0.3.2", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/de/aniworld.js" diff --git a/javascript/anime/src/de/serienstream.js b/javascript/anime/src/de/serienstream.js index e382cef..43db6f1 100644 --- a/javascript/anime/src/de/serienstream.js +++ b/javascript/anime/src/de/serienstream.js @@ -7,7 +7,7 @@ const mangayomiSources = [{ "typeSource": "single", "isManga": false, "isNsfw": false, - "version": "0.0.3", + "version": "0.0.4", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/de/serienstream.js" -- 2.45.2 From e159fe9b163bd0ca23ff81d8169ed1d7ac0e9dc1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 15 Dec 2024 18:09:54 +0000 Subject: [PATCH 6/8] Update extensions --- anime_index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anime_index.json b/anime_index.json index 3d17d65..1136db8 100644 --- a/anime_index.json +++ b/anime_index.json @@ -1 +1 @@ -[{"name":"Gogoanime","id":1061885186,"baseUrl":"https://anitaku.to","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/gogoanime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/gogoanime/gogoanime.dart","apiUrl":"","version":"0.1.15","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"FrAnime","id":870016579,"baseUrl":"https://franime.fr","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/franime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/franime/franime.dart","apiUrl":"https://api.franime.fr","version":"0.0.75","isManga":false,"isFullData":true,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"OtakuFr","id":828939690,"baseUrl":"https://otakufr.cc","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/otakufr/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/otakufr/otakufr.dart","apiUrl":"","version":"0.0.95","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimesUltra","id":1050779985,"baseUrl":"https://w2.animesultra.net","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesultra/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesultra/animesultra.dart","apiUrl":"","version":"0.0.75","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"HiAnime","id":814067600,"baseUrl":"https://hianime.to","lang":"en","typeSource":"zorotheme","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/src/hianime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/zorotheme.dart","apiUrl":"","version":"0.0.95","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Kaido.to","id":961999573,"baseUrl":"https://kaido.to","lang":"en","typeSource":"zorotheme","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/src/kaido/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/zorotheme.dart","apiUrl":"","version":"0.0.95","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"KissKH","id":614402273,"baseUrl":"https://kisskh.co","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/kisskh/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/kisskh/kisskh.dart","apiUrl":"","version":"0.0.6","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Okanime","id":816422873,"baseUrl":"https://www.okanime.xyz","lang":"ar","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/ar/okanime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/ar/okanime/okanime.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"OtakuDesu","id":857966631,"baseUrl":"https://otakudesu.cloud","lang":"id","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/otakudesu/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/otakudesu/otakudesu.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"NimeGami","id":228390212,"baseUrl":"https://nimegami.id","lang":"id","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/nimegami/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/nimegami/nimegami.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Oploverz","id":354763978,"baseUrl":"https://oploverz.gold","lang":"id","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/oploverz/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/oploverz/oploverz.dart","apiUrl":"","version":"0.0.5","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"DopeBox","id":640189912,"baseUrl":"https://dopebox.to","lang":"en","typeSource":"dopeflix","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/src/dopebox/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/dopeflix.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"SFlix","id":372182741,"baseUrl":"https://sflix.to","lang":"en","typeSource":"dopeflix","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/src/sflix/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/dopeflix.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeSaturn","id":817602961,"baseUrl":"https://www.animesaturn.cx","lang":"it","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/it/animesaturn/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/it/animesaturn/animesaturn.dart","apiUrl":"","version":"0.0.4","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"UHD Movies","id":412887556,"baseUrl":"https://uhdmovies.fans","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/uhdmovies/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/uhdmovies/uhdmovies.dart","apiUrl":"","version":"0.0.45","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"French Anime","id":419375321,"baseUrl":"https://french-anime.com","lang":"fr","typeSource":"datalifeengine","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/src/frenchanime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/datalifeengine.dart","apiUrl":"","version":"0.0.6","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Wiflix","id":1054910447,"baseUrl":"https://wiflix-hd.vip","lang":"fr","typeSource":"datalifeengine","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/src/wiflix/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/datalifeengine.dart","apiUrl":"","version":"0.0.6","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Filma24","id":892266880,"baseUrl":"https://www.filma24.pl","lang":"sq","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/sq/filma24/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/sq/filma24/filma24.dart","apiUrl":"","version":"0.0.35","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"DramaCool","id":331292187,"baseUrl":"https://dramacool.pa","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/dramacool/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/dramacool/dramacool.dart","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"YoMovies","id":537166091,"baseUrl":"https://yomovies.boo","lang":"hi","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/hi/yomovies/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/hi/yomovies/yomovies.dart","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Anime-Sama","id":32228290,"baseUrl":"https://anime-sama.fr","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesama/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesama/animesama.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"9AnimeTv","id":957331416,"baseUrl":"https://9animetv.to","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/nineanimetv/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/nineanimetv/nineanimetv.dart","apiUrl":"","version":"0.0.4","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":529552861,"baseUrl":"https://anime-world.in","lang":"all","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":298117146,"baseUrl":"https://anime-world.in","lang":"en","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":953375665,"baseUrl":"https://anime-world.in","lang":"bn","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":788028349,"baseUrl":"https://anime-world.in","lang":"hi","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":486955727,"baseUrl":"https://anime-world.in","lang":"ja","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":571428165,"baseUrl":"https://anime-world.in","lang":"ml","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":976578551,"baseUrl":"https://anime-world.in","lang":"mr","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":908421454,"baseUrl":"https://anime-world.in","lang":"ta","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":619885111,"baseUrl":"https://anime-world.in","lang":"te","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Nyaa","id":204272987,"baseUrl":"https://nyaa.si","lang":"all","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/nyaa/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/nyaa/nyaa.dart","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimePahe","id":534387145,"baseUrl":"https://www.animepahe.ru","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/animepahe/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/animepahe/animepahe.dart","apiUrl":"","version":"0.0.45","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeToast","id":922522471,"baseUrl":"https://animetoast.cc","lang":"de","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/de/animetoast/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/de/animetoast/animetoast.dart","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimesVision","id":182512102,"baseUrl":"https://animes.vision","lang":"pt-br","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/pt/animesvision/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/pt/animesvision/animesvision.dart","apiUrl":"","version":"0.0.15","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"diziWatch","id":585912766,"baseUrl":"https://diziwatch.net","lang":"tr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/tr/diziwatch/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/tr/diziwatch/diziwatch.dart","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AniZone","id":525728745,"baseUrl":"https://v1.animesz.xyz","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/anizone/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/anizone/anizone.dart","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeOnline.Ninja","id":802700084,"baseUrl":"https://ww3.animeonline.ninja","lang":"es","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/es/animeonlineninja/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/es/animeonlineninja/animeonlineninja.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"360资源","id":750729164,"baseUrl":"https://360zy.com","lang":"zh","typeSource":"single","iconUrl":"https://360zy.com/favicon.ico","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/360zy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"天空资源网","id":967317255,"baseUrl":"https://tiankongzy.com","lang":"zh","typeSource":"single","iconUrl":"https://api.tiankongapi.com/template/v10012/images/logo.jpg","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/tiankongzy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"玩偶哥哥","id":14810567,"baseUrl":"https://www.wogg.net","lang":"zh","typeSource":"single","iconUrl":"https://imgsrc.baidu.com/forum/pic/item/4b90f603738da977d5da660af651f8198618e31f.jpg","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/wogg.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"华为吧资源","id":790593517,"baseUrl":"https://huaweiba.live","lang":"zh","typeSource":"single","iconUrl":"https://huaweiba.live/template/ziyuan/images/logo2.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/huaweiba.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"樱花动漫","id":781484038,"baseUrl":"http://www.iyinghua.com","lang":"zh","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/zh.yhdm.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/yhdm.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"蜜柑计划","id":1032743453,"baseUrl":"https://mikanime.tv","lang":"zh","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/zh.mikan.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/mikan.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"极速资源","id":593630482,"baseUrl":"https://wwww.jisuzy.com","lang":"zh","typeSource":"single","iconUrl":"https://www.jisuzy.com/template/default/images/site_logo.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/jisuzy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"非凡资源","id":797525486,"baseUrl":"http://ffzy.tv","lang":"zh","typeSource":"single","iconUrl":"http://ffzy.tv/template/default/img/favicon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/ffzy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"多多影音","id":400189518,"baseUrl":"https://tv.yydsys.top","lang":"zh","typeSource":"single","iconUrl":"https://tv.yydsys.top/template/DYXS2/static/picture/logo.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/yydsys.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AnimeFénix","id":750391210,"baseUrl":"https://www3.animefenix.tv","lang":"es","typeSource":"single","iconUrl":"https://www3.animefenix.tv/themes/fenix-neo/images/AveFenix.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/animefenix.js","apiUrl":"","version":"0.1.13","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AnimeFLV","id":32554550,"baseUrl":"https://www3.animeflv.net","lang":"es","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/es.animeflv.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/animeflv.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"TioAnime","id":156757473,"baseUrl":"https://tioanime.com","lang":"es","typeSource":"single","iconUrl":"https://tioanime.com/assets/img/tio_fb.jpg","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/tioanime.js","apiUrl":"","version":"0.1.12","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"JKAnime","id":1018721463,"baseUrl":"https://jkanime.net","lang":"es","typeSource":"single","iconUrl":"https://cdn.jkanime.net/logo_jk.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/jkanime.js","apiUrl":"","version":"0.1.13","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"SerienStream","id":178264452,"baseUrl":"https://s.to","lang":"de","typeSource":"single","iconUrl":"https://s.to/favicon.ico","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/de/serienstream.js","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AniWorld","id":746621198,"baseUrl":"https://aniworld.to","lang":"de","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/de.aniworld.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/de/aniworld.js","apiUrl":"","version":"0.3.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"Torrentio (Torrent)","id":1066185420,"baseUrl":"https://torrentio.strem.fun","lang":"all","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.torrentio.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/all/torrentio.js","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.3.8","additionalParams":"","sourceCodeLanguage":1},{"name":"Torrentio Anime (Torrent)","id":715754009,"baseUrl":"https://torrentio.strem.fun","lang":"all","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.torrentio.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/all/torrentioanime.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.3.8","additionalParams":"","sourceCodeLanguage":1},{"name":"NetflixMirror","id":446414301,"baseUrl":"https://iosmirror.cc","lang":"all","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.netflixmirror.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/all/netflixmirror.js","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AnimeWorld","id":368490446,"baseUrl":"https://www.animeworld.so","lang":"it","typeSource":"single","iconUrl":"https://i.postimg.cc/RFRGfBvP/FVLyB1I.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/it/animeworld.js","apiUrl":"","version":"0.0.12","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AllAnime","id":558217176,"baseUrl":"https://allanime.to","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.allanime.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/en/allanime.js","apiUrl":"https://api.allanime.day/api","version":"0.0.35","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1}] \ No newline at end of file +[{"name":"Gogoanime","id":1061885186,"baseUrl":"https://anitaku.to","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/gogoanime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/gogoanime/gogoanime.dart","apiUrl":"","version":"0.1.15","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"FrAnime","id":870016579,"baseUrl":"https://franime.fr","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/franime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/franime/franime.dart","apiUrl":"https://api.franime.fr","version":"0.0.75","isManga":false,"isFullData":true,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"OtakuFr","id":828939690,"baseUrl":"https://otakufr.cc","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/otakufr/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/otakufr/otakufr.dart","apiUrl":"","version":"0.0.95","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimesUltra","id":1050779985,"baseUrl":"https://w2.animesultra.net","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesultra/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesultra/animesultra.dart","apiUrl":"","version":"0.0.75","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"HiAnime","id":814067600,"baseUrl":"https://hianime.to","lang":"en","typeSource":"zorotheme","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/src/hianime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/zorotheme.dart","apiUrl":"","version":"0.0.95","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Kaido.to","id":961999573,"baseUrl":"https://kaido.to","lang":"en","typeSource":"zorotheme","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/src/kaido/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/zorotheme/zorotheme.dart","apiUrl":"","version":"0.0.95","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"KissKH","id":614402273,"baseUrl":"https://kisskh.co","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/kisskh/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/kisskh/kisskh.dart","apiUrl":"","version":"0.0.6","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Okanime","id":816422873,"baseUrl":"https://www.okanime.xyz","lang":"ar","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/ar/okanime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/ar/okanime/okanime.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"OtakuDesu","id":857966631,"baseUrl":"https://otakudesu.cloud","lang":"id","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/otakudesu/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/otakudesu/otakudesu.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"NimeGami","id":228390212,"baseUrl":"https://nimegami.id","lang":"id","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/nimegami/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/nimegami/nimegami.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Oploverz","id":354763978,"baseUrl":"https://oploverz.gold","lang":"id","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/oploverz/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/id/oploverz/oploverz.dart","apiUrl":"","version":"0.0.5","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"DopeBox","id":640189912,"baseUrl":"https://dopebox.to","lang":"en","typeSource":"dopeflix","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/src/dopebox/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/dopeflix.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"SFlix","id":372182741,"baseUrl":"https://sflix.to","lang":"en","typeSource":"dopeflix","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/src/sflix/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/dopeflix/dopeflix.dart","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeSaturn","id":817602961,"baseUrl":"https://www.animesaturn.cx","lang":"it","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/it/animesaturn/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/it/animesaturn/animesaturn.dart","apiUrl":"","version":"0.0.4","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"UHD Movies","id":412887556,"baseUrl":"https://uhdmovies.fans","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/uhdmovies/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/uhdmovies/uhdmovies.dart","apiUrl":"","version":"0.0.45","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"French Anime","id":419375321,"baseUrl":"https://french-anime.com","lang":"fr","typeSource":"datalifeengine","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/src/frenchanime/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/datalifeengine.dart","apiUrl":"","version":"0.0.6","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Wiflix","id":1054910447,"baseUrl":"https://wiflix-hd.vip","lang":"fr","typeSource":"datalifeengine","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/src/wiflix/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/multisrc/datalifeengine/datalifeengine.dart","apiUrl":"","version":"0.0.6","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Filma24","id":892266880,"baseUrl":"https://www.filma24.pl","lang":"sq","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/sq/filma24/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/sq/filma24/filma24.dart","apiUrl":"","version":"0.0.35","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"DramaCool","id":331292187,"baseUrl":"https://dramacool.pa","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/dramacool/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/dramacool/dramacool.dart","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"YoMovies","id":537166091,"baseUrl":"https://yomovies.boo","lang":"hi","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/hi/yomovies/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/hi/yomovies/yomovies.dart","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Anime-Sama","id":32228290,"baseUrl":"https://anime-sama.fr","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesama/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/animesama/animesama.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"9AnimeTv","id":957331416,"baseUrl":"https://9animetv.to","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/nineanimetv/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/nineanimetv/nineanimetv.dart","apiUrl":"","version":"0.0.4","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":529552861,"baseUrl":"https://anime-world.in","lang":"all","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":298117146,"baseUrl":"https://anime-world.in","lang":"en","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":953375665,"baseUrl":"https://anime-world.in","lang":"bn","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":788028349,"baseUrl":"https://anime-world.in","lang":"hi","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":486955727,"baseUrl":"https://anime-world.in","lang":"ja","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":571428165,"baseUrl":"https://anime-world.in","lang":"ml","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":976578551,"baseUrl":"https://anime-world.in","lang":"mr","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":908421454,"baseUrl":"https://anime-world.in","lang":"ta","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeWorld India","id":619885111,"baseUrl":"https://anime-world.in","lang":"te","typeSource":"multiple","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/animeworldindia/animeworldindia.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"Nyaa","id":204272987,"baseUrl":"https://nyaa.si","lang":"all","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/nyaa/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/all/nyaa/nyaa.dart","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimePahe","id":534387145,"baseUrl":"https://www.animepahe.ru","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/animepahe/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/en/animepahe/animepahe.dart","apiUrl":"","version":"0.0.45","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeToast","id":922522471,"baseUrl":"https://animetoast.cc","lang":"de","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/de/animetoast/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/de/animetoast/animetoast.dart","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimesVision","id":182512102,"baseUrl":"https://animes.vision","lang":"pt-br","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/pt/animesvision/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/pt/animesvision/animesvision.dart","apiUrl":"","version":"0.0.15","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"diziWatch","id":585912766,"baseUrl":"https://diziwatch.net","lang":"tr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/tr/diziwatch/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/tr/diziwatch/diziwatch.dart","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AniZone","id":525728745,"baseUrl":"https://v1.animesz.xyz","lang":"fr","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/anizone/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/fr/anizone/anizone.dart","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"AnimeOnline.Ninja","id":802700084,"baseUrl":"https://ww3.animeonline.ninja","lang":"es","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/es/animeonlineninja/icon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/dart/anime/src/es/animeonlineninja/animeonlineninja.dart","apiUrl":"","version":"0.0.3","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":0},{"name":"360资源","id":750729164,"baseUrl":"https://360zy.com","lang":"zh","typeSource":"single","iconUrl":"https://360zy.com/favicon.ico","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/360zy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"天空资源网","id":967317255,"baseUrl":"https://tiankongzy.com","lang":"zh","typeSource":"single","iconUrl":"https://api.tiankongapi.com/template/v10012/images/logo.jpg","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/tiankongzy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"玩偶哥哥","id":14810567,"baseUrl":"https://www.wogg.net","lang":"zh","typeSource":"single","iconUrl":"https://imgsrc.baidu.com/forum/pic/item/4b90f603738da977d5da660af651f8198618e31f.jpg","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/wogg.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"华为吧资源","id":790593517,"baseUrl":"https://huaweiba.live","lang":"zh","typeSource":"single","iconUrl":"https://huaweiba.live/template/ziyuan/images/logo2.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/huaweiba.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"樱花动漫","id":781484038,"baseUrl":"http://www.iyinghua.com","lang":"zh","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/zh.yhdm.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/yhdm.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"蜜柑计划","id":1032743453,"baseUrl":"https://mikanime.tv","lang":"zh","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/zh.mikan.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/mikan.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"极速资源","id":593630482,"baseUrl":"https://wwww.jisuzy.com","lang":"zh","typeSource":"single","iconUrl":"https://www.jisuzy.com/template/default/images/site_logo.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/jisuzy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"非凡资源","id":797525486,"baseUrl":"http://ffzy.tv","lang":"zh","typeSource":"single","iconUrl":"http://ffzy.tv/template/default/img/favicon.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/ffzy.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"多多影音","id":400189518,"baseUrl":"https://tv.yydsys.top","lang":"zh","typeSource":"single","iconUrl":"https://tv.yydsys.top/template/DYXS2/static/picture/logo.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/zh/yydsys.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AnimeFénix","id":750391210,"baseUrl":"https://www3.animefenix.tv","lang":"es","typeSource":"single","iconUrl":"https://www3.animefenix.tv/themes/fenix-neo/images/AveFenix.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/animefenix.js","apiUrl":"","version":"0.1.13","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AnimeFLV","id":32554550,"baseUrl":"https://www3.animeflv.net","lang":"es","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/es.animeflv.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/animeflv.js","apiUrl":"","version":"0.0.1","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"TioAnime","id":156757473,"baseUrl":"https://tioanime.com","lang":"es","typeSource":"single","iconUrl":"https://tioanime.com/assets/img/tio_fb.jpg","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/tioanime.js","apiUrl":"","version":"0.1.12","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"JKAnime","id":1018721463,"baseUrl":"https://jkanime.net","lang":"es","typeSource":"single","iconUrl":"https://cdn.jkanime.net/logo_jk.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/es/jkanime.js","apiUrl":"","version":"0.1.13","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"SerienStream","id":178264452,"baseUrl":"https://s.to","lang":"de","typeSource":"single","iconUrl":"https://s.to/favicon.ico","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/de/serienstream.js","apiUrl":"","version":"0.0.4","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AniWorld","id":746621198,"baseUrl":"https://aniworld.to","lang":"de","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/de.aniworld.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/de/aniworld.js","apiUrl":"","version":"0.3.2","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"Torrentio (Torrent)","id":1066185420,"baseUrl":"https://torrentio.strem.fun","lang":"all","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.torrentio.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/all/torrentio.js","apiUrl":"","version":"0.0.25","isManga":false,"isFullData":false,"appMinVerReq":"0.3.8","additionalParams":"","sourceCodeLanguage":1},{"name":"Torrentio Anime (Torrent)","id":715754009,"baseUrl":"https://torrentio.strem.fun","lang":"all","typeSource":"torrent","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.torrentio.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/all/torrentioanime.js","apiUrl":"","version":"0.0.2","isManga":false,"isFullData":false,"appMinVerReq":"0.3.8","additionalParams":"","sourceCodeLanguage":1},{"name":"NetflixMirror","id":446414301,"baseUrl":"https://iosmirror.cc","lang":"all","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.netflixmirror.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/all/netflixmirror.js","apiUrl":"","version":"0.0.55","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AnimeWorld","id":368490446,"baseUrl":"https://www.animeworld.so","lang":"it","typeSource":"single","iconUrl":"https://i.postimg.cc/RFRGfBvP/FVLyB1I.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/it/animeworld.js","apiUrl":"","version":"0.0.12","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1},{"name":"AllAnime","id":558217176,"baseUrl":"https://allanime.to","lang":"en","typeSource":"single","iconUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/en.allanime.png","dateFormat":"","dateFormatLocale":"","isNsfw":false,"hasCloudflare":false,"sourceCodeUrl":"https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/anime/src/en/allanime.js","apiUrl":"https://api.allanime.day/api","version":"0.0.35","isManga":false,"isFullData":false,"appMinVerReq":"0.2.0","additionalParams":"","sourceCodeLanguage":1}] \ No newline at end of file -- 2.45.2 From 20d6ba6c192bc0ead3c678fae745f010111be153 Mon Sep 17 00:00:00 2001 From: uwu-wuw <105972373+uwu-wuw@users.noreply.github.com> Date: Wed, 18 Dec 2024 00:19:46 +0600 Subject: [PATCH 7/8] Create webtoons.js --- javascript/manga/src/all/webtoons.js | 328 +++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 javascript/manga/src/all/webtoons.js diff --git a/javascript/manga/src/all/webtoons.js b/javascript/manga/src/all/webtoons.js new file mode 100644 index 0000000..311032a --- /dev/null +++ b/javascript/manga/src/all/webtoons.js @@ -0,0 +1,328 @@ +const mangayomiSources = [{ + "name": "Webtoons", + "lang": "en", + "baseUrl": "https://www.webtoons.com", + "apiUrl": "", + "iconUrl": "https://upload.wikimedia.org/wikipedia/commons/0/09/Naver_Line_Webtoon_logo.png", + "typeSource": "single", + "isManga": true, + "isNsfw": false, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "https://github.com/kodjodevf/mangayomi-extensions/blob/main/javascript/manga/src/all/webtoons.js" +}]; + +class DefaultExtension extends MProvider { + headers = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" + }; + getHeaders(url) { + return { + Referer: this.source.baseUrl + } + } + + async getItem(url, p) { + const res = await new Client().get(this.source.baseUrl + url, this.headers); + const doc = new Document(res.body); + const mangas = []; + const elements = doc.select(p); + for (const element of elements) { + const linkElement = element.selectFirst("a"); + const imageElement = linkElement.selectFirst("img"); + const imageUrl = imageElement.attr("src"); + const name = element.selectFirst("p.subj").text; + const link = linkElement.attr("href"); + const genre = []; + if (element.selectFirst("p.genre").text === "") { + genre.push(element.selectFirst("span.genre").text); + } else { + genre.push(element.selectFirst("p.genre").text); + } + mangas.push({ + name: name, + imageUrl: imageUrl, + link: link, + genre: genre + }); + } + return mangas; + } + + async getPopular(page) { + const baseUrl = this.source.baseUrl; + const client = new Client(); + const res = await client.get(`${baseUrl}/en/originals`); + const doc = new Document(res.body); + + const days = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]; + let dayElements = []; + + for (const day of days) { + const elements = doc.select(`div.daily_section._list_${day} li`); + dayElements.push(elements); + } + + const maxElements = Math.max(...dayElements.map(elements => elements.length)); + let list = []; + for (let i = 0; i < maxElements; i++) { + for (let j = 0; j < days.length; j++) { + const elements = dayElements[j]; + if (i < elements.length) { + const element = elements[i]; + const linkElement = element.selectFirst("a"); + const imageElement = linkElement.selectFirst("img"); + const imageUrl = imageElement.attr("src"); + const name = element.selectFirst("p.subj").text; + const link = linkElement.attr("href"); + list.push({ name, imageUrl, link }); + } + } + } + + const completed = doc.select("div.daily_lst.comp li"); + for (const element of completed) { + const linkElement = element.selectFirst("a"); + const imageElement = linkElement.selectFirst("img"); + const imageUrl = imageElement.attr("src"); + const name = element.selectFirst("p.subj").text; + const link = linkElement.attr("href"); + list.push({ name, imageUrl, link }); + } + + return { + list: list, + hasNextPage: false + }; + } + + async getLatestUpdates(page) { + const Day = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY']; + + const list = await this.getItem(`/en/originals?sortOrder=UPDATE`, "div.daily_section._list_" + Day[new Date().getDay()] + " li"); + return { + list: list, + hasNextPage: false + }; + } + + async search(query, page, filters) { + let keyword = query.trim().replace(/\s+/g, '+'); + let hasNextPage = true; + let type_originals = "WEBTOON"; + let type_canvas = "CHALLENGE"; + let fetch_originals = "ul.card_lst li"; + let fetch_canvas = "div.challenge_lst.search li"; + let list_originals = []; + let list_canvas = []; + let list = []; + + if (query !== "") { + list_originals = await this.getItem(`/en/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); + if (filters) { } + list = list_originals.concat(list_canvas); + } else { + + } + + if (list.length === 0) { hasNextPage = false; } + return { + list: list, + hasNextPage: hasNextPage + }; + } + + 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 doc = new Document(res.body); + 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 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 author = info.selectFirst("div.author_area").text.replace(/\s+/g, ' ').replace(/author info/g, '').trim() ?? info.selectFirst("a.author").text; + const status_str = info.selectFirst("p.day_info").text; + var status; + if (status_str == "COMPLETED") { + status = 1; + } else { + status = 0; + } + const desc = info.selectFirst("p.summary").text.replace(/\s+/g, ' ').trim(); + const chapters = []; + let tester = ""; + let page = 1; + + while (tester !== "#1") { + const res = await new Client().get(url + `&page=${page}`); + const doc = new Document(res.body); + const info = doc.selectFirst("div.cont_box"); + const elements = info.select("div.detail_lst li"); + + for (const element of elements) { + tester = element.selectFirst("span.tx").text.trim(); + const dateString = element.selectFirst("span.date").text.trim(); + const date = new Date(formatDateString(dateString)); + const millisecondsSinceEpoch = date.getTime(); + const millisecondsString = millisecondsSinceEpoch.toString(); + chapters.push({ + name: tester + " " + element.selectFirst("span.subj span").text, + url: element.selectFirst('a').attr("href"), + dateUpload: millisecondsString + }); + } + page++; + } + return { + name: title, + link: url, + genre: genre, + imageUrl: cover, + description: desc, + author: author, + status: status, + episodes: chapters + }; + } + + async getPageList(url) { + const preference = new SharedPreferences(); + const res = await new Client().get(url); + const doc = new Document(res.body); + const urls = []; + const imageElement = doc.selectFirst('div#_imageList'); + const img_urls = imageElement.select('img'); + for (let i = 0; i < img_urls.length; i++) { + urls.push(img_urls[i].attr("data-url")); + } + return urls; + } + + + + getFilterList() { + return [{ + type: "sort", + name: "Official or Challenge", + type_name: "SelectFilter", + values: [{ + type_name: "SelectOption", + name: "Any", + value: "any" + }, + { + type_name: "SelectOption", + name: "Official only", + value: "official" + }, + { + type_name: "SelectOption", + name: "Challenge only", + value: "challenge" + }] + }, + { + type: "categories", + name: "Genre", + type_name: "SelectFilter", + values: [{ + type_name: "SelectOption", + name: "All", + value: "" + }, + { + type_name: "SelectOption", + name: "Action", + value: "action" + }, + { + type_name: "SelectOption", + name: "Comedy", + value: "comedy" + }, + { + type_name: "SelectOption", + name: "Drama", + value: "drama" + }, + { + type_name: "SelectOption", + name: "Fantasy", + value: "fantasy" + }, + { + type_name: "SelectOption", + name: "Heartwarming", + value: "heartwarming" + }, + { + type_name: "SelectOption", + name: "Historical", + value: "historical" + }, + { + type_name: "SelectOption", + name: "Horror", + value: "horror" + }, + { + type_name: "SelectOption", + name: "Informative", + value: "tiptoon" + }, + { + type_name: "SelectOption", + name: "Mystery", + value: "mystery" + }, + { + type_name: "SelectOption", + name: "Romance", + value: "romance" + }, + { + type_name: "SelectOption", + name: "Sci-fi", + value: "sf" + }, + { + type_name: "SelectOption", + name: "Slice of life", + value: "slice_of_life" + }, + { + type_name: "SelectOption", + name: "Sports", + value: "sports" + }, + { + type_name: "SelectOption", + name: "Superhero", + value: "super_hero" + }, + { + type_name: "SelectOption", + name: "Supernatural", + value: "supernatural" + }] + } + ]; + } + + getSourcePreferences() { + throw new Error("getSourcePreferences not implemented"); + } +} -- 2.45.2 From 21dba5bf729f3a501e1d2b0d49d410fe097684ea Mon Sep 17 00:00:00 2001 From: Moustapha Kodjo Amadou Date: Thu, 19 Dec 2024 11:34:31 +0100 Subject: [PATCH 8/8] add more langs --- javascript/manga/src/all/webtoons.js | 112 ++++++++++++++++++++------- 1 file changed, 84 insertions(+), 28 deletions(-) diff --git a/javascript/manga/src/all/webtoons.js b/javascript/manga/src/all/webtoons.js index 311032a..1f21180 100644 --- a/javascript/manga/src/all/webtoons.js +++ b/javascript/manga/src/all/webtoons.js @@ -1,6 +1,6 @@ const mangayomiSources = [{ "name": "Webtoons", - "lang": "en", + "langs": ["en", "fr", "id", "th", "es", "zh", "de"], "baseUrl": "https://www.webtoons.com", "apiUrl": "", "iconUrl": "https://upload.wikimedia.org/wikipedia/commons/0/09/Naver_Line_Webtoon_logo.png", @@ -10,7 +10,7 @@ const mangayomiSources = [{ "version": "0.0.1", "dateFormat": "", "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 { @@ -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 doc = new Document(res.body); const mangas = []; - const elements = doc.select(p); + const elements = doc.select(selector); for (const element of elements) { const linkElement = element.selectFirst("a"); const imageElement = linkElement.selectFirst("img"); @@ -53,7 +53,7 @@ class DefaultExtension extends MProvider { async getPopular(page) { const baseUrl = this.source.baseUrl; 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 days = ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"]; @@ -99,8 +99,7 @@ class DefaultExtension extends MProvider { async getLatestUpdates(page) { const Day = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY']; - - const list = await this.getItem(`/en/originals?sortOrder=UPDATE`, "div.daily_section._list_" + Day[new Date().getDay()] + " li"); + const list = await this.getItem(`/${this.langCode()}/originals?sortOrder=UPDATE`, "div.daily_section._list_" + Day[new Date().getDay()] + " li"); return { list: list, hasNextPage: false @@ -119,8 +118,8 @@ class DefaultExtension extends MProvider { let list = []; if (query !== "") { - list_originals = await this.getItem(`/en/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_originals = await this.getItem(`/${this.langCode()}/search?keyword=${keyword}&searchType=` + type_originals + `&page=${page}`, fetch_originals); + list_canvas = await this.getItem(`/${this.langCode()}/search?keyword=${keyword}&searchType=` + type_canvas + `&page=${page}`, fetch_canvas); if (filters) { } list = list_originals.concat(list_canvas); } else { @@ -135,22 +134,10 @@ class DefaultExtension extends MProvider { } 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 doc = new Document(res.body); 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 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; @@ -175,7 +162,7 @@ class DefaultExtension extends MProvider { for (const element of elements) { tester = element.selectFirst("span.tx").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 millisecondsString = millisecondsSinceEpoch.toString(); chapters.push({ @@ -190,16 +177,88 @@ class DefaultExtension extends MProvider { name: title, link: url, genre: genre, - imageUrl: cover, description: desc, + imageUrl: cover, author: author, status: status, 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) { - const preference = new SharedPreferences(); const res = await new Client().get(url); const doc = new Document(res.body); const urls = []; @@ -322,7 +381,4 @@ class DefaultExtension extends MProvider { ]; } - getSourcePreferences() { - throw new Error("getSourcePreferences not implemented"); - } } -- 2.45.2