Files
tvbox_collect/jaychouqq/yingshi/js1/Jin_netflav.js
T
2026-06-29 03:41:14 +00:00

266 lines
11 KiB
JavaScript

//@name:[禁] netflav
//@version:2
//@webSite:https://www.netflav.com
//@remark:
//@type:100
//@instance:netflav20240905
//@isAV:1
//@order: E
class netflavClass extends WebApiBase {
constructor() {
super()
this.webSite = 'https://www.netflav.com'
this.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
}
async getClassList(args) {
const webUrl = args.url
this.webSite = UZUtils.removeTrailingSlash(webUrl)
let backData = new RepVideoClassList()
try {
backData.error = null
backData.data = [
{ type_id: '/censored', type_name: '有碼影片' },
{ type_id: '/uncensored', type_name: '無碼影片' },
]
} catch (e) {
backData.error = e.message
}
return JSON.stringify(backData)
}
async getVideoList(args) {
let backData = new RepVideoList()
try {
const type = args.url === '/censored' ? 'censored' : 'uncensored'
const url = this.webSite + args.url + `?page=${args.page}`
const pro = await req(url, { headers: { 'User-Agent': this.UA } })
backData.error = pro.error
const $ = cheerio.load(pro.data)
const script = $('#__NEXT_DATA__').text()
const json = JSON.parse(script)
const allvideos = json.props.initialState[type].docs
let videos = []
allvideos.forEach((e) => {
let videoDet = new VideoDetail()
videoDet.vod_id = e.videoId
videoDet.vod_pic = e.preview
videoDet.vod_name = e.title
videoDet.vod_remarks = e.sourceDate.split('T')[0]
videos.push(videoDet)
})
backData.data = videos
} catch (error) {
backData.error = error.message
}
return JSON.stringify(backData)
}
async getVideoDetail(args) {
let backData = new RepVideoDetail()
const webUrl = this.webSite + `/video?id=${args.url}`
try {
const pro = await req(webUrl, { headers: { 'User-Agent': this.UA } })
backData.error = pro.error
const proData = pro.data
if (proData) {
const $ = cheerio.load(proData)
const script = $('#__NEXT_DATA__').text()
const json = JSON.parse(script)
const data = json.props.initialState.video.data
let vod_content = data.description
let vod_pic = data.preview
let vod_name = data.title
let vod_year = data.videoDate.split('T')[0]
let vod_director = data.director || ''
let vod_actor = data.actors.join(',')
let vod_area = ''
let vod_lang = ''
let vod_douban_score = ''
let type_name = ''
let playlist = data.srcs
let vod_play_url = ''
playlist.forEach((e) => {
vod_play_url += `播放$${encodeURIComponent(e)}$$$`
})
let detModel = new VideoDetail()
detModel.vod_year = vod_year
detModel.type_name = type_name
detModel.vod_director = vod_director
detModel.vod_actor = vod_actor
detModel.vod_area = vod_area
detModel.vod_lang = vod_lang
detModel.vod_douban_score = vod_douban_score
detModel.vod_content = vod_content
detModel.vod_pic = vod_pic
detModel.vod_name = vod_name
detModel.vod_play_url = vod_play_url
detModel.vod_id = args.url
backData.data = detModel
}
} catch (e) {
backData.error = '获取视频详情失败' + e.message
}
return JSON.stringify(backData)
}
async getVideoPlayUrl(args) {
let backData = new RepVideoPlayUrl()
let url = decodeURIComponent(args.url)
try {
if (url.includes('embedrise')) {
const pro = await req(url, { headers: { 'User-Agent': this.UA } })
const $ = cheerio.load(pro.data)
const playUrl = $('#player source').attr('src')
backData.data = playUrl
backData.headers = { 'User-Agent': this.UA }
} else if (url.includes('mmvh01') || url.includes('mmsi01') || url.includes('netflavns')) {
const pro = await req(url, {
headers: {
'User-Agent': this.UA,
Referer: `${this.webSite}/`,
'Sec-Ch-Ua': '"Not-A.Brand";v="99", "Chromium";v="124"',
'Sec-Fetch-Dest': 'iframe',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'cross-site',
},
})
const $ = cheerio.load(pro.data)
$('body > script').each((_, e) => {
if ($(e).text().includes('eval')) {
let decodeStr = eval($(e).text().replace('eval', ''))
// UZUtils.debugLog(decodeStr)
let m3u8 = decodeStr.split('sources:[{file:"')[1].split('"}]')[0]
backData.data = m3u8
backData.headers = { 'User-Agent': this.UA }
}
})
} else if (url.includes('7mmtv.upns.live')) {
let api = 'https://7mmtv.upns.live/api/v1/video?id=' + url.split('#')[1]
let pro = await req(api, { headers: { 'User-Agent': this.UA } })
let data = pro.data.trim()
function decrypt(data) {
let str = Crypto.enc.Base64.stringify(Crypto.enc.Hex.parse(data))
let key = Crypto.enc.Utf8.parse('kiemtienmua911ca')
let iv = Crypto.enc.Utf8.parse('1234567890oiuytr')
return Crypto.AES.decrypt(str, key, {
iv: iv,
mode: Crypto.mode.CBC,
padding: Crypto.pad.Pkcs7,
}).toString(Crypto.enc.Utf8)
}
let decrypted = decrypt(data)
let json = JSON.parse(decrypted)
backData.data = json.cf
backData.headers = { 'User-Agent': this.UA, Referer: 'https://7mmtv.upns.live/' }
} else if (url.includes('d0000d') || url.includes('dooood')) {
url = url.replace('dooood', 'd0000d')
const pro = await req(url, {
headers: {
Host: UZUtils.getHostFromURL(url).split('/')[2],
'Accept-Language': 'zh-TW,zh-CN;q=0.9,zh;q=0.8,en-US;q=0.7,en-XA;q=0.6,en;q=0.5',
'Cache-Control': 'no-cache',
Cookie: 'lang=1',
'Sec-Ch-Ua': '"Not-A.Brand";v="99", "Chromium";v="124"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': 'Windows',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': 1,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
},
})
const html = pro.data
let pass = html.substring(html.indexOf('/pass_md5'), html.length)
pass = pass.substring(0, pass.indexOf("'"))
pass = UZUtils.getHostFromURL(url) + pass
let token = html.substring(html.indexOf('token=') + 6, html.length)
token = token.substring(0, token.indexOf('&'))
const res = await req(pass, {
headers: {
Accept: '*/*',
'User-Agent': this.UA,
Referer: url,
'X-Requested-With': 'XMLHttpRequest',
},
})
function makePlay(token) {
const t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
const n = t.length
let a = ''
for (let o = 0; 10 > o; o++) {
const index = Math.floor(Math.random() * n)
a += t.charAt(index)
}
return a + '?token=' + token + '&expiry=' + Date.now()
}
let realUrl = res.data + makePlay(token)
backData.data = realUrl
backData.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
Referer: 'https://d0000d.com/',
'Sec-Ch-Ua': '"Not-A.Brand";v="99", "Chromium";v="124"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': 'Windows',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
}
} else if (url.includes('njavplayer.me')) {
let id = url.split('vv/')[1].split('?')[0]
let reqUrl = `https://www.njavplayer.me/v/${id}.json`
let pro = await req(reqUrl, { headers: { 'user-agent': this.UA }, responseType: 'plain' })
let execute = new Function(pro.data + ' return jsonData')
let jsonData = execute()
backData.data = jsonData.file
} else {
backData.error = '@ykusu叫他寫'
}
} catch (e) {
backData.error = e.message
}
return JSON.stringify(backData)
}
async searchVideo(args) {
let backData = new RepVideoList()
try {
const url = `${this.webSite}/search?keyword=${args.searchWord}&page=${args.page}&type=title`
const pro = await req(url, { headers: { 'User-Agent': this.UA } })
backData.error = pro.error
let proData = pro.data
if (proData) {
const $ = cheerio.load(proData)
const script = $('#__NEXT_DATA__').text()
const json = JSON.parse(script)
const allvideos = json.props.initialState.search.docs
let videos = []
allvideos.forEach((e) => {
let videoDet = new VideoDetail()
videoDet.vod_id = e.videoId
videoDet.vod_pic = e.preview
videoDet.vod_name = e.title
videoDet.vod_remarks = e.sourceDate.split('T')[0]
videos.push(videoDet)
})
backData.data = videos
}
} catch (e) {
backData.error = e.message
}
return JSON.stringify(backData)
}
}
let netflav20240905 = new netflavClass()