From cc6b40762d3b47279e46a3742421fea177232bfd Mon Sep 17 00:00:00 2001 From: Swakshan Date: Thu, 9 Jan 2025 12:46:23 +0530 Subject: [PATCH 1/8] extension(aniplay): Added anilist support for latest, popular, search --- javascript/anime/src/en/aniplay.js | 237 +++++++++++++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 javascript/anime/src/en/aniplay.js diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js new file mode 100644 index 00000000..9e30bedb --- /dev/null +++ b/javascript/anime/src/en/aniplay.js @@ -0,0 +1,237 @@ +const mangayomiSources = [{ + "name": "Aniplay", + "lang": "en", + "baseUrl": "https://aniplaynow.live", + "apiUrl": "https://aniplaynow.live", + "iconUrl": "https://www.google.com/s2/favicons?sz=128&domain=https://aniplaynow.live/", + "typeSource": "single", + "isManga": false, + "version": "0.0.3", + "dateFormat": "", + "dateFormatLocale": "", + "pkgPath": "anime/src/en/aniplay.js" +}]; + +class DefaultExtension extends MProvider { + + constructor() { + super(); + this.client = new Client(); + } + + getHeaders(url) { + return { + Referer: this.source.apiUrl + } + } + + getPreference(key) { + const preferences = new SharedPreferences(); + return preferences.get(key); + } + + + // code from torrentioanime.js + anilistQuery() { + return ` + query ($page: Int, $perPage: Int, $sort: [MediaSort], $search: String) { + Page(page: $page, perPage: $perPage) { + pageInfo { + currentPage + hasNextPage + } + media(type: ANIME, sort: $sort, search: $search, status_in: [RELEASING, FINISHED, NOT_YET_RELEASED]) { + id + title { + romaji + english + native + } + coverImage { + extraLarge + large + } + description + status + tags { + name + } + genres + studios { + nodes { + name + } + } + countryOfOrigin + isAdult + } + } + } + `.trim(); + } + + anilistLatestQuery() { + const currentTimeInSeconds = Math.floor(Date.now() / 1000); + return ` + query ($page: Int, $perPage: Int, $sort: [AiringSort]) { + Page(page: $page, perPage: $perPage) { + pageInfo { + currentPage + hasNextPage + } + airingSchedules( + airingAt_greater: 0 + airingAt_lesser: ${currentTimeInSeconds - 10000} + sort: $sort + ) { + media { + id + title { + romaji + english + native + } + coverImage { + extraLarge + large + } + description + status + tags { + name + } + genres + studios { + nodes { + name + } + } + countryOfOrigin + isAdult + } + } + } + } + `.trim(); + } + async makeGraphQLRequest(query, variables) { + const res = await this.client.post("https://graphql.anilist.co", {}, + { + query, variables + }); + return res; + } + + parseSearchJson(jsonLine, isLatestQuery = false) { + const jsonData = JSON.parse(jsonLine); + jsonData.type = isLatestQuery ? "AnilistMetaLatest" : "AnilistMeta"; + const metaData = jsonData; + + const mediaList = metaData.type == "AnilistMeta" + ? metaData.data?.Page?.media || [] + : metaData.data?.Page?.airingSchedules.map(schedule => schedule.media) || []; + + const hasNextPage = metaData.type == "AnilistMeta" || metaData.type == "AnilistMetaLatest" + ? metaData.data?.Page?.pageInfo?.hasNextPage || false + : false; + + const animeList = mediaList + .filter(media => !((media?.countryOfOrigin === "CN" || media?.isAdult) && isLatestQuery)) + .map(media => { + const anime = {}; + anime.link = media?.id?.toString() || ""; + anime.name = (() => { + var preferenceTitle = this.getPreference("aniplay_pref_title"); + switch (preferenceTitle) { + case "romaji": + return media?.title?.romaji || ""; + case "english": + return media?.title?.english?.trim() || media?.title?.romaji || ""; + case "native": + return media?.title?.native || ""; + default: + return ""; + } + })(); + anime.imageUrl = media?.coverImage?.extraLarge || ""; + + return anime; + }); + + return { "list": animeList, "hasNextPage": hasNextPage }; + } + + async getPopular(page) { + const variables = JSON.stringify({ + page: page, + perPage: 30, + sort: "TRENDING_DESC" + }); + + const res = await this.makeGraphQLRequest(this.anilistQuery(), variables); + + return this.parseSearchJson(res.body) + } + + async getLatestUpdates(page) { + const variables = JSON.stringify({ + page: page, + perPage: 30, + sort: "TIME_DESC" + }); + + const res = await this.makeGraphQLRequest(this.anilistLatestQuery(), variables); + + return this.parseSearchJson(res.body, true) + } + + async search(query, page, filters) { + const variables = JSON.stringify({ + page: page, + perPage: 30, + sort: "POPULARITY_DESC", + search: query + }); + + const res = await this.makeGraphQLRequest(this.anilistQuery(), variables); + + return this.parseSearchJson(res.body) + } + + get supportsLatest() { + throw new Error("supportsLatest not implemented"); + } + async getDetail(url) { + throw new Error("getDetail not implemented"); + } + // For anime episode video list + async getVideoList(url) { + throw new Error("getVideoList not implemented"); + } + // For manga chapter pages + async getPageList() { + throw new Error("getPageList not implemented"); + } + getFilterList() { + throw new Error("getFilterList not implemented"); + } + getSourcePreferences() { + return [ + { + "key": "aniplay_pref_title", + "listPreference": { + "title": "Preferred Title", + "summary": "", + "valueIndex": 0, + "entries": [ + "Romaji", + "English", + "Native"], + "entryValues": [ + "romaji", + "english", + "native"], + } + },] + } +} From f4f52a4fc5ed92df3c09e8bfdaedbfad8cd8ab77 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Mon, 13 Jan 2025 21:46:00 +0530 Subject: [PATCH 2/8] extension(aniplay): Added details --- javascript/anime/src/en/aniplay.js | 177 ++++++++++++++++++++++++++--- 1 file changed, 161 insertions(+), 16 deletions(-) diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js index 9e30bedb..c6161e22 100644 --- a/javascript/anime/src/en/aniplay.js +++ b/javascript/anime/src/en/aniplay.js @@ -5,7 +5,7 @@ const mangayomiSources = [{ "apiUrl": "https://aniplaynow.live", "iconUrl": "https://www.google.com/s2/favicons?sz=128&domain=https://aniplaynow.live/", "typeSource": "single", - "isManga": false, + "itemType": 1, "version": "0.0.3", "dateFormat": "", "dateFormatLocale": "", @@ -13,7 +13,7 @@ const mangayomiSources = [{ }]; class DefaultExtension extends MProvider { - + constructor() { super(); this.client = new Client(); @@ -70,6 +70,7 @@ class DefaultExtension extends MProvider { `.trim(); } + // code from torrentioanime.js anilistLatestQuery() { const currentTimeInSeconds = Math.floor(Date.now() / 1000); return ` @@ -114,6 +115,86 @@ class DefaultExtension extends MProvider { } `.trim(); } + + // code from torrentioanime.js + async getAnimeDetails(anilistId) { + const query = ` + query($id: Int){ + Media(id: $id){ + id + title { + romaji + english + native + } + coverImage { + extraLarge + large + } + description + status + tags { + name + } + genres + studios { + nodes { + name + } + } + countryOfOrigin + isAdult + } + } + `.trim(); + + const variables = JSON.stringify({ id: anilistId }); + + const res = await this.makeGraphQLRequest(query, variables); + const media = JSON.parse(res.body).data.Media; + const anime = {}; + anime.name = (() => { + var preferenceTitle = this.getPreference("aniplay_pref_title"); + switch (preferenceTitle) { + case "romaji": + return media?.title?.romaji || ""; + case "english": + return media?.title?.english?.trim() || media?.title?.romaji || ""; + case "native": + return media?.title?.native || ""; + default: + return ""; + } + })(); + anime.imageUrl = media?.coverImage?.extraLarge || ""; + anime.description = (media?.description || "No Description") + .replace(/

/g, "\n") + .replace(/<.*?>/g, ""); + + anime.status = (() => { + switch (media?.status) { + case "RELEASING": + return 0; + case "FINISHED": + return 1; + case "HIATUS": + return 2; + case "NOT_YET_RELEASED": + return 3; + default: + return 5; + } + })(); + + const tagsList = media?.tags?.map(tag => tag.name).filter(Boolean) || []; + const genresList = media?.genres || []; + anime.genre = [...new Set([...tagsList, ...genresList])].sort(); + const studiosList = media?.studios?.nodes?.map(node => node.name).filter(Boolean) || []; + anime.author = studiosList.sort().join(", "); + return anime; + } + + // code from torrentioanime.js async makeGraphQLRequest(query, variables) { const res = await this.client.post("https://graphql.anilist.co", {}, { @@ -122,6 +203,7 @@ class DefaultExtension extends MProvider { return res; } + // code from torrentioanime.js parseSearchJson(jsonLine, isLatestQuery = false) { const jsonData = JSON.parse(jsonLine); jsonData.type = isLatestQuery ? "AnilistMetaLatest" : "AnilistMeta"; @@ -141,7 +223,7 @@ class DefaultExtension extends MProvider { const anime = {}; anime.link = media?.id?.toString() || ""; anime.name = (() => { - var preferenceTitle = this.getPreference("aniplay_pref_title"); + var preferenceTitle = this.getPreference("aniplay_pref_title"); switch (preferenceTitle) { case "romaji": return media?.title?.romaji || ""; @@ -170,7 +252,7 @@ class DefaultExtension extends MProvider { const res = await this.makeGraphQLRequest(this.anilistQuery(), variables); - return this.parseSearchJson(res.body) + return this.parseSearchJson(res.body) } async getLatestUpdates(page) { @@ -182,7 +264,7 @@ class DefaultExtension extends MProvider { const res = await this.makeGraphQLRequest(this.anilistLatestQuery(), variables); - return this.parseSearchJson(res.body, true) + return this.parseSearchJson(res.body, true) } async search(query, page, filters) { @@ -195,14 +277,71 @@ class DefaultExtension extends MProvider { const res = await this.makeGraphQLRequest(this.anilistQuery(), variables); - return this.parseSearchJson(res.body) + return this.parseSearchJson(res.body) } get supportsLatest() { throw new Error("supportsLatest not implemented"); } + + async aniplayRequest(url, body) { + var next_action = "" + + if (url.indexOf("/info/") > -1) { + next_action = 'f3422af67c84852f5e63d50e1f51718f1c0225c4' + } else if (url.indexOf("/watch/") > -1) { + next_action = '5dbcd21c7c276c4d15f8de29d9ef27aef5ea4a5e' + } + + var headers = { + "referer": "https://aniplaynow.live", + 'next-action': next_action, + "Content-Type": "application/json", + } + + var response = await new Client().post(url, headers, body); + + if (response.statusCode != 200) { + throw new Error("Error: " + response.statusText); + } + return JSON.parse(response.body.split('1:')[1]) + + } + async getDetail(url) { - throw new Error("getDetail not implemented"); + var anilistId = url + var animeData = await this.getAnimeDetails(anilistId) + + + var link = `${this.source.baseUrl}anime/info/${anilistId}` + var body = [anilistId, true, false] + var result = await this.aniplayRequest(link, body) + if (result.length < 1) { + throw new Error("Error: No data found for the given URL"); + } + + var user_provider = this.getPreference("aniplay_pref_provider"); + var choice = result[0] + for (var ch of result) { + if (ch["providerId"] == user_provider) { + choice = ch + break; + } + } + var chapters = [] + var epList = choice.episodes + for (var ep of epList) { + var title = ep.title + var num = ep.number + var name = `E${num}: ${title}` + var dateUpload = "createdAt" in ep ? new Date(ep.createdAt) : new Date().now() + dateUpload = dateUpload.valueOf().toString(); + var epUrl = `${JSON.stringify(ep)}||${choice.providerId}` + chapters.push({ name, url: epUrl, dateUpload }) + } + animeData.link = link + animeData.chapters = chapters.reverse() + return animeData } // For anime episode video list async getVideoList(url) { @@ -223,15 +362,21 @@ class DefaultExtension extends MProvider { "title": "Preferred Title", "summary": "", "valueIndex": 0, - "entries": [ - "Romaji", - "English", - "Native"], - "entryValues": [ - "romaji", - "english", - "native"], + "entries": ["Romaji", "English", "Native"], + "entryValues": ["romaji", "english", "native"], } - },] + }, + { + "key": "aniplay_pref_provider", + "listPreference": { + "title": "Preferred provider", + "summary": "", + "valueIndex": 0, + "entries": ["Anya", "Yuki", "Kuro"], + "entryValues": ["anya", "yuki", "kuro"], + } + }, + + ] } } From 22a536abb3b43f328323f3da9d546d290dafbca4 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 14 Jan 2025 11:59:13 +0530 Subject: [PATCH 3/8] extension(aniplay): Added servers --- javascript/anime/src/en/aniplay.js | 104 ++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 11 deletions(-) diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js index c6161e22..2dad06d9 100644 --- a/javascript/anime/src/en/aniplay.js +++ b/javascript/anime/src/en/aniplay.js @@ -284,15 +284,15 @@ class DefaultExtension extends MProvider { throw new Error("supportsLatest not implemented"); } - async aniplayRequest(url, body) { + async aniplayRequest(slug, body) { var next_action = "" - if (url.indexOf("/info/") > -1) { + if (slug.indexOf("info/") > -1) { next_action = 'f3422af67c84852f5e63d50e1f51718f1c0225c4' - } else if (url.indexOf("/watch/") > -1) { + } else if (slug.indexOf("watch/") > -1) { next_action = '5dbcd21c7c276c4d15f8de29d9ef27aef5ea4a5e' } - + var url = `${this.source.baseUrl}anime/${slug}` var headers = { "referer": "https://aniplaynow.live", 'next-action': next_action, @@ -313,9 +313,9 @@ class DefaultExtension extends MProvider { var animeData = await this.getAnimeDetails(anilistId) - var link = `${this.source.baseUrl}anime/info/${anilistId}` + var slug = `info/${anilistId}` var body = [anilistId, true, false] - var result = await this.aniplayRequest(link, body) + var result = await this.aniplayRequest(slug, body) if (result.length < 1) { throw new Error("Error: No data found for the given URL"); } @@ -336,16 +336,98 @@ class DefaultExtension extends MProvider { var name = `E${num}: ${title}` var dateUpload = "createdAt" in ep ? new Date(ep.createdAt) : new Date().now() dateUpload = dateUpload.valueOf().toString(); - var epUrl = `${JSON.stringify(ep)}||${choice.providerId}` + delete ep.img + delete ep.title + delete ep.description + var epUrl = `${anilistId}||${JSON.stringify(ep)}||${choice.providerId}` chapters.push({ name, url: epUrl, dateUpload }) } - animeData.link = link + animeData.link = `${this.source.baseUrl}anime/${slug}` animeData.chapters = chapters.reverse() return animeData } + + // Extracts the streams url for different resolutions from a hls stream. + async extractStreams(url, providerId) { + const response = await new Client().get(url); + const body = response.body; + const lines = body.split('\n'); + var streams = [{ + url: url, + originalUrl: url, + quality: "auto", + }]; + + for (let i = 0; i < lines.length; i++) { + if (lines[i].startsWith('#EXT-X-STREAM-INF:')) { + var resolution = lines[i].match(/RESOLUTION=(\d+x\d+)/)[1]; + var m3u8Url = lines[i + 1].trim(); + if (providerId === "anya") { + m3u8Url = `https://prox.uqable.easypanel.host${m3u8Url}` + } else if (providerId === "yuki") { + var orginalUrl = url + m3u8Url = orginalUrl.replace("master.m3u8", m3u8Url) + } + streams.push({ + url: m3u8Url, + originalUrl: m3u8Url, + quality: `${resolution} - ${providerId}`, + }); + } + } + return streams + + } + + async getAnyaStreams(result) { + var m3u8Url = result.sources[0].url + m3u8Url = `https://prox.uqable.easypanel.host/fetch?url=${m3u8Url}&ref=https://anix.sh` + return await this.extractStreams(m3u8Url, "anya"); + } + + async getYukiStreams(result) { + var m3u8Url = result.sources[0].url + var streams = await this.extractStreams(m3u8Url, "yuki"); + + + var subtitles = result.tracks + streams[0].subtitles = subtitles + + return streams + } + // For anime episode video list async getVideoList(url) { - throw new Error("getVideoList not implemented"); + var urlSplits = url.split("||") + var anilistId = urlSplits[0] + var epData = JSON.parse(urlSplits[1]) + var providerId = urlSplits[2] + + var subOrDub = "sub" + + var slug = `watch/${anilistId}` + var body = [ + anilistId, + providerId, + epData.id, + epData.number.toString(), + subOrDub + ] + var result = await this.aniplayRequest(slug, body) + if (result === null) { + throw new Error("Error: No data found for the given URL"); + } + + var streams = [] + if (providerId == "anya") { + streams = await this.getAnyaStreams(result) + } + else { + streams = await this.getYukiStreams(result) + } + + return streams + } // For manga chapter pages async getPageList() { @@ -372,8 +454,8 @@ class DefaultExtension extends MProvider { "title": "Preferred provider", "summary": "", "valueIndex": 0, - "entries": ["Anya", "Yuki", "Kuro"], - "entryValues": ["anya", "yuki", "kuro"], + "entries": ["Anya", "Yuki"], + "entryValues": ["anya", "yuki"], } }, From 36cbfccecc2aecef87936a94d4aa049019a3b5ed Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 14 Jan 2025 12:10:51 +0530 Subject: [PATCH 4/8] extension(aniplay): Added preferred audio type --- javascript/anime/src/en/aniplay.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js index 2dad06d9..a711ce18 100644 --- a/javascript/anime/src/en/aniplay.js +++ b/javascript/anime/src/en/aniplay.js @@ -6,7 +6,7 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=128&domain=https://aniplaynow.live/", "typeSource": "single", "itemType": 1, - "version": "0.0.3", + "version": "0.0.5", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/en/aniplay.js" @@ -403,7 +403,8 @@ class DefaultExtension extends MProvider { var epData = JSON.parse(urlSplits[1]) var providerId = urlSplits[2] - var subOrDub = "sub" + var user_audio_type = this.getPreference("aniplay_pref_audio_type"); + var subOrDub = epData.hasDub && user_audio_type === "dub" ? "dub" : "sub" var slug = `watch/${anilistId}` var body = [ @@ -457,6 +458,15 @@ class DefaultExtension extends MProvider { "entries": ["Anya", "Yuki"], "entryValues": ["anya", "yuki"], } + }, { + "key": "aniplay_pref_audio_type", + "listPreference": { + "title": "Preferred audio type", + "summary": "Sub/Dub", + "valueIndex": 0, + "entries": ["Sub", "Dub"], + "entryValues": ["sub", "dub"], + } }, ] From aaa7334f040fa628f74245f16e500db43f118a73 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 14 Jan 2025 12:29:47 +0530 Subject: [PATCH 5/8] extension(aniplay): Mark filler episodes --- javascript/anime/src/en/aniplay.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js index a711ce18..23d11927 100644 --- a/javascript/anime/src/en/aniplay.js +++ b/javascript/anime/src/en/aniplay.js @@ -328,12 +328,15 @@ class DefaultExtension extends MProvider { break; } } + var user_mark_filler_ep = this.getPreference("aniplay_pref_mark_filler"); var chapters = [] var epList = choice.episodes for (var ep of epList) { var title = ep.title var num = ep.number + var isFiller = ep.isFiller var name = `E${num}: ${title}` + name = isFiller && user_mark_filler_ep === true ? `E${num}: ${title} (F)` : name var dateUpload = "createdAt" in ep ? new Date(ep.createdAt) : new Date().now() dateUpload = dateUpload.valueOf().toString(); delete ep.img @@ -459,6 +462,14 @@ class DefaultExtension extends MProvider { "entryValues": ["anya", "yuki"], } }, { + "key": "aniplay_pref_mark_filler", + "switchPreferenceCompat": { + "title": "Mark filler episodes", + "summary": "Filler episodes will be marked with (F)", + "value": false + } + }, + { "key": "aniplay_pref_audio_type", "listPreference": { "title": "Preferred audio type", From da791612497603d0a605cf5160238fbc9e993413 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 14 Jan 2025 22:44:40 +0530 Subject: [PATCH 6/8] extension(aniplay): Added preferred video resolution --- javascript/anime/src/en/aniplay.js | 35 ++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js index 23d11927..1f182081 100644 --- a/javascript/anime/src/en/aniplay.js +++ b/javascript/anime/src/en/aniplay.js @@ -6,7 +6,7 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=128&domain=https://aniplaynow.live/", "typeSource": "single", "itemType": 1, - "version": "0.0.5", + "version": "0.0.6", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/en/aniplay.js" @@ -342,6 +342,7 @@ class DefaultExtension extends MProvider { delete ep.img delete ep.title delete ep.description + delete ep.isFiller var epUrl = `${anilistId}||${JSON.stringify(ep)}||${choice.providerId}` chapters.push({ name, url: epUrl, dateUpload }) } @@ -350,6 +351,27 @@ class DefaultExtension extends MProvider { return animeData } + + // Sorts streams based on user preference. + async sortStreams(streams) { + var sortedStreams = []; + var copyStreams = streams.slice() + + var pref = await this.getPreference("aniplay_pref_video_resolution"); + for (var stream of streams) { + + if (stream.quality.indexOf(pref) > -1) { + sortedStreams.push(stream); + var index = copyStreams.indexOf(stream); + if (index > -1) { + copyStreams.splice(index, 1); + } + break; + } + } + return [...sortedStreams, ...copyStreams] + } + // Extracts the streams url for different resolutions from a hls stream. async extractStreams(url, providerId) { const response = await new Client().get(url); @@ -430,7 +452,7 @@ class DefaultExtension extends MProvider { streams = await this.getYukiStreams(result) } - return streams + return await this.sortStreams(streams) } // For manga chapter pages @@ -478,6 +500,15 @@ class DefaultExtension extends MProvider { "entries": ["Sub", "Dub"], "entryValues": ["sub", "dub"], } + }, { + key: 'aniplay_pref_video_resolution', + listPreference: { + title: 'Preferred video resolution', + summary: '', + valueIndex: 0, + entries: ["Auto", "1080p", "720p", "480p", "360p"], + entryValues: ["auto", "1080", "720", "480", "360"] + } }, ] From 1da48bbd5e60d1697e89af97d73ecb8c59e4ea8f Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 14 Jan 2025 23:16:07 +0530 Subject: [PATCH 7/8] extension(aniplay): misc --- javascript/anime/src/en/aniplay.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js index 1f182081..c9197e25 100644 --- a/javascript/anime/src/en/aniplay.js +++ b/javascript/anime/src/en/aniplay.js @@ -6,7 +6,7 @@ const mangayomiSources = [{ "iconUrl": "https://www.google.com/s2/favicons?sz=128&domain=https://aniplaynow.live/", "typeSource": "single", "itemType": 1, - "version": "0.0.6", + "version": "1.0.0", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/en/aniplay.js" @@ -142,6 +142,7 @@ class DefaultExtension extends MProvider { name } } + format countryOfOrigin isAdult } @@ -191,6 +192,7 @@ class DefaultExtension extends MProvider { anime.genre = [...new Set([...tagsList, ...genresList])].sort(); const studiosList = media?.studios?.nodes?.map(node => node.name).filter(Boolean) || []; anime.author = studiosList.sort().join(", "); + anime.format = media.format return anime; } @@ -335,8 +337,9 @@ class DefaultExtension extends MProvider { var title = ep.title var num = ep.number var isFiller = ep.isFiller - var name = `E${num}: ${title}` - name = isFiller && user_mark_filler_ep === true ? `E${num}: ${title} (F)` : name + + var name = isFiller && user_mark_filler_ep ? `E${num}:(F) ${title}` : `E${num}: ${title}` + var dateUpload = "createdAt" in ep ? new Date(ep.createdAt) : new Date().now() dateUpload = dateUpload.valueOf().toString(); delete ep.img @@ -346,6 +349,10 @@ class DefaultExtension extends MProvider { var epUrl = `${anilistId}||${JSON.stringify(ep)}||${choice.providerId}` chapters.push({ name, url: epUrl, dateUpload }) } + + var format = animeData.format + if(format === "MOVIE") chapters[0].name = "Movie" + animeData.link = `${this.source.baseUrl}anime/${slug}` animeData.chapters = chapters.reverse() return animeData From e5d584a974f0903c9d9c03c504910a311644fca3 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Tue, 14 Jan 2025 23:18:28 +0530 Subject: [PATCH 8/8] extension(aniplay): misc --- javascript/anime/src/en/aniplay.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/javascript/anime/src/en/aniplay.js b/javascript/anime/src/en/aniplay.js index c9197e25..57ca2a4a 100644 --- a/javascript/anime/src/en/aniplay.js +++ b/javascript/anime/src/en/aniplay.js @@ -294,7 +294,7 @@ class DefaultExtension extends MProvider { } else if (slug.indexOf("watch/") > -1) { next_action = '5dbcd21c7c276c4d15f8de29d9ef27aef5ea4a5e' } - var url = `${this.source.baseUrl}anime/${slug}` + var url = `${this.source.baseUrl}/anime/${slug}` var headers = { "referer": "https://aniplaynow.live", 'next-action': next_action, @@ -353,7 +353,7 @@ class DefaultExtension extends MProvider { var format = animeData.format if(format === "MOVIE") chapters[0].name = "Movie" - animeData.link = `${this.source.baseUrl}anime/${slug}` + animeData.link = `${this.source.baseUrl}/anime/${slug}` animeData.chapters = chapters.reverse() return animeData }