diff --git a/bin/builders/BaseBuilder.ts b/bin/builders/BaseBuilder.ts index 395b272..608e4b7 100644 --- a/bin/builders/BaseBuilder.ts +++ b/bin/builders/BaseBuilder.ts @@ -71,6 +71,10 @@ export default abstract class BaseBuilder { await this.buildAndCopy(url, this.options.targets); } + async start(url: string) { + await mergeConfig(url, this.options, tauriConfig); + } + async buildAndCopy(url: string, target: string) { const { name } = this.options; await mergeConfig(url, this.options, tauriConfig); diff --git a/bin/defaults.ts b/bin/defaults.ts index 6c4aec5..1d2b6d6 100644 --- a/bin/defaults.ts +++ b/bin/defaults.ts @@ -18,3 +18,11 @@ export const DEFAULT_PAKE_OPTIONS: PakeCliOptions = { inject: [], safeDomain: [], }; + +// just for cli development +export const DEFAULT_DEV_PAKE_OPTIONS: PakeCliOptions & {url: string} = { + ...DEFAULT_PAKE_OPTIONS, + url: 'https://zbook.lol', + name: 'Zbook', + safeDomain: ['zbook.eu.org'] +} \ No newline at end of file diff --git a/bin/dev.ts b/bin/dev.ts new file mode 100644 index 0000000..f4b67cd --- /dev/null +++ b/bin/dev.ts @@ -0,0 +1,17 @@ +import log from 'loglevel'; +import {DEFAULT_DEV_PAKE_OPTIONS} from './defaults'; +import handleInputOptions from './options/index'; +import BuilderProvider from './builders/BuilderProvider'; + +async function startBuild() { + log.setDefaultLevel('debug'); + + const appOptions = await handleInputOptions(DEFAULT_DEV_PAKE_OPTIONS, DEFAULT_DEV_PAKE_OPTIONS.url); + log.debug('PakeAppOptions', appOptions); + + const builder = BuilderProvider.create(appOptions); + await builder.prepare(); + await builder.start(DEFAULT_DEV_PAKE_OPTIONS.url); +} + +startBuild(); \ No newline at end of file diff --git a/bin/helpers/merge.ts b/bin/helpers/merge.ts index 2d3fd55..d5fcb25 100644 --- a/bin/helpers/merge.ts +++ b/bin/helpers/merge.ts @@ -183,7 +183,7 @@ export async function mergeConfig(url: string, options: PakeAppOptions, tauriCon } tauriConf.tauri.systemTray.iconPath = trayIconPath; - + const injectFilePath = path.join(npmDirectory, `src-tauri/src/inject/_INJECT_.js`); // inject js or css files if (inject?.length > 0) { if (!inject.every(item => item.endsWith('.css') || item.endsWith('.js'))) { @@ -192,7 +192,10 @@ export async function mergeConfig(url: string, options: PakeAppOptions, tauriCon } const files = inject.map(filepath => path.isAbsolute(filepath) ? filepath : path.join(process.cwd(), filepath)); tauriConf.pake.inject = files; - await combineFiles(files, path.join(npmDirectory, `src-tauri/src/inject/_INJECT_.js`)); + await combineFiles(files, injectFilePath); + } else { + tauriConf.pake.inject = []; + await fsExtra.writeFile(injectFilePath, ''); } // Save config file. @@ -205,7 +208,6 @@ export async function mergeConfig(url: string, options: PakeAppOptions, tauriCon const bundleConf = { tauri: { bundle: tauriConf.tauri.bundle } }; await fsExtra.writeJson(configPath, bundleConf, { spaces: 4 }); - const pakeConfigPath = path.join(npmDirectory, 'src-tauri/pake.json'); await fsExtra.writeJson(pakeConfigPath, tauriConf.pake, { spaces: 4 }); diff --git a/bin/utils/dir.ts b/bin/utils/dir.ts index cb5a697..c46d9fd 100644 --- a/bin/utils/dir.ts +++ b/bin/utils/dir.ts @@ -5,4 +5,4 @@ import { fileURLToPath } from 'url'; const currentModulePath = fileURLToPath(import.meta.url); // Resolve the parent directory of the current module -export const npmDirectory = path.join(path.dirname(currentModulePath), '..'); +export const npmDirectory = process.env.DEV === 'true' ? process.cwd() : path.join(path.dirname(currentModulePath), '..'); diff --git a/package.json b/package.json index 6ddbac1..f5cf7a1 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "analyze": "cd src-tauri && cargo bloat --release --crates", "tauri": "tauri", "cli": "rollup -c rollup.config.js --watch", + "cli:dev": "cross-env DEV=true tsx watch ./bin/dev.ts & npm run dev", "cli:build": "cross-env NODE_ENV=production rollup -c rollup.config.js", "prepublishOnly": "npm run cli:build" }, diff --git a/src-tauri/src/inject/_INJECT_.js b/src-tauri/src/inject/_INJECT_.js index 999d1a3..e69de29 100644 --- a/src-tauri/src/inject/_INJECT_.js +++ b/src-tauri/src/inject/_INJECT_.js @@ -1,485 +0,0 @@ -window.addEventListener('DOMContentLoaded', (_event) => { // ==UserScript== -// @name 全网VIP视频免费破解【专注一个脚本只做一件事件】长期更新,放心使用 -// @namespace http://tampermonkey.net/ -// @version 1.6.1 -// @description 全网VIP视频免费破解【专注一个脚本只做一件事件】长期更新,放心使用。支持:腾讯、爱奇艺、优酷、芒果、Bilibili、pptv、乐视等其它网站; -// @icon data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAkACQAAD//gAUU29mdHdhcmU6IFNuaXBhc3Rl/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAGgAeAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8/stTivZLhFV0eBtrhwB+PXpXc/Bj4bXXxy1ObTdE1XTrDUE3GO31PzkMyqMsytHE64Gf4iD6A15TrUx0fUriVQcXcBUY/vjivpb9hGz+w/GLTocYK6dcbvqQCa/Q6ec46dWth21zUFNzdt3zfuvS8btng5rwnkuCy3DZrSi3DGyoqiuZ6JQf1m/flq2hG+yMPTf2e9X1nVPEFlZa9olx/YTmO9nDXKxo4LB1G6AMxUockDB7E1i+Jvg/rnhzw/peuRSWut6RqP+pu9MMjgHBIDK6KwOAe3bBwa+g/hQEPiP41CVmSM6ndbmRdxA3zZIGRn8xXkniP42Wdr4C0Dwp4XhvPI0/wDeTX2oIsbyvhshUR2AGWJ5Y9h71+cUuKuK8ZxVisry6KqUqFSkpJxSiqc6DnKUp7qXPyqKV7pv3WtV8NWyzLKGAhXrNxlNTtZ3fNGdkku3Le/5njU1tDcbfNiSXacrvUHB9q3/AA/438R+Eo5o9D1/VNGSYhpV0+8kgDkdCwRhn8axaK/od0abbbitd9N7bXPh/rNflhDndo3sruyvvbtfrbc6Kf4j+LLq4uJ5vFGszT3CCOaSTUJmaVBnCsS2SBk8H1Nc7RRUU8NRoylOlBRcrXaSTdtFfvZbGU6tSpbnk3buz//Z -// @author w__yi -// @match *://*.youku.com/* -// @match *://*.iqiyi.com/* -// @match *://*.iq.com/* -// @match *://*.le.com/* -// @match *://v.qq.com/* -// @match *://m.v.qq.com/* -// @match *://*.tudou.com/* -// @match *://*.mgtv.com/* -// @match *://tv.sohu.com/* -// @match *://film.sohu.com/* -// @match *://*.1905.com/* -// @match *://*.bilibili.com/* -// @match *://*.pptv.com/* - -// @require https://cdn.bootcdn.net/ajax/libs/jquery/3.2.1/jquery.min.js -// @connect api.bilibili.com -// @grant unsafeWindow -// @grant GM_addStyle -// @grant GM_openInTab -// @grant GM_getValue -// @grant GM_setValue -// @grant GM_xmlhttpRequest -// @grant GM_log -// @charset UTF-8 -// @license GPL License -// ==/UserScript== - - - -window.addEventListener('DOMContentLoaded', function() { - const util = (function () { - - function findTargetElement(targetContainer) { - const body = window.document; - let tabContainer; - let tryTime = 0; - const maxTryTime = 120; - let startTimestamp; - return new Promise((resolve, reject) => { - function tryFindElement(timestamp) { - if (!startTimestamp) { - startTimestamp = timestamp; - } - const elapsedTime = timestamp - startTimestamp; - - if (elapsedTime >= 500) { - GM_log("查找元素:" + targetContainer + ",第" + tryTime + "次"); - tabContainer = body.querySelector(targetContainer); - if (tabContainer) { - resolve(tabContainer); - } else if (++tryTime === maxTryTime) { - reject(); - } else { - startTimestamp = timestamp; - } - } - if (!tabContainer && tryTime < maxTryTime) { - requestAnimationFrame(tryFindElement); - } - } - - requestAnimationFrame(tryFindElement); - }); - } - - function urlChangeReload() { - const oldHref = window.location.href; - let interval = setInterval(() => { - let newHref = window.location.href; - if (oldHref !== newHref) { - clearInterval(interval); - window.location.reload(); - } - }, 500); - } - - function reomveVideo() { - setInterval(() => { - for (let video of document.getElementsByTagName("video")) { - if (video.src) { - video.removeAttribute("src"); - video.muted = true; - video.load(); - video.pause(); - } - } - }, 500); - } - - function syncRequest(option) { - return new Promise((resolve, reject) => { - option.onload = (res) => { - resolve(res); - }; - option.onerror = (err) => { - reject(err); - }; - GM_xmlhttpRequest(option); - }); - } - - return { - req: (option) => syncRequest(option), - findTargetEle: (targetEle) => findTargetElement(targetEle), - urlChangeReload: () => urlChangeReload(), - reomveVideo: () => reomveVideo() - } - })(); - - - const superVip = (function () { - - const _CONFIG_ = { - isMobile: navigator.userAgent.match(/(Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini)/i), - currentPlayerNode: null, - vipBoxId: 'vip_jx_box' + Math.ceil(Math.random() * 100000000), - flag: "flag_vip", - autoPlayerKey: "auto_player_key" + window.location.host, - autoPlayerVal: "auto_player_value_" + window.location.host, - videoParseList: [ - {"name": "综合/B站", "type": "1,3", "url": "https://jx.jsonplayer.com/player/?url="}, - /*{"name": "Player-JY", "type": "1,3", "url": "https://jx.playerjy.com/?url="},*/ - {"name": "虾米", "type": "1,3", "url": "https://jx.xmflv.com/?url="}, - /*{"name": "NNXV", "type": "1,3", "url": "https://jx.nnxv.cn/tv.php?url="},*/ - /*{"name": "听乐", "type": "1,3", "url": "https://jx.dj6u.com/?url="},*/ - /*{"name": "RDHK", "type": "1,3", "url": "https://jx.rdhk.net/?v="},*/ - {"name": "OK", "type": "1,3", "url": "https://api.okjx.cc:3389/jx.php?url="}, - {"name": "OKJX", "type": "1,3", "url": "https://okjx.cc/?url="}, - {"name": "YT", "type": "1,3", "url": "https://jx.yangtu.top/?url="}, - {"name": "爱豆", "type": "1,3", "url": "https://jx.aidouer.net/?url="}, - {"name": "猪蹄", "type": "1,3", "url": "https://jx.iztyy.com/Bei/?url="}, - {"name": "yparse", "type": "1,2", "url": "https://jx.yparse.com/index.php?url="}, - {"name": "夜幕", "type": "1,3", "url": "https://www.yemu.xyz/?url="}, - {"name": "m1907", "type": "1,2", "url": "https://im1907.top/?jx="}, - {"name": "MAO", "type": "1,3", "url": "https://www.mtosz.com/m3u8.php?url="}, - {"name": "M3U8TV", "type": "1,3", "url": "https://jx.m3u8.tv/jiexi/?url="}, - {"name": "铭人云", "type": "1,3", "url": "https://parse.123mingren.com/?url="}, - {"name": "4kdv", "type": "1,3", "url": "https://jx.4kdv.com/?url="}, - - {"name": "1717", "type": "1,3", "url": "https://ckmov.ccyjjd.com/ckmov/?url="}, - {"name": "8090", "type": "1,3", "url": "https://www.8090g.cn/?url="}, - {"name": "qianqi", "type": "1,3", "url": "https://api.qianqi.net/vip/?url="}, - {"name": "laobandq", "type": "1,3", "url": "https://vip.laobandq.com/jiexi.php?url="}, - {"name": "playm3u8", "type": "1,3", "url": "https://www.playm3u8.cn/jiexi.php?url="}, - {"name": "无名小站", "type": "1,3", "url": "https://www.administratorw.com/video.php?url="}, - {"name": "CK", "type": "1,3", "url": "https://www.ckplayer.vip/jiexi/?url="}, - {"name": "盘古", "type": "1,3", "url": "https://go.yh0523.cn/y.cy?url="}, - {"name": "Blbo", "type": "1,3", "url": "https://jx.blbo.cc:4433/?url="}, - ], - playerContainers: [ - { - host: "v.qq.com", - container: "#mod_player,#player-container,.container-player", - name: "Default", - displayNodes: ["#mask_layer", ".mod_vip_popup", "#mask_layer", ".panel-tip-pay"] - }, - { - host: "m.v.qq.com", - container: ".mod_player,#player", - name: "Default", - displayNodes: [".mod_vip_popup", "[class^=app_],[class^=app-],[class*=_app_],[class*=-app-],[class$=_app],[class$=-app]", "div[dt-eid=open_app_bottom]", "div.video_function.video_function_new", "a[open-app]", "section.mod_source", "section.mod_box.mod_sideslip_h.mod_multi_figures_h,section.mod_sideslip_privileges,section.mod_game_rec", ".at-app-banner"] - }, - - {host: "w.mgtv.com", container: "#mgtv-player-wrap", name: "Default", displayNodes: []}, - {host: "www.mgtv.com", container: "#mgtv-player-wrap", name: "Default", displayNodes: []}, - { - host: "m.mgtv.com", - container: ".video-area", - name: "Default", - displayNodes: ["div[class^=mg-app]", ".video-area-bar", ".open-app-popup"] - }, - {host: "www.bilibili.com", container: "#player_module,#bilibiliPlayer,#bilibili-player", name: "Default", displayNodes: []}, - {host: "m.bilibili.com", container: ".player-wrapper,.player-container,.mplayer", name: "Default", displayNodes: []}, - {host: "www.iqiyi.com", container: "#flashbox", name: "Default", displayNodes: ["#playerPopup", "div[class^=qy-header-login-pop]", "section[class^=modal-cover_]" ,".toast"]}, - { - host: "m.iqiyi.com", - container: ".m-video-player-wrap", - name: "Default", - displayNodes: ["div.m-iqyGuide-layer", "a[down-app-android-url]", "[name=m-extendBar]", "[class*=ChannelHomeBanner]", "section.m-hotWords-bottom"] - }, - {host: "www.iq.com", container: ".intl-video-wrap", name: "Default", displayNodes: []}, - {host: "v.youku.com", container: "#player", name: "Default", displayNodes: ["#iframaWrapper", "#checkout_counter_mask", "#checkout_counter_popup"]}, - { - host: "m.youku.com", - container: "#player,.h5-detail-player", - name: "Default", - displayNodes: [".callEnd_box", ".h5-detail-guide", ".h5-detail-vip-guide"] - }, - {host: "tv.sohu.com", container: "#player", name: "Default", displayNodes: []}, - {host: "film.sohu.com", container: "#playerWrap", name: "Default", displayNodes: []}, - {host: "www.le.com", container: "#le_playbox", name: "Default", displayNodes: []}, - {host: "video.tudou.com", container: ".td-playbox", name: "Default", displayNodes: []}, - {host: "v.pptv.com", container: "#pptv_playpage_box", name: "Default", displayNodes: []}, - {host: "vip.pptv.com", container: ".w-video", name: "Default", displayNodes: []}, - {host: "www.wasu.cn", container: "#flashContent", name: "Default", displayNodes: []}, - {host: "www.acfun.cn", container: "#player", name: "Default", displayNodes: []}, - {host: "vip.1905.com", container: "#player,#vodPlayer", name: "Default", displayNodes: []}, - {host: "www.1905.com", container: "#player,#vodPlayer", name: "Default", displayNodes: []}, - ] - }; - - class BaseConsumer { - constructor() { - this.parse = () => { - util.findTargetEle('body') - .then((container) => this.preHandle(container)) - .then((container) => this.generateElement(container)) - .then((container) => this.bindEvent(container)) - .then((container) => this.autoPlay(container)) - .then((container) => this.postHandle(container)); - } - } - - preHandle(container) { - _CONFIG_.currentPlayerNode.displayNodes.forEach((item, index) => { - util.findTargetEle(item) - .then((obj) => obj.style.display = 'none') - .catch(e => console.warn("不存在元素", e)); - }); - return new Promise((resolve, reject) => resolve(container)); - } - - generateElement(container) { - GM_addStyle(` - #${_CONFIG_.vipBoxId} {cursor:pointer; position:fixed; top:120px; left:0px; z-index:9999999; text-align:left;} - #${_CONFIG_.vipBoxId} .img_box{width:32px; height:32px;line-height:32px;text-align:center;background-color:#1c84c6;margin:10px 0px;} - #${_CONFIG_.vipBoxId} .vip_list {display:none; position:absolute; border-radius:5px; left:32px; top:0; text-align:center; background-color: #3f4149; border:1px solid white;padding:10px 0px; width:380px; max-height:400px; overflow-y:auto;} - #${_CONFIG_.vipBoxId} .vip_list li{border-radius:2px; font-size:12px; color:#DCDCDC; text-align:center; width:calc(25% - 14px); line-height:21px; float:left; border:1px solid gray; padding:0 4px; margin:4px 2px;overflow:hidden;white-space: nowrap;text-overflow: ellipsis;-o-text-overflow:ellipsis;} - #${_CONFIG_.vipBoxId} .vip_list li:hover{color:#1c84c6; border:1px solid #1c84c6;} - #${_CONFIG_.vipBoxId} .vip_list ul{padding-left: 10px;} - #${_CONFIG_.vipBoxId} .vip_list::-webkit-scrollbar{width:5px; height:1px;} - #${_CONFIG_.vipBoxId} .vip_list::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#A8A8A8;} - #${_CONFIG_.vipBoxId} .vip_list::-webkit-scrollbar-track{box-shadow:inset 0 0 5px rgba(0, 0, 0, 0.2); background:#F1F1F1;} - #${_CONFIG_.vipBoxId} li.selected{color:#1c84c6; border:1px solid #1c84c6;} - `); - - if (_CONFIG_.isMobile) { - GM_addStyle(` - #${_CONFIG_.vipBoxId} {top:300px;} - #${_CONFIG_.vipBoxId} .vip_list {width:300px;} - `); - } - - let type_1_str = ""; - let type_2_str = ""; - let type_3_str = ""; - _CONFIG_.videoParseList.forEach((item, index) => { - if (item.type.includes("1")) { - type_1_str += `