├── server ├── api │ ├── subject_collection.js │ ├── utils │ │ ├── common.js │ │ ├── douban_common.js │ │ ├── douban_url_config.js │ │ └── douban_query_config.js │ ├── detail.js │ ├── play.js │ ├── movie_list.js │ └── search.js ├── tsconfig.json ├── source │ ├── app.js │ ├── lib │ │ ├── app.js │ │ ├── ali_readable.js │ │ ├── ali.js │ │ ├── ali_readable.unfinished.js │ │ ├── similarity.js │ │ └── utils.js │ ├── build.js │ ├── dovx_open.js │ ├── xiaozhitiao_open.js │ ├── kuwo.js │ ├── caiji_open.js │ ├── pansou_open.js │ ├── sharenice_open.js │ ├── bookan_book_open.js │ ├── pansearch_open.js │ ├── tuxiaobei_open.js │ ├── ubestkid_open.js │ ├── wogg_open.js │ ├── douyu_bytecode.js │ ├── kuqimv_open.js │ ├── dj0898_book_open.js │ ├── kkys_open.js │ ├── huya_bytecode.js │ ├── boosj_open.js │ ├── shuyinfm_bytecode.js │ ├── jojo_bytecode.js │ ├── hula8_bytecode.js │ ├── duanju.js │ ├── ting13_bytecode.js │ ├── cntv_open.js │ ├── bililive_bytecode.js │ ├── lbgs_book_open.js │ ├── 230ts_book_open.js │ └── yqktv_open2.js └── utils │ └── index.js ├── .eslintignore ├── components ├── LayoutFooter.vue ├── SearchComp.vue ├── Subtitle.vue ├── LayoutHeader.vue ├── ItemList.vue └── SearchContent.vue ├── assets ├── styles │ └── var.less └── logo.png ├── public └── favicon.ico ├── prettier.config.cjs ├── tsconfig.json ├── composables ├── token.js ├── fetch.js └── storage.js ├── .gitignore ├── utils └── index.js ├── pages ├── History.vue ├── Search.vue ├── Detail.vue ├── Setting.vue ├── Play.vue └── index.vue ├── .eslintrc.cjs ├── middleware └── index.global.js ├── nuxt.config.js ├── README.md ├── app.vue └── package.json /server/api/subject_collection.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | out 4 | .gitignore 5 | package.json -------------------------------------------------------------------------------- /components/LayoutFooter.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../.nuxt/tsconfig.server.json" 3 | } 4 | -------------------------------------------------------------------------------- /assets/styles/var.less: -------------------------------------------------------------------------------- 1 | @layout-header-height: 60px; 2 | @layout-footer-height: 60px; 3 | -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujuntao123/one-site-movie/HEAD/assets/logo.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liujuntao123/one-site-movie/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /prettier.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | singleQuote: true, 3 | printWidth: 4000, 4 | endOfLine: 'auto', 5 | }; 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://nuxt.com/docs/guide/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json" 4 | } 5 | -------------------------------------------------------------------------------- /server/api/utils/common.js: -------------------------------------------------------------------------------- 1 | export function objectToQueryString(obj) { 2 | return Object.keys(obj) 3 | .map((key) => `${key}=${obj[key]}`) 4 | .join('&'); 5 | } 6 | -------------------------------------------------------------------------------- /composables/token.js: -------------------------------------------------------------------------------- 1 | 2 | export const setToken=async ()=>{ 3 | const aliToken=getLocalstorage('ali_token') 4 | await useFetch('/api/get_token',{query:{aliToken}}) 5 | } -------------------------------------------------------------------------------- /server/source/app.js: -------------------------------------------------------------------------------- 1 | function __jsEvalReturn() { 2 | return { 3 | isVideoFormat: function (url) { 4 | return !0; 5 | }, 6 | }; 7 | } 8 | export { __jsEvalReturn }; 9 | -------------------------------------------------------------------------------- /server/source/lib/app.js: -------------------------------------------------------------------------------- 1 | function __jsEvalReturn() { 2 | return { 3 | isVideoFormat: function (url) { 4 | return !0; 5 | }, 6 | }; 7 | } 8 | export { __jsEvalReturn }; 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Nuxt dev/build outputs 2 | .output 3 | .data 4 | .nuxt 5 | .nitro 6 | .cache 7 | dist 8 | 9 | # Node dependencies 10 | node_modules 11 | 12 | # Logs 13 | logs 14 | *.log 15 | 16 | # Misc 17 | .DS_Store 18 | .fleet 19 | .idea 20 | 21 | # Local env files 22 | .env 23 | .env.* 24 | !.env.example 25 | 26 | .vscode 27 | 28 | .vercel 29 | -------------------------------------------------------------------------------- /utils/index.js: -------------------------------------------------------------------------------- 1 | export const getLastPath = (url) => { 2 | const paths = url.split('/'); 3 | return paths[paths.length - 1]; 4 | }; 5 | 6 | export const req = (...args) => { 7 | return $fetch(...args) 8 | .then((res) => { 9 | return { ...res, content: JSON.stringify(res) }; 10 | }) 11 | .catch((error) => { 12 | return error; 13 | }); 14 | }; 15 | -------------------------------------------------------------------------------- /server/api/utils/douban_common.js: -------------------------------------------------------------------------------- 1 | export const common_header = { 2 | 'User-Agent': 'Rexxar-Core/0.1.3 api-client/1 com.douban.frodo/7.9.0(216) Android/28 product/Xiaomi11 rom/android network/wifi udid/pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n platform/mobile com.douban.frodo/7.9.0(216) Rexxar/1.2.151 platform/mobile 1.2.151', 3 | }; 4 | 5 | export const base_url = 'https://frodo.douban.com/api/v2'; 6 | -------------------------------------------------------------------------------- /pages/History.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 15 | -------------------------------------------------------------------------------- /components/SearchComp.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /composables/fetch.js: -------------------------------------------------------------------------------- 1 | const getAliToken = () => getLocalstorage('ali_token'); 2 | const getEngine = () => getLocalstorage('engine'); 3 | 4 | export const useFetchWithToken = (...args) => { 5 | return useFetch(args[0], { ...args[1], headers: { 'Ali-Token': getAliToken() } }); 6 | }; 7 | 8 | export const useFetchWithEngine = (...args) => { 9 | return useFetch(args[0], { ...args[1], headers: { 'Search-Engine': getEngine() } }); 10 | }; 11 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: ['plugin:vue/vue3-essential', 'eslint:recommended', '@vue/prettier'], 7 | 8 | parserOptions: { 9 | ecmaVersion: 2020, 10 | type: 'module', 11 | }, 12 | rules: { 13 | 'no-undef': 'off', 14 | 'vue/no-unused-vars': 'warn', 15 | 'no-unused-vars': 'warn', 16 | 'vue/multi-word-component-names': 'off', 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /middleware/index.global.js: -------------------------------------------------------------------------------- 1 | export default defineNuxtRouteMiddleware((to, from) => { 2 | // console.log(to.path) 3 | if (process.server) return; 4 | // 检查是否是播放页面,如果是,则检查localstorage中是否有token,如果没有,则弹窗提示,并阻止跳转 5 | if (to.path === '/play') { 6 | const token = getLocalstorage('ali_token'); 7 | 8 | if (!token) { 9 | Modal.info({ 10 | title: '提示', 11 | content: '请先前往设置页面设置token,否则无法使用在线播放功能', 12 | onOk() {}, 13 | }); 14 | return abortNavigation(); 15 | } 16 | } 17 | }); 18 | -------------------------------------------------------------------------------- /server/api/detail.js: -------------------------------------------------------------------------------- 1 | import { __jsEvalReturn } from '../source/pansearch_open'; 2 | 3 | export default defineEventHandler(async (event) => { 4 | const query = getQuery(event); 5 | const headers = getHeaders(event); 6 | 7 | var spider = __jsEvalReturn(); 8 | 9 | function jsonParse(obj) { 10 | if (typeof obj === 'string') { 11 | return JSON.parse(obj); 12 | } 13 | return obj; 14 | } 15 | 16 | await spider.init({ skey: 'siteKey', ext: headers['ali-token'] }); 17 | 18 | const result = jsonParse(await spider.detail(query.id)); 19 | 20 | return { status: result ? 'success' : 'failed', data: result }; 21 | }); 22 | -------------------------------------------------------------------------------- /nuxt.config.js: -------------------------------------------------------------------------------- 1 | // https://nuxt.com/docs/api/configuration/nuxt-config 2 | export default defineNuxtConfig({ 3 | ssr: false, 4 | devtools: { enabled: true }, 5 | modules: ['@ant-design-vue/nuxt'], 6 | app: { 7 | head: { 8 | charset: 'utf-8', 9 | viewport: 'width=device-width, initial-scale=1', 10 | meta: [ 11 | { name: 'referrer', content: 'no-referrer' }, 12 | { 'http-equiv': 'Content-Security-Policy', content: "worker-src blob:; child-src blob: gap:;img-src * blob: data:;media-src * blob:;default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content:" }, 13 | ], 14 | }, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /server/api/play.js: -------------------------------------------------------------------------------- 1 | import { __jsEvalReturn } from '../source/pansearch_open'; 2 | 3 | export default defineEventHandler(async (event) => { 4 | const query = getQuery(event); 5 | const headers = getHeaders(event); 6 | 7 | var spider = __jsEvalReturn(); 8 | 9 | function jsonParse(obj) { 10 | if (typeof obj === 'string') { 11 | return JSON.parse(obj); 12 | } 13 | return obj; 14 | } 15 | 16 | await spider.init({ skey: 'siteKey', ext: headers['ali-token'] }); 17 | 18 | var result = jsonParse(await spider.play(query.flag, query.url, query.share_id)); 19 | return { status: result ? 'success' : 'failed', data: result }; 20 | }); 21 | -------------------------------------------------------------------------------- /server/api/utils/douban_url_config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | hot_gaia: '/movie/hot_gaia', 3 | tv_hot: '/subject_collection/tv_hot/items', 4 | tv_domestic: '/subject_collection/tv_domestic/items', 5 | tv_american: '/subject_collection/tv_american/items', 6 | tv_japanese: '/subject_collection/tv_japanese/items', 7 | tv_korean: '/subject_collection/tv_korean/items', 8 | tv_animation: '/subject_collection/tv_animation/items', 9 | show_hot: '/subject_collection/show_hot/items', 10 | tag_movie: '/movie/tag', 11 | movie_top250: '/subject_collection/movie_top250/items', 12 | movie_rank: '/movie/category_ranks', 13 | tv_rank: '/tv/category_ranks', 14 | play_list: '/skynet/new_playlists', 15 | }; 16 | -------------------------------------------------------------------------------- /components/Subtitle.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 21 | 22 | 32 | -------------------------------------------------------------------------------- /composables/storage.js: -------------------------------------------------------------------------------- 1 | export const setLocalStrorage = (key, value) => { 2 | if (!process.client) return; 3 | if (key && value !== '') { 4 | if (typeof value === 'object') { 5 | value = JSON.stringify(value); 6 | } 7 | window.localStorage.setItem(key, value); 8 | console.log(`${key} local storage 设置成功`); 9 | } 10 | }; 11 | 12 | export const getLocalstorage = (key) => { 13 | if (!process.client) return; 14 | let value = window.localStorage.getItem(key); 15 | value = value === null ? '' : value; 16 | return value; 17 | }; 18 | 19 | export const removeLocalstorage = (key) => { 20 | if (!process.client) return; 21 | if (this.getLocalstorage(key)) { 22 | window.localStorage.removeItem(key); 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 声明:本项目仅用于学习交流,不用于商业用途。如果存在侵权问题,请联系作者删除。 2 | 3 | # 一站影视 4 | 5 | 界面清爽,完全免费的在线观影网站。 6 | 7 | 体验地址:https://one-site-movie.fun 8 | 9 | 网站截图 10 | 11 | ![image](https://github.com/liujuntao123/one-site-movie/assets/22583601/22b742e0-7b19-4a94-92a7-6a3b1f4ff0fd) 12 | 13 | 14 | ## 如何使用 15 | 1. 拥有一个阿里云盘账号 16 | 2. 前往设置页面设置token 17 | 3. 开始使用 18 | 19 | ## 功能 20 | 21 | - 影视搜索:搜索电影、电视剧、综艺、动漫、纪录片等。 22 | - 影视分类:按类型、地区、年代、评分等分类。 23 | - 影视播放:支持在线播放。 24 | - 播放历史 25 | 26 | ## TODO 27 | 28 | - 自动跳过片头片尾 29 | - 收藏 30 | - 分享链接解析 31 | - 阿里云盘扫码获得token 32 | - 移动端适配 33 | 34 | ## 如何自己部署一个此网站?(以下都是免费的) 35 | 36 | 1. fork 本项目 37 | 2. 在vercel选择fork的仓库进行一键部署 38 | 3. 在vercel创建一个database类型的项目,选择vercel kv类型的数据 39 | 4. 根据指引进行database和project的关联 40 | 5. 完成 41 | -------------------------------------------------------------------------------- /server/api/movie_list.js: -------------------------------------------------------------------------------- 1 | import { objectToQueryString } from './utils/common'; 2 | import { base_url, common_header } from './utils/douban_common'; 3 | import urlConfig from './utils/douban_url_config'; 4 | import common_query from './utils/douban_query_config'; 5 | 6 | export default defineEventHandler(async (event) => { 7 | const query = getQuery(event); 8 | const path = urlConfig[query.key]; 9 | const url = `${base_url}${path}`; 10 | let commonQueryKey = query.key; 11 | 12 | const queryObj = common_query[commonQueryKey]; 13 | const queryString = objectToQueryString({ ...queryObj, q: query.q, start: query.start, count: query.count }); 14 | const res = await $fetch(`${url}?${queryString}`, { 15 | method: 'GET', 16 | headers: { ...common_header }, 17 | }); 18 | return { 19 | status: 'success', 20 | data: res, 21 | }; 22 | }); 23 | -------------------------------------------------------------------------------- /app.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | 17 | 37 | 38 | 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nuxt-app", 3 | "private": true, 4 | "type": "module", 5 | "scripts": { 6 | "build": "nuxt build", 7 | "dev": "nuxt dev --dotenv .env.development.local", 8 | "generate": "nuxt generate", 9 | "preview": "nuxt preview", 10 | "postinstall": "nuxt prepare" 11 | }, 12 | "devDependencies": { 13 | "@ant-design-vue/nuxt": "^1.4.1", 14 | "@nuxtjs/eslint-config-typescript": "^12.1.0", 15 | "@nuxtjs/eslint-module": "^4.1.0", 16 | "@vue/eslint-config-prettier": "^9.0.0", 17 | "ant-design-vue": "^4.1.0", 18 | "eslint": "^8.56.0", 19 | "eslint-config-prettier": "^9.1.0", 20 | "eslint-plugin-prettier": "^5.1.3", 21 | "eslint-plugin-vue": "^9.20.1", 22 | "less": "^4.2.0", 23 | "nuxt": "^3.9.1", 24 | "prettier": "^3.2.4", 25 | "vercel": "^33.2.0", 26 | "vue": "^3.4.10", 27 | "vue-router": "^4.2.5" 28 | }, 29 | "dependencies": { 30 | "@vercel/kv": "^1.0.1", 31 | "dplayer": "^1.27.1", 32 | "hls.js": "^1.5.1", 33 | "xgplayer": "^3.0.11", 34 | "xgplayer-hls": "^3.0.11" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /server/api/search.js: -------------------------------------------------------------------------------- 1 | import { __jsEvalReturn as pansearch } from '../source/pansearch_open'; 2 | import { __jsEvalReturn as wogg } from '../source/wogg_open'; 3 | import { __jsEvalReturn as dovx } from '../source/dovx_open'; 4 | import { __jsEvalReturn as pansou } from '../source/pansou_open'; 5 | import { __jsEvalReturn as xiaozhitiao } from '../source/xiaozhitiao_open'; 6 | 7 | const engines = { 8 | pansearch, 9 | wogg, 10 | dovx, 11 | pansou, 12 | xiaozhitiao, 13 | }; 14 | 15 | export default defineEventHandler(async (event) => { 16 | const query = getQuery(event); 17 | const headers = getHeaders(event); 18 | const engineHeader = headers['search-engine']; 19 | console.log('🚀 ~ defineEventHandler ~ engineHeader:', engineHeader); 20 | 21 | const engine = engines[engineHeader]; 22 | 23 | var spider = engine(); 24 | 25 | function jsonParse(obj) { 26 | if (typeof obj === 'string') { 27 | return JSON.parse(obj); 28 | } 29 | return obj; 30 | } 31 | 32 | var result = jsonParse(await spider.search(query.keywords)); 33 | 34 | return { status: 'success', data: result }; 35 | }); 36 | -------------------------------------------------------------------------------- /components/LayoutHeader.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 29 | 30 | 45 | -------------------------------------------------------------------------------- /server/utils/index.js: -------------------------------------------------------------------------------- 1 | import { kv } from '@vercel/kv'; 2 | 3 | export const getLastPath = (url) => { 4 | const paths = url.split('/'); 5 | return paths[paths.length - 1]; 6 | }; 7 | 8 | export const req = (...args) => { 9 | return ( 10 | $fetch(...args) 11 | // .then((res) => { 12 | // if (res.text) { 13 | // return res.text(); 14 | // } 15 | // }) 16 | .then((res) => { 17 | if (!res.content) { 18 | return { content: res }; 19 | } 20 | return res; 21 | }) 22 | .catch((error) => { 23 | return error; 24 | }) 25 | ); 26 | }; 27 | 28 | export const jsonParse = (jsonString) => { 29 | if (!jsonString) return null; 30 | if (typeof jsonString === 'object') return jsonString; 31 | try { 32 | return JSON.parse(jsonString); 33 | } catch (e) { 34 | return null; 35 | } 36 | }; 37 | 38 | export const store = { 39 | set: async (path1, path2, val) => { 40 | const res = await kv.set(`${path1}/${path2}`, val); 41 | // console.log('🚀 ~ set: ~ res:', '存储成功', res); 42 | return res; 43 | }, 44 | get: async (path1, path2) => { 45 | const res = await kv.get(`${path1}/${path2}`); 46 | // console.log('🚀 ~ get: ~ res:', '获取成功', res); 47 | return res; 48 | }, 49 | }; 50 | -------------------------------------------------------------------------------- /server/source/lib/ali_readable.js: -------------------------------------------------------------------------------- 1 | import { _ } from './cat.js'; 2 | import { log } from './utils.js'; 3 | import { initSome, setToken, setShareId, getVod, playerContent, playerContentByFlag } from './ali_api_readable.js'; 4 | 5 | async function initAli(c) { 6 | let e = c['ext']; 7 | 8 | await log('ali init:' + typeof c); 9 | await initSome(); 10 | await setToken(e); 11 | await log('ali init ext:' + e); 12 | } 13 | 14 | async function detailContent(c) { 15 | const e = /www.aliyundrive.com\/s\/([^\/]+)(\/folder\/([^\/]+))?/; 16 | let f = c['trim'](); 17 | let g = f['match'](e); 18 | 19 | if (_['isEmpty'](g)) return ''; 20 | 21 | let fileId = g[1]; 22 | let folderId = g.length == 3 ? g[3] : ''; 23 | 24 | await setShareId(fileId); 25 | 26 | let vodInfo = await getVod(f, folderId); 27 | let stringifyInfo = JSON.stringify({ list: [vodInfo] }); 28 | 29 | return stringifyInfo; 30 | } 31 | 32 | async function playContent(c, d, sharedUrl) { 33 | const e = /www.aliyundrive.com\/s\/([^\/]+)(\/folder\/([^\/]+))?/; 34 | let trimedStr = sharedUrl['trim'](); 35 | const matchedArray = trimedStr['match'](e); 36 | 37 | if (_['isEmpty'](matchedArray)) return ''; 38 | 39 | let shareId = matchedArray[1]; 40 | 41 | await setShareId(shareId); 42 | let clarity = d['split']('+'); 43 | let content = c == '原画' ? await playerContent(clarity) : await playerContentByFlag(clarity, c); 44 | 45 | return content; 46 | } 47 | 48 | export { initAli, detailContent, playContent }; 49 | -------------------------------------------------------------------------------- /components/ItemList.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 35 | 36 | 70 | -------------------------------------------------------------------------------- /components/SearchContent.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 35 | 36 | 70 | -------------------------------------------------------------------------------- /server/source/lib/ali.js: -------------------------------------------------------------------------------- 1 | (function(c,d){const n=b,e=c();while(!![]){try{const f=-parseInt(n(0x148))/0x1+-parseInt(n(0x140))/0x2*(parseInt(n(0x145))/0x3)+parseInt(n(0x150))/0x4*(parseInt(n(0x14c))/0x5)+-parseInt(n(0x147))/0x6+-parseInt(n(0x13d))/0x7+parseInt(n(0x13c))/0x8+parseInt(n(0x13b))/0x9*(parseInt(n(0x142))/0xa);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xaf4a3));import{_}from'./cat.js';import{log}from'./utils.js';import{initSome,setToken,setShareId,getVod,playerContent,playerContentByFlag}from'./ali_api.js';function a(){const r=['126jHersJ','8018976SyNpYU','7198947GYbEkJ','wGsFx','isEmpty','50HOYYaa','PIvCN','1745270xSfZmS','match','split','68196ySTEaL','trim','3359892YLzwvG','845051dhMcfo','ali\x20init:','MlDBF','xvRmD','4405TqvVPk','stringify','HyWVX','ali\x20init\x20ext:','1244NAvJeB','ewEMb'];a=function(){return r;};return a();}function b(c,d){const e=a();return b=function(f,g){f=f-0x13a;let h=e[f];return h;},b(c,d);}async function initAli(c){const o=b,d={'HyWVX':function(f,g){return f(g);},'PIvCN':o(0x149),'ewEMb':function(f,g){return f+g;},'xvRmD':o(0x14f)};let e=c['ext'];await d[o(0x14e)](log,d[o(0x141)]+typeof c),await initSome(),await d[o(0x14e)](setToken,e),await d[o(0x14e)](log,d[o(0x13a)](d[o(0x14b)],e));}async function detailContent(c){const p=b,d={'MlDBF':function(l,m){return l(m);}},e=/www.aliyundrive.com\/s\/([^\/]+)(\/folder\/([^\/]+))?/;let f=c[p(0x146)](),g=f[p(0x143)](e);if(_[p(0x13f)](g))return'';let h=g[0x1],i=g['length']==0x3?g[0x3]:'';await d[p(0x14a)](setShareId,h);let j=await getVod(f,i),k=JSON[p(0x14d)]({'list':[j]});return k;}async function playContent(c,d,e){const q=b,f={'wGsFx':function(i,j){return i==j;},'rAcPj':function(i,j,k){return i(j,k);}};let g=d[q(0x144)]('+'),h=f[q(0x13e)](c,'原画')?await playerContent(g):await f['rAcPj'](playerContentByFlag,g,c);return h;}export{initAli,detailContent,playContent}; -------------------------------------------------------------------------------- /server/source/lib/ali_readable.unfinished.js: -------------------------------------------------------------------------------- 1 | import { _ } from './cat.js' 2 | import { log } from './utils.js' 3 | import { 4 | initSome, 5 | setToken, 6 | setShareId, 7 | getVod, 8 | playerContent, 9 | playerContentByFlag, 10 | getOAuthToken, 11 | getUserToken, 12 | } from './ali_api_readable.js' 13 | 14 | const ALIYUN_DRIVE_REGEX = /www.aliyundrive.com\/s\/([^\/]+)(\/folder\/([^\/]+))?/ 15 | 16 | async function initAli({token}) { 17 | await initSome(token) 18 | } 19 | 20 | async function detailContent(shareUrl) { 21 | const trimmedUrl = shareUrl.trim() 22 | const matchResult = trimmedUrl.match(ALIYUN_DRIVE_REGEX) 23 | if (_.isEmpty(matchResult)) return '' 24 | 25 | const shareId = matchResult[1] 26 | const folderId = matchResult.length == 3 ? matchResult[3] : '' 27 | 28 | await setShareId(shareId) 29 | console.log('🚀 ~ detailContent ~ setShareId: success') 30 | 31 | const vodResult = await getVod(trimmedUrl, folderId) 32 | const resultJson = JSON.stringify({ list: [vodResult] }) 33 | 34 | return resultJson 35 | } 36 | 37 | async function playContent(quality, mediaId, sharedUrl) { 38 | const trimmedUrl = sharedUrl.trim() 39 | const matchResult = trimmedUrl.match(ALIYUN_DRIVE_REGEX) 40 | if (_.isEmpty(matchResult)) return '' 41 | 42 | const shareId = matchResult[1] 43 | await setShareId(shareId) 44 | 45 | const mediaIds = mediaId.split('+') 46 | const contentResult = 47 | quality == '原画' ? await playerContent(mediaIds) : await playerContentByFlag(mediaIds, quality) 48 | 49 | return contentResult 50 | } 51 | 52 | async function getToken(ali_token,shareId){ 53 | console.log("🚀 ~ getToken ~ ali_token:", ali_token) 54 | // await setToken(ali_token) 55 | const oauthToken=await getOAuthToken(ali_token,shareId) 56 | const userToken=await getUserToken(ali_token,shareId) 57 | return { 58 | oauthToken, 59 | userToken 60 | } 61 | } 62 | 63 | export { initAli, detailContent, playContent,getToken } 64 | -------------------------------------------------------------------------------- /server/source/build.js: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import path from 'path'; 3 | import uglifyjs from 'uglify-js'; 4 | 5 | const copySpider = ['app', 'kunyu77_open', 'alist_open']; 6 | 7 | const root = process.cwd(); 8 | 9 | const src = path.join(root); 10 | const out = path.join(root, 'dist'); 11 | 12 | function minify(s, d) { 13 | var jsContent = fs.readFileSync(s).toString(); 14 | jsContent = jsContent.replace('./lib/cat.js', 'assets://js/lib/cat.js'); 15 | jsContent = jsContent.replace('./cat.js', 'assets://js/lib/cat.js'); 16 | jsContent = uglifyjs.minify(jsContent, { 17 | mangle: false, 18 | }); 19 | fs.writeFileSync(d, jsContent.code); 20 | } 21 | 22 | function listAllFiles(dirPath, arrayOfFiles) { 23 | var files = fs.readdirSync(dirPath); 24 | 25 | arrayOfFiles = arrayOfFiles || []; 26 | 27 | files.forEach(function (file) { 28 | if (fs.statSync(dirPath + '/' + file).isDirectory()) { 29 | arrayOfFiles = listAllFiles(dirPath + '/' + file, arrayOfFiles); 30 | } else { 31 | arrayOfFiles.push(path.join(dirPath, '/', file)); 32 | } 33 | }); 34 | 35 | return arrayOfFiles; 36 | } 37 | 38 | function src2Out() { 39 | if (fs.existsSync(out)) fs.rmSync(out, { recursive: true, force: true }); 40 | 41 | fs.mkdirSync(out, { recursive: true }); 42 | const libSrc = path.join(src, 'lib'); 43 | const libOut = path.join(out, 'lib'); 44 | fs.mkdirSync(libOut, { recursive: true }); 45 | const libs = listAllFiles(libSrc); 46 | for (let index = 0; index < libs.length; index++) { 47 | const element = libs[index]; 48 | const relative = path.relative(libSrc, element); 49 | minify(element, path.join(libOut, relative)); 50 | } 51 | 52 | for (const sp of copySpider) { 53 | minify(path.join(src, sp + '.js'), path.join(out, sp + '.js')); 54 | } 55 | } 56 | 57 | src2Out(); 58 | 59 | fs.copyFileSync(path.join(src, 'config_open.json'), path.join(out, 'config_open.json')); 60 | 61 | console.log('done'); 62 | -------------------------------------------------------------------------------- /server/source/dovx_open.js: -------------------------------------------------------------------------------- 1 | import { _ } from './lib/cat.js'; 2 | import { log } from './lib/utils.js'; 3 | import { initAli, detailContent, playContent } from './lib/ali.js'; 4 | 5 | let siteKey = 'dovx'; 6 | let siteType = 0; 7 | let siteUrl = 'https://api.dovx.tk'; 8 | let patternAli = /(https:\/\/www\.aliyundrive\.com\/s\/[^"]+)/; 9 | 10 | async function request(reqUrl) { 11 | let res = await req(reqUrl, { 12 | method: 'get', 13 | headers: { 14 | Referer: siteUrl, 15 | }, 16 | }); 17 | return res.content; 18 | } 19 | 20 | // cfg = {skey: siteKey, ext: extend} 21 | async function init(cfg) { 22 | try { 23 | siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey; 24 | siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype; 25 | await initAli(cfg); 26 | } catch (e) { 27 | await log('init:' + e.message + ' line:' + e.lineNumber); 28 | } 29 | } 30 | 31 | async function home(filter) { 32 | return '{}'; 33 | } 34 | 35 | async function homeVod() {} 36 | 37 | async function category(tid, pg, filter, extend) { 38 | return '{}'; 39 | } 40 | 41 | async function detail(id) { 42 | try { 43 | let matches = id.match(patternAli); 44 | if (!_.isEmpty(matches)) return await detailContent(matches[0]); 45 | return ''; 46 | } catch (e) { 47 | await log('detail:' + e.message + ' line:' + e.lineNumber); 48 | } 49 | } 50 | 51 | async function play(flag, id, flags) { 52 | try { 53 | return await playContent(flag, id, flags); 54 | } catch (e) { 55 | await log('play:' + e.message + ' line:' + e.lineNumber); 56 | } 57 | } 58 | 59 | async function search(wd, quick, pg) { 60 | let resp = await request(siteUrl + '/ali/search?wd=' + encodeURIComponent(wd)); 61 | let videos = jsonParse(resp).list; 62 | _.each(videos, (item) => { 63 | item.vod_id = item.vod_content; 64 | item.vod_content = undefined; 65 | }); 66 | return JSON.stringify({ 67 | list: videos, 68 | }); 69 | } 70 | 71 | export function __jsEvalReturn() { 72 | return { 73 | init: init, 74 | home: home, 75 | homeVod: homeVod, 76 | category: category, 77 | detail: detail, 78 | play: play, 79 | search: search, 80 | }; 81 | } 82 | -------------------------------------------------------------------------------- /pages/Search.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 48 | 49 | 94 | -------------------------------------------------------------------------------- /server/source/lib/similarity.js: -------------------------------------------------------------------------------- 1 | function compareTwoStrings(first,second){if((first=first.replace(/\s+/g,""))===(second=second.replace(/\s+/g,"")))return 1;if(first.length<2||second.length<2)return 0;var firstBigrams=new Map;for(let i=0;iratings[bestMatchIndex].rating&&(bestMatchIndex=i)}return{ratings:ratings,bestMatch:ratings[bestMatchIndex],bestMatchIndex:bestMatchIndex}}function lcs(str1,str2){if(!str1||!str2)return{length:0,sequence:"",offset:0};for(var sequence="",str1Length=str1.length,str2Length=str2.length,num=new Array(str1Length),maxlen=0,lastSubsBegin=0,i=0;imaxlen&&(maxlen=num[i][j],lastSubsBegin===(thisSubsBegin=i-num[i][j]+1)?sequence+=str1[i]:(lastSubsBegin=thisSubsBegin,sequence="",sequence+=str1.substr(lastSubsBegin,i+1-lastSubsBegin))));return{length:maxlen,sequence:sequence,offset:thisSubsBegin}}function findBestLCS(mainString,targetStrings){var results=[];let bestMatchIndex=0;for(let i=0;iresults[bestMatchIndex].lcs.length&&(bestMatchIndex=i)}return{allLCS:results,bestMatch:results[bestMatchIndex],bestMatchIndex:bestMatchIndex}}export{compareTwoStrings,findBestMatch,findBestLCS}; -------------------------------------------------------------------------------- /pages/Detail.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 47 | 48 | 97 | -------------------------------------------------------------------------------- /server/source/lib/utils.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | function isSub(ext) { 4 | return ext == "srt" || ext == "ass" || ext == "ssa"; 5 | } 6 | 7 | function getSize(size) { 8 | if (size <= 0) return ""; 9 | if (size > 1024 * 1024 * 1024 * 1024.0) { 10 | size /= (1024 * 1024 * 1024 * 1024.0); 11 | return size.toFixed(2) + "TB"; 12 | } else if (size > 1024 * 1024 * 1024.0) { 13 | size /= (1024 * 1024 * 1024.0); 14 | return size.toFixed(2) + "GB"; 15 | } else if (size > 1024 * 1024.0) { 16 | size /= (1024 * 1024.0); 17 | return size.toFixed(2) + "MB"; 18 | } else { 19 | size /= 1024.0; 20 | return size.toFixed(2) + "KB"; 21 | } 22 | } 23 | 24 | function removeExt(text) { 25 | return text.indexOf('.') > -1 ? text.substring(0, text.lastIndexOf(".")) : text; 26 | } 27 | 28 | async function log(str) { 29 | console.debug(str); 30 | } 31 | 32 | function isVideoFormat(url) { 33 | var RULE = /http((?!http).){12,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\?.*|http((?!http).){12,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video\/tos*/; 34 | if (url.indexOf("url=http") > -1 || url.indexOf(".js") > -1 || url.indexOf(".css") > -1 || url.indexOf(".html") > -1) { 35 | return false; 36 | } 37 | return RULE.test(url); 38 | } 39 | 40 | function jsonParse(input, json) { 41 | var jsonPlayData = JSON.parse(json); 42 | var url = jsonPlayData.url; 43 | if (url.startsWith("//")) { 44 | url = "https:" + url; 45 | } 46 | if (!url.startsWith("http")) { 47 | return null; 48 | } 49 | if (url === input) { 50 | if (!isVideoFormat(url)) { 51 | return null; 52 | } 53 | } 54 | var headers = {}; 55 | var ua = jsonPlayData["user-agent"] || ""; 56 | if (ua.trim().length > 0) { 57 | headers["User-Agent"] = " " + ua; 58 | } 59 | var referer = jsonPlayData.referer || ""; 60 | if (referer.trim().length > 0) { 61 | headers["Referer"] = " " + referer; 62 | } 63 | var taskResult = { 64 | header: headers, 65 | url: url 66 | }; 67 | return taskResult; 68 | } 69 | 70 | function debug(obj) { 71 | for (var a in obj) { 72 | if (typeof(obj[a]) == "object") { 73 | debug(obj[a]); //递归遍历 74 | } else { 75 | console.debug(a + "=" + obj[a]); 76 | } 77 | } 78 | } 79 | 80 | export { isSub, getSize, removeExt, log, isVideoFormat, jsonParse, debug}; -------------------------------------------------------------------------------- /pages/Setting.vue: -------------------------------------------------------------------------------- 1 | 27 | 87 | 88 | 99 | -------------------------------------------------------------------------------- /server/source/xiaozhitiao_open.js: -------------------------------------------------------------------------------- 1 | import { load, _ } from './lib/cat.js'; 2 | import { jsonParse, log } from './lib/utils.js'; 3 | import { initAli, detailContent, playContent } from './lib/ali.js'; 4 | 5 | let siteKey = 'xiaozhitiao'; 6 | let siteType = 0; 7 | let siteUrl = 'https://gitcafe.net/tool/alipaper/'; 8 | let aliUrl = 'https://www.aliyundrive.com/s/'; 9 | let token = ''; 10 | let date = new Date(); 11 | 12 | const UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'; 13 | 14 | async function request(reqUrl, data) { 15 | let res = await req(reqUrl, { 16 | method: 'POST', 17 | headers: { 18 | 'User-Agent': UA, 19 | 'Content-Type': 'multipart/form-data;', 20 | }, 21 | data: data, 22 | body: data, 23 | // postType: 'form', 24 | }); 25 | console.log('🚀 ~ request ~ res:', res); 26 | return res.content; 27 | } 28 | 29 | // cfg = {skey: siteKey, ext: extend} 30 | async function init(cfg) { 31 | try { 32 | siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey; 33 | siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype; 34 | await initAli(cfg); 35 | } catch (e) { 36 | await log('init:' + e.message + ' line:' + e.lineNumber); 37 | } 38 | } 39 | 40 | async function home(filter) { 41 | return '{}'; 42 | } 43 | 44 | async function homeVod() {} 45 | 46 | async function category(tid, pg, filter, extend) { 47 | return '{}'; 48 | } 49 | 50 | async function detail(id) { 51 | try { 52 | return await detailContent(id); 53 | } catch (e) { 54 | await log('detail:' + e.message + ' line:' + e.lineNumber); 55 | } 56 | } 57 | 58 | async function play(flag, id, flags) { 59 | try { 60 | return await playContent(flag, id, flags); 61 | } catch (e) { 62 | await log('play:' + e.message + ' line:' + e.lineNumber); 63 | } 64 | } 65 | 66 | async function search(wd, quick, pg) { 67 | if (pg <= 0) pg = 1; 68 | const params = { 69 | action: 'search', 70 | from: 'web', 71 | keyword: wd, 72 | token: await getToken(), 73 | }; 74 | const resp = await request(siteUrl, params); 75 | const json = jsonParse(resp); 76 | if (!json.success) return ''; 77 | const videos = _.map(json.data, (item) => { 78 | return { 79 | vod_id: aliUrl + item.alikey, 80 | vod_name: item.title, 81 | vod_pic: 'https://www.lgstatic.com/i/image2/M01/15/7E/CgoB5lysLXCADg6ZAABapAHUnQM321.jpg', 82 | vod_remarks: item.creatime, 83 | }; 84 | }); 85 | return JSON.stringify({ 86 | list: videos, 87 | }); 88 | } 89 | 90 | async function getToken() { 91 | const newDate = new Date(); 92 | if (_.isEmpty(token) || newDate > date) { 93 | const params = { 94 | action: 'get_token', 95 | }; 96 | const resp = await request(siteUrl, params); 97 | const json = jsonParse(resp); 98 | if (json.success) { 99 | token = json.data; 100 | date = newDate; 101 | } 102 | } 103 | return token; 104 | } 105 | 106 | export function __jsEvalReturn() { 107 | return { 108 | init: init, 109 | home: home, 110 | homeVod: homeVod, 111 | category: category, 112 | detail: detail, 113 | play: play, 114 | search: search, 115 | }; 116 | } 117 | -------------------------------------------------------------------------------- /server/source/kuwo.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1BgGGt1d29fb3Blbi5qcyxhc3NldHM6Ly9qcy9saWIvY2F0LmpzHF9fanNFdmFsUmV0dXJuAl8Ga2V5CEhPU1QOc2l0ZUtleRBzaXRlVHlwZRJNT0JJTEVfVUEOcmVxdWVzdAhpbml0CGhvbWUOaG9tZVZvZBBjYXRlZ29yeQxkZXRhaWwIcGxheQxzZWFyY2gHd5Htd2dSJmh0dHA6Ly93YXBpLmt1d28uY26WAk1vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfMl8zIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMy4wLjMgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEMcmVxVXJsDmFnZW50U3AGcmVzBnJlcQxtZXRob2QUVXNlci1BZ2VudA5oZWFkZXJzDmNvbnRlbnQGY2ZnCHNrZXkKc3R5cGUMZmlsdGVyDmNsYXNzZXMSZmlsdGVyT2JqDnR5cGVfaWQJHHNgT/NgC3cSdHlwZV9uYW1lCR9Xc1QxcsVgCfRmGlm+fGlfDziXU5A7YMGIhHa6Th91CViNf1pTX1OQCytvK2/9j7tZ740JtlutXsVgH2ESc3RyaW5naWZ5DmZpbHRlcnMEe30GdGlkBHBnDGV4dGVuZAhsaW5rBGpvDHZpZGVvc1ovb3BlbmFwaS92MS9zaG9ydHBsYXkvbW9kdWxlTW9yZT9jdXJyZW50UGFnZT0UJm1vZHVsZUlkPQwmcm49MTIKcGFyc2UIZGF0YQhsaXN0DmZvckVhY2gQcGFyc2VJbnQIcGFnZRBuZXh0UGFnZRJwYWdlY291bnQQcGFnZVNpemUKbGltaXQKdG90YWwEaXQIcHVzaAZ1cmwMdm9kX2lkCnRpdGxlEHZvZF9uYW1lBmltZw52b2RfcGljGGN1cnJyZW50RGVzYxZ2b2RfcmVtYXJrcwRpZAZ2b2QOcGxheVVybFAvb3BlbmFwaS92MS9zaG9ydHBsYXkvdmlkZW9MaXN0P2FsYnVtSWQ9EnNob3J0aW5mbwpjb3ZlcgIjCVOQf5UoV79+GnZvZF9wbGF5X2Zyb20Ydm9kX3BsYXlfdXJsAiQSbXZwYXlpbmZvBnZpZAhmbGFn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 -------------------------------------------------------------------------------- /server/source/caiji_open.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1BTEGNhaWppLmpzLGFzc2V0czovL2pzL2xpYi9jYXQuanMcX19qc0V2YWxSZXR1cm4CXw5zaXRlS2V5EHNpdGVUeXBlBFVBDmJhc2VVcmwUY2F0ZWdvcmllcwhpbml0EmdldEhlYWRlchJnZXRTdHJpbmcIaG9tZQ5ob21lVm9kEGNhdGVnb3J5DGRldGFpbAhwbGF5DHNlYXJjaN4BTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEwOS4wLjAuMCBTYWZhcmkvNTM3LjM2BmNmZwhza2V5CnN0eXBlBmV4dAZ1cmwMaGVhZGVyFFVzZXItQWdlbnQGcmVzBnJlcQ5oZWFkZXJzDmNvbnRlbnQMZmlsdGVyDHJlcVVybA5qc29uU3RyCGRhdGEWY2xhc3Nlc3NBcnIOY2xhc3NlcxJmaWx0ZXJPYmoaY2F0ZWdvcmllc09iagZvbmUIY2F0ZQJlCnBhcnNlDmlzRW1wdHkQaW5jbHVkZXMSdHlwZV9uYW1lDnR5cGVfaWQQdHlwZV9waWQIcHVzaBJzdHJpbmdpZnkOZmlsdGVycw5jb25zb2xlCmRlYnVnBHt9BnRpZARwZwxleHRlbmQMdmlkZW9zID9hYz12aWRlb2xpc3QmdD0IJnBnPQhsaXN0DHZvZF9pZBB2b2RfbmFtZQ52b2RfcGljFnZvZF9yZW1hcmtzEHBhcnNlSW50CHBhZ2UScGFnZWNvdW50CmxpbWl0CnRvdGFsBGlkBnZvZCQ/YWM9dmlkZW9saXN0Jmlkcz0Qdm9kX3llYXIQdm9kX2FyZWESdm9kX2FjdG9yGHZvZF9kaXJlY3RvchZ2b2RfY29udGVudBp2b2RfcGxheV9mcm9tGHZvZF9wbGF5X3VybAhmbGFnBHdkCnF1aWNrHD9hYz1kZXRhaWwmd2Q9D6QDAaYDAQAPqAMAAQCqAwAOAAYBoAEAAAABEApLAKoDAAysAwAJrgMBCbADAgmyAwMJtAMECbYDBQG4AwYBugMHAbwDCAG+AwkBwAMKAcIDCwHEAwwBxgMNAagDDgEI6DS+AF8GAL4BXwcAvgJfCAC+A18JAL4EXwoAvgVfCwC+Bl8M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 -------------------------------------------------------------------------------- /server/source/pansou_open.js: -------------------------------------------------------------------------------- 1 | import { load, _ } from './lib/cat.js'; 2 | import { log } from './lib/utils.js'; 3 | import { initAli, detailContent, playContent } from './lib/ali.js'; 4 | 5 | let siteKey = 'pansou'; 6 | let siteType = 0; 7 | let siteUrl = 'https://www.alipansou.com'; 8 | let patternAli = /(https:\/\/www\.aliyundrive\.com\/s\/[^"]+)/; 9 | 10 | const UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'; 11 | 12 | async function requestRaw(reqUrl, headers, redirect) { 13 | let res = await req(reqUrl, { 14 | method: 'get', 15 | headers: headers || { 16 | 'User-Agent': UA, 17 | Referer: siteUrl, 18 | }, 19 | redirect: redirect, 20 | }); 21 | // console.log(res) 22 | console.log('🚀 ~ requestRaw ~ res:', res); 23 | return res; 24 | } 25 | 26 | async function request(reqUrl) { 27 | let resRaw = await requestRaw(reqUrl); 28 | return resRaw.content; 29 | } 30 | 31 | // cfg = {skey: siteKey, ext: extend} 32 | async function init(cfg) { 33 | try { 34 | siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey; 35 | siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype; 36 | await initAli(cfg); 37 | } catch (e) { 38 | await log('init:' + e.message + ' line:' + e.lineNumber); 39 | } 40 | } 41 | 42 | async function home(filter) { 43 | return '{}'; 44 | } 45 | 46 | async function homeVod() {} 47 | 48 | async function category(tid, pg, filter, extend) { 49 | return '{}'; 50 | } 51 | 52 | async function detail(id) { 53 | try { 54 | let matches = id.match(patternAli); 55 | if (!_.isEmpty(matches)) return await detailContent(matches[0]); 56 | let url = siteUrl + id.replace('/s/', '/cv/'); 57 | const data = await requestRaw(url, getHeaders(id), 0); 58 | const headers = data.headers; 59 | const resp = data.content; 60 | if (headers.hasOwnProperty('location')) { 61 | url = headers['location'].replace('/redirect?visit=', 'https://www.aliyundrive.com/s/'); 62 | return await detailContent(url); 63 | } else if (!_.isEmpty(resp)) { 64 | const $ = load(resp); 65 | url = $('a:first').attr('href').replace('/redirect?visit=', 'https://www.aliyundrive.com/s/'); 66 | return await detailContent(url); 67 | } 68 | return ''; 69 | } catch (e) { 70 | await log('detail:' + e.message + ' line:' + e.lineNumber); 71 | } 72 | } 73 | 74 | function getHeaders(id) { 75 | return { 76 | 'User-Agent': UA, 77 | Referer: siteUrl + id, 78 | _bid: '6d14a5dd6c07980d9dc089a693805ad8', 79 | }; 80 | } 81 | 82 | async function play(flag, id, flags) { 83 | try { 84 | return await playContent(flag, id, flags); 85 | } catch (e) { 86 | await log('play:' + e.message + ' line:' + e.lineNumber); 87 | } 88 | } 89 | 90 | async function search(wd, quick, pg) { 91 | if (pg <= 0) pg = 1; 92 | const limit = 10; 93 | const html = await request(siteUrl + '/search?k=' + encodeURIComponent(wd) + '&page=' + pg + '&s=0&t=-1'); 94 | const $ = load(html); 95 | const items = $('van-row > a'); 96 | const videos = _.map(items, (item) => { 97 | let title = $(item).find('template:first').text().trim(); 98 | return { 99 | vod_id: item.attribs.href, 100 | vod_name: title, 101 | vod_pic: 'https://inews.gtimg.com/newsapp_bt/0/13263837859/1000', 102 | }; 103 | }); 104 | const pageCount = $('van-pagination').attr('page-count') || pg; 105 | const pgCount = parseInt(pageCount); 106 | return JSON.stringify({ 107 | page: parseInt(pg), 108 | pagecount: pgCount, 109 | limit: limit, 110 | total: limit * pgCount, 111 | list: videos, 112 | }); 113 | } 114 | 115 | export function __jsEvalReturn() { 116 | return { 117 | init: init, 118 | home: home, 119 | homeVod: homeVod, 120 | category: category, 121 | detail: detail, 122 | play: play, 123 | search: search, 124 | }; 125 | } 126 | -------------------------------------------------------------------------------- /server/source/sharenice_open.js: -------------------------------------------------------------------------------- 1 | // 搜索滑块验证 2 | import { load, _ } from './lib/cat.js'; 3 | 4 | let key = '短视频'; 5 | let HOST = 'http://www.sharenice.net'; 6 | let siteKey = ''; 7 | let siteType = 0; 8 | let PC_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'; 9 | 10 | async function request(reqUrl, agentSp) { 11 | let res = await req(reqUrl, { 12 | method: 'get', 13 | headers: { 14 | 'User-Agent': agentSp || PC_UA, 15 | }, 16 | }); 17 | return res.content; 18 | } 19 | 20 | async function init(cfg) { 21 | siteKey = cfg.skey; 22 | siteType = cfg.stype; 23 | } 24 | 25 | function clsjoin(cls) { 26 | _.each(cls, (s) => { 27 | let typeId = s.attribs['href']; 28 | typeId = typeId.substring(typeId.lastIndexOf('t/') + 2); 29 | classes.push({ 30 | type_id: typeId, 31 | type_name: s.children[0].data, 32 | }); 33 | }); 34 | } 35 | 36 | let classes = []; 37 | async function home(filter) { 38 | let filterObj = {}; 39 | let html = await request(HOST); 40 | let $ = load(html); 41 | let series = $('div.nav > ul > li > a[href*=net/]'); 42 | let tag = $('div.hot-tags-list > a[href*=net]'); 43 | clsjoin(series); 44 | clsjoin(tag); 45 | return JSON.stringify({ 46 | class: classes, 47 | filters: filterObj, 48 | }); 49 | } 50 | 51 | async function homeVod() { 52 | let link = HOST + '/t-576O5aWz'; 53 | let html = await request(link); 54 | let $ = load(html); 55 | let items = $('div.item-box ul li'); 56 | let videos = _.map(items, (item) => { 57 | let a = $(item).find('a:first')[0]; 58 | let img = $(item).find('img:first')[0]; 59 | return { 60 | vod_id: a.attribs.href, 61 | vod_name: a.attribs.title, 62 | vod_pic: img.attribs['data-original'], 63 | vod_remarks: '', 64 | }; 65 | }); 66 | return JSON.stringify({ 67 | list: videos, 68 | }); 69 | } 70 | 71 | async function category(tid, pg, filter, extend) { 72 | if (pg <= 0 || typeof(pg) == 'undefined') pg = 1; 73 | let link = HOST + '/' + tid + '?page=' + pg; 74 | let html = await request(link); 75 | let $ = load(html); 76 | let items = $('div.item-box ul li'); 77 | let videos = _.map(items, (item) => { 78 | let a = $(item).find('a:first')[0]; 79 | let img = $(item).find('img:first')[0]; 80 | return { 81 | vod_id: a.attribs.href, 82 | vod_name: a.attribs.title, 83 | vod_pic: img.attribs['data-original'], 84 | vod_remarks: '', 85 | }; 86 | }); 87 | let hasMore = $('ul.pagination > li > a:contains(»)').length > 0; 88 | let pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 89 | return JSON.stringify({ 90 | page: parseInt(pg), 91 | pagecount: pgCount, 92 | limit: 16, 93 | total: 16 * pgCount, 94 | list: videos, 95 | }); 96 | } 97 | 98 | async function detail(id) { 99 | let vod = { 100 | vod_id: id, 101 | vod_remarks: '', 102 | }; 103 | let playlist = ['观看视频' + '$' + id]; 104 | vod.vod_play_from = '道长在线'; 105 | vod.vod_play_url = playlist.join('#'); 106 | return JSON.stringify({ 107 | list: [vod], 108 | }); 109 | } 110 | 111 | async function play(flag, id, flags) { 112 | let html = await request(id); 113 | let $ = load(html); 114 | let playUrl = $('div.video-play-box').find('video:first')[0].attribs.src + '#.mp4'; 115 | return JSON.stringify({ 116 | parse: 0, 117 | url: playUrl, 118 | }); 119 | } 120 | 121 | async function search(wd, quick, pg) { 122 | return '{}'; 123 | } 124 | 125 | export function __jsEvalReturn() { 126 | return { 127 | init: init, 128 | home: home, 129 | homeVod: homeVod, 130 | category: category, 131 | detail: detail, 132 | play: play, 133 | search: search, 134 | }; 135 | } -------------------------------------------------------------------------------- /server/source/bookan_book_open.js: -------------------------------------------------------------------------------- 1 | import { _ } from './lib/cat.js'; 2 | 3 | let key = 'bookan'; 4 | let url = 'https://api.bookan.com.cn'; 5 | let siteKey = ''; 6 | let siteType = 0; 7 | 8 | async function request(reqUrl, agentSp) { 9 | let res = await req(reqUrl, { 10 | method: 'get', 11 | }); 12 | return res.content; 13 | } 14 | 15 | // cfg = {skey: siteKey, ext: extend} 16 | async function init(cfg) { 17 | siteKey = cfg.skey; 18 | siteType = cfg.stype; 19 | } 20 | 21 | async function home(filter) { 22 | return JSON.stringify({ 23 | class: [ 24 | { type_id: '1305', type_name: '少年读物' }, 25 | { type_id: '1304', type_name: '儿童文学' }, 26 | { type_id: '1320', type_name: '国学经典' }, 27 | { type_id: '1306', type_name: '文艺少年' }, 28 | { type_id: '1309', type_name: '育儿心经' }, 29 | { type_id: '1310', type_name: '心理哲学' }, 30 | { type_id: '1307', type_name: '青春励志' }, 31 | { type_id: '1312', type_name: '历史小说' }, 32 | { type_id: '1303', type_name: '故事会' }, 33 | { type_id: '1317', type_name: '音乐戏剧' }, 34 | { type_id: '1319', type_name: '相声评书' }, 35 | ], 36 | }); 37 | } 38 | 39 | async function category(tid, pg, filter, extend) { 40 | pg = pg || 1; 41 | if (pg == 0) pg = 1; 42 | let content = await request(`${url}/voice/book/list?instance_id=25304&page=${pg}&category_id=${tid}&num=24`); 43 | let data = JSON.parse(content).data; 44 | let books = []; 45 | for (const book of data.list) { 46 | books.push({ 47 | book_id: book.id, 48 | book_name: book.name, 49 | book_pic: book.cover, 50 | book_remarks: book.extra.author, 51 | }); 52 | } 53 | return JSON.stringify({ 54 | page: data.current_page, 55 | pagecount: data.last_page, 56 | limit: 24, 57 | total: data.total, 58 | list: books, 59 | }); 60 | } 61 | 62 | async function detail(id) { 63 | let content = await request(`${url}/voice/album/units?album_id=${id}&page=1&num=200&order=1`); 64 | let data = JSON.parse(content).data; 65 | 66 | let book = { 67 | book_id: id, 68 | type_name: '', 69 | book_year: '', 70 | book_area: '', 71 | book_remarks: '', 72 | book_actor: '', 73 | book_director: '', 74 | book_content: '', 75 | }; 76 | let us = _.map(data.list, function (b) { 77 | return formatPlayUrl(b.title) + '$' + b.file; 78 | }).join('#'); 79 | book.volumes = '书卷'; 80 | book.urls = us; 81 | 82 | return JSON.stringify({ 83 | list: [book], 84 | }); 85 | } 86 | 87 | function formatPlayUrl(name) { 88 | return name 89 | .trim() 90 | .replace(/<|>|《|》/g, '') 91 | .replace(/\$|#/g, ' ') 92 | .trim(); 93 | } 94 | 95 | async function proxy(segments, headers) {} 96 | 97 | async function play(flag, id, flags) { 98 | return JSON.stringify({ 99 | parse: 0, 100 | url: id, 101 | }); 102 | } 103 | 104 | async function search(wd, quick, pg) { 105 | pg = pg || 1; 106 | if (pg == 0) pg = 1; 107 | let content = await request(`https://es.bookan.com.cn/api/v3/voice/book?instanceId=25304&keyword=${wd}&pageNum=${pg}&limitNum=20`); 108 | let data = JSON.parse(content).data; 109 | let books = []; 110 | for (const book of data.list) { 111 | books.push({ 112 | book_id: book.id, 113 | book_name: book.name, 114 | book_pic: book.cover, 115 | book_remarks: book.extra.author, 116 | }); 117 | } 118 | return JSON.stringify({ 119 | page: data.current_page, 120 | pagecount: data.last_page, 121 | limit: 20, 122 | total: data.total, 123 | list: books, 124 | }); 125 | } 126 | 127 | export function __jsEvalReturn() { 128 | return { 129 | init: init, 130 | home: home, 131 | category: category, 132 | detail: detail, 133 | play: play, 134 | search: search, 135 | }; 136 | } 137 | -------------------------------------------------------------------------------- /server/source/pansearch_open.js: -------------------------------------------------------------------------------- 1 | import { load, _ } from './lib/cat.js'; 2 | import { log } from './lib/utils.js'; 3 | import { initAli, detailContent, playContent } from './lib/ali_readable.js'; 4 | 5 | let siteKey = 'pansearch'; 6 | let siteType = 0; 7 | let siteUrl = 'https://www.pansearch.me'; 8 | let patternAli = /(https:\/\/www\.aliyundrive\.com\/s\/[^"]+)/; 9 | 10 | const UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'; 11 | 12 | async function requestRaw(reqUrl, headers) { 13 | let res = await req(reqUrl, { 14 | method: 'get', 15 | headers: headers || { 16 | 'User-Agent': UA, 17 | Referer: siteUrl, 18 | }, 19 | }); 20 | return { content: JSON.stringify(res.content) }; 21 | } 22 | 23 | async function request(reqUrl) { 24 | let resRaw = await requestRaw(reqUrl); 25 | return resRaw.content; 26 | } 27 | 28 | // cfg = {skey: siteKey, ext: extend} 29 | async function init(cfg) { 30 | try { 31 | siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey; 32 | siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype; 33 | await initAli(cfg); 34 | } catch (e) { 35 | await log('init:' + e.message + ' line:' + e.lineNumber); 36 | } 37 | } 38 | 39 | async function home(filter) { 40 | return '{}'; 41 | } 42 | 43 | async function homeVod() {} 44 | 45 | async function category(tid, pg, filter, extend) { 46 | return '{}'; 47 | } 48 | 49 | async function detail(id) { 50 | console.log('🚀 ~ detail ~ id:', id); 51 | try { 52 | let matches = id.match(patternAli); 53 | if (!_.isEmpty(matches)) return await detailContent(matches[0]); 54 | return ''; 55 | } catch (e) { 56 | await log('detail:' + e.message + ' line:' + e.lineNumber); 57 | } 58 | } 59 | 60 | async function play(flag, id, flags) { 61 | try { 62 | return await playContent(flag, id, flags); 63 | } catch (e) { 64 | await log('play:' + e.message + ' line:' + e.lineNumber); 65 | } 66 | } 67 | 68 | async function search(wd, quick, pg) { 69 | if (pg <= 0) pg = 1; 70 | const limit = 20; 71 | let offsetParam = ''; 72 | const offset = (pg - 1) * limit; 73 | if (offset > 0) { 74 | offsetParam = '&offset=' + offset; 75 | } 76 | const html = await request(siteUrl); 77 | const $ = load(jsonParse(html)); 78 | const script = $('script#__NEXT_DATA__')[0]; 79 | const data = script.children[0].data; 80 | const buildId = jsonParse(data).buildId; 81 | const url = siteUrl + '/_next/data/' + buildId + '/search.json?keyword=' + encodeURIComponent(wd) + offsetParam + '&pan=aliyundrive'; 82 | const result = await requestRaw(url, getSearchHeader()); 83 | const json = jsonParse(result.content).pageProps.data; 84 | const total = json.total; 85 | const videoIdSet = new Set(); 86 | const videos = []; 87 | for (const item of json.data) { 88 | const content = item.content; 89 | const img = item.image || siteUrl + '/favicon.png'; 90 | const splits = content.split('\n'); 91 | if (_.isEmpty(splits)) continue; 92 | if (content.includes('1、')) { 93 | for (const line of splits) { 94 | if (_.isEmpty(line)) continue; 95 | const vodId = parseVideo(line, videoIdSet); 96 | if (!vodId) continue; 97 | videos.push({ 98 | vod_id: vodId, 99 | vod_name: line 100 | .replaceAll(/<\/?[^>]+>/g, '') 101 | .replace(/[0-9]*、/g, '') 102 | .replace(/:http.*/g, ''), 103 | vod_pic: img, 104 | vod_remarks: item.time, 105 | }); 106 | } 107 | } else { 108 | const vodId = parseVideo(content, videoIdSet); 109 | if (!vodId) continue; 110 | videos.push({ 111 | vod_id: vodId, 112 | vod_name: splits[0].replaceAll(/<\/?[^>]+>/g, '').replace('名称:', ''), 113 | vod_pic: img, 114 | vod_remarks: item.time, 115 | }); 116 | } 117 | } 118 | const pgCount = parseInt(total / limit) + 1; 119 | return JSON.stringify({ 120 | page: parseInt(pg), 121 | pagecount: pgCount, 122 | limit: limit, 123 | total: total, 124 | list: videos, 125 | }); 126 | } 127 | 128 | function parseVideo(content, videoIdSet) { 129 | const matches = content.match(patternAli); 130 | if (_.isEmpty(matches)) return; 131 | const vodId = matches[1]; 132 | if (videoIdSet.has(vodId)) return; 133 | videoIdSet.add(vodId); 134 | return vodId; 135 | } 136 | 137 | function getSearchHeader() { 138 | return { 139 | 'x-nextjs-data': '1', 140 | Referer: siteUrl, 141 | }; 142 | } 143 | 144 | export function __jsEvalReturn() { 145 | return { 146 | init: init, 147 | home: home, 148 | homeVod: homeVod, 149 | category: category, 150 | detail: detail, 151 | play: play, 152 | search: search, 153 | }; 154 | } 155 | -------------------------------------------------------------------------------- /server/source/tuxiaobei_open.js: -------------------------------------------------------------------------------- 1 | import { load, _ } from './lib/cat.js'; 2 | let key = '🐰兔小贝'; 3 | let HOST = 'https://www.tuxiaobei.com'; 4 | let siteKey = ''; 5 | let siteType = 0; 6 | const IOS_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'; 7 | 8 | async function request(reqUrl, agentSp) { 9 | let res = await req(reqUrl, { 10 | method: 'get', 11 | headers: { 12 | 'User-Agent': agentSp || IOS_UA, 13 | }, 14 | }); 15 | return res.content 16 | } 17 | 18 | async function init(cfg) { 19 | siteKey = cfg.skey; 20 | siteType = cfg.stype 21 | } 22 | 23 | async function home(filter) { 24 | const classes = [{ type_id: '', type_name: '🐰全部' }, { type_id: 2, type_name: '🐰儿歌' }, { type_id: 3, type_name: '🐰故事' }, { type_id: 27, type_name: '🐰公益' }, { type_id: 9, type_name: '🐰十万个为什么' }, { type_id: 28, type_name: '🐰安全教育' }, { type_id: 29, type_name: '🐰动物奇缘' }, { type_id: 7, type_name: '🐰弟子规' }, { type_id: 5, type_name: '🐰古诗' }, { type_id: 6, type_name: '🐰三字经' }, { type_id: 8, type_name: '🐰千字文' }, { type_id: 11, type_name: '🐰数学' }, { type_id: 25, type_name: '🐰英语' }, { type_id: 24, type_name: '🐰折纸' }]; 25 | const filterObj = {}; 26 | return JSON.stringify({ 27 | class: _.map(classes, (cls) => { 28 | cls.land = 1; 29 | cls.ratio = 1.78; 30 | return cls; 31 | }), 32 | filters: filterObj, 33 | }) 34 | } 35 | 36 | async function homeVod() { 37 | const link = await request(HOST + '/list/mip-data?typeId=9&page=1&callback='); 38 | const html = link.match(/\((.*?)\);/)[1]; 39 | const data = JSON.parse(html).data; 40 | let videos = _.map(data.items, (it) => { 41 | return { 42 | vod_id: it.video_id, 43 | vod_name: it.name, 44 | vod_pic: it.image, 45 | vod_remarks: it.root_category_name + ' | ' + it.duration_string || '', 46 | } 47 | }); 48 | return JSON.stringify({ 49 | list: videos, 50 | }) 51 | } 52 | 53 | async function category(tid, pg, filter, extend) { 54 | if (pg <= 0 || typeof pg == 'undefined') pg = 1; 55 | const link = await request(HOST + '/list/mip-data?typeId=' + tid + '&page=' + pg + '&callback='); 56 | const html = link.match(/\((.*?)\);/)[1]; 57 | const data = JSON.parse(html).data; 58 | let videos = _.map(data.items, (it) => { 59 | return { 60 | vod_id: it.video_id, 61 | vod_name: it.name, 62 | vod_pic: it.image, 63 | vod_remarks: it.root_category_name + ' | ' + it.duration_string || '', 64 | } 65 | }); 66 | const pgCount = pg * 30 > data.totalCount ? parseInt(pg) : parseInt(pg) + 1; 67 | return JSON.stringify({ 68 | page: parseInt(pg), 69 | pagecount: pgCount, 70 | limit: 30, 71 | total: data.totalCount, 72 | list: videos, 73 | }) 74 | } 75 | 76 | async function detail(id) { 77 | const vod = { 78 | vod_id: id, 79 | vod_remarks: '', 80 | }; 81 | const playlist = ['点击播放' + '$' + HOST + '/play/' + id]; 82 | vod.vod_play_from = "道长在线"; 83 | vod.vod_play_url = playlist.join('#'); 84 | return JSON.stringify({ 85 | list: [vod], 86 | }); 87 | } 88 | 89 | async function play(flag, id, flags) { 90 | const html = await request(id); 91 | const $ = load(html); 92 | const pvideo = $("body mip-search-video[video-src*=http]"); 93 | const purl = pvideo[0].attribs['video-src']; 94 | // console.debug('兔小贝 purl =====>' + purl); // js_debug.log 95 | return JSON.stringify({ 96 | parse: 0, 97 | url: purl, 98 | }); 99 | } 100 | 101 | async function search(wd, quick) { 102 | const link = HOST + "/search/" + wd; 103 | const html = await request(link); 104 | const $ = load(html); 105 | const list = $("div.list-con > div.items"); 106 | let videos = _.map(list, (it) => { 107 | const a = $(it).find("a:first")[0]; 108 | const img = $(it).find("mip-img:first")[0]; 109 | const tt = $(it).find("p:first")[0]; 110 | const remarks = $(it).find("p")[1]; 111 | return { 112 | vod_id: a.attribs.href.replace(/.*?\/play\/(.*)/g, '$1'), 113 | vod_name: tt.children[0].data, 114 | vod_pic: img.attribs["src"], 115 | vod_remarks: remarks.children[0].data || "", 116 | }; 117 | }); 118 | return JSON.stringify({ 119 | list: videos, 120 | land: 1, 121 | ratio: 1.78, 122 | }); 123 | } 124 | 125 | export function __jsEvalReturn() { 126 | return { 127 | init: init, 128 | home: home, 129 | homeVod: homeVod, 130 | category: category, 131 | detail: detail, 132 | play: play, 133 | search: search, 134 | } 135 | } -------------------------------------------------------------------------------- /server/source/ubestkid_open.js: -------------------------------------------------------------------------------- 1 | // 无搜索功能 2 | import { _ } from './lib/cat.js'; 3 | let key = '🐯贝乐虎'; 4 | let HOST = 'https://vd.ubestkid.com'; 5 | let siteKey = ''; 6 | let siteType = 0; 7 | const MOBILE_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'; 8 | 9 | async function request(reqUrl, referer, mth, data, hd) { 10 | const headers = { 11 | "User-Agent": MOBILE_UA, 12 | }; 13 | if (referer) headers.referer = encodeURIComponent(referer); 14 | let res = await req(reqUrl, { 15 | method: mth || "get", 16 | headers: headers, 17 | data: data, 18 | postType: mth === "post" ? "json" : "", 19 | }); 20 | return res.content; 21 | } 22 | 23 | async function init(cfg) { 24 | siteKey = cfg.skey; 25 | siteType = cfg.stype 26 | } 27 | 28 | async function home(filter) { 29 | const classes = [{ type_id: 65, type_name: '🐯最新上架' }, { type_id: 113, type_name: '🐯人气热播' }, { type_id: 56, type_name: '🐯经典童谣' }, { type_id: 137, type_name: '🐯开心贝乐虎' }, { type_id: 53, type_name: '🐯律动儿歌' }, { type_id: 59, type_name: '🐯经典儿歌' }, { type_id: 101, type_name: '🐯超级汽车1' }, { type_id: 119, type_name: '🐯超级汽车第二季' }, { type_id: 136, type_name: '🐯超级汽车第三季' }, { type_id: 95, type_name: '🐯三字经' }, { type_id: 133, type_name: '🐯幼儿手势舞' }, { type_id: 117, type_name: '🐯哄睡儿歌' }, { type_id: 70, type_name: '🐯英文儿歌' }, { type_id: 116, type_name: '🐯节日与节气' }, { type_id: 97, type_name: '🐯恐龙世界' }, { type_id: 55, type_name: '🐯动画片儿歌' }, { type_id: 57, type_name: '🐯流行歌曲' }, { type_id: 118, type_name: '🐯贝乐虎入园记' }, { type_id: 106, type_name: '🐯贝乐虎大百科' }, { type_id: 62, type_name: '🐯经典古诗' }, { type_id: 63, type_name: '🐯经典故事' }, { type_id: 128, type_name: '🐯萌虎学功夫' }, { type_id: 100, type_name: '🐯绘本故事' }, { type_id: 121, type_name: '🐯开心贝乐虎英文版' }, { type_id: 96, type_name: '🐯嗨贝乐虎情商动画' }, { type_id: 108, type_name: '🐯动物音乐派对' }, { type_id: 126, type_name: '🐯动物音乐派对英文版' }, { type_id: 105, type_name: '🐯奇妙的身体' }, { type_id: 124, type_name: '🐯奇妙的身体英文版' }, { type_id: 64, type_name: '🐯认知卡片' }, { type_id: 109, type_name: '🐯趣味简笔画' }, { type_id: 78, type_name: '🐯数字儿歌' }, { type_id: 120, type_name: '🐯识字体验版' }, { type_id: 127, type_name: '🐯启蒙系列体验版' }]; 30 | const filterObj = {}; 31 | return JSON.stringify({ 32 | class: _.map(classes, (cls) => { 33 | cls.land = 1; 34 | cls.ratio = 1.78; 35 | return cls; 36 | }), 37 | filters: filterObj, 38 | }) 39 | } 40 | 41 | async function homeVod() { 42 | const link = HOST + "/api/v1/bv/video"; 43 | const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: 56, "p": 1 }; 44 | const jo = JSON.parse(await request(link, "", "post", pdata)).result; 45 | const videos = []; 46 | _.each(jo.items, (it) => { 47 | videos.push({ 48 | vod_id: it.url, 49 | vod_name: it.title, 50 | vod_pic: it.image, 51 | vod_remarks: '👀' + it.viewcount || '', 52 | }) 53 | }); 54 | return JSON.stringify({ 55 | list: videos, 56 | }) 57 | } 58 | 59 | async function category(tid, pg, filter, extend) { 60 | if (pg <= 0 || typeof pg == 'undefined') pg = 1; 61 | const link = HOST + "/api/v1/bv/video"; 62 | const pdata = { age: 1, appver: "6.1.9", egvip_status: 0, svip_status: 0, vps: 60, subcateId: tid, "p": pg }; 63 | const jo = JSON.parse(await request(link, "", "post", pdata)).result; 64 | const videos = []; 65 | _.each(jo.items, (it) => { 66 | videos.push({ 67 | vod_id: it.url, 68 | vod_name: it.title, 69 | vod_pic: it.image, 70 | vod_remarks: '👀' + it.viewcount || '', 71 | }) 72 | }); 73 | const pgCount = pg * 60 > jo.total ? parseInt(pg) : parseInt(pg) + 1; 74 | return JSON.stringify({ 75 | page: parseInt(pg), 76 | pagecount: pgCount, 77 | limit: 60, 78 | total: jo.total, 79 | list: videos, 80 | }) 81 | } 82 | 83 | async function detail(id) { 84 | const vod = { 85 | vod_id: id, 86 | vod_remarks: '', 87 | }; 88 | const playlist = ['点击播放' + '$' + id]; 89 | vod.vod_play_from = "道长在线"; 90 | vod.vod_play_url = playlist.join('#'); 91 | return JSON.stringify({ 92 | list: [vod], 93 | }); 94 | } 95 | 96 | async function play(flag, id, flags) { 97 | // console.debug('贝乐虎 id =====>' + id); // js_debug.log 98 | return JSON.stringify({ 99 | parse: 0, 100 | url: id, 101 | }); 102 | } 103 | 104 | async function search(wd, quick) { 105 | return '{}' 106 | } 107 | 108 | export function __jsEvalReturn() { 109 | return { 110 | init: init, 111 | home: home, 112 | homeVod: homeVod, 113 | category: category, 114 | detail: detail, 115 | play: play, 116 | search: search, 117 | } 118 | } -------------------------------------------------------------------------------- /server/source/wogg_open.js: -------------------------------------------------------------------------------- 1 | import { load, _, Uri } from './lib/cat.js'; 2 | import { log } from './lib/utils.js'; 3 | import { initAli, detailContent, playContent } from './lib/ali.js'; 4 | 5 | let siteKey = 'wogg'; 6 | let siteType = 0; 7 | let siteUrl = 'https://wogg.xyz'; 8 | let UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'; 9 | let patternAli = /(https:\/\/www\.aliyundrive\.com\/s\/[^"]+)/; 10 | 11 | async function init(cfg) { 12 | try { 13 | siteKey = _.isEmpty(cfg.skey) ? '' : cfg.skey; 14 | siteType = _.isEmpty(cfg.stype) ? '' : cfg.stype; 15 | await initAli(cfg); 16 | } catch (e) { 17 | await log('init:' + e.message + ' line:' + e.lineNumber); 18 | } 19 | } 20 | 21 | async function request(reqUrl, agentSp) { 22 | let header = { 23 | 'user-agent': agentSp || 'okhttp/3.12.0', 24 | }; 25 | let uri = new Uri(reqUrl); 26 | let res = await req(uri.toString(), { 27 | headers: header, 28 | timeout: 10000, 29 | }); 30 | 31 | let content = res.content; 32 | return content; 33 | } 34 | 35 | function getHeader() { 36 | let header = {}; 37 | header['User-Agent'] = UA; 38 | return header; 39 | } 40 | 41 | async function getString(url) { 42 | let res = await req(url, { 43 | headers: getHeader(), 44 | }); 45 | return res.content; 46 | } 47 | 48 | let classes = [ 49 | { type_id: 1, type_name: '电影' }, 50 | { type_id: 2, type_name: '电视剧' }, 51 | { type_id: 3, type_name: '动漫' }, 52 | { type_id: 4, type_name: '综艺' }, 53 | { type_id: 5, type_name: '音乐' }, 54 | { type_id: 6, type_name: '短剧' }, 55 | ]; 56 | let filterObj = {}; 57 | async function home(filter) { 58 | return JSON.stringify({ 59 | class: classes, 60 | filters: filterObj, 61 | }); 62 | } 63 | 64 | async function homeVod() { 65 | return '{}'; 66 | } 67 | 68 | async function category(tid, pg, filter, extend) { 69 | let reqUrl = siteUrl + '/index.php/vodshow/' + tid + '--------' + pg + '---.html'; 70 | let con = await request(reqUrl, UA); 71 | const $ = load(con); 72 | let items = $('.module:eq(0) > .module-list > .module-items > .module-item'); 73 | let videos = []; 74 | for (var item of items) { 75 | let oneA = $(item).find('.module-item-cover .module-item-pic a').first(); 76 | let href = oneA.attr('href'); 77 | let name = oneA.attr('title'); 78 | let oneImg = $(item).find('.module-item-cover .module-item-pic img').first(); 79 | let pic = oneImg.attr('data-src'); 80 | let remark = $(item).find('.module-item-text').first().text(); 81 | videos.push({ 82 | vod_id: href, 83 | vod_name: name, 84 | vod_pic: pic, 85 | vod_remarks: remark, 86 | }); 87 | } 88 | 89 | const hasMore = $('#page > a:contains(下一页)').length > 0; 90 | const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 91 | return JSON.stringify({ 92 | page: parseInt(pg), 93 | pagecount: pgCount, 94 | limit: 72, 95 | total: 72 * pgCount, 96 | list: videos, 97 | }); 98 | } 99 | 100 | async function detail(id) { 101 | try { 102 | await log('detail:id:---' + id); 103 | let preMatches = id.match(patternAli); 104 | if (!_.isEmpty(preMatches)) return await detailContent(preMatches[1]); 105 | let url = siteUrl + id; 106 | let aliUrl = await getString(url); 107 | let matches = aliUrl.match(patternAli); 108 | console.log('detailmatche---'); 109 | console.log(matches[1]); 110 | if (!_.isEmpty(matches)) return await detailContent(matches[1]); 111 | return ''; 112 | } catch (e) { 113 | await log('detail:' + e.message + ' line:' + e.lineNumber); 114 | } 115 | } 116 | 117 | async function play(flag, id, flags) { 118 | try { 119 | return await playContent(flag, id, flags); 120 | } catch (e) { 121 | await log('play:' + e.message + ' line:' + e.lineNumber); 122 | } 123 | } 124 | 125 | async function search(wd, quick) { 126 | await log('search---' + wd); 127 | let searchUrl = siteUrl + '/index.php/vodsearch/-------------.html?wd=' + wd; 128 | let html = await getString(searchUrl); 129 | let $ = load(html); 130 | let items = $('.module-search-item'); 131 | let videos = []; 132 | for (var item of items) { 133 | let vodId = $(item).find('.video-serial')[0].attribs.href; 134 | let name = $(item).find('.video-serial')[0].attribs.title; 135 | let pic = $(item).find('.module-item-pic > img')[0].attribs['data-src']; 136 | let remark = ''; 137 | videos.push({ 138 | vod_id: vodId, 139 | vod_name: name, 140 | vod_pic: pic, 141 | vod_remarks: remark, 142 | }); 143 | } 144 | return JSON.stringify({ 145 | list: videos, 146 | }); 147 | } 148 | 149 | export function __jsEvalReturn() { 150 | return { 151 | init: init, 152 | home: home, 153 | homeVod: homeVod, 154 | category: category, 155 | detail: detail, 156 | play: play, 157 | search: search, 158 | }; 159 | } 160 | -------------------------------------------------------------------------------- /server/source/douyu_bytecode.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1CjARpkb3V5dV9vcGVuLmpzLGFzc2V0czovL2pzL2xpYi9jYXQuanMcX19qc0V2YWxSZXR1cm4CXwZrZXkISE9TVA5zaXRlS2V5EHNpdGVUeXBlBFVBDnJlcXVlc3QIcG9zdAhpbml0CGhvbWUOaG9tZVZvZBBjYXRlZ29yeQxkZXRhaWwIcGxheQxzZWFyY2gaZGVjb2RlVW5pY29kZQpkb3V5dSZodHRwczovL20uZG91eXUuY29t8gFNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvOTEuMC40NDcyLjExNCBTYWZhcmkvNTM3LjM2DHJlcVVybAR1YQxidWZmZXIGcmVzBnJlcQxtZXRob2QUVXNlci1BZ2VudA5oZWFkZXJzDmNvbnRlbnQQcG9zdERhdGEQcG9zdHR5cGUIZGF0YRBwb3N0VHlwZQZjZmcIc2tleQpzdHlwZQxmaWx0ZXIOY2xhc3NlcxJmaWx0ZXJPYmoIdHlwZRB0eXBlTmFtZQx0eXBlSWQUZmlsdGVyRGF0YQh0YWdzAmUKcGFyc2UcL2FwaS9jYXRlL2xpc3QSY2F0ZTFJbmZvEmNhdGUxTmFtZQcfZr9Sm1ISc2hvcnROYW1lCHB1c2gOdHlwZV9pZBJ0eXBlX25hbWUSY2F0ZTJJbmZvDGNhdGVJZAUGUnt8Bm1hcAJ2DmNvbnNvbGUKZGVidWceZmlsdGVyT2JqID09PT4gEnN0cmluZ2lmeQ5maWx0ZXJzAngOY2F0ZTFJZAJuEmNhdGUyTmFtZQZjbHMIbGFuZApyYXRpbwRKbwx2aWRlb3MaL2FwaS9ob21lL21peAhsaXN0BGl0BnJpZAx2b2RfaWQQcm9vbU5hbWUQdm9kX25hbWUOcm9vbVNyYw52b2RfcGljBT3YQdwEaG4DADAFPNiZ3RBuaWNrbmFtZRZ2b2RfcmVtYXJrcwZ0aWQEcGcMZXh0ZW5kCGxpbmsoL2FwaS9yb29tL2xpc3Q/cGFnZT0MJnR5cGU9EHBhcnNlSW50CHBhZ2UScGFnZUNvdW50EnBhZ2Vjb3VudApsaW1pdAp0b3RhbARpZAZ2b2QOcGxheXVybBJwbGF5TGlzdHOGAWh0dHA6Ly9saXZlLnlqMTIxMS53b3JrL2FwaS9saXZlL2dldFJvb21JbmZvP3BsYXRmb3JtPWRvdXl1JnJvb21JZD0Mcm9vbUlkDnJvb21QaWMHPdgf3CAAGGNhdGVnb3J5TmFtZRB2b2RfdHlwZRM92DDdcgBvAG8AbQBJAGQAIAAPPdhl3ChXv366TnBlIAAMb25saW5lEnZvZF9hY3Rvcgc82JndIAASb3duZXJOYW1lGHZvZF9kaXJlY3Rvcgs82PfftnIBYCAADGlzTGl2ZQljayhX9HatZAcqZwBfrWQWdm9kX2NvbnRlbnRqaHR0cDovL2xpdmUueWoxMjExLndvcmsvYXBpL2xpdmUvZ2V0UmVhbFVybD9wbGF0Zm9ybT0QcGxhdEZvcm0QJnJvb21JZD0Ia2V5cw5mb3JFYWNoC5dlfJzjiZBnMQAKdGl0bGU4aHR0cDovL2VwZy4xMTIxMTQueHl6L2RvdXl1LwZ1cmwLl2V8nOOJkGcyAEZodHRwczovL3d3dy5hb2lzLmV1Lm9yZy9saXZlL2RvdXl1LwuXZXyc44mQZzMAQGh0dHBzOi8vd3d3Lmdvb2RpcHR2LmNsdWIvZG91eXUvC5dlfJzjiZBnNABSaHR0cDovL21hb21hby5rYW5kaWFudHYuY24vZG91eXUxLnBocD9pZD0Ll2V8nOOJkGc1AHRodHRwczovL2dldHBsYXl1cmwubG10ZWFtLnJlcGwuY28vbGl2ZT9wbGF0Zm9ybT1kb3V5dSZyaWQ9CVOQf5UoV79+GnZvZF9wbGF5X2Zyb20CIxh2b2RfcGxheV91cmwIdGVzdBBKdXN0TGl2ZQIkCGZsYWcEd2QKcXVpY2sQZGF0YVBvc3QIanNvbigvYXBpL3NlYXJjaC9saXZlUm9vbUAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTUwMQZkaWQMb2Zmc2V0BHNrCGZvcm0Gc3RyDnJlcGxhY2UCJRB1bmVzY2FwZQ+kAwGmAwEAEKgDAAEAqgMADgAGAaABAAAAARELVgCqAwAMrAMACa4DAQmwAwIJsgMDCbQDBA22AwUBuAMGAboDBwG8AwgBvgMJAcADCgHCAwsBxAMMAcYDDQHIAw4BqAMPAQjoOb4AXwYAvgFfBwC+Al8IAL4DXwkA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 -------------------------------------------------------------------------------- /server/source/kuqimv_open.js: -------------------------------------------------------------------------------- 1 | // 修正:分类改静态 (网站频繁变动分类) 2 | import { load, _ } from "assets://js/lib/cat.js"; 3 | 4 | let key = "酷奇MV"; 5 | let HOST = "https://www.kuqimv.com"; 6 | let siteKey = ""; 7 | let siteType = 0; 8 | const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"; 9 | 10 | async function request(reqUrl, referer, mth, data, hd) { 11 | const headers = { 12 | "User-Agent": PC_UA, 13 | }; 14 | if (referer) headers.referer = encodeURIComponent(referer); 15 | let res = await req(reqUrl, { 16 | method: mth || "get", 17 | headers: headers, 18 | data: data, 19 | postType: mth === "post" ? "form" : "", 20 | }); 21 | return res.content; 22 | } 23 | 24 | async function init(cfg) { 25 | siteKey = cfg.skey; 26 | siteType = cfg.stype; 27 | } 28 | 29 | async function home(filter) { 30 | var classes = [{ "type_id": "1", "type_name": "华语高清" }, { "type_id": "2", "type_name": "日韩精选" }, { "type_id": "3", "type_name": "欧美MV" }, { "type_id": "4", "type_name": "高清现场" }, { "type_id": "5", "type_name": "影视MV" }, { "type_id": "6", "type_name": "夜店视频" }, { "type_id": "7", "type_name": "车模视频" }, { "type_id": "8", "type_name": "热舞视频" }, { "type_id": "9", "type_name": "美女写真" }, { "type_id": "10", "type_name": "美女打碟" }]; 31 | // const html = await request(HOST); 32 | // const $ = load(html); 33 | // const class_parse = $(".lei_fl > a[href*=play]"); 34 | // const classes = []; 35 | // classes = _.map(class_parse, (cls) => { 36 | // const typeId = cls.attribs["href"]; 37 | // typeId = typeId.substring(typeId.lastIndexOf("/") + 1).replace(".html", ""); 38 | // return { 39 | // type_id: typeId, 40 | // type_name: cls.children[0].data, 41 | // }; 42 | // }); 43 | const filterObj = {}; 44 | return JSON.stringify({ 45 | class: _.map(classes, (cls) => { 46 | cls.land = 1; 47 | cls.ratio = 1.78; 48 | return cls; 49 | }), 50 | filters: filterObj, 51 | }); 52 | } 53 | 54 | async function homeVod() { 55 | const link = HOST + "/play/9_1.html"; 56 | const html = await request(link); 57 | const $ = load(html); 58 | const items = $("div.mv_list > li"); 59 | let videos = _.map(items, (it) => { 60 | const a = $(it).find("a:first")[0]; 61 | const img = $(it).find("img:first")[0]; 62 | const singer = $($(it).find("div.singer")[0]).text().trim(); 63 | const remarks = $($(it).find("span.lei_03")[0]).text().trim(); 64 | return { 65 | vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), 66 | vod_name: a.attribs.title, 67 | vod_pic: img.attribs["src"], 68 | vod_remarks: "🎤" + singer + "|" + remarks || "", 69 | }; 70 | }); 71 | return JSON.stringify({ 72 | list: videos, 73 | }); 74 | } 75 | 76 | async function category(tid, pg, filter, extend) { 77 | if (pg <= 0 || typeof pg == "undefined") pg = 1; 78 | const link = HOST + "/play/" + tid + "_" + pg + ".html"; 79 | const html = await request(link); 80 | const $ = load(html); 81 | const items = $("div.mv_list > li"); 82 | let videos = _.map(items, (it) => { 83 | const a = $(it).find("a:first")[0]; 84 | const img = $(it).find("img:first")[0]; 85 | const singer = $($(it).find("div.singer")[0]).text().trim(); 86 | const remarks = $($(it).find("span.lei_03")[0]).text().trim(); 87 | return { 88 | vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), 89 | vod_name: a.attribs.title, 90 | vod_pic: img.attribs["src"], 91 | vod_remarks: "🎤" + singer + "|" + remarks || "", 92 | }; 93 | }); 94 | const hasMore = $("div.lei_page > a:contains(下一页)").length > 0; 95 | const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 96 | return JSON.stringify({ 97 | page: parseInt(pg), 98 | pagecount: pgCount, 99 | limit: 24, 100 | total: 24 * pgCount, 101 | list: videos, 102 | }); 103 | } 104 | 105 | async function detail(id) { 106 | const vod = { 107 | vod_id: id, 108 | vod_remarks: "", 109 | }; 110 | const playlist = ["观看视频" + "$" + id]; 111 | vod.vod_play_from = "道长在线"; 112 | vod.vod_play_url = playlist.join("#"); 113 | return JSON.stringify({ 114 | list: [vod], 115 | }); 116 | } 117 | 118 | async function play(flag, id, flags) { 119 | const link = HOST + "/skin/kuqimv/play.php"; 120 | const ref = HOST + "/play/" + id + ".html"; 121 | const pdata = { id: id }; 122 | const playUrl = JSON.parse(await request(link, ref, "post", pdata)).url; 123 | const headers = { 124 | Referer: HOST, 125 | }; 126 | return JSON.stringify({ 127 | parse: 0, 128 | url: playUrl, 129 | header: headers, 130 | }); 131 | } 132 | 133 | async function search(wd, quick, pg) { 134 | if (pg <= 0 || typeof pg == "undefined") pg = 1; 135 | const link = HOST + "/search.php?key=" + wd + "&pages=" + pg; 136 | const html = await request(link); 137 | const $ = load(html); 138 | const items = $("div.video_list > li"); 139 | let videos = _.map(items, (it) => { 140 | const a = $(it).find("a:first")[0]; 141 | const singer = $($(it).find("div.singer")[0]).text().trim(); 142 | const remarks = $($(it).find("span.lei_04")[0]).text().trim(); 143 | return { 144 | vod_id: a.attribs.href.replace(/.*?\/play\/(.*).html/g, "$1"), 145 | vod_name: a.attribs.title, 146 | vod_pic: "https://www.kuqimv.com/static/images/cover/singer.jpg", 147 | vod_remarks: "🎤" + singer + "|" + remarks || "", 148 | }; 149 | }); 150 | const hasMore = $("div.lei_page > a:contains(>)").length > 0; 151 | const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 152 | return JSON.stringify({ 153 | page: parseInt(pg), 154 | pagecount: pgCount, 155 | limit: 20, 156 | total: 20 * pgCount, 157 | list: videos, 158 | land: 1, 159 | ratio: 1.78, 160 | }); 161 | } 162 | 163 | export function __jsEvalReturn() { 164 | return { 165 | init: init, 166 | home: home, 167 | homeVod: homeVod, 168 | category: category, 169 | detail: detail, 170 | play: play, 171 | search: search, 172 | }; 173 | } -------------------------------------------------------------------------------- /server/source/dj0898_book_open.js: -------------------------------------------------------------------------------- 1 | import { load, _ } from "./lib/cat.js"; 2 | 3 | let key = "世纪DJ音乐网_book"; 4 | let HOST = "http://m.dj0898.com"; 5 | let siteKey = ""; 6 | let siteType = 0; 7 | 8 | const MOBILE_UA = "Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36"; 9 | 10 | async function request(reqUrl, agentSp) { 11 | let res = await req(reqUrl, { 12 | method: "get", 13 | headers: { 14 | "User-Agent": agentSp || MOBILE_UA, 15 | Referer: HOST, 16 | }, 17 | }); 18 | return res.content; 19 | } 20 | 21 | async function init(cfg) { 22 | siteKey = cfg.skey; 23 | siteType = cfg.stype; 24 | } 25 | 26 | async function home(filter) { 27 | const classes = [{ type_id: 1, type_name: "🎧串烧舞曲" }, { type_id: 2, type_name: "🎧外文舞曲" }, { type_id: 3, type_name: "🎧早场暖场" }, { type_id: 4, type_name: "🎧中文舞曲" }, { type_id: 5, type_name: "🎧其他舞曲" }, { type_id: 6, type_name: "🎧国外电音" }, { type_id: 8, type_name: "🎧慢歌连版" }, { type_id: 9, type_name: "🎧酒吧潮歌" }, { type_id: 10, type_name: "🎧中文串烧" }, { type_id: 11, type_name: "🎧外文串烧" }, { type_id: 12, type_name: "🎧中外串烧" }, { type_id: 13, type_name: "🎧车载串烧" }, { type_id: 14, type_name: "🎧越鼓串烧" }, { type_id: 40, type_name: "🎧3D/环绕" }, { type_id: 45, type_name: "🎧口水旋律" }, { type_id: 46, type_name: "🎧精品收藏" }, { type_id: 47, type_name: "🎧开场舞曲" }, { type_id: 48, type_name: "🎧印度舞曲" }, { type_id: 49, type_name: "🎧编排套曲" }, { type_id: 20, type_name: "🎧DuTch" }, { type_id: 21, type_name: "🎧Mash up" }, { type_id: 22, type_name: "🎧ClubHouse" }, { type_id: 23, type_name: "🎧ElectroHouse" }, { type_id: 24, type_name: "🎧越南鼓Dj" }, { type_id: 30, type_name: "🎧Funky" }, { type_id: 31, type_name: "🎧Reggae" }, { type_id: 32, type_name: "🎧Rnb" }, { type_id: 33, type_name: "🎧Hip Hop" }, { type_id: 34, type_name: "🎧Dubstep" }, { type_id: 8017, type_name: "🎧Hardstyle" }, { type_id: 8018, type_name: "🎧Hands Up" }]; 28 | const filterObj = {}; 29 | return JSON.stringify({ 30 | class: _.map(classes, (cls) => { 31 | cls.land = 1; 32 | cls.ratio = 1.78; 33 | return cls; 34 | }), 35 | filters: filterObj, 36 | }); 37 | } 38 | 39 | async function homeVod() { 40 | const link = HOST + "/dance/lists/id/10/1"; 41 | const html = await request(link); 42 | const $ = load(html); 43 | const list = $("ul.djddv_djList > li"); 44 | let videos = _.map(list, (it) => { 45 | const a = $(it).find("a")[1]; 46 | const img = $(it).find("img:first")[0]; 47 | const tt = $(it).find("strong:first")[0]; 48 | const remarks = $(it).find("font")[5]; 49 | return { 50 | vod_id: a.attribs.href, 51 | vod_name: tt.children[0].data, 52 | vod_pic: img.attribs["src"], 53 | vod_remarks: "🎵" + remarks.children[0].data || "", 54 | }; 55 | }); 56 | return JSON.stringify({ 57 | list: videos, 58 | }); 59 | } 60 | 61 | async function category(tid, pg, filter, extend) { 62 | if (pg <= 0 || typeof pg == "undefined") pg = 1; 63 | const link = HOST + "/dance/lists/id/" + tid + "/" + pg; 64 | const html = await request(link); 65 | const $ = load(html); 66 | const list = $("ul.djddv_djList > li"); 67 | let videos = _.map(list, (it) => { 68 | const a = $(it).find("a")[1]; 69 | const img = $(it).find("img:first")[0]; 70 | const tt = $(it).find("strong:first")[0]; 71 | const remarks = $(it).find("font")[5]; 72 | return { 73 | book_id: a.attribs.href, 74 | book_name: tt.children[0].data, 75 | book_pic: img.attribs["src"], 76 | book_remarks: "🎵" + remarks.children[0].data || "", 77 | }; 78 | }); 79 | const hasMore = $("ul.page_link > li > a:contains(\u00a0)").length > 0; 80 | const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 81 | return JSON.stringify({ 82 | page: parseInt(pg), 83 | pagecount: pgCount, 84 | limit: 60, 85 | total: 60 * pgCount, 86 | list: videos, 87 | }); 88 | } 89 | 90 | async function detail(id) { 91 | const vod = { 92 | book_id: id, 93 | type_name: '', 94 | book_year: '', 95 | book_area: '', 96 | book_remarks: '', 97 | book_actor: '', 98 | book_director: '', 99 | book_content: '', 100 | }; 101 | const playlist = ["点击播放" + "$" + vod.book_id]; 102 | vod.volumes = "道长在线"; 103 | vod.urls = playlist.join("#"); 104 | return JSON.stringify({ 105 | list: [vod], 106 | }); 107 | } 108 | 109 | async function play(flag, id, flags) { 110 | const html = await request(id); 111 | const $ = load(html); 112 | const audio = $("body audio[src*=http]"); 113 | const audioUrl = audio[0].attribs.src; 114 | // console.debug('世纪DJ音乐网 audioUrl =====>' + audioUrl); // js_debug.log 115 | return JSON.stringify({ 116 | parse: 0, 117 | url: audioUrl, 118 | }); 119 | } 120 | 121 | async function search(wd, quick, pg) { 122 | if (pg <= 0 || typeof pg == "undefined") pg = 1; 123 | const link = HOST + "/index.php/dance/so/key?key=" + wd + "&cid=0&p=" + pg; 124 | const html = await request(link); 125 | const $ = load(html); 126 | const list = $("ul.djddv_djList > li"); 127 | let videos = _.map(list, (it) => { 128 | const a = $(it).find("a")[1]; 129 | const img = $(it).find("img:first")[0]; 130 | const tt = $(it).find("strong:first")[0]; 131 | const remarks = $(it).find("font:first")[0]; 132 | return { 133 | book_id: a.attribs.href, 134 | book_name: tt.children[0].data, 135 | book_pic: img.attribs["src"], 136 | book_remarks: "🎵" + remarks.children[0].data || "", 137 | }; 138 | }); 139 | const hasMore = $("ul.page_link > li > a:contains(\u00a0)").length > 0; 140 | const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 141 | return JSON.stringify({ 142 | page: parseInt(pg), 143 | pagecount: pgCount, 144 | limit: 60, 145 | total: 60 * pgCount, 146 | list: videos, 147 | land: 1, 148 | ratio: 1.78, 149 | }); 150 | } 151 | 152 | export function __jsEvalReturn() { 153 | return { 154 | init: init, 155 | home: home, 156 | homeVod: homeVod, 157 | category: category, 158 | detail: detail, 159 | play: play, 160 | search: search, 161 | }; 162 | } -------------------------------------------------------------------------------- /server/source/kkys_open.js: -------------------------------------------------------------------------------- 1 | import{Crypto,dayjs,jinja2,_}from"assets://js/lib/cat.js";let key="kkys",url="https://api1.baibaipei.com:8899",device={},siteKey="",siteType=0;async function request(reqUrl,postData,agentSp,get){var ts=dayjs().valueOf().toString(),rand=randStr(32),sign=Crypto.MD5("abcdexxxdd2daklmn25129_"+ts+"_"+rand).toString().toLowerCase(),agentSp={"user-agent":agentSp||device.ua},sign=(reqUrl.includes("baibaipei")&&(agentSp["device-id"]=device.id,agentSp["push-token"]="",agentSp.sign=sign,agentSp.time=ts,agentSp.md5=rand,agentSp.version="2.1.3",agentSp["system-model"]=device.model,agentSp["system-brand"]=device.brand,agentSp["system-version"]=device.release),await req(reqUrl,{method:get?"get":"post",headers:agentSp,data:postData||{},postType:get?"":"form"}));return sign.content}async function init(cfg){siteKey=cfg.skey,siteType=cfg.stype;cfg=await local.get(key,"device");if(0|《|》/g,"").replace(/\$|#/g," ").trim()}function jsonParse(input,json){try{let url=json.url??"";if(!(url=url.startsWith("//")?"https:"+url:url).startsWith("http"))return{};let headers=json.headers||{};var ua=(json["user-agent"]||"").trim(),referer=(0{headers[hk]||delete headers[hk]}),{header:headers,url:url}}catch(error){console.log(error)}return{}}function __jsEvalReturn(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export{__jsEvalReturn}; -------------------------------------------------------------------------------- /server/source/huya_bytecode.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1CvARhodXlhX29wZW4uanMsYXNzZXRzOi8vanMvbGliL2NhdC5qcxxfX2pzRXZhbFJldHVybgxDcnlwdG8CXwZrZXkISE9TVA5zaXRlS2V5EHNpdGVUeXBlBFVBDnJlcXVlc3QIaW5pdAhob21lDmhvbWVWb2QQY2F0ZWdvcnkMZGV0YWlsCHBsYXkMc2VhcmNoFHJlbW92ZVRhZ3MYYmFzZTY0RW5jb2RlGGJhc2U2NERlY29kZRRnZXRSZWFsVXJsGmRlY29kZVVuaWNvZGUIaHV5YShodHRwczovL3d3dy5odXlhLmNvbfIBTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzkxLjAuNDQ3Mi4xMTQgU2FmYXJpLzUzNy4zNgxyZXFVcmwEdWEMYnVmZmVyBnJlcwZyZXEMbWV0aG9kFFVzZXItQWdlbnQOaGVhZGVycw5jb250ZW50BmNmZwhza2V5CnN0eXBlDGZpbHRlcg5jbGFzc2VzEmZpbHRlck9iagh0eXBlDHR5cGVJZAhsaW5rFGZpbHRlckRhdGEIdGFncwJlDnR5cGVfaWQFMVpQThJ0eXBlX25hbWUFUX84bgVVUzpnBUtiOG54aHR0cHM6Ly9saXZlLmNkbi5odXlhLmNvbS9saXZlY29uZmlnL2dhbWUvYnVzc0xpdmU/YnVzc1R5cGU9CnBhcnNlCGRhdGEMY2F0ZUlkBQZSe3wGbWFwAnYOY29uc29sZQpkZWJ1Zx5maWx0ZXJPYmogPT09PiASc3RyaW5naWZ5DmZpbHRlcnMCbhhnYW1lRnVsbE5hbWUGZ2lkBmNscwhsYW5kCnJhdGlvDHZpZGVvc4wBL2NhY2hlLnBocD9tPUxpdmVMaXN0JmRvPWdldExpdmVMaXN0QnlQYWdlJmdhbWVJZD0yMTY4JnRhZ0FsbD0wJnBhZ2U9MQpkYXRhcwhsaXN0BGl0BnBpYxRzY3JlZW5zaG90FHN0YXJ0c1dpdGgELy8MaHR0cHM6FnByb2ZpbGVSb29tDHZvZF9pZBhpbnRyb2R1Y3Rpb24Qdm9kX25hbWUOdm9kX3BpYwU92EHcFHRvdGFsQ291bnQJIAAgADzYmd0IbmljaxZ2b2RfcmVtYXJrcwZ0aWQEcGcMZXh0ZW5kZC9jYWNoZS5waHA/bT1MaXZlTGlzdCZkbz1nZXRMaXZlTGlzdEJ5UGFnZSZnYW1lSWQ9HiZ0YWdBbGw9MCZwYWdlPQhwYWdlEnRvdGFsUGFnZRJwYWdlY291bnQQcGFnZVNpemUKbGltaXQKdG90YWwEaWQGdm9kEHBsYXlsaXN0Cblw+1GtZD5lAiQJU5B/lShXv34adm9kX3BsYXlfZnJvbQIjGHZvZF9wbGF5X3VybAhmbGFnCGpzb24IcHVybHZodHRwczovL21wLmh1eWEuY29tL2NhY2hlLnBocD9tPUxpdmUmZG89cHJvZmlsZVJvb20mcm9vbWlkPQxzdHJlYW0GZmx2Em11bHRpTGluZQZ1cmwWTW96aWxsYS81LjAMaGVhZGVyBHdkCnF1aWNreGh0dHBzOi8vc2VhcmNoLmNkbi5odXlhLmNvbS8/bT1TZWFyY2gmZG89Z2V0U2VhcmNoQ29udGVudCZxPVomdWlkPTAmdj00JnR5cD0tNSZsaXZlc3RhdGU9MCZyb3dzPTQwJnN0YXJ0PTAQcmVzcG9uc2UIZG9jcx5nYW1lX3NjcmVlbnNob3QOcm9vbV9pZCJnYW1lX2ludHJvZHVjdGlvbiBnYW1lX3RvdGFsX2NvdW50EmdhbWVfbmljaw5yZXBsYWNlCHRleHQGZW5jDEJhc2U2NAhVdGY4EGxpdmVfdXJsAmkCYgJyAnMKY190bXAMY190bXAyCHRtcDIEZm0CdQJwAmYEbGwCdAJoAm0CPwIvBnBvcAImDmZvckVhY2gCPSRkZWNvZGVVUklDb21wb25lbnQOZ2V0VGltZQgwMDAwDHdzVGltZQZNRDUUP3dzU2VjcmV0PRAmd3NUaW1lPQYmdT0OJnNlcWlkPQZobHMIbTN1OAZ0bXAIcHVzaAZzdHICJRB1bmVzY2FwZQ+kAwGmAwEAFKgDAAIAqgMAAawDAA4ABgGgAQAAAAEVDmcAqgMADKwDAQyuAwAJsAMBCbIDAgm0AwMJtgMEDbgDBQG6AwYBvAMHAb4DCAHAAwkBwgMKAcQDCwHGAwwByAMNAcoDDgHMAw8BzgMQAdADEQGoAxIBCOhIvgBfBwC+AV8IAL4CXwkAvgNfCgC+BF8LAL4FXwwA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 -------------------------------------------------------------------------------- /server/source/boosj_open.js: -------------------------------------------------------------------------------- 1 | import { load, _ } from './lib/cat.js'; 2 | 3 | let key = '童趣'; 4 | let HOST = 'https://www.boosj.com'; 5 | let siteKey = ''; 6 | let siteType = 0; 7 | 8 | const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; 9 | 10 | async function request(reqUrl, agentSp) { 11 | let res = await req(reqUrl, { 12 | method: 'get', 13 | headers: { 14 | 'User-Agent': agentSp || MOBILE_UA, 15 | 'Referer': HOST 16 | }, 17 | }); 18 | return res.content; 19 | } 20 | 21 | // cfg = {skey: siteKey, ext: extend} 22 | async function init(cfg) { 23 | siteKey = cfg.skey; 24 | siteType = cfg.stype; 25 | } 26 | 27 | async function home(filter) { 28 | const classes = [{ type_id: '', type_name: '全部' }, { type_id: 28, type_name: '辅食' }, { type_id: 582, type_name: '动画' }, { type_id: 3364, type_name: '儿童舞蹈' }, { type_id: 3366, type_name: '少儿英语' }, { type_id: 3367, type_name: '儿童歌曲' }, { type_id: 3622, type_name: '才艺' }, { type_id: 3782, type_name: '播视自制' }, { type_id: 3822, type_name: '故事' }, { type_id: 3842, type_name: '亲子教育' }, { type_id: 4402, type_name: '美术' }, { type_id: 4583, type_name: '其他' }, { type_id: 4762, type_name: '儿童游戏' }, { type_id: 4842, type_name: '识物' }, { type_id: 4843, type_name: '绘本' }, { type_id: 4844, type_name: '古诗' }, { type_id: 4845, type_name: '科普' }, { type_id: 5102, type_name: '儿童玩具' }, { type_id: 5142, type_name: '播视童趣儿童玩具' }]; 29 | const filterObj = {}; 30 | const jsonData = [ 31 | { 32 | key: 'age', 33 | name: '年龄段', 34 | value: [ 35 | { n: '全部', v: '' }, 36 | { n: '6岁以上', v: '?p367=370' }, 37 | { n: '3~6岁', v: '?p367=369' }, 38 | { n: '0~3岁', v: '?p367=368' }, 39 | ], 40 | init: '', 41 | }, 42 | { 43 | key: 'by', 44 | name: '排序', 45 | value: [ 46 | { n: '全部', v: '' }, 47 | { n: '最新发布', v: 'lately' }, 48 | { n: '最多播放', v: 'pop' }, 49 | { n: '最多评论', v: 'view' }, 50 | ], 51 | init: '', 52 | }, 53 | ]; 54 | return JSON.stringify({ 55 | class: _.map(classes, (cls) => { 56 | cls.land = 1; 57 | cls.ratio = 1.78; 58 | filterObj[cls.type_id] = jsonData; 59 | return cls; 60 | }), 61 | filters: filterObj, 62 | }); 63 | } 64 | 65 | async function homeVod() { 66 | const link = HOST + '/search_res_3362__3364_1_.html'; 67 | const html = await request(link); 68 | const $ = load(html); 69 | const items = $('body div.bj-col4:has(h3)'); 70 | let videos = _.map(items, (it) => { 71 | const a = $(it).find('a:first')[0]; 72 | const img = $(it).find('img:first')[0]; 73 | const remarks = $(it).find('span.played')[0]; 74 | return { 75 | vod_id: a.attribs.href, 76 | vod_name: a.attribs.title, 77 | vod_pic: img.attribs['data-original'], 78 | vod_remarks: remarks.children[0].data || '', 79 | }; 80 | }); 81 | return JSON.stringify({ 82 | list: videos, 83 | }); 84 | } 85 | 86 | async function category(tid, pg, filter, extend) { 87 | if (pg <= 0 || typeof (pg) == 'undefined') pg = 1; 88 | const link = HOST + '/search_res_3362__' + tid + '_' + pg + '_' + (extend.by || '') + '.html' + (extend.age || ''); 89 | const html = await request(link); 90 | const $ = load(html); 91 | const items = $('body div.bj-col4:has(h3)'); 92 | let videos = _.map(items, (it) => { 93 | const a = $(it).find('a:first')[0]; 94 | const img = $(it).find('img:first')[0]; 95 | const remarks = $(it).find('span.played')[0]; 96 | return { 97 | vod_id: a.attribs.href, 98 | vod_name: a.attribs.title, 99 | vod_pic: img.attribs['data-original'], 100 | vod_remarks: remarks.children[0].data || '', 101 | }; 102 | }); 103 | const hasMore = $('div.pub_paging > a:contains(下一页)').length > 0; 104 | const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 105 | return JSON.stringify({ 106 | page: parseInt(pg), 107 | pagecount: pgCount, 108 | limit: 30, 109 | total: 30 * pgCount, 110 | list: videos, 111 | }); 112 | } 113 | 114 | async function detail(id) { 115 | const vod = { 116 | vod_id: id, 117 | vod_remarks: "", 118 | }; 119 | const playlist = ["点击播放" + "$" + vod.vod_id]; 120 | vod.vod_play_from = "道长在线"; 121 | vod.vod_play_url = playlist.join("#"); 122 | return JSON.stringify({ 123 | list: [vod], 124 | }); 125 | } 126 | 127 | async function play(flag, id, flags) { 128 | const body = JSON.parse(await request('https://gslb.boosj.com/ipv2.json')); 129 | body._id = id.match(/\d+/)[0]; 130 | const json = JSON.parse(await request(buildUrl(body.gslb, body))); 131 | const purl = json.url + '?' + json.t 132 | // console.debug('童趣purl =====>' + purl); // js_debug.log 133 | let headers = { 134 | 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; 22081212C Build/PQ3B.190801.002)', 135 | }; 136 | return JSON.stringify({ 137 | parse: 0, 138 | url: purl, 139 | header: headers, 140 | }); 141 | } 142 | 143 | async function search(wd, quick) { 144 | var data = JSON.parse(await request('https://search.boosj.com/m_ajax?q=' + wd + '&p=' + pg + '&typeId=3362')).body; 145 | let videos = _.map(data.result, (it) => { 146 | return { 147 | vod_id: it.playUrl, 148 | vod_name: it.resourceName, 149 | vod_pic: it.imageUrl, 150 | vod_remarks: it.clickNumStr || '', 151 | } 152 | }); 153 | return JSON.stringify({ 154 | page: parseInt(pg), 155 | pagecount: data.pageCount, 156 | limit: 30, 157 | total: data.rowCount, 158 | list: videos, 159 | }); 160 | } 161 | 162 | function buildUrl(url, obj) { 163 | obj = obj || {}; 164 | if (url.indexOf('?') < 0) { 165 | url += '?' 166 | } 167 | let param_list = []; 168 | let keys = Object.keys(obj); 169 | keys.forEach(it => { 170 | param_list.push(it + '=' + obj[it]) 171 | }); 172 | let prs = param_list.join('&'); 173 | if (keys.length > 0 && !url.endsWith('?')) { 174 | url += '&' 175 | } 176 | url += prs; 177 | return url 178 | } 179 | 180 | export function __jsEvalReturn() { 181 | return { 182 | init: init, 183 | home: home, 184 | homeVod: homeVod, 185 | category: category, 186 | detail: detail, 187 | play: play, 188 | search: search, 189 | }; 190 | } -------------------------------------------------------------------------------- /server/source/shuyinfm_bytecode.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1CqASBzaHV5aW5mbV9vcGVuLmpzLGFzc2V0czovL2pzL2xpYi9jYXQuanMcX19qc0V2YWxSZXR1cm4IbG9hZAJfBmtleQhIT1NUDnNpdGVLZXkQc2l0ZVR5cGUSTU9CSUxFX1VBDGNvb2tpZQxNWV9VUkwOcmVxdWVzdAhwb3N0FGdldEhlYWRlcnMSZ2V0Q29va2llCGluaXQIaG9tZRBjYXRlZ29yeQxkZXRhaWwIcGxheQxzZWFyY2gaZGVjb2RlVW5pY29kZQlmTvOXRgBNACxodHRwczovL20uc2h1eWluZm0uY29ttAJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgQVNVU19aMDFRRCBCdWlsZC9QUTNCLjE5MDgwMS4wMDI7IHd2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvOTEuMC40NDcyLjExNCBTYWZhcmkvNTM3LjM2DHJlcVVybAR1YQxidWZmZXIGcmVzBnJlcQxtZXRob2QUVXNlci1BZ2VudA5oZWFkZXJzDmNvbnNvbGUKZGVidWcicmVzLmNvbnRlbnQgPT09PiAOY29udGVudBBwb3N0RGF0YRBwb3N0dHlwZQhkYXRhDnRpbWVvdXQQcG9zdFR5cGUOaXNFbXB0eQxyZXN1bHQgc2V0Q29va2llSGVhZGVycxRzZXQtY29va2llBm1hcARrawI7BmNmZwhza2V5CnN0eXBlDGZpbHRlcghodG1sAiQOY2xhc3NlcxJmaWx0ZXJPYmoEaXQQdHlwZU5hbWUMdHlwZUlkCmZpbEJ5EC9zZWFyY2gvSGRsLnBkLWNsYXNzID4gZGQgPiBhW2hyZWYqPWxpc3RpbmZvXQU82KffEGNoaWxkcmVuDmF0dHJpYnMIaHJlZgptYXRjaAhwdXNoDnR5cGVfaWQSdHlwZV9uYW1lBGJ5BZJjj14FAGewZQJuEG5ld3N0aW1lAnYFuk4UbA5vbmNsaWNrEnN0cmluZ2lmeQ5maWx0ZXJzBmNscwZ0aWQEcGcMZXh0ZW5kCmJvb2tzDmhhc01vcmUOcGdDb3VudDgvZS9hY3Rpb24vTGlzdEluZm8ucGhwP3BhZ2U9EHBhcnNlSW50HiZtaWQ9NSZjbGFzc2lkPTQmbGluZT0yNCZ0ZW1waWQ9NSZvcmRlcmJ5PRQmbXlvcmRlcj0wLnVsLmJvb2stb2wgPiBsaS5ib29rLWxpOWQAaQB2AC4AcABhAGcAaQBuAGcAIAA+ACAAYQA6AGMAbwBuAHQAYQBpAG4AcwAoAAtOAE51mCkACHBhZ2UScGFnZWNvdW50CmxpbWl0CnRvdGFsCGxpc3QIYm9vawJhCmJuYW1lBmltZw5yZW1hcmtzEHJlbWFya3MyCGZpbmQOYTpmaXJzdBpoNC5ib29rLXRpdGxlCHRleHQSaW1nOmZpcnN0GmRpdi5ib29rLW1ldGEWcC5ib29rLWRlc2MOYm9va19pZBJib29rX25hbWUaZGF0YS1vcmlnaW5hbEZodHRwczovL20uc2h1eWluZm0uY29tL2Nzcy9kZW1vLmpwZxBib29rX3BpYwU82KTfBT3YMN0YYm9va19yZW1hcmtzBGlkEHBsYXlsaXN0BHVzEkhPU1QgKyBpZC5kaXYuYm9vay1yYW5kLWE6ZXEoMCkgYQh0cmltEmJvb2tfdHlwZSpkaXYuYm9vay1yYW5kLWE6ZXEoMikSYm9va195ZWFyEmJvb2tfYXJlYS5kaXYuYm9vay1yYW5kLWE6ZXEoMykgYRRib29rX2FjdG9yGmJvb2tfZGlyZWN0b3IYZGl2LmJvb2stZGVzGGJvb2tfY29udGVudDZkaXYucGxheS1saXN0ID4gdWwgPiBsaSA+IGECIwlTkH+VKFe/fg52b2x1bWVzCHVybHMCYg5yZXBsYWNlBCQxEHNlZ21lbnRzCGZsYWcIY29kZQZ1cmwIcHVybBwjanAtbGluZXMgPiBsaRJkYXRhLWNvZGUKcGFyc2UEd2QKcXVpY2sIbGluawpzZGF0YQRqbyYvZS9zZWFyY2gvaW5kZXgucGhwEHdkID09PT4gDE9yaWdpbi5odHRwczovL20uc2h1eWluZm0uY29tLw5SZWZlcmVyEGtleWJvYXJkbnRpdGxlLCBuZXdzdGV4dCwgcGxheWVyLCBwbGF5YWRtaW4sIG1vdmlldGltZSwgZmlsZXR5cGUIc2hvdwhmb3JtBnN0cgIlEHVuZXNjYXBlD6QDAaYDAQAVqAMAAgCqAwABrAMADgAGAaABAAAAARYNagCqAwAMrAMBDK4DAAmwAwEJsgMCCbQD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 -------------------------------------------------------------------------------- /server/source/jojo_bytecode.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1CkARhqb2pvX29wZW4uanMYLi9saWIvY2F0LmpzHF9fanNFdmFsUmV0dXJuDENyeXB0bwhsb2FkAl8KZGF5anMGa2V5BnVybA5zaXRlS2V5EHNpdGVUeXBlBFVBDGNvb2tpZQ5yZXF1ZXN0CGluaXQIaG9tZQ5ob21lVm9kEGNhdGVnb3J5GHN0cmlwSHRtbFRhZwxkZXRhaWwOcGxheVBpZAhwbGF5DHNlYXJjaAxqaW9odWIkaHR0cHM6Ly9qaW9odWIudG9wlgJNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzJfMyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMC4zIE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xDHJlcVVybA5yZWZlcmVyBm10aAhkYXRhBGhkDmhlYWRlcnMGcmVzFFVzZXItQWdlbnQGbWFwAjsMQ29va2llJGVuY29kZVVSSUNvbXBvbmVudAZyZXEMbWV0aG9kCHBvc3QIZm9ybRBwb3N0VHlwZQ5jb250ZW50Aj0GY2ZnCHNrZXkKc3R5cGUMZmlsdGVyCGh0bWwCJAxzZXJpZXMOY2xhc3NlczIubmF2LWxpc3QgYVtocmVmKj0vdmlkZW9dEnN0cmluZ2lmeQJzDHR5cGVJZBB0eXBlTmFtZQ5hdHRyaWJzCGhyZWYKbWF0Y2gkZGVjb2RlVVJJQ29tcG9uZW50DnR5cGVfaWQSdHlwZV9uYW1lBHt9BnRpZARwZwxleHRlbmQIcGFnZQhsaW5rCml0ZW1zDHZpZGVvcwp0b3RhbAZwYWcKZXJyb3IOL3ZpZGVvLww/cGFnZT0QJnNpemU9MTgoZGl2LmNvbnRlbnQtYm9keSA+IGEadWktcGFnaW5hdGlvbhBwYXJzZUludAhjZWlsEnBhZ2Vjb3VudAhsaXN0CGl0ZW0GaW1nAmECbgpzcGVlZApzY29yZQhmaW5kEmltZzpmaXJzdAZzcmMYcC5jYXJkLXRpdGxlEGNoaWxkcmVuGHAuaXRlbS1zcGVlZA5wLnNjb3JlDHZvZF9pZBB2b2RfbmFtZQ52b2RfcGljFnZvZF9yZW1hcmtzDnJlcGxhY2UC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 -------------------------------------------------------------------------------- /server/source/hula8_bytecode.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1C/ARpodWxhOF9vcGVuLmpzLGFzc2V0czovL2pzL2xpYi9jYXQuanMcX19qc0V2YWxSZXR1cm4MQ3J5cHRvCGxvYWQCXwZrZXkISE9TVA5zaXRlS2V5EHNpdGVUeXBlClBDX1VBDnJlcXVlc3QIaW5pdAhob21lDmhvbWVWb2QQY2F0ZWdvcnkMZGV0YWlsCHBsYXkMc2VhcmNoGGJhc2U2NEVuY29kZRhiYXNlNjREZWNvZGUHZmurTidUKmh0dHBzOi8vd3d3Lmh1bGE4Lm5ldN4BTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNi4wLjAuMCBTYWZhcmkvNTM3LjM2DHJlcVVybA5hZ2VudFNwBnJlcwZyZXEMbWV0aG9kFFVzZXItQWdlbnQsaHR0cHM6Ly93d3cuaHVsYTgubmV0Lw5yZWZlcmVyPmVzY19zZWFyY2hfY2FwdGNoYT0xO3Jlc3VsdD0xMjsMQ29va2llDmhlYWRlcnMOY29udGVudAZjZmcIc2tleQpzdHlwZQxmaWx0ZXIOY2xhc3NlcxJmaWx0ZXJPYmoIbW1hLw50eXBlX2lkC00ATQBBAFuNi04SdHlwZV9uYW1lPHVmYy1maWdodGluZy1jaGFtcGlvbnNoaXAuaHRtbBFVAEYAQwDIfoFnPGiXZVuNKHVmYy1maWdodC1uaWdodC5odG1sD1UARgBDADxol2VLThxZRmJlbGxhdG9yLWZpZ2h0aW5nLWNoYW1waW9uc2hpcC5odG1sF0IAZQBsAGwAYQB0AG8AcgA8aJdlW41CcHJvZmVzc2lvbmFsLWZpZ2h0ZXJzLWxlYWd1ZS5odG1sDVAARgBMADxol2VbjUBsZWdhY3ktZmlnaHRpbmctYWxsaWFuY2VsZmEuaHRtbA1MAEYAQQA8aJdlW40Ob25lLWZjLw1PAE4ARQCgUZtRW40yb25lLWZjL29uZS1mcmlkYXktZmlnaHRzLxFPAE4ARQBoVJROPGiXZRxZEGpjay5odG1sDUoAQwBLABhiyYnOVxR3bGx6ZC5odG1sC2Zrl2c8ey1O+Vs6a29uZnJvbnRhY2phLXN6dHVrLXdhbGtpLmh0bWwRSwBTAFcA4mxwUTxol2VbjUBlYWdsZS1maWdodGluZy1jaGFtcGlvbnNoaXAuaHRtbBNFAGEAZwBsAGUAD1xwnluNi05CYWJzb2x1dGUtY2hhbXBpb25zaGlwLWFraG1hdC5odG1sEcRPV3+vZUEAQwBBAFuNi04KYm9qaS8J2XrLeg9k+1EQay0xLmh0bWweSy0xIEpBUEFOIEdST1VQFGtydXNoLmh0bWwZSwAtADEA12ULTksAcgB1AHMAaABbjYtOEnJpc2UuaHRtbA9SAEkAUwBFACKO82JbjRh3bGYyMDA0Lmh0bWwRZmuXZ86YIAAtAFcATABGABRrdW5sdW5qdWUvEQZm0U6zUSAALQBLAEwASgAUZ2xvcnkuaHRtbBVHAGwAbwByAHkAY4MAgDxol2VbjRZ0aGFpLWZpZ2h0LwXwbPNiQnRoYWktZmlnaHQta2luZy1vZi1tdWF5LXRoYWkuaHRtbAfwbEtOGGI8YXJ0aWNsZS90YWcvdGhhaS1maWdodC1sZWFndWUvIlRIQUkgRklHSFQgTEVBR1VFDnF1YW5qaS8F82L7USBkYXpuLWJveGluZy5odG1sFkRBWk4gQm94aW5nHnBiYy1ib3hpbmcuaHRtbBRQQkMgQm94aW5nKHRvcC1yYW5rLWJveGluZy5odG1sHlRvcCBSYW5rIEJveGluZzRkYXpuLW1hdGNocm9vbS1ib3hpbmcuaHRtbCBNYXRjaHJvb20gQm94aW5nTmJhcmUta251Y2tsZS1maWdodGluZy1jaGFtcGlvbnNoaXAuaHRtbBP4iPNiPGiXZVuNQgBLAEYAQwBGaGFyZGNvcmUtZmlnaHRpbmctY2hhbXBpb25zaGlwLmh0bWwb+IjzYkgAYQByAGQAYwBvAHIAZQAgAEYAQwBEdG9wLWRvZy1maWdodGluZy1jaGFtcGlvbnNoaXAuaHRtbBn4iPNiVABPAFAAIABEAE8ARwAgAEYAQwAMb3RoZXIvCXZR1k7Ua1uNEnN0cmluZ2lmeQZtYXAOZmlsdGVycwZjbHMIbGFuZApyYXRpbwR7fQZ0aWQEcGcMZXh0ZW5kCGxpbmsIaHRtbAIkDGpzQmFzZQppdGVtcwx2aWRlb3MOaGFzTW9yZQ5wZ0NvdW50Ai8ML3BhZ2UvDnJlcGxhY2UGLy9wBC9wEGpz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 -------------------------------------------------------------------------------- /server/source/duanju.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1DIAR5kdWFuanU1X29wZW4uanMsYXNzZXRzOi8vanMvbGliL2NhdC5qcxxfX2pzRXZhbFJldHVybgxDcnlwdG8IbG9hZAJfBmtleQhIT1NUDnNpdGVLZXkQc2l0ZVR5cGUSTU9CSUxFX1VBDnJlcXVlc3QIaW5pdAhob21lDmhvbWVWb2QQY2F0ZWdvcnkMZGV0YWlsCHBsYXkMc2VhcmNoGGJhc2U2NERlY29kZRpkZWNvZGVVbmljb2RlB+13Z1JRfypodHRwczovL20uZHVhbmp1NS5jb22WAk1vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfMl8zIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMy4wLjMgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEMcmVxVXJsDmFnZW50U3AGcmVzBnJlcQxtZXRob2QUVXNlci1BZ2VudA5oZWFkZXJzDmNvbnNvbGUKZGVidWcYcmVxVXJsID09PT4gInJlcy5jb250ZW50ID09PT4gDmNvbnRlbnQGY2ZnCHNrZXkKc3R5cGUMZmlsdGVyDmNsYXNzZXMSZmlsdGVyT2JqDGZpbExldApmaWxCeQhuaXhpDnR5cGVfaWQFBpCtiBJ0eXBlX25hbWUSdGlhbmNob25nBRx1oFsObnVlbGlhbgVQhktgEGNodWFueXVlBX96io0UY2hvbmdzaGVuZwXNkR91DGxldHRlcgVXW81rBWhR6JACbgJ2AkECQgJDAkQCRQJGAkcCSAJJAkoCSwJMAk0CTgJPAlACUQJSAlMCVAJVAlYCVwJYAlkCWgRieQWSY49eBfZl9JUIdGltZQW6ThRsCGhpdHMFxIsGUgpzY29yZRJzdHJpbmdpZnkGbWFwDmZpbHRlcnMGY2xzAmkIcHVzaAR7fQZ0aWQEcGcMZXh0ZW5kCGxpbmsIaHRtbAIkCml0ZW1zDHZpZGVvcw5oYXNNb3JlDnBnQ291bnQSL3ZvZHNob3cvBC0tBi0tLRAtLS0uaHRtbDgubW9kdWxlLWl0ZW1zID4gLm1vZHVsZS1pdGVtNWQAaQB2ACMAcABhAGcAZQAgAD4AIABhADoAYwBvAG4AdABhAGkAbgBzACgAC04ATnWYKQAQcGFyc2VJbnQIcGFnZRJwYWdlY291bnQKbGltaXQKdG90YWwIbGlzdAhpdGVtAmEIdnBpYw5yZW1hcmtzCGZpbmQOYTpmaXJzdBJpbWc6Zmlyc3QOYXR0cmlicxBkYXRhLXNyYyhkaXYubW9kdWxlLWl0ZW0tdGV4dBBjaGlsZHJlbghkYXRhCGhyZWYOcmVwbGFjZQQkMQx2b2RfaWQKdGl0bGUQdm9kX25hbWUUc3RhcnRzV2l0aAQvLwxodHRwczoCLw52b2RfcGljFnZvZF9yZW1hcmtzBGlkCHRhZ3MGdm9kDnBsYXlNYXAIdGFicxJwbGF5bGlzdHMIdXJscxh2b2RfcGxheV91cmwWL3ZvZGRldGFpbC8KLmh0bWwyZGl2LnZpZGVvLWluZm8taXRlbTplcSgxKQh0ZXh0GmgxLnBhZ2UtdGl0bGUIdHJpbRJ2b2RfYWN0b3IYZGl2LnRhZy1saW5rEHZvZF90eXBlGGltZy5sYXp5bG9hZEJkaXYudmlkZW8taW5mby1jb250ZW50IHNwYW46Zmlyc3QWdm9kX2NvbnRlbnQSdm9kID09PT4gZmRpdi5tb2R1bGUtdGFiLWNvbnRlbnQ6Zmlyc3QgPiBkaXZbY2xhc3MqPXRhYi1pdGVtXQhzcGFuGmRpdi5zb3J0LWl0ZW0IZWFjaAhrZXlzBiQkJBp2b2RfcGxheV9mcm9tBnRhYgRpdA5wbGF5VXJsHGhhc093blByb3BlcnR5DHVybGlzdAIjCGZsYWcIcHVybApwYXJzZQptYXRjaAZ1cmwOZW5jcnlwdBB1bmVzY2FwZQR3ZApxdWlja0IvaW5kZXgucGhwL2FqYXgvc3VnZ2VzdD9taWQ9MSZ3ZD0SJmxpbWl0PTUwBGVuBnBpYwZlbmMIVXRmOAxCYXNlNjQGc3RyAiUPpAMBpgMBABKoAwADAKoDAAGsAwACrgMADgAGAaABAAAAARMLWgCqAwAMrAMBDK4DAgywAwAJsgMBCbQDAgm2AwMJuAMEDboDBQG8AwYBvgMHAcADCAHCAwkBxAMKAcYDCwHIAwwBygMNAcwDDgGoAw8BCOg5vgBfCAC+AV8JAL4CXwoAvgNfCwC+BF8MAL4FXw0AvgZfDgC+B18PAL4IXxAAvglfEQC+Cl8SACkE5wAAAOIE6AAAAF8EAL9fBQCzXwYABOkAAABfBwAppAMBDAEAOwYhKxcYAAjWAg5iBgG6AwIBAgYCAGYD1AMAAQDWAwABANgDAQAguAMHDMwDEQBhAAA47QAAAM8LBEEAAABM7gAAAAvQEekFDmUAAEzvAAAATPAAAADui8c48QAAAELyAAAABPMAAADPnSQBAA448QAAAELyAAAABPQAAADcYgAAQfUAAADtnSQBAA5iAABB9QAAAC6kAwoJEiY1CEQcEmyZDmIGAbwDAQABAgIAGAHsAwABALQDBQi2AwYIz0H3AAAAEWYAAA7PQfgAAAARZgEADgYupAMXAwM6Og5iBgG+AwEEAR0BAdUGBfIDAAEA9AMBADD2AwEBcPgDAQJg+gMBA2CuAwIMYQMAYQIAYQEAYQAACwT+AAAATP8AAAAEAAEAAEwBAQAACwQCAQAATP8AAAAEAwEAAEwBAQAACwQEAQAATP8AAAAEBQEAAEwBAQAACwQGAQAATP8AAAAEBwEAAEwBAQAACwQIAQAATP8AAAAECQEAAEwBAQAAJgUAxwvICwQKAQAATNgAAAAECwEAAEw2AAAACwQMAQAATA0BAAC/TA4BAAALBA8BAABMDQEAAAQPAQAATA4BAAALBBABAABMDQEAAAQQAQAATA4BAAALBBEBAABMDQEAAAQRAQAATA4BAAALBBIBAABMDQEAAAQSAQAATA4BAAALBBMBAABMDQEAAAQTAQAATA4BAAALBBQBAABMDQEAAAQUAQAATA4BAAALBBUBAABMDQEAAAQVAQAATA4BAAALBBYBAABMDQEAAAQWAQAATA4BAAALBBcBAABMDQEAAAQXAQAATA4BAAALBBgBAABMDQEAAAQYAQAATA4BAAALBBkBAABMDQEAAAQZAQAATA4BAAALBBoBAABMDQEAAAQaAQAATA4BAAALBBsBAABMDQEAAAQbAQAATA4BAAALBBwBAABMDQEAAAQcAQAATA4BAAALBB0BAABMDQEAAAQdAQAATA4BAAALBB4BAABMDQEAAAQeAQAATA4BAAALBB8BAABMDQEAAAQfAQAATA4BAAALBCABAABMDQEAAAQgAQAATA4BAAALBCEBAABMDQEAAAQhAQAATA4BAAALBCIBAABMDQEAAAQiAQAATA4BAAALBCMBAABMDQEAAAQjAQAATA4BAAALBCQB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 -------------------------------------------------------------------------------- /server/source/ting13_bytecode.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1CyARx0aW5nMTNfb3Blbi5qcyxhc3NldHM6Ly9qcy9saWIvY2F0LmpzHF9fanNFdmFsUmV0dXJuCGxvYWQCXwZrZXkISE9TVA5zaXRlS2V5EHNpdGVUeXBlEk1PQklMRV9VQQxjb29raWUMTVlfVVJMDnJlcXVlc3QIcG9zdBRnZXRIZWFkZXJzEmdldENvb2tpZQhpbml0CGhvbWUQY2F0ZWdvcnkMZGV0YWlsCHBsYXkMc2VhcmNoGmRlY29kZVVuaWNvZGUJMQAzACxUZk4oaHR0cHM6Ly9tLnRpbmcxMy5jb220Ak1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBBU1VTX1owMVFEIEJ1aWxkL1BRM0IuMTkwODAxLjAwMjsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS85MS4wLjQ0NzIuMTE0IFNhZmFyaS81MzcuMzYMcmVxVXJsBHVhDGJ1ZmZlcgZyZXMGcmVxDG1ldGhvZBRVc2VyLUFnZW50DmhlYWRlcnMOdGltZW91dA5jb250ZW50EHBvc3REYXRhEHBvc3R0eXBlCGRhdGEQcG9zdFR5cGUOaXNFbXB0eQxyZXN1bHQgc2V0Q29va2llSGVhZGVycxRzZXQtY29va2llBm1hcARrawI7BmNmZwhza2V5CnN0eXBlDGZpbHRlcghodG1sAiQOY2xhc3NlcxJmaWx0ZXJPYmoEaXQQdHlwZU5hbWUMdHlwZUlkCmZpbEJ5DC9ib29rL0hkbC5wZC1jbGFzcyA+IGRkID4gYVtocmVmKj15b3VzaGVuZ10FPNin3xBjaGlsZHJlbg5hdHRyaWJzCGhyZWYKbWF0Y2gIcHVzaA50eXBlX2lkEnR5cGVfbmFtZQRieQWSY49eBbBlZk4CbhBwb3N0ZGF0ZQJ2BQBnsGUUbGFzdHVwZGF0ZQW6ThRsEGFsbHZpc2l0EnN0cmluZ2lmeQ5maWx0ZXJzBmNscwZ0aWQEcGcMZXh0ZW5kCmJvb2tzFC95b3VzaGVuZy8CLwouaHRtbC51bC5ib29rLW9sID4gbGkuYm9vay1saRBwYXJzZUludAhwYWdlEnBhZ2Vjb3VudApsaW1pdAp0b3RhbAhsaXN0CGJvb2sCYQZpbWcOcmVtYXJrcxByZW1hcmtzMhByZW1hcmtzMxByZW1hcmtzNAhmaW5kDmE6Zmlyc3QSaW1nOmZpcnN0GmRhdGEtb3JpZ2luYWwUc3Bhbi5zY29yZRpkaXYuYm9vay1tZXRhCHRleHQOcmVwbGFjZQQkMSJkaXYucGxheUNvdW50VGV4dCZkaXYuYm9vay1tZXRhOmVxKDEpDmJvb2tfaWQKdGl0bGUJCWfwWA9c9IsSYm9va19uYW1lEGJvb2tfcGljBT3YMN0DZCcFPNik3xhib29rX3JlbWFya3MEaWQKcGFnZXMQYm9va2xpc3QGdm9sBGJrCHRpbmcIbGluawQkJApkYXRhMi5kaXYuYm9vay1yYW5kLWE6ZXEoMCkgYQh0cmltEmJvb2tfdHlwZSpkaXYuYm9vay1yYW5kLWE6ZXEoNCkSYm9va195ZWFyNGRpdi5ib29rLXJhbmQtYTplcSgxKSBmb250EmJvb2tfYXJlYS5kaXYuYm9vay1yYW5kLWE6ZXEoMykgYRRib29rX2FjdG9yLmRpdi5ib29rLXJhbmQtYTplcSgyKSBhGmJvb2tfZGlyZWN0b3IYZGl2LmVsbGlwc2lzGGJvb2tfY29udGVudB5zZWxlY3QgPiBvcHRpb242ZGl2LnBsYXktbGlzdCA+IHVsID4gbGkgPiBhAiMGJCQkDnZvbHVtZXMIdXJscwJiEHNlZ21lbnRzCGZsYWcGbmlkBmNpZApwZGF0YQhwdXJsHm1ldGFbbmFtZT0iX2MiXURodHRwczovL20udGluZzEzLmNvbS9hcGkvbWFwaS9wbGF5BHNjDENvb2tpZQpwYXJzZQhmb3JtBnVybAR3ZApxdWljaw5wZ0NvdW50LC9hcGkvYWpheC9zb2xpc3Q/d29yZD0gJnR5cGU9bmFtZSZwYWdlPRAmb3JkZXI9MQpub3ZlbApjb3ZlchBsYXN0bmFtZQhjbnVtBnN0cgIlEHVuZXNjYXBlD6QDAaYDAQAVqAMAAgCqAwABrAMADgAGAaABAAAAARYNagCqAwAMrAMBDK4DAAmwAwEJsgMCCbQDAwm2AwQNuAMFCboDBgm8AwcBvgMIAcADCQHCAwoBxAMLAcYDDAHIAw0BygMOAYYCDwHMAxABzgMRAdADEgGoAxMBCOhDvgBfCQC+AV8KAL4CXwsA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 -------------------------------------------------------------------------------- /pages/Play.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 218 | 219 | 250 | -------------------------------------------------------------------------------- /server/source/cntv_open.js: -------------------------------------------------------------------------------- 1 | // 无搜索功能 2 | import { _ } from './lib/cat.js'; 3 | let key = '视聚场'; 4 | let HOST = 'http://api.cntv.cn'; 5 | let siteKey = ''; 6 | let siteType = 0; 7 | const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; 8 | 9 | async function request(reqUrl, agentSp) { 10 | let res = await req(reqUrl, { 11 | method: 'get', 12 | headers: { 13 | 'User-Agent': agentSp || MOBILE_UA, 14 | }, 15 | }); 16 | return res.content 17 | } 18 | 19 | async function init(cfg) { 20 | siteKey = cfg.skey; 21 | siteType = cfg.stype 22 | } 23 | 24 | async function home(filter) { 25 | const classes = [ 26 | { type_id: "TOPC1451559025546574", type_name: "动画大放映" }, 27 | { type_id: "TOPC1451378857272262", type_name: "第一动画乐园" }, 28 | { type_id: "TOPC1451557646802924", type_name: "健康之路" }, 29 | { type_id: "TOPC1451558190239536", type_name: "走进科学" }, 30 | { type_id: "TOPC1451557893544236", type_name: "探索·发现" }, 31 | { type_id: "TOPC1451378967257534", type_name: "动物世界" }, 32 | { type_id: "TOPC1451525103989666", type_name: "人与自然" }, 33 | { type_id: "TOPC1451558150787467", type_name: "自然传奇" }, 34 | { type_id: "TOPC1451557421544786", type_name: "地理·中国" }, 35 | { type_id: "TOPC1451541349400938", type_name: "远方的家" }, 36 | { type_id: "TOPC1575253587571324", type_name: "跟着书本去旅行" }, 37 | { type_id: "TOPC1451557052519584", type_name: "百家讲坛" }, 38 | { type_id: "TOPC1451558856402351", type_name: "空中剧院" }, 39 | { type_id: "TOPC1451550970356385", type_name: "体坛快讯" }, 40 | { type_id: "TOPC1451528971114112", type_name: "新闻联播" }, 41 | { type_id: "TOPC1451558976694518", type_name: "焦点访谈" }, 42 | { type_id: "TOPC1451464665008914", type_name: "今日说法" }, 43 | { type_id: "TOPC1451378757637200", type_name: "等着我" }, 44 | { type_id: "TOPC1451559129520755", type_name: "新闻直播间" }, 45 | { type_id: "TOPC1451540328102649", type_name: "海峡两岸" }, 46 | { type_id: "TOPC1451530382483536", type_name: "天网" }, 47 | { type_id: "TOPC1451540389082713", type_name: "今日关注" }, 48 | { type_id: "TOPC1665739007799851", type_name: "高端访谈" }, 49 | { type_id: "TOPC1451464884159276", type_name: "开讲啦" }, 50 | { type_id: "TOPC1451464884159276", type_name: "故事里的中国" }, 51 | { type_id: "TOPC1514182710380601", type_name: "对话" }, 52 | { type_id: "TOPC1451559038345600", type_name: "面对面" }, 53 | { type_id: "TOPC1451534366388377", type_name: "是真的吗" }, 54 | { type_id: "TOPC1451467630488780", type_name: "星光大道" }, 55 | { type_id: "TOPC1451541414450906", type_name: "精彩音乐汇" }, 56 | { type_id: "TOPC1451534421925242", type_name: "音乐厅" }, 57 | { type_id: "TOPC1451541994820527", type_name: "民歌·中国" }, 58 | { type_id: "TOPC1451354597100320", type_name: "中国电影报道" }, 59 | { type_id: "TOPC1451469943519994", type_name: "星推荐" }, 60 | { type_id: "TOPC1571217727564820", type_name: "方圆剧阵" }, 61 | { type_id: "TOPC1650782829200997", type_name: "正大综艺" }, 62 | { type_id: "TOPC1451530259915198", type_name: "第一时间" }, 63 | { type_id: "TOPC1451465894294259", type_name: "开门大吉" }, 64 | { type_id: "TOPC1451464884159276", type_name: "开讲啦" }, 65 | { type_id: "TOPC1451558858788377", type_name: "共同关注" }, 66 | { type_id: "TOPC1451527941788652", type_name: "军事报道" }, 67 | { type_id: "TOPC1451558819463311", type_name: "新闻调查" }, 68 | { type_id: "TOPC1451559097947700", type_name: "新闻30分" }, 69 | { type_id: "TOPC1451559066181661", type_name: "新闻1+1" }, 70 | { type_id: "TOPC1451540448405749", type_name: "今日亚洲" }, 71 | { type_id: "TOPC1451559129520755", type_name: "新闻直播间" }, 72 | { type_id: "TOPC1451558428005729", type_name: "24小时" }, 73 | { type_id: "TOPC1451539894330405", type_name: "中国新闻" }, 74 | { type_id: "TOPC1451558779639282", type_name: "午夜新闻" }, 75 | { type_id: "TOPC1451558496100826", type_name: "朝闻天下" }, 76 | { type_id: "TOPC1451528792881669", type_name: "晚间新闻" }, 77 | { type_id: "TOPC1451559180488841", type_name: "新闻周刊" }, 78 | { type_id: "TOPC1601362002656197", type_name: "经济半小时" }, 79 | { type_id: "TOPC1451533652476962", type_name: "经济大讲堂" }, 80 | { type_id: "TOPC1453100395512779", type_name: "正点财经" }, 81 | { type_id: "TOPC1451546588784893", type_name: "生活圈" }, 82 | { type_id: "TOPC1451526037568184", type_name: "生活提示" }, 83 | { type_id: "TOPC1451558532019883", type_name: "东方时空" }, 84 | { type_id: "TOPC1451533782742171", type_name: "经济信息联播" }, 85 | { type_id: "TOPC1571034705435323", type_name: "今日环球" }, 86 | { type_id: "TOPC1451543462858283", type_name: "一线" } 87 | ]; 88 | const filterObj = {}; 89 | return JSON.stringify({ 90 | class: _.map(classes, (cls) => { 91 | cls.land = 1; 92 | cls.ratio = 1.78; 93 | return cls; 94 | }), 95 | filters: filterObj, 96 | }) 97 | } 98 | 99 | async function homeVod() { 100 | const data = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=TOPC1451558856402351&n=10&sort=desc&p=1&mode=0&serviceId=tvcctv')); 101 | let videos = _.map(data.data.list, (it) => { 102 | return { 103 | vod_id: it.guid, 104 | vod_name: it.title, 105 | vod_pic: it.image, 106 | vod_remarks: it.time || '', 107 | } 108 | }); 109 | return JSON.stringify({ 110 | list: videos, 111 | }) 112 | } 113 | 114 | async function category(tid, pg, filter, extend) { 115 | if (pg <= 0 || typeof pg == 'undefined') pg = 1; 116 | const data = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=' + tid + '&n=10&sort=desc&p=' + pg + '&mode=0&serviceId=tvcctv')); 117 | let videos = _.map(data.data.list, (it) => { 118 | return { 119 | vod_id: it.guid, 120 | vod_name: it.title, 121 | vod_pic: it.image, 122 | vod_remarks: it.time || '', 123 | } 124 | }); 125 | const pgChk = JSON.parse(await request(HOST + '/NewVideo/getVideoListByColumn?id=' + tid + '&n=10&sort=desc&p=' + (parseInt(pg) + 1) + '&mode=0&serviceId=tvcctv')).data.list; 126 | const pgCount = pgChk.length > 0 ? parseInt(pg) + 1 : parseInt(pg); 127 | return JSON.stringify({ 128 | page: parseInt(pg), 129 | pagecount: parseInt(pgCount), 130 | limit: 10, 131 | total: parseInt(data.total), 132 | list: videos, 133 | }) 134 | } 135 | 136 | async function detail(id) { 137 | const vod = { 138 | vod_id: id, 139 | vod_remarks: '', 140 | }; 141 | const playlist = ['点击播放' + '$' + 'https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/' + id + '/2000.m3u8']; 142 | vod.vod_play_from = key; 143 | vod.vod_play_url = playlist.join('#'); 144 | return JSON.stringify({ 145 | list: [vod], 146 | }); 147 | } 148 | 149 | async function play(flag, id, flags) { 150 | // console.debug('视聚场 id =====>' + id); // js_debug.log 151 | return JSON.stringify({ 152 | parse: 0, 153 | url: id, 154 | }) 155 | } 156 | 157 | async function search(wd, quick, pg) { 158 | return '{}' 159 | } 160 | 161 | export function __jsEvalReturn() { 162 | return { 163 | init: init, 164 | home: home, 165 | homeVod: homeVod, 166 | category: category, 167 | detail: detail, 168 | play: play, 169 | search: search, 170 | } 171 | } -------------------------------------------------------------------------------- /server/source/bililive_bytecode.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1C0ASBiaWxpbGl2ZV9vcGVuLmpzLGFzc2V0czovL2pzL2xpYi9jYXQuanMcX19qc0V2YWxSZXR1cm4CXw5zaXRlS2V5EHNpdGVUeXBlDGNvb2tpZQpsb2dpbgZ2aXAQYmlsaV9qY3QEVUEOcmVxdWVzdBRnZXRIZWFkZXJzEmdldENvb2tpZQhpbml0CGhvbWUOaG9tZVZvZBBjYXRlZ29yeQxkZXRhaWwIcGxheQxzZWFyY2gUcmVtb3ZlVGFnc/IBTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzkxLjAuNDQ3Mi4xMTQgU2FmYXJpLzUzNy4zNgxyZXFVcmwEdWEMYnVmZmVyBnJlcwZyZXEMbWV0aG9kFFVzZXItQWdlbnQOaGVhZGVycw50aW1lb3V0DmNvbnRlbnQOaXNFbXB0eQxyZXN1bHQgc2V0Q29va2llSGVhZGVyczBodHRwczovL3d3dy5iaWxpYmlsaS5jb20Uc2V0LWNvb2tpZQZtYXAEa2sCOwZjZmcOY29va2llcwhza2V5CnN0eXBlBmV4dBxoYXNPd25Qcm9wZXJ0eRRzdGFydHNXaXRoCGh0dHAOZm9yRWFjaApwYXJzZVhodHRwczovL2FwaS5iaWxpYmlsaS5jb20veC93ZWItaW50ZXJmYWNlL25hdghkYXRhDmlzTG9naW4SdmlwU3RhdHVzEGluY2x1ZGVzAj0MZmlsdGVyCGxpbmsOY2xhc3NlcxJmaWx0ZXJPYmoQc29ydE5hbWWqAWh0dHBzOi8vYXBpLmxpdmUuYmlsaWJpbGkuY29tL3hsaXZlL3dlYi1pbnRlcmZhY2UvdjEvaW5kZXgvZ2V0V2ViQXJlYUxpc3Q/c291cmNlX2lkPTIIZWFjaAUfdTttDHNvcnRCeRJzdHJpbmdpZnkOZmlsdGVycwRpdBJmaWx0ZXJBbGwQdHlwZU5hbWUMdHlwZUlkFGZpbHRlckRhdGEIYXJlYRRhcmVhVmFsdWVzBGlkCHB1c2gOdHlwZV9pZBJ0eXBlX25hbWUIbGFuZApyYXRpbwhsaXN0BmtleQUGUjpTBWhR6JACbgJ2BGV4AmMOaW5kZXhPZghodG1sDHZpZGVvc6IBaHR0cHM6Ly9hcGkubGl2ZS5iaWxpYmlsaS5jb20vcm9vbS92MS9yb29tL2dldF91c2VyX3JlY29tbWVuZD9wYWdlPTEmcGFnZV9zaXplPTIwBnBpYxhzeXN0ZW1fY292ZXIELy8MaHR0cHM6DHJvb21pZAx2b2RfaWQKdGl0bGUQdm9kX25hbWUOdm9kX3BpYwU92EHcGHdhdGNoZWRfc2hvdxR0ZXh0X3NtYWxsCSAAIAA82JndCnVuYW1lFnZvZF9yZW1hcmtzBnRpZARwZwxleHRlbmTAAWh0dHBzOi8vYXBpLmxpdmUuYmlsaWJpbGkuY29tL3hsaXZlL3dlYi1pbnRlcmZhY2UvdjEvc2Vjb25kL2dldExpc3Q/cGxhdGZvcm09d2ViJnBhcmVudF9hcmVhX2lkPRImYXJlYV9pZD0uJnNvcnRfdHlwZT1vbmxpbmUmcGFnZT0IcGFnZRBudW1QYWdlcxJwYWdlY291bnQQcGFnZXNpemUKbGltaXQUbnVtUmVzdWx0cwp0b3RhbBJkZXRhaWxVcmwUZGV0YWlsRGF0YQZyaWQWbGl2ZV9zdGF0dXMGdm9keGh0dHBzOi8vYXBpLmxpdmUuYmlsaWJpbGkuY29tL3Jvb20vdjEvUm9vbS9nZXRfaW5mbz9yb29tX2lkPQ5yb29tX2lkCwBfrWT2ZfSVGv8SbGl2ZV90aW1lDnJlcGxhY2UCLQIuBypnAF+tZBBrZXlmcmFtZSBwYXJlbnRfYXJlYV9uYW1lBC0tEmFyZWFfbmFtZRB2b2RfdHlwZQk/YvSV91Ma/wsAMFUASQBEABr/BnVpZAMAMBJ2b2RfYWN0b3IYdm9kX2RpcmVjdG9yFmRlc2NyaXB0aW9uFnZvZF9jb250ZW50CVOQf5UoV79+GnZvZF9wbGF5X2Zyb20/ZgBsAHYAv37vjZ9TO3UkAHAAbABhAHQAZgBvAHIAbQA9AHcAZQBiACYAcQB1AGEAbABpAHQAeQA9ADQAXwBBIwBmAGwAdgC/fu+N2JoFbiQAcABsAGEAdABmAG8AcgBtAD0AdwBlAGIAJgBxAHUAYQBsAGkAdAB5AD0AMwBfAD0jAGgANQC/fu+Nn1M7dSQAcABsAGEAdABmAG8AcgBtAD0AaAA1ACYAcQB1AGEAbABpAHQA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 -------------------------------------------------------------------------------- /server/source/lbgs_book_open.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1CiARhsYmdzX29wZW4uanMsYXNzZXRzOi8vanMvbGliL2NhdC5qcxxfX2pzRXZhbFJldHVybgxDcnlwdG8KZGF5anMCXwZrZXkMZGV2aWNlDnNpdGVLZXkQc2l0ZVR5cGUUYXBwVmVyc2lvbgphcHBVQQ5hcHBEYXRhGG5hdGl2ZUVuY29kZQRwawp4bmFtZRhiYXNlNjRFbmNvZGUYYmFzZTY0RGVjb2RlGmZvcm1hdFBsYXlVcmwOY2hhclN0cg5yYW5kU3RyFHJhbmREZXZpY2UOcmVxdWVzdAhpbml0CGhvbWUOaG9tZVZvZAxpbWdVcmwQY2F0ZWdvcnkMZGV0YWlsCHBsYXkMc2VhcmNoDGxhb2JhaQoxLjEuN7AJSEJrWkZCdDZkMzU5ZHhGa1lYdDZjWEVaZjN4b0dSa1VHeFU0ZEgxd2MzMWVlSGg2VlZKRlVWcGRjd0JCQ0hCNFpYeDNkWFYyZFhsakFYVjBlSDEyZWxGemNYaGxmSEJBWjA1WlRGQk1BMngwVzFwc2RVSnhTbjVoWVQ1blNXOTNRRkpCZEY5RVRWSUVER0o3WlVwYVgxZE9iMkpCYkdCT1Uxd01ZQTlPZWt4a2NGUkdYQXAzWG1oakJWVkVjbUlBVDJoeEN3d0xTVjE2WVIwWE9CSjllRXRqZkc1eERuOFNVRzVjZmxwOVQwRlFYR0Z2WlZ3RGNRRmhaSFFIQ0ZSblpnQmlmbVlOWW5oaVJnTjNVRXhWZWtJT1dWSm5DMXR1ZkhVRVNraytaa3Q3YTJKcWJGZ0haMVpUWFhGWGJnQitaVVJ0U1dGelYxRi9YMUJGUmw1eVQyUmZjbnBFQWdOV1VYUUxjM2h3VlhCTVQyRk1XbkJSRFFOQllYUllRamdOZlhBQUcwUmRSR2hHYm1aTUFYZHdVMWRBUkVwNFF3TUNZVjE3ZjJGMUIxNTNjVmhXVjNKYVNRQnlSSDFrY2dKcVhuQk1FZ2hBQmdGK0NBSVNCM0JCUGxGdlgwcGZVRlZBZFcxK2FGTUpVVk5kZlhwYmNXdGxVMzVNVm5OamNBWkFYQTFxQ2tCTGRsbFRZVk5BQVdoZldtTkFUQXhqZG1wZ1gzVjBRWEYwZUg4NFVFTndkWFZsZUhReUh4UVpGQnh4ZW4wV2FHZDdlSEJ5Rkg5OGJ4VWZGQmtVemFiYWNkZWZnaGprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkCZQJhAnQCchhmcm9tQ2hhckNvZGUUY2hhckNvZGVBdAZlbmMMQmFzZTY0EnN0cmluZ2lmeQhVdGY4CnBhcnNlCHRyaW0UcmVwbGFjZUFsbA5yZXBsYWNlAiACbgxyYW5kb20MSHVhd2VpCmJyYW5kHEhVQVdFSSBNYXRlIDIwCm1vZGVsDnJlbGVhc2UWdG9VcHBlckNhc2UOYnVpbGRJZAZyZXEMbWV0aG9kFFVzZXItQWdlbnQYaHR0cF9yZWZlcmVyDlJlZmVyZXIOaGVhZGVycwhkYXRhCHBvc3QIZm9ybRBwb3N0VHlwZQ5jb250ZW50CHNrZXkKc3R5cGUKbG9jYWwOaXNFbXB0eRZ0b0xvd2VyQ2FzZQRpZEBEYWx2aWsvMi4xLjAgKExpbnV4OyBVOyBBbmRyb2lkIAQ7IA4gQnVpbGQvAikEdWE6KE1vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCDEATsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS82OC4wLjM0NDAuNzAgTW9iaWxlIFNhZmFyaS81MzcuMzYpVGh0dHBzOi8vbGFncy5vc3MtY24taGFuZ3pob3UuYWxpeXVuY3MuY29tLwouanNvbhgkNmMxY2VmNzhhZT0IcnNhWBJSU0EvUEtDUzECLwJvAmkCcxBqc29uX3VybBxjYXQvaW5kZXguanNvbgp0aXRsZQUGUnt8CHR5cGUFe3yLVwxyZWR1Y2UKdHlwZXMCdghzb3J0BZJjj14GaG90CHB1c2gF2J6kiwXtcOiVBd6PfY8Mc2VyaWFsBYxb034OdHlwZV9pZBJ0eXBlX25hbWUOZmlsdGVycxRzdGFydHNXaXRoCGh0dHAOaW1nX3VybAJwEmNhdF9saXN0Lwpib29rcw5ib29rX2lkEmJvb2tfbmFtZQZwaWMQYm9va19waWMYYm9va19yZW1hcmtzCHBhZ2UMc2Nyb2xsEnBhZ2Vjb3VudApsaW1pdAp0b3RhbAhsaXN0CmNvbnQvCmF1ZGlvCHRpbWUSYm9va195ZWFyEmJvb2tfYXJlYQx0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 -------------------------------------------------------------------------------- /server/api/utils/douban_query_config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | hot_gaia: { 3 | area: '全部', 4 | sort: 'recommend', 5 | playable: 0, 6 | loc_id: 0, 7 | start: 0, 8 | count: 30, 9 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 10 | rom: 'android', 11 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 12 | s: 'rexxar_new', 13 | channel: 'Yingyongbao_Market', 14 | timezone: 'Asia/Shanghai', 15 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 16 | os_rom: 'android', 17 | apple: 'c52fbb99b908be4d026954cc4374f16d', 18 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 19 | sugar: 0, 20 | _sig: '3lJUfuP%2BtXop8VsJXZRVFSJQUy0%3D', 21 | _ts: 1705302414, 22 | }, 23 | tv_hot: { 24 | area: '全部', 25 | sort: 'recommend', 26 | playable: 0, 27 | loc_id: 0, 28 | start: 0, 29 | count: 30, 30 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 31 | uuid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 32 | rom: 'android', 33 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 34 | s: 'rexxar_new', 35 | channel: 'Yingyongbao_Market', 36 | timezone: 'Asia/Shanghai', 37 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 38 | os_rom: 'android', 39 | apple: 'c52fbb99b908be4d026954cc4374f16d', 40 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 41 | sugar: 0, 42 | _sig: 'y2mdM4lEmm7%2FeQeOdIW8%2BHZ4z8A%3D', 43 | _ts: 1705302456, 44 | }, 45 | tv_domestic: { 46 | area: '全部', 47 | sort: 'recommend', 48 | playable: 0, 49 | loc_id: 0, 50 | start: 0, 51 | count: 30, 52 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 53 | uuid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 54 | rom: 'android', 55 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 56 | s: 'rexxar_new', 57 | channel: 'Yingyongbao_Market', 58 | timezone: 'Asia/Shanghai', 59 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 60 | os_rom: 'android', 61 | apple: 'c52fbb99b908be4d026954cc4374f16d', 62 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 63 | sugar: 0, 64 | _sig: 'XlGMiSYUGQYMBCsl0sLoI8%2FSF20%3D', 65 | _ts: 1705302992, 66 | }, 67 | tv_american: { 68 | area: '全部', 69 | sort: 'recommend', 70 | playable: '0', 71 | loc_id: '0', 72 | start: '0', 73 | count: '30', 74 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 75 | uuid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 76 | rom: 'android', 77 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 78 | s: 'rexxar_new', 79 | channel: 'Yingyongbao_Market', 80 | timezone: 'Asia/Shanghai', 81 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 82 | os_rom: 'android', 83 | apple: 'c52fbb99b908be4d026954cc4374f16d', 84 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 85 | sugar: '0', 86 | _sig: 'aIYuffW19sE0YTfQTU0WLpqze18=', 87 | _ts: '1705303029', 88 | }, 89 | tv_japanese: { 90 | area: '全部', 91 | sort: 'recommend', 92 | playable: '0', 93 | loc_id: '0', 94 | start: '0', 95 | count: '30', 96 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 97 | uuid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 98 | rom: 'android', 99 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 100 | s: 'rexxar_new', 101 | channel: 'Yingyongbao_Market', 102 | timezone: 'Asia/Shanghai', 103 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 104 | os_rom: 'android', 105 | apple: 'c52fbb99b908be4d026954cc4374f16d', 106 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 107 | sugar: '0', 108 | _sig: '3qFWsGMO%2Ba3RZpExjOogeNeByVw%3D', 109 | _ts: '1705303100', 110 | }, 111 | tv_korean: { 112 | area: '全部', 113 | sort: 'recommend', 114 | playable: '0', 115 | loc_id: '0', 116 | start: '0', 117 | count: '30', 118 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 119 | uuid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 120 | rom: 'android', 121 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 122 | s: 'rexxar_new', 123 | channel: 'Yingyongbao_Market', 124 | timezone: 'Asia/Shanghai', 125 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 126 | os_rom: 'android', 127 | apple: 'c52fbb99b908be4d026954cc4374f16d', 128 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 129 | sugar: '0', 130 | _sig: '3Y3FKIAfRKPzsEwx2uBrS477q2w=', 131 | _ts: '1705303354', 132 | }, 133 | tv_animation: { 134 | area: '全部', 135 | sort: 'recommend', 136 | playable: '0', 137 | loc_id: '0', 138 | start: '0', 139 | count: '30', 140 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 141 | uuid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 142 | rom: 'android', 143 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 144 | s: 'rexxar_new', 145 | channel: 'Yingyongbao_Market', 146 | timezone: 'Asia/Shanghai', 147 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 148 | os_rom: 'android', 149 | apple: 'c52fbb99b908be4d026954cc4374f16d', 150 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 151 | sugar: '0', 152 | _sig: 'wonumurCi2SyYGlSTv0uKPSIVP8=', 153 | _ts: '1705303359', 154 | }, 155 | show_hot: { 156 | area: '全部', 157 | sort: 'recommend', 158 | playable: '0', 159 | loc_id: '0', 160 | start: '0', 161 | count: '30', 162 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 163 | uuid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 164 | rom: 'android', 165 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 166 | s: 'rexxar_new', 167 | channel: 'Yingyongbao_Market', 168 | timezone: 'Asia/Shanghai', 169 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 170 | os_rom: 'android', 171 | apple: 'c52fbb99b908be4d026954cc4374f16d', 172 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 173 | sugar: '0', 174 | _sig: 'MDXMiUkiWeNJXrRyZdFK7HkoeTk=', 175 | _ts: '1705303361', 176 | }, 177 | tag_movie: { 178 | sort: 'U', 179 | start: '0', 180 | count: '30', 181 | q: '全部形式,全部类型,全部地区,全部年代', 182 | score_rang: '0,10', 183 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 184 | rom: 'android', 185 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 186 | s: 'rexxar_new', 187 | channel: 'Yingyongbao_Market', 188 | timezone: 'Asia/Shanghai', 189 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 190 | os_rom: 'android', 191 | apple: 'c52fbb99b908be4d026954cc4374f16d', 192 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 193 | sugar: 0, 194 | _sig: 'FAnj6IZIGjeDZyO1qMVDI4Hf9mg%3D', 195 | _ts: 1705302555, 196 | }, 197 | movie_top250: { 198 | area: '%E5%85%A8%E9%83%A8', 199 | sort: 'recommend', 200 | playable: 0, 201 | loc_id: 0, 202 | start: 0, 203 | count: 30, 204 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 205 | rom: 'android', 206 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 207 | s: 'rexxar_new', 208 | channel: 'Yingyongbao_Market', 209 | timezone: 'Asia/Shanghai', 210 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 211 | os_rom: 'android', 212 | apple: 'c52fbb99b908be4d026954cc4374f16d', 213 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 214 | sugar: 0, 215 | _sig: 'JR4xGUK82eIjBwBlDurmDcXEj1g%3D', 216 | _ts: 1705303613, 217 | }, 218 | movie_rank: { 219 | count: 30, 220 | category: 'recent_hot', 221 | udid: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 222 | rom: 'android', 223 | apikey: '0dad551ec0f84ed02907ff5c42e8ec70', 224 | s: 'rexxar_new', 225 | channel: 'Yingyongbao_Market', 226 | timezone: 'Asia/Shanghai', 227 | device_id: 'pelgyyle5caas2ny2hkvsrjesbrvge7mdsazfg0n', 228 | os_rom: 'android', 229 | apple: 'c52fbb99b908be4d026954cc4374f16d', 230 | mooncake: '0f607264fc6318a92b9e13c65db7cd3c', 231 | sugar: 0, 232 | _sig: 'OwLtLjbIBEhgeiBijmOLid7QLlg%3D', 233 | _ts: 1705303573, 234 | }, 235 | }; 236 | -------------------------------------------------------------------------------- /pages/index.vue: -------------------------------------------------------------------------------- 1 | 65 | 66 | 187 | 188 | 266 | -------------------------------------------------------------------------------- /server/source/230ts_book_open.js: -------------------------------------------------------------------------------- 1 | // 网站搜索异常 2 | import { load, _ } from './lib/cat.js'; 3 | 4 | let key = '爱上你听书网'; 5 | let HOST = 'https://wap.230ts.net'; 6 | let siteKey = ''; 7 | let siteType = 0; 8 | const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36'; 9 | 10 | async function request(reqUrl, agentSp) { 11 | let res = await req(reqUrl, { 12 | method: 'get', 13 | headers: { 14 | 'User-Agent': agentSp || MOBILE_UA, 15 | 'Referer': HOST 16 | }, 17 | }); 18 | return res.content; 19 | } 20 | 21 | // cfg = {skey: siteKey, ext: extend} 22 | async function init(cfg) { 23 | siteKey = cfg.skey; 24 | siteType = cfg.stype; 25 | } 26 | 27 | async function home(filter) { 28 | const html = await request(HOST + '/sort/'); 29 | const $ = load(html); 30 | let filterObj = {}; 31 | const class_parse = $('dl.pd-class:first > dd > a[href*=sort]'); 32 | let classes = []; 33 | classes = _.map(class_parse, (cls) => { 34 | let typeId = cls.attribs['href']; 35 | typeId = typeId.replace(/.*?\/sort\/(.*).html/g, '$1'); 36 | return { 37 | type_id: typeId, 38 | type_name: cls.children[0].data, 39 | }; 40 | }); 41 | const sortName = ['玄幻有声', '灵异有声', '综艺娱乐', '长篇评书', '都市有声', '军事有声', '职场有声', '其他有声']; 42 | classes = _.sortBy(classes, (c) => { 43 | const index = sortName.indexOf(c.type_name); 44 | return index === -1 ? sortName.length : index; 45 | }); 46 | return JSON.stringify({ 47 | class: classes, 48 | filters: filterObj, 49 | }); 50 | } 51 | 52 | async function homeVod() { 53 | const link = HOST + '/top/lastupdate/1.html'; 54 | const html = await request(link); 55 | const $ = load(html); 56 | const items = $('ul.list-ul > li'); 57 | let videos = _.map(items, (item) => { 58 | const it = $(item).find('a:first')[0]; 59 | const img = $(item).find('img:first')[0]; 60 | const remarks = $($(item).find('p.module-slide-author')[0]).text().trim(); 61 | return { 62 | vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'), 63 | vod_name: it.attribs.title.replace('有声小说',''), 64 | vod_pic: HOST + img.attribs['data-original'], 65 | vod_remarks: remarks || '', 66 | }; 67 | }); 68 | return JSON.stringify({ 69 | list: videos, 70 | }); 71 | } 72 | 73 | async function category(tid, pg, filter, extend) { 74 | if (pg <= 0) pg = 1; 75 | const link = HOST + '/sort/' + tid +'/' + (`${pg}`) + '.html'; 76 | const html = await request(link); 77 | const $ = load(html); 78 | const items = $('ul.book-ol > li'); 79 | let videos = _.map(items, (item) => { 80 | const it = $(item).find('a:first')[0]; 81 | const img = $(item).find('img:first')[0]; 82 | const remarks = $($(item).find('div.book-meta')[0]).text().trim(); 83 | return { 84 | book_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'), 85 | book_name: it.attribs.title.replace('有声小说',''), 86 | book_pic: HOST + img.attribs['data-original'], 87 | book_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '', 88 | }; 89 | }); 90 | const hasMore = $('div.paging > a:contains(下一页)').length > 0; 91 | const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg); 92 | return JSON.stringify({ 93 | page: parseInt(pg), 94 | pagecount: pgCount, 95 | limit: 24, 96 | total: 24 * pgCount, 97 | list: videos, 98 | }); 99 | } 100 | 101 | async function detail(id) { 102 | const html = await request(HOST + '/tingshu/' + id); 103 | const $ = load(html); 104 | const detail = $('div.book-cell:first > div'); 105 | let vod = { 106 | book_id: id, 107 | type_name: $('h1:first').text().trim().replace('有声小说',''), 108 | // vod_pic: HOST + $('div.myui-content__thumb img:first').attr('data-original'), 109 | // vod_content: $('div.ellipsis').text().trim(), 110 | book_year: '', 111 | book_area: '', 112 | book_remarks: '', 113 | book_actor: '', 114 | book_director: '', 115 | book_content: '', 116 | }; 117 | // for (const info of detail) { 118 | // const i = $(info).text().trim(); 119 | // if (i.startsWith('类型:')) { 120 | // vod.vod_type = _.map($(info).find('a'), (a) => { 121 | // return a.children[0].data; 122 | // }).join('/'); 123 | // } else if (i.startsWith('作者:')) { 124 | // vod.vod_director = _.map($(info).find('a'), (a) => { 125 | // return a.children[0].data; 126 | // }).join('/'); 127 | // } else if (i.startsWith('演播:')) { 128 | // vod.vod_actor = _.map($(info).find('a'), (a) => { 129 | // return a.children[0].data; 130 | // }).join('/'); 131 | // } else if (i.startsWith('连载中')) { 132 | // vod.vod_remarks = i.substring(3); 133 | // } 134 | // } 135 | const playlist = _.map($('#playlist > ul > li > a'), (it) => { 136 | return it.children[0].data + '$' + it.attribs.href.replace(/\/mp3\/(.*).html/g, '$1'); 137 | }).join("#"); 138 | vod.volumes = '道长在线'; 139 | vod.urls = playlist; 140 | // vod.vod_play_from = '道长在线'; 141 | // vod.vod_play_url = playlist.join('#'); 142 | return JSON.stringify({ 143 | list: [vod], 144 | }); 145 | } 146 | 147 | async function play(flag, id, flags) { 148 | const link = HOST + '/mp3/' + id + '.html'; 149 | const html = await request(link); 150 | const $ = load(html); 151 | const iframe = $('body iframe[src*=player]'); 152 | const iframeHtml = ( 153 | await req(HOST + iframe[0].attribs.src, { 154 | headers: { 155 | 'Referer': link, 156 | 'User-Agent': MOBILE_UA, 157 | }, 158 | }) 159 | ).content; 160 | const playUrl = iframeHtml.match(/mp3:'(.*?)'/)[1]; 161 | if (playUrl.indexOf('m4a') >= 0 || playUrl.indexOf('mp3') >= 0 ) { 162 | return JSON.stringify({ 163 | parse: 0, 164 | url: playUrl, 165 | }); 166 | } else { 167 | try { 168 | const iframeHtml = ( 169 | await req(HOST + iframe[0].attribs.src, { 170 | headers: { 171 | 'Referer': link, 172 | 'User-Agent': MOBILE_UA, 173 | }, 174 | }) 175 | ).content; 176 | const playUrl = playUrl + '.m4a' + iframeHtml.match(/(\?.*?)'/)[1]; 177 | if (playUrl.indexOf('http') >= 0) { 178 | return JSON.stringify({ 179 | parse: 0, 180 | url: playUrl, 181 | }); 182 | } else { 183 | const iframeHtml = ( 184 | await req(HOST + iframe[0].attribs.src, { 185 | headers: { 186 | 'Referer': link, 187 | 'User-Agent': MOBILE_UA, 188 | }, 189 | }) 190 | ).content; 191 | const playUrl2 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1]; 192 | if (playUrl2.indexOf('\?') >= 0) { 193 | return JSON.stringify({ 194 | parse: 0, 195 | url: playUrl2, 196 | }); 197 | } else { 198 | const playUrl3 = playUrl2 + playUrl 199 | return JSON.stringify({ 200 | parse: 0, 201 | url: playUrl3, 202 | }); 203 | } 204 | } 205 | } catch (e) {} 206 | if (playUrl.indexOf('http') >= 0) { 207 | const playUrl = playUrl + '.m4a'; 208 | return JSON.stringify({ 209 | parse: 0, 210 | url: playUrl, 211 | }); 212 | } else { 213 | const iframeHtml = ( 214 | await req(HOST + iframe[0].attribs.src, { 215 | headers: { 216 | 'Referer': link, 217 | 'User-Agent': MOBILE_UA, 218 | }, 219 | }) 220 | ).content; 221 | const playUrl4 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1]; 222 | return JSON.stringify({ 223 | parse: 0, 224 | url: playUrl4 + '.m4a', 225 | }); 226 | } 227 | } 228 | } 229 | 230 | async function search(wd, quick) { 231 | const link = HOST + '/search.html?searchtype=name&searchword=' + wd +'&page=1'; 232 | const html = await request(link); 233 | const $ = load(html); 234 | const items = $('ul.book-ol > li'); 235 | let videos = _.map(items, (item) => { 236 | const it = $(item).find('a:first')[0]; 237 | const img = $(item).find('img:first')[0]; 238 | const remarks = $($(item).find('div.book-meta')[0]).text().trim(); 239 | return { 240 | book_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'), 241 | book_name: it.attribs.title.replace('有声小说',''), 242 | book_pic: img.attribs['data-original'], 243 | book_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '', 244 | }; 245 | }); 246 | return JSON.stringify({ 247 | list: videos, 248 | }); 249 | } 250 | 251 | export function __jsEvalReturn() { 252 | return { 253 | init: init, 254 | home: home, 255 | homeVod: homeVod, 256 | category: category, 257 | detail: detail, 258 | play: play, 259 | search: search, 260 | }; 261 | } 262 | -------------------------------------------------------------------------------- /server/source/yqktv_open2.js: -------------------------------------------------------------------------------- 1 | //bbQ0FUT1C/ARp5cWt0dl9vcGVuLmpzLGFzc2V0czovL2pzL2xpYi9jYXQuanMcX19qc0V2YWxSZXR1cm4MQ3J5cHRvCmRheWpzDGppbmphMgZVcmkCXwZrZXkGdXJsDGRldmljZQ5zaXRlS2V5EHNpdGVUeXBlDnJlcXVlc3QIaW5pdAhob21lDmhvbWVWb2QSbmV4dFZhbHVlDHdvcmtlchBjYXRlZ29yeQxkZXRhaWwIcGxheQxzZWFyY2gOY2hhclN0cg5yYW5kU3RyEHJhbmRVVUlEDnJhbmRNQUMUcmFuZERldmljZRpmb3JtYXRQbGF5VXJsEmpzb25QYXJzZQp5cWt0dnphYmFjZGVmZ2hqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5AmUCdAJyAmECbwJuAnMGcmVxGm9raHR0cC8zLjE0LjkUdXNlci1hZ2VudA5jb250ZW50JHd3dy5mdXdlbnR1dGVuZy5jbhJidW5kbGVySWQOcmVnQ29kZQhpbXNpGDEwMDFfZGVmYXVsdA4xLjAuMC4xDnZlcnNpb24KbW9kZWwUZGV2aWNlSW5mbwZtYWMWdmVyc2lvbkNvZGUOcmVsZWFzZQxvc0luZm8WaXNMb3dEZXZpY2UScmVxdWVzdElkQGQ2ZDUyMGVhOTA5MDRmMWJhNjgwZWQ2YzljOWY5MDA3CmFwcElkCGltZWkIdWRpZAxhc3NpZ24Ia2V5cwxzb3J0QnkIcHVzaAI9TmFwcEtleT03MGFmNjdkMmI2Y2Y0NzY3OWIzOTdlYTRjMTg4Njg3NwZNRDUCJhZ0b0xvd2VyQ2FzZQhzaWduDmhlYWRlcnMIcG9zdAxtZXRob2QIZGF0YQhza2V5CnN0eXBlCmxvY2FsCnBhcnNlDmlzRW1wdHkEaWQSc3RyaW5naWZ5RGh0dHBzOi8vY29uLmxicGNydy5jb20vY29uZmlnLmpzb248L3YxL2FwaS9zZWFyY2gvZ2V0U2VhcmNoRmlsdGVyFGZpbHRlckxpc3QeZmlsdGVyVmFsdWVMaXN0DnR5cGVfaWQSdHlwZV9uYW1lEHBhcnNlSW50BHt9MC92MS9hcGkvdm9kV29ya2VyL2RldGFpbBZ2b2RXb3JrZXJJZA52b2RMaXN0DHJlbWFyawh0cmltCnNjb3JlBjAuMAp2b2RJZAx2b2RfaWQOdm9kTmFtZRB2b2RfbmFtZRBjb3ZlckltZw52b2RfcGljAiAWdm9kX3JlbWFya3MIcGFnZRJwYWdlY291bnQIbGlzdAJpAmQCYwJsAnUUc3RhcnRzV2l0aA52X3dvcmtfDHN1YnN0chJjaGFubmVsSWQUZmlsdGVyTmFtZQxhcmVhSWQFMFc6Uwh5ZWFyBXRe/U4kY2hhbm5lbENoaWxkVHlwZUlkBXt8i1cFaFHokAJ2EHNvcnRMaXN0EHNvcnRUeXBlBZJjj14Qc29ydE5hbWUSZmlsZXJOYW1lFGZpbGVyVmFsdWUccXVlcnlWYWx1ZUpzb24ObmV4dFZhbC4vdjEvYXBpL3NlYXJjaC9xdWVyeU5vdw5oYXNOZXh0Cml0ZW1zDGZpbHRlciwvdjEvYXBpL3ZvZEluZm8vZGV0YWlsFmNoYW5uZWxOYW1lEHZvZF95ZWFyEGFyZWFOYW1lEHZvZF9hcmVhCmludHJvFnZvZF9jb250ZW50EmFjdG9yTGlzdAZtYXAELCASdm9kX2FjdG9yGGRpcmVjdG9yTGlzdBh2b2RfZGlyZWN0b3IUcGxheWVyTGlzdBRwbGF5ZXJOYW1lDGVwTGlzdAxlcE5hbWUCJAhlcElkAiMGJCQkGnZvZF9wbGF5X2Zyb20Ydm9kX3BsYXlfdXJsGnZvZFdvcmtlck5hbWUMW2E9Y3I6BC9dCFsvYV02L3YxL2FwaS92b2RJbmZvL2dldEVwRGV0YWlsHnJlc29sdXRpb25JdGVtcyJ2b2RSZXNvbHV0aW9uTmFtZTQvdjEvYXBpL3ZvZEluZm8vZ2V0UGxheVVybBp2b2RSZXNvbHV0aW9uDmtleXdvcmQGc2NfKi92MS9hcGkvc2VhcmNoL3NlYXJjaAxyYW5kb20CLRZ0b1VwcGVyQ2FzZQI6DEh1YXdlaQpicmFuZBxIVUFXRUkrTWF0ZSsyMA5idWlsZElkFHJlcGxhY2VBbGwOcmVwbGFjZQQvLwxodHRwczoIaHR0cBRVc2VyLUFnZW50DnJlZmVyZXIOUmVmZXJlcgxoZWFkZXIPpAMBpgMBABuoAwAFAKoDAAGsAwACrgMAA7ADAASyAwAOAAYBoAEAAAABHBB5AKoDAAysAwEMrgMCDLADAwyyAwQMtAMA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 --------------------------------------------------------------------------------