259 lines
6.7 KiB
JavaScript
259 lines
6.7 KiB
JavaScript
const cheerio = createCheerio()
|
|
|
|
const UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_2 like Mac OS X) AppleWebKit/604.1.14 (KHTML, like Gecko)'
|
|
const appConfig = {
|
|
ver: 1,
|
|
title: 'SupJav',
|
|
site: 'https://supjav.com/zh',
|
|
tabs: [
|
|
{
|
|
name: '热门',
|
|
ext: {
|
|
id: 'popular',
|
|
},
|
|
ui: 1,
|
|
},
|
|
{
|
|
name: '有码',
|
|
ext: {
|
|
id: 'category/censored-jav',
|
|
},
|
|
ui: 1,
|
|
},
|
|
{
|
|
name: '无码',
|
|
ext: {
|
|
id: 'category/uncensored-jav',
|
|
},
|
|
ui: 1,
|
|
},
|
|
{
|
|
name: '素人',
|
|
ext: {
|
|
id: 'category/amateur',
|
|
},
|
|
ui: 1,
|
|
},
|
|
{
|
|
name: '中文字幕',
|
|
ext: {
|
|
id: 'category/chinese-subtitles',
|
|
},
|
|
ui: 1,
|
|
},
|
|
{
|
|
name: '无码破解',
|
|
ext: {
|
|
id: 'category/reducing-mosaic',
|
|
},
|
|
ui: 1,
|
|
},
|
|
],
|
|
}
|
|
|
|
async function getConfig() {
|
|
return jsonify(appConfig)
|
|
}
|
|
|
|
async function getCards(ext) {
|
|
ext = argsify(ext)
|
|
let cards = []
|
|
let { page = 1, id } = ext
|
|
|
|
const url = appConfig.site + `/${id}/page/${page}`
|
|
|
|
const { data } = await $fetch.get(url, {
|
|
headers: {
|
|
'User-Agent': UA,
|
|
},
|
|
})
|
|
|
|
const $ = cheerio.load(data)
|
|
const t1 = $('title').text()
|
|
if (t1 === 'Just a moment...') {
|
|
$utils.openSafari(appConfig.site, UA)
|
|
}
|
|
|
|
const videos = $('.post')
|
|
videos.each((_, e) => {
|
|
const href = $(e).find('a').attr('href')
|
|
const title = $(e).find('a').attr('title')
|
|
const cover = $(e).find('a img').attr('src').replace('!320x216.jpg', '')
|
|
const remarks = $(e).find('.con .meta .date').text()
|
|
|
|
cards.push({
|
|
vod_id: href,
|
|
vod_name: title,
|
|
vod_pic: cover,
|
|
vod_remarks: '',
|
|
ext: {
|
|
url: href,
|
|
},
|
|
})
|
|
})
|
|
|
|
return jsonify({
|
|
list: cards,
|
|
})
|
|
}
|
|
|
|
async function getTracks(ext) {
|
|
ext = argsify(ext)
|
|
let tracks = []
|
|
let url = ext.url
|
|
|
|
const { data } = await $fetch.get(url, {
|
|
headers: {
|
|
'User-Agent': UA,
|
|
},
|
|
})
|
|
|
|
const $ = cheerio.load(data)
|
|
const btns = $('a.btn-server')
|
|
btns.each((_, e) => {
|
|
const name = $(e).text()
|
|
const data_link = $(e).attr('data-link')
|
|
tracks.push({
|
|
name,
|
|
pan: '',
|
|
ext: {
|
|
data: data_link,
|
|
name,
|
|
},
|
|
})
|
|
})
|
|
|
|
return jsonify({
|
|
list: [
|
|
{
|
|
title: '默认分组',
|
|
tracks,
|
|
},
|
|
],
|
|
})
|
|
}
|
|
|
|
async function getPlayinfo(ext) {
|
|
ext = argsify(ext)
|
|
const { data, name } = ext
|
|
|
|
const param = data.split('').reverse().join('')
|
|
const url = `https://lk1.supremejav.com/supjav.php?c=${param}`
|
|
const res = await $fetch.get(url, {
|
|
headers: {
|
|
'User-Agent': UA,
|
|
Referer: `https://lk1.supremejav.com/supjav.php?l=${data}&bg=undefined`,
|
|
},
|
|
})
|
|
let playUrl = ''
|
|
|
|
if (name === 'TV') {
|
|
const config = res.data
|
|
.match(/decodeURIComponent\(escape\(r\)\)\}(.*)\)/)[1]
|
|
.replace(/["\(\)]/g, '')
|
|
.split(',')
|
|
|
|
const decrypted = decrypt(...config)
|
|
playUrl = decrypted.match(/var urlPlay = '(.*?)';/)[1]
|
|
|
|
function decrypt(h, u, n, t, e, r) {
|
|
r = ''
|
|
for (var i = 0, len = h.length; i < len; i++) {
|
|
var s = ''
|
|
while (h[i] !== n[e]) {
|
|
s += h[i]
|
|
i++
|
|
}
|
|
for (var j = 0; j < n.length; j++) s = s.replace(new RegExp(n[j], 'g'), j)
|
|
r += String.fromCharCode(_0xe99c(s, e, 10) - t)
|
|
}
|
|
return decodeURIComponent(escape(r))
|
|
}
|
|
|
|
function _0xe99c(d, e, f) {
|
|
let str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/'
|
|
var g = str.split('')
|
|
var h = g.slice(0, e)
|
|
var i = g.slice(0, f)
|
|
var j = d
|
|
.split('')
|
|
.reverse()
|
|
.reduce(function (a, b, c) {
|
|
if (h.indexOf(b) !== -1) return (a += h.indexOf(b) * Math.pow(e, c))
|
|
}, 0)
|
|
var k = ''
|
|
while (j > 0) {
|
|
k = i[j % f] + k
|
|
j = (j - (j % f)) / f
|
|
}
|
|
return k || '0'
|
|
}
|
|
} else if (name === 'FST') {
|
|
const $ = cheerio.load(res.data)
|
|
$('script').each((_, e) => {
|
|
if ($(e).text().includes('eval')) {
|
|
const script = $(e).text().replace('eval', '')
|
|
const result = eval(script)
|
|
playUrl = result.match(/sources:\[\{file:"(.*?)"\}\]/)[1]
|
|
}
|
|
})
|
|
} else if (name === 'ST') {
|
|
const $ = cheerio.load(res.data)
|
|
let robot = $('#robotlink').text()
|
|
robot = robot.substring(0, robot.indexOf('&token=') + 7)
|
|
$('script').each((_, e) => {
|
|
let script = $(e).text()
|
|
if (script.includes("getElementById('robotlink')")) {
|
|
let token = script.split('&token=')[1].split("'")[0]
|
|
playUrl = 'https:/' + robot + token + '&stream=1'
|
|
}
|
|
})
|
|
} else if (name === 'VOE') {
|
|
const location = res.data.match(/window\.location\.href = '(.*?)';/)[1]
|
|
const locres = await $fetch.get(location, {
|
|
headers: {
|
|
'User-Agent': UA,
|
|
},
|
|
})
|
|
playUrl = locres.data.match(/prompt\("Node", "(.*?)"\);/)[1]
|
|
}
|
|
|
|
return jsonify({ urls: [playUrl] })
|
|
}
|
|
|
|
async function search(ext) {
|
|
ext = argsify(ext)
|
|
let cards = []
|
|
|
|
let text = encodeURIComponent(ext.text)
|
|
let page = ext.page || 1
|
|
let url = `${appConfig.site}/page/${page}?s=${text}`
|
|
|
|
const { data } = await $fetch.get(url, {
|
|
headers: {
|
|
'User-Agent': UA,
|
|
},
|
|
})
|
|
const $ = cheerio.load(data)
|
|
|
|
$('.post').each((_, e) => {
|
|
const href = $(e).find('a').attr('href')
|
|
const title = $(e).find('a').attr('title')
|
|
const cover = $(e).find('a img').attr('data-original')
|
|
const remarks = $(e).find('.con .meta .date').text()
|
|
cards.push({
|
|
vod_id: href,
|
|
vod_name: title,
|
|
vod_pic: cover,
|
|
vod_remarks: remarks,
|
|
ext: {
|
|
url: href,
|
|
},
|
|
})
|
|
})
|
|
|
|
return jsonify({
|
|
list: cards,
|
|
})
|
|
}
|