From 7a577039ff0d1e5c419cfe44ccba052c0a536395 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Fri, 17 Jan 2025 10:54:04 +0530 Subject: [PATCH 1/7] extension(netflixMirror): Use TV domain for cookie --- javascript/anime/src/all/netflixmirror.js | 27 +++++++++++------------ 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index 2614c66c..8b67ea2a 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -2,38 +2,37 @@ const mangayomiSources = [{ "name": "NetflixMirror", "lang": "all", "baseUrl": "https://iosmirror.cc", - "apiUrl": "", + "apiUrl": "https://pcmirror.cc", "iconUrl": "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.netflixmirror.png", "typeSource": "single", "isManga": false, "itemType": 1, - "version": "0.0.6", + "version": "0.0.7", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/all/netflixmirror.js" }]; class DefaultExtension extends MProvider { + + getTVApi() { + return "https://pcmirror.cc" + } + async getCookie() { const preferences = new SharedPreferences(); let cookie; cookie = preferences.getString("cookie", ""); const check = await new Client().get(`${this.source.baseUrl}/home`, { "cookie": cookie }); - const elements = new Document(check.body).select(".tray-container, #top10"); + const hDocBody = new Document(check.body).selectFirst("body") + const elements = hDocBody.select(".tray-container, #top10"); if (elements && elements.length > 0) { return cookie; } - const hDoc = new Document((await new Client().get(`${this.source.baseUrl}/home`, { "cookie": "" })).body); - const addhash = hDoc.selectFirst("body").attr("data-addhash"); - const time = hDoc.selectFirst("body").attr("data-time"); - await new Client().get(`https://userverify.netmirror.app/?fr3=${addhash}&a=y&t=${time}`); - let body; - let res; - do { - res = await new Client().post(`${this.source.baseUrl}/verify2.php`, { "cookie": "" }, { "verify": addhash }); - body = res.body; - } while (!body.includes('"statusup":"All Done"')); - cookie = `ott=nf; hd=on; ${res.headers["set-cookie"]}`; + + const addhash = hDocBody.attr("data-addhash"); + var res = await new Client().post(`${this.getTVApi()}/tv/p.php`, { "cookie": "" }, { "hash": addhash }); + cookie = res.headers["set-cookie"]; preferences.setString("cookie", cookie); return cookie; } From 9fb32ffcacda1ed05eb34f3254b30d94aef35f5b Mon Sep 17 00:00:00 2001 From: Swakshan Date: Fri, 17 Jan 2025 12:49:51 +0530 Subject: [PATCH 2/7] extension(netflixMirror): Added 1080p support --- javascript/anime/src/all/netflixmirror.js | 114 ++++++++++------------ 1 file changed, 50 insertions(+), 64 deletions(-) diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index 8b67ea2a..d0a56ea2 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -36,9 +36,10 @@ class DefaultExtension extends MProvider { preferences.setString("cookie", cookie); return cookie; } - async request(url, cookie) { + async request(url, cookie, tvApi = false) { cookie = cookie ?? await this.getCookie(); - return (await new Client().get(this.source.baseUrl + url, { "cookie": cookie })).body; + var api = tvApi ? this.getTVApi() : this.source.baseUrl; + return (await new Client().get(api + url, { "cookie": cookie })).body; } async getPopular(page) { return await this.getPages(await this.request("/home"), ".tray-container, #top10") @@ -136,78 +137,63 @@ class DefaultExtension extends MProvider { return episodes; } - async getVideoList(url) { - const baseUrl = this.source.baseUrl; + const baseUrl = this.getTVApi(); const urlData = JSON.parse(url); - const data = JSON.parse(await this.request(`/playlist.php?id=${urlData.id}&t=${urlData.name}`)); - const videoList = []; + const data = JSON.parse(await this.request(`/tv/playlist.php?id=${urlData.id}&t=${urlData.name}`, null, true)); + let videoList = []; + let subtitles = []; + let audios = []; for (const playlist of data) { - for (const source of playlist.sources) { - try { - const subtitles = []; - playlist.tracks.filter(track => track.kind === 'captions').forEach(track => { - subtitles.push({ - label: track.label, - file: track.file - }); - }); - const link = baseUrl + source.file; - const headers = + var source = playlist.sources[0] + var link = baseUrl + source.file; + + + var resp = await new Client().get(link); + + if (resp.statusCode === 200) { + const masterPlaylist = resp.body; + masterPlaylist.substringAfter('#EXT-X-MEDIA:').split('#EXT-X-MEDIA:').forEach(it => { + if (it.includes('TYPE=AUDIO')) { + const audioInfo = it.substringAfter('TYPE=AUDIO').substringBefore('\n'); + const language = audioInfo.substringAfter('NAME="').substringBefore('"'); + const url = audioInfo.substringAfter('URI="').substringBefore('"'); + audios.push({ file: url, label: language }); + } + }); + + masterPlaylist.substringAfter('#EXT-X-STREAM-INF:').split('#EXT-X-STREAM-INF:').forEach(it => { + + var quality = `${it.substringAfter('RESOLUTION=').substringAfter('x').substringBefore(',')}p (${source.label})`; + let videoUrl = it.substringAfter('\n').substringBefore('\n'); + + if (!videoUrl.startsWith('http')) { + videoUrl = resp.request.url.substringBeforeLast('/') + `/${videoUrl}`; + } + var headers = { - 'Host': link.match(/^(?:https?:\/\/)?(?:www\.)?([^\/]+)/)[1], + 'Host': videoUrl.match(/^(?:https?:\/\/)?(?:www\.)?([^\/]+)/)[1], 'Origin': baseUrl, 'Referer': `${baseUrl}/` }; - const resp = await new Client().get(link, headers); + videoList.push({ url: videoUrl, quality, originalUrl: videoUrl, headers }); - if (resp.statusCode === 200) { - const masterPlaylist = resp.body; - const audios = []; - masterPlaylist.substringAfter('#EXT-X-MEDIA:').split('#EXT-X-MEDIA:').forEach(it => { - if (it.includes('TYPE=AUDIO')) { - const audioInfo = it.substringAfter('TYPE=AUDIO').substringBefore('\n'); - const language = audioInfo.substringAfter('NAME="').substringBefore('"'); - const url = audioInfo.substringAfter('URI="').substringBefore('"'); - audios.push({ file: url, label: language }); - } - }); - - if (!masterPlaylist.includes('#EXT-X-STREAM-INF:')) { - if (audios.length === 0) { - videoList.push({ url: link, quality: source.label, originalUrl: link, subtitles, headers }); - } else { - videoList.push({ url: link, quality: source.label, originalUrl: link, subtitles, audios, headers }); - } - } else { - masterPlaylist.substringAfter('#EXT-X-STREAM-INF:').split('#EXT-X-STREAM-INF:').forEach(it => { - - const quality = `${it.substringAfter('RESOLUTION=').substringAfter('x').substringBefore(',')}p (${source.label})`; - let videoUrl = it.substringAfter('\n').substringBefore('\n'); - - if (!videoUrl.startsWith('http')) { - videoUrl = resp.request.url.substringBeforeLast('/') + `/${videoUrl}`; - } - const headers = - { - 'Host': videoUrl.match(/^(?:https?:\/\/)?(?:www\.)?([^\/]+)/)[1], - 'Origin': baseUrl, - 'Referer': `${baseUrl}/` - }; - if (audios.length === 0) { - videoList.push({ url: videoUrl, quality, originalUrl: videoUrl, subtitles, headers }); - } else { - videoList.push({ url: videoUrl, quality, originalUrl: videoUrl, subtitles, audios, headers }); - } - - }); - } - } - } catch (_) { - - } + }); } + + + + playlist.tracks.filter(track => track.kind === 'captions').forEach(track => { + subtitles.push({ + label: track.label, + file: track.file + }); + }); } + + + videoList[0].audios = audios; + videoList[0].subtitles = subtitles; return videoList; } From 2f0c50e6af0d0f57d114f7e40cf453800bbf7a68 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Fri, 17 Jan 2025 13:02:54 +0530 Subject: [PATCH 3/7] extension(netflixMirror): Added stream quality preference --- javascript/anime/src/all/netflixmirror.js | 44 +++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index d0a56ea2..dcf2e60a 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -7,7 +7,7 @@ const mangayomiSources = [{ "typeSource": "single", "isManga": false, "itemType": 1, - "version": "0.0.7", + "version": "0.0.9", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/all/netflixmirror.js" @@ -19,6 +19,11 @@ class DefaultExtension extends MProvider { return "https://pcmirror.cc" } + async getPreference(key) { + const preferences = new SharedPreferences(); + return preferences.get(key); + } + async getCookie() { const preferences = new SharedPreferences(); let cookie; @@ -137,6 +142,26 @@ class DefaultExtension extends MProvider { return episodes; } + // Sorts streams based on user preference. + async sortStreams(streams) { + var sortedStreams = []; + + var copyStreams = streams.slice() + var pref = await this.getPreference("netmirror_pref_video_resolution"); + for (var i in streams) { + var stream = streams[i]; + 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] + } + async getVideoList(url) { const baseUrl = this.getTVApi(); const urlData = JSON.parse(url); @@ -147,7 +172,7 @@ class DefaultExtension extends MProvider { for (const playlist of data) { var source = playlist.sources[0] var link = baseUrl + source.file; - + var resp = await new Client().get(link); @@ -194,7 +219,20 @@ class DefaultExtension extends MProvider { videoList[0].audios = audios; videoList[0].subtitles = subtitles; - return videoList; + return this.sortStreams(videoList); + } + + getSourcePreferences() { + return [{ + key: 'netmirror_pref_video_resolution', + listPreference: { + title: 'Preferred video resolution', + summary: '', + valueIndex: 0, + entries: ["1080p", "720p", "480"], + entryValues: ["1080", "720", "480"] + } + },]; } } From 708b2924eef54312bfcbbad19bcf0589cce8ab97 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Fri, 17 Jan 2025 16:37:12 +0530 Subject: [PATCH 4/7] extension(netflixMirror): updated display name logic --- javascript/anime/src/all/netflixmirror.js | 30 ++++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index dcf2e60a..b70253db 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -19,11 +19,15 @@ class DefaultExtension extends MProvider { return "https://pcmirror.cc" } - async getPreference(key) { + getPreference(key) { const preferences = new SharedPreferences(); return preferences.get(key); } + getPoster(id) { + return `https://imgcdn.media/poster/v/${id}.jpg` + } + async getCookie() { const preferences = new SharedPreferences(); let cookie; @@ -53,6 +57,7 @@ class DefaultExtension extends MProvider { return await this.getPages(await this.request("/home"), ".inner-mob-tray-container") } async getPages(body, selector) { + var name_pref = this.getPreference("netmirror_pref_display_name"); const elements = new Document(body).select(selector); const cookie = await this.getCookie(); const list = []; @@ -61,7 +66,9 @@ class DefaultExtension extends MProvider { const id = linkElement.selectFirst("a").attr("data-post"); if (id.length > 0) { const imageUrl = linkElement.selectFirst(".card-img-container img, .top10-img img").attr("data-src"); - list.push({ name: JSON.parse(await this.request(`/post.php?id=${id}`, cookie)).title, imageUrl, link: id }); + var name = name_pref ? JSON.parse(await this.request(`/post.php?id=${id}`, cookie)).title : `\n${id}` + + list.push({ name, imageUrl, link: id }); } } return { @@ -74,7 +81,7 @@ class DefaultExtension extends MProvider { const list = []; data.searchResult.map(async (res) => { const id = res.id; - list.push({ name: res.t, imageUrl: `https://img.nfmirrorcdn.top/poster/v/${id}.jpg`, link: id }); + list.push({ name: res.t, imageUrl: rhis.getPoster(id), link: id }); }) return { @@ -115,7 +122,7 @@ class DefaultExtension extends MProvider { } return { - description, status: 1, genre, episodes + name, imageUrl: this.getPoster(url), description, status: 1, genre, episodes }; } async getEpisodes(name, eid, sid, page, cookie) { @@ -172,9 +179,13 @@ class DefaultExtension extends MProvider { for (const playlist of data) { var source = playlist.sources[0] var link = baseUrl + source.file; + var headers = + { + 'Origin': baseUrl, + 'Referer': `${baseUrl}/` + }; - - var resp = await new Client().get(link); + var resp = await new Client().get(link, headers); if (resp.statusCode === 200) { const masterPlaylist = resp.body; @@ -232,6 +243,13 @@ class DefaultExtension extends MProvider { entries: ["1080p", "720p", "480"], entryValues: ["1080", "720", "480"] } + }, { + "key": "netmirror_pref_display_name", + "switchPreferenceCompat": { + "title": "Display media name on home page", + "summary": "Homepage loads faster by not calling details API", + "value": false + } },]; } From 2ac1c9a101f2fac2a276f7ff091119cd783a5b8e Mon Sep 17 00:00:00 2001 From: Swakshan Date: Fri, 17 Jan 2025 18:07:33 +0530 Subject: [PATCH 5/7] extension(netflixMirror): updated cookie logic --- javascript/anime/src/all/netflixmirror.js | 32 ++++++++++++++--------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index b70253db..a7c59c7c 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -7,7 +7,7 @@ const mangayomiSources = [{ "typeSource": "single", "isManga": false, "itemType": 1, - "version": "0.0.9", + "version": "0.0.10", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/all/netflixmirror.js" @@ -30,19 +30,25 @@ class DefaultExtension extends MProvider { async getCookie() { const preferences = new SharedPreferences(); - let cookie; - cookie = preferences.getString("cookie", ""); - const check = await new Client().get(`${this.source.baseUrl}/home`, { "cookie": cookie }); - const hDocBody = new Document(check.body).selectFirst("body") - const elements = hDocBody.select(".tray-container, #top10"); - if (elements && elements.length > 0) { - return cookie; + let cookie = preferences.getString("cookie", ""); + var cookie_ts = parseInt(preferences.getString("cookie_ts", "0")); + var now_ts = parseInt(new Date().getTime() / 1000); + + // Cookie lasts for 24hrs but still checking for 12hrs + if (now_ts - cookie_ts > 60 * 60 * 12) { + const check = await new Client().get(`${this.source.baseUrl}/home`, { "cookie": cookie }); + const hDocBody = new Document(check.body).selectFirst("body") + + const addhash = hDocBody.attr("data-addhash"); + const data_time = hDocBody.attr("data-time"); + + var res = await new Client().post(`${this.getTVApi()}/tv/p.php`, { "cookie": "" }, { "hash": addhash }); + cookie = res.headers["set-cookie"]; + preferences.setString("cookie", cookie); + preferences.setString("cookie_ts", data_time); } - const addhash = hDocBody.attr("data-addhash"); - var res = await new Client().post(`${this.getTVApi()}/tv/p.php`, { "cookie": "" }, { "hash": addhash }); - cookie = res.headers["set-cookie"]; - preferences.setString("cookie", cookie); + return cookie; } async request(url, cookie, tvApi = false) { @@ -81,7 +87,7 @@ class DefaultExtension extends MProvider { const list = []; data.searchResult.map(async (res) => { const id = res.id; - list.push({ name: res.t, imageUrl: rhis.getPoster(id), link: id }); + list.push({ name: res.t, imageUrl: this.getPoster(id), link: id }); }) return { From 3b39cbb2672ac687061ee869cdc8e8971008b0e4 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Sun, 19 Jan 2025 21:29:02 +0530 Subject: [PATCH 6/7] extension(NetMirror): Added prime --- javascript/anime/src/all/netflixmirror.js | 74 ++++++++++++++++++----- 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index a7c59c7c..2a5727eb 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -1,5 +1,6 @@ const mangayomiSources = [{ - "name": "NetflixMirror", + "name": "NetMirror", + "id": 446414301, "lang": "all", "baseUrl": "https://iosmirror.cc", "apiUrl": "https://pcmirror.cc", @@ -7,7 +8,7 @@ const mangayomiSources = [{ "typeSource": "single", "isManga": false, "itemType": 1, - "version": "0.0.10", + "version": "0.1.0", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/all/netflixmirror.js" @@ -24,8 +25,15 @@ class DefaultExtension extends MProvider { return preferences.get(key); } - getPoster(id) { - return `https://imgcdn.media/poster/v/${id}.jpg` + getPoster(id, service) { + if (service === "nf") + return `https://imgcdn.media/poster/v/${id}.jpg` + if (service === "pv") + return `https://imgcdn.media/pv/480/${id}.jpg` + } + + getServiceDetails() { + return this.getPreference("netmirror_pref_service"); } async getCookie() { @@ -48,13 +56,21 @@ class DefaultExtension extends MProvider { preferences.setString("cookie_ts", data_time); } + var service = this.getServiceDetails(); - return cookie; + return `ott=${service}; ${cookie}`; } async request(url, cookie, tvApi = false) { cookie = cookie ?? await this.getCookie(); + + var service = this.getServiceDetails(); + var slug = ""; + if (url == "/home") slug = ""; + else if (service == "pv") slug = "/pv"; + if (tvApi) slug = "/tv"; + var api = tvApi ? this.getTVApi() : this.source.baseUrl; - return (await new Client().get(api + url, { "cookie": cookie })).body; + return (await new Client().get(api + slug + url, { "cookie": cookie })).body; } async getPopular(page) { return await this.getPages(await this.request("/home"), ".tray-container, #top10") @@ -83,11 +99,12 @@ class DefaultExtension extends MProvider { } } async search(query, page, filters) { + var service = this.getServiceDetails(); const data = JSON.parse(await this.request(`/search.php?s=${query}`)); const list = []; data.searchResult.map(async (res) => { const id = res.id; - list.push({ name: res.t, imageUrl: this.getPoster(id), link: id }); + list.push({ name: res.t, imageUrl: this.getPoster(id, service), link: id }); }) return { @@ -96,6 +113,7 @@ class DefaultExtension extends MProvider { } } async getDetail(url) { + var service = this.getServiceDetails(); const cookie = await this.getCookie(); const data = JSON.parse(await this.request(`/post.php?id=${url}`, cookie)); const name = data.title; @@ -128,7 +146,7 @@ class DefaultExtension extends MProvider { } return { - name, imageUrl: this.getPoster(url), description, status: 1, genre, episodes + name, imageUrl: this.getPoster(url, service), description, status: 1, genre, episodes }; } async getEpisodes(name, eid, sid, page, cookie) { @@ -160,7 +178,7 @@ class DefaultExtension extends MProvider { var sortedStreams = []; var copyStreams = streams.slice() - var pref = await this.getPreference("netmirror_pref_video_resolution"); + var pref = this.getPreference("netmirror_pref_video_resolution"); for (var i in streams) { var stream = streams[i]; if (stream.quality.indexOf(pref) > -1) { @@ -176,9 +194,20 @@ class DefaultExtension extends MProvider { } async getVideoList(url) { - const baseUrl = this.getTVApi(); const urlData = JSON.parse(url); - const data = JSON.parse(await this.request(`/tv/playlist.php?id=${urlData.id}&t=${urlData.name}`, null, true)); + var service = this.getServiceDetails() + + let baseUrl = this.source.baseUrl + let isTVAPI = false; + if (service === "nf") { + baseUrl = this.getTVApi() + isTVAPI = true; + + } + + + + const data = JSON.parse(await this.request(`/playlist.php?id=${urlData.id}&t=${urlData.name}`, null, isTVAPI)); let videoList = []; let subtitles = []; let audios = []; @@ -224,13 +253,17 @@ class DefaultExtension extends MProvider { } + if ("tracks" in playlist) { + playlist.tracks.filter(track => track.kind === 'captions').forEach(track => { + var subUrl = track.file + subUrl = subUrl.startsWith("//") ? `https:${subUrl}` : subUrl; - playlist.tracks.filter(track => track.kind === 'captions').forEach(track => { - subtitles.push({ - label: track.label, - file: track.file + subtitles.push({ + label: track.label, + file: subUrl + }); }); - }); + } } @@ -256,6 +289,15 @@ class DefaultExtension extends MProvider { "summary": "Homepage loads faster by not calling details API", "value": false } + }, { + key: 'netmirror_pref_service', + listPreference: { + title: 'Preferred OTT service', + summary: '', + valueIndex: 0, + entries: ["Net mirror", "Prime mirror"], + entryValues: ["nf", "pv",] + } },]; } From 91061979105e6d593c10141c0501f5dc8d58f221 Mon Sep 17 00:00:00 2001 From: Swakshan Date: Sun, 19 Jan 2025 22:21:14 +0530 Subject: [PATCH 7/7] extension(NetMirror): Updated links --- javascript/anime/src/all/netflixmirror.js | 38 +++++++++-------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index 2a5727eb..277d8fb0 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -8,7 +8,7 @@ const mangayomiSources = [{ "typeSource": "single", "isManga": false, "itemType": 1, - "version": "0.1.0", + "version": "0.1.1", "dateFormat": "", "dateFormatLocale": "", "pkgPath": "anime/src/all/netflixmirror.js" @@ -60,17 +60,15 @@ class DefaultExtension extends MProvider { return `ott=${service}; ${cookie}`; } - async request(url, cookie, tvApi = false) { + async request(url, cookie) { cookie = cookie ?? await this.getCookie(); var service = this.getServiceDetails(); var slug = ""; if (url == "/home") slug = ""; else if (service == "pv") slug = "/pv"; - if (tvApi) slug = "/tv"; - var api = tvApi ? this.getTVApi() : this.source.baseUrl; - return (await new Client().get(api + slug + url, { "cookie": cookie })).body; + return (await new Client().get(this.source.baseUrl + slug + url, { "cookie": cookie })).body; } async getPopular(page) { return await this.getPages(await this.request("/home"), ".tray-container, #top10") @@ -121,11 +119,11 @@ class DefaultExtension extends MProvider { const description = data.desc; let episodes = []; if (data.episodes[0] === null) { - episodes.push({ name, url: JSON.stringify({ id: url, name }) }); + episodes.push({ name, url: url }); } else { episodes = data.episodes.map(ep => ({ name: `${ep.s.replace('S', 'Season ')} ${ep.ep.replace('E', 'Episode ')} : ${ep.t}`, - url: JSON.stringify({ id: ep.id, name }) + url: ep.id })); } if (data.nextPageShow === 1) { @@ -144,9 +142,12 @@ class DefaultExtension extends MProvider { episodes.push(...newEpisodes); } + var service = this.getServiceDetails(); + var link = `https://netflix.com/title/${url}` + if (service === "pv") link = `https://www.primevideo.com/detail/${url}` return { - name, imageUrl: this.getPoster(url, service), description, status: 1, genre, episodes + name, imageUrl: this.getPoster(url, service), link, description, status: 1, genre, episodes }; } async getEpisodes(name, eid, sid, page, cookie) { @@ -159,7 +160,7 @@ class DefaultExtension extends MProvider { data.episodes?.forEach(ep => { episodes.push({ name: `${ep.s.replace('S', 'Season ')} ${ep.ep.replace('E', 'Episode ')} : ${ep.t}`, - url: JSON.stringify({ id: ep.id, name }) + url: ep.id }); }); @@ -194,20 +195,11 @@ class DefaultExtension extends MProvider { } async getVideoList(url) { - const urlData = JSON.parse(url); - var service = this.getServiceDetails() + var baseUrl = this.getTVApi() + var service = this.getServiceDetails(); + if (service === "nf") baseUrl += "/tv"; - let baseUrl = this.source.baseUrl - let isTVAPI = false; - if (service === "nf") { - baseUrl = this.getTVApi() - isTVAPI = true; - - } - - - - const data = JSON.parse(await this.request(`/playlist.php?id=${urlData.id}&t=${urlData.name}`, null, isTVAPI)); + const data = JSON.parse(await this.request(`/playlist.php?id=${url}`)); let videoList = []; let subtitles = []; let audios = []; @@ -279,7 +271,7 @@ class DefaultExtension extends MProvider { title: 'Preferred video resolution', summary: '', valueIndex: 0, - entries: ["1080p", "720p", "480"], + entries: ["1080p", "720p", "480p"], entryValues: ["1080", "720", "480"] } }, {