diff --git a/javascript/anime/src/all/netflixmirror.js b/javascript/anime/src/all/netflixmirror.js index 71369c98..b4a2d5c7 100644 --- a/javascript/anime/src/all/netflixmirror.js +++ b/javascript/anime/src/all/netflixmirror.js @@ -7,7 +7,7 @@ const mangayomiSources = [{ "iconUrl": "https://raw.githubusercontent.com/kodjodevf/mangayomi-extensions/main/javascript/icon/all.netflixmirror.png", "typeSource": "single", "itemType": 1, - "version": "0.1.3", + "version": "0.1.5", "pkgPath": "anime/src/all/netflixmirror.js" }]; @@ -193,9 +193,11 @@ class DefaultExtension extends MProvider { } async getVideoList(url) { - var baseUrl = this.getTVApi() + var src = this.getPreference("netmirror_pref_stream_extraction"); + + var baseUrl = src === 'tv' ? this.getTVApi() : this.source.baseUrl var service = this.getServiceDetails(); - if (service === "nf") baseUrl += "/tv"; + if (service === "nf" && src === 'tv') baseUrl += "/tv"; const data = JSON.parse(await this.request(`/playlist.php?id=${url}`)); let videoList = []; @@ -214,45 +216,49 @@ class DefaultExtension extends MProvider { 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 => { + if (masterPlaylist.indexOf("#EXT-X-STREAM-INF:") > 1) { - 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': videoUrl.match(/^(?:https?:\/\/)?(?:www\.)?([^\/]+)/)[1], - 'Origin': baseUrl, - 'Referer': `${baseUrl}/` - }; - videoList.push({ url: videoUrl, quality, originalUrl: videoUrl, headers }); - - }); - } - - - if ("tracks" in playlist) { - playlist.tracks.filter(track => track.kind === 'captions').forEach(track => { - var subUrl = track.file - subUrl = subUrl.startsWith("//") ? `https:${subUrl}` : subUrl; - - subtitles.push({ - label: track.label, - file: subUrl + 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': videoUrl.match(/^(?:https?:\/\/)?(?:www\.)?([^\/]+)/)[1], + 'Origin': baseUrl, + 'Referer': `${baseUrl}/` + }; + videoList.push({ url: videoUrl, quality, originalUrl: videoUrl, headers }); + + }); + } + + + if ("tracks" in playlist) { + playlist.tracks.filter(track => track.kind === 'captions').forEach(track => { + var subUrl = track.file + subUrl = subUrl.startsWith("//") ? `https:${subUrl}` : subUrl; + + subtitles.push({ + label: track.label, + file: subUrl + }); + }); + } } } @@ -288,7 +294,17 @@ class DefaultExtension extends MProvider { entries: ["Net mirror", "Prime mirror"], entryValues: ["nf", "pv",] } - },]; + }, { + key: 'netmirror_pref_stream_extraction', + listPreference: { + title: 'Preferred stream extraction source', + summary: 'Extract stream from which source (if one source fails choose another)', + valueIndex: 0, + entries: ["TV", "Mobile"], + entryValues: ["tv", "mobile"] + } + }, + ]; } }