From 043a523eb1adb9964e0996bfd0c1a2d1ae183777 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Tue, 23 Jul 2024 12:27:48 +0100 Subject: [PATCH] new source AnimeFLV (ES) --- javascript/anime/src/es/animeflv.js | 183 ++++++++++++++++++++++++++++ javascript/icon/es.animeflv.png | Bin 0 -> 3053 bytes 2 files changed, 183 insertions(+) create mode 100644 javascript/anime/src/es/animeflv.js create mode 100644 javascript/icon/es.animeflv.png diff --git a/javascript/anime/src/es/animeflv.js b/javascript/anime/src/es/animeflv.js new file mode 100644 index 00000000..8f052684 --- /dev/null +++ b/javascript/anime/src/es/animeflv.js @@ -0,0 +1,183 @@ +const mangayomiSources = [{ + "name": "AnimeFLV", + "lang": "es", + "baseUrl": "https://www3.animeflv.net", + "apiUrl": "", + "iconUrl": "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/es.animeflv.png", + "typeSource": "single", + "isManga": false, + "isNsfw": false, + "version": "0.0.1", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "" +}]; + +class DefaultExtension extends MProvider { + async getPopular(page) { + const baseUrl = this.source.baseUrl; + const res = await new Client().get(`${baseUrl}/browse?order=rating&page=${page}`); + + return this.animeFromElement(res.body); + } + async getLatestUpdates(page) { + const baseUrl = this.source.baseUrl; + const res = await new Client().get(`${baseUrl}/browse?order=added&page=${page}`); + + return this.animeFromElement(res.body); + } + async search(query, page, filters) { + const baseUrl = this.source.baseUrl; + const res = await new Client().get(`${baseUrl}/browse?&q=${query}&page=${page}`); + + return this.animeFromElement(res.body); + } + async getDetail(url) { + const baseUrl = this.source.baseUrl; + const res = await new Client().get(baseUrl + url); + const document = new Document(res.body); + const genre = document.select("nav.Nvgnrs a").map(e => e.text); + const description = document.selectFirst("div.Description").text.trim(); + const status = this.parseStatus(document.selectFirst("span.fa-tv").text); + const episodeList = []; + + for (const script of document.select("script")) { + if (script.text.includes("var anime_info =")) { + const animeInfo = script.text.substringAfter("var anime_info = [").substringBefore("];"); + const arrInfo = JSON.parse(`[${animeInfo}]`); + const animeUri = arrInfo[2].replace(/"/g, ""); + const episodes = script.text.substringAfter("var episodes = [").substringBefore("];").trim(); + const arrEpisodes = episodes.split("],["); + for (const arrEp of arrEpisodes) { + const noEpisode = arrEp.replace("[", "").replace("]", "").split(",")[0]; + const url = `${baseUrl}/ver/${animeUri}-${noEpisode}`; + const name = `Episodio ${noEpisode}`; + episodeList.push({ name, url }); + } + + } + } + + return { + description, status: status, genre, episodes: episodeList + }; + } + + async getVideoList(url) { + const res = await new Client().get(url); + const document = new Document(res.body); + const script = document.selectFirst("script:contains('var videos = {')"); + if (!script) return []; + const jsonString = script.text; + const responseString = jsonString.substringAfter("var videos =").substringBefore(";").trim(); + const serverModel = JSON.parse(responseString); + const videos = []; + + for (const item of serverModel.SUB) { + let videoList = []; + switch (item.title) { + case "Stape": + videoList = await streamTapeExtractor(item.url || item.code); + break; + case "Okru": + videoList = await okruExtractor(item.url || item.code); + break; + case "YourUpload": + videoList = await yourUploadExtractor(item.url || item.code); + break; + case "SW": + videoList = await streamWishExtractor(item.url || item.code, "StreamWish:"); + break; + default: + videoList = []; + } + videos.push(...videoList); + } + + return this.sortVideos(videos); + } + + sortVideos(videos) { + const preferences = new SharedPreferences(); + const server = preferences.get("preferred_server"); + const quality = preferences.get("preferred_quality"); + videos.sort((a, b) => { + let qualityMatchA = 0; + if (a.quality.includes(server) && + a.quality.includes(quality)) { + qualityMatchA = 1; + } + let qualityMatchB = 0; + if (b.quality.includes(server) && + b.quality.includes(quality)) { + qualityMatchB = 1; + } + return qualityMatchB - qualityMatchA; + }); + return videos; + } + + animeFromElement(body) { + const elements = new Document(body).select("div.Container ul.ListAnimes li article"); + const list = []; + + for (const element of elements) { + const name = element.selectFirst("a h3").text; + const thumbnailUrl = element.selectFirst("a div.Image figure img").attr("src"); + const imageUrl = thumbnailUrl ? thumbnailUrl : element.selectFirst("a div.Image figure img").attr("data-cfsrc"); + const link = element.selectFirst("div.Description a.Button").attr("href"); + list.push({ name, imageUrl, link }); + } + return { + list: list, + hasNextPage: new Document(body).select("div.Container ul.ListAnimes li article").length > 0 + } + } + + parseStatus(statusString) { + if (statusString.includes("En emision")) { + return 0; + } else if (statusString.includes("Finalizado")) { + return 1; + } else { + return 5; + } + } + + getSourcePreferences() { + return [ + + { + "key": "preferred_quality", + "listPreference": { + "title": "Preferred quality", + "summary": "", + "valueIndex": 0, + "entries": [ + "1080p", + "720p", + "480p", + "360p", + ], + "entryValues": [ + "1080", + "720", + "480", + "360", + ] + } + }, + { + "key": "preferred_server", + "listPreference": { + "title": "Preferred server", + "summary": "", + "valueIndex": 0, + "entries": ["StreamWish", "YourUpload", "Okru", "Streamtape"], + "entryValues": ["StreamWish", "YourUpload", "Okru", "Streamtape"] + } + } + ]; + } + +} diff --git a/javascript/icon/es.animeflv.png b/javascript/icon/es.animeflv.png new file mode 100644 index 0000000000000000000000000000000000000000..d561006e0451517d00bb09741b49730dbfcc63df GIT binary patch literal 3053 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 literal 0 HcmV?d00001