From 8330078877cbfcc6b677cd6d0e9263e8eedfffc5 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/5] 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 00000000..c0c9d1f7 --- /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 + } + } + ]; + } +} From 24db8701ed4320230042c2bdaf5a00ecf9886a20 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/5] 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 ae60b0e4..a68f2723 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 72b6887c..63220a0e 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; From 0e7af0a67f816a809e782247ca30c802b4ca8838 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/5] Revert "AnimeToast partial rewrite in js" This reverts commit 8330078877cbfcc6b677cd6d0e9263e8eedfffc5. --- 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 c0c9d1f7..00000000 --- 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 - } - } - ]; - } -} From 8e62159a2d7d08228889f0d5cd89f5aa37a8bb38 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/5] 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 a68f2723..2a09de3b 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 63220a0e..e382ceff 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; From ac9c53a467618c78dba5f4cfa52842749850e014 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/5] 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 2a09de3b..fbfd7e2a 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 e382ceff..43db6f1d 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"