Full Code of Hiram-Wong/zyfun for AI

main 6af6f2cab581 cached
637 files
7.4 MB
2.0M tokens
2915 symbols
1 requests
Download .txt
Showing preview only (7,926K chars total). Download the full file or copy to clipboard to get everything.
Repository: Hiram-Wong/zyfun
Branch: main
Commit: 6af6f2cab581
Files: 637
Total size: 7.4 MB

Directory structure:
gitextract_76v9j0zk/

├── .editorconfig
├── .env.example
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.zh-CN.yml
│   │   └── feature-report.zh-CN.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── nightly-build.yml
│       └── release.yml
├── .gitignore
├── .ncurc.yaml
├── .node-version
├── .npmrc
├── .nvmrc
├── .prettierignore
├── .prettierrc.yaml
├── .stylelintignore
├── .stylelintrc.yml
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── mcp.json
│   └── settings.json
├── CHANGELOG.md
├── LICENSE.txt
├── README.md
├── SECURITY.md
├── ThirdPartyNotices.txt
├── build/
│   ├── entitlements.mac.inherit.plist
│   ├── entitlements.mac.plist
│   ├── icon.icns
│   └── nsis-installer.nsh
├── commitlint.config.js
├── design/
│   ├── player.sketch
│   └── video_platform.sketch
├── dev-app-update.yml
├── docs/
│   ├── Conventional_Commits.md
│   ├── Develop.md
│   ├── HarmonyOS_Electron.md
│   ├── Loong_Electron.md
│   └── Mcp.md
├── electron-builder.yml
├── electron.vite.config.ts
├── eslint.config.js
├── package.json
├── packages/
│   └── shared/
│       ├── config/
│       │   ├── appinfo.ts
│       │   ├── cmsAction.ts
│       │   ├── constant.ts
│       │   ├── data.ts
│       │   ├── dns.ts
│       │   ├── env.ts
│       │   ├── film.ts
│       │   ├── ipcChannel.ts
│       │   ├── live.ts
│       │   ├── logger.ts
│       │   ├── notification.ts
│       │   ├── parse.ts
│       │   ├── req.ts
│       │   ├── setting.ts
│       │   ├── shortcut.ts
│       │   ├── tblSetting.ts
│       │   ├── theme.ts
│       │   ├── userAgent.ts
│       │   ├── window.ts
│       │   └── xmlOptions.ts
│       ├── locales/
│       │   ├── index.ts
│       │   └── lang/
│       │       ├── en-US/
│       │       │   ├── aigc.ts
│       │       │   ├── common.ts
│       │       │   ├── component.ts
│       │       │   ├── index.ts
│       │       │   ├── media.ts
│       │       │   ├── pages/
│       │       │   │   ├── assets/
│       │       │   │   │   ├── binary-help.md
│       │       │   │   │   ├── custom-player.md
│       │       │   │   │   ├── disclaimer.md
│       │       │   │   │   ├── lab-edit-help.md
│       │       │   │   │   ├── live-epg.md
│       │       │   │   │   └── live-logo.md
│       │       │   │   ├── browser.ts
│       │       │   │   ├── film.ts
│       │       │   │   ├── index.ts
│       │       │   │   ├── lab.ts
│       │       │   │   ├── live.ts
│       │       │   │   ├── md.ts
│       │       │   │   ├── moment.ts
│       │       │   │   ├── parse.ts
│       │       │   │   ├── player.ts
│       │       │   │   ├── plugin.ts
│       │       │   │   └── setting.ts
│       │       │   └── system.ts
│       │       ├── zh-CN/
│       │       │   ├── aigc.ts
│       │       │   ├── common.ts
│       │       │   ├── component.ts
│       │       │   ├── index.ts
│       │       │   ├── media.ts
│       │       │   ├── pages/
│       │       │   │   ├── assets/
│       │       │   │   │   ├── binary-help.md
│       │       │   │   │   ├── custom-player.md
│       │       │   │   │   ├── disclaimer.md
│       │       │   │   │   ├── lab-edit-help.md
│       │       │   │   │   ├── live-epg.md
│       │       │   │   │   └── live-logo.md
│       │       │   │   ├── browser.ts
│       │       │   │   ├── film.ts
│       │       │   │   ├── index.ts
│       │       │   │   ├── lab.ts
│       │       │   │   ├── live.ts
│       │       │   │   ├── md.ts
│       │       │   │   ├── moment.ts
│       │       │   │   ├── parse.ts
│       │       │   │   ├── player.ts
│       │       │   │   ├── plugin.ts
│       │       │   │   └── setting.ts
│       │       │   └── system.ts
│       │       └── zh-TW/
│       │           ├── aigc.ts
│       │           ├── common.ts
│       │           ├── component.ts
│       │           ├── index.ts
│       │           ├── media.ts
│       │           ├── pages/
│       │           │   ├── assets/
│       │           │   │   ├── binary-help.md
│       │           │   │   ├── custom-player.md
│       │           │   │   ├── disclaimer.md
│       │           │   │   ├── lab-edit-help.md
│       │           │   │   ├── live-epg.md
│       │           │   │   └── live-logo.md
│       │           │   ├── browser.ts
│       │           │   ├── film.ts
│       │           │   ├── index.ts
│       │           │   ├── lab.ts
│       │           │   ├── live.ts
│       │           │   ├── md.ts
│       │           │   ├── moment.ts
│       │           │   ├── parse.ts
│       │           │   ├── player.ts
│       │           │   ├── plugin.ts
│       │           │   └── setting.ts
│       │           └── system.ts
│       ├── modules/
│       │   ├── __tests__/
│       │   │   ├── camelcase.test.ts
│       │   │   ├── headers.test.ts
│       │   │   ├── obj.test.ts
│       │   │   └── validate.test.ts
│       │   ├── cache.ts
│       │   ├── camelcase.ts
│       │   ├── crypto/
│       │   │   ├── core/
│       │   │   │   ├── base.ts
│       │   │   │   ├── encode.ts
│       │   │   │   ├── encrypt/
│       │   │   │   │   ├── aes.ts
│       │   │   │   │   ├── crypto.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── rsa.ts
│       │   │   │   │   └── sm.ts
│       │   │   │   └── mac.ts
│       │   │   ├── index.ts
│       │   │   ├── modules/
│       │   │   │   └── atob-btoa.ts
│       │   │   ├── type.ts
│       │   │   └── utils/
│       │   │       ├── base.ts
│       │   │       ├── forge.ts
│       │   │       └── wordArray.ts
│       │   ├── date.ts
│       │   ├── function.ts
│       │   ├── headers.ts
│       │   ├── ip.ts
│       │   ├── lrucache.ts
│       │   ├── obj.ts
│       │   ├── request/
│       │   │   ├── axios/
│       │   │   │   ├── Axios.ts
│       │   │   │   ├── AxiosCancel.ts
│       │   │   │   └── AxiosTransform.ts
│       │   │   ├── constants.ts
│       │   │   ├── index.ts
│       │   │   ├── sse/
│       │   │   │   ├── Sse.ts
│       │   │   │   ├── SseCancel.ts
│       │   │   │   └── SseTransform.ts
│       │   │   ├── type.ts
│       │   │   ├── utils.ts
│       │   │   └── ws/
│       │   │       ├── Ws.ts
│       │   │       ├── WsCancel.ts
│       │   │       └── WsTransform.ts
│       │   ├── schedule.ts
│       │   ├── singleton.ts
│       │   ├── size.ts
│       │   ├── toString.ts
│       │   ├── validate.ts
│       │   └── zip/
│       │       ├── 7z.ts
│       │       ├── gz.ts
│       │       ├── index.ts
│       │       ├── tgz.ts
│       │       └── zip.ts
│       └── types/
│           ├── barrage.ts
│           ├── cms.ts
│           ├── common.ts
│           ├── db.ts
│           ├── sift.ts
│           └── systeminfo.ts
├── patches/
│   ├── @oplayer-core-npm-1.2.38-beta.2-66bf7d6252.patch
│   ├── @oplayer-torrent-npm-1.2.25-beta.2-6efddccea2.patch
│   ├── artplayer@5.4.0.patch
│   ├── atomically-npm-1.7.0-e742e5293b.patch
│   ├── dplayer@1.32.7.patch
│   ├── electron-devtools-installer-npm-4.0.0-ea55a28d94.patch
│   ├── electron-updater-npm-6.7.0-47b11bb0d4.patch
│   ├── file-stream-rotator-npm-0.6.1-eab45fb13d.patch
│   ├── libsql-npm-0.4.7-444e260fb1.patch
│   └── shaka-player-npm-4.13.0-5e61f852f3.patch
├── pnpm-workspace.yaml
├── resources/
│   ├── scripts/
│   │   ├── download.js
│   │   ├── install-bun.js
│   │   ├── install-ffmpeg.js
│   │   ├── install-ffprobe.js
│   │   └── install-uv.js
│   ├── t3Catopen/
│   │   ├── cat.js
│   │   ├── crypto-js.js
│   │   ├── http.js
│   │   ├── mod.js
│   │   ├── similarity.js
│   │   ├── sortName.js
│   │   └── spider.js
│   └── t3PyBase/
│       ├── __tests__/
│       │   ├── demo.py
│       │   ├── logger.py
│       │   └── test.py
│       ├── base/
│       │   ├── htmlParser.py
│       │   └── spider.py
│       ├── main.py
│       ├── pyproject.toml
│       └── requirements.txt
├── scripts/
│   ├── after-pack.js
│   ├── artifact-build-completed.js
│   ├── before-pack.js
│   ├── generate-changelog.js
│   ├── generate-license.js
│   ├── minidump.js
│   ├── notarize.js
│   ├── version.js
│   └── win-sign.js
├── src/
│   ├── main/
│   │   ├── electron.d.ts
│   │   ├── env.d.ts
│   │   ├── index.ts
│   │   ├── ipc.ts
│   │   ├── services/
│   │   │   ├── AppLocale.ts
│   │   │   ├── AppService.ts
│   │   │   ├── AppUpdater.ts
│   │   │   ├── BinaryService.ts
│   │   │   ├── CdpElectron.ts
│   │   │   ├── ConfigManager.ts
│   │   │   ├── ContextMenu.ts
│   │   │   ├── DbService/
│   │   │   │   ├── crud/
│   │   │   │   │   ├── analyze.ts
│   │   │   │   │   ├── channel.ts
│   │   │   │   │   ├── history.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── iptv.ts
│   │   │   │   │   ├── plugin.ts
│   │   │   │   │   ├── setting.ts
│   │   │   │   │   ├── site.ts
│   │   │   │   │   └── star.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── migrations/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── migrate-3_3_1.ts
│   │   │   │   │   ├── migrate-3_3_10.ts
│   │   │   │   │   ├── migrate-3_3_2.ts
│   │   │   │   │   ├── migrate-3_3_4.ts
│   │   │   │   │   ├── migrate-3_3_5.ts
│   │   │   │   │   ├── migrate-3_3_7.ts
│   │   │   │   │   ├── migrate-3_3_8.ts
│   │   │   │   │   ├── migrate-3_3_9.ts
│   │   │   │   │   ├── migrate-3_4_0.ts
│   │   │   │   │   └── migrate-3_4_1.ts
│   │   │   │   └── schemas/
│   │   │   │       ├── analyze.ts
│   │   │   │       ├── channel.ts
│   │   │   │       ├── history.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── iptv.ts
│   │   │   │       ├── plugin.ts
│   │   │   │       ├── setting.ts
│   │   │   │       ├── site.ts
│   │   │   │       └── star.ts
│   │   │   ├── FFmpegService.ts
│   │   │   ├── FastifyService/
│   │   │   │   ├── fastify.d.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── routes/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── v0/
│   │   │   │   │   │   └── proxy/
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   └── v1/
│   │   │   │   │       ├── aigc/
│   │   │   │   │       │   ├── chat.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── memory.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       ├── chat.ts
│   │   │   │   │       │       └── memory.ts
│   │   │   │   │       ├── data/
│   │   │   │   │       │   ├── cloud.ts
│   │   │   │   │       │   ├── db.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       └── data.ts
│   │   │   │   │       ├── file/
│   │   │   │   │       │   ├── film.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── manage.ts
│   │   │   │   │       ├── film/
│   │   │   │   │       │   ├── cms/
│   │   │   │   │       │   │   ├── adapter/
│   │   │   │   │       │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   ├── t0Xml.ts
│   │   │   │   │       │   │   │   ├── t1Json.ts
│   │   │   │   │       │   │   │   ├── t3Alist.ts
│   │   │   │   │       │   │   │   ├── t3AppGet.ts
│   │   │   │   │       │   │   │   ├── t3AppYsV2.ts
│   │   │   │   │       │   │   │   ├── t3Catopen/
│   │   │   │   │       │   │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   │   ├── inject.ts
│   │   │   │   │       │   │   │   │   └── worker.ts
│   │   │   │   │       │   │   │   ├── t3Drpy/
│   │   │   │   │       │   │   │   │   ├── decrypt.ts
│   │   │   │   │       │   │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   │   ├── inject.ts
│   │   │   │   │       │   │   │   │   ├── templates.ts
│   │   │   │   │       │   │   │   │   └── worker.ts
│   │   │   │   │       │   │   │   ├── t3Py.ts
│   │   │   │   │       │   │   │   ├── t3Xbpq/
│   │   │   │   │       │   │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   │   ├── methods.ts
│   │   │   │   │       │   │   │   │   └── rule.ts
│   │   │   │   │       │   │   │   ├── t3Xyq.ts
│   │   │   │   │       │   │   │   ├── t4Catvod.ts
│   │   │   │   │       │   │   │   ├── t4DrpyJs0.ts
│   │   │   │   │       │   │   │   └── t4Drpys.ts
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── utils/
│   │   │   │   │       │   │       ├── cache.ts
│   │   │   │   │       │   │       └── cms.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── utils/
│   │   │   │   │       │   │       └── sift.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── rec/
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── utils/
│   │   │   │   │       │   │       ├── barrage.ts
│   │   │   │   │       │   │       ├── douban.ts
│   │   │   │   │       │   │       └── hot.ts
│   │   │   │   │       │   └── site.ts
│   │   │   │   │       ├── live/
│   │   │   │   │       │   ├── channel.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── iptv.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       ├── channel.ts
│   │   │   │   │       │       └── epg.ts
│   │   │   │   │       ├── moment/
│   │   │   │   │       │   ├── history.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── moment.ts
│   │   │   │   │       │   └── star.ts
│   │   │   │   │       ├── parse/
│   │   │   │   │       │   ├── analyze.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── parse.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       └── mediaDirect.ts
│   │   │   │   │       ├── plugin/
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── setting/
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       └── system/
│   │   │   │   │           ├── binary.ts
│   │   │   │   │           ├── cdp.ts
│   │   │   │   │           ├── ffmpeg.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── other.ts
│   │   │   │   │           ├── process.ts
│   │   │   │   │           └── utils/
│   │   │   │   │               ├── m3u8.ts
│   │   │   │   │               └── sniffer.ts
│   │   │   │   └── schemas/
│   │   │   │       ├── base.ts
│   │   │   │       ├── v0/
│   │   │   │       │   └── proxy.ts
│   │   │   │       └── v1/
│   │   │   │           ├── aigc/
│   │   │   │           │   ├── chat.ts
│   │   │   │           │   └── memory.ts
│   │   │   │           ├── data/
│   │   │   │           │   ├── cloud.ts
│   │   │   │           │   └── db.ts
│   │   │   │           ├── file/
│   │   │   │           │   ├── film.ts
│   │   │   │           │   └── manage.ts
│   │   │   │           ├── flim/
│   │   │   │           │   ├── cms.ts
│   │   │   │           │   ├── edit.ts
│   │   │   │           │   ├── rec.ts
│   │   │   │           │   └── site.ts
│   │   │   │           ├── live/
│   │   │   │           │   ├── channel.ts
│   │   │   │           │   └── iptv.ts
│   │   │   │           ├── moment/
│   │   │   │           │   ├── history.ts
│   │   │   │           │   ├── moment.ts
│   │   │   │           │   └── star.ts
│   │   │   │           ├── parse/
│   │   │   │           │   ├── analyze.ts
│   │   │   │           │   └── parse.ts
│   │   │   │           ├── plugin.ts
│   │   │   │           ├── setting.ts
│   │   │   │           └── system/
│   │   │   │               ├── binary.ts
│   │   │   │               ├── cdp.ts
│   │   │   │               ├── ffmpeg.ts
│   │   │   │               ├── other.ts
│   │   │   │               └── process.ts
│   │   │   ├── FileStorage.ts
│   │   │   ├── LoggerService.ts
│   │   │   ├── MenuService.ts
│   │   │   ├── NotificationService.ts
│   │   │   ├── PluginService.ts
│   │   │   ├── ProtocolClient.ts
│   │   │   ├── ProxyManager.ts
│   │   │   ├── PythonService.ts
│   │   │   ├── ShortcutService.ts
│   │   │   ├── StorageService/
│   │   │   │   ├── ICloudStorage.ts
│   │   │   │   ├── WebdavStorage.ts
│   │   │   │   └── index.ts
│   │   │   ├── ThemeService.ts
│   │   │   ├── TrayService.ts
│   │   │   ├── WebviewService.ts
│   │   │   ├── WindowService.ts
│   │   │   └── __tests__/
│   │   │       └── ProxyManager.test.ts
│   │   ├── types/
│   │   │   ├── argv.ts
│   │   │   ├── server.ts
│   │   │   └── tvbox.ts
│   │   └── utils/
│   │       ├── argv.ts
│   │       ├── file.ts
│   │       ├── hiker/
│   │       │   ├── baseSpider.ts
│   │       │   ├── crypto.ts
│   │       │   ├── htmlParser.ts
│   │       │   ├── index.ts
│   │       │   ├── inject.ts
│   │       │   ├── jinja.ts
│   │       │   ├── local.ts
│   │       │   ├── proxy.ts
│   │       │   ├── request/
│   │       │   │   ├── asyncAxios.ts
│   │       │   │   ├── syncFetch.ts
│   │       │   │   └── syncRequest.ts
│   │       │   ├── ruleParse.ts
│   │       │   ├── similarity.ts
│   │       │   └── ua.ts
│   │       ├── ip.ts
│   │       ├── path.ts
│   │       ├── process.ts
│   │       ├── request/
│   │       │   └── index.ts
│   │       ├── shell.ts
│   │       ├── systeminfo.ts
│   │       └── tool.ts
│   ├── preload/
│   │   ├── index.ts
│   │   ├── preload.d.ts
│   │   └── utils/
│   │       ├── dom.ts
│   │       └── loading.ts
│   └── renderer/
│       ├── index.html
│       └── src/
│           ├── App.vue
│           ├── api/
│           │   ├── aigc.ts
│           │   ├── data.ts
│           │   ├── film.ts
│           │   ├── live.ts
│           │   ├── moment.ts
│           │   ├── parse.ts
│           │   ├── plugin.ts
│           │   ├── proxy.ts
│           │   ├── setting.ts
│           │   └── system.ts
│           ├── components/
│           │   ├── action/
│           │   │   ├── components/
│           │   │   │   ├── ActionSection.vue
│           │   │   │   ├── BrowserActionSection.vue
│           │   │   │   ├── FormActionSection.vue
│           │   │   │   ├── HelpActionSection.vue
│           │   │   │   └── MsgBoxActionSection.vue
│           │   │   ├── index.vue
│           │   │   └── utils.ts
│           │   ├── aigc/
│           │   │   └── index.vue
│           │   ├── code-editor/
│           │   │   ├── index.ts
│           │   │   └── src/
│           │   │       ├── code-editor-types.ts
│           │   │       ├── code-editor.less
│           │   │       ├── code-editor.tsx
│           │   │       ├── composables/
│           │   │       │   ├── use-code-editor-hooks.ts
│           │   │       │   └── use-code-editor.ts
│           │   │       └── themes/
│           │   │           ├── code-dark.ts
│           │   │           ├── code-light.ts
│           │   │           └── index.ts
│           │   ├── common-nav/
│           │   │   └── index.vue
│           │   ├── dialog-document/
│           │   │   └── index.vue
│           │   ├── group-btn/
│           │   │   └── index.vue
│           │   ├── input-req/
│           │   │   ├── index.vue
│           │   │   └── utils.ts
│           │   ├── input-shortcut/
│           │   │   └── index.vue
│           │   ├── lazy-bg/
│           │   │   └── index.vue
│           │   ├── multi-player/
│           │   │   ├── CHANGELOG.md
│           │   │   ├── README.md
│           │   │   ├── global.d.ts
│           │   │   ├── index.ts
│           │   │   └── src/
│           │   │       ├── assets/
│           │   │       │   └── css/
│           │   │       │       └── index.less
│           │   │       ├── core/
│           │   │       │   ├── artplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── plugins/
│           │   │       │   │   │   ├── index.ts
│           │   │       │   │   │   └── playNext.ts
│           │   │       │   │   ├── types.ts
│           │   │       │   │   └── utils/
│           │   │       │   │       └── index.ts
│           │   │       │   ├── dplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── types.ts
│           │   │       │   │   └── utils/
│           │   │       │   │       └── index.ts
│           │   │       │   ├── index.ts
│           │   │       │   ├── nplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── locales/
│           │   │       │   │   │   └── zh-tw.ts
│           │   │       │   │   ├── plugins/
│           │   │       │   │   │   ├── index.ts
│           │   │       │   │   │   ├── pip.ts
│           │   │       │   │   │   └── playNext.ts
│           │   │       │   │   ├── types.ts
│           │   │       │   │   └── utils/
│           │   │       │   │       └── index.ts
│           │   │       │   ├── oplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── locales/
│           │   │       │   │   │   └── zh-tw.ts
│           │   │       │   │   └── types.ts
│           │   │       │   └── xgplayer/
│           │   │       │       ├── css/
│           │   │       │       │   └── index.css
│           │   │       │       ├── index.ts
│           │   │       │       ├── plugins/
│           │   │       │       │   ├── danmuSend.ts
│           │   │       │       │   ├── index.ts
│           │   │       │       │   └── playNext.ts
│           │   │       │       ├── types.ts
│           │   │       │       └── utils/
│           │   │       │           └── index.ts
│           │   │       ├── multi-player.tsx
│           │   │       ├── types.ts
│           │   │       └── utils/
│           │   │           ├── static.ts
│           │   │           ├── storage.ts
│           │   │           ├── stream-decoder.ts
│           │   │           └── tool.ts
│           │   ├── play-show/
│           │   │   └── index.vue
│           │   ├── quick-menu/
│           │   │   ├── components/
│           │   │   │   ├── Ai.vue
│           │   │   │   ├── Lab.vue
│           │   │   │   ├── Language.vue
│           │   │   │   ├── Setting.vue
│           │   │   │   ├── Sponsor.vue
│           │   │   │   └── Theme.vue
│           │   │   └── index.vue
│           │   ├── render-icon/
│           │   │   └── index.vue
│           │   ├── render-markdown/
│           │   │   └── index.vue
│           │   ├── router-control/
│           │   │   └── index.vue
│           │   ├── search-panel/
│           │   │   └── index.vue
│           │   ├── setting-table/
│           │   │   ├── index.vue
│           │   │   └── types.ts
│           │   ├── share/
│           │   │   ├── index.vue
│           │   │   └── types.ts
│           │   ├── system-control/
│           │   │   └── index.vue
│           │   ├── tag-nav/
│           │   │   └── index.vue
│           │   ├── terminal/
│           │   │   └── index.vue
│           │   ├── title-menu/
│           │   │   ├── index.less
│           │   │   └── index.vue
│           │   └── webview/
│           │       └── index.vue
│           ├── config/
│           │   ├── aigc.ts
│           │   ├── browser.ts
│           │   ├── emitterChannel.ts
│           │   ├── global.ts
│           │   ├── hot.ts
│           │   ├── parse.ts
│           │   ├── player.ts
│           │   └── setting.ts
│           ├── layouts/
│           │   ├── components/
│           │   │   ├── Content.vue
│           │   │   ├── Header.vue
│           │   │   ├── LayoutContent.vue
│           │   │   ├── LayoutHeader.vue
│           │   │   ├── LayoutSideNav.vue
│           │   │   └── SideNav.vue
│           │   └── index.vue
│           ├── locales/
│           │   ├── index.ts
│           │   └── useLocale.ts
│           ├── main.ts
│           ├── pages/
│           │   ├── Disclaimer.vue
│           │   ├── browser/
│           │   │   └── index.vue
│           │   ├── film/
│           │   │   ├── components/
│           │   │   │   └── DialogDetail.vue
│           │   │   └── index.vue
│           │   ├── lab/
│           │   │   ├── components/
│           │   │   │   ├── crypto/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   ├── encode.vue
│           │   │   │   │   │   ├── encrypt.vue
│           │   │   │   │   │   └── hash.vue
│           │   │   │   │   └── index.vue
│           │   │   │   ├── diff/
│           │   │   │   │   └── index.vue
│           │   │   │   ├── edit/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   └── DialogTemplate.vue
│           │   │   │   │   ├── index.vue
│           │   │   │   │   └── utils/
│           │   │   │   │       ├── comm.ts
│           │   │   │   │       ├── config.ts
│           │   │   │   │       ├── inject/
│           │   │   │   │       │   └── 7/
│           │   │   │   │       │       ├── extraLib.d.ts
│           │   │   │   │       │       └── suggestions.ts
│           │   │   │   │       └── log.ts
│           │   │   │   ├── extension/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   ├── env/
│           │   │   │   │   │   │   └── index.vue
│           │   │   │   │   │   └── plugin/
│           │   │   │   │   │       ├── components/
│           │   │   │   │   │       │   ├── DialogDetail.vue
│           │   │   │   │   │       │   └── DialogInstall.vue
│           │   │   │   │   │       ├── constants.ts
│           │   │   │   │   │       └── index.vue
│           │   │   │   │   └── index.vue
│           │   │   │   ├── player/
│           │   │   │   │   └── index.vue
│           │   │   │   ├── sift/
│           │   │   │   │   └── index.vue
│           │   │   │   └── sniffer/
│           │   │   │       └── index.vue
│           │   │   └── index.vue
│           │   ├── live/
│           │   │   └── index.vue
│           │   ├── moment/
│           │   │   ├── components/
│           │   │   │   ├── history/
│           │   │   │   │   └── index.vue
│           │   │   │   └── star/
│           │   │   │       └── index.vue
│           │   │   └── index.vue
│           │   ├── parse/
│           │   │   └── index.vue
│           │   ├── player/
│           │   │   ├── components/
│           │   │   │   ├── AsideFilm.vue
│           │   │   │   ├── AsideLive.vue
│           │   │   │   ├── AsideParse.vue
│           │   │   │   ├── DialogDownload.vue
│           │   │   │   ├── DialogSetting.vue
│           │   │   │   └── Header.vue
│           │   │   └── index.vue
│           │   ├── setting/
│           │   │   ├── components/
│           │   │   │   ├── base/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   ├── DialogBarrage.vue
│           │   │   │   │   │   ├── DialogDns.vue
│           │   │   │   │   │   ├── DialogProxy.vue
│           │   │   │   │   │   ├── DialogSniffer.vue
│           │   │   │   │   │   ├── DialogUa.vue
│           │   │   │   │   │   └── DialogUpdate.vue
│           │   │   │   │   └── index.vue
│           │   │   │   ├── data/
│           │   │   │   │   └── index.vue
│           │   │   │   ├── film/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   └── DialogForm.vue
│           │   │   │   │   ├── constants.ts
│           │   │   │   │   └── index.vue
│           │   │   │   ├── live/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   └── DialogForm.vue
│           │   │   │   │   ├── constants.ts
│           │   │   │   │   └── index.vue
│           │   │   │   └── parse/
│           │   │   │       ├── components/
│           │   │   │       │   └── DialogForm.vue
│           │   │   │       ├── constants.ts
│           │   │   │       └── index.vue
│           │   │   └── index.vue
│           │   └── test/
│           │       ├── components/
│           │       │   ├── action/
│           │       │   │   └── index.vue
│           │       │   ├── demo/
│           │       │   │   └── index.vue
│           │       │   ├── editor/
│           │       │   │   └── index.vue
│           │       │   ├── player/
│           │       │   │   └── index.vue
│           │       │   └── webview/
│           │       │       └── index.vue
│           │       └── index.vue
│           ├── router/
│           │   ├── index.ts
│           │   └── modules/
│           │       └── homepage.ts
│           ├── store/
│           │   ├── index.ts
│           │   └── modules/
│           │       ├── browser.ts
│           │       ├── player.ts
│           │       └── setting.ts
│           ├── style/
│           │   ├── base.less
│           │   ├── browser.less
│           │   ├── font-family.less
│           │   ├── index.less
│           │   ├── layout.less
│           │   ├── normalize.less
│           │   ├── player.less
│           │   ├── theme.less
│           │   └── variables.less
│           ├── types/
│           │   ├── globals.d.ts
│           │   ├── interface.d.ts
│           │   ├── player.ts
│           │   └── vue-virtual-scroller.d.ts
│           └── utils/
│               ├── console.ts
│               ├── emitter.ts
│               ├── logger.ts
│               ├── ospy.ts
│               ├── request/
│               │   ├── api.ts
│               │   ├── index.ts
│               │   ├── normal.ts
│               │   ├── sse.ts
│               │   └── ws.ts
│               ├── setup.ts
│               ├── systeminfo.ts
│               ├── tool.ts
│               └── vitalsObserver.ts
├── tests/
│   ├── __mocks__/
│   │   ├── MainLoggerService.ts
│   │   └── RendererLoggerService.ts
│   ├── main.setup.ts
│   └── renderer.setup.ts
├── tsconfig.json
├── tsconfig.node.json
├── tsconfig.web.json
└── vitest.config.ts

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
# @see: http://editorconfig.org

# top-most EditorConfig file
root = true

# Tab indentation
[*]
indent_style = space
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false

[*.{ts,js,vue,css}]
indent_size = 2

# The indent size used in the `package.json` file cannot be changed
# https://github.com/npm/npm/pull/3180#issuecomment-16336516
[*.{yml,yaml,json}]
indent_style = space
indent_size = 2


================================================
FILE: .env.example
================================================
ELECTRON_WEB_SERVER_PORT = 42710
ELECTRON_DEV_NETEASE_API_PORT = 30001
VITE_API_PORT = 9978
VITE_API_URL = http://127.0.0.1:9978
VITE_API_URL_PREFIX = /api
VITE_MAIN_BUNDLE_ID = com.github.zyfun


================================================
FILE: .git-blame-ignore-revs
================================================


================================================
FILE: .gitattributes
================================================
* text=auto eol=lf

LICENSE.txt eol=crlf
ThirdPartyNotices.txt eol=crlf

*.bat eol=crlf
*.cmd eol=crlf
*.ps1 eol=lf
*.sh eol=lf
*.rtf -text
**/*.json linguist-language=jsonc

/.yarn/**            linguist-vendored
/.yarn/releases/*    binary


================================================
FILE: .github/FUNDING.yml
================================================
ko_fi: hiramwong
custom: [https://ifdian.net/a/hiram]


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.zh-CN.yml
================================================
name: 反馈 Bug
description: 通过 github 模板进行 Bug 反馈。
title: '[组件名称] 描述问题的标题'
body:
  - type: markdown
    attributes:
      value: |
        # 欢迎你的参与
        Issue 列表接受 bug 报告或是新功能请求。

        在发布一个 Issue 前,请确保:
        - 在 [旧Issue列表](https://github.com/Hiram-Wong/zyfun/issues?q=is%3Aissue) 中搜索过你的问题。(你的问题可能已有人提出,也可能已在最新版本中被修正)
        - 如果你发现一个已经关闭的旧 Issue 在最新版本中仍然存在,不要在旧 Issue 下面留言,请建一个新的 issue。

  - type: input
    id: version
    attributes:
      label: zyfun 版本
      description: 请检查在最新项目版本中能否重现此 issue。
      placeholder: 请填写
    validations:
      required: true

  - type: textarea
    id: reproduceSteps
    attributes:
      label: 重现步骤
      description: 请清晰的描述重现该 Issue 的步骤,这能帮助我们快速定位问题。没有清晰重现步骤将不会被修复,标有 'need reproduction' 的 Issue 在 7 天内不提供相关步骤,将被关闭。
      placeholder: 请填写
    validations:
      required: true

  - type: textarea
    id: errorMessage
    attributes:
      label: 报错信息
      description: F12, 重新复现后, 复制控制台报错信息。
      placeholder: 请填写

  - type: textarea
    id: expect
    attributes:
      label: 期望结果
      placeholder: 请填写

  - type: textarea
    id: actual
    attributes:
      label: 实际结果
      placeholder: 请填写

  - type: input
    id: systemInfo
    attributes:
      label: 系统信息
      placeholder: MacOS(11.2.3)系统 M1芯片 arm64架构

  - type: textarea
    id: remarks
    attributes:
      label: 补充说明
      description: 可以是遇到这个 bug 的业务场景、上下文等信息。
      placeholder: 请填写


================================================
FILE: .github/ISSUE_TEMPLATE/feature-report.zh-CN.yml
================================================
name: 反馈新功能
description: 通过 github 模板进行新功能反馈。
title: '[组件名称] 描述问题的标题'
body:
  - type: markdown
    attributes:
      value: |
        # 欢迎你的参与
        Issue 列表接受 bug 报告或是新功能请求。

        在发布一个 Issue 前,请确保:
        - 在 [旧Issue列表](https://github.com/Hiram-Wong/zyfun/issues?q=is%3Aissue) 中搜索过你的问题。(你的问题可能已有人提出,也可能已在最新版本中被修正)
        - 如果你发现一个已经关闭的旧 Issue 在最新版本中仍然存在,不要在旧 Issue 下面留言,请建一个新的 issue。

  - type: textarea
    id: functionContent
    attributes:
      label: 这个功能解决了什么问题
      description: 请详尽说明这个需求的用例和场景。最重要的是:解释清楚是怎样的用户体验需求催生了这个功能上的需求。我们将考虑添加在现有 API 无法轻松实现的功能。新功能的用例也应当足够常见。
      placeholder: 请填写
    validations:
      required: true

  - type: textarea
    id: functionalExpectations
    attributes:
      label: 你建议的方案是什么
      description: 请详尽说明这个需求的实现的方案。例如相关Electron API。
      placeholder: 请填写
    validations:
      required: true


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
首先,感谢你的贡献!😄
请阅读并遵循 [zyfun 贡献指南],填写以下 pull request 的信息。
PR 在维护者审核通过后会合并,谢谢!
-->

### 🤔 这个 PR 的性质是?

- [ ] 日常 bug 修复
- [ ] 新特性提交
- [ ] 文档改进
- [ ] 组件样式/交互改进
- [ ] 重构
- [ ] 代码风格优化
- [ ] 测试用例
- [ ] 分支合并
- [ ] 其他

### 🔗 相关 Issue

<!--
1. 描述相关需求的来源,如相关的 issue 讨论链接。
-->

### 💡 需求背景和解决方案

<!--
1. 要解决的具体问题。
2. 列出最终的 API 实现和用法。
3. 涉及UI/交互变动需要有截图或 GIF。
-->

### 📝 更新日志

<!--
从用户角度描述具体变化,以及可能的 breaking change 和其他风险。
-->

- fix(组件名称): 处理问题或特性描述 ...

- [ ] 本条 PR 不需要纳入 Changelog

### ☑️ 请求合并前的自查清单

⚠️ 请自检并全部**勾选全部选项**。⚠️

- [ ] 文档已补充或无须补充
- [ ] 代码演示已提供或无须提供
- [ ] TypeScript 定义已补充或无须补充
- [ ] Changelog 已提供或无须提供


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: 'github-actions'
    directory: '/'
    schedule:
      interval: 'monthly'
    open-pull-requests-limit: 3
    commit-message:
      prefix: 'ci'
      include: 'scope'
    groups:
      github-actions:
        patterns:
          - '*'
        update-types:
          - 'minor'
          - 'patch'


================================================
FILE: .github/workflows/nightly-build.yml
================================================
name: Nightly Build

on:
  workflow_dispatch:
  schedule:
    - cron: '0 17 * * *' # 1:00 BJ Time

permissions:
  contents: write
  actions: write # Required for deleting artifacts

jobs:
  cleanup-artifacts:
    runs-on: ubuntu-latest
    steps:
      - name: Delete old artifacts
        env:
          GH_TOKEN: ${{ github.token }}
          REPO: ${{ github.repository }}
        run: |
          # Calculate the date 14 days ago
          cutoff_date=$(date -d "14 days ago" +%Y-%m-%d)

          # List and delete artifacts older than cutoff date
          gh api repos/$REPO/actions/artifacts --paginate | \
          jq -r '.artifacts[] | select(.name | startswith("zyfun-nightly-")) | select(.created_at < "'$cutoff_date'") | .id' | \
          while read artifact_id; do
            echo "Deleting artifact $artifact_id"
            gh api repos/$REPO/actions/artifacts/$artifact_id -X DELETE
          done

  check-repository:
    runs-on: ubuntu-latest
    outputs:
      should_run: ${{ github.repository == 'Hiram-Wong/zyfun' }}
    steps:
      - name: Check if running in main repository
        run: |
          echo "Running in repository: ${{ github.repository }}"
          echo "Should run: ${{ github.repository == 'Hiram-Wong/zyfun' }}"

  check-commit:
    runs-on: ubuntu-latest
    outputs:
      has_commit: ${{ steps.check.outputs.has_commit }}
    steps:
      - name: Check commits in last 24h
        id: check
        run: |
          until=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
          since=$(date -u -d "24 hours ago" +"%Y-%m-%dT%H:%M:%SZ")

          echo "Checking commits:"
          echo "  since: $since"
          echo "  until: $until"

          count=$(gh api \
            -X GET \
            "repos/${{ github.repository }}/commits?sha=main&since=$since&until=$until" \
            --jq 'length')

          echo "Commit count: $count"

          if [ "$count" -gt 0 ]; then
            echo "has_commit=true" >> $GITHUB_OUTPUT
          else
            echo "has_commit=false" >> $GITHUB_OUTPUT
          fi
        env:
          GH_TOKEN: ${{ github.token }}

  nightly-build:
    needs: [check-repository, check-commit]
    if: |
      needs.check-repository.outputs.should_run == 'true' &&
      (
        github.event_name == 'workflow_dispatch' ||
        needs.check-commit.outputs.has_commit == 'true'
      )
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
      fail-fast: false

    steps:
      - name: Check out Git repository
        uses: actions/checkout@v6
        with:
          ref: main

      - name: Install Node.js
        uses: actions/setup-node@v6
        with:
          node-version-file: '.node-version'

      - name: macos-latest dependencies fix
        if: matrix.os == 'macos-latest'
        run: |
          brew install python-setuptools

      - name: Install pnpm
        uses: pnpm/action-setup@v4

      - name: Get pnpm store directory
        id: pnpm-cache
        shell: bash
        run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT

      - name: Cache pnpm dependencies
        uses: actions/cache@v5
        with:
          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-

      - name: Install Dependencies
        run: pnpm install

      - name: Prepare env file
        shell: bash
        run: cp -f .env.example .env

      - name: Generate date tag
        id: date
        run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_OUTPUT
        shell: bash

      - name: Build Linux
        if: matrix.os == 'ubuntu-latest'
        run: |
          sudo apt-get install -y rpm
          pnpm build:linux
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NODE_OPTIONS: --max-old-space-size=8192

      - name: Build Mac
        if: matrix.os == 'macos-latest'
        run: |
          sudo -H pip install setuptools
          pnpm build:mac
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NODE_OPTIONS: --max-old-space-size=8192

      - name: Build Windows
        if: matrix.os == 'windows-latest'
        run: |
          pnpm build:win
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NODE_OPTIONS: --max-old-space-size=8192

      - name: Rename artifacts with nightly format
        shell: bash
        run: |
          mkdir -p renamed-artifacts
          DATE=${{ steps.date.outputs.date }}

          # Windows artifacts - based on actual file naming pattern
          if [ "${{ matrix.os }}" == "windows-latest" ]; then
            # Setup installer
            find dist -name "*-x64-setup.exe" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x64-setup.exe \;
            find dist -name "*-arm64-setup.exe" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64-setup.exe \;

            # Portable exe
            find dist -name "*-x64-portable.exe" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x64-portable.exe \;
            find dist -name "*-arm64-portable.exe" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64-portable.exe \;
          fi

          # macOS artifacts
          if [ "${{ matrix.os }}" == "macos-latest" ]; then
            find dist -name "*-arm64.dmg" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64.dmg \;
            find dist -name "*-x64.dmg" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x64.dmg \;
          fi

          # Linux artifacts
          if [ "${{ matrix.os }}" == "ubuntu-latest" ]; then
            find dist -name "*-x86_64.AppImage" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-x86_64.AppImage \;
            find dist -name "*-arm64.AppImage" -exec cp {} renamed-artifacts/zyfun-nightly-${DATE}-arm64.AppImage \;
          fi

          # Copy update files
          cp dist/latest*.yml renamed-artifacts/ || true

      # Generate SHA256 checksums (Windows)
      - name: Generate SHA256 checksums (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          cd renamed-artifacts
          echo "# SHA256 checksums for Windows - $(Get-Date -Format 'yyyy-MM-dd')" > SHA256SUMS.txt
          Get-ChildItem -File | Where-Object { $_.Name -ne 'SHA256SUMS.txt' } | ForEach-Object {
            $file = $_.Name
            $hash = (Get-FileHash -Algorithm SHA256 $file).Hash.ToLower()
            Add-Content -Path SHA256SUMS.txt -Value "$hash  $file"
          }
          cat SHA256SUMS.txt

      # Generate SHA256 checksums (macOS/Linux)
      - name: Generate SHA256 checksums (macOS/Linux)
        if: runner.os != 'Windows'
        shell: bash
        run: |
          cd renamed-artifacts
          echo "# SHA256 checksums for ${{ runner.os }} - $(date +'%Y-%m-%d')" > SHA256SUMS.txt
          if command -v shasum &>/dev/null; then
            # macOS
            shasum -a 256 * 2>/dev/null | grep -v SHA256SUMS.txt >> SHA256SUMS.txt || echo "No files to hash" >> SHA256SUMS.txt
          else
            # Linux
            sha256sum * 2>/dev/null | grep -v SHA256SUMS.txt >> SHA256SUMS.txt || echo "No files to hash" >> SHA256SUMS.txt
          fi
          cat SHA256SUMS.txt

      - name: List files to be uploaded
        shell: bash
        run: |
          echo "准备上传的文件:"
          if [ -x "$(command -v tree)" ]; then
            tree renamed-artifacts
          elif [ "$RUNNER_OS" == "Windows" ]; then
            dir renamed-artifacts
          else
            ls -la renamed-artifacts
          fi
          echo "总计: $(find renamed-artifacts -type f | wc -l) 个文件"

      - name: Upload artifacts
        uses: actions/upload-artifact@v7
        with:
          name: zyfun-nightly-${{ steps.date.outputs.date }}-${{ matrix.os }}
          path: renamed-artifacts/*
          retention-days: 3 # 保留3天
          compression-level: 8

  Build-Summary:
    needs: [check-commit, nightly-build]
    if: always()
    runs-on: ubuntu-latest
    steps:
      - name: Get date tag
        id: date
        run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_OUTPUT
        shell: bash

      - name: Download all artifacts
        if: needs.check-commit.outputs.has_commit == 'true'
        uses: actions/download-artifact@v8
        with:
          path: all-artifacts
          merge-multiple: false
        continue-on-error: true

      - name: Create summary report
        run: |
          if [ "${{ needs.check-commit.outputs.has_commit }}" != "true" ]; then
            echo "## 💤 今日未触发 Nightly 构建" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "- 原因:过去 24 小时内 main 分支没有新的提交" >> $GITHUB_STEP_SUMMARY
            echo "- 构建策略:仅在有提交时才触发 Nightly Build" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY
            echo "⏱ 检查窗口:最近 24 小时(UTC)" >> $GITHUB_STEP_SUMMARY
          else
            echo "## ⚠️ 警告:这是每日构建版本" >> $GITHUB_STEP_SUMMARY
            echo "此版本为自动构建的不稳定版本,仅供测试使用。不建议在生产环境中使用。" >> $GITHUB_STEP_SUMMARY
            echo "安装此版本前请务必备份数据,并做好数据迁移准备。" >> $GITHUB_STEP_SUMMARY
            echo "构建日期:$(date +'%Y-%m-%d')" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY

            echo "## 📦 安装包校验和" >> $GITHUB_STEP_SUMMARY
            echo "请在下载后验证文件完整性。提供 SHA256 校验和。" >> $GITHUB_STEP_SUMMARY
            echo "" >> $GITHUB_STEP_SUMMARY

            # Check each platform's artifacts and show checksums if available

            # Windows
            WIN_ARTIFACT_DIR="all-artifacts/zyfun-nightly-${{ steps.date.outputs.date }}-windows-latest"
            if [ -d "$WIN_ARTIFACT_DIR" ] && [ -f "$WIN_ARTIFACT_DIR/SHA256SUMS.txt" ]; then
              echo "### Windows 安装包" >> $GITHUB_STEP_SUMMARY
              echo '```' >> $GITHUB_STEP_SUMMARY
              cat "$WIN_ARTIFACT_DIR/SHA256SUMS.txt" >> $GITHUB_STEP_SUMMARY
              echo '```' >> $GITHUB_STEP_SUMMARY
              echo "" >> $GITHUB_STEP_SUMMARY
            else
              echo "### Windows 安装包" >> $GITHUB_STEP_SUMMARY
              echo "❌ Windows 构建未成功完成或未生成校验和。" >> $GITHUB_STEP_SUMMARY
              echo "" >> $GITHUB_STEP_SUMMARY
            fi

            # macOS
            MAC_ARTIFACT_DIR="all-artifacts/zyfun-nightly-${{ steps.date.outputs.date }}-macos-latest"
            if [ -d "$MAC_ARTIFACT_DIR" ] && [ -f "$MAC_ARTIFACT_DIR/SHA256SUMS.txt" ]; then
              echo "### macOS 安装包" >> $GITHUB_STEP_SUMMARY
              echo '```' >> $GITHUB_STEP_SUMMARY
              cat "$MAC_ARTIFACT_DIR/SHA256SUMS.txt" >> $GITHUB_STEP_SUMMARY
              echo '```' >> $GITHUB_STEP_SUMMARY
              echo "" >> $GITHUB_STEP_SUMMARY
            else
              echo "### macOS 安装包" >> $GITHUB_STEP_SUMMARY
              echo "❌ macOS 构建未成功完成或未生成校验和。" >> $GITHUB_STEP_SUMMARY
              echo "" >> $GITHUB_STEP_SUMMARY
            fi

            # Linux
            LINUX_ARTIFACT_DIR="all-artifacts/zyfun-nightly-${{ steps.date.outputs.date }}-ubuntu-latest"
            if [ -d "$LINUX_ARTIFACT_DIR" ] && [ -f "$LINUX_ARTIFACT_DIR/SHA256SUMS.txt" ]; then
              echo "### Linux 安装包" >> $GITHUB_STEP_SUMMARY
              echo '```' >> $GITHUB_STEP_SUMMARY
              cat "$LINUX_ARTIFACT_DIR/SHA256SUMS.txt" >> $GITHUB_STEP_SUMMARY
              echo '```' >> $GITHUB_STEP_SUMMARY
              echo "" >> $GITHUB_STEP_SUMMARY
            else
              echo "### Linux 安装包" >> $GITHUB_STEP_SUMMARY
              echo "❌ Linux 构建未成功完成或未生成校验和。" >> $GITHUB_STEP_SUMMARY
              echo "" >> $GITHUB_STEP_SUMMARY
            fi

            echo "## ⚠️ Warning: This is a nightly build version" >> $GITHUB_STEP_SUMMARY
            echo "This version is an unstable version built automatically and is only for testing. It is not recommended to use it in a production environment." >> $GITHUB_STEP_SUMMARY
            echo "Please backup your data before installing this version and prepare for data migration." >> $GITHUB_STEP_SUMMARY
            echo "Build date: $(date +'%Y-%m-%d')" >> $GITHUB_STEP_SUMMARY
          fi


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  workflow_dispatch:
    inputs:
      tag:
        description: 'Release tag (e.g. v1.0.0)'
        required: true
        default: 'v1.0.0'
      platform:
        description: 'Build platform'
        required: true
        default: 'all'
        type: choice
        options:
          - all
          - windows
          - mac
          - linux
  push:
    tags:
      - v*.*.*

  pull_request_target:
    branches:
      - main
    types:
      - opened
      - synchronize

permissions:
  contents: write

jobs:
  release:
    runs-on: ${{ matrix.os }}

    strategy:
      matrix:
        os: ${{ fromJSON(
          github.event_name == 'push' && '["macos-latest", "windows-latest", "ubuntu-latest"]' ||
          github.event_name == 'pull_request_target' && '["macos-latest", "windows-latest", "ubuntu-latest"]' ||
          github.event.inputs.platform == 'all' && '["macos-latest", "windows-latest", "ubuntu-latest"]' ||
          github.event.inputs.platform == 'linux' && '["ubuntu-latest"]' ||
          github.event.inputs.platform == 'windows' && '["windows-latest"]' ||
          github.event.inputs.platform == 'mac' && '["macos-latest"]' ||
          '["macos-latest", "windows-latest", "ubuntu-latest"]'
          ) }}
      fail-fast: false

    steps:
      - name: Check out Git repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          ref: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.sha || '' }}

      - name: Get release tag
        id: get-tag
        shell: bash
        run: |
          if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
            echo "tag=${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT
          elif [ "${{ github.event_name }}" = "pull_request_target" ]; then
            # Extract version from branch name (release/v1.0.0 -> v1.0.0)
            BRANCH="${{ github.event.pull_request.head.ref }}"
            echo "tag=${BRANCH#release/}" >> $GITHUB_OUTPUT
          else
            echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
          fi

      - name: Set package.json version
        shell: bash
        run: |
          TAG="${{ steps.get-tag.outputs.tag }}"
          VERSION="${TAG#v}"
          npm version "$VERSION" --no-git-tag-version --allow-same-version

      - name: Install Node.js
        uses: actions/setup-node@v6
        with:
          node-version-file: '.node-version'

      - name: macos-latest dependencies fix
        if: matrix.os == 'macos-latest'
        run: |
          brew install python-setuptools

      - name: Install pnpm
        uses: pnpm/action-setup@v4

      - name: Get pnpm store directory
        id: pnpm-cache
        shell: bash
        run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT

      - name: Cache pnpm dependencies
        uses: actions/cache@v5
        with:
          path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-

      - name: Install Dependencies
        run: pnpm install

      - name: Prepare env file
        shell: bash
        run: cp -f .env.example .env

      - name: Build Linux
        if: matrix.os == 'ubuntu-latest'
        run: |
          sudo apt-get install -y rpm
          pnpm build:linux
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NODE_OPTIONS: --max-old-space-size=8192

      - name: Build Mac
        if: matrix.os == 'macos-latest'
        run: |
          sudo -H pip install setuptools
          pnpm build:mac
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NODE_OPTIONS: --max-old-space-size=8192

      - name: Build Windows
        if: matrix.os == 'windows-latest'
        run: |
          pnpm build:win
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NODE_OPTIONS: --max-old-space-size=8192

      - name: Release
        uses: ncipollo/release-action@v1
        with:
          draft: true
          allowUpdates: true
          makeLatest: false
          tag: ${{ steps.get-tag.outputs.tag }}
          artifacts: 'dist/*.exe,dist/*.dmg,dist/*.AppImage,dist/*.snap,dist/*.deb,dist/*.rpm,dist/*.tar.gz,dist/latest*.yml'
          token: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
pnpm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# Dependencies
node_modules
venv
.venv

# Yarn
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
.yarn-cache

# Python
uv.lock

# Build Outputs
.next
dev-dist
dist
dist-ssr
out
packages/*/build

# Turbo
.turbo

# Vercel
.vercel

# Editors
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# IDE
.aider*
.claude/*
.claude-code-router/*
.codebuddy/*
.cursor/*
!.claude/skills/
!.claude/skills/**
.gemini/*
.idea/*
**/.idea/*
.qwen/*
.trae/*
.vscode/*
!.vscode/extensions.json
!.vscode/launch.json
!.vscode/mcp.json
!.vscode/settings.json
.zed/*

# Env
.env
.env.*
!.env.example

# OS
.DS_Store

# Misc
*.pem

# Tests
coverage
.vitest-cache
vitest.config.*.timestamp-*
.nyc_output
playwright-report
test-results

# TypeScript incremental build
.tsbuildinfo
**/auto-imports.d.ts
**/components.d.ts

# Temp
.temp
.tmp

# Runtime
pids
*.pid
*.pid.lock
*.seed
*.pyc
__pycache__/

# Husky
.husky/*
!.husky/_/*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Dump
*.dmp
dmp.txt


================================================
FILE: .ncurc.yaml
================================================
reject:
  # Electron
  - vite
  - '@electron/notarize'
  - electron
  - electron-builder
  - electron-updater
  - electron-store
  - builder-util-runtime

  # Libsql
  - '@libsql/client'
  - '@libsql/darwin-arm64'
  - '@libsql/darwin-x64'
  - '@libsql/linux-arm64-gnu'
  - '@libsql/linux-x64-gnu'
  - '@libsql/linux-arm64-musl'
  - '@libsql/linux-x64-musl'
  - '@libsql/win32-x64-msvc'
  - '@strongtz/win32-arm64-msvc'

  # Vitest
  - vitest
  - '@vitest/browser'
  - '@vitest/coverage-v8'
  - '@vitest/ui'
  - '@vitest/web-worker'

  # Others
  - '@types/node'
  - eslint
  - monaco-editor
  - npminstall
  - pnpm
  - proxy-agent
  - undici


================================================
FILE: .node-version
================================================
24.11.1


================================================
FILE: .npmrc
================================================


================================================
FILE: .nvmrc
================================================
24.11.1


================================================
FILE: .prettierignore
================================================
out
dist
pnpm-lock.yaml
LICENSE.md
tsconfig.json
tsconfig.*.json
CHANGELOG*.md


================================================
FILE: .prettierrc.yaml
================================================
# 一行最多 120 字符
printWidth: 120
# 使用 2 个空格缩进
tabWidth: 2
# 不使用缩进符,而使用空格
useTabs: false
# 行尾需要有分号
semi: true
# 使用单引号
singleQuote: true
# 对象的 key 仅在必要时用引号
quoteProps: as-needed
# jsx 不使用单引号,而使用双引号
jsxSingleQuote: false
# 末尾需要有逗号
trailingComma: all
# 大括号内的首尾需要空格
bracketSpacing: true
# jsx 标签的反尖括号需要换行
bracketSameLine: false
# 箭头函数,只有一个参数的时候,也需要括号
arrowParens: always
# 每个文件格式化的范围是文件的全部内容
rangeStart: 0
rangeEnd: .inf
# 不需要写文件开头的 @prettier
requirePragma: false
# 不需要自动在文件开头插入 @prettier
insertPragma: false
# 使用默认的折行标准
proseWrap: preserve
# 根据显示样式决定 html 要不要折行
htmlWhitespaceSensitivity: css
# vue 文件中的 script 和 style 内不用缩进
vueIndentScriptAndStyle: false
# 换行符使用 lf
endOfLine: lf
# JSON 递归排序
jsonRecursiveSort: true
# JSON 排序规则
jsonSortOrder: '{"*": "lexical"}'
# 插件
plugins:
  - prettier-plugin-sort-json


================================================
FILE: .stylelintignore
================================================
# .stylelintignore
# 旧的不需打包的样式库
*.min.css

# 其他类型文件
*.js
*.jpg
*.woff


================================================
FILE: .stylelintrc.yml
================================================
defaultSeverity: error

extends:
  - stylelint-config-standard

plugins:
  - stylelint-order

rules:
  no-descending-specificity: null
  import-notation: string
  no-empty-source: null
  custom-property-pattern: null
  selector-class-pattern: null

  selector-pseudo-class-no-unknown:
    - true
    - ignorePseudoClasses:
        - deep

  # 官方说明:以下规则仅适用于原生 CSS,预处理器(Less)应关闭
  media-query-no-invalid: null
  declaration-property-value-no-unknown: null

overrides:
  - files:
      - '**/*.html'
      - '**/*.vue'
    customSyntax: postcss-html

  - files:
      - '**/*.less'
    customSyntax: postcss-less


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "editorconfig.editorconfig",
    "lokalise.i18n-ally",
    // "oxc.oxc-vscode",
    "typescriptteam.native-preview",
    "sdras.vue-vscode-snippets",
    "vitest.explorer",
    "vue.volar"
  ]
}


================================================
FILE: .vscode/launch.json
================================================
{
  "compounds": [
    {
      "configurations": ["Debug Main Process", "Debug Renderer Process"],
      "name": "Debug All",
      "presentation": {
        "order": 1
      }
    }
  ],
  "configurations": [
    {
      "cwd": "${workspaceRoot}",
      "env": {
        "REMOTE_DEBUGGING_PORT": "9222"
      },
      "name": "Debug Main Process",
      "request": "launch",
      "runtimeArgs": ["--sourcemap"],
      "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
      "type": "node",
      "windows": {
        "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
      }
    },
    {
      "name": "Debug Renderer Process",
      "port": 9222,
      "presentation": {
        "hidden": true
      },
      "request": "attach",
      "timeout": 60000,
      "type": "chrome",
      "webRoot": "${workspaceFolder}/src/renderer"
    }
  ],
  "version": "0.2.0"
}


================================================
FILE: .vscode/mcp.json
================================================
{
  "servers": {
    "debug-electron-mcp": {
      "args": ["-y", "@debugelectron/debug-electron-mcp@latest"],
      "command": "npx"
    },
    "swagger-mcp": {
      "args": ["-y", "swagger-mcp@latest"],
      "command": "npx",
      "env": {
        "API_BASE_URL": "http://127.0.0.1:9978",
        "API_DOCS_URL": "http://127.0.0.1:9978/docs/json"
      }
    },
    "tdesign-mcp-server": {
      "args": ["-y", "tdesign-mcp-server"],
      "command": "npx"
    }
  }
}


================================================
FILE: .vscode/settings.json
================================================
{
  "[css]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[javascriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[json]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[less]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[markdown]": {
    "files.trimTrailingWhitespace": false
  },
  "[scss]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "[vue]": {
    "editor.defaultFormatter": "dbaeumer.vscode-eslint"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    // "source.fixAll.oxc": "explicit",
    "source.organizeImports": "never"
  },
  "editor.formatOnSave": true,
  "editor.tabSize": 2,
  "files.eol": "\n",
  "i18n-ally.displayLanguage": "zh-CN",
  "i18n-ally.enabledFrameworks": ["vue", "i18next"],
  "i18n-ally.enabledParsers": ["ts", "js", "json"],
  "i18n-ally.fullReloadOnChanged": true,
  "i18n-ally.keystyle": "nested",
  "i18n-ally.localesPaths": ["packages/shared/locales/lang"],
  "i18n-ally.namespace": true,
  "i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
  "i18n-ally.sortKeys": true,
  "i18n-ally.sourceLanguage": "zh-CN",
  "i18n-ally.usage.derivedKeyRules": ["{key}_one", "{key}_other"],
  "search.exclude": {
    "**/*.min.js": true,
    "**/*.svg": true,
    "**/dist/**": true,
    "**/node_modules/**": true,
    "out/**": true,
    "patches/**": true
  },
  "typescript.disableAutomaticTypeAcquisition": true,
  "typescript.tsdk": "node_modules/typescript/lib",
  "typescript.tsserver.experimental.enableProjectDiagnostics": false,
  // "typescript.experimental.useTsgo": true
  "typescript.tsserver.maxTsServerMemory": 4096
}


================================================
FILE: CHANGELOG.md
================================================
# Changelog

> All notable changes to this project will be documented in this file.

## 3.4.4

- 优化: mac/window侧边栏配色
- 修复: windows x64平台调用npminstall失败
- 修复: webview组件 缺失请求头加载方法
- 修复: 改进更新行为,防止意外自动更新
- 修复: window部分情况关闭窗口导致整个应用程序崩溃; arm平台打包失败
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.4)

## 3.4.3 (2026-03-14)

- 特性: vscode增加mcp工具
- 特性: 支持影视action动作操作(action组件)
- 优化: 简化hash路由加载
- 优化: ip接口参数ipv4/ipv6优先缺失; 增加结果isChinaMainland字段
- 优化: 鸿蒙操作系统标识识别
- 优化: 数据配置-快捷配置 兼容直接导入频道
- 优化: webview组件 src参数以支持默认加载
- 优化: terminal组件 渲染样式
- 优化: github action cicd引用仓库node版本
- 修复: 影视 适配器初始化失败无具体报错信息; 适配器类型标注优化; T3Alist和T3Catopen适配器ext参数序列化处理, T3Drpy和T3Catopen缓存冲突以及执行失败无日志打印; T3Py适配器引用错误参数, 关闭时zmq有未返回时将阻塞主进程, 启动时获取pid不全, 部分情况进程异常退出, 不激活venv导致环境异常, 使用端口替代参数关键词匹配进程; 数据源检测vod—tag为folder或action报错(直接放行, 检测无意义)
- 修复: 实验室-写源工具 首次加载非js适配器时提示语法报错; 代理上传处理三元组失败
- 修复: 直播配置 上传时文件筛选参数错误
- 修复: 历史记录 影视缺失集数数据; 接口进度跳过参数不返回
- 修复: 同步请求模块 application/json处理错误
- 修复: 缩放 尺寸计算错误; 刷新丢失缩放比例; 数值组件改为滑块; mac系统缩放不同步; 比例最大值和最小值
- 修复: common-nav组件 像素计算错误; 重复滚动; 点击部分dom再点击第一个将滚动至最后; 切换页面(或搜索结果点击)搜索列表丢失; 搜索结果清空不触发滚动
- 修复: dialog-document组件 类型错误; 文件名错误
- 修复: search-panel组件 输入框有内容时清空按钮替代搜索按钮(因为搜索图标没实际效果) -> 点击生效
- 修复: emitter 1.x -> 2.x 事件接收变动适配
- 修复: ua含有控制字符时主程序崩溃
- 修复: 影视分类只有一个时触发folder模式时没有重置按钮
- 修复: 部分机器判断electron环境报错
- 修复: MacOS Tahoe(26)以下操作系统交通灯位置错位
- 修复: 复制成功提示类型错误 info -> success
- 修复: ui库 alert组件info颜色错误; qrcode组件样式错误
- 变动: 参数歧义 isChinaMainland(中国大陆) -> isCHS(简体中文)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.3)

## 3.4.2 (2026-02-15)

- 特性: 支持配置缩放
- 修复: 设置-基础配置 无效超时参数检测不符合逻辑(改为失焦校验)
- 修复: 实验室-写源工具 文件目录在未创建时打开失败
- 修复: AIGC 存在思考过程时一直显示思考中; 思考样式颜色错误; prompt提示词优化
- 修复: 主进程未捕获告警日志
- 修复: 部分参数未使用环境变量
- 修复: 单词拼写错误(outher -> other)
- 修复: 进程匹配不精确导致结束进程找不到
- 修复: 影视检查可用性逻辑错误; 支持仅搜索检查; t3_py适配器增加类型标注
- 修复: swagger文档部分参数解释缺失
- 修复: uv处理依赖时证书错误
- 修复: 扩展程序在启用/禁用/卸载时ipc通讯时参数序列化失败
- 修复: 同步请求模块: fetch不必要的类型转换导致性能消耗; fetch请求体ContentType大小写错误; fetchCookie序列化错误; convertBase64Image错误; 取消对请求体Referer的处理
- 变动: cdp嗅探: 默认规则启用 -> 未传自定义规则时启用
- 变动: 影视适配器hiker公共库路径变动
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.2)

## 3.4.1 (2026-02-08)

> 破坏性更新

- 特性: 支持软件级网络代理(子进程请求除外) [issue #437]
- 特性: 硬件加速回归
- 特性: 影视/电视/解析均提供检查可用性
- 特性: 日志支持sse流输出(仅主程序日志)
- 特性: 实验室-数据编码支持RC4Drop, AES和SM4适配GCM运算, RSA适配OAEP填充, 哈希支持SHA412-224/SHA512-256/SM3
- 特性: epg电子节目单支持xml格式(无法指定日期)
- 特性: 播放页设置跳过片头片尾提取当前进度条时间 [issue #463]
- 特性: 播放解析类型数据时支持查询播放记录; 加载弹幕
- 特性: 数据备份可备份至iCloud(MacOS专属)
- 特性: 增加扩展环境自主下载页
- 特性: 影视适配器支持catopen
- 特性: 影视推荐分类动态显示
- 优化: 国际化(翻译/解析平台/赞助/主程序), 整理公共节点, 支持繁体中文, 部分译文过长导致样式溢出
- 优化: 主程序重构, 接口提供schema(支持swagger文档), 前后端提取公共模块, 统一多处写法, UI/UX调整, 部分逻辑迁移至后端处理, 前后端使用公共参数对其
- 优化: 热榜数据接口参数归一化, 适配百度/夸克数据来源
- 优化: 简化store跨标签页同步逻辑
- 优化: 移除多处TDesgin组件库遗留问题导致过渡方案(三方已修复)
- 优化: 影视py适配器pd系列函数适配, 调优rpc通讯, 支持传参
- 优化: 直播页适配浅色模式
- 优化: 设置 无效数据更新
- 优化: 实验室-文本对比 导入导出逻辑
- 优化: 实验室-插件中心 安装引导逻辑; 预览模块可能存在的冲突
- 优化: 实验室-写源工具 采用实时日志; 移除预览模块
- 优化: 实验室-静态筛选 采用写源工具同设计
- 优化: 设置-数据管理 支持tvbox类加密数据
- 优化: 弹幕参数兼容嵌套取值
- 优化: 免责声明弹窗逻辑, 必须阅读后才可同意
- 优化: 减少播放窗口io消耗, 窗口存在则通过刷新而不是重建
- 优化: common-nav组件 搜索匹配性能(fuse.js -> include)
- 优化: terminal组件 上下文记忆数调整; 适配搜索; webgl引擎渲染; 可见性切换画布填充bug; 选择错位
- 优化: code-editor组件 hooks
- 优化: aigc组件 优化提示词; 适配tdesgin库5.x版本
- 优化: 封装多个公共组件 webview|group-btn|lazy-bg|input-req
- 修复: 开发环境下主程序部分情况下无法热重载问题
- 修复: 开发环境下代码规范(eslint prettierrc)格式化不生效
- 修复: github action构建mac包内存溢出
- 修复: windows首次使用弹命令行窗口(仅3.4.0版本) [issue #447]
- 修复: 字体加载不渲染问题
- 修复: 请求头: 开发者工具请求头显示不对应; CDP嗅探请求头不生效
- 修复: 影视xml适配器搜索异常 [issue #445]
- 修复: 在线更新更新包未下载完成可点击安装问题, 并增加下载进度显示 [issue #423]
- 修复: 设置-数据源点击编辑不修改数据关闭后触发状态变更按钮不切换
- 修复: 默认懒加载图卡顿且多分辨率下适配不全问题
- 修复: 播放页: 数据重复传递问题(无效渲染); 部分情况metadata不加载; 小窗最小尺寸528*297(16:9); 小窗标题和拖拽冲突; 重复监听进度; 设置参数不立即生效问题
- 修复: 调用系统播放器时播放观看数据清零问题
- 修复: 解析页调优酷页路径异常
- 修复: req-html(input-req)组件 子父数据不同步; post切换get存在data参数请求出错
- 修复: router-control组件 部分页面打包环境下无法触发刷新
- 修复: play-show组件 状态更新不稳定(机器性能较低); 节目名太长导致留白时间长问题
- 修复: monaco-editor组件 diff模式下原文不同步问题
- 修复: common-nav组件 点击范围缺失问题
- 修复: title-menu组件 高度不统一, 数据变动不触发渲染或重复渲染
- 修复: multi-player组件 已知问题(详见该组件CHANGELOG)
- 修复: Linux操作系统rpm打包bug
- 变动: 标识: zyplayer -> zyfun(全部字段均迁移)
- 变动: 网盘入口不再提供, 合入影视Alist适配器
- 变动: 影视适配器drpy使用3.9.52beta3 20250801
- 变动: 插件: 安装/卸载/启动/停止 请求通道 http(超时机制) -> ipc(无超时)
- 变动: 直播-缩略图: 外部ffmpeg -> 自主下载(win-arm不支持); 直播-台标和节目单增加字段标识所需说明
- 变动: 窗口记忆: 设置-窗口记忆删除调整入口, 默认记忆模式(仅单台电脑记忆, 不作为同步数据)
- 变动: 解析标识: 解析-线路标识(全局) -> 单源级别
- 变动: 解析索引: 区分大陆和境外
- 变动: 云端备份: 定时备份 -> 数据变化备份; 备份路径: zyplayer/文件名 -> zy/文件名
- 变动: 设置-基础配置-数据管理(导入/导出/清理/同步) -> 设置-数据管理
- 变动: 实验室-嗅探播放 -> 实验室-媒体嗅探 + 实验室-播放测试
- 变动: aigc: 实验室-人工智脑 -> 全局入口; 预留供应商参数(默认 openai)
- 变动: 挂载点: 统一对话框和抽屉挂等组件载dom
- 变动: 标签页共享存储状态: 自研 -> pinia-shared-state
- 变动: 调试回放记录: pageSpy(在线) -> oSpy(离线)
- 变动: 开源协议: MIT -> AGPL3.0
- 变动: 免责声明: 根据内容变化做出相应的变动
- 变动: 数据库: pgsql -> sqlite (原数据库故障概率高, 维护不便) [issue #447]
- 变动: vite: rollup -> rolldown; typescript: tsc -> ts-go (速度更快)
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.1)

## v3.4.0 (2025-04-30)

- 特性: 支持oplayer+样式按播放器导入(样式调整)+修复xgplayer倍速显示undefeated+artplayer方法playNext封装错误+svg图标微调+修复formatUrlHeaders数据类型错误导致播放地址拼接失败
- 特性: 导入数据支持历记忆
- 特性: 右键支持复制粘贴等+频道中忽略触发
- 特性: 数据源支持T3Py+写源工具支持T3Py(需要电脑安装py3.8+和对应依赖)
- 优化: 基础设置页面打开慢(win和mac intel系列感受明显)
- 优化: 数据源检测逻辑(分类+列表)+批量检测
- 优化: drpy重复初始化+缓存从3个改到6个+重构worker逻辑
- 优化: 统一Dialog挂载节点+统一表单处理方法+优化参数校验
- 优化: 重构解析页, 直接展示站点, 播放跳转播放器(腾讯不支持搜索, 未知原因)
- 优化: 所有数据均可记录至时刻(此前只支持影视)
- 优化: 插件功能项重写依赖安装逻辑(集成7.24.2)+布局调整
- 优化: ai接口重构(支持常规和sse)+记忆上下文+sse响应+停止则取消请求(停止提示)+响应打字机效果+响应中禁止操作+仅最后响应可重生成
- 优化: 去广逻辑采用龙头大佬20250416版本
- 优化: 重构ipc(替代@electron/remote)+renderer进程禁用node环境开启上下文隔离
- 优化: 主进程部分模块解耦(参数归一)+启动流程优化+快捷键模块重构+增加hiker路径模块
- 优化: 基础设置逻辑优化+提取快捷键组件
- 修复: 数据编码样式错乱+不依赖node:Buffer模块+rc4参数控制错误+sm4解密错误
- 修复: 写源工具面板分隔不跟手(使用splitpanes替代arco)+控制台重构(@xterm/xterm替代luna-console)+日志输出
- 修复: 静态筛选批量结果不显示
- 修复: 普通输入框重复粘贴+monaco-editor编辑器无法粘贴
- 修复: monaco-editor组件按钮错位+主题不跟随
- 修复: windows和linux在写源工具和静态筛选页面样式错乱问题
- 修复: 影视详情主演|演员等参数匹配为空问题
- 修复: 写源工具代理数据上传三元组校验+过滤条件不生效
- 修复: 清理缩略图后不会重新计算空间
- 修复: 网盘(alist)提示配置路径错误
- 修复: 解析为json时类型headers逻辑错误-应获取解析数据头而不是请求解析头
- 修复: 主进程解析畸形url地址异常
- 变动: 调整用户代理默认值
- 变动: 补全缺失多语言词条
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.4.0)

## v3.3.10 (2025-02-06)

- 特性: 调试模式启动数据库端口(5432), 前端console打印
- 特性: 插件中心(实验性)
- 特性: 文件对比diff
- 优化: 播放影视时顶部显示当前播放的剧集
- 优化: fastify路由
- 优化: 去广逻辑
- 优化: lrucache加载同源数据变动加载机制(仅支持数据规则在源中) [issue #382]
- 优化: 多播放器-完善类型判断(先走HEAD, 重试走GET)|xgplayer,artplayer支持i18n和下集调用 | 移除dplayer,nplayer(核心与artplayer一致, 仅ui区别)
- 优化: 续下集+跳时间 对其腾讯视频
- 优化: markdown 渲染
- 优化: 写源工具(重构)
- 优化: 公共组件侧边栏默认滚动到当前激活
- 优化: AI组件重写
- 优化: 收藏(时刻)倒序, 新增date字段
- 优化: 源管理搜索过滤like(大小写敏感)改为ilike(大小写模糊)
- 优化: 公共组件title-menu过滤空数据
- 优化: ipc和hiker(file+request)方法完善
- 修复: 参数拼写错误 [issue #378]
- 修复: 时刻调用第三方播放器提示数据报错 [issue #363]
- 修复: 收藏load数据长度报错导致无法翻页 [issue #376]
- 修复: 去广和请求头同时存在导致数据冲突 & 优化去广前置判断 & 播放请求头去除不安全部分(浏览器报错)
- 修复: 影视搜索中数据源只有一组时数据不翻页
- 修复: 数据源 drpyjs0,t0xml,t1json,t4hipy vod_content格式化错误 | drpyjs0,t4hipy 返回play参数不规范 [issue #387] | t0xml 返回参数不规范 | drpyjs0,t0xml,t1json,t4hipy,catvod categories参数为空时报错 | wd参数重复编码问题 | drpyjs0,t4hipy 缺失pg参数| t0xml,t1json 兼容性 [issue #388]
- 修复: 弹幕参数下标存在为0加载失败问题
- 修复: 开启预加载+点击非下集选集播放链接不正确
- 修复: 开启预加载+弹幕下集加载弹幕不显示
- 修复: 预加载不生效
- 修复: 影视+时刻二级返回值没有vod_id导致历史存的数据不准确(用一级vod_id赋值)
- 修复: 电视开启缩略图时生成失败+生成后刷新生效问题
- 变动: 弹幕增加返回标识字段
- 变动: 部分数据库字段长度变更
- 变动: drpy2库更新至`3.9.51beta6 20241126`
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.10)

## v3.3.9 (2024-12-01)

- 特性: 数据追加能力(注意数据清洗能力永远不会上线)
- 特性: 仅搜索源不在数据源中显示(增加开关)[issue #283]
- 特性: 支持播放器请求头(实验性)
- 特性: 播放页自动续集(增加开关)
- 修复: 数据源T0xml无法加载 | catbox筛选不生效 | xbpq xyq网络源无法加载 | appysv2判断逻辑 | T0xml T1json搜索逻辑
- 修复: 历史播放记录无法读取(未开启跳进度的时候存在该问题)
- 修复: 播放页解析记录为空时组件bug导致点击无效(tdesgin组件bug暂时规避,等腾讯修复)
- 修复: 软件运行时再次打开奔溃[issue #354]
- 修复: 数据非标准JSON格式无法导入(改为JSON5兼容)[issue #350]
- 修复: win在线更新无限提醒 issue(下载完成后不安装一直点下载时存在该问题)[issue #349]
- 修复: 数据源搜索时数据不显示(数据达不到当前搜索页时存在)[issue #347]
- 修复: 频道名称显示不完整(名称含空格时存在该问题)[issue #342]
- 修复: 网盘不显示全部文件(增加开关)
- 修复: 写源工具导入部分情况失败
- 修复: drpy库部分逻辑错误(atob问题|withHeaders问题)
- 修复: 全局用户代理不生效
- 优化: 多播放器融合统一能力
- 优化: 系统托盘支持快捷打开软件数据目录
- 优化: 去广逻辑升级{感谢 @hpindigo}
- 优化: 子进程中网络请求能力(mac下快一倍)
- 优化: 嗅探播放页增加视频类型Auto选项系统自己判断
- 优化: 数据源配置滚动标题栏固定
- 优化: 数据加解密支持更多参数并支持3DES、Rabbit、RabbitLegacy、SM4 | 哈希计算支持Hmac
- 变动: debug数据源可删除(部分用户强迫症)
- 变动: 回归数据源检测, 仅支持单次检测(批量会窜数据)
- 变动: 数据库字段(注意备份)
- 变动: 依赖升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.9)

## v3.3.8 (2024-11-15)

> 破坏性更新

- 特性: 支持csp_XBPQ|csp_XYQ|csp_AppYSv2源格式(实验性)
- 特性: 注册URL Scheme, 支持通过zy://协议唤醒应用
- 特性: 支持常见加解密|hash计算|数据编码
- 特性: 支持folderInfolder模式
- 特性: 抽离加解密方法, 封装部分海阔方法(开发者福音)
- 优化: 多语言适配已知未适配内容+已知样式溢出内容修改+支持tdesgin内置组件
- 优化: 侧边栏采用虚拟列表渲染(数据太多导致太多dom元素卡顿)
- 优化: 嗅探逻辑支持sniffer_exclude参数,对齐道长嗅探器传参格式
- 优化: 电视导入时过滤不支持协议(ftp|rtsp|rsp)
- 优化: 重新导入历史和收藏均显示找不到数据源(回归key设计-注意之前历史会失效)
- 优化: 解析类型为web时调用嗅探器嗅探后使用播放器(iframe显示可能有广)
- 优化: 全局超时时间调整为最小3s最大60s, 超过范围自动设置为3s
- 优化: 数据源选择csp_XBPQ|csp_XYQ|csp_AppYSv2可自动填充api
- 优化: 老板键在原有隐藏窗口基础上增加窗口静音和暂停[issue #323]
- 优化: 网络请求优化, 部分逻辑迁移到后端(如无法篡改请求头内容, 此前方式为先自定义再底层恢复)
- 优化: 数据源实现逻辑解耦合, 每个实现逻辑都为一个适配器模式(开发者福音)
- 优化: 修改打包hook机制, 跳过签名校验, 仅保留 zh & en 字体(win+linux 生效)
- 优化: 统一主进程和渲染进程通讯规范, 采用小驼峰命名(开发者福音)
- 优化: ui统一更多设计样式, 部分ux操作加入过渡动画
- 优化: 简化前端权限逻辑实现(逻辑过于复杂)
- 优化: 封装前端组件减,少冗余代码(monaco编辑器|数据源配置|md渲染)
- 优化: 新版TdesginUI组件库empty组件替代原有提取自ElementUI手搓组件
- 优化: 使用vue3.5版本, 使用部分新特性替代老代码(如useTemplateRef)
- 优化: 拦截多个开发者工具无限debugger脚本(devtools-detector|disable-devtool)
- 优化: 重构播播放器逻辑
- 优化: 播放器共享并记忆音量|倍速|静音(注意:dplayer设置静音项图标不对应)
- 优化: 数据源初始化Adapter适配器时使用LRU缓存(10个)
- 修复: 新版titlebar组件不兼容问题(win、linux均有该问题)
- 修复: mac系统触发每次打开应用都弹窗网络请求权限校验(打开防火墙情况)
- 修复: win11系统存在安装应用后无法打开(nsis安装脚写注册表逻辑问题)
- 修复: 数据源列表通过搜索加载的数据选中删除无效
- 修复: 数据源编辑内容无需点击确认就可修改原始数据
- 修复: 播放器中epg列表不加载数据源中的专属epg
- 修复: 网盘错误逻辑导致切换数据源会导致数据源消失[issue #314]
- 修复: 网盘匹配不到password导致服务终止
- 修复: 播放器播放影视视频, 点击推荐数据无法触发事件
- 修复: 数据导入时涉及基础配置时以及webdev远端同步本地数据不刷新
- 修复: 新版本electron前端获取不到文件路径, 替换为electron-dialog方案
- 修复: 智脑无法打开openai链接
- 修复: 切换分类|切换数据源, 顶部搜索关键词不恢复默认问题
- 修复: 基础数据设置数据不成功问题(已初始化数据为基准)
- 修复: 侧边栏收起对不齐顶部问题(强迫着患者福音)
- 修复: 用户数据导入不规范导致窗口无法打开[issue #312]
- 修复: 切换频道节目单不更新[issue #346]
- 修复: md文档内容无法渲染有序和无序dom
- 修复: 嗅探器服务脱离窗口池问题(窗口服务统一管理)
- 修复: 开启webdev自动同步会无限创建webdev对象导致内存未释放
- 修复: 影视和站点顶部菜单已经激活的菜单再次点击无法触发 数据加载
- 变动: 字体采用小米字体(MiSans)
- 变动: 拆封写源工具部分功能并独立于设置页面
- 变动: 剔除-iframe嗅探方案(限制较多, 和pie方案功能相差较多)
- 变动: 剔除-收藏页检查更新功能(效果与实际设想相差较大);
- 变动: 剔除-数据源类型appv1和appv2(实验性csp_AppYSv2替代)
- 变动: 剔除-设置页hipy的推广内容
- 变动: 剔除-数据源有限性检测(现有逻辑较为鸡肋, 同时导致用户不断询问)
- 变动: 剔除-硬件加速开关(数据库变更后硬件加速禁用失败)
- 变动: 剔除-随心看功能(鸡肋功能)
- 变动: 剔除-v8引擎缓存机制(没有带来性能提升)
- 变动: 修改-数据管理-快捷配置剔除此软件导入方式, 合并tvbox和hipy导入格式
- 变动: 修改-影视第一个分类数据改为加载首页数据(homeVod)
- 变动: 修改-电视相关参数epg应携带{name}和{date}|logo应携带{name}(优先级:自带->源自带->全局)
- 变动: 修改-电视过滤ipv6频道改为仅标识ipv6(跳过检测会增加加载时间, 不友好)
- 变动: 修改-数据库从lowdb变更为PGLite(数据强校验, 字段不规范直接报错)
- 变动: 修改-升级所有依赖, 前端部分依赖不再依赖nodejs(不再兼容老系统, 稳定性有提升)
- 变动: 修改-drpy核心对齐道长仓库最新版本2024.10(取消摇树, 最新侵入库本身)
- 变动: 修改-debug涉及PageSpy服务域名变更
- 变动: 数据库字段(注意备份)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.8)

## v3.3.7 (2024-07-30)

> 最后一个版本支持win7

- 特性: 全新卡片式ui(侧边导航可折叠)
- 特性: DNS-over-HTTP回归(重构逻辑)
- 特性: 调试模式
- 特性: 影视搜索支持过滤
- 特性: 写原工具之筛选插件
- 特性: 热搜增加移动爱家和豆瓣接口[issue #221]
- 特性: 播放页小窗设计[issue #218]
- 特性: 侧边导航可搜索源[issue #241]
- 特性: 写原工具支持拖拽文件展示数据
- 特性: 播放器支持 mpd 和 dash
- 优化: 线路选择样式变动[issue #240]
- 优化: 调整底层版本支持硬解hevc[issue #261]
- 优化: 播放器倍速逻辑重构[issue #278 #279]
- 优化: loading 层重构,减少内存消耗
- 优化: 多窗口数据交互接口重构
- 优化: 嗅探支持更多格式
- 优化: 多窗口逻辑重构
- 修复: 配置源需要刷新问题 (重构bus总线)
- 修复: 搜索输入框双击触发最大化问题1
- 修复: 部分情况下搜索页无法进入详细页[issue #228]
- 修复: 部分提示词变动及多语言适配[issue #288]
- 变动: openai默认模型调整, 支持输入模型
- 变动: 写源工具文档地址调整为github-wiki
- 变动: 播放器背景图
- 变动: 数据库字段(注意备份)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.7)

## v3.3.6 (2024-05-20)

- 修复: 播放页倒序后逻辑混乱
- 修复: 解析切换type前播放器未摧毁

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.6)

## v3.3.5 (2024-05-19)

- 特性: 解析支持json格式(type:1)
- 特性: 播放器支持去插播、预嗅探加载下一集[issue #205]
- 特性: 播放页支持选择解析线路
- 特性: 支持全局超时时间(不要设置太短影响本地服务器数据读取)
- 优化: 播放器重构, 全播放器支持弹幕(破坏性的)
- 优化: 写源工具支持嗅探、源代码格式化、源代码编码、编辑器智能提醒、ai、服务生成式[discussions #180]
- 优化: 嗅探器支持初始化参数
- 优化: 写源工具导致整个设置页面白屏时间长
- 优化: 推荐数据逻辑重构(破坏性的)
- 修复: 数据源可以添加空白数据
- 修复: 嗅探器定时器失效导致内存溢出
- 修复: 分类有重复id导致vue内存溢出
- 修复: 选集倒序序号不变化
- 变动: 免责申明协议更新
- 变动: drpy库同步保持最新
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.5)

## v3.3.4 (2024-04-27)

- 特性: 支持国际化(中文|英语)
- 特性: webdev支持自动同步数据(5分钟一次)[issue #158]
- 特性: 写源工具
- 特性: 支持第三方嗅探[issue #164]
- 特性: 上线随心看
- 特性: 支持弹幕(仅西瓜播放器)
- 优化: t3模块支持本地代理(暂未测试)|同步保持更新(当前为3.9.50beta2 202400427){感谢 @hjdhnx}
- 优化: 数据导入支持相对路径
- 优化: 播放页逻辑解耦部分、样式优化、支持同步主题变化
- 修复: Linux不显示桌面图标[issue #179]
- 修复: 修改老板键写入脏数据
- 修复: 时刻取消后重新收藏出现该源被删除[issue #173 #162]
- 修复: 当触发不同站点详情页数据不变化[issue 146]
- 修复: 搜索通过点击触发显示事件e
- 修复: 搜索触发多次多余详情爬虫
- 修复: 搜索当源不是t3时搜索失败
- 修复: 外部播放器传递特殊字符数据丢失一部分[issue #171]
- 修复: 播放页、详情页触发多个高亮选中集数(重构逻辑和历史数据冲突,表现为有历史数据时不自动播放,需手动点击或者清空历史)
- 修复: 播放页为直播时无法使用全局台标
- 修复: 采用新架构后版本升级数据字段变动无法随版本迁移
- 修复: 生产模式下不生成日志文件
- 修复: windows快捷键无法打开开发者模式
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.4)

## v3.3.3 (2024-03-25)

- 特性: 兼容t3影视源(不支持本地代理){感谢 @hjdhnx}
- 特性: 兼容catvod影视源(不支持本地代理){感谢 @catvod}
- 优化: 调用系统播放器不再使用环境变量[issue #152]
- 优化: 影视、电视、过刻页面采用响应式方案
- 修复: 修复mac系统托盘不适应背景色问题[issue #143]
- 修复: 修复影视搜索时过刻数据错乱问题[issue #157]
- 修复: 修复西瓜播放器快捷键问题[issue #150]
- 修复: 修复免责申明无法打开问题(含申明内容更新)
- 修复: 修复解析历史抽屉点击删除触发播放和页面自动关闭问题
- 修复: 修复缩略图文件夹未生成问题
- 修复: 修复重启软件老板键失效问题[issue #153]
- 修复: 修复搜索交互问题[issue #153]
- 变动: 端口变更8345->9978 (同tvbox本地端口)
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.3)

## v3.3.2 (2024-02-29)

- 特性: 新增系统托盘
- 特性: 兼容hipy影视源
- 优化: 重构大部分页面,框架升级至electron-vite(流畅性玄学优化)
- 优化: 数据不在存储在前端采用lowdb,并开一个后端fastify服务(端口 8345)
- 优化: 全新logo,优化win尺寸偏小问题{感谢 @fourbeauty}
- 优化: 直播延迟检测机制
- 优化: 播放器为系统时,支持先嗅探在调用系统播放器
- 优化: 影视源有效检测机制、收藏更新检测机制、影视聚合搜索增加队列并发
- 优化: 空间优化 (mac减少100+mb | win 减少20+mb | linux 减少30+mb)
- 修复: 修复影视和直播页面内存溢出问题
- 修复: 修复影视菜单映射关系不存在导致切换分类失败问题
- 修复: 修复播放器为系统时,影视详情播放列表不对应问题
- 修复: 修复解析历史抽屉遮挡无法点击系统操作栏问题(除苹果操作系统外)
- 修复: 修复解析历史抽屉点击删除触发播放和页面自动关闭问题
- 修复: 修复解析搜索时关闭按钮遮挡无法点击系统操作栏问题(除苹果操作系统外)
- 修复: 修复影视聚合搜索重复源搜索问题
- 变动: 删除腾讯播放器(特性开始恶心新增账号验证才能使用),增加系统调用vlc(需保证环境变量)
- 变动: 彩蛋开放,不再需要触发
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.2)

## v3.3.1 (2023-12-17)

- 特性: 主窗口退出保存位置[issue #113]
- 特性: 设置增加全局配置 iptv 台标配置
- 优化: 各项目可直接跳转到配置源
- 优化: 修改默认加载图
- 修复: windows 状态栏错乱(特地在 win 平台测试了)[issue #118 #116]
- 修复: 设置表格中存在大量逻辑问题
- 修复: 调用播放窗口标题 undefined
- 修复: 开发模式下 ffmpeg 调用失败
- 修复: 影视源连续添加不同配置提示已存在
- 修复: 搜索栏高度问题导致出现滚动条
- 变动: 免责申明协议调整至基础设置
- 变动: 数据库字段(注意备份)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.1)

## v3.3.0 (2023-12-03)

- 优化: 加载页动画效果
- 修复: pie嗅探报错(electron版本导致)
- 修复: 无法从解析历史播放
- 修复: 影视搜索一个报错后面无法执行[issue #108]
- 修复: 设置中嗅探方案不显示选择项
- 修复: 分享组件特殊情况下无法生成二维码
- 变动: 修改系统默认菜单栏
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.3.0)

## v3.2.10 (2023-09-30)

- 特性: 支持alist网盘功能(实验性){感谢开源项目@CatVodOpen}
- 特性: 支持pie嗅探{感谢 开源项目@CatVodOpen}
- 优化: 重构底部加载细节(自认为有优化)
- 优化: iptv缩略图创建文件夹时机优化
- 优化: 数据导入导出做了更多的逻辑校验(防止手贱玩家)
- 修复: 修复一键配置单词拼写错误导致的问题7.变动:修改系统默认菜单栏(mac 生效)
- 变动: 数据库字段(注意备份)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.10)

## v3.2.9 (2023-09-14)

- 修复: 一键配置回归
- 修复: 已知 bugs
- 变动: 数据库字段(注意备份)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.9)

## v3.2.8 (2023-09-03)

- 特性: 新增dp播放器替代阿里、火山播放器(支持调用mac本地 iina, win本地potplayer)
- 特性: 数据管理模块重构[支持备份到 webdev]
- 修复: 直播缩略图实验性功能导致打开报错[issue #73 #69]
- 修复: 播放器分享功能地址失效[pr #72]
- 变动: 增加drpy推荐位
- 变动: 数据库字段(注意备份)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.8)

## v3.2.7 (2023-08-20)

- 特性: 全新ui/ux
- 特性: 直播缩略图(实验性, 需安装ffmpeg)
- 特性: 增加loading层窗口优化打开软件白屏久
- 修复: 基础设置判断ipv6获取地址不是公网ip的问题
- 修复: 通过设置源切换默认加载出错以及分类不对的问题
- 修复: 直播无法切换非远程链接的问题
- 修复: mac双击标题栏不放大和缩小窗口的问题
- 修复: api兼容性问题
- 变动: 直播有效性改成延迟时间

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.7)

## v3.2.6 (2023-08-03)

- 特性: 兼容 app-v1 源[issue #58]
- 特性: 设置源添加资源数[issue #50]
- 特性: 热榜支持ky.live和高合数据(酷云好像挂了)
- 修复: 图标 win 过小,liux 老图标的问题[issue #59]
- 修复: 推荐数据请求错误的问题,优化兼容性
- 修复: 选中筛选条件切换分类不变的问题(重构所有源类型的数据结构)
- 变动: 设置源分类代替全局过滤
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.6)

## v3.2.5 (2023-07-09)

- 特性: 兼容 app-v3 源
- 修复: 直播列表勾选跳过ipv6内存泄露的问题
- 修复: 热榜为站内且为drpy源时数据报错的问题
- 修复: 热榜数据没有随站点源变化的问题
- 修复: 播放器剧集倒序乱序的问题
- 修复: 非链接源播放器无法加载的问题
- 修复: 源解析和'哎呦疼'冲突的问题
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.5)

## v3.2.4 (2023-07-01)

- 特性: 历史和收藏支持显示播放源[issue #41]
- 特性: 播放支持选集倒序
- 优化: 搜索交互优化
- 优化: 设置源表格重构(支持跨多页选择数据和搜索)[issue #23]
- 优化: 直播判断逻辑{感谢 @jahem}
- 修复: 兼容drpy搜索参数问题(兼容 drpy 的 c#版本)
- 变动: 下架社区功能[issue #40]
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.4)

## v3.2.3 (2023-06-04)

- 特性: 适配多款播放器
- 优化: 解析增加分享(提取播放器公共组件,并重写样式
- 优化: 彩蛋增强(webview 替代 iframe,支持前进后退
- 修复: 搜索和推荐接口多次请求的问题(可能嘎嘎快)
- 修复: 兼容部分源无效参数导致请求失败的问题(1080zyku)
- 修复: 导出源不显示保存路径的问题(electron+fs 替代 saveas 库)
- 修复: 播放器全屏时顶部无法点击的问题(drag 冲突)
- 修复: tdesgin1.3.5输入装饰器slot不生效的问题(被迫修改逻辑)
- 修复: 酷云热搜请求 3 次实际只请求 2 次的问题
- 变动: 站点源检测有效性添加请求超时时间为 3 秒

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.3)

## v3.2.2 (2023-05-28)

- 特性: 兼容dr_py的免嗅模式{感谢 @hjdhnx}
- 特性: 兼容两套播放器(新增tcplayer)
- 优化: 热搜兼容夸克、百度 接口
- 优化: iptv 状态检测优化(引入队列和取消请求)
- 修复: 嗅探链接大小写问题导致无法播放的问题
- 修复: iptv不开启跳过 ipv6无限请求的问题
- 修复: iptv解析 dns 失败数据不继续加载的问题
- 变动: 删除软解(字节确认 v3 版本 xgplayer 不支持)
- 变动: 部分 svg 图标更换
- 变动: 数据库字段(注意备份)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.2)

## v3.2.1 (2023-05-21)

- 特性: 兼容dr_py的filters|search{感谢 @hjdhnx}
- 特性: 兼容xml格式源
- 优化: 兼容json5(一键配置里用注释的 xx 行为)
- 修复: iptv 切换源不刷新分类的问题
- 修复: 搜索组件无限请求数据的问题
- 修复: 错别字(Issues #20 )
- 修复: 部分奇葩源无分类的问题(海X看)
- 修复: film切换源,搜索依旧使用默认源的问题
- 变动: 修改免责声明及部分提示文案
- 变动: 播放器逻辑
- 变动: 接口请求失败重试次数调整为3
- 变动: 数据库字段(注意备份)
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.1)

## v3.2.0 (2023-05-13)

- 特性: 兼容dr_py的type:1的数据{感谢 @hjdhnx}
- 修复: 触发老板键错误的问题(同时修改不同系统默认快捷键)
- 修复: 社区刷新冲突的问题
- 修复: 一直播放下集的问题
- 修复: 三大金刚双击标题栏导致 icon 不同步的问题
- 修复: main 程序关闭时点击回到主页无法打开的问题
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.2.0)

## v3.1.10 (2023-05-07)

- 特性: 增加社区
- 特性: 直播源支持本地 m3u
- 优化: ui调整
- 优化: 影视热榜、搜索框重构
- 优化: 彩蛋增强(自己探索代码中的 todo,不要传播)
- 修复: 恢复出厂数据不彻底导致冲突的问题(同时软重启改为硬重启)
- 修复: 影视搜索后导致无法下拉的问题
- 修复: 播放下集冲突的问题,重构播放进度记录(播放器事件替代定时器)
- 修复: 添加站点源分类空白的问题
- 修复: main 程序关闭时点击回到主页无法打开的问题
- 变动: 视频流特征采集改为 5s 同步一次数据
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.10)

## v3.1.9 (2023-04-22)

- 特性: 支持查看播放器信息
- 优化: 不同操作系统兼容性
- 修复: 自动切换下集与画中画冲突
- 修复: 过滤为空导致加载分类错误{感谢 @jim114042}
- 变动: 删除最小化自动暂停/恢复播放
- 变动: 西瓜播放器beta到release

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.9)

## v3.1.8 (2023-04-16)

- 特性: 自动播放下集
- 特性: 部分页面增加返回顶部(T-Desgin 1.3.0 support)
- 优化: 彩蛋(希望发现的童鞋不要传播打开方法)
- 修复: 影视逻辑错误{感谢 @jim114042}
- 修复: 播放器加载解析错误导致无法播放问题
- 修复: 部分视频无法加载问题(xgplayer 3.0.0-next.55-2 fix)
- 变动: 免责声明协议(语句不通顺、错别字)

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.8)

## v3.1.7 (2023-04-09)

- 特性: 基础配置增加安全User-Agent设置
- 优化: 彩蛋(希望发现的童鞋不要传播打开方法)
- 优化: ipv6检测(支持域名dns解析)
- 优化: 播放页重构部分函数(播放加载明显加快)、兼容另类的cms源(剧集不带名称)、iptv数据多卡顿、切换剧集重复查询豆瓣
- 优化: 绘制部分svg替代png图标
- 修复: 切换基础配置闪屏问题
- 修复: 基础配置导致影视直接加载完成问题
- 修复: 打开app首屏加载慢问题

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.7)

## v3.1.6 (2023-04-05)

- 特性: 播放页兼容调用解析(不记录历史进度)
- 特性: 我的收藏增加更新检测
- 特性: 基础配置增加安全DNS设置(重启软件生效)
- 优化: 彩蛋(希望发现的童鞋不要传播打开方法)
- 优化: 播放器iptv直播逻辑判断(代码重构)
- 优化: 借助chatgpt优化有必要de代码
- 修复: 历史记录列表统计错误(代码重构)
- 修复: 去除原有load函数等待(代码重构)
- 修复: 播放器进度条错误、播放历史日期不更新问题
- 修复: 部分已知css问题(variables导入错误)
- 修复: 解析历史切换不加载url、日期不更新、sohu获取标题乱码问题
- 修复: 三大金刚浅色模式下播放页看不清问题(win、Linux)
- 修复: 主题外观是自动时系统外观变化不同步问题(主要针对mac)
- 修复: iptv开启v6检测空数据报错、ipv6检测不严谨问题
- 修复: 源设置排序与分页冲突问题
- 变动: 代理使用系统配置
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.6)

## v3.1.5 (2023-03-25)

- 特性: 基础配置增加ipv6检测的支持
- 特性: 播放页增加影视离线缓存链接复制的支持
- 特性: 播放页增加iptv频道的支持
- 优化: 交互(配置变动页面该刷新就刷新、css样式)
- 修复: 基础配置检查更新逻辑错误
- 修复: 系统媒体正在播放显示名称错误
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.5)

## v3.1.4 (2023-03-19)

- 特性: 基础配置增加硬件加速开关(Linux兼容性)
- 特性: 基础配置增加在线更新(仅win支持; mac|linux不支持)
- 优化: 适配直播源解析不同规则兼容性
- 优化: 分享成功提示
- 优化: 影视和直播选择分类样式
- 修复: 最小化不暂停播放的问题
- 修复: win开启开机自启无法取消
- 变动: 基础配置重置拆分还原出厂(重置数据、清理缓存)+清理缓存
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.4)

## v3.1.3 (2023-03-12)

- 特性: 基础配置增加一键配置、开机自启功能
- 特性: 源配置页面增加配置提示
- 特性: 解析页面增加历史功能
- 优化: 基础配置设计重构
- 优化: 老板键逻辑-增加校验
- 优化: 源配置页面样式主题色同步全局
- 优化: iptv页面设计同步站点源页面
- 优化: 站点源页面筛选功能重新设计(减少条条框框)
- 修复: 站点源切换源分类不更新导致的错误
- 修复: 源配置当前页面全选会删除全部数据的错误
- 修复: 源配置通过网络源增加失败的错误
- 变动: 依赖库升级

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.3)

## v3.1.2 (2023-03-06)

- 修复: 表格排序问题

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.2)

## v3.1.1 (2023-03-05)

- 优化: 设置显示默认源样式
- 优化: iptv部分样式
- 修复: 切换选集m3u8地址不变、切换选集进度条不回滚
- 修复: 播放历史时始终为第一个url
- 修复: 播放非m3u8时拼接m3u链接错误
- 修复: 设置中源index错误导致的编辑和默认错乱
- 修复: onMounted没加载完就触发load

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/v3.1.1)

## 3.1.0 (2023-02-28)

- 特性: 新增全局刷新
- 特性: 新增播放器播放历史播放进度及跳过开头
- 优化: 交互逻辑
- 优化: 兼容vite4,播放器使用西瓜视频组件v3beta
- 优化: 使用electron ts和import导入
- 修复: 修复老板键不生效问题
- 变动: 修改主题色对应于logo的配色
- 变动: 修改解析支持平台(减少风险,彩蛋在TODO)
- 变动: 去除waterwall第三方组件导致的切换页面变成一列

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/3.1.0)

## 3.0.0 (2023-02-06)

- 特性:上线用户协议与免责声明
- 特性:影视支持多源搜索
- 特性:支持直接切换源,不用进设置配置
- 特性:新增老板键
- 优化:适配windwos无标题框模式
- 修复: 修复缺少单个iptv的epg

[View on GitHub](https://github.com/Hiram-Wong/ZyPlayer/releases/tag/3.0.0)


================================================
FILE: LICENSE.txt
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.


================================================
FILE: README.md
================================================
<div align="right">
  <details>
    <summary >🌐 Language</summary>
    <div>
      <div align="center">
        <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=en">English</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=zh-CN">简体中文</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=zh-TW">繁體中文</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ja">日本語</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ko">한국어</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=hi">हिन्दी</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=th">ไทย</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=fr">Français</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=de">Deutsch</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=es">Español</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=it">Italiano</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ru">Русский</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=pt">Português</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=nl">Nederlands</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=pl">Polski</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=ar">العربية</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=fa">فارسی</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=tr">Türkçe</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=vi">Tiếng Việt</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=id">Bahasa Indonesia</a>
        | <a href="https://openaitx.github.io/view.html?user=Hiram-Wong&project=zyfun&lang=as">অসমীয়া</
      </div>
    </div>
  </details>
</div>

<p align="center">
  <a href="https://github.com/Hiram-Wong/zyfun/releases">
    <!-- <img src="https://github.com/Hiram-Wong/zyfun/blob/main/build/icon.png?raw=true" width="150" height="150" alt="banner" /> -->
    <img width="128" src="https://s2.loli.net/2024/02/29/7Q1nVbhkHdSmo5D.png">
    <br>
  </a>
</p>

<div align="center">

[![][github-release-shield]][github-release-link]
[![][github-nightly-shield]][github-nightly-link]
[![][github-license-shield]][github-license-link]
[![][fossa-shield]][fossa-link]
[![][telegram-shield]][telegram-link]
[![][sponsor-shield]][sponsor-link]

</div>
<div align="center">

[![][readmex-shield]][readmex-link]
[![][deepwiki-shield]][deepwiki-link]
[![][zread-shield]][zread-link]

</div>
<div align="center">

[![][rank-hellogithub-shield]][rank-hellogithub-link]
[![][rank-trendshift-shield]][rank-trendshift-link]
[![][rank-producthunt-shield]][rank-producthunt-link]

</div>

# 软件介绍

zyfun是一款免费、极简、全能的跨平台影音管家,一站式管理 T1-T4 全类型资源,内置多核播放器随心切换。独家老板键,一键隐身摸鱼无忧。用观影发现世界!

<details>
<summary>展开查看软件截图</summary>

|                    影视                     |                   直播                   |
| :-----------------------------------------: | :--------------------------------------: |
|  ![影视](docs/assets/images/app-film.png)   | ![直播](docs/assets/images/app-live.png) |
|                  **历史**                   |                 **播放**                 |
| ![历史](docs/assets/images/app-history.png) | ![播放](docs/assets/images/app-play.png) |

</details>

## 🌴 注意事项

- 仅此Github发布,请勿上当受骗;请各管理者不要宣传及引流本软件。
- 强烈倡导合法观影,本软件仅作为播放工具,不涉及资源存储或分发。
- 仅供个人学习交流之用,24小时内请自觉卸载,勿作商业用途。
- 前身来源于[ZY-Player](https://github.com/Hunlongyu/ZY-Player),图标由@fourbeauty设计。
- 在开始使用前,请务必详读并同意用户协议,确保遵守相关规定。

## 💻 跨平台说明

- **MacOS**:
  - 数据库/文件/插件/日志 路径: `~/Library/Application Support/zyfun/`
  - 二进制 路径: `~/.zy/bin/`
- **Linux**:
  - 数据库/文件/插件/日志 路径: `~/.config/zyfun/`
  - 二进制 路径: `~/.zy/bin/`
- **Windows**:
  - 数据库/文件/插件/日志 路径: `%USERPROFILE%\AppData\Roaming\zyfun\`
  - 二进制 路径: `%USERPROFILE%\.zy\bin\`
  <!-- - **OpenHarmony**:
  - 数据库/文件/插件/日志 路径: `/data/storage/zyfun/base/files/log`
  - 二进制 路径: `~/.zy/bin/`-->

## 🛠️ 下载安装

> **开发版下载**: 需登录Github账号

> **最低要求**: 和chromium内核要求保持一致

| 操作系统 | x64 | arm64 | loong64 | 发行版                                                                                                                                                                                                                      | 开发版                                                                            | 最低要求   |
| :------: | :-: | :---: | :-----: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ---------- |
| Windows  | ✅  |  ✅   |   ➖    | [GitHub](https://github.com/Hiram-Wong/zyfun/releases)                                                                                                                                                                      | [GitHub](https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml) | >= win10   |
|  MacOS   | ✅  |  ✅   |   ➖    | [GitHub](https://github.com/Hiram-Wong/zyfun/releases)                                                                                                                                                                      | [GitHub](https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml) | >= macOS12 |
|  Linux   | ✅  |  ✅   |   ❌    | [GitHub](https://github.com/Hiram-Wong/zyfun/releases) <br/> [如意玲珑应用商店](https://store.linyaps.org.cn/) <br/> [AUR软件包](https://aur.archlinux.org/packages?O=0&SeB=nd&K=zyfun&outdated=&SB=p&SO=d&PP=50&submit=Go) | [GitHub](https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml) |            |
| Harmony  | ❌  |  ❌   |   ➖    |                                                                                                                                                                                                                             |                                                                                   |

<details>
<summary>展开查看安装问题</summary>

#### MacOS 安装后打开提示「文件已损坏」

```bash
sudo spctl --master-disable
sudo xattr -cr /Applications/zyfun.app
```

#### Linux Appimage运行失败

> Running as root without --no-sandbox is not supported

```bash
./zyfun.AppImage --no-sandbox
```

> dlopen():error loading libfuse.so.2

```bash
sudo apt-get install libfuse2
```

> Exiting GPU process due to errors during initialization

```bash
xhost +
```

#### Linux deb包安装失败

> Package libnss3-1d is not installed

```bash
sudo apt-get install libnss3-1d
```

> Package libxss1 is not installed

```bash
sudo apt-get install libxss1
```

#### Linux rpm包安装失败

> Dependency check failed libXScrnSaver is needed

```bash
sudo yum install epel-release
sudo yum install libXScrnSaver
```

> Dependency check failed xdg-utils is needed

```bash
sudo yum install xdg-utils
```

</details>

## 📚 数据结构

> 请严格按照数据结构导入数据, 避免不必要的报错(如数据字段类型不匹配)

<details>
<summary>展开查看接口说明</summary>

```json
{
  "analyze": [
    {
      "id": "fddfb425-6fd9-0b39-459f-a21f69739a6e", // 数据唯一uuid标识(不可重复)
      "key": "51793af6-c923-5504-85db-0ef686624dec", // <3.4.0 启用> 业务唯一标识(不可重复)
      "name": "Parse", // 名称(展示用)
      "url": "https://xxx.top/?jx=", // <3.4.1 **弃用**> 解析源地址(仅兼容旧版本)
      "api": "https://xxx.top/?jx=", // <3.4.1 启用> 解析源地址(推荐使用)
      "type": 0, // 解析类型(<=3.4.0: 0=web,1=json | >=3.4.1: 1=web,2=json)
      "flag": [], // <3.4.1 启用> 解析线路/标签标识
      "headers": {}, // <3.4.0 启用> 请求头配置(预留字段)
      "script": "", // <3.4.1 启用> 执行脚本,仅 type=web 时生效
      "isActive": true, // 是否启用(true=启用,false=禁用)
      "createdAt": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)
      "updatedAt": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)
    }
  ],
  "iptv": [
    {
      "id": "fddfb425-6fd9-0b39-459f-a21f69739a6e", // 数据唯一uuidv标识(不可重复)
      "key": "51793af6-c923-5504-85db-0ef686624dec", // <3.4.0 启用> 业务唯一标识(不可重复)
      "name": "Iptv", // 名称(展示用)
      "url": "https://xxx.com/m3u/iptv.m3u", // <3.4.1 **弃用**> 直播源地址(仅兼容旧版本)
      "api": "https://xxx.com/m3u/iptv.m3u", // <3.4.1 启用> 直播源地址(推荐使用)
      "type": 1, // 解析类型(<=3.4.0: remote=远程,local=本地, manual=文本 | >=3.4.1: 1=远程,2=本地,3=文本)
      "epg": "https://epg.112114.eu.org/?ch={name}&date={date}", // 电子节目单地址[string]
      "logo": "https://epg.112114.eu.org/logo/{name}.png", // 台标地址[string] - 3.3.8启用该参数
      "headers": {}, // <3.4.0 启用> 请求头配置(预留字段)
      "isActive": true, // 是否启用(true=启用,false=禁用)
      "createdAt": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)
      "updatedAt": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)
    }
  ],
  "channel": [
    {
      "id": "fddfb425-6fd9-0b39-459f-a21f69739a6e", // 数据唯一uuidv4标识(不可重复)
      "name": "Channel", // 名称(展示用)
      "url": "https://xxx.com/m3u/iptv.m3u8", // <3.4.1 **弃用**> 播放地址(仅兼容旧版本)
      "api": "https://xxx.com/m3u/iptv.m3u8", // <3.4.1 启用> 播放地址(推荐使用)
      "logo": "https://xxx.com/logo/xxx.png", // <3.4.1 启用> 台标地址
      "playback": "", // <3.4.1 启用> 预留回播参数
      "group": "默认", // 分组
      "createdAt": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)
      "updatedAt": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)
    }
  ],
  "site": [
    {
      "id": "fddfb425-6fd9-0b39-459f-a21f69739a6e", // 数据唯一uuidv4标识(不可重复)
      "key": "51793af6-c923-5504-85db-0ef686624dec", // <3.4.0 启用> 业务唯一标识(不可重复)
      "name": "Film", // 名称(展示用)
      "api": "https://www.xxx.com/api.php/provide/vod/", // 接口地址
      "playUrl": "", // 配合解析去url地址
      "search": 0, // 是否支持搜索(<=3.4.0: 0= 关闭,1=聚合搜索,2=仅搜索 | >=3.4.1: true= 开启,false=关闭)
      "group": "切片", // 分组
      "type": 1, // 适配器类型(0=T0_XML,1=T1_JSON,6=T4_DRPYS,7=T3_DRPY,8=T4_CATVOD,9=T3_XBPQ,10=T3_XYQ,11=T3_APPYSV2,12=T3_PY,13=T3_ALIST)
      "ext": "", // 扩展参数
      "categories": "电视,影视", // 按顺序展示所配置的分类 不配置则默认展示所有分类[string]
      "isActive": true // 是否启用(true=启用,false=禁用)
      "createdAt": 1768310498000, // <3.4.1 启用> 创建时间戳(ms)
      "updatedAt": 1768310498000 // <3.4.1 启用> 更新时间戳(ms)
    }
  ],
  "drive": [
    {
      "id": "fddfb425-6fd9-0b39-459f-a21f69739a6e", // 数据唯一uuidv4标识(不可重复)
      "key": "51793af6-c923-5504-85db-0ef686624dec", // <3.4.0 启用> 业务唯一标识(不可重复)
      "name": "alist", // 名称(展示用)
      "server": "http://alist.xxx.pro/", // 网盘地址
      "showAll": false, // 是否展示全部(true=全部,false=仅视频)
      "startPage": "", // 开始页路径
      "search": false, // 是否支持搜索(true=启用,false=禁用)
      "headers": "{}", // 请求头(预留字段)
      "params": "{}", // 参数(预留字段)
      "isActive": true // 是否启用(true=启用,false=禁用)
    }
  ], // <3.4.1 **弃用**>
  "setting": [
    {
      "version": "3.3.2", // <3.2.2 启用> 当前版本(一定要根据实际填写,不然数据库执行会报错)
      "theme": "system", // 主题 (<=3.4.0: auto=跟随系统,light=亮色,dark=暗色 | system=跟随系统,light=亮色,dark=暗色)
      "lang": "zh_CN", // <3.3.4 启用> 语言(<=3.4.0: zh_CN=简体中文,en_US=英文 | system=更随系统,zh_CN=简体中文,zh_TW=繁体中文,en_US=英文)
      "zoom": 1, // <3.4.1 启用> 界面缩放比例(预留)
      "proxy": {
        "type": "none", // 代理类型(system=系统代理,custom=自定义代理,direct=直连)
        "url": "", // 代理地址(支持socks5/http/https协议)
        "bypass": "" // 忽略主机名
      }, <3.4.1 启用> 代理设置
      "defaultHot": "kylive", // <3.4.1 **弃用**> 热搜(kylive=酷云数据,enlightent=云合数据)
      "hot": "kylive", // <3.4.1 启用> 热搜(baidu=百度,douban=豆瓣,enlightent=云合,komect=移动爱家,kylive=酷云,quark=夸克)
      "defaultSearchRecommend": "site", // 搜索推荐 site:站点 quark:夸克 baidu:百度 douban:豆瓣  弃用
      "defaultSearchType": "site", // <3.4.1 **弃用**> 全局搜索模式 site:本站 group:组内 all:全部
      "defaultFilterType": false, // <3.3.7 启用, 3.4.1 **弃用**> 影视搜索过滤关键词
      "site": {
        "searchMode": "site", // 全局搜索模式 site:本站 group:组内 all:全部
        "filterMode": false, // 影视搜索过滤关键词
      }, // <3.4.1 启用> 影视设置
      "defaultIptvEpg": "https://epg.112114.eu.org/?ch={name}&date={date}", // <3.4.1 **弃用**> iptv电子节目单(name=频道名称 date=日期)
      "defaultIptvLogo": "https://epg.112114.eu.org/logo/{name}.png", // <3.4.1 **弃用**> iptv台标(name=频道名称)
      "iptvSkipIpv6": true, // <3.3.8 **弃用**> iptv是否跳过ipv6节目
      "iptvMarkIp": true, // <3.3.8 启用, 3.4.1 **弃用**> iptv标识IP类型
      "iptvThumbnail": true, // <3.4.1 **弃用**> iptv是否显示缩略图
      "iptvStatus": true, // <3.3.8 **弃用**> iptv是否检测延迟
      "iptvDelay": true, // <3.3.8 启用, 3.4.1 **弃用**> iptv是否检测延迟
      "live": {
        "ipMark": true, // IP类型
        "thumbnail": false, // 缩略图
        "delay": false, // 延迟测速
        "epg": "https://epg.112114.eu.org/?ch={name}&date={date}", // 电子节目单(name=频道名称 date=日期)
        "logo": "https://epg.112114.eu.org/logo/{name}.png", // 台标(name=频道名称)
      }, // <3.4.1 启用> 直播设置
      "defaultSite": "51793af6-c923-5504-85db-0ef686624dec", // site 默认源标识
      "defaultIptv": "993841fe-5e91-5e5d-35d6-5be81822960b", // iptv 默认源标识
      "defaultAnalyze": "fddfb425-6fd9-0b39-459f-a21f69739a6e", // analyze 默认源标识
      "defaultDrive": "3293dc45-cf14-9c66-3028-5b7765b240b7", // <3.4.1 **弃用**> drive 默认源标识
      "defaultViewCasual": "", // <3.3.4 启用 3.3.5 **弃用**> 随心看
      "barrage": {
        "url": "", // 弹幕地址
        "id": "name", // 弹幕接口返回数据对应的id
        "key": "danmuku", // 弹幕接口返回数据对应的key
        "support": ["qq", "qiyi", "youku", "mgtv"], // 弹幕支持的线路
        "start": "0", <3.4.1 **弃用**> // 返回数据对应的开始时间下标
        "time": 0, // <3.4.1 启用> 返回数据对应的开始时间下标
        "mode": "1", // <3.4.1 **弃用**> 返回数据对应的位置下标
        "type": 1, // <3.4.1 启用> 返回数据对应的位置下标
        "color": 2, // 返回数据对应的颜色下标(<=3.4.0: string | >=3.4.1: number)
        "content": "4" // <3.4.1 **弃用**> 返回数据对应的内容下标
        "text": 4 // <3.4.1 启用> 返回数据对应的内容下标
      }, // <3.3.4 启用> 弹幕参数
      "analyzeFlag": ["youku", "qq", "iqiyi", "qiyi", "letv", "leshi", "sohu", "tudou", "pptv", "mgtv", "imgo"], // <3.4.1 **弃用**> 解析标识
      "broadcasterType": "xgplayer", // <3.3.4 **弃用**> 播放器(xgplayer=西瓜播放器,dplayer=呆呆播放器,custom=调外部播放器)
      "externalPlayer": "", // <3.3.4 **弃用**> 调外部播放器(类型为custom启用)
      "playerMode": {
        "type": "xgplayer", // 播放器(xgplayer=西瓜播放器,artplayer=艺术播放器,custom=调外部播放器)
        "external": "" // 调外部播放器(类型为custom启用)
      }, // <3.3.4 启用, 3.4.1 **弃用**>
      "player": {
        "type": "xgplayer", // 播放器(xgplayer=西瓜播放器,artplayer=艺术播放器,custom=调外部播放器)
        "external": "" // 调外部播放器(类型为custom启用)
      }, // <3.4.1 启用>
      "softSolution": false, // 软解(预留字段 true=启用,false=禁用)
      "skipStartEnd": false, // <3.3.5 **弃用**> 是否跳过首尾空白
      "agreementMask": true, // <3.4.1 **弃用**> 是否同意协议
      "disclaimer": true, // <3.4.1 启用> 是否同意协议
      "recordShortcut": "Shift+Command+Z", // <3.4.1 **弃用**> 老板键
      "bossKey": "Shift+Command+Z", // <3.4.1 启用> 老板键
      "snifferType": "pie", // <3.3.4 **弃用**> 嗅探模式(pie=内置嗅探,iframe=原生嗅探)
      "snifferMode": {
        "type": "pie", // 嗅探模式(pie=内置嗅探,custom=三方嗅探)
        "url": "" // 三方嗅探接口(类型为custom时启用)
      }, // <3.3.4 启用, 3.4.1 **弃用**>
      "sniffer": {
        "type": "cdp", // 嗅探模式(cdp=内置嗅探,custom=三方嗅探)
        "url": "" // 三方嗅探接口(类型为custom时启用)
      }, // <3.4.1 启用>
      "selfBoot": false, // <3.4.1 **弃用**> 是否开机自启动
      "autoStart": false, // <3.4.1 启用> 是否开机自启动
      "hardwareAcceleration": true, // 是否启用硬件加速
      "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", // User-Agent
      "dns": "" // <3.3.7 启用> DNS-over-HTTP
      "webdavUrl": "https://dav.jianguoyun.com/dav/", // <3.3.4 **弃用**> webdav同步盘地址
      "webdavUsername": "", // <3.3.4 **弃用**> webdeav用户名
      "webdavPassword": "", // <3.3.4 **弃用**> webdav密码
      "webdav": {
        "sync": false, // 自动同步
        "data": {
          "url": "https://dav.jianguoyun.com/dav/", // webdav同步盘地址
          "user": "", // webdav用户名
          "password": "" // webdav密码
        }
      }, // <3.3.4 启用, 3.4.1 **弃用**>
      "cloud": {
        "sync": false, // 自动同步
        "type": "webdav", // 备份类型(webdav=webdav同步盘, icloud=icloud云盘仅mac)
        "data": {
          "url": "https://dav.jianguoyun.com/dav/", // webdav同步盘地址
          "user": "", // webdav用户名
          "password": "" // webdav密码
        } // 仅类型为webdav启用
      }, // <3.4.1 启用>
      "ai": {
        "server": "",  // AI服务器地址
        "key": "", // API密钥
        "model": "gpt-3.5-turbo" // 模型名称
      }, // <3.3.5 启用, 3.4.1 **弃用**>
      "aigc": {
        "type": "openai", // AI类型(仅支持openai)
        "server": "",  // AI服务器地址
        "key": "", // API密钥
        "model": "gpt-3.5-turbo" // 模型名称
      }, // <3.4.1 启用> AI设置
      "timeout": 5000, // <3.3.5 启用> 全局请求超时(ms)
      "restoreWindowPositionAndSize": false, // <3.3.7 **弃用**> 是否记录窗口位置
      "windowPosition": {
        "status": false, // 是否记录窗口位置
        "position": {
          "width": 1000,
          "height": 640
        }, // <3.3.7 **弃用**> 窗口位置
        "position_main": {
          "width": 1000,
          "height": 640
        }, // <3.3.7 启用> 记录主窗口位置
        "position_play": {
          "width": 875,
          "height": 550
        } // <3.3.7 启用> 记录播放窗口位置
      }, // <3.4.1 **弃用**>
      "debug": false, // <3.3.7 启用> 用于部分调试
    }
  ]
}
```

</details>

## 🤝 参与贡献

以下是您可以做出贡献的一些方式:

- **贡献代码**:开发新功能或优化现有代码 <[开发文档](docs/Develop.md)> <[Mcp文档](docs/Mcp.md)>
- **修复错误**:提交您发现的任何错误的修复 <[提交规范](docs/Conventional_Commits.md)>
- **维护问题**:帮助管理GitHub问题
- **产品设计**:参与设计讨论
- **编写文档**:改进用户手册和指南
- **社区参与**:加入讨论并帮助用户
- **用爱发电**:支持项目发展(不限于资金,服务器等) <[kofi](https://ko-fi.com/hiramwong)> <[爱发电](https://ifdian.net/a/hiram)>

[![][github-contributors-shield]][github-contributors-link]

## 🌟 Star历史

<a href="https://www.star-history.com/#Hiram-Wong/zyfun&Date">
 <picture>
   <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Hiram-Wong/zyfun&type=Date&theme=dark" />
   <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=Hiram-Wong/zyfun&type=Date" />
   <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=Hiram-Wong/zyfun&type=Date" />
 </picture>
</a>

## 💰 金主爸爸

- [NodeSupport](https://github.com/NodeSeekDev/NodeSupport) 赞助了本项目
- [![image](https://s2.loli.net/2025/04/09/JMyQZUKY2bX4G3q.png)](https://yxvm.com/)

<!-- Links & Images -->

[github-release-shield]: https://img.shields.io/github/v/release/Hiram-Wong/zyfun?label=Release&logo=github
[github-release-link]: https://github.com/Hiram-Wong/zyfun/releases
[github-nightly-shield]: https://img.shields.io/github/actions/workflow/status/Hiram-Wong/zyfun/nightly-build.yml?label=NightlyBuild&logo=github
[github-nightly-link]: https://github.com/Hiram-Wong/zyfun/actions/workflows/nightly-build.yml
[github-contributors-shield]: https://openomy.app/svg?repo=Hiram-Wong/zyfun&chart=bubble&latestMonth=12
[github-contributors-link]: https://openomy.app/github/Hiram-Wong/zyfun
[github-license-shield]: https://img.shields.io/github/license/Hiram-Wong/zyfun?label=License&logo=gnu
[github-license-link]: https://github.com/Hiram-Wong/zyfun/blob/main/LICENSE.txt
[fossa-shield]: https://app.fossa.com/api/projects/git%2Bgithub.com%2FHiram-Wong%2Fzyfun.svg?type=shield
[fossa-link]: https://app.fossa.com/projects/git%2Bgithub.com%2FHiram-Wong%2Fzyfun?ref=badge_shield
[sponsor-shield]: https://img.shields.io/badge/赞助支持-FF6699.svg?logo=githubsponsors&logoColor=white
[sponsor-link]: https://ko-fi.com/hiramwong
[telegram-shield]: https://img.shields.io/badge/IM-Telegram-0088CC?logo=telegram
[telegram-link]: https://t.me/+IOovrYLP7gYwYmNl

<!-- Links & Images -->

[readmex-shield]: https://raw.githubusercontent.com/CodePhiliaX/resource-trusteeship/main/readmex.svg
[readmex-link]: https://readmex.com/Hiram-Wong/ZyPlayer
[deepwiki-shield]: https://deepwiki.com/badge.svg
[deepwiki-link]: https://deepwiki.com/Hiram-Wong/zyfun
[zread-shield]: https://img.shields.io/badge/Ask_Zread-_.svg?style=flat&color=00b0aa&labelColor=000000&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQuOTYxNTYgMS42MDAxSDIuMjQxNTZDMS44ODgxIDEuNjAwMSAxLjYwMTU2IDEuODg2NjQgMS42MDE1NiAyLjI0MDFWNC45NjAxQzEuNjAxNTYgNS4zMTM1NiAxLjg4ODEgNS42MDAxIDIuMjQxNTYgNS42MDAxSDQuOTYxNTZDNS4zMTUwMiA1LjYwMDEgNS42MDE1NiA1LjMxMzU2IDUuNjAxNTYgNC45NjAxVjIuMjQwMUM1LjYwMTU2IDEuODg2NjQgNS4zMTUwMiAxLjYwMDEgNC45NjE1NiAxLjYwMDFaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00Ljk2MTU2IDEwLjM5OTlIMi4yNDE1NkMxLjg4ODEgMTAuMzk5OSAxLjYwMTU2IDEwLjY4NjQgMS42MDE1NiAxMS4wMzk5VjEzLjc1OTlDMS42MDE1NiAxNC4xMTM0IDEuODg4MSAxNC4zOTk5IDIuMjQxNTYgMTQuMzk5OUg0Ljk2MTU2QzUuMzE1MDIgMTQuMzk5OSA1LjYwMTU2IDE0LjExMzQgNS42MDE1NiAxMy43NTk5VjExLjAzOTlDNS42MDE1NiAxMC42ODY0IDUuMzE1MDIgMTAuMzk5OSA0Ljk2MTU2IDEwLjM5OTlaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik0xMy43NTg0IDEuNjAwMUgxMS4wMzg0QzEwLjY4NSAxLjYwMDEgMTAuMzk4NCAxLjg4NjY0IDEwLjM5ODQgMi4yNDAxVjQuOTYwMUMxMC4zOTg0IDUuMzEzNTYgMTAuNjg1IDUuNjAwMSAxMS4wMzg0IDUuNjAwMUgxMy43NTg0QzE0LjExMTkgNS42MDAxIDE0LjM5ODQgNS4zMTM1NiAxNC4zOTg0IDQuOTYwMVYyLjI0MDFDMTQuMzk4NCAxLjg4NjY0IDE0LjExMTkgMS42MDAxIDEzLjc1ODQgMS42MDAxWiIgZmlsbD0iI2ZmZiIvPgo8cGF0aCBkPSJNNCAxMkwxMiA0TDQgMTJaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00IDEyTDEyIDQiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K&logoColor=ffffff
[zread-link]: https://zread.ai/Hiram-Wong/zyfun

<!-- Links & Images -->

[rank-hellogithub-shield]: https://api.hellogithub.com/v1/widgets/recommend.svg?rid=c54bf4d457b64ee7a84fd1ea0b36419a
[rank-hellogithub-link]: https://hellogithub.com/repository/Hunlongyu/ZY-Player
[rank-trendshift-shield]: https://trendshift.io/api/badge/repositories/20293
[rank-trendshift-link]: https://trendshift.io/repositories/20293
[rank-producthunt-shield]: https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1019733&theme=light
[rank-producthunt-link]: https://www.producthunt.com/products/zyfun?embed=true&utm_source=badge-featured&utm_medium=badge&utm_source=badge-zyfun


================================================
FILE: SECURITY.md
================================================
## Security

We takes the security of our software products and services seriously, which
includes all source code repositories in our GitHub organizations.

**Please do not report security vulnerabilities through public GitHub issues.**

For security reporting information, locations, contact information, and policies,
please link to our team.


================================================
FILE: ThirdPartyNotices.txt
================================================
NOTICES

This repository incorporates material as listed below or described in the code.


---------------------------------------------------------

7zip-bin-full
https://github.com/ollm/7zip-bin-full

The MIT License (MIT)

Copyright (c) 2016 Vladimir Krivosheev

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

adm-zip
https://github.com/cthackers/adm-zip

MIT License

Copyright (c) 2012 Another-D-Mention Software and other contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

artplayer-plugin-danmuku
https://github.com/zhw2590582/ArtPlayer

NO LICENSE CONTENT, USE MIT GENERIC RULES
---------------------------------------------------------

---------------------------------------------------------

artplayer
https://github.com/zhw2590582/ArtPlayer

NO LICENSE CONTENT, USE MIT GENERIC RULES
---------------------------------------------------------

---------------------------------------------------------

axios
https://github.com/axios/axios

# Copyright (c) 2014-present Matt Zabriskie & Collaborators

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

builder-util-runtime
https://github.com/electron-userland/electron-builder

The MIT License (MIT)

Copyright (c) 2015 Loopline Systems

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

cheerio
https://github.com/cheeriojs/cheerio

MIT License

Copyright (c) 2022 The Cheerio contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

chokidar
https://github.com/paulmillr/chokidar

The MIT License (MIT)

Copyright (c) 2012 Paul Miller (https://paulmillr.com), Elan Shanker

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

commitizen
https://github.com/commitizen/cz-cli

The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

crypto-js
https://github.com/brix/crypto-js

# License

[The MIT License (MIT)](http://opensource.org/licenses/MIT)

Copyright (c) 2009-2013 Jeff Mott  
Copyright (c) 2013-2016 Evan Vosberg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

cz-conventional-changelog
https://github.com/commitizen/cz-conventional-changelog

MIT License

Copyright (c) 2015-2018 Commitizen Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

dashjs
https://github.com/Dash-Industry-Forum/dash.js

# dash.js BSD License Agreement

The copyright in this software is being made available under the BSD License, included below. This software may be subject to other third party and contributor rights, including patent rights, and no such rights are granted under this license.

**Copyright (c) 2015, Dash Industry Forum.
**All rights reserved.**
 
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the  documentation and/or other materials provided with the distribution.
* Neither the name of the Dash Industry Forum nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

**THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.**
---------------------------------------------------------

---------------------------------------------------------

dayjs
https://github.com/iamkun/dayjs

MIT License

Copyright (c) 2018-present, iamkun

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

dotenv-cli
https://github.com/entropitor/dotenv-cli

Copyright (c) 2025 Jens Claes

The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

dplayer
https://github.com/tsukumijima/DPlayer

The MIT License (MIT)

Copyright (c) DIYgod <diy.d.god@gmail.com> (https://www.anotherhome.net/)
Copyright (c) 2019-2024 tsukumi

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

drizzle-orm
https://github.com/drizzle-team/drizzle-orm

NO LICENSE CONTENT, USE Apache-2.0 GENERIC RULES
---------------------------------------------------------

---------------------------------------------------------

electron-localshortcut
https://github.com/parro-it/electron-localshortcut

The MIT License (MIT)
Copyright (c) 2017 Andrea Parodi


Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

electron-store
https://github.com/sindresorhus/electron-store

MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

electron-updater
https://github.com/electron-userland/electron-builder

The MIT License (MIT)

Copyright (c) 2015 Loopline Systems

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

electron-window-state
https://github.com/mawie81/electron-window-state

The MIT License (MIT)

Copyright (c) 2015 Jakub Szwacz
Copyright (c) Marcel Wiehle <marcel@wiehle.me> (http://marcel.wiehle.me)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

emittery
https://github.com/sindresorhus/emittery

MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

es-toolkit
https://github.com/toss/es-toolkit

MIT License

Copyright (c) 2024 Viva Republica, Inc

Copyright OpenJS Foundation and other contributors

Parts of the test suite and compatibility layer in `es-toolkit/compat` are derived from Lodash (https://github.com/lodash/lodash) by the OpenJS Foundation (https://openjsf.org/) and Underscore.js by Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors (http://underscorejs.org/)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

fast-xml-parser
https://github.com/NaturalIntelligence/fast-xml-parser

MIT License

Copyright (c) 2017 Amit Kumar Gupta

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

fastify
https://github.com/fastify/fastify

MIT License

Copyright (c) 2016-present The Fastify team <https://github.com/fastify/fastify#team>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

fdir
https://github.com/thecodrr/fdir

Copyright 2023 Abdullah Atta

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

fetch-socks
https://github.com/Kaciras/fetch-socks

Copyright (c) 2022-2024 Kaciras

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

fluent-ffmpeg
https://github.com/fluent-ffmpeg/node-fluent-ffmpeg

(The MIT License)

Copyright (c) 2011-2015 The fluent-ffmpeg contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

flv.js
https://github.com/Bilibili/flv.js

Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
---------------------------------------------------------

---------------------------------------------------------

form-data
https://github.com/form-data/form-data

Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

 The above copyright notice and this permission notice shall be included in
 all copies or substantial portions of the Software.

 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

fs-extra
https://github.com/jprichardson/node-fs-extra

(The MIT License)

Copyright (c) 2011-2024 JP Richardson

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
 merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
 furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

fuse.js
https://github.com/krisk/Fuse

Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright 2017 Kirollos Risk

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
---------------------------------------------------------

---------------------------------------------------------

globals
https://github.com/sindresorhus/globals

MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

he
https://github.com/mathiasbynens/he

Copyright Mathias Bynens <https://mathiasbynens.be/>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

hls.js
https://github.com/video-dev/hls.js

Copyright (c) 2017 Dailymotion (http://www.dailymotion.com)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

src/remux/mp4-generator.js and src/demux/exp-golomb.ts implementation in this project
are derived from the HLS library for video.js (https://github.com/videojs/videojs-contrib-hls)

That work is also covered by the Apache 2 License, following copyright:
Copyright (c) 2013-2015 Brightcove


THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

http-status-codes
https://github.com/prettymuchbryce/http-status-codes

The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

husky
https://github.com/typicode/husky

MIT License

Copyright (c) 2021 typicode

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

i18next
https://github.com/i18next/i18next

The MIT License (MIT)

Copyright (c) 2025 i18next

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

iconv-lite
https://github.com/pillarjs/iconv-lite

Copyright (c) 2011 Alexander Shtuchkin

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

ipaddr.js
https://github.com/whitequark/ipaddr.js

Copyright (C) 2011-2017 whitequark <whitequark@whitequark.org>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

isomorphic-ws
https://github.com/heineiuo/isomorphic-ws

The MIT License (MIT)

Copyright (c) 2018 Zejin Zhuang <heineiuo@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

js-yaml
https://github.com/nodeca/js-yaml

(The MIT License)

Copyright (C) 2011-2015 by Vitaly Puzrin

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

json5
https://github.com/json5/json5

MIT License

Copyright (c) 2012-2018 Aseem Kishore, and [others].

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

[others]: https://github.com/json5/json5/contributors
---------------------------------------------------------

---------------------------------------------------------

jsonpath-plus
https://github.com/s3u/JSONPath

MIT License

Copyright (c) 2011-2019 Stefan Goessner, Subbu Allamaraju, Mike Brevoort,
Robert Krahn, Brett Zamir, Richard Schneider

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

less
https://github.com/less/less.js

NO LICENSE CONTENT, USE Apache-2.0 GENERIC RULES
---------------------------------------------------------

---------------------------------------------------------

macos-release
https://github.com/sindresorhus/macos-release

MIT License

Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

magnet-uri
https://github.com/webtorrent/magnet-uri

The MIT License (MIT)

Copyright (c) Feross Aboukhadijeh and WebTorrent, LLC

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

mime-types
https://github.com/jshttp/mime-types

(The MIT License)

Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

minimist
https://github.com/minimistjs/minimist

This software is released under the MIT license:

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

monaco-editor
https://github.com/microsoft/monaco-editor

The MIT License (MIT)

Copyright (c) 2016 - present Microsoft Corporation

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

monaco-yaml
https://github.com/remcohaszing/monaco-yaml

The MIT License (MIT)

Copyright (c) Microsoft Corporation

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the “Software”), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------

---------------------------------------------------------

mpegts.js
https://github.com/xqq/mpegts.js

Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that Yo
Download .txt
gitextract_76v9j0zk/

├── .editorconfig
├── .env.example
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.zh-CN.yml
│   │   └── feature-report.zh-CN.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── nightly-build.yml
│       └── release.yml
├── .gitignore
├── .ncurc.yaml
├── .node-version
├── .npmrc
├── .nvmrc
├── .prettierignore
├── .prettierrc.yaml
├── .stylelintignore
├── .stylelintrc.yml
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   ├── mcp.json
│   └── settings.json
├── CHANGELOG.md
├── LICENSE.txt
├── README.md
├── SECURITY.md
├── ThirdPartyNotices.txt
├── build/
│   ├── entitlements.mac.inherit.plist
│   ├── entitlements.mac.plist
│   ├── icon.icns
│   └── nsis-installer.nsh
├── commitlint.config.js
├── design/
│   ├── player.sketch
│   └── video_platform.sketch
├── dev-app-update.yml
├── docs/
│   ├── Conventional_Commits.md
│   ├── Develop.md
│   ├── HarmonyOS_Electron.md
│   ├── Loong_Electron.md
│   └── Mcp.md
├── electron-builder.yml
├── electron.vite.config.ts
├── eslint.config.js
├── package.json
├── packages/
│   └── shared/
│       ├── config/
│       │   ├── appinfo.ts
│       │   ├── cmsAction.ts
│       │   ├── constant.ts
│       │   ├── data.ts
│       │   ├── dns.ts
│       │   ├── env.ts
│       │   ├── film.ts
│       │   ├── ipcChannel.ts
│       │   ├── live.ts
│       │   ├── logger.ts
│       │   ├── notification.ts
│       │   ├── parse.ts
│       │   ├── req.ts
│       │   ├── setting.ts
│       │   ├── shortcut.ts
│       │   ├── tblSetting.ts
│       │   ├── theme.ts
│       │   ├── userAgent.ts
│       │   ├── window.ts
│       │   └── xmlOptions.ts
│       ├── locales/
│       │   ├── index.ts
│       │   └── lang/
│       │       ├── en-US/
│       │       │   ├── aigc.ts
│       │       │   ├── common.ts
│       │       │   ├── component.ts
│       │       │   ├── index.ts
│       │       │   ├── media.ts
│       │       │   ├── pages/
│       │       │   │   ├── assets/
│       │       │   │   │   ├── binary-help.md
│       │       │   │   │   ├── custom-player.md
│       │       │   │   │   ├── disclaimer.md
│       │       │   │   │   ├── lab-edit-help.md
│       │       │   │   │   ├── live-epg.md
│       │       │   │   │   └── live-logo.md
│       │       │   │   ├── browser.ts
│       │       │   │   ├── film.ts
│       │       │   │   ├── index.ts
│       │       │   │   ├── lab.ts
│       │       │   │   ├── live.ts
│       │       │   │   ├── md.ts
│       │       │   │   ├── moment.ts
│       │       │   │   ├── parse.ts
│       │       │   │   ├── player.ts
│       │       │   │   ├── plugin.ts
│       │       │   │   └── setting.ts
│       │       │   └── system.ts
│       │       ├── zh-CN/
│       │       │   ├── aigc.ts
│       │       │   ├── common.ts
│       │       │   ├── component.ts
│       │       │   ├── index.ts
│       │       │   ├── media.ts
│       │       │   ├── pages/
│       │       │   │   ├── assets/
│       │       │   │   │   ├── binary-help.md
│       │       │   │   │   ├── custom-player.md
│       │       │   │   │   ├── disclaimer.md
│       │       │   │   │   ├── lab-edit-help.md
│       │       │   │   │   ├── live-epg.md
│       │       │   │   │   └── live-logo.md
│       │       │   │   ├── browser.ts
│       │       │   │   ├── film.ts
│       │       │   │   ├── index.ts
│       │       │   │   ├── lab.ts
│       │       │   │   ├── live.ts
│       │       │   │   ├── md.ts
│       │       │   │   ├── moment.ts
│       │       │   │   ├── parse.ts
│       │       │   │   ├── player.ts
│       │       │   │   ├── plugin.ts
│       │       │   │   └── setting.ts
│       │       │   └── system.ts
│       │       └── zh-TW/
│       │           ├── aigc.ts
│       │           ├── common.ts
│       │           ├── component.ts
│       │           ├── index.ts
│       │           ├── media.ts
│       │           ├── pages/
│       │           │   ├── assets/
│       │           │   │   ├── binary-help.md
│       │           │   │   ├── custom-player.md
│       │           │   │   ├── disclaimer.md
│       │           │   │   ├── lab-edit-help.md
│       │           │   │   ├── live-epg.md
│       │           │   │   └── live-logo.md
│       │           │   ├── browser.ts
│       │           │   ├── film.ts
│       │           │   ├── index.ts
│       │           │   ├── lab.ts
│       │           │   ├── live.ts
│       │           │   ├── md.ts
│       │           │   ├── moment.ts
│       │           │   ├── parse.ts
│       │           │   ├── player.ts
│       │           │   ├── plugin.ts
│       │           │   └── setting.ts
│       │           └── system.ts
│       ├── modules/
│       │   ├── __tests__/
│       │   │   ├── camelcase.test.ts
│       │   │   ├── headers.test.ts
│       │   │   ├── obj.test.ts
│       │   │   └── validate.test.ts
│       │   ├── cache.ts
│       │   ├── camelcase.ts
│       │   ├── crypto/
│       │   │   ├── core/
│       │   │   │   ├── base.ts
│       │   │   │   ├── encode.ts
│       │   │   │   ├── encrypt/
│       │   │   │   │   ├── aes.ts
│       │   │   │   │   ├── crypto.ts
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── rsa.ts
│       │   │   │   │   └── sm.ts
│       │   │   │   └── mac.ts
│       │   │   ├── index.ts
│       │   │   ├── modules/
│       │   │   │   └── atob-btoa.ts
│       │   │   ├── type.ts
│       │   │   └── utils/
│       │   │       ├── base.ts
│       │   │       ├── forge.ts
│       │   │       └── wordArray.ts
│       │   ├── date.ts
│       │   ├── function.ts
│       │   ├── headers.ts
│       │   ├── ip.ts
│       │   ├── lrucache.ts
│       │   ├── obj.ts
│       │   ├── request/
│       │   │   ├── axios/
│       │   │   │   ├── Axios.ts
│       │   │   │   ├── AxiosCancel.ts
│       │   │   │   └── AxiosTransform.ts
│       │   │   ├── constants.ts
│       │   │   ├── index.ts
│       │   │   ├── sse/
│       │   │   │   ├── Sse.ts
│       │   │   │   ├── SseCancel.ts
│       │   │   │   └── SseTransform.ts
│       │   │   ├── type.ts
│       │   │   ├── utils.ts
│       │   │   └── ws/
│       │   │       ├── Ws.ts
│       │   │       ├── WsCancel.ts
│       │   │       └── WsTransform.ts
│       │   ├── schedule.ts
│       │   ├── singleton.ts
│       │   ├── size.ts
│       │   ├── toString.ts
│       │   ├── validate.ts
│       │   └── zip/
│       │       ├── 7z.ts
│       │       ├── gz.ts
│       │       ├── index.ts
│       │       ├── tgz.ts
│       │       └── zip.ts
│       └── types/
│           ├── barrage.ts
│           ├── cms.ts
│           ├── common.ts
│           ├── db.ts
│           ├── sift.ts
│           └── systeminfo.ts
├── patches/
│   ├── @oplayer-core-npm-1.2.38-beta.2-66bf7d6252.patch
│   ├── @oplayer-torrent-npm-1.2.25-beta.2-6efddccea2.patch
│   ├── artplayer@5.4.0.patch
│   ├── atomically-npm-1.7.0-e742e5293b.patch
│   ├── dplayer@1.32.7.patch
│   ├── electron-devtools-installer-npm-4.0.0-ea55a28d94.patch
│   ├── electron-updater-npm-6.7.0-47b11bb0d4.patch
│   ├── file-stream-rotator-npm-0.6.1-eab45fb13d.patch
│   ├── libsql-npm-0.4.7-444e260fb1.patch
│   └── shaka-player-npm-4.13.0-5e61f852f3.patch
├── pnpm-workspace.yaml
├── resources/
│   ├── scripts/
│   │   ├── download.js
│   │   ├── install-bun.js
│   │   ├── install-ffmpeg.js
│   │   ├── install-ffprobe.js
│   │   └── install-uv.js
│   ├── t3Catopen/
│   │   ├── cat.js
│   │   ├── crypto-js.js
│   │   ├── http.js
│   │   ├── mod.js
│   │   ├── similarity.js
│   │   ├── sortName.js
│   │   └── spider.js
│   └── t3PyBase/
│       ├── __tests__/
│       │   ├── demo.py
│       │   ├── logger.py
│       │   └── test.py
│       ├── base/
│       │   ├── htmlParser.py
│       │   └── spider.py
│       ├── main.py
│       ├── pyproject.toml
│       └── requirements.txt
├── scripts/
│   ├── after-pack.js
│   ├── artifact-build-completed.js
│   ├── before-pack.js
│   ├── generate-changelog.js
│   ├── generate-license.js
│   ├── minidump.js
│   ├── notarize.js
│   ├── version.js
│   └── win-sign.js
├── src/
│   ├── main/
│   │   ├── electron.d.ts
│   │   ├── env.d.ts
│   │   ├── index.ts
│   │   ├── ipc.ts
│   │   ├── services/
│   │   │   ├── AppLocale.ts
│   │   │   ├── AppService.ts
│   │   │   ├── AppUpdater.ts
│   │   │   ├── BinaryService.ts
│   │   │   ├── CdpElectron.ts
│   │   │   ├── ConfigManager.ts
│   │   │   ├── ContextMenu.ts
│   │   │   ├── DbService/
│   │   │   │   ├── crud/
│   │   │   │   │   ├── analyze.ts
│   │   │   │   │   ├── channel.ts
│   │   │   │   │   ├── history.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── iptv.ts
│   │   │   │   │   ├── plugin.ts
│   │   │   │   │   ├── setting.ts
│   │   │   │   │   ├── site.ts
│   │   │   │   │   └── star.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── migrations/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── migrate-3_3_1.ts
│   │   │   │   │   ├── migrate-3_3_10.ts
│   │   │   │   │   ├── migrate-3_3_2.ts
│   │   │   │   │   ├── migrate-3_3_4.ts
│   │   │   │   │   ├── migrate-3_3_5.ts
│   │   │   │   │   ├── migrate-3_3_7.ts
│   │   │   │   │   ├── migrate-3_3_8.ts
│   │   │   │   │   ├── migrate-3_3_9.ts
│   │   │   │   │   ├── migrate-3_4_0.ts
│   │   │   │   │   └── migrate-3_4_1.ts
│   │   │   │   └── schemas/
│   │   │   │       ├── analyze.ts
│   │   │   │       ├── channel.ts
│   │   │   │       ├── history.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── iptv.ts
│   │   │   │       ├── plugin.ts
│   │   │   │       ├── setting.ts
│   │   │   │       ├── site.ts
│   │   │   │       └── star.ts
│   │   │   ├── FFmpegService.ts
│   │   │   ├── FastifyService/
│   │   │   │   ├── fastify.d.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── routes/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── v0/
│   │   │   │   │   │   └── proxy/
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   └── v1/
│   │   │   │   │       ├── aigc/
│   │   │   │   │       │   ├── chat.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── memory.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       ├── chat.ts
│   │   │   │   │       │       └── memory.ts
│   │   │   │   │       ├── data/
│   │   │   │   │       │   ├── cloud.ts
│   │   │   │   │       │   ├── db.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       └── data.ts
│   │   │   │   │       ├── file/
│   │   │   │   │       │   ├── film.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   └── manage.ts
│   │   │   │   │       ├── film/
│   │   │   │   │       │   ├── cms/
│   │   │   │   │       │   │   ├── adapter/
│   │   │   │   │       │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   ├── t0Xml.ts
│   │   │   │   │       │   │   │   ├── t1Json.ts
│   │   │   │   │       │   │   │   ├── t3Alist.ts
│   │   │   │   │       │   │   │   ├── t3AppGet.ts
│   │   │   │   │       │   │   │   ├── t3AppYsV2.ts
│   │   │   │   │       │   │   │   ├── t3Catopen/
│   │   │   │   │       │   │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   │   ├── inject.ts
│   │   │   │   │       │   │   │   │   └── worker.ts
│   │   │   │   │       │   │   │   ├── t3Drpy/
│   │   │   │   │       │   │   │   │   ├── decrypt.ts
│   │   │   │   │       │   │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   │   ├── inject.ts
│   │   │   │   │       │   │   │   │   ├── templates.ts
│   │   │   │   │       │   │   │   │   └── worker.ts
│   │   │   │   │       │   │   │   ├── t3Py.ts
│   │   │   │   │       │   │   │   ├── t3Xbpq/
│   │   │   │   │       │   │   │   │   ├── index.ts
│   │   │   │   │       │   │   │   │   ├── methods.ts
│   │   │   │   │       │   │   │   │   └── rule.ts
│   │   │   │   │       │   │   │   ├── t3Xyq.ts
│   │   │   │   │       │   │   │   ├── t4Catvod.ts
│   │   │   │   │       │   │   │   ├── t4DrpyJs0.ts
│   │   │   │   │       │   │   │   └── t4Drpys.ts
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── utils/
│   │   │   │   │       │   │       ├── cache.ts
│   │   │   │   │       │   │       └── cms.ts
│   │   │   │   │       │   ├── edit/
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── utils/
│   │   │   │   │       │   │       └── sift.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── rec/
│   │   │   │   │       │   │   ├── index.ts
│   │   │   │   │       │   │   └── utils/
│   │   │   │   │       │   │       ├── barrage.ts
│   │   │   │   │       │   │       ├── douban.ts
│   │   │   │   │       │   │       └── hot.ts
│   │   │   │   │       │   └── site.ts
│   │   │   │   │       ├── live/
│   │   │   │   │       │   ├── channel.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── iptv.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       ├── channel.ts
│   │   │   │   │       │       └── epg.ts
│   │   │   │   │       ├── moment/
│   │   │   │   │       │   ├── history.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── moment.ts
│   │   │   │   │       │   └── star.ts
│   │   │   │   │       ├── parse/
│   │   │   │   │       │   ├── analyze.ts
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── parse.ts
│   │   │   │   │       │   └── utils/
│   │   │   │   │       │       └── mediaDirect.ts
│   │   │   │   │       ├── plugin/
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       ├── setting/
│   │   │   │   │       │   └── index.ts
│   │   │   │   │       └── system/
│   │   │   │   │           ├── binary.ts
│   │   │   │   │           ├── cdp.ts
│   │   │   │   │           ├── ffmpeg.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── other.ts
│   │   │   │   │           ├── process.ts
│   │   │   │   │           └── utils/
│   │   │   │   │               ├── m3u8.ts
│   │   │   │   │               └── sniffer.ts
│   │   │   │   └── schemas/
│   │   │   │       ├── base.ts
│   │   │   │       ├── v0/
│   │   │   │       │   └── proxy.ts
│   │   │   │       └── v1/
│   │   │   │           ├── aigc/
│   │   │   │           │   ├── chat.ts
│   │   │   │           │   └── memory.ts
│   │   │   │           ├── data/
│   │   │   │           │   ├── cloud.ts
│   │   │   │           │   └── db.ts
│   │   │   │           ├── file/
│   │   │   │           │   ├── film.ts
│   │   │   │           │   └── manage.ts
│   │   │   │           ├── flim/
│   │   │   │           │   ├── cms.ts
│   │   │   │           │   ├── edit.ts
│   │   │   │           │   ├── rec.ts
│   │   │   │           │   └── site.ts
│   │   │   │           ├── live/
│   │   │   │           │   ├── channel.ts
│   │   │   │           │   └── iptv.ts
│   │   │   │           ├── moment/
│   │   │   │           │   ├── history.ts
│   │   │   │           │   ├── moment.ts
│   │   │   │           │   └── star.ts
│   │   │   │           ├── parse/
│   │   │   │           │   ├── analyze.ts
│   │   │   │           │   └── parse.ts
│   │   │   │           ├── plugin.ts
│   │   │   │           ├── setting.ts
│   │   │   │           └── system/
│   │   │   │               ├── binary.ts
│   │   │   │               ├── cdp.ts
│   │   │   │               ├── ffmpeg.ts
│   │   │   │               ├── other.ts
│   │   │   │               └── process.ts
│   │   │   ├── FileStorage.ts
│   │   │   ├── LoggerService.ts
│   │   │   ├── MenuService.ts
│   │   │   ├── NotificationService.ts
│   │   │   ├── PluginService.ts
│   │   │   ├── ProtocolClient.ts
│   │   │   ├── ProxyManager.ts
│   │   │   ├── PythonService.ts
│   │   │   ├── ShortcutService.ts
│   │   │   ├── StorageService/
│   │   │   │   ├── ICloudStorage.ts
│   │   │   │   ├── WebdavStorage.ts
│   │   │   │   └── index.ts
│   │   │   ├── ThemeService.ts
│   │   │   ├── TrayService.ts
│   │   │   ├── WebviewService.ts
│   │   │   ├── WindowService.ts
│   │   │   └── __tests__/
│   │   │       └── ProxyManager.test.ts
│   │   ├── types/
│   │   │   ├── argv.ts
│   │   │   ├── server.ts
│   │   │   └── tvbox.ts
│   │   └── utils/
│   │       ├── argv.ts
│   │       ├── file.ts
│   │       ├── hiker/
│   │       │   ├── baseSpider.ts
│   │       │   ├── crypto.ts
│   │       │   ├── htmlParser.ts
│   │       │   ├── index.ts
│   │       │   ├── inject.ts
│   │       │   ├── jinja.ts
│   │       │   ├── local.ts
│   │       │   ├── proxy.ts
│   │       │   ├── request/
│   │       │   │   ├── asyncAxios.ts
│   │       │   │   ├── syncFetch.ts
│   │       │   │   └── syncRequest.ts
│   │       │   ├── ruleParse.ts
│   │       │   ├── similarity.ts
│   │       │   └── ua.ts
│   │       ├── ip.ts
│   │       ├── path.ts
│   │       ├── process.ts
│   │       ├── request/
│   │       │   └── index.ts
│   │       ├── shell.ts
│   │       ├── systeminfo.ts
│   │       └── tool.ts
│   ├── preload/
│   │   ├── index.ts
│   │   ├── preload.d.ts
│   │   └── utils/
│   │       ├── dom.ts
│   │       └── loading.ts
│   └── renderer/
│       ├── index.html
│       └── src/
│           ├── App.vue
│           ├── api/
│           │   ├── aigc.ts
│           │   ├── data.ts
│           │   ├── film.ts
│           │   ├── live.ts
│           │   ├── moment.ts
│           │   ├── parse.ts
│           │   ├── plugin.ts
│           │   ├── proxy.ts
│           │   ├── setting.ts
│           │   └── system.ts
│           ├── components/
│           │   ├── action/
│           │   │   ├── components/
│           │   │   │   ├── ActionSection.vue
│           │   │   │   ├── BrowserActionSection.vue
│           │   │   │   ├── FormActionSection.vue
│           │   │   │   ├── HelpActionSection.vue
│           │   │   │   └── MsgBoxActionSection.vue
│           │   │   ├── index.vue
│           │   │   └── utils.ts
│           │   ├── aigc/
│           │   │   └── index.vue
│           │   ├── code-editor/
│           │   │   ├── index.ts
│           │   │   └── src/
│           │   │       ├── code-editor-types.ts
│           │   │       ├── code-editor.less
│           │   │       ├── code-editor.tsx
│           │   │       ├── composables/
│           │   │       │   ├── use-code-editor-hooks.ts
│           │   │       │   └── use-code-editor.ts
│           │   │       └── themes/
│           │   │           ├── code-dark.ts
│           │   │           ├── code-light.ts
│           │   │           └── index.ts
│           │   ├── common-nav/
│           │   │   └── index.vue
│           │   ├── dialog-document/
│           │   │   └── index.vue
│           │   ├── group-btn/
│           │   │   └── index.vue
│           │   ├── input-req/
│           │   │   ├── index.vue
│           │   │   └── utils.ts
│           │   ├── input-shortcut/
│           │   │   └── index.vue
│           │   ├── lazy-bg/
│           │   │   └── index.vue
│           │   ├── multi-player/
│           │   │   ├── CHANGELOG.md
│           │   │   ├── README.md
│           │   │   ├── global.d.ts
│           │   │   ├── index.ts
│           │   │   └── src/
│           │   │       ├── assets/
│           │   │       │   └── css/
│           │   │       │       └── index.less
│           │   │       ├── core/
│           │   │       │   ├── artplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── plugins/
│           │   │       │   │   │   ├── index.ts
│           │   │       │   │   │   └── playNext.ts
│           │   │       │   │   ├── types.ts
│           │   │       │   │   └── utils/
│           │   │       │   │       └── index.ts
│           │   │       │   ├── dplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── types.ts
│           │   │       │   │   └── utils/
│           │   │       │   │       └── index.ts
│           │   │       │   ├── index.ts
│           │   │       │   ├── nplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── locales/
│           │   │       │   │   │   └── zh-tw.ts
│           │   │       │   │   ├── plugins/
│           │   │       │   │   │   ├── index.ts
│           │   │       │   │   │   ├── pip.ts
│           │   │       │   │   │   └── playNext.ts
│           │   │       │   │   ├── types.ts
│           │   │       │   │   └── utils/
│           │   │       │   │       └── index.ts
│           │   │       │   ├── oplayer/
│           │   │       │   │   ├── css/
│           │   │       │   │   │   └── index.css
│           │   │       │   │   ├── index.ts
│           │   │       │   │   ├── locales/
│           │   │       │   │   │   └── zh-tw.ts
│           │   │       │   │   └── types.ts
│           │   │       │   └── xgplayer/
│           │   │       │       ├── css/
│           │   │       │       │   └── index.css
│           │   │       │       ├── index.ts
│           │   │       │       ├── plugins/
│           │   │       │       │   ├── danmuSend.ts
│           │   │       │       │   ├── index.ts
│           │   │       │       │   └── playNext.ts
│           │   │       │       ├── types.ts
│           │   │       │       └── utils/
│           │   │       │           └── index.ts
│           │   │       ├── multi-player.tsx
│           │   │       ├── types.ts
│           │   │       └── utils/
│           │   │           ├── static.ts
│           │   │           ├── storage.ts
│           │   │           ├── stream-decoder.ts
│           │   │           └── tool.ts
│           │   ├── play-show/
│           │   │   └── index.vue
│           │   ├── quick-menu/
│           │   │   ├── components/
│           │   │   │   ├── Ai.vue
│           │   │   │   ├── Lab.vue
│           │   │   │   ├── Language.vue
│           │   │   │   ├── Setting.vue
│           │   │   │   ├── Sponsor.vue
│           │   │   │   └── Theme.vue
│           │   │   └── index.vue
│           │   ├── render-icon/
│           │   │   └── index.vue
│           │   ├── render-markdown/
│           │   │   └── index.vue
│           │   ├── router-control/
│           │   │   └── index.vue
│           │   ├── search-panel/
│           │   │   └── index.vue
│           │   ├── setting-table/
│           │   │   ├── index.vue
│           │   │   └── types.ts
│           │   ├── share/
│           │   │   ├── index.vue
│           │   │   └── types.ts
│           │   ├── system-control/
│           │   │   └── index.vue
│           │   ├── tag-nav/
│           │   │   └── index.vue
│           │   ├── terminal/
│           │   │   └── index.vue
│           │   ├── title-menu/
│           │   │   ├── index.less
│           │   │   └── index.vue
│           │   └── webview/
│           │       └── index.vue
│           ├── config/
│           │   ├── aigc.ts
│           │   ├── browser.ts
│           │   ├── emitterChannel.ts
│           │   ├── global.ts
│           │   ├── hot.ts
│           │   ├── parse.ts
│           │   ├── player.ts
│           │   └── setting.ts
│           ├── layouts/
│           │   ├── components/
│           │   │   ├── Content.vue
│           │   │   ├── Header.vue
│           │   │   ├── LayoutContent.vue
│           │   │   ├── LayoutHeader.vue
│           │   │   ├── LayoutSideNav.vue
│           │   │   └── SideNav.vue
│           │   └── index.vue
│           ├── locales/
│           │   ├── index.ts
│           │   └── useLocale.ts
│           ├── main.ts
│           ├── pages/
│           │   ├── Disclaimer.vue
│           │   ├── browser/
│           │   │   └── index.vue
│           │   ├── film/
│           │   │   ├── components/
│           │   │   │   └── DialogDetail.vue
│           │   │   └── index.vue
│           │   ├── lab/
│           │   │   ├── components/
│           │   │   │   ├── crypto/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   ├── encode.vue
│           │   │   │   │   │   ├── encrypt.vue
│           │   │   │   │   │   └── hash.vue
│           │   │   │   │   └── index.vue
│           │   │   │   ├── diff/
│           │   │   │   │   └── index.vue
│           │   │   │   ├── edit/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   └── DialogTemplate.vue
│           │   │   │   │   ├── index.vue
│           │   │   │   │   └── utils/
│           │   │   │   │       ├── comm.ts
│           │   │   │   │       ├── config.ts
│           │   │   │   │       ├── inject/
│           │   │   │   │       │   └── 7/
│           │   │   │   │       │       ├── extraLib.d.ts
│           │   │   │   │       │       └── suggestions.ts
│           │   │   │   │       └── log.ts
│           │   │   │   ├── extension/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   ├── env/
│           │   │   │   │   │   │   └── index.vue
│           │   │   │   │   │   └── plugin/
│           │   │   │   │   │       ├── components/
│           │   │   │   │   │       │   ├── DialogDetail.vue
│           │   │   │   │   │       │   └── DialogInstall.vue
│           │   │   │   │   │       ├── constants.ts
│           │   │   │   │   │       └── index.vue
│           │   │   │   │   └── index.vue
│           │   │   │   ├── player/
│           │   │   │   │   └── index.vue
│           │   │   │   ├── sift/
│           │   │   │   │   └── index.vue
│           │   │   │   └── sniffer/
│           │   │   │       └── index.vue
│           │   │   └── index.vue
│           │   ├── live/
│           │   │   └── index.vue
│           │   ├── moment/
│           │   │   ├── components/
│           │   │   │   ├── history/
│           │   │   │   │   └── index.vue
│           │   │   │   └── star/
│           │   │   │       └── index.vue
│           │   │   └── index.vue
│           │   ├── parse/
│           │   │   └── index.vue
│           │   ├── player/
│           │   │   ├── components/
│           │   │   │   ├── AsideFilm.vue
│           │   │   │   ├── AsideLive.vue
│           │   │   │   ├── AsideParse.vue
│           │   │   │   ├── DialogDownload.vue
│           │   │   │   ├── DialogSetting.vue
│           │   │   │   └── Header.vue
│           │   │   └── index.vue
│           │   ├── setting/
│           │   │   ├── components/
│           │   │   │   ├── base/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   ├── DialogBarrage.vue
│           │   │   │   │   │   ├── DialogDns.vue
│           │   │   │   │   │   ├── DialogProxy.vue
│           │   │   │   │   │   ├── DialogSniffer.vue
│           │   │   │   │   │   ├── DialogUa.vue
│           │   │   │   │   │   └── DialogUpdate.vue
│           │   │   │   │   └── index.vue
│           │   │   │   ├── data/
│           │   │   │   │   └── index.vue
│           │   │   │   ├── film/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   └── DialogForm.vue
│           │   │   │   │   ├── constants.ts
│           │   │   │   │   └── index.vue
│           │   │   │   ├── live/
│           │   │   │   │   ├── components/
│           │   │   │   │   │   └── DialogForm.vue
│           │   │   │   │   ├── constants.ts
│           │   │   │   │   └── index.vue
│           │   │   │   └── parse/
│           │   │   │       ├── components/
│           │   │   │       │   └── DialogForm.vue
│           │   │   │       ├── constants.ts
│           │   │   │       └── index.vue
│           │   │   └── index.vue
│           │   └── test/
│           │       ├── components/
│           │       │   ├── action/
│           │       │   │   └── index.vue
│           │       │   ├── demo/
│           │       │   │   └── index.vue
│           │       │   ├── editor/
│           │       │   │   └── index.vue
│           │       │   ├── player/
│           │       │   │   └── index.vue
│           │       │   └── webview/
│           │       │       └── index.vue
│           │       └── index.vue
│           ├── router/
│           │   ├── index.ts
│           │   └── modules/
│           │       └── homepage.ts
│           ├── store/
│           │   ├── index.ts
│           │   └── modules/
│           │       ├── browser.ts
│           │       ├── player.ts
│           │       └── setting.ts
│           ├── style/
│           │   ├── base.less
│           │   ├── browser.less
│           │   ├── font-family.less
│           │   ├── index.less
│           │   ├── layout.less
│           │   ├── normalize.less
│           │   ├── player.less
│           │   ├── theme.less
│           │   └── variables.less
│           ├── types/
│           │   ├── globals.d.ts
│           │   ├── interface.d.ts
│           │   ├── player.ts
│           │   └── vue-virtual-scroller.d.ts
│           └── utils/
│               ├── console.ts
│               ├── emitter.ts
│               ├── logger.ts
│               ├── ospy.ts
│               ├── request/
│               │   ├── api.ts
│               │   ├── index.ts
│               │   ├── normal.ts
│               │   ├── sse.ts
│               │   └── ws.ts
│               ├── setup.ts
│               ├── systeminfo.ts
│               ├── tool.ts
│               └── vitalsObserver.ts
├── tests/
│   ├── __mocks__/
│   │   ├── MainLoggerService.ts
│   │   └── RendererLoggerService.ts
│   ├── main.setup.ts
│   └── renderer.setup.ts
├── tsconfig.json
├── tsconfig.node.json
├── tsconfig.web.json
└── vitest.config.ts
Download .txt
Showing preview only (233K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2915 symbols across 289 files)

FILE: packages/shared/config/appinfo.ts
  constant APP_NAME (line 4) | const APP_NAME: string = pkg.name;
  constant APP_NAME_ALIAS (line 5) | const APP_NAME_ALIAS: string = 'zy';
  constant APP_NAME_PROTOCOL (line 6) | const APP_NAME_PROTOCOL: string = `${APP_NAME_ALIAS}://`;
  constant APP_DESC (line 7) | const APP_DESC: string = pkg.description;
  constant APP_VERSION (line 8) | const APP_VERSION: string = pkg.version;
  constant APP_AUTHOR (line 9) | const APP_AUTHOR: string = `${pkg.author.name}<${pkg.author.email}>`;
  constant APP_COPYRIGHT (line 10) | const APP_COPYRIGHT: string = `Copyright © ${new Date().getFullYear()} $...
  constant WEBSITE_URL (line 13) | const WEBSITE_URL: string = pkg.homepage;
  constant ISSUE_URL (line 14) | const ISSUE_URL: string = `${pkg.homepage}/issues`;
  constant DOCUMENT_URL (line 15) | const DOCUMENT_URL: string = 'https://zy.catni.cn';
  constant PLUGIN_STORE_URL (line 16) | const PLUGIN_STORE_URL: string = 'https://github.com/Hiram-Wong/zyfun/di...

FILE: packages/shared/config/cmsAction.ts
  constant CMS_ACTION_TYPE (line 1) | const CMS_ACTION_TYPE = {
  type ICmsActionType (line 15) | type ICmsActionType = (typeof CMS_ACTION_TYPE)[keyof typeof CMS_ACTION_T...
  constant CMS_ACTION_FORM_TYPE (line 17) | const CMS_ACTION_FORM_TYPE = [
  type ICmsActionFormType (line 26) | type ICmsActionFormType = (typeof CMS_ACTION_FORM_TYPE)[number];
  constant CMS_ACTION_INPUT_TYPE (line 28) | const CMS_ACTION_INPUT_TYPE = {
  type ICmsActionInputType (line 39) | type ICmsActionInputType = (typeof CMS_ACTION_INPUT_TYPE)[keyof typeof C...
  type ICmsActionButtonTypeEnum (line 41) | type ICmsActionButtonTypeEnum = 0 | 1 | 2 | 3 | 4;
  type ICmsActionButtonType (line 42) | type ICmsActionButtonType = boolean | ICmsActionButtonTypeEnum;
  type ICmsActionButtonTypeDisplay (line 44) | type ICmsActionButtonTypeDisplay = 'cancel' | 'confirm' | 'reset' | 'pre...
  constant CMS_ACTION_SPECIAL_ID_TYPE (line 46) | const CMS_ACTION_SPECIAL_ID_TYPE = {
  type ICmsActionSpecialIdType (line 55) | type ICmsActionSpecialIdType = (typeof CMS_ACTION_SPECIAL_ID_TYPE)[keyof...
  constant CMS_ACTION_SPECIAL_ID_TYPES (line 56) | const CMS_ACTION_SPECIAL_ID_TYPES = Object.values(CMS_ACTION_SPECIAL_ID_...
  type ICmsActionSpecialIdTypes (line 57) | type ICmsActionSpecialIdTypes = keyof typeof CMS_ACTION_SPECIAL_ID_TYPES;

FILE: packages/shared/config/constant.ts
  constant ZOOM_LEVELS (line 1) | const ZOOM_LEVELS = [0.25, 0.33, 0.5, 0.67, 0.75, 0.8, 0.9, 1, 1.1, 1.25...
  constant ZOOM_OPTIONS (line 4) | const ZOOM_OPTIONS = ZOOM_LEVELS.map((level) => ({
  constant ZOOM_SHORTCUTS (line 9) | const ZOOM_SHORTCUTS = [
  type UpgradeChannel (line 37) | enum UpgradeChannel {

FILE: packages/shared/config/data.ts
  constant DATA_IMPORT_TYPE (line 1) | const DATA_IMPORT_TYPE = {
  type IDataImportType (line 5) | type IDataImportType = (typeof DATA_IMPORT_TYPE)[keyof typeof DATA_IMPOR...
  constant DATA_SIMPLE_TYPE (line 8) | const DATA_SIMPLE_TYPE = {
  type IDataSimpleType (line 13) | type IDataSimpleType = (typeof DATA_SIMPLE_TYPE)[keyof typeof DATA_SIMPL...
  constant DATA_COMPLETE_TYPE (line 16) | const DATA_COMPLETE_TYPE = {
  type IDataCompleteType (line 20) | type IDataCompleteType = (typeof DATA_COMPLETE_TYPE)[keyof typeof DATA_C...
  type IDataRemoteType (line 23) | type IDataRemoteType = IDataSimpleType | IDataCompleteType;
  constant DATA_PUT_TYPE (line 26) | const DATA_PUT_TYPE = {
  type IDataPutType (line 30) | type IDataPutType = (typeof DATA_PUT_TYPE)[keyof typeof DATA_PUT_TYPE];
  constant DATA_PAGE (line 33) | const DATA_PAGE = {
  type IDataPage (line 39) | type IDataPage = (typeof DATA_PAGE)[keyof typeof DATA_PAGE];
  constant DATA_TABLE_PAGE (line 41) | const DATA_TABLE_PAGE = {

FILE: packages/shared/config/dns.ts
  type DNS (line 1) | enum DNS {
  type IDns (line 10) | type IDns = `${DNS}`;

FILE: packages/shared/config/env.ts
  constant ORIGIN (line 1) | const ORIGIN = import.meta.env.VITE_API_URL;
  constant PORT (line 2) | const PORT = import.meta.env.VITE_API_PORT;
  constant PREFIX (line 3) | const PREFIX = import.meta.env.VITE_API_URL_PREFIX;
  constant PREFIX_API (line 4) | const PREFIX_API = `${ORIGIN}${PREFIX}`;
  constant PROXY_API (line 6) | const PROXY_API = `${ORIGIN}/proxy`;
  constant AIGC_CHAT_COMPLETION_API (line 7) | const AIGC_CHAT_COMPLETION_API = `${PREFIX_API}/v1/aigc/chat/completion`;
  constant FILE_MANAGE_API (line 8) | const FILE_MANAGE_API = `${PREFIX_API}/v1/file/manage/file`;
  constant SYSTEM_M3U8_AD_REMOVE_API (line 9) | const SYSTEM_M3U8_AD_REMOVE_API = `${PREFIX_API}/v1/system/m3u8/adremove`;

FILE: packages/shared/config/film.ts
  constant SITE_TYPE (line 1) | const SITE_TYPE = {
  type ISiteType (line 20) | type ISiteType = (typeof SITE_TYPE)[keyof typeof SITE_TYPE];
  constant SITE_LOGGER_MAP (line 23) | const SITE_LOGGER_MAP = {
  constant SITE_API_MAP (line 41) | const SITE_API_MAP = {

FILE: packages/shared/config/ipcChannel.ts
  type IPC_CHANNEL (line 1) | enum IPC_CHANNEL {

FILE: packages/shared/config/live.ts
  constant IPTV_TYPE (line 1) | const IPTV_TYPE = {
  type IIptvType (line 6) | type IIptvType = (typeof IPTV_TYPE)[keyof typeof IPTV_TYPE];

FILE: packages/shared/config/logger.ts
  type LogSourceWithContext (line 1) | interface LogSourceWithContext {
  type NullableObject (line 8) | type NullableObject = object | undefined | null;
  type LogContextData (line 10) | type LogContextData = [] | [Error | NullableObject] | [Error | NullableO...
  type LogLevel (line 12) | type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'verbose' | 'silly...
  constant LEVEL (line 14) | const LEVEL = {
  constant LEVEL_MAP (line 24) | const LEVEL_MAP: Record<LogLevel, number> = {
  type LOG_MODULE (line 34) | enum LOG_MODULE {
  type ILogModuleType (line 76) | type ILogModuleType = `${LOG_MODULE}`;
  constant ANSICOLORS (line 78) | const ANSICOLORS = {
  constant LEVEL_COLOR_MAP (line 92) | const LEVEL_COLOR_MAP: Record<LogLevel, keyof typeof ANSICOLORS> = {

FILE: packages/shared/config/notification.ts
  type INotificationType (line 1) | type INotificationType = 'progress' | 'success' | 'error' | 'warning' | ...
  type INotificationSource (line 2) | type INotificationSource = 'assistant' | 'backup' | 'knowledge' | 'update';
  type INotification (line 4) | interface INotification<T = any> {

FILE: packages/shared/config/parse.ts
  constant ANALYZE_TYPE (line 1) | const ANALYZE_TYPE = {
  type IAnalyzeType (line 5) | type IAnalyzeType = (typeof ANALYZE_TYPE)[keyof typeof ANALYZE_TYPE];

FILE: packages/shared/config/req.ts
  constant REQ_METHOD (line 1) | const REQ_METHOD = {
  type IReqMethod (line 10) | type IReqMethod = (typeof REQ_METHOD)[keyof typeof REQ_METHOD];
  constant REQ_CONTENT_TYPE (line 13) | const REQ_CONTENT_TYPE = {
  type IReqContentType (line 20) | type IReqContentType = (typeof REQ_CONTENT_TYPE)[keyof typeof REQ_CONTEN...
  constant REQ_ENCODE (line 23) | const REQ_ENCODE = {
  type IReqEncode (line 29) | type IReqEncode = (typeof REQ_ENCODE)[keyof typeof REQ_ENCODE];
  type IReqOptions (line 32) | interface IReqOptions {
  type IReqResponse (line 42) | interface IReqResponse {

FILE: packages/shared/config/setting.ts
  type SNIFFER_TYPE (line 1) | enum SNIFFER_TYPE {
  type ISnifferType (line 5) | type ISnifferType = `${SNIFFER_TYPE}`;
  type REC_HOT_TYPE (line 7) | enum REC_HOT_TYPE {
  type IRecHotType (line 15) | type IRecHotType = `${REC_HOT_TYPE}`;
  type PLAYER_TYPE (line 17) | enum PLAYER_TYPE {
  type IPlayerType (line 27) | type IPlayerType = `${PLAYER_TYPE}`;
  type IPlayerTypeWithoutCustom (line 28) | type IPlayerTypeWithoutCustom = Exclude<IPlayerType, 'custom'>;
  type AIGC_PROVIDER_TYPE (line 30) | enum AIGC_PROVIDER_TYPE {
  type IAigcProviderType (line 37) | type IAigcProviderType = `${AIGC_PROVIDER_TYPE}`;
  type PROXY_TYPE (line 39) | enum PROXY_TYPE {
  type IProxyType (line 44) | type IProxyType = `${PROXY_TYPE}`;

FILE: packages/shared/config/shortcut.ts
  type SHORTCUT_TYPE (line 1) | enum SHORTCUT_TYPE {
  type IShortcutType (line 5) | type IShortcutType = (typeof SHORTCUT_TYPE)[keyof typeof SHORTCUT_TYPE];
  type IShortcutConfig (line 7) | interface IShortcutConfig {

FILE: packages/shared/config/tblSetting.ts
  type ISettingKey (line 77) | type ISettingKey = (typeof settingList)[number]['key'];
  type ISetting (line 81) | interface ISetting {
  type ISetupKey (line 147) | type ISetupKey = 'disclaimer' | 'theme' | 'lang' | 'bossKey' | 'player' ...
  type ISetup (line 160) | type ISetup = Pick<ISetting, ISetupKey>;

FILE: packages/shared/config/theme.ts
  type THEME (line 1) | enum THEME {
  type ITheme (line 7) | type ITheme = `${THEME}`;
  type IThemeWithoutSystem (line 8) | type IThemeWithoutSystem = Exclude<ITheme, 'system'>;

FILE: packages/shared/config/userAgent.ts
  type USER_AGENT (line 1) | enum USER_AGENT {
  type IUserAgent (line 16) | type IUserAgent = `${USER_AGENT}`;

FILE: packages/shared/config/window.ts
  type WINDOW_NAME (line 1) | enum WINDOW_NAME {
  type ISize (line 9) | interface ISize {
  type IWindowSize (line 14) | interface IWindowSize {
  constant WINDOW_SIZE (line 19) | const WINDOW_SIZE: Record<WINDOW_NAME, IWindowSize> = {

FILE: packages/shared/locales/index.ts
  type ILangCode (line 7) | type ILangCode = (typeof langCode)[number];
  type ISupportLang (line 9) | type ISupportLang = 'zh-CN' | 'zh-TW' | 'el-GR' | 'en-US' | 'es-ES' | 'f...
  type ILang (line 10) | type ILang = ISupportLang | 'system';
  type ILangWithoutSystem (line 11) | type ILangWithoutSystem = Exclude<ILang, 'system'>;

FILE: packages/shared/modules/cache.ts
  type CacheItem (line 1) | interface CacheItem<T> {
  class CacheService (line 7) | class CacheService {
    method set (line 16) | static set<T>(key: string, data: T, duration: number = 0): void {
    method get (line 29) | static get<T>(key: string): T | null {
    method remove (line 46) | static remove(key: string): void {
    method clear (line 53) | static clear(): void {
    method has (line 62) | static has(key: string): boolean {
  type ICacheService (line 76) | interface ICacheService {

FILE: packages/shared/modules/crypto/core/encode.ts
  constant HEX_DELIMITER_MAP (line 306) | const HEX_DELIMITER_MAP = {

FILE: packages/shared/modules/crypto/core/encrypt/rsa.ts
  constant PUB_REGEX (line 7) | const PUB_REGEX = /^-----BEGIN PUBLIC KEY-----[\s\S]+?-----END PUBLIC KE...
  constant PRI_REGEX (line 8) | const PRI_REGEX =

FILE: packages/shared/modules/crypto/core/encrypt/sm.ts
  type IGCMResult (line 11) | type IGCMResult = SmCrypto.sm4.GCMResult<Uint8Array>;

FILE: packages/shared/modules/crypto/modules/atob-btoa.ts
  constant BASE64_CHARS (line 3) | const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx...
  constant BASE64_DECODE_MAP (line 6) | const BASE64_DECODE_MAP = new Int8Array([
  constant EQUALS_CHAR_CODE (line 15) | const EQUALS_CHAR_CODE = 61;

FILE: packages/shared/modules/crypto/type.ts
  type Pad (line 3) | type Pad = 'pkcs5padding' | 'pkcs7padding' | 'ansix923' | 'iso10126' | '...
  type RsaPad (line 4) | type RsaPad = 'rsaes-pkcs1-v1_5' | 'rsaes-oaep-sha1';
  type Sm4Pad (line 5) | type Sm4Pad = 'pkcs5padding' | 'pkcs7padding' | 'nopadding';
  type Mode (line 7) | type Mode = 'cfb' | 'ofb' | 'ctr' | 'ecb' | 'cbc';
  type Sm4Mode (line 8) | type Sm4Mode = 'ecb' | 'cbc' | 'gcm';
  type AesMode (line 9) | type AesMode = Mode | 'gcm';
  type Encode (line 11) | type Encode = 'utf8' | 'utf16' | 'utf16be' | 'utf16le' | 'hex' | 'base64...
  type ParseFunction (line 13) | type ParseFunction = (str: string) => CryptoJS.lib.WordArray;
  type StringifyFunction (line 14) | type StringifyFunction = (wordArray: CryptoJS.lib.WordArray) => string;
  type HashOptions (line 16) | interface HashOptions {
  type HmacOptions (line 22) | interface HmacOptions extends HashOptions {
  type Rc4Options (line 27) | interface Rc4Options {
  type Rc4DropOptions (line 35) | interface Rc4DropOptions {
  type AesOptions (line 44) | interface AesOptions {
  type AesOptionsNew (line 60) | interface AesOptionsNew {
  type DesOptions (line 76) | interface DesOptions {
  type TripleDesOptions (line 88) | interface TripleDesOptions {
  type RabbitOptions (line 100) | interface RabbitOptions {
  type RabbitLegacyOptions (line 110) | interface RabbitLegacyOptions {
  type Sm4Options (line 120) | interface Sm4Options {
  type RsaOptions (line 136) | interface RsaOptions {
  type Base64EncodeOptions (line 148) | interface Base64EncodeOptions {
  type Base64DecodeOptions (line 154) | interface Base64DecodeOptions {
  type UniCodePrefix (line 159) | type UniCodePrefix = '\\u' | '%u' | 'U+';
  type UnicodeEncodeOptions (line 161) | interface UnicodeEncodeOptions {
  type UnicodeDecodeOptions (line 169) | interface UnicodeDecodeOptions {
  type HtmlEntities (line 175) | type HtmlEntities = 'hex' | 'named' | 'numeric';
  type HtmlEncodeOptions (line 177) | interface HtmlEncodeOptions {
  type HtmlDecodeOptions (line 184) | interface HtmlDecodeOptions {
  type GzipEncodeOptions (line 189) | interface GzipEncodeOptions {
  type GzipDecodeOptions (line 195) | interface GzipDecodeOptions {
  type UrlType (line 201) | type UrlType = 'component' | 'uri';
  type UrlEncodeOptions (line 203) | interface UrlEncodeOptions {
  type UrlDecodeOptions (line 209) | interface UrlDecodeOptions {
  type HexDelimiter (line 215) | type HexDelimiter =
  type HexEncodeOptions (line 228) | interface HexEncodeOptions {
  type HexDecodeOptions (line 234) | interface HexDecodeOptions {

FILE: packages/shared/modules/date.ts
  type TimeUnit (line 6) | type TimeUnit = 's' | 'ms';
  type DateSetObject (line 8) | type DateSetObject = Partial<Record<UnitType, number>>;
  type RelativeTimeInfo (line 10) | interface RelativeTimeInfo {

FILE: packages/shared/modules/headers.ts
  type IHeaders (line 8) | type IHeaders = Record<string, any>;
  constant UNSAFE_HEADERS (line 10) | const UNSAFE_HEADERS: Array<string> = [
  constant UNSAFE_HEADERS_LOWER (line 22) | const UNSAFE_HEADERS_LOWER = UNSAFE_HEADERS.map((item: string) => item.t...
  constant UNSAFE_HEADERS_UPPER (line 23) | const UNSAFE_HEADERS_UPPER = UNSAFE_HEADERS.map((item: string) => item.t...
  constant ELECTRON_TAG (line 25) | const ELECTRON_TAG: string = 'Electron';
  function urlResolve (line 338) | function urlResolve(from: string = '', to: string = ''): string {
  function removeScheme (line 386) | function removeScheme(url: string | URL | null | undefined): string {
  function removeHost (line 401) | function removeHost(url: string | URL | null | undefined): string {
  function removeQueryParams (line 408) | function removeQueryParams(url: string | URL | undefined): string {
  function getBaseUrl (line 422) | function getBaseUrl(): string {
  function newUrl (line 447) | function newUrl(
  function stripUrlParam (line 491) | function stripUrlParam(url: string, param: string, type: 'key' | 'value'...

FILE: packages/shared/modules/ip.ts
  type IPVersion (line 5) | type IPVersion = 4 | 6 | -1;
  type IPInfo (line 7) | interface IPInfo {
  type IPLocation (line 13) | interface IPLocation {
  type IP (line 20) | type IP = IPInfo & { location: Partial<IPLocation> };

FILE: packages/shared/modules/lrucache.ts
  class LruCache (line 1) | class LruCache<K = string, V = any> {
    method constructor (line 5) | constructor(capacity: number = 30) {
    method has (line 15) | has(key: K): boolean {
    method get (line 25) | get(key: K): V | undefined {
    method put (line 45) | put(key: K, value: V): V {
    method delete (line 65) | delete(key: K): boolean {
    method clear (line 73) | clear(): void {
    method size (line 81) | size(): number {
    method getCapacity (line 89) | getCapacity(): number {
    method isEmpty (line 97) | isEmpty(): boolean {
    method isFull (line 105) | isFull(): boolean {
    method keys (line 114) | keys(): K[] {
    method values (line 123) | values(): V[] {
    method entries (line 132) | entries(): [K, V][] {
    method getStats (line 140) | getStats(): {

FILE: packages/shared/modules/obj.ts
  function entriesToObj (line 57) | function entriesToObj<V>(entries: Iterable<readonly [PropertyKey, V]>): {

FILE: packages/shared/modules/request/axios/Axios.ts
  class VAxios (line 21) | class VAxios {
    method constructor (line 34) | constructor(options: CreateAxiosOptions) {
    method createAxios (line 45) | private createAxios(config: CreateAxiosOptions): void {
    method getTransform (line 53) | private getTransform() {
    method getAxios (line 61) | getAxios(): AxiosInstance {
    method configAxios (line 69) | configAxios(config: CreateAxiosOptions) {
    method setHeader (line 78) | setHeader(headers: Record<string, string>): void {
    method setupInterceptors (line 87) | private setupInterceptors() {
    method supportFormData (line 134) | supportFormData(config: AxiosRequestConfig) {
    method supportParamsStringify (line 156) | supportParamsStringify(config: AxiosRequestConfig): AxiosRequestConfig {
    method get (line 170) | get<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Pr...
    method post (line 174) | post<T = any>(config: AxiosRequestConfig, options?: RequestOptions): P...
    method put (line 178) | put<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Pr...
    method delete (line 182) | delete<T = any>(config: AxiosRequestConfig, options?: RequestOptions):...
    method patch (line 186) | patch<T = any>(config: AxiosRequestConfig, options?: RequestOptions): ...
    method head (line 190) | head<T = any>(config: AxiosRequestConfig, options?: RequestOptions): P...
    method upload (line 201) | upload<T = any>(key: string, file: File, config: AxiosRequestConfig, o...
    method request (line 223) | request<T = any>(config: AxiosRequestConfigRetry, options?: RequestOpt...
    method synthesisRequest (line 249) | private async synthesisRequest<T = any>(config: AxiosRequestConfigRetr...

FILE: packages/shared/modules/request/axios/AxiosCancel.ts
  class AxiosCanceler (line 17) | class AxiosCanceler {
    method addPending (line 22) | addPending(config: AxiosRequestConfig) {
    method removeAllPending (line 38) | removeAllPending() {
    method removePending (line 49) | removePending(config: AxiosRequestConfig) {
    method reset (line 64) | reset() {

FILE: packages/shared/modules/request/axios/AxiosTransform.ts
  type CreateAxiosOptions (line 8) | interface CreateAxiosOptions extends AxiosRequestConfig {

FILE: packages/shared/modules/request/constants.ts
  type ContentTypeEnum (line 1) | enum ContentTypeEnum {

FILE: packages/shared/modules/request/sse/Sse.ts
  class VSse (line 11) | class VSse {
    method constructor (line 15) | constructor(options: ICreateSseInsOptions) {
    method getTransform (line 24) | private getTransform() {
    method supportFormData (line 33) | supportFormData(config: ISseRequestConfig): ISseRequestConfig {
    method supportParamsStringify (line 55) | supportParamsStringify(config: ISseRequestConfig): ISseRequestConfig {
    method get (line 69) | get<T = any>(config: ISseRequestConfig, options?: RequestOptions): Pro...
    method post (line 73) | post<T = any>(config: ISseRequestConfig, options?: RequestOptions): Pr...
    method request (line 82) | request<T = any>(config: ISseRequestConfig, options?: RequestOptions):...
    method synthesisRequest (line 104) | private async synthesisRequest<T = any>(config: ISseRequestConfig, opt...

FILE: packages/shared/modules/request/sse/SseCancel.ts
  class SseCanceler (line 15) | class SseCanceler {
    method addPending (line 20) | addPending(config: Record<string, any>) {
    method removeAllPending (line 33) | removeAllPending() {
    method removePending (line 44) | removePending(config: Record<string, any>) {
    method reset (line 59) | reset() {

FILE: packages/shared/modules/request/sse/SseTransform.ts
  type ICreateSseParamsOptions (line 5) | interface ICreateSseParamsOptions {
  type ICreateSseCallbackOptions (line 14) | interface ICreateSseCallbackOptions {
  type ISseRequestConfig (line 21) | type ISseRequestConfig = ICreateSseParamsOptions & ICreateSseCallbackOpt...
  type ICreateSseOptions (line 23) | type ICreateSseOptions = ICreateSseInsOptions & ICreateSseParamsOptions;
  type ICreateSseInsOptions (line 28) | interface ICreateSseInsOptions {

FILE: packages/shared/modules/request/type.ts
  type RequestOptions (line 6) | interface RequestOptions {
  type Result (line 91) | interface Result<T = any> {
  type AxiosRequestConfigRetry (line 96) | interface AxiosRequestConfigRetry extends AxiosRequestConfig {

FILE: packages/shared/modules/request/utils.ts
  constant DATE_TIME_FORMAT (line 3) | const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
  function joinTimestamp (line 7) | function joinTimestamp(join: boolean, restful = false): string | object {
  function formatRequestDate (line 19) | function formatRequestDate(params: any) {
  function setObjToUrlParams (line 45) | function setObjToUrlParams(baseUrl: string, obj: { [index: string]: any ...

FILE: packages/shared/modules/request/ws/Ws.ts
  class VWs (line 9) | class VWs {
    method constructor (line 13) | constructor(options: ICreateWsInsOptions) {
    method getTransform (line 22) | private getTransform() {
    method get (line 27) | get<T = any>(config: IWsRequestConfig, options?: RequestOptions): Prom...
    method request (line 36) | request<T = any>(config: IWsRequestConfig, options?: RequestOptions): ...
    method synthesisRequest (line 58) | private async synthesisRequest<T = any>(config: IWsRequestConfig, opti...

FILE: packages/shared/modules/request/ws/WsCancel.ts
  class WsCanceler (line 15) | class WsCanceler {
    method addPending (line 20) | addPending(config: Record<string, any>) {
    method removeAllPending (line 33) | removeAllPending() {
    method removePending (line 44) | removePending(config: Record<string, any>) {
    method reset (line 59) | reset() {

FILE: packages/shared/modules/request/ws/WsTransform.ts
  type IWebSocketHeartbeatMessage (line 26) | type IWebSocketHeartbeatMessage = string | ArrayBuffer | Blob;
  type ICreateWsParamsOptions (line 28) | interface ICreateWsParamsOptions {
  type ICreateWsCallbackOptions (line 92) | interface ICreateWsCallbackOptions {
  type IWsRequestConfig (line 99) | type IWsRequestConfig = ICreateWsParamsOptions & ICreateWsCallbackOptions;
  type ICreateWsOptions (line 101) | type ICreateWsOptions = ICreateWsInsOptions & ICreateWsParamsOptions;
  type ICreateWsInsOptions (line 106) | interface ICreateWsInsOptions {

FILE: packages/shared/modules/schedule.ts
  type RegisterScheduleOption (line 4) | interface RegisterScheduleOption {
  type Schedule (line 15) | interface Schedule extends RegisterScheduleOption {
  class ScheduleManager (line 23) | class ScheduleManager {
    method constructor (line 27) | private constructor() {
    method getInstance (line 34) | public static getInstance(): ScheduleManager {
    method registerSchedule (line 46) | public registerSchedule(schedule: RegisterScheduleOption): Schedule {
    method hasSchedule (line 65) | public hasSchedule(name: string): boolean {
    method getSchedule (line 74) | public getSchedule(name: string): Schedule | undefined {
    method isRunningSchedule (line 83) | public isRunningSchedule(name: string): boolean {
    method runSchedule (line 91) | public runSchedule(name: string): void {
    method stopSchedule (line 117) | public stopSchedule(name: string): void {
    method clearSchedule (line 135) | public clearSchedule(name: string): void {
    method clearAllSchedules (line 148) | public clearAllSchedules(): void {
    method getAllSchedules (line 162) | public getAllSchedules(): Map<string, Schedule> {
    method createInterval (line 172) | private createInterval(callback: () => void, delay: number) {

FILE: packages/shared/modules/singleton.ts
  method construct (line 4) | construct(target, args) {

FILE: packages/shared/modules/size.ts
  type ISizeUnit (line 3) | type ISizeUnit = 'B' | 'KB' | 'MB' | 'GB' | 'TB';
  type ISizeOption (line 5) | interface ISizeOption {
  constant UNITS (line 11) | const UNITS: ISizeUnit[] = ['B', 'KB', 'MB', 'GB', 'TB'];
  function calculateSize (line 31) | function calculateSize(bytes: number, options: ISizeOption = {}): { coun...

FILE: packages/shared/modules/validate.ts
  function isNumber (line 37) | function isNumber(value: unknown): boolean {
  function isIntNumber (line 46) | function isIntNumber(value: unknown): boolean {
  function isFiniteNumber (line 57) | function isFiniteNumber(value: unknown): boolean {
  function isPositiveFiniteNumber (line 68) | function isPositiveFiniteNumber(value: unknown): boolean {
  function isPermissionNumber (line 77) | function isPermissionNumber(value: unknown): boolean {
  function isStrEmpty (line 87) | function isStrEmpty(value: unknown): boolean {
  function isObject (line 96) | function isObject(value?: any): value is object {
  function isObjectEmpty (line 105) | function isObjectEmpty(value: unknown): boolean {
  function isArray (line 115) | function isArray(value?: any): value is any[] {
  function isMultidimensionalArray (line 125) | function isMultidimensionalArray(value?: any, depth: number = 2): boolean {
  function isArrayEmpty (line 137) | function isArrayEmpty(value: unknown): boolean {
  function isJson (line 146) | function isJson(value: unknown): boolean {
  function isJsonStr (line 155) | function isJsonStr(value: unknown): boolean {
  function isBinary (line 172) | function isBinary(value: unknown): boolean {
  function isBase64 (line 181) | function isBase64(value: unknown): boolean {
  function isValEmpty (line 198) | function isValEmpty(value: unknown): boolean {
  function isPathMatch (line 236) | function isPathMatch(pattern: string, path: string): boolean {
  function isHttp (line 254) | function isHttp(value: unknown, strict: boolean = false): boolean {
  function isExternal (line 267) | function isExternal(value: unknown): boolean {
  function isURI (line 278) | function isURI(value: unknown): boolean {
  function isLowerCase (line 293) | function isLowerCase(value: unknown): boolean {
  function isUpperCase (line 303) | function isUpperCase(value: unknown): boolean {
  function isAlphabets (line 313) | function isAlphabets(value: unknown): boolean {
  function isEmail (line 342) | function isEmail(value: unknown): boolean {
  type UUIDVersion (line 347) | type UUIDVersion = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 'nil' | 'max' | 'all';
  function isUUID (line 355) | function isUUID(value: unknown, version: UUIDVersion = 'all'): boolean {
  function isPort (line 381) | function isPort(value: unknown): boolean {
  function isTimestamp (line 386) | function isTimestamp(value: unknown, type: 'ms' | 's' = 'ms'): boolean {
  function isValidUa (line 400) | function isValidUa(value: unknown, strict: boolean = false): boolean {

FILE: packages/shared/modules/zip/7z.ts
  function compress7z (line 11) | async function compress7z(src: string, dest: string): Promise<boolean> {
  function decompress7z (line 37) | async function decompress7z(src: string, dest: string): Promise<boolean> {

FILE: packages/shared/modules/zip/gz.ts
  function compress (line 12) | async function compress(src: string, dest: string): Promise<boolean> {
  function decompress (line 31) | async function decompress(src: string, dest: string): Promise<boolean> {

FILE: packages/shared/modules/zip/tgz.ts
  function compress (line 14) | async function compress(src: string, dest: string): Promise<boolean> {
  function decompress (line 31) | async function decompress(src: string, dest: string): Promise<boolean> {

FILE: packages/shared/modules/zip/zip.ts
  function addDirectoryToZip (line 9) | async function addDirectoryToZip(zip: AdmZip, dirPath: string, rootPath:...
  function compress (line 31) | async function compress(src: string, dest: string): Promise<boolean> {
  function decompress (line 57) | async function decompress(src: string, dest: string): Promise<boolean> {

FILE: packages/shared/types/barrage.ts
  type IBarrage (line 1) | interface IBarrage {
  type IBarrageResult (line 9) | interface IBarrageResult {
  type IBarrageSendOptions (line 14) | interface IBarrageSendOptions {

FILE: packages/shared/types/cms.ts
  type IConstructorOptions (line 12) | type IConstructorOptions = Omit<IModels['site'], 'categories'> & {
  type ICmsInitOptions (line 18) | type ICmsInitOptions = unknown;
  type ICmsHomeOptions (line 20) | type ICmsHomeOptions = void;
  type ICmsHomeVodOptions (line 22) | type ICmsHomeVodOptions = void;
  type ICmsCategoryOptions (line 24) | interface ICmsCategoryOptions {
  type ICmsDetailOptions (line 30) | interface ICmsDetailOptions {
  type ICmsSearchOptions (line 34) | interface ICmsSearchOptions {
  type ICmsPlayOptions (line 40) | interface ICmsPlayOptions {
  type ICmsActionOptions (line 45) | interface ICmsActionOptions {
  type ICmsProxyOptions (line 51) | type ICmsProxyOptions = Record<string, string>;
  type ICmsRunMianOptions (line 53) | type ICmsRunMianOptions = Record<string, string>;
  type ICmsDestroyOptions (line 55) | type ICmsDestroyOptions = void;
  type ICmsInfoBase (line 59) | interface ICmsInfoBase {
  type ICmsInfoBaseWithTag (line 67) | type ICmsInfoBaseWithTag = ICmsInfoBase & {
  type ICmsInfoEpisode (line 71) | interface ICmsInfoEpisode {
  type ICmsInfo (line 76) | type ICmsInfo = ICmsInfoBase & {
  type ICmsInit (line 95) | type ICmsInit = void;
  type ICmsHome (line 97) | interface ICmsHome {
  type ICmsHomeVod (line 115) | interface ICmsHomeVod {
  type ICmsCategory (line 122) | interface ICmsCategory {
  type ICmsDetail (line 129) | interface ICmsDetail {
  type ICmsSearch (line 136) | interface ICmsSearch {
  type ICmsPlay (line 143) | interface ICmsPlay {
  type ICmsActionCommon (line 157) | interface ICmsActionCommon {
  type ICmsActionOptionItem (line 187) | interface ICmsActionOptionItem {
  type ICmsActionOption (line 192) | type ICmsActionOption = ICmsActionOptionItem[] | string[];
  type ICmsActionFormField (line 194) | interface ICmsActionFormField {
  type ICmsActionForm (line 219) | interface ICmsActionForm extends ICmsActionCommon, ICmsActionFormField {
  type ICmsActionMsgbox (line 224) | type ICmsActionMsgbox =
  type ICmsActionHelp (line 236) | interface ICmsActionHelp extends ICmsActionCommon {
  type ICmsActionBrowser (line 241) | interface ICmsActionBrowser extends ICmsActionCommon {
  type ICmsActionBase (line 249) | type ICmsActionBase = ICmsActionForm | ICmsActionMsgbox | ICmsActionHelp...
  type ICmsActionSpecialBase (line 251) | interface ICmsActionSpecialBase {
  type ICmsActionSpecialSelfSearch (line 255) | interface ICmsActionSpecialSelfSearch {
  type ICmsActionSpecialDetail (line 264) | interface ICmsActionSpecialDetail extends ICmsActionSpecialBase {
  type ICmsActionSpecialKtvPlayer (line 270) | interface ICmsActionSpecialKtvPlayer extends ICmsActionSpecialBase {
  type ICmsActionSpecialRefreshList (line 276) | interface ICmsActionSpecialRefreshList extends ICmsActionSpecialBase {
  type ICmsActionSpecialCopy (line 281) | interface ICmsActionSpecialCopy extends ICmsActionSpecialBase {
  type ICmsActionSpecialKeep (line 286) | interface ICmsActionSpecialKeep extends ICmsActionSpecialBase {
  type ICmsActionSpecial (line 293) | type ICmsActionSpecial =
  type ICmsActionPayload (line 301) | type ICmsActionPayload = ICmsActionBase | ICmsActionSpecial;
  type ICmsActionEnvelope (line 303) | interface ICmsActionEnvelope {
  type ICmsAction (line 308) | type ICmsAction = ICmsActionPayload | ICmsActionEnvelope | string;
  type ICmsProxy (line 310) | type ICmsProxy = [number, string, string] | [];
  type ICmsRunMian (line 312) | type ICmsRunMian = any;
  type ICmsDestroy (line 314) | type ICmsDestroy = void;
  type IRecMatch (line 316) | interface IRecMatch {
  type ICmsParams (line 323) | interface ICmsParams {
  type ICmsResult (line 337) | interface ICmsResult {
  type ICmsResultPromise (line 351) | type ICmsResultPromise = {
  type ICmsMethodName (line 359) | type ICmsMethodName = keyof ICmsResult;
  type ICms (line 361) | type ICms = {
  type ICmsAdapter (line 369) | type ICmsAdapter = ICms & {
  type ICmsAdapterConstructor (line 374) | interface ICmsAdapterConstructor {

FILE: packages/shared/types/common.ts
  type DeepMutable (line 1) | type DeepMutable<T> = T extends (...args: any[]) => any
  type WidenLiteral (line 9) | type WidenLiteral<T> = T extends string ? string : T extends number ? nu...
  type DeepWidenLiteral (line 11) | type DeepWidenLiteral<T> = T extends string
  type Normalize (line 23) | type Normalize<T> = DeepMutable<DeepWidenLiteral<T>>;

FILE: packages/shared/types/db.ts
  type IClient (line 7) | type IClient = Client;
  type IConfig (line 9) | type IConfig = Config;
  type IOrm (line 11) | type IOrm = ReturnType<typeof drizzle>;
  type ISchemas (line 13) | type ISchemas = Schemas;
  type IModels (line 15) | type IModels = Models;
  type ITableName (line 17) | type ITableName = TableName;
  type IMigrate (line 19) | type IMigrate = (orm: IOrm, schemas: ISchemas) => Promise<void>;
  type IMigration (line 21) | interface IMigration {
  type IMigrations (line 26) | type IMigrations = readonly IMigration[];
  type IDb (line 28) | type IDb = {
  type IDbStore (line 32) | type IDbStore = {

FILE: packages/shared/types/sift.ts
  type ISiftCategoryResult (line 1) | interface ISiftCategoryResult {

FILE: packages/shared/types/systeminfo.ts
  type IPlatform (line 1) | type IPlatform = 'win32' | 'darwin' | 'linux' | 'ohos' | 'unknown';
  type IArch (line 2) | type IArch = 'x86_64' | 'x86_32' | 'arm_64' | 'arm_32' | 'mips' | 'loong...
  type ISystemInfo (line 4) | interface ISystemInfo {

FILE: resources/scripts/download.js
  function downloadWithRedirects (line 12) | async function downloadWithRedirects(url, destinationPath) {
  function downloadWithPowerShell (line 43) | async function downloadWithPowerShell(url, destinationPath) {

FILE: resources/scripts/install-bun.js
  constant BUN_RELEASE_BASE_URL (line 9) | const BUN_RELEASE_BASE_URL = 'https://gitcode.com/CherryHQ/bun/releases/...
  constant DEFAULT_BUN_VERSION (line 11) | const DEFAULT_BUN_VERSION = '1.3.1';
  constant BUN_PACKAGES (line 14) | const BUN_PACKAGES = {
  function downloadBunBinary (line 38) | async function downloadBunBinary(platform, arch, version = DEFAULT_BUN_V...
  function detectPlatformAndArch (line 131) | function detectPlatformAndArch() {
  function detectIsMusl (line 143) | function detectIsMusl() {
  function installBun (line 157) | async function installBun() {

FILE: resources/scripts/install-ffmpeg.js
  constant FFMPEG_RELEASE_BASE_URL (line 11) | const FFMPEG_RELEASE_BASE_URL = 'https://github.com/eugeneware/ffmpeg-st...
  constant DEFAULT_FFMPEG_VERSION (line 12) | const DEFAULT_FFMPEG_VERSION = 'b6.1.1';
  constant FFMPEG_WIN_ARM_RELEASE_BASE_URL (line 14) | const FFMPEG_WIN_ARM_RELEASE_BASE_URL = 'https://github.com/tordona/ffmp...
  constant DEFAULT_FFMPEG_WIN_ARM_VERSION (line 15) | const DEFAULT_FFMPEG_WIN_ARM_VERSION = '7.1.2';
  constant FFMPEG_PACKAGES (line 18) | const FFMPEG_PACKAGES = {
  function extractGz (line 31) | async function extractGz(inputPath, outputPath) {
  function extract7z (line 40) | async function extract7z(inputPath, outputPath) {
  function downloadFFmpegBinary (line 56) | async function downloadFFmpegBinary(platform, arch, version, isMusl = fa...
  function detectPlatformAndArch (line 159) | function detectPlatformAndArch() {
  function detectIsMusl (line 170) | function detectIsMusl() {
  function installFFmpeg (line 183) | async function installFFmpeg() {

FILE: resources/scripts/install-ffprobe.js
  constant FFPROBE_RELEASE_BASE_URL (line 11) | const FFPROBE_RELEASE_BASE_URL = 'https://github.com/eugeneware/ffmpeg-s...
  constant DEFAULT_FFPROBE_VERSION (line 12) | const DEFAULT_FFPROBE_VERSION = 'b6.1.1';
  constant FFPROBE_WIN_ARM_RELEASE_BASE_URL (line 14) | const FFPROBE_WIN_ARM_RELEASE_BASE_URL = 'https://github.com/tordona/ffm...
  constant DEFAULT_FFPROBE_WIN_ARM_VERSION (line 15) | const DEFAULT_FFPROBE_WIN_ARM_VERSION = '7.1.2';
  constant FFPROBE_PACKAGES (line 18) | const FFPROBE_PACKAGES = {
  function extractGz (line 31) | async function extractGz(inputPath, outputPath) {
  function extract7z (line 40) | async function extract7z(inputPath, outputPath) {
  function downloadFFprobeBinary (line 56) | async function downloadFFprobeBinary(platform, arch, version, isMusl = f...
  function detectPlatformAndArch (line 159) | function detectPlatformAndArch() {
  function detectIsMusl (line 170) | function detectIsMusl() {
  function installFFprobe (line 183) | async function installFFprobe() {

FILE: resources/scripts/install-uv.js
  constant UV_RELEASE_BASE_URL (line 9) | const UV_RELEASE_BASE_URL = 'https://gitcode.com/CherryHQ/uv/releases/do...
  constant DEFAULT_UV_VERSION (line 11) | const DEFAULT_UV_VERSION = '0.9.5';
  constant UV_PACKAGES (line 14) | const UV_PACKAGES = {
  function downloadUvBinary (line 43) | async function downloadUvBinary(platform, arch, version = DEFAULT_UV_VER...
  function detectPlatformAndArch (line 155) | function detectPlatformAndArch() {
  function detectIsMusl (line 166) | function detectIsMusl() {
  function installUv (line 179) | async function installUv() {

FILE: resources/t3Catopen/cat.js
  function i (line 14) | function i(e) {
  class d (line 37) | class d {
    method constructor (line 38) | constructor() {
    method parentNode (line 41) | get parentNode() {
    method parentNode (line 44) | set parentNode(e) {
    method previousSibling (line 47) | get previousSibling() {
    method previousSibling (line 50) | set previousSibling(e) {
    method nextSibling (line 53) | get nextSibling() {
    method nextSibling (line 56) | set nextSibling(e) {
    method cloneNode (line 59) | cloneNode(e = !1) {
  class m (line 63) | class m extends d {
    method constructor (line 64) | constructor(e) {
    method nodeValue (line 67) | get nodeValue() {
    method nodeValue (line 70) | set nodeValue(e) {
  class _ (line 74) | class _ extends m {
    method constructor (line 75) | constructor() {
    method nodeType (line 78) | get nodeType() {
  class E (line 82) | class E extends m {
    method constructor (line 83) | constructor() {
    method nodeType (line 86) | get nodeType() {
  class T (line 90) | class T extends m {
    method constructor (line 91) | constructor(t, n) {
    method nodeType (line 94) | get nodeType() {
  class A (line 98) | class A extends d {
    method constructor (line 99) | constructor(e) {
    method firstChild (line 102) | get firstChild() {
    method lastChild (line 106) | get lastChild() {
    method childNodes (line 109) | get childNodes() {
    method childNodes (line 112) | set childNodes(e) {
  class g (line 116) | class g extends A {
    method constructor (line 117) | constructor() {
    method nodeType (line 120) | get nodeType() {
  class v (line 124) | class v extends A {
    method constructor (line 125) | constructor() {
    method nodeType (line 128) | get nodeType() {
  class y (line 132) | class y extends A {
    method constructor (line 133) | constructor(t, n, r = [], i = 'script' === t ? e.Script : 'style' === ...
    method nodeType (line 136) | get nodeType() {
    method tagName (line 139) | get tagName() {
    method tagName (line 142) | set tagName(e) {
    method attributes (line 145) | get attributes() {
  function S (line 157) | function S(t) {
  function C (line 160) | function C(t) {
  function N (line 163) | function N(t) {
  function b (line 166) | function b(t) {
  function I (line 169) | function I(t) {
  function O (line 172) | function O(t) {
  function k (line 175) | function k(e) {
  function L (line 178) | function L(e, t = !1) {
  function D (line 214) | function D(e) {
  class w (line 220) | class w {
    method constructor (line 221) | constructor(e, t, n) {
    method onparserinit (line 234) | onparserinit(e) {
    method onreset (line 237) | onreset() {
    method onend (line 245) | onend() {
    method onerror (line 248) | onerror(e) {
    method onclosetag (line 251) | onclosetag() {
    method onopentag (line 256) | onopentag(t, n) {
    method ontext (line 261) | ontext(t) {
    method oncomment (line 269) | oncomment(t) {
    method oncommentend (line 274) | oncommentend() {
    method oncdatastart (line 277) | oncdatastart() {
    method oncdataend (line 282) | oncdataend() {
    method onprocessinginstruction (line 285) | onprocessinginstruction(e, t) {
    method handleCallback (line 288) | handleCallback(e) {
    method addNode (line 292) | addNode(e) {
  function B (line 318) | function B(e) {
  function F (line 333) | function F(e, t) {
  function Y (line 465) | function Y(e) {
  function W (line 489) | function W(e, t = {}) {
  function V (line 495) | function V(e, t) {
  function z (line 563) | function z(e, t) {
  function X (line 566) | function X(e) {
  function Z (line 569) | function Z(t) {
  function J (line 572) | function J(e) {
  function ee (line 575) | function ee(e) {
  function te (line 578) | function te(e) {
  function ne (line 587) | function ne(e) {
  function re (line 592) | function re(e) {
  function ie (line 597) | function ie(e) {
  function se (line 606) | function se(e, t, n = !0, r = 1 / 0) {
  function ae (line 609) | function ae(e, t, n, r) {
  function oe (line 620) | function oe(e, t, n = !0) {
  function ue (line 633) | function ue(e, t) {
  function le (line 636) | function le(e, t) {
  function he (line 639) | function he(e) {
  function fe (line 646) | function fe(e, t, n = !0, r = 1 / 0) {
  function de (line 649) | function de(e, t) {
  function me (line 676) | function me(e) {
  function Te (line 693) | function Te(e) {
  function Ae (line 702) | function Ae(e, t) {
  function ge (line 705) | function ge(e, t, n = !1) {
  function ve (line 708) | function ve(e, t, n, r, i = !1) {
  function ye (line 711) | function ye(e) {
  method DocumentPosition (line 845) | get DocumentPosition() {
  function Ne (line 918) | function Ne(e, t, n) {
  function be (line 921) | function be(e, t) {
  function Ie (line 932) | function Ie(e) {
  function Oe (line 935) | function Oe(e) {
  function ke (line 939) | function ke(e, t, r) {
  function Le (line 950) | function Le() {
  function De (line 953) | function De(e, t) {
  function Re (line 957) | function Re(e, t) {
  function we (line 963) | function we(e) {
  function Pe (line 987) | function Pe(e) {
  function Be (line 990) | function Be(e, t) {
  function Fe (line 994) | function Fe(e) {
  function Ue (line 1009) | function Ue(e) {
  function We (line 1034) | function We(e, t, n) {
  function Ve (line 1051) | function Ve(e, t, n) {
  function $e (line 1054) | function $e(e, t, n) {
  function Qe (line 1057) | function Qe(e, t, n, r) {
  function ze (line 1060) | function ze(e, t, n) {
  function Xe (line 1064) | function Xe(e, t) {
  function Ze (line 1096) | function Ze(e, t) {
  function Je (line 1099) | function Je(e) {
  function ot (line 1353) | function ot(e) {
  function ut (line 1367) | function ut(e, t, n) {
  function lt (line 1375) | function lt(e) {
  function ht (line 1378) | function ht(e) {
  function ft (line 1381) | function ft(e) {
  function pt (line 1384) | function pt(e) {
  function dt (line 1390) | function dt(e, t, n) {
  function Tt (line 1566) | function Tt(e) {
  function gt (line 1577) | function gt(e) {
  function vt (line 1588) | function vt(e) {
  function St (line 1608) | function St(e) {
  function Nt (line 1659) | function Nt(e, t) {
  method equals (line 1667) | equals(e, t, n) {
  method hyphen (line 1679) | hyphen(e, t, n) {
  method element (line 1695) | element(e, t, n) {
  method start (line 1709) | start(e, t, n) {
  method end (line 1727) | end(e, t, n) {
  method any (line 1745) | any(e, t, n) {
  method not (line 1761) | not(e, t, n) {
  function Lt (line 1779) | function Lt(e) {
  function Dt (line 1822) | function Dt(e, t) {
  method icontains (line 1833) | icontains(e, t, { adapter: n }) {
  method 'nth-child' (line 1839) | 'nth-child'(e, t, { adapter: n, equals: r }) {
  method 'nth-last-child' (line 1852) | 'nth-last-child'(e, t, { adapter: n, equals: r }) {
  method 'nth-of-type' (line 1865) | 'nth-of-type'(e, t, { adapter: n, equals: r }) {
  method 'nth-last-of-type' (line 1882) | 'nth-last-of-type'(e, t, { adapter: n, equals: r }) {
  method scope (line 1905) | scope(e, t, n, r) {
  function wt (line 1917) | function wt(e) {
  method 'first-child' (line 1929) | 'first-child'(e, { adapter: t, equals: n }) {
  method 'last-child' (line 1935) | 'last-child'(e, { adapter: t, equals: n }) {
  method 'first-of-type' (line 1943) | 'first-of-type'(e, { adapter: t, equals: n }) {
  method 'last-of-type' (line 1953) | 'last-of-type'(e, { adapter: t, equals: n }) {
  method 'only-of-type' (line 1963) | 'only-of-type'(e, { adapter: t, equals: n }) {
  function Mt (line 1969) | function Mt(e, t, n, r) {
  function Ft (line 1998) | function Ft(e, t) {
  function Ut (line 2002) | function Ut(e) {
  method not (line 2022) | not(e, t, n, r, i) {
  method has (line 2026) | has(e, t, n, r, i) {
  function jt (line 2048) | function jt(e, t) {
  function qt (line 2051) | function qt(e, t, n, r, i) {
  function Yt (line 2158) | function Yt(e) {
  function $t (line 2164) | function $t(e, t, n) {
  function Qt (line 2206) | function Qt(e, t) {
  function en (line 2232) | function en(e, t, n = !1) {
  function nn (line 2248) | function nn(e) {
  function rn (line 2254) | function rn(e) {
  function on (line 2262) | function on(e, t, n = {}) {
  function cn (line 2265) | function cn(e, t, n = {}) {
  function un (line 2271) | function un(e, t, n = {}) {
  function ln (line 2274) | function ln(e, t, n) {
  function hn (line 2297) | function hn(e, t, n) {
  function fn (line 2312) | function fn(e, t, n, r, i) {
  function pn (line 2384) | function pn(e, t, n, r) {
  function dn (line 2387) | function dn(e, t, n = 1 / 0) {
  function mn (line 2390) | function mn(e, t, n) {
  function Tn (line 2400) | function Tn(e) {
  function vn (line 2432) | function vn(e) {
  function yn (line 2459) | function yn(e) {
  function xn (line 2512) | function xn(e) {
  function Mn (line 2525) | function Mn(e, t, n, r) {
  function Bn (line 2695) | function Bn(e, t) {
  function Un (line 2712) | function Un(e) {
  function Hn (line 2725) | function Hn(e, t, n, r, i) {
  function qn (line 2749) | function qn(e) {
  function Vn (line 2960) | function Vn(e, t, n, r) {
  function $n (line 2979) | function $n(e, t) {
  function n (line 3081) | function n() {
  function pr (line 3142) | function pr(e) {
  function dr (line 3145) | function dr(e) {
  function mr (line 3148) | function mr(e) {
  class Er (line 3214) | class Er {
    method constructor (line 3215) | constructor(e) {
    method col (line 3231) | get col() {
    method offset (line 3234) | get offset() {
    method getError (line 3237) | getError(e) {
    method _err (line 3241) | _err(e) {
    method _addGap (line 3246) | _addGap() {
    method _processSurrogate (line 3249) | _processSurrogate(e) {
    method willDropParsedChunk (line 3256) | willDropParsedChunk() {
    method dropParsedChunk (line 3259) | dropParsedChunk() {
    method write (line 3268) | write(e, t) {
    method insertHtmlAtCurrentPos (line 3271) | insertHtmlAtCurrentPos(e) {
    method startsWith (line 3275) | startsWith(e, t) {
    method peek (line 3281) | peek(e) {
    method advance (line 3288) | advance() {
    method _checkForProblematicCharacters (line 3310) | _checkForProblematicCharacters(e) {
    method retreat (line 3313) | retreat(e) {
  function Ar (line 3318) | function Ar(e, t) {
  function vr (line 3343) | function vr() {
  function yr (line 3346) | function yr(e) {
  function Sr (line 3349) | function Sr(e, t) {
  function i (line 3407) | function i(e) {
  function d (line 3496) | function d(e) {
    method constructor (line 38) | constructor() {
    method parentNode (line 41) | get parentNode() {
    method parentNode (line 44) | set parentNode(e) {
    method previousSibling (line 47) | get previousSibling() {
    method previousSibling (line 50) | set previousSibling(e) {
    method nextSibling (line 53) | get nextSibling() {
    method nextSibling (line 56) | set nextSibling(e) {
    method cloneNode (line 59) | cloneNode(e = !1) {
  function e (line 3541) | function e(e, t, n) {
  function E (line 3682) | function E(e) {
    method constructor (line 83) | constructor() {
    method nodeType (line 86) | get nodeType() {
  function T (line 3701) | function T(e, t, n, r) {
    method constructor (line 91) | constructor(t, n) {
    method nodeType (line 94) | get nodeType() {
  function qr (line 4142) | function qr(e) {
  function Wr (line 4236) | function Wr(e) {
  function Xr (line 4359) | function Xr(e) {
  function Zr (line 4362) | function Zr(e) {
  function Jr (line 4365) | function Jr(e) {
  function ei (line 4372) | function ei(e) {
  function ti (line 4375) | function ti(e) {
  function ni (line 4378) | function ni(e) {
  function ri (line 4381) | function ri(e) {
  function ii (line 4384) | function ii(e) {
  function si (line 4387) | function si(e) {
  class ai (line 4390) | class ai {
    method constructor (line 4391) | constructor(e, t) {
    method _err (line 4409) | _err(e) {
    method getCurrentLocation (line 4413) | getCurrentLocation(e) {
    method _runParsingLoop (line 4425) | _runParsingLoop() {
    method pause (line 4435) | pause() {
    method resume (line 4438) | resume(e) {
    method write (line 4442) | write(e, t, n) {
    method insertHtmlAtCurrentPos (line 4445) | insertHtmlAtCurrentPos(e) {
    method _ensureHibernation (line 4448) | _ensureHibernation() {
    method _consume (line 4451) | _consume() {
    method _unconsume (line 4454) | _unconsume(e) {
    method _reconsumeInState (line 4457) | _reconsumeInState(e, t) {
    method _advanceBy (line 4460) | _advanceBy(e) {
    method _consumeSequenceIfMatch (line 4464) | _consumeSequenceIfMatch(e, t) {
    method _createStartTagToken (line 4467) | _createStartTagToken() {
    method _createEndTagToken (line 4478) | _createEndTagToken() {
    method _createCommentToken (line 4489) | _createCommentToken(e) {
    method _createDoctypeToken (line 4492) | _createDoctypeToken(e) {
    method _createCharacterToken (line 4502) | _createCharacterToken(e, t) {
    method _createAttr (line 4505) | _createAttr(e) {
    method _leaveAttrName (line 4508) | _leaveAttrName() {
    method _leaveAttrValue (line 4520) | _leaveAttrValue() {
    method prepareToken (line 4526) | prepareToken(e) {
    method emitCurrentTagToken (line 4535) | emitCurrentTagToken() {
    method emitCurrentComment (line 4546) | emitCurrentComment(e) {
    method emitCurrentDoctype (line 4549) | emitCurrentDoctype(e) {
    method _emitCurrentCharacterToken (line 4552) | _emitCurrentCharacterToken(e) {
    method _emitEOFToken (line 4574) | _emitEOFToken() {
    method _appendCharToCurrentCharacterToken (line 4581) | _appendCharToCurrentCharacterToken(e, t) {
    method _emitCodePoint (line 4590) | _emitCodePoint(e) {
    method _emitChars (line 4594) | _emitChars(e) {
    method _matchNamedCharacterReference (line 4597) | _matchNamedCharacterReference(e) {
    method _isCharacterReferenceInAttribute (line 4628) | _isCharacterReferenceInAttribute() {
    method _flushCodePointConsumedAsCharacterReference (line 4635) | _flushCodePointConsumedAsCharacterReference(e) {
    method _callState (line 4640) | _callState(e) {
    method _stateData (line 4883) | _stateData(e) {
    method _stateRcdata (line 4901) | _stateRcdata(e) {
    method _stateRawtext (line 4919) | _stateRawtext(e) {
    method _stateScriptData (line 4934) | _stateScriptData(e) {
    method _statePlaintext (line 4949) | _statePlaintext(e) {
    method _stateTagOpen (line 4961) | _stateTagOpen(e) {
    method _stateEndTagOpen (line 4987) | _stateEndTagOpen(e) {
    method _stateTagName (line 5004) | _stateTagName(e) {
    method _stateRcdataLessThanSign (line 5029) | _stateRcdataLessThanSign(e) {
    method _stateRcdataEndTagOpen (line 5034) | _stateRcdataEndTagOpen(e) {
    method handleSpecialEndTag (line 5039) | handleSpecialEndTag(e) {
    method _stateRcdataEndTagName (line 5059) | _stateRcdataEndTagName(e) {
    method _stateRawtextLessThanSign (line 5062) | _stateRawtextLessThanSign(e) {
    method _stateRawtextEndTagOpen (line 5067) | _stateRawtextEndTagOpen(e) {
    method _stateRawtextEndTagName (line 5072) | _stateRawtextEndTagName(e) {
    method _stateScriptDataLessThanSign (line 5075) | _stateScriptDataLessThanSign(e) {
    method _stateScriptDataEndTagOpen (line 5087) | _stateScriptDataEndTagOpen(e) {
    method _stateScriptDataEndTagName (line 5092) | _stateScriptDataEndTagName(e) {
    method _stateScriptDataEscapeStart (line 5095) | _stateScriptDataEscapeStart(e) {
    method _stateScriptDataEscapeStartDash (line 5100) | _stateScriptDataEscapeStartDash(e) {
    method _stateScriptDataEscaped (line 5105) | _stateScriptDataEscaped(e) {
    method _stateScriptDataEscapedDash (line 5123) | _stateScriptDataEscapedDash(e) {
    method _stateScriptDataEscapedDashDash (line 5141) | _stateScriptDataEscapedDashDash(e) {
    method _stateScriptDataEscapedLessThanSign (line 5162) | _stateScriptDataEscapedLessThanSign(e) {
    method _stateScriptDataEscapedEndTagOpen (line 5171) | _stateScriptDataEscapedEndTagOpen(e) {
    method _stateScriptDataEscapedEndTagName (line 5176) | _stateScriptDataEscapedEndTagName(e) {
    method _stateScriptDataDoubleEscapeStart (line 5180) | _stateScriptDataDoubleEscapeStart(e) {
    method _stateScriptDataDoubleEscaped (line 5187) | _stateScriptDataDoubleEscaped(e) {
    method _stateScriptDataDoubleEscapedDash (line 5205) | _stateScriptDataDoubleEscapedDash(e) {
    method _stateScriptDataDoubleEscapedDashDash (line 5223) | _stateScriptDataDoubleEscapedDashDash(e) {
    method _stateScriptDataDoubleEscapedLessThanSign (line 5244) | _stateScriptDataDoubleEscapedLessThanSign(e) {
    method _stateScriptDataDoubleEscapeEnd (line 5249) | _stateScriptDataDoubleEscapeEnd(e) {
    method _stateBeforeAttributeName (line 5258) | _stateBeforeAttributeName(e) {
    method _stateAttributeName (line 5279) | _stateAttributeName(e) {
    method _stateAfterAttributeName (line 5305) | _stateAfterAttributeName(e) {
    method _stateBeforeAttributeValue (line 5328) | _stateBeforeAttributeValue(e) {
    method _stateAttributeValueDoubleQuoted (line 5348) | _stateAttributeValueDoubleQuoted(e) {
    method _stateAttributeValueSingleQuoted (line 5366) | _stateAttributeValueSingleQuoted(e) {
    method _stateAttributeValueUnquoted (line 5384) | _stateAttributeValueUnquoted(e) {
    method _stateAfterAttributeValueQuoted (line 5416) | _stateAfterAttributeValueQuoted(e) {
    method _stateSelfClosingStartTag (line 5439) | _stateSelfClosingStartTag(e) {
    method _stateBogusComment (line 5453) | _stateBogusComment(e) {
    method _stateMarkupDeclarationOpen (line 5469) | _stateMarkupDeclarationOpen(e) {
    method _stateCommentStart (line 5487) | _stateCommentStart(e) {
    method _stateCommentStartDash (line 5502) | _stateCommentStartDash(e) {
    method _stateComment (line 5518) | _stateComment(e) {
    method _stateCommentLessThanSign (line 5537) | _stateCommentLessThanSign(e) {
    method _stateCommentLessThanSignBang (line 5550) | _stateCommentLessThanSignBang(e) {
    method _stateCommentLessThanSignBangDash (line 5555) | _stateCommentLessThanSignBangDash(e) {
    method _stateCommentLessThanSignBangDashDash (line 5560) | _stateCommentLessThanSignBangDashDash(e) {
    method _stateCommentEndDash (line 5565) | _stateCommentEndDash(e) {
    method _stateCommentEnd (line 5578) | _stateCommentEnd(e) {
    method _stateCommentEndBang (line 5597) | _stateCommentEndBang(e) {
    method _stateDoctype (line 5613) | _stateDoctype(e) {
    method _stateBeforeDoctypeName (line 5636) | _stateBeforeDoctypeName(e) {
    method _stateDoctypeName (line 5664) | _stateDoctypeName(e) {
    method _stateAfterDoctypeName (line 5686) | _stateAfterDoctypeName(e) {
    method _stateAfterDoctypePublicKeyword (line 5712) | _stateAfterDoctypePublicKeyword(e) {
    method _stateBeforeDoctypePublicIdentifier (line 5747) | _stateBeforeDoctypePublicIdentifier(e) {
    method _stateDoctypePublicIdentifierDoubleQuoted (line 5777) | _stateDoctypePublicIdentifierDoubleQuoted(e) {
    method _stateDoctypePublicIdentifierSingleQuoted (line 5799) | _stateDoctypePublicIdentifierSingleQuoted(e) {
    method _stateAfterDoctypePublicIdentifier (line 5821) | _stateAfterDoctypePublicIdentifier(e) {
    method _stateBetweenDoctypePublicAndSystemIdentifiers (line 5853) | _stateBetweenDoctypePublicAndSystemIdentifiers(e) {
    method _stateAfterDoctypeSystemKeyword (line 5880) | _stateAfterDoctypeSystemKeyword(e) {
    method _stateBeforeDoctypeSystemIdentifier (line 5915) | _stateBeforeDoctypeSystemIdentifier(e) {
    method _stateDoctypeSystemIdentifierDoubleQuoted (line 5945) | _stateDoctypeSystemIdentifierDoubleQuoted(e) {
    method _stateDoctypeSystemIdentifierSingleQuoted (line 5967) | _stateDoctypeSystemIdentifierSingleQuoted(e) {
    method _stateAfterDoctypeSystemIdentifier (line 5989) | _stateAfterDoctypeSystemIdentifier(e) {
    method _stateBogusDoctype (line 6009) | _stateBogusDoctype(e) {
    method _stateCdataSection (line 6022) | _stateCdataSection(e) {
    method _stateCdataSectionBracket (line 6034) | _stateCdataSectionBracket(e) {
    method _stateCdataSectionEnd (line 6039) | _stateCdataSectionEnd(e) {
    method _stateCharacterReference (line 6051) | _stateCharacterReference(e) {
    method _stateNamedCharacterReference (line 6058) | _stateNamedCharacterReference(e) {
    method _stateAmbiguousAmpersand (line 6066) | _stateAmbiguousAmpersand(e) {
    method _stateNumericCharacterReference (line 6072) | _stateNumericCharacterReference(e) {
    method _stateHexademicalCharacterReferenceStart (line 6083) | _stateHexademicalCharacterReferenceStart(e) {
    method _stateHexademicalCharacterReference (line 6094) | _stateHexademicalCharacterReference(e) {
    method _stateDecimalCharacterReference (line 6107) | _stateDecimalCharacterReference(e) {
    method _stateNumericCharacterReferenceEnd (line 6116) | _stateNumericCharacterReferenceEnd(e) {
  class mi (line 6159) | class mi {
    method currentTmplContentOrNode (line 6160) | get currentTmplContentOrNode() {
    method constructor (line 6163) | constructor(e, t, n) {
    method _indexOf (line 6173) | _indexOf(e) {
    method _isInTemplate (line 6176) | _isInTemplate() {
    method _updateCurrentElement (line 6179) | _updateCurrentElement() {
    method push (line 6182) | push(e, t) {
    method pop (line 6191) | pop() {
    method replace (line 6198) | replace(e, t) {
    method insertAfter (line 6201) | insertAfter(e, t, n) {
    method popUntilTagNamePopped (line 6209) | popUntilTagNamePopped(e) {
    method shortenToLength (line 6217) | shortenToLength(e) {
    method popUntilElementPopped (line 6226) | popUntilElementPopped(e) {
    method popUntilPopped (line 6229) | popUntilPopped(e, t) {
    method popUntilNumberedHeaderPopped (line 6232) | popUntilNumberedHeaderPopped() {
    method popUntilTableCellPopped (line 6235) | popUntilTableCellPopped() {
    method popAllUpToHtmlElement (line 6238) | popAllUpToHtmlElement() {
    method _indexOfTagNames (line 6241) | _indexOfTagNames(e, t) {
    method clearBackTo (line 6246) | clearBackTo(e, t) {
    method clearBackToTableContext (line 6249) | clearBackToTableContext() {
    method clearBackToTableBodyContext (line 6252) | clearBackToTableBodyContext() {
    method clearBackToTableRowContext (line 6255) | clearBackToTableRowContext() {
    method remove (line 6258) | remove(e) {
    method tryPeekProperlyNestedBodyElement (line 6269) | tryPeekProperlyNestedBodyElement() {
    method contains (line 6272) | contains(e) {
    method getCommonAncestor (line 6275) | getCommonAncestor(e) {
    method isRootHtmlElementCurrent (line 6278) | isRootHtmlElementCurrent() {
    method hasInScope (line 6281) | hasInScope(e) {
    method hasNumberedHeaderInScope (line 6290) | hasNumberedHeaderInScope() {
    method hasInListItemScope (line 6299) | hasInListItemScope(e) {
    method hasInButtonScope (line 6308) | hasInButtonScope(e) {
    method hasInTableScope (line 6317) | hasInTableScope(e) {
    method hasTableBodyContextInTableScope (line 6327) | hasTableBodyContextInTableScope() {
    method hasInSelectScope (line 6337) | hasInSelectScope(e) {
    method generateImpliedEndTags (line 6347) | generateImpliedEndTags() {
    method generateImpliedEndTagsThoroughly (line 6350) | generateImpliedEndTagsThoroughly() {
    method generateImpliedEndTagsWithExclusion (line 6353) | generateImpliedEndTagsWithExclusion(e) {
  class Ti (line 6361) | class Ti {
    method constructor (line 6362) | constructor(e) {
    method _getNoahArkConditionCandidates (line 6365) | _getNoahArkConditionCandidates(e, t) {
    method _ensureNoahArkCondition (line 6381) | _ensureNoahArkCondition(e) {
    method insertMarker (line 6395) | insertMarker() {
    method pushElement (line 6398) | pushElement(e, t) {
    method insertElementAfterBookmark (line 6401) | insertElementAfterBookmark(e, t) {
    method removeEntry (line 6405) | removeEntry(e) {
    method clearToLastMarker (line 6408) | clearToLastMarker() {
    method getElementEntryInScopeWithTagName (line 6412) | getElementEntryInScopeWithTagName(e) {
    method getElementEntry (line 6416) | getElementEntry(e) {
  function Ai (line 6420) | function Ai(e) {
  method appendChild (line 6435) | appendChild(e, t) {
  method insertBefore (line 6438) | insertBefore(e, t, n) {
  method setTemplateContent (line 6441) | setTemplateContent(e, t) {
  method setDocumentType (line 6445) | setDocumentType(e, t, n, r) {
  method setDocumentMode (line 6453) | setDocumentMode(e, t) {
  method detachNode (line 6457) | detachNode(e) {
  method insertText (line 6462) | insertText(e, t) {
  method insertTextBefore (line 6469) | insertTextBefore(e, t, n) {
  method adoptAttributes (line 6473) | adoptAttributes(e, t) {
  method setNodeSourceCodeLocation (line 6492) | setNodeSourceCodeLocation(e, t) {
  method updateNodeSourceCodeLocation (line 6496) | updateNodeSourceCodeLocation(e, t) {
  function ki (line 6564) | function ki(e, t) {
  function Bi (line 6732) | function Bi(e) {
  function Fi (line 6739) | function Fi(e) {
  function Ui (line 6745) | function Ui(e) {
  function Hi (line 6751) | function Hi(e, t, n, r) {
  class $i (line 6801) | class $i {
    method constructor (line 6802) | constructor(e, t, n = null, r = null) {
    method parse (line 6829) | static parse(e, t) {
    method getFragmentParser (line 6832) | static getFragmentParser(e, t) {
    method getFragment (line 6846) | getFragment() {
    method _err (line 6851) | _err(e, t, n) {
    method onItemPush (line 6864) | onItemPush(e, t, n) {
    method onItemPop (line 6869) | onItemPop(e, t) {
    method _setContextModes (line 6883) | _setContextModes(e, t) {
    method _switchToTextParsing (line 6887) | _switchToTextParsing(e, t) {
    method switchToPlaintextParsing (line 6893) | switchToPlaintextParsing() {
    method _getAdjustedCurrentElement (line 6896) | _getAdjustedCurrentElement() {
    method _findFormInFragmentContext (line 6899) | _findFormInFragmentContext() {
    method _initTokenizerForFragmentParsing (line 6909) | _initTokenizerForFragmentParsing() {
    method _setDocumentType (line 6931) | _setDocumentType(e) {
    method _attachElementToTree (line 6940) | _attachElementToTree(e, t) {
    method _appendElement (line 6952) | _appendElement(e, t) {
    method _insertElement (line 6955) | _insertElement(e, t) {
    method _insertFakeElement (line 6960) | _insertFakeElement(e, t) {
    method _insertTemplate (line 6965) | _insertTemplate(e) {
    method _insertFakeRootElement (line 6973) | _insertFakeRootElement() {
    method _appendCommentNode (line 6979) | _appendCommentNode(e, t) {
    method _insertCharacters (line 6984) | _insertCharacters(e) {
    method _adoptNodes (line 7002) | _adoptNodes(e, t) {
    method _setEndLocation (line 7006) | _setEndLocation(e, t) {
    method shouldProcessStartTagTokenInForeignContent (line 7018) | shouldProcessStartTagTokenInForeignContent(e) {
    method _processToken (line 7032) | _processToken(e) {
    method _isIntegrationPoint (line 7059) | _isIntegrationPoint(e, t, n) {
    method _reconstructActiveFormattingElements (line 7062) | _reconstructActiveFormattingElements() {
    method _closeTableCell (line 7075) | _closeTableCell() {
    method _closePElement (line 7081) | _closePElement() {
    method _resetInsertionMode (line 7084) | _resetInsertionMode() {
    method _resetInsertionModeForSelect (line 7118) | _resetInsertionModeForSelect(e) {
    method _isElementCausesFosterParenting (line 7127) | _isElementCausesFosterParenting(e) {
    method _shouldFosterParentOnInsertion (line 7130) | _shouldFosterParentOnInsertion() {
    method _findFosterParentingLocation (line 7133) | _findFosterParentingLocation() {
    method _fosterParentElement (line 7148) | _fosterParentElement(e) {
    method _isSpecialElement (line 7154) | _isSpecialElement(e, t) {
    method onCharacter (line 7157) | onCharacter(e) {
    method onNullCharacter (line 7211) | onNullCharacter(e) {
    method onComment (line 7254) | onComment(e) {
    method onDoctype (line 7293) | onDoctype(e) {
    method onStartTag (line 7330) | onStartTag(e) {
    method _processStartTag (line 7336) | _processStartTag(e) {
    method _startTagOutsideForeignContent (line 7363) | _startTagOutsideForeignContent(e) {
    method onEndTag (line 7593) | onEndTag(e) {
    method _endTagOutsideForeignContent (line 7613) | _endTagOutsideForeignContent(e) {
    method onEof (line 7824) | onEof(e) {
    method onWhitespaceCharacter (line 7877) | onWhitespaceCharacter(e) {
  function Qi (line 7915) | function Qi(e, t) {
  function zi (line 7926) | function zi(e, t) {
  function Xi (line 7936) | function Xi(e, t, n) {
  function Zi (line 7953) | function Zi(e, t) {
  function Ji (line 7958) | function Ji(e, t, n) {
  function es (line 7967) | function es(e, t, n) {
  function ts (line 7978) | function ts(e, t) {
  function ns (line 7990) | function ns(e, t) {
  function rs (line 7993) | function rs(e, t) {
  function is (line 8008) | function is(e, t) {
  function ss (line 8014) | function ss(e, t) {
  function as (line 8017) | function as(e, t) {
  function os (line 8023) | function os(e, t) {
  function cs (line 8064) | function cs(e, t) {
  function us (line 8074) | function us(e, t) {
  function ls (line 8077) | function ls(e, t) {
  function hs (line 8081) | function hs(e, t) {
  function fs (line 8084) | function fs(e, t) {
  function ps (line 8105) | function ps(e, t) {
  function ds (line 8108) | function ds(e, t) {
  function ms (line 8111) | function ms(e, t) {
  function _s (line 8117) | function _s(e) {
  function Es (line 8120) | function Es(e, t) {
  function Ts (line 8123) | function Ts(e, t) {
  function As (line 8126) | function As(e, t) {
  function gs (line 8441) | function gs(e, t) {
  function vs (line 8455) | function vs(e, t) {
  function ys (line 8586) | function ys(e, t) {
  function Ss (line 8589) | function Ss(e, t) {
  function Cs (line 8606) | function Cs(e, t) {
  function Ns (line 8675) | function Ns(e, t) {
  function bs (line 8700) | function bs(e, t) {
  function Is (line 8704) | function Is(e, t) {
  function Os (line 8707) | function Os(e, t) {
  function ks (line 8710) | function ks(e, t) {
  function Ds (line 8718) | function Ds(e, t) {
  function Rs (line 8733) | function Rs(e, t) {
  function ws (line 8737) | function ws(e, t) {
  function xs (line 8762) | function xs(e, t) {
  function Ms (line 8788) | function Ms(e, t) {
  function Ps (line 8814) | function Ps(e, t) {
  function Bs (line 8848) | function Bs(e, t) {
  function Fs (line 8874) | function Fs(e, t) {
  function Us (line 8894) | function Us(e, t) {
  function Hs (line 8903) | function Hs(e, t) {
  function Gs (line 8915) | function Gs(e, t) {
  function js (line 8918) | function js(e, t) {
  function qs (line 8921) | function qs(e) {
  function r (line 8947) | function r(e) {
  function i (line 8959) | function i(e, t) {
  function Qs (line 9021) | function Qs(e, t) {
  function zs (line 9024) | function zs(e, t) {
  function Xs (line 9094) | function Xs(e) {
  function Zs (line 9097) | function Zs(e) {
  method createDocument (line 9105) | createDocument() {
  method createElement (line 9110) | createElement(e, t, n) {
  method appendChild (line 9121) | appendChild(e, t) {
  method insertBefore (line 9125) | insertBefore(e, t, n) {
  method setTemplateContent (line 9130) | setTemplateContent(e, t) {
  method setDocumentType (line 9134) | setDocumentType(e, t, n, r) {
  method setDocumentMode (line 9145) | setDocumentMode(e, t) {
  method detachNode (line 9149) | detachNode(e) {
  method insertText (line 9161) | insertText(e, t) {
  method insertTextBefore (line 9165) | insertTextBefore(e, t, n) {
  method adoptAttributes (line 9169) | adoptAttributes(e, t) {
  method getDocumentTypeNodeName (line 9186) | getDocumentTypeNodeName(e) {
  method getDocumentTypeNodePublicId (line 9189) | getDocumentTypeNodePublicId(e) {
  method getDocumentTypeNodeSystemId (line 9192) | getDocumentTypeNodeSystemId(e) {
  method setNodeSourceCodeLocation (line 9196) | setNodeSourceCodeLocation(e, t) {
  method updateNodeSourceCodeLocation (line 9200) | updateNodeSourceCodeLocation(e, t) {
  function ta (line 9210) | function ta(e, t, n, r) {
  function aa (line 9234) | function aa(e) {
  function oa (line 9237) | function oa(e) {
  function ca (line 9240) | function ca(e) {
  class la (line 9317) | class la {
    method constructor (line 9318) | constructor({ xmlMode: e = !1, decodeEntities: t = !0 }, n) {
    method reset (line 9338) | reset() {
    method write (line 9348) | write(e) {
    method end (line 9351) | end() {
    method pause (line 9354) | pause() {
    method resume (line 9357) | resume() {
    method getIndex (line 9360) | getIndex() {
    method getSectionStart (line 9363) | getSectionStart() {
    method stateText (line 9366) | stateText(e) {
    method stateSpecialStartSequence (line 9373) | stateSpecialStartSequence(e) {
    method stateInSpecialTag (line 9380) | stateInSpecialTag(e) {
    method stateCDATASequence (line 9400) | stateCDATASequence(e) {
    method fastForwardTo (line 9409) | fastForwardTo(e) {
    method stateInCommentLike (line 9414) | stateInCommentLike(e) {
    method isTagStartChar (line 9427) | isTagStartChar(e) {
    method startSpecial (line 9434) | startSpecial(e, t) {
    method stateBeforeTagName (line 9440) | stateBeforeTagName(e) {
    method stateInTagName (line 9456) | stateInTagName(e) {
    method stateBeforeClosingTagName (line 9463) | stateBeforeClosingTagName(e) {
    method stateInClosingTagName (line 9470) | stateInClosingTagName(e) {
    method stateAfterClosingTagName (line 9477) | stateAfterClosingTagName(e) {
    method stateBeforeAttributeName (line 9481) | stateBeforeAttributeName(e) {
    method stateInSelfClosingTag (line 9491) | stateInSelfClosingTag(e) {
    method stateInAttributeName (line 9500) | stateInAttributeName(e) {
    method stateAfterAttributeName (line 9507) | stateAfterAttributeName(e) {
    method stateBeforeAttributeValue (line 9519) | stateBeforeAttributeValue(e) {
    method handleInAttributeValue (line 9529) | handleInAttributeValue(e, t) {
    method stateInAttributeValueDoubleQuotes (line 9537) | stateInAttributeValueDoubleQuotes(e) {
    method stateInAttributeValueSingleQuotes (line 9540) | stateInAttributeValueSingleQuotes(e) {
    method stateInAttributeValueNoQuotes (line 9543) | stateInAttributeValueNoQuotes(e) {
    method stateBeforeDeclaration (line 9552) | stateBeforeDeclaration(e) {
    method stateInDeclaration (line 9557) | stateInDeclaration(e) {
    method stateInProcessingInstruction (line 9563) | stateInProcessingInstruction(e) {
    method stateBeforeComment (line 9569) | stateBeforeComment(e) {
    method stateInSpecialComment (line 9577) | stateInSpecialComment(e) {
    method stateBeforeSpecialS (line 9583) | stateBeforeSpecialS(e) {
    method stateBeforeEntity (line 9591) | stateBeforeEntity(e) {
    method stateInNamedEntity (line 9602) | stateInNamedEntity(e) {
    method emitNamedEntity (line 9624) | emitNamedEntity() {
    method stateBeforeNumericEntity (line 9638) | stateBeforeNumericEntity(e) {
    method emitNumericEntity (line 9643) | emitNumericEntity(e) {
    method stateInNumericEntity (line 9651) | stateInNumericEntity(e) {
    method stateInHexEntity (line 9658) | stateInHexEntity(e) {
    method allowLegacyEntity (line 9669) | allowLegacyEntity() {
    method cleanup (line 9672) | cleanup() {
    method shouldContinue (line 9682) | shouldContinue() {
    method parse (line 9685) | parse() {
    method finish (line 9780) | finish() {
    method handleTrailingData (line 9785) | handleTrailingData() {
    method emitPartial (line 9805) | emitPartial(e, t) {
    method emitCodePoint (line 9810) | emitCodePoint(e) {
  class va (line 9894) | class va {
    method constructor (line 9895) | constructor(e, t = {}) {
    method ontext (line 9916) | ontext(e, t) {
    method ontextentity (line 9922) | ontextentity(e) {
    method isVoidElement (line 9928) | isVoidElement(e) {
    method onopentagname (line 9931) | onopentagname(e, t) {
    method emitOpenTag (line 9936) | emitOpenTag(e) {
    method endOpenTag (line 9953) | endOpenTag(e) {
    method onopentagend (line 9961) | onopentagend(e) {
    method onclosetag (line 9964) | onclosetag(e, t) {
    method onselfclosingtag (line 9990) | onselfclosingtag(e) {
    method closeCurrentTag (line 9996) | closeCurrentTag(e) {
    method onattribname (line 10004) | onattribname(e, t) {
    method onattribdata (line 10009) | onattribdata(e, t) {
    method onattribentity (line 10012) | onattribentity(e) {
    method onattribend (line 10015) | onattribend(e, t) {
    method getInstructionName (line 10030) | getInstructionName(e) {
    method ondeclaration (line 10035) | ondeclaration(e, t) {
    method onprocessinginstruction (line 10044) | onprocessinginstruction(e, t) {
    method oncomment (line 10053) | oncomment(e, t, n) {
    method oncdata (line 10060) | oncdata(e, t, n) {
    method onend (line 10072) | onend() {
    method reset (line 10080) | reset() {
    method parseComplete (line 10096) | parseComplete(e) {
    method getSlice (line 10099) | getSlice(e, t) {
    method shiftBuffer (line 10106) | shiftBuffer() {
    method write (line 10109) | write(e) {
    method end (line 10115) | end(e) {
    method pause (line 10121) | pause() {
    method resume (line 10124) | resume() {
    method parseChunk (line 10129) | parseChunk(e) {
    method done (line 10132) | done(e) {
  function Ca (line 10145) | function Ca(e) {
  function Na (line 10152) | function Na(e, t) {
  function ba (line 10156) | function ba() {
  function Oa (line 10203) | function Oa() {}
  function ka (line 10204) | function ka(e) {
  function La (line 10208) | function La(e) {
  function Da (line 10219) | function Da(e) {
  function Ma (line 10299) | function Ma(e, t) {
  function Pa (line 10302) | function Pa(e, t) {
  class Ba (line 10305) | class Ba extends Error {
    method constructor (line 10306) | constructor(e) {
  function Fa (line 10313) | function Fa(e, t, n, r, i) {
  function f (line 10440) | function f(e) {
  function a (line 10644) | function a(e, t) {
  function o (line 10647) | function o(e) {
  function c (line 10650) | function c(e, t, n) {
  function u (line 10698) | function u(e) {
  function l (line 10701) | function l(e) {
  function h (line 10704) | function h(e) {
  function f (line 10707) | function f(e) {
  function p (line 10710) | function p(e) {
  function d (line 10723) | function d(e) {
    method constructor (line 38) | constructor() {
    method parentNode (line 41) | get parentNode() {
    method parentNode (line 44) | set parentNode(e) {
    method previousSibling (line 47) | get previousSibling() {
    method previousSibling (line 50) | set previousSibling(e) {
    method nextSibling (line 53) | get nextSibling() {
    method nextSibling (line 56) | set nextSibling(e) {
    method cloneNode (line 59) | cloneNode(e = !1) {
  function m (line 10726) | function m(e, t, n) {
    method constructor (line 64) | constructor(e) {
    method nodeValue (line 67) | get nodeValue() {
    method nodeValue (line 70) | set nodeValue(e) {
  function _ (line 10729) | function _(e) {
    method constructor (line 75) | constructor() {
    method nodeType (line 78) | get nodeType() {
  function Ha (line 10831) | function Ha() {
  function Ga (line 10834) | function Ga() {
  function Ya (line 10839) | function Ya(e) {
  function Qa (line 10857) | function Qa() {
  function za (line 10860) | function za() {
  function Xa (line 10885) | function Xa(e, t) {
  function Za (line 10888) | function Za() {}
  function lo (line 10954) | function lo() {}
  function ho (line 10955) | function ho() {
  function fo (line 10958) | function fo(e) {
  function po (line 10961) | function po(e, t, n, r) {
  function mo (line 10992) | function mo(e, t, n) {
  function _o (line 10999) | function _o(e) {
  function Eo (line 11007) | function Eo(e, t) {
  function To (line 11011) | function To() {
  function Ao (line 11020) | function Ao() {
  function n (line 11185) | function n() {}
  function Co (line 11239) | function Co(e) {
  function ko (line 11246) | function ko() {
  function Lo (line 11256) | function Lo() {
  function wo (line 11268) | function wo() {
  function n (line 11281) | function n() {
  function r (line 11285) | function r(e) {
  function s (line 11292) | function s(e, t, s) {
  function oc (line 11364) | function oc(e, t, n, r) {
  function e (line 11368) | function e(e, t) {
  function lc (line 11636) | function lc(e, t) {
  function hc (line 11658) | function hc(e, t, n) {
  function fc (line 11661) | function fc(e, t) {
  function pc (line 11664) | function pc(e, t) {
  function dc (line 11671) | function dc(e, t, n) {
  function e (line 11704) | function e() {
  function t (line 11724) | function t() {
  function Tc (line 11746) | function Tc(e, t) {
  function Ac (line 11768) | function Ac(e, t, n) {
  function gc (line 11771) | function gc(e, t) {
  function vc (line 11774) | function vc(e, t) {
  function yc (line 11781) | function yc(e, t, n) {
  function t (line 11785) | function t() {
  function t (line 11824) | function t() {
  function t (line 11847) | function t() {
  function t (line 11894) | function t() {
  function Nu (line 11964) | function Nu(e, t, n) {
  function Iu (line 12057) | function Iu(e, t) {
  function r (line 12119) | function r() {
  function Du (line 12790) | function Du() {
  function Ru (line 12793) | function Ru(e, t) {
  function wu (line 12800) | function wu(e, t, n) {
  function xu (line 12833) | function xu(e, t) {
  function Mu (line 12836) | function Mu(e, t, n) {
  function Pu (line 12849) | function Pu(e, t) {
  function e (line 12915) | function e(e, t) {
  function Gu (line 12956) | function Gu(e) {
  function ju (line 12959) | function ju(e) {
  function qu (line 12963) | function qu(e) {
  function o (line 13083) | function o(e, t) {
  function Ku (line 13122) | function Ku(e, t) {
  function r (line 13153) | function r() {
  function n (line 13933) | function n(e, t) {
  function r (line 13936) | function r(e) {
  function i (line 13939) | function i(e) {
  function s (line 13943) | function s(e) {
  function a (line 13952) | function a(e) {
  function o (line 13961) | function o(e) {
  function Ju (line 14238) | function Ju(e, t) {
  function nl (line 14250) | function nl() {
  function rl (line 14266) | function rl(e) {
  function il (line 14284) | function il(e) {
  function n (line 14302) | function n(e) {
  function al (line 14328) | function al(e, t) {
  function cl (line 14341) | function cl(e, t) {
  function r (line 14350) | function r() {
  function ll (line 14365) | function ll(e, t) {
  function r (line 14374) | function r(t) {
  function fl (line 14388) | function fl(e, t) {
  function pl (line 14391) | function pl(e, t) {
  function t (line 14400) | function t(t, n) {
  function t (line 14438) | function t(t) {
  function Al (line 14594) | function Al(e, t) {
  function gl (line 14597) | function gl(e, t) {
  function Ol (line 14611) | function Ol(e, t, n) {
  function t (line 14629) | function t() {
  function a (line 14749) | function a(e, n) {
  function n (line 14770) | function n(e, t) {
  function t (line 14815) | function t() {
  function t (line 14870) | function t() {
  function Pl (line 14965) | function Pl(e, t) {
  class lh (line 15060) | class lh {
    method constructor (line 15061) | constructor(e) {
    method parse (line 15064) | parse(e) {
    method init (line 15084) | init() {
    method $utils (line 15095) | $utils() {
    method isValid (line 15098) | isValid() {
    method isSame (line 15101) | isSame(e, t) {
    method isAfter (line 15104) | isAfter(e, t) {
    method isBefore (line 15107) | isBefore(e, t) {
    method $g (line 15110) | $g(e, t, n) {
    method unix (line 15113) | unix() {
    method valueOf (line 15116) | valueOf() {
    method startOf (line 15119) | startOf(e, t) {
    method endOf (line 15153) | endOf(e) {
    method $set (line 15156) | $set(e, t) {
    method set (line 15176) | set(e, t) {
    method get (line 15179) | get(e) {
    method add (line 15182) | add(e, t) {
    method subtract (line 15198) | subtract(e, t) {
    method format (line 15201) | format(e) {
    method utcOffset (line 15239) | utcOffset() {
    method diff (line 15242) | diff(e, t, n) {
    method daysInMonth (line 15260) | daysInMonth() {
    method $locale (line 15263) | $locale() {
    method locale (line 15266) | locale(e, t) {
    method clone (line 15270) | clone() {
    method toDate (line 15273) | toDate() {
    method toJSON (line 15276) | toJSON() {
    method toISOString (line 15279) | toISOString() {
    method toString (line 15282) | toString() {
  function r (line 15310) | function r(e) {
  function i (line 15313) | function i(e) {
  function s (line 15332) | function s(e) {
  function Nt (line 15751) | function Nt(e, t, n) {
  function bt (line 15764) | function bt(e, t, n, r) {
  function It (line 15771) | function It(e, t) {
  function kt (line 15775) | function kt(e, t) {
  function Lt (line 15779) | function Lt(e, t) {
  function Dt (line 15786) | function Dt(e, t) {
  function Rt (line 15789) | function Rt(e, t, n) {
  function wt (line 15793) | function wt(e, t) {
  function xt (line 15797) | function xt(e, t) {
  function Mt (line 15801) | function Mt(e, t, n, r) {
  function Pt (line 15807) | function Pt(e, t, n, r) {
  function Bt (line 15812) | function Bt(e, t) {
  function Ut (line 15817) | function Ut(e, t, n) {
  function Ht (line 15826) | function Ht(e, t, n, r) {
  function Gt (line 15830) | function Gt(e, t, n) {
  function jt (line 15838) | function jt(e, t, n, r) {
  function qt (line 15842) | function qt(e) {
  function Yt (line 15845) | function Yt(e, t) {
  function Kt (line 15849) | function Kt(e) {
  function Wt (line 15854) | function Wt(e) {
  function Vt (line 15859) | function Vt(e, t, n, r, i) {
  function $t (line 15867) | function $t(e, t) {
  function Qt (line 15874) | function Qt(e, t) {
  function zt (line 15878) | function zt(e) {
  function Xt (line 15881) | function Xt(e) {
  function Zt (line 15886) | function Zt(e, t) {
  function Jt (line 15891) | function Jt(e, t) {
  function en (line 15894) | function en(e, t) {
  function tn (line 15898) | function tn(e, t) {
  function sn (line 16095) | function sn(e) {
  function an (line 16098) | function an(e) {
  function on (line 16101) | function on(e) {
  function cn (line 16111) | function cn(e, t) {
  function un (line 16116) | function un(e, t) {
  function ln (line 16123) | function ln(e) {
  function fn (line 16133) | function fn(e) {
  function pn (line 16143) | function pn(e) {
  function dn (line 16150) | function dn(e) {
  function Gn (line 16231) | function Gn(e) {
  function e (line 16239) | function e() {}
  function qn (line 16244) | function qn() {}
  function Yn (line 16245) | function Yn(e, t) {
  function Kn (line 16252) | function Kn(e) {
  function Wn (line 16261) | function Wn(e) {
  function Vn (line 16269) | function Vn(e) {
  function $n (line 16277) | function $n(e) {
  function Qn (line 16285) | function Qn(e) {
  function zn (line 16290) | function zn(e) {
  function Xn (line 16293) | function Xn(e, t) {
  function Zn (line 16312) | function Zn(e) {
  function tr (line 16316) | function tr(e, t, r) {
  function nr (line 16319) | function nr(e, t, r) {
  function rr (line 16323) | function rr(e, t) {
  function ir (line 16327) | function ir(e, t, n, r) {
  function sr (line 16335) | function sr(e, t) {
  function ar (line 16338) | function ar(e, t, n) {
  function or (line 16343) | function or(e, t) {
  function cr (line 16347) | function cr(e, t, r) {
  function ur (line 16350) | function ur(e, t, r, i, s, a) {
  function lr (line 16447) | function lr(e, t, r) {
  function hr (line 16458) | function hr(e, t, i) {
  function fr (line 16464) | function fr(e, t, n, r) {
  function _r (line 16577) | function _r(e, t, r) {
  function Er (line 16587) | function Er(e, t) {
    method constructor (line 3215) | constructor(e) {
    method col (line 3231) | get col() {
    method offset (line 3234) | get offset() {
    method getError (line 3237) | getError(e) {
    method _err (line 3241) | _err(e) {
    method _addGap (line 3246) | _addGap() {
    method _processSurrogate (line 3249) | _processSurrogate(e) {
    method willDropParsedChunk (line 3256) | willDropParsedChunk() {
    method dropParsedChunk (line 3259) | dropParsedChunk() {
    method write (line 3268) | write(e, t) {
    method insertHtmlAtCurrentPos (line 3271) | insertHtmlAtCurrentPos(e) {
    method startsWith (line 3275) | startsWith(e, t) {
    method peek (line 3281) | peek(e) {
    method advance (line 3288) | advance() {
    method _checkForProblematicCharacters (line 3310) | _checkForProblematicCharacters(e) {
    method retreat (line 3313) | retreat(e) {
  function Tr (line 16596) | function Tr(e, t, n, r, i) {
  function vr (line 16607) | function vr(e, t) {
  function yr (line 16610) | function yr(e, t) {
  function Sr (line 16613) | function Sr(e, t) {
  function Cr (line 16618) | function Cr(e, t) {
  function Nr (line 16622) | function Nr(e, t, n) {
  function br (line 16625) | function br(e) {
  function Ir (line 16645) | function Ir(e, t) {
  function Or (line 16648) | function Or(e, t) {
  function kr (line 16651) | function kr(e, t) {
  function Lr (line 16654) | function Lr(e, t, r) {
  function Dr (line 16678) | function Dr(e, t, r) {
  function Rr (line 16681) | function Rr(e) {
  function wr (line 16684) | function wr(e, t, r, i, s) {
  function xr (line 16785) | function xr(e, t, r, i) {
  function Mr (line 16808) | function Mr(e) {
  function Pr (line 16818) | function Pr(e) {
  function Br (line 16829) | function Br(e) {
  function Ur (line 16836) | function Ur(e, t) {
  function Hr (line 16839) | function Hr(e, t) {
  function Gr (line 16849) | function Gr(e) {
  function jr (line 16857) | function jr(e, t) {
  function qr (line 16865) | function qr(e, t, r, i, s) {
  function Yr (line 16900) | function Yr(e, t) {
  function Kr (line 16904) | function Kr(e, t, n) {
  function Wr (line 16943) | function Wr(e, t, n) {
  function Vr (line 16951) | function Vr(e, t, n, r) {
  function $r (line 16961) | function $r(e, t) {
  function Qr (line 16968) | function Qr(e, t) {
  function zr (line 16971) | function zr(e, t) {
  function Xr (line 16976) | function Xr(e, t) {
  function ei (line 16979) | function ei(e, t, r, i) {
  function ii (line 17006) | function ii(e, t, n) {
  function ai (line 17015) | function ai(e, t, n) {
    method constructor (line 4391) | constructor(e, t) {
    method _err (line 4409) | _err(e) {
    method getCurrentLocation (line 4413) | getCurrentLocation(e) {
    method _runParsingLoop (line 4425) | _runParsingLoop() {
    method pause (line 4435) | pause() {
    method resume (line 4438) | resume(e) {
    method write (line 4442) | write(e, t, n) {
    method insertHtmlAtCurrentPos (line 4445) | insertHtmlAtCurrentPos(e) {
    method _ensureHibernation (line 4448) | _ensureHibernation() {
    method _consume (line 4451) | _consume() {
    method _unconsume (line 4454) | _unconsume(e) {
    method _reconsumeInState (line 4457) | _reconsumeInState(e, t) {
    method _advanceBy (line 4460) | _advanceBy(e) {
    method _consumeSequenceIfMatch (line 4464) | _consumeSequenceIfMatch(e, t) {
    method _createStartTagToken (line 4467) | _createStartTagToken() {
    method _createEndTagToken (line 4478) | _createEndTagToken() {
    method _createCommentToken (line 4489) | _createCommentToken(e) {
    method _createDoctypeToken (line 4492) | _createDoctypeToken(e) {
    method _createCharacterToken (line 4502) | _createCharacterToken(e, t) {
    method _createAttr (line 4505) | _createAttr(e) {
    method _leaveAttrName (line 4508) | _leaveAttrName() {
    method _leaveAttrValue (line 4520) | _leaveAttrValue() {
    method prepareToken (line 4526) | prepareToken(e) {
    method emitCurrentTagToken (line 4535) | emitCurrentTagToken() {
    method emitCurrentComment (line 4546) | emitCurrentComment(e) {
    method emitCurrentDoctype (line 4549) | emitCurrentDoctype(e) {
    method _emitCurrentCharacterToken (line 4552) | _emitCurrentCharacterToken(e) {
    method _emitEOFToken (line 4574) | _emitEOFToken() {
    method _appendCharToCurrentCharacterToken (line 4581) | _appendCharToCurrentCharacterToken(e, t) {
    method _emitCodePoint (line 4590) | _emitCodePoint(e) {
    method _emitChars (line 4594) | _emitChars(e) {
    method _matchNamedCharacterReference (line 4597) | _matchNamedCharacterReference(e) {
    method _isCharacterReferenceInAttribute (line 4628) | _isCharacterReferenceInAttribute() {
    method _flushCodePointConsumedAsCharacterReference (line 4635) | _flushCodePointConsumedAsCharacterReference(e) {
    method _callState (line 4640) | _callState(e) {
    method _stateData (line 4883) | _stateData(e) {
    method _stateRcdata (line 4901) | _stateRcdata(e) {
    method _stateRawtext (line 4919) | _stateRawtext(e) {
    method _stateScriptData (line 4934) | _stateScriptData(e) {
    method _statePlaintext (line 4949) | _statePlaintext(e) {
    method _stateTagOpen (line 4961) | _stateTagOpen(e) {
    method _stateEndTagOpen (line 4987) | _stateEndTagOpen(e) {
    method _stateTagName (line 5004) | _stateTagName(e) {
    method _stateRcdataLessThanSign (line 5029) | _stateRcdataLessThanSign(e) {
    method _stateRcdataEndTagOpen (line 5034) | _stateRcdataEndTagOpen(e) {
    method handleSpecialEndTag (line 5039) | handleSpecialEndTag(e) {
    method _stateRcdataEndTagName (line 5059) | _stateRcdataEndTagName(e) {
    method _stateRawtextLessThanSign (line 5062) | _stateRawtextLessThanSign(e) {
    method _stateRawtextEndTagOpen (line 5067) | _stateRawtextEndTagOpen(e) {
    method _stateRawtextEndTagName (line 5072) | _stateRawtextEndTagName(e) {
    method _stateScriptDataLessThanSign (line 5075) | _stateScriptDataLessThanSign(e) {
    method _stateScriptDataEndTagOpen (line 5087) | _stateScriptDataEndTagOpen(e) {
    method _stateScriptDataEndTagName (line 5092) | _stateScriptDataEndTagName(e) {
    method _stateScriptDataEscapeStart (line 5095) | _stateScriptDataEscapeStart(e) {
    method _stateScriptDataEscapeStartDash (line 5100) | _stateScriptDataEscapeStartDash(e) {
    method _stateScriptDataEscaped (line 5105) | _stateScriptDataEscaped(e) {
    method _stateScriptDataEscapedDash (line 5123) | _stateScriptDataEscapedDash(e) {
    method _stateScriptDataEscapedDashDash (line 5141) | _stateScriptDataEscapedDashDash(e) {
    method _stateScriptDataEscapedLessThanSign (line 5162) | _stateScriptDataEscapedLessThanSign(e) {
    method _stateScriptDataEscapedEndTagOpen (line 5171) | _stateScriptDataEscapedEndTagOpen(e) {
    method _stateScriptDataEscapedEndTagName (line 5176) | _stateScriptDataEscapedEndTagName(e) {
    method _stateScriptDataDoubleEscapeStart (line 5180) | _stateScriptDataDoubleEscapeStart(e) {
    method _stateScriptDataDoubleEscaped (line 5187) | _stateScriptDataDoubleEscaped(e) {
    method _stateScriptDataDoubleEscapedDash (line 5205) | _stateScriptDataDoubleEscapedDash(e) {
    method _stateScriptDataDoubleEscapedDashDash (line 5223) | _stateScriptDataDoubleEscapedDashDash(e) {
    method _stateScriptDataDoubleEscapedLessThanSign (line 5244) | _stateScriptDataDoubleEscapedLessThanSign(e) {
    method _stateScriptDataDoubleEscapeEnd (line 5249) | _stateScriptDataDoubleEscapeEnd(e) {
    method _stateBeforeAttributeName (line 5258) | _stateBeforeAttributeName(e) {
    method _stateAttributeName (line 5279) | _stateAttributeName(e) {
    method _stateAfterAttributeName (line 5305) | _stateAfterAttributeName(e) {
    method _stateBeforeAttributeValue (line 5328) | _stateBeforeAttributeValue(e) {
    method _stateAttributeValueDoubleQuoted (line 5348) | _stateAttributeValueDoubleQuoted(e) {
    method _stateAttributeValueSingleQuoted (line 5366) | _stateAttributeValueSingleQuoted(e) {
    method _stateAttributeValueUnquoted (line 5384) | _stateAttributeValueUnquoted(e) {
    method _stateAfterAttributeValueQuoted (line 5416) | _stateAfterAttributeValueQuoted(e) {
    method _stateSelfClosingStartTag (line 5439) | _stateSelfClosingStartTag(e) {
    method _stateBogusComment (line 5453) | _stateBogusComment(e) {
    method _stateMarkupDeclarationOpen (line 5469) | _stateMarkupDeclarationOpen(e) {
    method _stateCommentStart (line 5487) | _stateCommentStart(e) {
    method _stateCommentStartDash (line 5502) | _stateCommentStartDash(e) {
    method _stateComment (line 5518) | _stateComment(e) {
    method _stateCommentLessThanSign (line 5537) | _stateCommentLessThanSign(e) {
    method _stateCommentLessThanSignBang (line 5550) | _stateCommentLessThanSignBang(e) {
    method _stateCommentLessThanSignBangDash (line 5555) | _stateCommentLessThanSignBangDash(e) {
    method _stateCommentLessThanSignBangDashDash (line 5560) | _stateCommentLessThanSignBangDashDash(e) {
    method _stateCommentEndDash (line 5565) | _stateCommentEndDash(e) {
    method _stateCommentEnd (line 5578) | _stateCommentEnd(e) {
    method _stateCommentEndBang (line 5597) | _stateCommentEndBang(e) {
    method _stateDoctype (line 5613) | _stateDoctype(e) {
    method _stateBeforeDoctypeName (line 5636) | _stateBeforeDoctypeName(e) {
    method _stateDoctypeName (line 5664) | _stateDoctypeName(e) {
    method _stateAfterDoctypeName (line 5686) | _stateAfterDoctypeName(e) {
    method _stateAfterDoctypePublicKeyword (line 5712) | _stateAfterDoctypePublicKeyword(e) {
    method _stateBeforeDoctypePublicIdentifier (line 5747) | _stateBeforeDoctypePublicIdentifier(e) {
    method _stateDoctypePublicIdentifierDoubleQuoted (line 5777) | _stateDoctypePublicIdentifierDoubleQuoted(e) {
    method _stateDoctypePublicIdentifierSingleQuoted (line 5799) | _stateDoctypePublicIdentifierSingleQuoted(e) {
    method _stateAfterDoctypePublicIdentifier (line 5821) | _stateAfterDoctypePublicIdentifier(e) {
    method _stateBetweenDoctypePublicAndSystemIdentifiers (line 5853) | _stateBetweenDoctypePublicAndSystemIdentifiers(e) {
    method _stateAfterDoctypeSystemKeyword (line 5880) | _stateAfterDoctypeSystemKeyword(e) {
    method _stateBeforeDoctypeSystemIdentifier (line 5915) | _stateBeforeDoctypeSystemIdentifier(e) {
    method _stateDoctypeSystemIdentifierDoubleQuoted (line 5945) | _stateDoctypeSystemIdentifierDoubleQuoted(e) {
    method _stateDoctypeSystemIdentifierSingleQuoted (line 5967) | _stateDoctypeSystemIdentifierSingleQuoted(e) {
    method _stateAfterDoctypeSystemIdentifier (line 5989) | _stateAfterDoctypeSystemIdentifier(e) {
    method _stateBogusDoctype (line 6009) | _stateBogusDoctype(e) {
    method _stateCdataSection (line 6022) | _stateCdataSection(e) {
    method _stateCdataSectionBracket (line 6034) | _stateCdataSectionBracket(e) {
    method _stateCdataSectionEnd (line 6039) | _stateCdataSectionEnd(e) {
    method _stateCharacterReference (line 6051) | _stateCharacterReference(e) {
    method _stateNamedCharacterReference (line 6058) | _stateNamedCharacterReference(e) {
    method _stateAmbiguousAmpersand (line 6066) | _stateAmbiguousAmpersand(e) {
    method _stateNumericCharacterReference (line 6072) | _stateNumericCharacterReference(e) {
    method _stateHexademicalCharacterReferenceStart (line 6083) | _stateHexademicalCharacterReferenceStart(e) {
    method _stateHexademicalCharacterReference (line 6094) | _stateHexademicalCharacterReference(e) {
    method _stateDecimalCharacterReference (line 6107) | _stateDecimalCharacterReference(e) {
    method _stateNumericCharacterReferenceEnd (line 6116) | _stateNumericCharacterReferenceEnd(e) {
  function oi (line 17028) | function oi(e, t, r, i) {
  function ci (line 17055) | function ci(e, t) {
  function ui (line 17064) | function ui(e) {
  function li (line 17067) | function li(e) {
  function hi (line 17081) | function hi(e, t, n) {
  function fi (line 17105) | function fi(e, t) {
  function pi (line 17108) | function pi(e, t, n, r) {
  function di (line 17111) | function di(e, t, n, r) {
  function mi (line 17115) | function mi(e, t) {
    method currentTmplContentOrNode (line 6160) | get currentTmplContentOrNode() {
    method constructor (line 6163) | constructor(e, t, n) {
    method _indexOf (line 6173) | _indexOf(e) {
    method _isInTemplate (line 6176) | _isInTemplate() {
    method _updateCurrentElement (line 6179) | _updateCurrentElement() {
    method push (line 6182) | push(e, t) {
    method pop (line 6191) | pop() {
    method replace (line 6198) | replace(e, t) {
    method insertAfter (line 6201) | insertAfter(e, t, n) {
    method popUntilTagNamePopped (line 6209) | popUntilTagNamePopped(e) {
    method shortenToLength (line 6217) | shortenToLength(e) {
    method popUntilElementPopped (line 6226) | popUntilElementPopped(e) {
    method popUntilPopped (line 6229) | popUntilPopped(e, t) {
    method popUntilNumberedHeaderPopped (line 6232) | popUntilNumberedHeaderPopped() {
    method popUntilTableCellPopped (line 6235) | popUntilTableCellPopped() {
    method popAllUpToHtmlElement (line 6238) | popAllUpToHtmlElement() {
    method _indexOfTagNames (line 6241) | _indexOfTagNames(e, t) {
    method clearBackTo (line 6246) | clearBackTo(e, t) {
    method clearBackToTableContext (line 6249) | clearBackToTableContext() {
    method clearBackToTableBodyContext (line 6252) | clearBackToTableBodyContext() {
    method clearBackToTableRowContext (line 6255) | clearBackToTableRowContext() {
    method remove (line 6258) | remove(e) {
    method tryPeekProperlyNestedBodyElement (line 6269) | tryPeekProperlyNestedBodyElement() {
    method contains (line 6272) | contains(e) {
    method getCommonAncestor (line 6275) | getCommonAncestor(e) {
    method isRootHtmlElementCurrent (line 6278) | isRootHtmlElementCurrent() {
    method hasInScope (line 6281) | hasInScope(e) {
    method hasNumberedHeaderInScope (line 6290) | hasNumberedHeaderInScope() {
    method hasInListItemScope (line 6299) | hasInListItemScope(e) {
    method hasInButtonScope (line 6308) | hasInButtonScope(e) {
    method hasInTableScope (line 6317) | hasInTableScope(e) {
    method hasTableBodyContextInTableScope (line 6327) | hasTableBodyContextInTableScope() {
    method hasInSelectScope (line 6337) | hasInSelectScope(e) {
    method generateImpliedEndTags (line 6347) | generateImpliedEndTags() {
    method generateImpliedEndTagsThoroughly (line 6350) | generateImpliedEndTagsThoroughly() {
    method generateImpliedEndTagsWithExclusion (line 6353) | generateImpliedEndTagsWithExclusion(e) {
  function _i (line 17125) | function _i(e, t, n) {
  function Ei (line 17132) | function Ei(e, t, r) {
  function Ti (line 17139) | function Ti(e) {
    method constructor (line 6362) | constructor(e) {
    method _getNoahArkConditionCandidates (line 6365) | _getNoahArkConditionCandidates(e, t) {
    method _ensureNoahArkCondition (line 6381) | _ensureNoahArkCondition(e) {
    method insertMarker (line 6395) | insertMarker() {
    method pushElement (line 6398) | pushElement(e, t) {
    method insertElementAfterBookmark (line 6401) | insertElementAfterBookmark(e, t) {
    method removeEntry (line 6405) | removeEntry(e) {
    method clearToLastMarker (line 6408) | clearToLastMarker() {
    method getElementEntryInScopeWithTagName (line 6412) | getElementEntryInScopeWithTagName(e) {
    method getElementEntry (line 6416) | getElementEntry(e) {
  function Ai (line 17142) | function Ai(e) {
  function gi (line 17145) | function gi(e, t) {
  function yi (line 17149) | function yi(e, t, r) {
  function Ci (line 17158) | function Ci(e, t) {
  function Ni (line 17161) | function Ni(e) {
  function bi (line 17165) | function bi(e, t) {
  function Ii (line 17168) | function Ii(e, t) {
  function Oi (line 17183) | function Oi(e, t, n, r) {
  function ki (line 17193) | function ki(e, t, n, r) {
  function Li (line 17211) | function Li(e, t) {
  function Di (line 17217) | function Di(e, t, r, i) {
  function Ri (line 17227) | function Ri(e, t) {
  function wi (line 17234) | function wi(e) {
  function xi (line 17248) | function xi(e, t) {
  function Mi (line 17257) | function Mi(e) {
  function Pi (line 17266) | function Pi(e) {
  function Bi (line 17273) | function Bi(e) {
  function Fi (line 17278) | function Fi(e) {
  function Ui (line 17304) | function Ui(e) {
  function Hi (line 17319) | function Hi(e) {
  function Gi (line 17347) | function Gi(e, t, r, i, s, a, o, c, l, h) {
  function ji (line 17384) | function ji(e, t) {
  function qi (line 17396) | function qi(e, t) {
  function Yi (line 17408) | function Yi(e) {
  function Ki (line 17421) | function Ki(e, t) {
  function Wi (line 17429) | function Wi(e) {
  function Vi (line 17443) | function Vi(e) {
  function $i (line 17448) | function $i(e, t, r, i, s, a, u, l, h, f) {
    method constructor (line 6802) | constructor(e, t, n = null, r = null) {
    method parse (line 6829) | static parse(e, t) {
    method getFragmentParser (line 6832) | static getFragmentParser(e, t) {
    method getFragment (line 6846) | getFragment() {
    method _err (line 6851) | _err(e, t, n) {
    method onItemPush (line 6864) | onItemPush(e, t, n) {
    method onItemPop (line 6869) | onItemPop(e, t) {
    method _setContextModes (line 6883) | _setContextModes(e, t) {
    method _switchToTextParsing (line 6887) | _switchToTextParsing(e, t) {
    method switchToPlaintextParsing (line 6893) | switchToPlaintextParsing() {
    method _getAdjustedCurrentElement (line 6896) | _getAdjustedCurrentElement() {
    method _findFormInFragmentContext (line 6899) | _findFormInFragmentContext() {
    method _initTokenizerForFragmentParsing (line 6909) | _initTokenizerForFragmentParsing() {
    method _setDocumentType (line 6931) | _setDocumentType(e) {
    method _attachElementToTree (line 6940) | _attachElementToTree(e, t) {
    method _appendElement (line 6952) | _appendElement(e, t) {
    method _insertElement (line 6955) | _insertElement(e, t) {
    method _insertFakeElement (line 6960) | _insertFakeElement(e, t) {
    method _insertTemplate (line 6965) | _insertTemplate(e) {
    method _insertFakeRootElement (line 6973) | _insertFakeRootElement() {
    method _appendCommentNode (line 6979) | _appendCommentNode(e, t) {
    method _insertCharacters (line 6984) | _insertCharacters(e) {
    method _adoptNodes (line 7002) | _adoptNodes(e, t) {
    method _setEndLocation (line 7006) | _setEndLocation(e, t) {
    method shouldProcessStartTagTokenInForeignContent (line 7018) | shouldProcessStartTagTokenInForeignContent(e) {
    method _processToken (line 7032) | _processToken(e) {
    method _isIntegrationPoint (line 7059) | _isIntegrationPoint(e, t, n) {
    method _reconstructActiveFormattingElements (line 7062) | _reconstructActiveFormattingElements() {
    method _closeTableCell (line 7075) | _closeTableCell() {
    method _closePElement (line 7081) | _closePElement() {
    method _resetInsertionMode (line 7084) | _resetInsertionMode() {
    method _resetInsertionModeForSelect (line 7118) | _resetInsertionModeForSelect(e) {
    method _isElementCausesFosterParenting (line 7127) | _isElementCausesFosterParenting(e) {
    method _shouldFosterParentOnInsertion (line 7130) | _shouldFosterParentOnInsertion() {
    method _findFosterParentingLocation (line 7133) | _findFosterParentingLocation() {
    method _fosterParentElement (line 7148) | _fosterParentElement(e) {
    method _isSpecialElement (line 7154) | _isSpecialElement(e, t) {
    method onCharacter (line 7157) | onCharacter(e) {
    method onNullCharacter (line 7211) | onNullCharacter(e) {
    method onComment (line 7254) | onComment(e) {
    method onDoctype (line 7293) | onDoctype(e) {
    method onStartTag (line 7330) | onStartTag(e) {
    method _processStartTag (line 7336) | _processStartTag(e) {
    method _startTagOutsideForeignContent (line 7363) | _startTagOutsideForeignContent(e) {
    method onEndTag (line 7593) | onEndTag(e) {
    method _endTagOutsideForeignContent (line 7613) | _endTagOutsideForeignContent(e) {
    method onEof (line 7824) | onEof(e) {
    method onWhitespaceCharacter (line 7877) | onWhitespaceCharacter(e) {
  function Qi (line 17456) | function Qi(e) {
  function Xi (line 17475) | function Xi(e) {
  function Zi (line 17498) | function Zi(e, t, i, h, f, p, d, m) {
  function Ji (line 17580) | function Ji(e, t, r, i) {
  function es (line 17583) | function es(e, t, r, i, s, a) {
  function ts (line 17586) | function ts(e) {
  function ns (line 17589) | function ns(e, t, r, i, s, a) {
  function rs (line 17624) | function rs(e) {
  function is (line 17627) | function is(e) {
  function ss (line 17630) | function ss(e) {
  function os (line 17638) | function os(e) {
  function cs (line 17646) | function cs(e) {
  function us (line 17649) | function us() {
  function ls (line 17653) | function ls(e, t) {
  function hs (line 17664) | function hs(e) {
  function fs (line 17672) | function fs(e, t) {
  function _s (line 17698) | function _s(e, t, n) {
  function Es (line 17706) | function Es(e) {
  function Ts (line 17709) | function Ts(e) {
  function As (line 17712) | function As(e, t) {
  function gs (line 17722) | function gs(e, t, n) {
  function vs (line 17730) | function vs(e, t) {
  function ys (line 17744) | function ys(e) {
  function Cs (line 17772) | function Cs(e) {
  function Ns (line 17776) | function Ns(e) {
  function bs (line 17779) | function bs(e, t) {
  function Is (line 17784) | function Is(e, t, r) {
  function Os (line 17794) | function Os(e, t) {
  function ks (line 17797) | function ks(e, t) {
  function ws (line 17807) | function ws(e, t, n) {
  function xs (line 17839) | function xs(e) {
  function Ms (line 17851) | function Ms(e, t) {
  function Bs (line 17881) | function Bs(e) {
  function Fs (line 17885) | function Fs(e) {
  function Us (line 17896) | function Us(e) {
  function qs (line 17905) | function qs(e, t, n) {
  function Ys (line 17909) | function Ys(e, t, r) {
  function Ks (line 17918) | function Ks(e) {
  function Ws (line 17921) | function Ws(e) {
  function zs (line 17924) | function zs(e) {
  function Zs (line 17928) | function Zs(e, t) {
  function ea (line 17970) | function ea(e) {
  function ia (line 17984) | function ia(e) {
  function sa (line 17996) | function sa(e, t) {
  function fa (line 18025) | function fa(e) {
  function pa (line 18028) | function pa(e, t) {
  function s (line 18032) | function s(t) {
  function Ta (line 18050) | function Ta(e, t) {
  function Aa (line 18053) | function Aa(e, t) {
  function Sa (line 18080) | function Sa(e, t) {
  function Ia (line 18103) | function Ia(e, t, r) {
  function Oa (line 18106) | function Oa(e, t) {
  function Da (line 18126) | function Da(e, t, i) {
  function xa (line 18194) | function xa(e, t) {
  function Ma (line 18204) | function Ma(e) {
  function Ha (line 18240) | function Ha(e, t) {
  function Wa (line 18262) | function Wa(e) {
  function Va (line 18265) | function Va(e) {
  function za (line 18274) | function za(e) {
  function Xa (line 18283) | function Xa(e) {
  function Za (line 18286) | function Za(e) {
  function Ja (line 18289) | function Ja(e) {
  function eo (line 18292) | function eo(e) {
  function to (line 18296) | function to(e) {
  function ro (line 18304) | function ro(e) {
  function io (line 18307) | function io(e) {
  function oo (line 18326) | function oo(e) {
  function co (line 18329) | function co(e) {
  function fo (line 18341) | function fo(e) {
  function po (line 18354) | function po(e) {
  function mo (line 18365) | function mo(e) {
  function _o (line 18369) | function _o(e) {
  function Eo (line 18372) | function Eo(e) {
  function To (line 18384) | function To(e) {
  function Ao (line 18387) | function Ao(e) {
  function Io (line 18420) | function Io(e, t, r) {
  function Oo (line 18423) | function Oo(e, t) {
  function Ro (line 18434) | function Ro(e) {
  function wo (line 18437) | function wo(e) {
  function Fo (line 18482) | function Fo(e, t) {
  function Go (line 18496) | function Go(e) {
  function qo (line 18502) | function qo(e) {
  function Yo (line 18505) | function Yo(e) {
  function Zo (line 18525) | function Zo(e, t, r) {
  function tc (line 18556) | function tc(e) {
  function ic (line 18563) | function ic(e) {
  function sc (line 18566) | function sc(e) {
  function cc (line 18579) | function cc(e, t, n) {
  function uc (line 18608) | function uc() {}
  function pc (line 18612) | function pc(e) {
  function _c (line 18623) | function _c() {
  function Ec (line 18626) | function Ec() {
  function h (line 19725) | function h(e) {
  function r (line 19906) | function r() {
  function e (line 19922) | function e() {}
  function i (line 20157) | function i(e) {
  function r (line 20198) | function r(e, n, r) {
  function r (line 20247) | function r(e, n, r) {
  function u (line 20419) | function u(e, t, n, r, i, s, a) {
  function l (line 20422) | function l(e, t, n, r, i, s, a) {
  function h (line 20425) | function h(e, t, n, r, i, s, a) {
  function f (line 20428) | function f(e, t, n, r, i, s, a) {
  function n (line 20509) | function n(e) {
  function o (line 20626) | function o() {
  function m (line 21183) | function m(e, t, n) {
    method constructor (line 64) | constructor(e) {
    method nodeValue (line 67) | get nodeValue() {
    method nodeValue (line 70) | set nodeValue(e) {
  function E (line 21186) | function E(e, t, n) {
    method constructor (line 83) | constructor() {
    method nodeType (line 86) | get nodeType() {
  function A (line 21189) | function A(e, t) {
    method constructor (line 99) | constructor(e) {
    method firstChild (line 102) | get firstChild() {
    method lastChild (line 106) | get lastChild() {
    method childNodes (line 109) | get childNodes() {
    method childNodes (line 112) | set childNodes(e) {
  function n (line 21373) | function n(t, n, r) {
  function e (line 21526) | function e(e) {
  function t (line 21537) | function t(e, t, n, r) {
  function t (line 21589) | function t(e) {
  function r (line 21604) | function r(e) {
  function f (line 22469) | function f(e, t) {
  function p (line 22472) | function p(e, t) {
  function s (line 22527) | function s() {
  function c (line 22619) | function c() {
  function c (line 22728) | function c() {
  function r (line 22785) | function r() {
  function h (line 22811) | function h(t, n, r, s) {
  function Th (line 22850) | function Th(e, t) {
  function Ah (line 22853) | function Ah(e) {
  function gh (line 22856) | function gh(e, t) {

FILE: resources/t3Catopen/crypto-js.js
  function F (line 87) | function F() {}
  function swapEndian (line 1271) | function swapEndian(word) {
  function parseLoop (line 1376) | function parseLoop(base64Str, base64StrLength, reverseMap) {
  function parseLoop (line 1497) | function parseLoop(base64Str, base64StrLength, reverseMap) {
  function FF (line 1702) | function FF(a, b, c, d, x, s, t) {
  function GG (line 1707) | function GG(a, b, c, d, x, s, t) {
  function HH (line 1712) | function HH(a, b, c, d, x, s, t) {
  function II (line 1717) | function II(a, b, c, d, x, s, t) {
  function isPrime (line 1896) | function isPrime(n) {
  function getFractionalBits (line 1907) | function getFractionalBits(n) {
  function X64Word_create (line 2128) | function X64Word_create() {
  function f1 (line 3025) | function f1(x, y, z) {
  function f2 (line 3029) | function f2(x, y, z) {
  function f3 (line 3033) | function f3(x, y, z) {
  function f4 (line 3037) | function f4(x, y, z) {
  function f5 (line 3041) | function f5(x, y, z) {
  function rotl (line 3045) | function rotl(x, n) {
  function selectCipherStrategy (line 3624) | function selectCipherStrategy(key) {
  function xorBlock (line 3787) | function xorBlock(words, offset, blockSize) {
  function generateKeystreamAndEncrypt (line 4358) | function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
  function incWord (line 4431) | function incWord(word) {
  function incCounter (line 4465) | function incCounter(counter) {
  function exchangeLR (line 5668) | function exchangeLR(offset, mask) {
  function exchangeRL (line 5674) | function exchangeRL(offset, mask) {
  function generateKeystreamWord (line 5793) | function generateKeystreamWord() {
  function nextState (line 5984) | function nextState() {
  function nextState (line 6162) | function nextState() {

FILE: resources/t3Catopen/http.js
  function http (line 12) | function http(url, options = {}) {

FILE: resources/t3Catopen/similarity.js
  function compareTwoStrings (line 1) | function compareTwoStrings(first, second) {
  function findBestMatch (line 18) | function findBestMatch(mainString, targetStrings) {
  function lcs (line 29) | function lcs(str1, str2) {
  function findBestLCS (line 59) | function findBestLCS(mainString, targetStrings) {

FILE: resources/t3Catopen/sortName.js
  function checkCh (line 382) | function checkCh(ch) {
  function mkRslt (line 390) | function mkRslt(arr) {
  function getFirstLetterList (line 423) | function getFirstLetterList(str) {
  function isAllChinese (line 437) | function isAllChinese(str) {
  function isChinese (line 442) | function isChinese(char) {

FILE: resources/t3PyBase/__tests__/demo.py
  class Spider (line 6) | class Spider(Spider):
    method homeContent (line 10) | def homeContent(self, filter):
    method homeVideoContent (line 17) | def homeVideoContent(self):
    method categoryContent (line 20) | def categoryContent(self, tid, pg, filter, extend):
    method searchContent (line 23) | def searchContent(self, key, quick, pg='1'):
    method detailContent (line 26) | def detailContent(self, ids):
    method playerContent (line 29) | def playerContent(self, flag, vid, vip_flags):
    method init (line 32) | def init(self, extend=''):
    method getName (line 35) | def getName(self):
    method isVideoFormat (line 38) | def isVideoFormat(self, url):
    method manualVideoCheck (line 41) | def manualVideoCheck(self):
    method destroy (line 44) | def destroy(self):
    method localProxy (line 47) | def localProxy(self, param):

FILE: resources/t3PyBase/__tests__/logger.py
  function listen_logs (line 7) | def listen_logs():

FILE: resources/t3PyBase/__tests__/test.py
  function send_request (line 12) | def send_request(method, options=None):

FILE: resources/t3PyBase/base/htmlParser.py
  class Jsoup (line 21) | class Jsoup:
    method __init__ (line 22) | def __init__(self, MY_URL=''):
    method test (line 30) | def test(self, text: str, string: str):
    method contains (line 41) | def contains(self, text: str, match: str):
    method parseHikerToJq (line 45) | def parseHikerToJq(self, parse, first=False):
    method getParseInfo (line 72) | def getParseInfo(self, nparse):
    method parseOneRule (line 104) | def parseOneRule(self, doc, nparse, ret=None):
    method pdfa (line 150) | def pdfa(self, html, parse: str):
    method pdfh (line 175) | def pdfh(self, html, parse: str, base_url: str = ''):
    method pd (line 240) | def pd(self, html, parse: str, base_url: str = ''):
    method pq (line 245) | def pq(self, html: str):
    method pjfh (line 248) | def pjfh(self, html, parse: str, add_url=False):
    method pj (line 275) | def pj(self, html, parse: str):
    method pjfa (line 278) | def pjfa(self, html, parse: str):
  function pd (line 300) | def pd(html, parse: str, base_url: str =''):
  function pdfa (line 304) | def pdfa(html, parse: str):
  function pdfh (line 308) | def pdfh(html, parse: str, base_url: str =''):

FILE: resources/t3PyBase/base/spider.py
  class BaseSpider (line 35) | class BaseSpider(metaclass=ABCMeta):  # 元类 默认的元类 type
    method __init__ (line 38) | def __init__(self, query_params=None, t4_api=None):
    method __new__ (line 45) | def __new__(cls, *args, **kwargs):
    method init (line 58) | def init(self, extend=""):
    method homeContent (line 62) | def homeContent(self, filter):
    method homeVideoContent (line 66) | def homeVideoContent(self):
    method categoryContent (line 70) | def categoryContent(self, tid, pg, filter, extend):
    method detailContent (line 74) | def detailContent(self, ids):
    method searchContent (line 78) | def searchContent(self, key, quick, pg=1):
    method playerContent (line 82) | def playerContent(self, flag, id, vipFlags=None):
    method localProxy (line 86) | def localProxy(self, params):
    method isVideoFormat (line 90) | def isVideoFormat(self, url):
    method manualVideoCheck (line 94) | def manualVideoCheck(self):
    method getName (line 98) | def getName(self):
    method init_api_ext_file (line 101) | def init_api_ext_file(self):
    method getProxyUrl (line 104) | def getProxyUrl(self, flag=False):
    method getDependence (line 111) | def getDependence(self):
    method setExtendInfo (line 114) | def setExtendInfo(self, extend):
    method setCache (line 117) | def setCache(self, key, value, expire=None):
    method getCache (line 131) | def getCache(self, key):
    method cleanup (line 153) | def cleanup(self):
    method regStr (line 164) | def regStr(self, src, reg, group=1):
    method custom_RegexGetText (line 171) | def custom_RegexGetText(self, Text, RegexText, Index, find_all=False):
    method cleanText (line 181) | def cleanText(self, src):
    method fetch (line 186) | def fetch(self, url, params=None, headers=None, cookies=None, timeout=...
    method post (line 194) | def post(self, url, data=None, headers=None, cookies=None, timeout=5, ...
    method postJson (line 201) | def postJson(self, url, json, headers=None, cookies=None, timeout=5, v...
    method postBinary (line 208) | def postBinary(self, url, data: dict, boundary=None, headers=None, coo...
    method html (line 225) | def html(self, content):
    method xpText (line 228) | def xpText(self, root, expr):
    method loadModule (line 235) | def loadModule(self, name, fileName):
    method log (line 239) | def log(self, msg):
    method isVideo (line 253) | def isVideo():
    method adRemove (line 261) | def adRemove():
    method replaceAll (line 269) | def replaceAll(text, mtext, rtext):
    method str2json (line 280) | def str2json(str):
    method json2str (line 284) | def json2str(str):
    method encodeStr (line 288) | def encodeStr(input, encoding='GBK'):
    method decodeStr (line 298) | def decodeStr(input, encoding='GBK'):
    method hexStringTobytes (line 308) | def hexStringTobytes(_str):
    method bytesToHexString (line 318) | def bytesToHexString(_bytes, no_space=True):
    method urljoin (line 331) | def urljoin(base_url, path):
    method coverDict2form (line 341) | def coverDict2form(data: dict):
    method buildUrl (line 353) | def buildUrl(url: str, obj: dict = None):
    method to_lower_camel_case (line 380) | def to_lower_camel_case(x):
    method md5 (line 386) | def md5(text):
    method gzinflate (line 395) | def gzinflate(compressed: bytes) -> bytes:
    method gzipCompress (line 404) | def gzipCompress(compressed: bytes) -> bytes:
    method gzip (line 413) | def gzip(input_str: str) -> str:
    method ungzip (line 440) | def ungzip(b64_data: str) -> str:
    method utf8_array_to_str (line 466) | def utf8_array_to_str(data: List[int]) -> str:
    method bytes2stream (line 472) | def bytes2stream(some_bytes: bytes):
    method stream2bytes (line 481) | def stream2bytes(some_stream):
    method skip_bytes (line 489) | def skip_bytes(self, some_bytes: bytes, pos=0) -> bytes:
    method base64Encode (line 502) | def base64Encode(text):
    method base64Decode (line 511) | def base64Decode(text: str):
    method atob (line 520) | def atob(text):
    method btoa (line 529) | def btoa(text):
    method check_unsafe_attributes (line 538) | def check_unsafe_attributes(string):
    method aes_cbc_decode (line 555) | def aes_cbc_decode(ciphertext, key, iv):
    method rsa_private_decode (line 575) | def rsa_private_decode(ciphertext, private_key, default_length=256):
    method rsa_public_encode (line 614) | def rsa_public_encode(text, public_key, default_length=256):
    method remove_comments (line 647) | def remove_comments(text):
    method superStr2dict (line 664) | def superStr2dict(self, text: str):
    method fixAdM3u8 (line 671) | def fixAdM3u8(self, m3u8_text, m3u8_url='', ad_remove=''):
    method eval_computer (line 726) | def eval_computer(self, text):
    method safe_eval (line 737) | def safe_eval(self, code: str = '', localdict: dict = None):

FILE: resources/t3PyBase/main.py
  function custom_print (line 17) | def custom_print(*args: Any, **kwargs: Any) -> None:
  function ensure_json_str (line 29) | def ensure_json_str(val: Any) -> str:
  function parse_args (line 38) | def parse_args() -> argparse.Namespace:
  function load_module_from_code (line 45) | def load_module_from_code(module_name: str, source_code: str) -> Any:
  function sync_wrapper (line 53) | def sync_wrapper(func: Any, params: Optional[List[Any]]) -> Any:
  function get_spider (line 64) | def get_spider(code_hash: int, code_str: str) -> Any:
  function core (line 76) | def core(method: str, source_code: str, opts: List[Any]) -> Any:

FILE: scripts/generate-changelog.js
  constant ROOT_DIR (line 5) | const ROOT_DIR = path.join(__dirname, '..');
  constant OUTPUT_FILE (line 6) | const OUTPUT_FILE = path.join(ROOT_DIR, 'CHANGELOG.md');
  constant GITHUB_TOKEN (line 10) | const GITHUB_TOKEN = process.env.GITHUB_TOKEN || '';
  constant PER_PAGE (line 11) | const PER_PAGE = 100;
  function normalizeVersion (line 13) | function normalizeVersion(tag) {
  function fetchAllReleases (line 18) | async function fetchAllReleases() {

FILE: scripts/generate-license.js
  constant ROOT_DIR (line 7) | const ROOT_DIR = path.join(__dirname, '..');
  constant OUTPUT_FILE (line 8) | const OUTPUT_FILE = path.join(ROOT_DIR, 'ThirdPartyNotices.txt');
  constant PACKAGE_JSON (line 9) | const PACKAGE_JSON = require(path.join(ROOT_DIR, 'package.json'));
  constant TOP_LEVEL_DEPS (line 11) | const TOP_LEVEL_DEPS = (() => {
  constant LICENSE_WHITELIST (line 32) | const LICENSE_WHITELIST = [
  constant LICENSE_REPLACEMENTS (line 60) | const LICENSE_REPLACEMENTS = {
  constant IGNORED_PACKAGES (line 80) | const IGNORED_PACKAGES = new Set([
  function normalizeLicense (line 122) | function normalizeLicense(license) {
  function isLicenseAllowed (line 130) | function isLicenseAllowed(licenses, whitelist) {
  function validatePackage (line 145) | function validatePackage(pkg) {
  function latestPackages (line 158) | function latestPackages(pkg, index, array) {

FILE: scripts/version.js
  function exec (line 5) | function exec(command) {

FILE: src/main/electron.d.ts
  type App (line 3) | interface App {

FILE: src/main/env.d.ts
  type ImportMetaEnv (line 3) | interface ImportMetaEnv {
  type ImportMeta (line 7) | interface ImportMeta {

FILE: src/main/ipc.ts
  function registerIpc (line 39) | function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {

FILE: src/main/services/AppLocale.ts
  class AppLocale (line 12) | class AppLocale {
    method constructor (line 15) | constructor() {}
    method getInstance (line 17) | public static getInstance(): AppLocale {
    method init (line 24) | public init(): void {
    method changeLocale (line 44) | public changeLocale(value: ILang): void {
    method defaultLang (line 57) | public defaultLang(value?: ILang): ILangWithoutSystem {
    method isCHS (line 94) | public isCHS(): boolean {

FILE: src/main/services/AppService.ts
  class AppService (line 13) | class AppService {
    method constructor (line 16) | private constructor() {
    method getInstance (line 20) | public static getInstance(): AppService {
    method setAppLaunchOnBoot (line 27) | public async setAppLaunchOnBoot(isLaunchOnBoot: boolean): Promise<void> {

FILE: src/main/services/AppUpdater.ts
  class AppUpdater (line 22) | class AppUpdater {
    method constructor (line 28) | constructor(mainWindow: BrowserWindow) {
    method setAutoUpdate (line 86) | public setAutoUpdate(isActive: boolean) {
    method cancelDownload (line 92) | public cancelDownload() {
    method checkForUpdates (line 100) | public async checkForUpdates() {
    method install (line 145) | public install() {
    method startDownload (line 154) | public startDownload() {

FILE: src/main/services/BinaryService.ts
  type IBinaryInfo (line 12) | interface IBinaryInfo {
  class BinaryService (line 18) | class BinaryService {
    method constructor (line 22) | private constructor() {}
    method getInstance (line 24) | public static getInstance(): BinaryService {
    method getBinaryPath (line 31) | private getBinaryPath(name: string): string {
    method isBinaryExist (line 35) | private async isBinaryExist(name: string): Promise<boolean> {
    method getBinaryInfo (line 39) | private async getBinaryInfo(name: string): Promise<IBinaryInfo> {
    method getBinaryList (line 48) | public async getBinaryList(names?: string[]): Promise<{ list: IBinaryI...
    method installBinary (line 56) | public async installBinary(names: string[]): Promise<IBinaryInfo[]> {

FILE: src/main/services/CdpElectron.ts
  type ISnifferResult (line 21) | interface ISnifferResult {
  type ISnifferOptions (line 26) | interface ISnifferOptions {
  type ICdpOptions (line 35) | interface ICdpOptions {
  class CdpElectron (line 44) | class CdpElectron {
    method constructor (line 54) | constructor(options: Partial<ICdpOptions> = {}) {
    method init (line 63) | private async init(): Promise<void> {
    method cleanup (line 72) | private async cleanup(): Promise<void> {
    method reasonUserAgentMetadata (line 86) | private reasonUserAgentMetadata(userAgent: string) {
    method configurePage (line 103) | private async configurePage(page: CdpPage, headers: Record<string, any...
    method navigateToUrl (line 132) | private async navigateToUrl(
    method execScript (line 140) | private async execScript(
    method execClick (line 157) | private async execClick(page: CdpPage, selector: string, type: 'js' | ...
    method extractContent (line 170) | private async extractContent(page: CdpPage, selector?: string): Promis...
    method snifferMedia (line 177) | public async snifferMedia(url: string, options: ISnifferOptions = {}):...

FILE: src/main/services/ConfigManager.ts
  type IStore (line 11) | enum IStore {
  type IStoreKey (line 23) | type IStoreKey = `${IStore}`;
  constant STORE_KEYS (line 25) | const STORE_KEYS: IStoreKey[] = Object.values(IStore);
  class ConfigManager (line 27) | class ConfigManager {
    method constructor (line 30) | constructor() {
    method theme (line 37) | public get theme(): ITheme {
    method lang (line 42) | public get lang(): ILang {
    method zoom (line 46) | public get zoom(): number {
    method dns (line 51) | public get dns(): string {
    method hardwareAcceleration (line 56) | public get hardwareAcceleration(): boolean {
    method timeout (line 60) | public get timeout(): number {
    method ua (line 65) | public get ua(): string {
    method debug (line 70) | public get debug(): boolean {
    method proxy (line 74) | public get proxy(): ProxyConfig {
    method set (line 89) | public set(key: string, value: unknown) {
    method get (line 93) | public get<T>(key: string, defaultValue?: T) {

FILE: src/main/services/ContextMenu.ts
  class ContextMenu (line 5) | class ContextMenu {
    method contextMenu (line 6) | public contextMenu(w: Electron.WebContents) {
    method createInspectMenuItems (line 28) | private createInspectMenuItems(w: Electron.WebContents): MenuItemConst...
    method createEditMenuItems (line 43) | private createEditMenuItems(properties: Electron.ContextMenuParams): M...
    method createSpellCheckMenuItem (line 82) | private createSpellCheckMenuItem(
    method createDictionarySuggestions (line 98) | private createDictionarySuggestions(

FILE: src/main/services/DbService/crud/analyze.ts
  method all (line 7) | async all(orm: IOrm, schemas: ISchemas) {
  method active (line 12) | async active(orm: IOrm, schemas: ISchemas) {
  method update (line 21) | async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IMod...
  method clear (line 26) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 31) | async get(orm: IOrm, schemas: ISchemas, id: string) {
  method getByField (line 37) | async getByField(
  method set (line 60) | async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['analyze']>) {
  method add (line 66) | async add(orm: IOrm, schemas: ISchemas, doc: IModels['analyze']) {
  method remove (line 71) | async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {
  method removeByField (line 76) | async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [...
  method page (line 88) | async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: num...

FILE: src/main/services/DbService/crud/channel.ts
  method all (line 7) | async all(orm: IOrm, schemas: ISchemas) {
  method update (line 12) | async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IMod...
  method clear (line 17) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 22) | async get(orm: IOrm, schemas: ISchemas, id: string) {
  method getByField (line 28) | async getByField(
  method set (line 51) | async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['channel']>) {
  method add (line 57) | async add(orm: IOrm, schemas: ISchemas, doc: IModels['channel']) {
  method remove (line 62) | async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {
  method removeByField (line 67) | async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [...
  method page (line 79) | async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: num...
  method group (line 105) | async group(orm: IOrm, schemas: ISchemas) {

FILE: src/main/services/DbService/crud/history.ts
  method all (line 8) | async all(orm: IOrm, schemas: ISchemas) {
  method update (line 13) | async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IMod...
  method clear (line 18) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 23) | async get(orm: IOrm, schemas: ISchemas, id: string) {
  method getByField (line 29) | async getByField(
  method set (line 52) | async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['history']>) {
  method add (line 58) | async add(orm: IOrm, schemas: ISchemas, doc: IModels['history']) {
  method remove (line 63) | async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {
  method removeByField (line 68) | async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [...
  method page (line 80) | async page(

FILE: src/main/services/DbService/crud/index.ts
  type ICrudService (line 10) | interface ICrudService {

FILE: src/main/services/DbService/crud/iptv.ts
  method all (line 7) | async all(orm: IOrm, schemas: ISchemas) {
  method active (line 12) | async active(orm: IOrm, schemas: ISchemas) {
  method update (line 21) | async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IMod...
  method clear (line 26) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 31) | async get(orm: IOrm, schemas: ISchemas, id: string) {
  method getByField (line 37) | async getByField(
  method set (line 60) | async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['iptv']>) {
  method add (line 66) | async add(orm: IOrm, schemas: ISchemas, doc: IModels['iptv']) {
  method remove (line 71) | async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {
  method removeByField (line 76) | async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [...
  method page (line 88) | async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: num...

FILE: src/main/services/DbService/crud/plugin.ts
  method all (line 7) | async all(orm: IOrm, schemas: ISchemas) {
  method update (line 12) | async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IMod...
  method clear (line 17) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 22) | async get(orm: IOrm, schemas: ISchemas, id: string) {
  method getByField (line 28) | async getByField(
  method set (line 51) | async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['plugin']>) {
  method add (line 57) | async add(orm: IOrm, schemas: ISchemas, doc: IModels['plugin']) {
  method remove (line 62) | async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {
  method removeByField (line 67) | async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [...
  method page (line 79) | async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: num...

FILE: src/main/services/DbService/crud/setting.ts
  method all (line 7) | async all(orm: IOrm, schemas: ISchemas) {
  method update (line 17) | async update(orm: IOrm, schemas: ISchemas, doc: { key: ISettingKey; valu...
  method clear (line 26) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 31) | async get(orm: IOrm, schemas: ISchemas, key: ISettingKey) {
  method set (line 37) | async set(orm: IOrm, schemas: ISchemas, doc: Array<{ key: ISettingKey; v...
  method add (line 49) | async add(orm: IOrm, schemas: ISchemas, doc: { key: ISettingKey; value: ...
  method remove (line 57) | async remove(orm: IOrm, schemas: ISchemas, keys: Array<ISettingKey>) {

FILE: src/main/services/DbService/crud/site.ts
  method all (line 7) | async all(orm: IOrm, schemas: ISchemas) {
  method active (line 12) | async active(orm: IOrm, schemas: ISchemas) {
  method update (line 21) | async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IMod...
  method clear (line 26) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 31) | async get(orm: IOrm, schemas: ISchemas, id: string) {
  method getByField (line 37) | async getByField(
  method set (line 60) | async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['site']>) {
  method add (line 66) | async add(orm: IOrm, schemas: ISchemas, doc: IModels['site']) {
  method remove (line 71) | async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {
  method removeByField (line 76) | async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [...
  method page (line 88) | async page(orm: IOrm, schemas: ISchemas, page: number = 1, pageSize: num...
  method group (line 111) | async group(orm: IOrm, schemas: ISchemas) {

FILE: src/main/services/DbService/crud/star.ts
  method all (line 8) | async all(orm: IOrm, schemas: ISchemas) {
  method update (line 13) | async update(orm: IOrm, schemas: ISchemas, ids: Array<string>, doc: IMod...
  method clear (line 18) | async clear(orm: IOrm, schemas: ISchemas) {
  method get (line 23) | async get(orm: IOrm, schemas: ISchemas, id: string) {
  method getByField (line 29) | async getByField(
  method set (line 52) | async set(orm: IOrm, schemas: ISchemas, doc: Array<IModels['star']>) {
  method add (line 58) | async add(orm: IOrm, schemas: ISchemas, doc: IModels['star']) {
  method remove (line 63) | async remove(orm: IOrm, schemas: ISchemas, ids: Array<string>) {
  method removeByField (line 68) | async removeByField(orm: IOrm, schemas: ISchemas, condition: Partial<{ [...
  method page (line 80) | async page(

FILE: src/main/services/DbService/index.ts
  class DbService (line 26) | class DbService {
    method constructor (line 34) | private constructor() {
    method getInstance (line 38) | public static getInstance(): DbService {
    method reload (line 45) | public static reload(): DbService {
    method conn (line 56) | private conn(): void {
    method cloudBackup (line 65) | public async cloudBackup(
    method cloudResume (line 87) | public async cloudResume(
    method startWatcher (line 112) | private startWatcher(): void {
    method stopWatcher (line 141) | private async stopWatcher(): Promise<void> {
    method close (line 151) | public async close() {
    method getDbVersion (line 166) | private async getDbVersion(): Promise<string> {
    method migrate (line 183) | public async migrate(): Promise<void> {
    method dbSyncStore (line 217) | private async dbSyncStore(): Promise<void> {
    method init (line 230) | public async init(): Promise<void> {
    method subscribe (line 244) | public subscribe<T>(key: string, callback: (newValue: T) => void) {
    method unsubscribe (line 251) | public unsubscribe<T>(key: string, callback: (newValue: T) => void) {
    method notifySubscribers (line 261) | private notifySubscribers<T>(key: string, newValue: T) {
    method tableNames (line 268) | public get tableNames() {
    method db (line 272) | public get db() {
    method analyze (line 315) | public get analyze() {
    method channel (line 334) | public get channel() {
    method history (line 353) | public get history() {
    method iptv (line 371) | public get iptv() {
    method plugin (line 390) | public get plugin() {
    method setting (line 408) | public get setting() {
    method site (line 448) | public get site() {
    method star (line 468) | public get star() {

FILE: src/main/services/DbService/schemas/analyze.ts
  type AnalyzeModel (line 35) | type AnalyzeModel = InferSelectModel<typeof analyze>;

FILE: src/main/services/DbService/schemas/channel.ts
  type ChannelModel (line 25) | type ChannelModel = InferSelectModel<typeof channel>;

FILE: src/main/services/DbService/schemas/history.ts
  type HistoryModel (line 32) | type HistoryModel = InferSelectModel<typeof history>;

FILE: src/main/services/DbService/schemas/index.ts
  type Schemas (line 35) | type Schemas = typeof schemas;
  type TableName (line 37) | type TableName = keyof Schemas;
  type Models (line 39) | interface Models {
  type AppTransaction (line 50) | type AppTransaction<TMode extends 'async' | 'sync' = 'async'> = SQLiteTr...
  type Transaction (line 57) | type Transaction = AppTransaction<'async'>;

FILE: src/main/services/DbService/schemas/iptv.ts
  type IptvModel (line 35) | type IptvModel = InferSelectModel<typeof iptv>;

FILE: src/main/services/DbService/schemas/plugin.ts
  type PluginModel (line 33) | type PluginModel = InferSelectModel<typeof plugin>;

FILE: src/main/services/DbService/schemas/setting.ts
  type SettingModel (line 26) | type SettingModel = InferSelectModel<typeof setting>;

FILE: src/main/services/DbService/schemas/site.ts
  type SiteModel (line 37) | type SiteModel = InferSelectModel<typeof site>;

FILE: src/main/services/DbService/schemas/star.ts
  type StarModel (line 27) | type StarModel = InferSelectModel<typeof star>;

FILE: src/main/services/FFmpegService.ts
  type IFFmpeg (line 18) | type IFFmpeg = typeof ffmpegFluent & { ffprobeAsync: (path: string, opti...
  type IFfmpegOptions (line 20) | interface IFfmpegOptions {
  type IMediaOptions (line 25) | interface IMediaOptions {
  type IMediaInfoOptions (line 30) | type IMediaInfoOptions = IMediaOptions;
  type IMediaScreenshotOptions (line 32) | type IMediaScreenshotOptions = IMediaOptions & { timestamp?: string };
  type IMediaBaseInfo (line 34) | interface IMediaBaseInfo {
  class FFmpegService (line 55) | class FFmpegService {
    method constructor (line 61) | constructor(options: Partial<IFfmpegOptions> = {}) {
    method getInstance (line 68) | public static getInstance(): FFmpegService {
    method prepare (line 75) | public async prepare(): Promise<void> {
    method formatNumber (line 109) | private formatNumber(value: number | string): number {
    method buildParams (line 117) | private buildParams(path: string, options: IMediaOptions = {}): string...
    method getProbeCommand (line 151) | private getProbeCommand(path: string, args: string[] = []): string {
    method getInfo (line 157) | public async getInfo(path: string, options?: IMediaInfoOptions): Promi...
    method getBaseInfo (line 177) | public async getBaseInfo(path: string, options?: IMediaInfoOptions): P...
    method getScreenshot (line 224) | public async getScreenshot(path: string, options?: IMediaScreenshotOpt...

FILE: src/main/services/FastifyService/fastify.d.ts
  type FastifyInstance (line 4) | interface FastifyInstance {

FILE: src/main/services/FastifyService/index.ts
  class FastifyService (line 27) | class FastifyService {
    method constructor (line 32) | private constructor() {
    method getInstance (line 36) | public static getInstance(): FastifyService {
    method start (line 43) | public async start(): Promise<boolean> {
    method stop (line 87) | public async stop(): Promise<boolean> {
    method restart (line 101) | public async restart(): Promise<boolean> {
    method status (line 114) | public status(): boolean {
    method registerHandlers (line 118) | private async registerHandlers(): Promise<void> {
    method registerHooks (line 128) | private async registerHooks(): Promise<void> {
    method registerPlugins (line 135) | private async registerPlugins(): Promise<void> {
    method registerSchemas (line 181) | private async registerSchemas(): Promise<void> {
    method registerRoutes (line 187) | private async registerRoutes(): Promise<void> {
    method customLogger (line 200) | private customLogger(): FastifyBaseLogger {

FILE: src/main/services/FastifyService/routes/v0/proxy/index.ts
  constant API_PREFIX (line 9) | const API_PREFIX = 'proxy';

FILE: src/main/services/FastifyService/routes/v1/aigc/chat.ts
  constant API_PREFIX (line 8) | const API_PREFIX = 'aigc/chat';

FILE: src/main/services/FastifyService/routes/v1/aigc/memory.ts
  constant API_PREFIX (line 15) | const API_PREFIX = 'aigc/memory';

FILE: src/main/services/FastifyService/routes/v1/aigc/utils/chat.ts
  constant SYSTEM_PROMPT (line 16) | const SYSTEM_PROMPT = `
  type OpenAICommonAPIOtherOption (line 24) | interface OpenAICommonAPIOtherOption {
  class ChatCompletion (line 34) | class ChatCompletion {
    method constructor (line 39) | constructor() {
    method init (line 43) | private async init(options: ClientOptions = {}): Promise<boolean> {
    method chatStandard (line 66) | public async chatStandard(
    method chatNormal (line 129) | public async chatNormal(config: OpenAICommonAPIOtherOption, options?: ...

FILE: src/main/services/FastifyService/routes/v1/aigc/utils/memory.ts
  type ChatMessage (line 5) | interface ChatMessage {
  type ChatSession (line 10) | interface ChatSession {
  type RecentMessageOptions (line 15) | interface RecentMessageOptions {
  class MemoryManager (line 20) | class MemoryManager {
    method constructor (line 24) | private constructor() {}
    method getInstance (line 26) | public static getInstance(): MemoryManager {
    method createSession (line 36) | createSession(initialMessages: ChatMessage[] = []): ChatSession {
    method delSession (line 46) | delSession(sessionId: string[]): void {
    method addMessage (line 55) | addMessage(sessionId: string, messages: ChatMessage | ChatMessage[]): ...
    method getMessage (line 67) | getMessage(sessionId: string, options: RecentMessageOptions = {}): Cha...
    method getSession (line 101) | getSession(): ChatSession[] {
    method getSessionIds (line 113) | getSessionIds(): string[] {
    method deleteMessage (line 122) | deleteMessage(sessionId: string, indexes?: number[]): ChatSession {
    method replaceMessage (line 142) | replaceMessage(sessionId: string, updates: Array<{ index: number; mess...
    method clearSession (line 158) | clearSession(): void {

FILE: src/main/services/FastifyService/routes/v1/data/cloud.ts
  constant API_PREFIX (line 5) | const API_PREFIX = 'data/cloud';

FILE: src/main/services/FastifyService/routes/v1/data/db.ts
  constant API_PREFIX (line 12) | const API_PREFIX = 'data/db';

FILE: src/main/services/FastifyService/routes/v1/file/film.ts
  constant API_PREFIX (line 19) | const API_PREFIX = 'file/film';

FILE: src/main/services/FastifyService/routes/v1/file/manage.ts
  constant API_PREFIX (line 8) | const API_PREFIX = 'file/manage';

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t0Xml.ts
  class T0XmlAdapter (line 16) | class T0XmlAdapter {
    method constructor (line 21) | constructor(source: IConstructorOptions) {
    method init (line 27) | async init(): ICmsResultPromise['init'] {}
    method home (line 29) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 68) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 117) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 149) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 202) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 243) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 269) | async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 273) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 277) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t1Json.ts
  class T1JsonAdapter (line 5) | class T1JsonAdapter {
    method constructor (line 10) | constructor(source: IConstructorOptions) {
    method init (line 16) | async init(): ICmsResultPromise['init'] {}
    method home (line 18) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 54) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 98) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 126) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 166) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 202) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 228) | async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 232) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 236) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Alist.ts
  type ISource (line 6) | interface ISource {
  type ISettings (line 18) | interface ISettings {
  type IApi (line 26) | interface IApi {
  type IUser (line 33) | interface IUser {
  class T3AlistAdapter (line 42) | class T3AlistAdapter {
    method constructor (line 54) | constructor(source: IConstructorOptions) {
    method init (line 58) | async init(): ICmsResultPromise['init'] {
    method home (line 120) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 124) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 128) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 173) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 221) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 264) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 269) | async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 273) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 277) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...
    method isFolder (line 281) | private isFolder(data: { type: number }): boolean {
    method isVideo (line 285) | private isVideo(data: { type: number }): boolean {
    method isSubtitle (line 290) | private isSubtitle(data: { type: number; name: string }) {
    method getType (line 297) | private getType(data: { type: number }) {
    method getPic (line 302) | private getPic(data: { type: number; thumb?: string; thumbnail?: strin...
    method getSize (line 311) | private getSize(data: { size: number }) {
    method getTime (line 323) | private getTime(data: { updated_at: string; time_str: string; modified...
    method getParams (line 329) | private getParams(path: string) {
    method getToken (line 339) | private async getToken() {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3AppGet.ts
  class T3AppGetAdapter (line 6) | class T3AppGetAdapter {
    method constructor (line 18) | constructor(source: IConstructorOptions) {
    method init (line 39) | async init(): Promise<void> {
    method home (line 63) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 112) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 116) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 150) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 217) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 243) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 300) | async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 304) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 308) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...
    method API (line 312) | get API() {
    method vipTime (line 339) | private async vipTime() {
    method encrypt (line 375) | private encrypt(value: string): string {
    method decrypt (line 386) | private decrypt(value: string): string {
    method isofficial (line 405) | private isofficial(url) {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3AppYsV2.ts
  class T3AppYsV2Adapter (line 42) | class T3AppYsV2Adapter {
    method constructor (line 49) | constructor(source: IConstructorOptions) {
    method init (line 58) | async init(): ICmsResultPromise['init'] {}
    method home (line 60) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 120) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 151) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 184) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 295) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 327) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 337) | async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 341) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 345) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...
    method fixPic (line 349) | private fixPic(pic: string): string {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Catopen/index.ts
  type ICmsResultCustom (line 15) | type ICmsResultCustom = Omit<Awaited<ICmsResultPromise>, 'play'> & {
  class T3CatopenAdapter (line 23) | class T3CatopenAdapter {
    method constructor (line 31) | constructor(source: IConstructorOptions) {
    method destroy (line 38) | public async destroy(): Promise<void> {
    method execCtx (line 45) | private async execCtx<T extends ICmsMethodName>(type: T, options?: ICm...
    method init (line 74) | public async init(): ICmsResultPromise['init'] {
    method home (line 92) | public async home(): ICmsResultPromise['home'] {
    method homeVod (line 121) | public async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 143) | public async category(doc: ICmsParams['category']): ICmsResultPromise[...
    method detail (line 166) | public async detail(doc: ICmsParams['detail']): ICmsResultPromise['det...
    method search (line 201) | public async search(doc: ICmsParams['search']): ICmsResultPromise['sea...
    method play (line 224) | public async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 250) | async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 256) | async proxy(doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 261) | async runMain(doc: ICmsParams['runMain']): ICmsResultPromise['runMain'] {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Catopen/worker.ts
  method init (line 27) | async init(options) {
  method home (line 52) | async home() {
  method homeVod (line 58) | async homeVod() {
  method category (line 64) | async category(options) {
  method detail (line 76) | async detail(options) {
  method play (line 88) | async play(options) {
  method search (line 95) | async search(options) {
  method action (line 102) | async action(options) {
  method proxy (line 110) | async proxy(options) {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/index.ts
  type ICmsResultCustom (line 11) | type ICmsResultCustom = Omit<Awaited<ICmsResultPromise>, 'play'> & {
  class T3DrpyAdapter (line 21) | class T3DrpyAdapter {
    method constructor (line 27) | constructor(source: IConstructorOptions) {
    method destroy (line 32) | public async destroy(): Promise<void> {
    method execCtx (line 39) | private async execCtx<T extends ICmsMethodName>(type: T, options?: ICm...
    method init (line 67) | public async init(): ICmsResultPromise['init'] {
    method home (line 71) | public async home(): ICmsResultPromise['home'] {
    method homeVod (line 100) | public async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 122) | public async category(doc: ICmsParams['category']): ICmsResultPromise[...
    method detail (line 145) | public async detail(doc: ICmsParams['detail']): ICmsResultPromise['det...
    method search (line 180) | public async search(doc: ICmsParams['search']): ICmsResultPromise['sea...
    method play (line 203) | public async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 229) | async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 235) | async proxy(doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 240) | public async runMain(doc: ICmsParams['runMain']): ICmsResultPromise['r...

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Drpy/worker.ts
  method init (line 20) | async init(options) {
  method home (line 26) | async home() {
  method homeVod (line 32) | async homeVod() {
  method category (line 38) | async category(options) {
  method detail (line 45) | async detail(options) {
  method play (line 52) | async play(options) {
  method search (line 59) | async search(options) {
  method action (line 66) | async action(options) {
  method proxy (line 75) | async proxy(options) {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Py.ts
  class ConnectService (line 38) | class ConnectService extends PythonService {
    method getInstance (line 48) | public static getInstance(): ConnectService {
    method connectLogger (line 57) | private async connectLogger(): Promise<void> {
    method connectApi (line 92) | private async connectApi(): Promise<void> {
    method connect (line 106) | private async connect(): Promise<void> {
    method prepare (line 111) | public async prepare(): Promise<void> {
    method terminate (line 142) | public async terminate(): Promise<void> {
    method getSocket (line 165) | public getSocket(): zmq.Request | null {
  class T3PyAdapter (line 172) | class T3PyAdapter {
    method constructor (line 179) | constructor(source: IConstructorOptions) {
    method prepare (line 185) | public static async prepare(): Promise<void> {
    method terminate (line 189) | public static async terminate(): Promise<void> {
    method execCtx (line 193) | private async execCtx(type: string, options: any[] = []): Promise<any> {
    method init (line 209) | async init(): ICmsResultPromise['init'] {
    method home (line 221) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 250) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 272) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 295) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 330) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 353) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 379) | async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 385) | async proxy(doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 390) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Xbpq/index.ts
  function stringtoJson (line 24) | function stringtoJson(obj) {
  function htmlEntitiesToText (line 41) | function htmlEntitiesToText(htmlString) {
  function parseStringToObject (line 77) | function parseStringToObject(inputString) {
  function objToQueryString (line 93) | function objToQueryString(obj, shouldEncode?) {
  function findMostCommonStructure (line 109) | function findMostCommonStructure(urls) {
  function findIndicesOfElementsWithNumbers (line 132) | function findIndicesOfElementsWithNumbers(arr) {
  function findMostCommonBaseStructure (line 150) | function findMostCommonBaseStructure(urls) {
  function convertMultipleUnicodeEscapedWords (line 180) | function convertMultipleUnicodeEscapedWords(str) {
  function collapseSpacesAndTrim (line 189) | function collapseSpacesAndTrim(str) {
  function optimizeHtmlContent (line 199) | function optimizeHtmlContent(htmlString) {
  function removeSingleAngleBrackets (line 211) | function removeSingleAngleBrackets(inputString) {
  function extractUrlParts (line 226) | function extractUrlParts(url) {
  function findLongindex (line 244) | function findLongindex(arrays) {
  function isNestedArray (line 259) | function isNestedArray(arr) {
  function mergeStringsToJSON (line 263) | function mergeStringsToJSON(str1, str2, type) {
  function getFilter (line 298) | function getFilter(i, rule, name) {
  class T3XbpqAdapter (line 416) | class T3XbpqAdapter {
    method constructor (line 423) | constructor(source: IConstructorOptions) {
    method init (line 452) | async init(): ICmsResultPromise['init'] {
    method home (line 680) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 732) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 774) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 906) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 1300) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 1421) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 1513) | async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 1517) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 1521) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...
    method req (line 1525) | async req(url: string, headers = {}) {
    method 一级 (line 1580) | async 一级(url: string, ctype: string) {
    method getRuleValue (line 1731) | getRuleValue(keys: string[], def: any = ''): any {
    method normalizeUrl (line 1740) | normalizeUrl(url) {
    method judgeUrl (line 1767) | judgeUrl(url, name, host, type) {
    method byType (line 1801) | byType(value, ctype) {
    method AutoContent (line 1813) | AutoContent() {
    method loopTest (line 2066) | loopTest(html, type, key, host = '') {
    method prefixORsuffix (line 2160) | prefixORsuffix(html, input, h) {
    method splitTextWithSingleBracket (line 2180) | splitTextWithSingleBracket(text) {
    method setSwitchs (line 2194) | setSwitchs(switchs) {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Xbpq/methods.ts
  function stringex (line 4) | function stringex() {
  function removeChars (line 35) | function removeChars(originalText, charsToRemove) {
  function removeTagsExceptList (line 43) | function removeTagsExceptList(htmlString, tagList: string[] = []) {
  function replaceTagsWithMapping (line 73) | function replaceTagsWithMapping(htmlString, replacementMap: Record<strin...
  function removeDuplicatesByValue (line 92) | function removeDuplicatesByValue(arr, valueToCheck) {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t3Xyq.ts
  function getValueByPath (line 14) | function getValueByPath(json, path) {
  function generateYearArray (line 26) | function generateYearArray(startYear, endYear) {
  class T3XyqAdapter (line 38) | class T3XyqAdapter {
    method constructor (line 44) | constructor(source: IConstructorOptions) {
    method init (line 60) | async init(): ICmsResultPromise['init'] {
    method home (line 105) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 193) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 241) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 331) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 463) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 561) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 567) | async action(_doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 571) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 575) | async runMain(_doc: ICmsParams['runMain']): Promise<ICmsResultPromise[...
    method getCode (line 579) | private async getCode(url: string, headers: object = {}) {

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t4Catvod.ts
  class T4CatvodAdapter (line 5) | class T4CatvodAdapter {
    method constructor (line 10) | constructor(source: IConstructorOptions) {
    method init (line 15) | async init(): ICmsResultPromise['init'] {
    method home (line 23) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 56) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 60) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 88) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 128) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 156) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 177) | async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 189) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 193) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t4DrpyJs0.ts
  class T4DrpyJs0Adapter (line 4) | class T4DrpyJs0Adapter {
    method constructor (line 8) | constructor(source: IConstructorOptions) {
    method init (line 13) | async init(): ICmsResultPromise['init'] {}
    method home (line 15) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 47) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 72) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 100) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 140) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 167) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 211) | async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 224) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 228) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...

FILE: src/main/services/FastifyService/routes/v1/film/cms/adapter/t4Drpys.ts
  class T4ServerAdapter (line 6) | class T4ServerAdapter {
    method constructor (line 11) | constructor(source: IConstructorOptions) {
    method init (line 17) | async init(): ICmsResultPromise['init'] {}
    method home (line 19) | async home(): ICmsResultPromise['home'] {
    method homeVod (line 52) | async homeVod(): ICmsResultPromise['homeVod'] {
    method category (line 78) | async category(doc: ICmsParams['category']): ICmsResultPromise['catego...
    method detail (line 113) | async detail(doc: ICmsParams['detail']): ICmsResultPromise['detail'] {
    method search (line 153) | async search(doc: ICmsParams['search']): ICmsResultPromise['search'] {
    method play (line 181) | async play(doc: ICmsParams['play']): ICmsResultPromise['play'] {
    method action (line 212) | async action(doc: ICmsParams['action']): ICmsResultPromise['action'] {
    method proxy (line 225) | async proxy(_doc: ICmsParams['proxy']): ICmsResultPromise['proxy'] {
    method runMain (line 229) | async runMain(_doc: ICmsParams['runMain']): ICmsResultPromise['runMain...

FILE: src/main/services/FastifyService/routes/v1/film/cms/index.ts
  constant API_PREFIX (line 41) | const API_PREFIX = 'film/cms';

FILE: src/main/services/FastifyService/routes/v1/film/cms/utils/cache.ts
  constant CMS_ADAPTER_MAP (line 28) | const CMS_ADAPTER_MAP = {
  class WorkLruCache (line 43) | class WorkLruCache<K = string, V = ICmsAdapter> extends LruCache<K, V> {
    method put (line 44) | put(key: K, value: V): V {
    method delete (line 59) | delete(key: K): boolean {
    method clear (line 69) | clear(): void {
  constant CACHE_LIMIT (line 77) | const CACHE_LIMIT = 10;

FILE: src/main/services/FastifyService/routes/v1/film/edit/index.ts
  constant TEMPLATES_MAP (line 22) | const TEMPLATES_MAP = {
  constant DECRYPT_MAP (line 26) | const DECRYPT_MAP = {
  constant API_PREFIX (line 31) | const API_PREFIX = 'film/edit';

FILE: src/main/services/FastifyService/routes/v1/film/rec/index.ts
  constant API_PREFIX (line 11) | const API_PREFIX = 'film/rec';

FILE: src/main/services/FastifyService/routes/v1/film/rec/utils/barrage.ts
  type IBarrageOptions (line 11) | interface IBarrageOptions {

FILE: src/main/services/FastifyService/routes/v1/film/rec/utils/douban.ts
  type IRecommSearch (line 16) | interface IRecommSearch {
  type IRecommDetail (line 24) | interface IRecommDetail {

FILE: src/main/services/FastifyService/routes/v1/film/rec/utils/hot.ts
  type IRecommHot (line 10) | interface IRecommHot {
  type IRecommHotOptions (line 18) | interface IRecommHotOptions {

FILE: src/main/services/FastifyService/routes/v1/film/site.ts
  constant API_PREFIX (line 15) | const API_PREFIX = 'film/site';

FILE: src/main/services/FastifyService/routes/v1/live/channel.ts
  constant API_PREFIX (line 16) | const API_PREFIX = 'live/channel';

FILE: src/main/services/FastifyService/routes/v1/live/iptv.ts
  constant API_PREFIX (line 20) | const API_PREFIX = 'live/iptv';

FILE: src/main/services/FastifyService/routes/v1/live/utils/channel.ts
  type IChannelItem (line 7) | interface IChannelItem {
  type ICatchupMode (line 15) | type ICatchupMode = 'append' | 'shift' | 'default' | '';
  type ICatchupConfig (line 17) | interface ICatchupConfig {

FILE: src/main/services/FastifyService/routes/v1/live/utils/epg.ts
  type IEpgItem (line 7) | interface IEpgItem {

FILE: src/main/services/FastifyService/routes/v1/moment/history.ts
  constant API_PREFIX (line 13) | const API_PREFIX = 'moment/history';

FILE: src/main/services/FastifyService/routes/v1/moment/moment.ts
  constant API_PREFIX (line 5) | const API_PREFIX = 'moment';

FILE: src/main/services/FastifyService/routes/v1/moment/star.ts
  constant API_PREFIX (line 13) | const API_PREFIX = 'moment/star';

FILE: src/main/services/FastifyService/routes/v1/parse/analyze.ts
  constant API_PREFIX (line 20) | const API_PREFIX = 'parse/analyze';

FILE: src/main/services/FastifyService/routes/v1/parse/parse.ts
  constant API_PREFIX (line 9) | const API_PREFIX = 'parse';

FILE: src/main/services/FastifyService/routes/v1/parse/utils/mediaDirect.ts
  type IParseResult (line 9) | interface IParseResult {

FILE: src/main/services/FastifyService/routes/v1/plugin/index.ts
  constant API_PREFIX (line 13) | const API_PREFIX = 'plugin';

FILE: src/main/services/FastifyService/routes/v1/setting/index.ts
  constant API_PREFIX (line 16) | const API_PREFIX = 'setting';

FILE: src/main/services/FastifyService/routes/v1/system/binary.ts
  constant API_PREFIX (line 5) | const API_PREFIX = 'system/binary';

FILE: src/main/services/FastifyService/routes/v1/system/cdp.ts
  constant API_PREFIX (line 8) | const API_PREFIX = 'system/cdp';

FILE: src/main/services/FastifyService/routes/v1/system/ffmpeg.ts
  constant API_PREFIX (line 6) | const API_PREFIX = 'system/ffmpeg';

FILE: src/main/services/FastifyService/routes/v1/system/other.ts
  constant API_PREFIX (line 23) | const API_PREFIX = 'system';

FILE: src/main/services/FastifyService/routes/v1/system/process.ts
  constant API_PREFIX (line 5) | const API_PREFIX = 'system/process';

FILE: src/main/services/FastifyService/routes/v1/system/utils/sniffer.ts
  type ISnifferMediaResult (line 11) | interface ISnifferMediaResult {

FILE: src/main/services/FastifyService/schemas/base.ts
  type ResponseCode (line 19) | enum ResponseCode {

FILE: src/main/services/FastifyService/schemas/v0/proxy.ts
  constant TAG (line 6) | const TAG = '[proxy]work';

FILE: src/main/services/FastifyService/schemas/v1/aigc/chat.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[aigc]chat';

FILE: src/main/services/FastifyService/schemas/v1/aigc/memory.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[aigc]memory';

FILE: src/main/services/FastifyService/schemas/v1/data/cloud.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[data]cloud';

FILE: src/main/services/FastifyService/schemas/v1/data/db.ts
  constant API_PREFIX (line 8) | const API_PREFIX = '[data]db';

FILE: src/main/services/FastifyService/schemas/v1/file/film.ts
  constant API_PREFIX (line 4) | const API_PREFIX = '[file]film';

FILE: src/main/services/FastifyService/schemas/v1/file/manage.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[file]manage';

FILE: src/main/services/FastifyService/schemas/v1/flim/cms.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[film]cms';

FILE: src/main/services/FastifyService/schemas/v1/flim/edit.ts
  constant API_PREFIX (line 7) | const API_PREFIX = '[film]edit';

FILE: src/main/services/FastifyService/schemas/v1/flim/rec.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[film]rec';

FILE: src/main/services/FastifyService/schemas/v1/flim/site.ts
  constant API_PREFIX (line 7) | const API_PREFIX = '[film]site';

FILE: src/main/services/FastifyService/schemas/v1/live/channel.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[live]channel';

FILE: src/main/services/FastifyService/schemas/v1/live/iptv.ts
  constant API_PREFIX (line 7) | const API_PREFIX = '[live]iptv';

FILE: src/main/services/FastifyService/schemas/v1/moment/history.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[moment]history';

FILE: src/main/services/FastifyService/schemas/v1/moment/moment.ts
  constant API_PREFIX (line 9) | const API_PREFIX = '[moment]other';

FILE: src/main/services/FastifyService/schemas/v1/moment/star.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[moment]star';

FILE: src/main/services/FastifyService/schemas/v1/parse/analyze.ts
  constant API_PREFIX (line 7) | const API_PREFIX = '[parse]analyze';

FILE: src/main/services/FastifyService/schemas/v1/parse/parse.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[parse]other';

FILE: src/main/services/FastifyService/schemas/v1/plugin.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[plugin]work';

FILE: src/main/services/FastifyService/schemas/v1/setting.ts
  constant API_PREFIX (line 8) | const API_PREFIX = '[setting]work';

FILE: src/main/services/FastifyService/schemas/v1/system/binary.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[system]binary';

FILE: src/main/services/FastifyService/schemas/v1/system/cdp.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[system]cdp';

FILE: src/main/services/FastifyService/schemas/v1/system/ffmpeg.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[system]ffmpeg';

FILE: src/main/services/FastifyService/schemas/v1/system/other.ts
  constant API_PREFIX (line 12) | const API_PREFIX = '[system]other';

FILE: src/main/services/FastifyService/schemas/v1/system/process.ts
  constant API_PREFIX (line 6) | const API_PREFIX = '[system]process';

FILE: src/main/services/FileStorage.ts
  class FileStorage (line 13) | class FileStorage {
    method constructor (line 17) | constructor() {}
    method getInstance (line 19) | public static getInstance(): FileStorage {

FILE: src/main/services/LoggerService.ts
  function colorText (line 21) | function colorText(text: string, color: string) {
  constant SYSTEM_INFO (line 25) | const SYSTEM_INFO = {
  constant DEFAULT_LEVEL (line 30) | const DEFAULT_LEVEL = LEVEL.SILLY;
  class LoggerService (line 39) | class LoggerService {
    method constructor (line 52) | private constructor() {
    method getInstance (line 142) | public static getInstance(): LoggerService {
    method withContext (line 155) | public withContext(module: string, context?: Record<string, any>): Log...
    method finish (line 169) | public finish() {
    method processLog (line 180) | private processLog(source: LogSourceWithContext, level: LogLevel, mess...
    method error (line 270) | public error(message: any, ...data: LogContextData): void {
    method warn (line 277) | public warn(message: any, ...data: LogContextData): void {
    method info (line 284) | public info(message: any, ...data: LogContextData): void {
    method verbose (line 291) | public verbose(message: any, ...data: LogContextData): void {
    method debug (line 298) | public debug(message: any, ...data: LogContextData): void {
    method silly (line 305) | public silly(message: any, ...data: LogContextData): void {
    method processMainLog (line 315) | private processMainLog(level: LogLevel, message: any, data: any[]): vo...
    method setLevel (line 334) | public setLevel(level: LogLevel): void {
    method getLevel (line 342) | public getLevel(): LogLevel {
    method resetLevel (line 349) | public resetLevel(): void {
    method getBaseLogger (line 357) | public getBaseLogger(): winston.Logger {
    method getLogsDir (line 365) | public getLogsDir(): string {
    method registerIpcHandler (line 372) | private registerIpcHandler(): void {

FILE: src/main/services/MenuService.ts
  class MenuService (line 12) | class MenuService {
    method constructor (line 16) | constructor() {}
    method getInstance (line 18) | public static getInstance(): MenuService {
    method createMenu (line 25) | private createMenu() {
    method updateContextMenu (line 37) | private updateContextMenu() {
    method updateMenu (line 142) | public updateMenu(showMenu: boolean = false) {
    method destroyMenu (line 150) | private destroyMenu() {

FILE: src/main/services/NotificationService.ts
  class NotificationService (line 5) | class NotificationService {
    method constructor (line 8) | constructor(window: BrowserWindow) {
    method sendNotification (line 13) | public async sendNotification(notification: INotification) {

FILE: src/main/services/PluginService.ts
  type IPluginOptions (line 16) | interface IPluginOptions {
  type IPluginType (line 20) | enum IPluginType {
  type IPluginInfo (line 26) | interface IPluginInfo {
  type IRawModuleExports (line 42) | interface IRawModuleExports {
  type IModuleExports (line 51) | interface IModuleExports {
  class PluginService (line 133) | class PluginService {
    method constructor (line 140) | constructor(options?: Partial<IPluginOptions>) {
    method getInstance (line 146) | public static getInstance(): PluginService {
    method autoLaunch (line 153) | public async autoLaunch(): Promise<void> {
    method clean (line 171) | public async clean(): Promise<void> {
    method install (line 190) | public async install(projects: string[]): Promise<IModels['plugin'][]> {
    method uninstall (line 266) | public async uninstall(plugins: string[]): Promise<IModels['plugin'][]> {
    method start (line 302) | public async start(plugins: string[]): Promise<IModels['plugin'][]> {
    method stop (line 381) | public async stop(plugins: string[]): Promise<IModels['plugin'][]> {

FILE: src/main/services/ProtocolClient.ts
  function registerProtocolClient (line 15) | function registerProtocolClient(app: Electron.App) {
  function handleProtocolUrl (line 25) | function handleProtocolUrl(url: string) {
  function setupAppImageDeepLink (line 54) | async function setupAppImageDeepLink(): Promise<void> {
  function escapePathForExec (line 116) | function escapePathForExec(filePath: string): string {

FILE: src/main/services/ProxyManager.ts
  type IHostnameMatchType (line 18) | type IHostnameMatchType = 'exact' | 'wildcardSubdomain' | 'generalWildca...
  type ProxyBypassRuleType (line 21) | const enum ProxyBypassRuleType {
  type ParsedProxyBypassRule (line 28) | interface ParsedProxyBypassRule {
  class SelectiveDispatcher (line 308) | class SelectiveDispatcher extends Dispatcher {
    method constructor (line 312) | constructor(proxyDispatcher: Dispatcher, directDispatcher: Dispatcher) {
    method dispatch (line 318) | dispatch(opts: Dispatcher.DispatchOptions, handler: Dispatcher.Dispatc...
    method close (line 328) | async close(): Promise<void> {
    method destroy (line 337) | async destroy(): Promise<void> {
  class ProxyManager (line 346) | class ProxyManager {
    method constructor (line 364) | constructor() {
    method monitorSystemProxy (line 375) | private async monitorSystemProxy(): Promise<void> {
    method clearSystemProxyMonitor (line 399) | private clearSystemProxyMonitor(): void {
    method configureProxy (line 406) | async configureProxy(config: ProxyConfig): Promise<void> {
    method setEnvironment (line 451) | private setEnvironment(url: string): void {
    method setGlobalProxy (line 478) | private setGlobalProxy(config: ProxyConfig) {
    method setGlobalHttpProxy (line 486) | private setGlobalHttpProxy(config: ProxyConfig) {
    method bindHttpMethod (line 512) | private bindHttpMethod(originalMethod: Function, agent: http.Agent | h...
    method setGlobalFetchProxy (line 555) | private setGlobalFetchProxy(config: ProxyConfig) {
    method setSessionsProxy (line 591) | private async setSessionsProxy(config: ProxyConfig): Promise<void> {

FILE: src/main/services/PythonService.ts
  type IPythonOptions (line 16) | interface IPythonOptions {
  class PythonService (line 20) | class PythonService {
    method constructor (line 25) | constructor(options: IPythonOptions) {
    method checkBinary (line 30) | async checkBinary() {
    method matchProcess (line 39) | async matchProcess(kw: string): Promise<number[]> {
    method matchPort (line 43) | async matchPort(port: number): Promise<number[]> {
    method killProcess (line 47) | async killProcess(pids: number[]): Promise<boolean> {
    method installDep (line 51) | async installDep(pkgs: string[] = []): Promise<boolean> {
    method runSpawn (line 84) | runSpawn(
    method runExec (line 128) | async runExec(args: string[], venv: boolean = false): Promise<{ stdout...
    method runExecSync (line 143) | runExecSync(args: string[], venv: boolean = false): { stdout: string; ...

FILE: src/main/services/ShortcutService.ts
  type IShortcutPool (line 11) | interface IShortcutPool {
  class ShortcutService (line 21) | class ShortcutService {
    method constructor (line 25) | constructor() {}
    method getInstance (line 27) | public static getInstance(): ShortcutService {
    method registerGlobal (line 91) | public registerGlobal(id: string, config: IShortcutConfig, force: bool...
    method registerLocal (line 138) | public registerLocal(id: string, config: IShortcutConfig, force: boole...
    method register (line 197) | public register(id: string, config: IShortcutConfig, force: boolean = ...
    method isRegisteredGlobal (line 217) | public isRegisteredGlobal(id: string): boolean {
    method isRegisteredLocal (line 231) | public isRegisteredLocal(id: string, winName: string): boolean {
    method isRegistered (line 252) | public isRegistered(type: IShortcutType, id: string, winName?: string)...
    method unregisterGlobal (line 270) | public unregisterGlobal(id: string): boolean {
    method unregisterLocal (line 289) | public unregisterLocal(id: string, winName: string): boolean {
    method unregister (line 315) | public unregister(type: IShortcutType, id: string, winName?: string): ...
    method clear (line 333) | public clear(): void {

FILE: src/main/services/StorageService/ICloudStorage.ts
  class ICloudStorage (line 13) | class ICloudStorage {
    method constructor (line 17) | constructor() {}

FILE: src/main/services/StorageService/WebdavStorage.ts
  type IWebdavConfig (line 18) | interface IWebdavConfig {
  class WebdavStorage (line 26) | class WebdavStorage {
    method constructor (line 30) | constructor() {}
    method disconnect (line 161) | public disconnect(): void {

FILE: src/main/services/ThemeService.ts
  class ThemeService (line 10) | class ThemeService {
    method constructor (line 14) | constructor() {
    method getInstance (line 18) | public static async getInstance(): Promise<ThemeService> {
    method init (line 26) | private init() {
    method themeUpdatedHandler (line 36) | private themeUpdatedHandler() {
    method setTheme (line 50) | public async setTheme(theme: ITheme) {

FILE: src/main/services/TrayService.ts
  class TrayService (line 15) | class TrayService {
    method constructor (line 20) | constructor() {}
    method getInstance (line 22) | public static getInstance(): TrayService {
    method createTray (line 29) | private createTray() {
    method updateContextMenu (line 71) | private updateContextMenu() {
    method updateTray (line 118) | public updateTray(showTray: boolean = false) {
    method destroyTray (line 133) | private destroyTray() {

FILE: src/main/services/WebviewService.ts
  function initSessionUserAgent (line 10) | function initSessionUserAgent() {

FILE: src/main/services/WindowService.ts
  class WindowService (line 28) | class WindowService {
    method getInstance (line 32) | public static getInstance(): WindowService {
    method computedSize (line 39) | public computedSize(size: number): number {
    method getWindowSize (line 43) | public getWindowSize(name: string, type: 'default' | 'min' = 'default'...
    method getAllNames (line 55) | public getAllNames(): string[] {
    method getAllWindows (line 59) | public getAllWindows(): BrowserWindow[] {
    method getWindowName (line 63) | public getWindowName(mainWindow: BrowserWindow): string | null {
    method getWindow (line 73) | public getWindow(window: string | BrowserWindow): BrowserWindow | null {
    method setZoomWindow (line 85) | public setZoomWindow(window: string | BrowserWindow, zoom: number) {
    method setZoomWindows (line 134) | public setZoomWindows(zoom: number) {
    method showWindow (line 139) | public showWindow(window: string | BrowserWindow) {
    method showAllWindows (line 205) | public showAllWindows() {
    method hideWindow (line 210) | public hideWindow(window: string | BrowserWindow) {
    method hideAllWindows (line 235) | public hideAllWindows() {
    method toggleWindow (line 240) | public toggleWindow(window: string | BrowserWindow) {
    method toggleAllWindows (line 257) | public toggleAllWindows() {
    method closeWindow (line 266) | public closeWindow(window: string | BrowserWindow) {
    method reloadWindow (line 289) | public reloadWindow(window: string | BrowserWindow, force: boolean = f...
    method reloadAllWindows (line 297) | public reloadAllWindows(force: boolean = false) {
    method safeClose (line 302) | private safeClose(mainWindow: BrowserWindow) {
    method setupWindowMonitor (line 319) | private setupWindowMonitor(mainWindow: BrowserWindow) {
    method setupContextMenu (line 336) | private setupContextMenu(mainWindow: BrowserWindow) {
    method setupWindowEvents (line 351) | private setupWindowEvents(mainWindow: BrowserWindow) {
    method setupWebContentsHandlers (line 404) | private setupWebContentsHandlers(mainWindow: BrowserWindow) {
    method setupWebRequestHeaders (line 458) | private setupWebRequestHeaders(mainWindow: BrowserWindow) {
    method createWindow (line 595) | public createWindow(windowName: string, options?: BrowserWindowConstru...
    method createMainWindow (line 646) | public createMainWindow(): BrowserWindow {
    method createPlayerWindow (line 708) | public createPlayerWindow(): BrowserWindow {
    method createBrowserWindow (line 777) | public createBrowserWindow(): BrowserWindow {
    method createSnifferWindow (line 841) | public createSnifferWindow(uuid: string): BrowserWindow {

FILE: src/main/types/argv.ts
  type INativeCliOptions (line 6) | interface INativeCliOptions {
  type NativeParsedArgs (line 15) | interface NativeParsedArgs {

FILE: src/main/types/server.ts
  type Schema (line 1) | enum Schema {

FILE: src/main/types/tvbox.ts
  type TvboxLiveOldItem (line 1) | interface TvboxLiveOldItem {
  type TvboxLiveNewItem (line 9) | interface TvboxLiveNewItem {
  type TvboxParseItem (line 20) | interface TvboxParseItem {
  type TvboxSiteItem (line 28) | interface TvboxSiteItem {
  type TvboxIjkItem (line 41) | interface TvboxIjkItem {
  type Tvbox (line 50) | interface Tvbox {
  type CatvodSiteItem (line 63) | interface CatvodSiteItem {
  type Catvod (line 70) | interface Catvod {

FILE: src/main/utils/file.ts
  type IFileState (line 24) | type IFileState = 'file' | 'dir' | 'unknown';
  type IFileLink (line 25) | type IFileLink = 'link' | 'strict' | 'unknown';
  type IFileMode (line 26) | type IFileMode = fs.Mode;
  type IFileMetadata (line 27) | interface IFileMetadata {
  function calculateBytes (line 1258) | async function calculateBytes(itemPath: string): Promise<number> {
  function calculateBytesSync (line 1338) | function calculateBytesSync(itemPath: string): number {

FILE: src/main/utils/hiker/baseSpider.ts
  class BaseSpider (line 3) | class BaseSpider {
    method constructor (line 12) | constructor() {
    method fetch (line 22) | async fetch(url: string, options: Record<string, any>) {
    method homeContent (line 33) | async homeContent() {}
    method categoryContent (line 35) | async categoryContent() {}
    method detailContent (line 37) | async detailContent() {}
    method searchContent (line 39) | async searchContent() {}
    method playerContent (line 41) | async playerContent() {}
    method homeVideoContent (line 43) | async homeVideoContent() {}
    method localProxy (line 45) | async localProxy() {}
    method action (line 47) | async action() {}

FILE: src/main/utils/hiker/htmlParser.ts
  constant PARSE_CACHE (line 6) | const PARSE_CACHE = true;
  constant NOADD_INDEX (line 7) | const NOADD_INDEX = ':eq|:lt|:gt|:first|:last|:not|:even|:odd|:has|:cont...
  constant URLJOIN_ATTR (line 8) | const URLJOIN_ATTR = '(url|src|href|-original|-src|-play|-url|style)$|^(...
  constant SPECIAL_URL (line 9) | const SPECIAL_URL = '^(ftp|magnet|thunder|ws):';
  class Jsoup (line 11) | class Jsoup {
    method constructor (line 18) | constructor(MY_URL: string = '') {
    method test (line 23) | test(text: string, string: string): boolean {
    method contains (line 29) | contains(text: string, match: string): boolean {
    method parseHikerToJq (line 36) | parseHikerToJq(parse: string, first: boolean = false): string {
    method getParseInfo (line 69) | getParseInfo(nparse: string): { nparse_rule: string; nparse_index: num...
    method reorderAdjacentLtAndGt (line 98) | reorderAdjacentLtAndGt(selector: string): string {
    method parseOneRule (line 121) | parseOneRule(doc: CheerioAPI, nparse: string, ret: Cheerio<any> | null...
    method parseText (line 141) | parseText(text: string) {
    method pdfa (line 157) | pdfa(html: string, parse: string): string[] {
    method pdfl (line 184) | pdfl(html: string, parse: string, list_text: string, list_url: string,...
    method pdfh (line 221) | pdfh(html: string, parse: string, baseUrl: string = ''): string {
    method pd (line 304) | pd(html: string, parse: string, baseUrl: string = ''): string {
    method pq (line 309) | pq(html: string) {
    method pjfh (line 313) | pjfh(html: any, parse: string, addUrl = false): string {
    method pj (line 337) | pj(html: any, parse: string): string {
    method pjfa (line 341) | pjfa(html: any, parse: string): string[] {

FILE: src/main/utils/hiker/jinja.ts
  constant STRINGS (line 22) | const STRINGS = /'(\\.|[^'])*'|"(\\.|[^"'])*"/g;
  constant IDENTS_AND_NUMS (line 23) | const IDENTS_AND_NUMS = /([$_a-z][$\w]*)|([+-]?\d+(\.\d+)?)/g;
  constant NUMBER (line 24) | const NUMBER = /^[+-]?\d+(?:\.\d+)?$/;
  constant NON_PRIMITIVES (line 26) | const NON_PRIMITIVES = /\[[@#~](,[@#~])*\]|\[\]|\{([@i]:[@#~])(,[@i]:[@#...
  constant IDENTIFIERS (line 28) | const IDENTIFIERS = /[$_a-z][$\w]*/gi;
  constant VARIABLES (line 29) | const VARIABLES = /i(\.i|\[[@#i]\])*/g;
  constant ACCESSOR (line 30) | const ACCESSOR = /(\.i|\[[@#i]\])/g;
  constant OPERATORS (line 31) | const OPERATORS = /(===?|!==?|>=?|<=?|&&|\|\||[+\-*/%])/g;
  constant EOPS (line 33) | const EOPS = /(^|[^$\w])(and|or|not|is|isnot)([^$\w]|$)/g;
  constant LEADING_SPACE (line 34) | const LEADING_SPACE = /^\s+/;
  constant TRAILING_SPACE (line 35) | const TRAILING_SPACE = /\s+$/;
  constant START_TOKEN (line 37) | const START_TOKEN = /\{\{\{|\{\{|\{%|\{#/;
  constant TAGS (line 38) | const TAGS: Record<string, RegExp> = {
  class Parser (line 65) | class Parser {
    method constructor (line 77) | constructor() {}
    method push (line 81) | push(line: string): void {
    method parse (line 87) | parse(src: string): string[] {
    method tokenize (line 92) | tokenize(src: string): void {
    method textHandler (line 135) | textHandler(text: string): void {
    method tokenHandler (line 139) | tokenHandler(open: string, inner: string): void {
    method compileTag (line 161) | compileTag(str: string): void {
    method parseFilter (line 168) | parseFilter(src: string): string {
    method extractEnt (line 179) | extractEnt(
    method injectEnt (line 197) | injectEnt(extracted: { src: string; subs: string[] }, placeholder: str...
    method replaceComplex (line 212) | replaceComplex(s: string): string[] {
    method parseExpr (line 220) | parseExpr(src: string, opts?: { terms?: boolean }): string {
    method parseVar (line 281) | parseVar(src: string, ...rest: any[]): string {
    method escName (line 304) | escName(str: string): string {
    method parseQuoted (line 310) | parseQuoted(str: string): string {
  type TagHandlerContext (line 323) | interface TagHandlerContext extends Parser {}
  method if (line 326) | if(expr) {
  method else (line 330) | else() {
  method elseif (line 337) | elseif(expr) {
  method endif (line 340) | endif() {
  method for (line 344) | for(str) {
  method endfor (line 351) | endfor() {
  method raw (line 355) | raw() {
  method endraw (line 358) | endraw() {
  method set (line 361) | set(stmt) {
  method block (line 367) | block(name) {
  method endblock (line 380) | endblock() {
  method extends (line 389) | extends(name) {
  method include (line 399) | include(name) {
  type RuntimeOptions (line 413) | interface RuntimeOptions {
  type Runtime (line 418) | interface Runtime {
  function F (line 451) | function F() {}
  method html (line 543) | html(val: any) {
  method safe (line 554) | safe(val: any) {
  method toJson (line 557) | toJson(val: any) {
  function trimLeft (line 577) | function trimLeft(str: string): string {
  function trimRight (line 581) | function trimRight(str: string): string {
  function matchAll (line 585) | function matchAll(str: string, reg: RegExp, fn: (m: string, i: number, s...
  method compile (line 600) | compile(markup: string, opts?: { runtime?: boolean }): { render: (data: ...
  method render (line 626) | render(markup: string, data: any, opts: any): string {
  method readTemplateFile (line 633) | readTemplateFile(name: string): string {

FILE: src/main/utils/hiker/request/asyncAxios.ts
  type HttpMethod (line 17) | type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD';
  type RequestOptions (line 19) | interface RequestOptions {

FILE: src/main/utils/hiker/request/syncFetch.ts
  type HttpMethod (line 41) | type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD';
  type RequestOptions (line 43) | interface RequestOptions {

FILE: src/main/utils/hiker/request/syncRequest.ts
  type HttpMethod (line 54) | type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD';
  type RequestOptions (line 56) | interface RequestOptions {

FILE: src/main/utils/hiker/ruleParse.ts
  function compareStrings (line 41) | function compareStrings(a, b) {

FILE: src/main/utils/hiker/similarity.ts
  type IRating (line 1) | interface IRating {
  type ILCSResult (line 6) | interface ILCSResult {
  type ILCSMatch (line 12) | interface ILCSMatch {

FILE: src/main/utils/hiker/ua.ts
  constant MOBILE_UA (line 3) | const MOBILE_UA = USER_AGENT.MOBILE_ANDROID_PIXEL;
  constant PC_UA (line 4) | const PC_UA = USER_AGENT.PC_WIN32_CHROME;
  constant UC_UA (line 6) | const UC_UA = USER_AGENT.MOBILE_ANDROID_MI_UC;
  constant IOS_UA (line 7) | const IOS_UA = USER_AGENT.MOBILE_IOS_SAFARI;

FILE: src/main/utils/ip.ts
  type IIpVersion (line 4) | type IIpVersion = 4 | 6 | -1;
  type IIpInfo (line 6) | interface IIpInfo {
  type IIpLocation (line 12) | interface IIpLocation {
  type IIp (line 20) | type IIp = IIpInfo & { location: Partial<IIpLocation> };

FILE: src/main/utils/path.ts
  constant ELECTRON_PATHS (line 9) | const ELECTRON_PATHS = [
  type IElectronPath (line 28) | type IElectronPath = (typeof ELECTRON_PATHS)[number];
  constant SYSTEM_PATHS (line 30) | const SYSTEM_PATHS = ['runtime', 'resources', ...ELECTRON_PATHS] as const;
  type ISystemPath (line 32) | type ISystemPath = (typeof SYSTEM_PATHS)[number];
  constant HOME_PATHS (line 34) | const HOME_PATHS = ['bin'] as const;
  type IHomePath (line 36) | type IHomePath = (typeof HOME_PATHS)[number];
  constant USER_PATHS (line 38) | const USER_PATHS = ['database', 'file', 'log', 'plugin', 'temp'] as const;
  type IUserPath (line 40) | type IUserPath = (typeof USER_PATHS)[number];
  constant APP_CRASH_PATH (line 83) | const APP_CRASH_PATH: string = getSystemPath('crashDumps');
  constant APP_EXE_PATH (line 84) | const APP_EXE_PATH: string = getSystemPath('exe');
  constant APP_HOME_PATH (line 85) | const APP_HOME_PATH: string = getSystemPath('home');
  constant APP_PUBLIC_PATH (line 86) | const APP_PUBLIC_PATH: string = getSystemPath('resources');
  constant APP_RUNTIME_PATH (line 87) | const APP_RUNTIME_PATH: string = getSystemPath('runtime');
  constant APP_STORE_PATH (line 88) | const APP_STORE_PATH: string = getSystemPath('userData');
  constant APP_DATABASE_PATH (line 90) | const APP_DATABASE_PATH: string = getUserPath('database');
  constant APP_FILE_PATH (line 91) | const APP_FILE_PATH: string = getUserPath('file');
  constant APP_LOG_PATH (line 92) | const APP_LOG_PATH: string = getUserPath('log');
  constant APP_PLUGIN_PATH (line 93) | const APP_PLUGIN_PATH: string = getUserPath('plugin');
  constant APP_TEMP_PATH (line 94) | const APP_TEMP_PATH: string = getUserPath('temp');
  constant HOME_BIN_PATH (line 96) | const HOME_BIN_PATH: string = getHomePath('bin');
  constant APP_REQUIRE_PATH (line 98) | const APP_REQUIRE_PATH: string[] = [

FILE: src/main/utils/process.ts
  function getBinaryName (line 27) | function getBinaryName(name: string): string {
  function downBinary (line 37) | function downBinary(scriptPath: string): Promise<void> {
  function chmodBinary (line 76) | async function chmodBinary(binaryPath: string, permission: IFileMode): P...
  function chmodBinarySync (line 98) | function chmodBinarySync(binaryPath: string, permission: IFileMode): boo...
  function matchPs (line 119) | async function matchPs(keyword: string): Promise<number[]> {
  function matchPsSync (line 153) | function matchPsSync(keyword: string): number[] {
  function matchPort (line 187) | async function matchPort(port: number): Promise<number[]> {
  function matchPortSync (line 221) | function matchPortSync(port: number): number[] {
  function killPid (line 255) | async function killPid(pids: number[]): Promise<boolean> {
  function killPidSync (line 277) | function killPidSync(pids: number[]): boolean {
  function isWindowsPowerShell (line 298) | async function isWindowsPowerShell(): Promise<boolean> {
  function isWindowsPowerShellSync (line 312) | function isWindowsPowerShellSync(): boolean {

FILE: src/main/utils/request/index.ts
  function createAxios (line 138) | function createAxios(opt?: Partial<CreateAxiosOptions>) {

FILE: src/main/utils/systeminfo.ts
  function getSystemInfo (line 67) | function getSystemInfo(): ISystemInfo {
  function generateUserAgent (line 114) | function generateUserAgent(): string {

FILE: src/preload/index.ts
  type WindowApiType (line 33) | type WindowApiType = typeof api;

FILE: src/preload/preload.d.ts
  type Window (line 6) | interface Window {

FILE: src/preload/utils/dom.ts
  function domReady (line 2) | function domReady(condition: DocumentRe
Condensed preview — 637 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,204K chars).
[
  {
    "path": ".editorconfig",
    "chars": 476,
    "preview": "# @see: http://editorconfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Tab indentation\n[*]\nindent_style = space\nen"
  },
  {
    "path": ".env.example",
    "chars": 195,
    "preview": "ELECTRON_WEB_SERVER_PORT = 42710\nELECTRON_DEV_NETEASE_API_PORT = 30001\nVITE_API_PORT = 9978\nVITE_API_URL = http://127.0."
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".gitattributes",
    "chars": 242,
    "preview": "* text=auto eol=lf\n\nLICENSE.txt eol=crlf\nThirdPartyNotices.txt eol=crlf\n\n*.bat eol=crlf\n*.cmd eol=crlf\n*.ps1 eol=lf\n*.sh"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 54,
    "preview": "ko_fi: hiramwong\ncustom: [https://ifdian.net/a/hiram]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.zh-CN.yml",
    "chars": 1407,
    "preview": "name: 反馈 Bug\ndescription: 通过 github 模板进行 Bug 反馈。\ntitle: '[组件名称] 描述问题的标题'\nbody:\n  - type: markdown\n    attributes:\n      "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-report.zh-CN.yml",
    "chars": 850,
    "preview": "name: 反馈新功能\ndescription: 通过 github 模板进行新功能反馈。\ntitle: '[组件名称] 描述问题的标题'\nbody:\n  - type: markdown\n    attributes:\n      val"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 605,
    "preview": "<!--\n首先,感谢你的贡献!😄\n请阅读并遵循 [zyfun 贡献指南],填写以下 pull request 的信息。\nPR 在维护者审核通过后会合并,谢谢!\n-->\n\n### 🤔 这个 PR 的性质是?\n\n- [ ] 日常 bug 修复\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 343,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: 'github-actions'\n    directory: '/'\n    schedule:\n      interval: 'monthly'\n "
  },
  {
    "path": ".github/workflows/nightly-build.yml",
    "chars": 12161,
    "preview": "name: Nightly Build\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 17 * * *' # 1:00 BJ Time\n\npermissions:\n  conten"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 4375,
    "preview": "name: Release\n\non:\n  workflow_dispatch:\n    inputs:\n      tag:\n        description: 'Release tag (e.g. v1.0.0)'\n        "
  },
  {
    "path": ".gitignore",
    "chars": 1177,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\npnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n\n# Dependencies\nnode_m"
  },
  {
    "path": ".ncurc.yaml",
    "chars": 642,
    "preview": "reject:\n  # Electron\n  - vite\n  - '@electron/notarize'\n  - electron\n  - electron-builder\n  - electron-updater\n  - electr"
  },
  {
    "path": ".node-version",
    "chars": 8,
    "preview": "24.11.1\n"
  },
  {
    "path": ".npmrc",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".nvmrc",
    "chars": 8,
    "preview": "24.11.1\n"
  },
  {
    "path": ".prettierignore",
    "chars": 79,
    "preview": "out\ndist\npnpm-lock.yaml\nLICENSE.md\ntsconfig.json\ntsconfig.*.json\nCHANGELOG*.md\n"
  },
  {
    "path": ".prettierrc.yaml",
    "chars": 800,
    "preview": "# 一行最多 120 字符\nprintWidth: 120\n# 使用 2 个空格缩进\ntabWidth: 2\n# 不使用缩进符,而使用空格\nuseTabs: false\n# 行尾需要有分号\nsemi: true\n# 使用单引号\nsingle"
  },
  {
    "path": ".stylelintignore",
    "chars": 70,
    "preview": "# .stylelintignore\n# 旧的不需打包的样式库\n*.min.css\n\n# 其他类型文件\n*.js\n*.jpg\n*.woff\n"
  },
  {
    "path": ".stylelintrc.yml",
    "chars": 610,
    "preview": "defaultSeverity: error\n\nextends:\n  - stylelint-config-standard\n\nplugins:\n  - stylelint-order\n\nrules:\n  no-descending-spe"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 284,
    "preview": "{\n  \"recommendations\": [\n    \"dbaeumer.vscode-eslint\",\n    \"esbenp.prettier-vscode\",\n    \"editorconfig.editorconfig\",\n  "
  },
  {
    "path": ".vscode/launch.json",
    "chars": 915,
    "preview": "{\n  \"compounds\": [\n    {\n      \"configurations\": [\"Debug Main Process\", \"Debug Renderer Process\"],\n      \"name\": \"Debug "
  },
  {
    "path": ".vscode/mcp.json",
    "chars": 474,
    "preview": "{\n  \"servers\": {\n    \"debug-electron-mcp\": {\n      \"args\": [\"-y\", \"@debugelectron/debug-electron-mcp@latest\"],\n      \"co"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 2031,
    "preview": "{\n  \"[css]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n  },\n  \"[javascript]\": {\n    \"editor.defaultForma"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 22172,
    "preview": "# Changelog\n\n> All notable changes to this project will be documented in this file.\n\n## 3.4.4\n\n- 优化: mac/window侧边栏配色\n- 修"
  },
  {
    "path": "LICENSE.txt",
    "chars": 35184,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\r\n                       Version 3, 19 November 2007\r\n\r\n Copyright "
  },
  {
    "path": "README.md",
    "chars": 22264,
    "preview": "<div align=\"right\">\n  <details>\n    <summary >🌐 Language</summary>\n    <div>\n      <div align=\"center\">\n        <a href="
  },
  {
    "path": "SECURITY.md",
    "chars": 346,
    "preview": "## Security\n\nWe takes the security of our software products and services seriously, which\nincludes all source code repos"
  },
  {
    "path": "ThirdPartyNotices.txt",
    "chars": 212696,
    "preview": "NOTICES\r\n\r\nThis repository incorporates material as listed below or described in the code.\r\n\r\n\r\n------------------------"
  },
  {
    "path": "build/entitlements.mac.inherit.plist",
    "chars": 304,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "build/entitlements.mac.plist",
    "chars": 491,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "build/nsis-installer.nsh",
    "chars": 4528,
    "preview": ";Inspired by:\n; https://gist.github.com/bogdibota/062919938e1ed388b3db5ea31f52955c\n; https://stackoverflow.com/questions"
  },
  {
    "path": "commitlint.config.js",
    "chars": 324,
    "preview": "// commit-lint config\nexport default {\n  extends: ['@commitlint/config-conventional'],\n  rules: {\n    // @see https://co"
  },
  {
    "path": "dev-app-update.yml",
    "chars": 82,
    "preview": "provider: github\nowner: Hiram-Wong\nrepo: zyfun\nupdaterCacheDirName: zyfun-updater\n"
  },
  {
    "path": "docs/Conventional_Commits.md",
    "chars": 2477,
    "preview": "> 参考[Conventional Commits](https://www.conventionalcommits.org/zh-hans/v1.0.0/)\n\n## 结构\n\n提交信息由 三部分组成:\n\n1. 标题 (Header):简洁描"
  },
  {
    "path": "docs/Develop.md",
    "chars": 1086,
    "preview": "# 🖥️ Develop\n\n## IDE Setup\n\n### VSCode like\n\n- Editor: [VS Code](https://code.visualstudio.com), etc. Any VS Code compat"
  },
  {
    "path": "docs/HarmonyOS_Electron.md",
    "chars": 5399,
    "preview": "# HarmonyOS Electron 快速上手指南\n\n本指南将帮助您在 30 分钟内快速上手 HarmonyOS Electron 开发。\n\n## 📋 准备清单\n\n### 开发环境\n\n- [ ] DevEco Studio 4.0+\n-"
  },
  {
    "path": "docs/Loong_Electron.md",
    "chars": 1667,
    "preview": "# Loong Electron 快速上手指南\n\n本指南将帮助您在 5 分钟内快速上手 Loong Electron 开发。\n\n[uos loong文档](https://uosdn.uniontech.com/#document3?dir"
  },
  {
    "path": "docs/Mcp.md",
    "chars": 719,
    "preview": "# Mcp\n\n### debug-electron-mcp\n\n> [Document](https://github.com/TheDarkSkyXD/debug-electron-mcp)\n\n```json\n{\n  \"debug-elec"
  },
  {
    "path": "electron-builder.yml",
    "chars": 4706,
    "preview": "# see config at https://www.electron.build/configuration\n\nappId: com.github.zyfun\nproductName: zyfun\ncopyright: Copyrigh"
  },
  {
    "path": "electron.vite.config.ts",
    "chars": 7230,
    "preview": "import { resolve } from 'node:path';\nimport process from 'node:process';\n\nimport { TDesignResolver } from '@tdesign-vue-"
  },
  {
    "path": "eslint.config.js",
    "chars": 4045,
    "preview": "import antfu from '@antfu/eslint-config';\nimport { globalIgnores } from 'eslint/config';\nimport prettier from 'eslint-pl"
  },
  {
    "path": "package.json",
    "chars": 11366,
    "preview": "{\n  \"name\": \"zyfun\",\n  \"version\": \"3.4.4-rc4\",\n  \"private\": true,\n  \"description\": \"Discover the world by watching movie"
  },
  {
    "path": "packages/shared/config/appinfo.ts",
    "chars": 1001,
    "preview": "import pkg from '@pkg';\n\n// App information\nexport const APP_NAME: string = pkg.name;\nexport const APP_NAME_ALIAS: strin"
  },
  {
    "path": "packages/shared/config/cmsAction.ts",
    "chars": 1757,
    "preview": "export const CMS_ACTION_TYPE = {\n  INPUT: 'input',\n  EDIT: 'edit',\n  MULTI_INPUT: 'multiInput',\n  MULTI_INPUT_X: 'multiI"
  },
  {
    "path": "packages/shared/config/constant.ts",
    "chars": 1062,
    "preview": "export const ZOOM_LEVELS = [0.25, 0.33, 0.5, 0.67, 0.75, 0.8, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4, 5];\n\n// 从 ZOOM"
  },
  {
    "path": "packages/shared/config/data.ts",
    "chars": 1482,
    "preview": "export const DATA_IMPORT_TYPE = {\n  SIMPLE: 'simple',\n  COMPLETE: 'complete',\n} as const;\nexport type IDataImportType = "
  },
  {
    "path": "packages/shared/config/dns.ts",
    "chars": 328,
    "preview": "export enum DNS {\n  TENCENT = 'https://sm2.doh.pub/dns-query',\n  ALI = 'https://dns.alidns.com/dns-query',\n  QIHOO = 'ht"
  },
  {
    "path": "packages/shared/config/env.ts",
    "chars": 486,
    "preview": "export const ORIGIN = import.meta.env.VITE_API_URL;\nexport const PORT = import.meta.env.VITE_API_PORT;\nexport const PREF"
  },
  {
    "path": "packages/shared/config/film.ts",
    "chars": 1910,
    "preview": "export const SITE_TYPE = {\n  T0_XML: 0,\n  T1_JSON: 1,\n  T4_DRPYJS0: 2,\n  T4_DRPYS: 6,\n  T3_DRPY: 7,\n  T4_CATVOD: 8,\n  T3"
  },
  {
    "path": "packages/shared/config/ipcChannel.ts",
    "chars": 3441,
    "preview": "export enum IPC_CHANNEL {\n  // api\n  API_SERVER_START = 'api-server:start',\n  API_SERVER_STOP = 'api-server:stop',\n  API"
  },
  {
    "path": "packages/shared/config/live.ts",
    "chars": 196,
    "preview": "export const IPTV_TYPE = {\n  REMOTE: 1,\n  LOCAL: 2,\n  MANUAL: 3,\n} as const;\nexport type IIptvType = (typeof IPTV_TYPE)["
  },
  {
    "path": "packages/shared/config/logger.ts",
    "chars": 2340,
    "preview": "export interface LogSourceWithContext {\n  process: 'main' | 'renderer';\n  window?: string; // only for renderer process\n"
  },
  {
    "path": "packages/shared/config/notification.ts",
    "chars": 802,
    "preview": "export type INotificationType = 'progress' | 'success' | 'error' | 'warning' | 'info' | 'action';\nexport type INotificat"
  },
  {
    "path": "packages/shared/config/parse.ts",
    "chars": 197,
    "preview": "export const ANALYZE_TYPE = {\n  WEB: 1,\n  JSON: 2,\n} as const;\nexport type IAnalyzeType = (typeof ANALYZE_TYPE)[keyof ty"
  },
  {
    "path": "packages/shared/config/req.ts",
    "chars": 1216,
    "preview": "export const REQ_METHOD = {\n  GET: 'GET',\n  POST: 'POST',\n  PUT: 'PUT',\n  DELETE: 'DELETE',\n  PATCH: 'PATCH',\n  HEAD: 'H"
  },
  {
    "path": "packages/shared/config/setting.ts",
    "chars": 994,
    "preview": "export enum SNIFFER_TYPE {\n  CDP = 'cdp',\n  CUSTOM = 'custom',\n}\nexport type ISnifferType = `${SNIFFER_TYPE}`;\n\nexport e"
  },
  {
    "path": "packages/shared/config/shortcut.ts",
    "chars": 334,
    "preview": "export enum SHORTCUT_TYPE {\n  GLOBAL = 'global',\n  LOCAL = 'local',\n}\nexport type IShortcutType = (typeof SHORTCUT_TYPE)"
  },
  {
    "path": "packages/shared/config/tblSetting.ts",
    "chars": 3854,
    "preview": "import type { IAigcProviderType, IPlayerType, IRecHotType, ISnifferType } from '../config/setting';\nimport type { ITheme"
  },
  {
    "path": "packages/shared/config/theme.ts",
    "chars": 174,
    "preview": "export enum THEME {\n  LIGHT = 'light',\n  DARK = 'dark',\n  SYSTEM = 'system',\n}\n\nexport type ITheme = `${THEME}`;\nexport "
  },
  {
    "path": "packages/shared/config/userAgent.ts",
    "chars": 1346,
    "preview": "export enum USER_AGENT {\n  PC_DARWIN_CHROME = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML"
  },
  {
    "path": "packages/shared/config/window.ts",
    "chars": 889,
    "preview": "export enum WINDOW_NAME {\n  MAIN = 'main',\n  PLAYER = 'player',\n  SNIFFER = 'sniffer',\n  BROWSER = 'browser',\n  OTHER = "
  },
  {
    "path": "packages/shared/config/xmlOptions.ts",
    "chars": 315,
    "preview": "// @see https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v6/3.Options.md\nexport const defaultOpti"
  },
  {
    "path": "packages/shared/locales/index.ts",
    "chars": 1441,
    "preview": "const langModules = import.meta.glob('./lang/*/index.ts', { eager: true });\n\nconst langModuleMap = new Map<string, objec"
  },
  {
    "path": "packages/shared/locales/lang/en-US/aigc.ts",
    "chars": 922,
    "preview": "export default {\n  title: 'Intelligent Assistant',\n  subheading: 'AIGC',\n  field: {\n    key: 'Key',\n    model: 'Model',\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/common.ts",
    "chars": 3594,
    "preview": "export default {\n  success: 'Success',\n  fail: 'Fail',\n  copy: 'Copy',\n  copySuccess: 'Copy Success',\n  copyFail: 'Copy "
  },
  {
    "path": "packages/shared/locales/lang/en-US/component.ts",
    "chars": 1274,
    "preview": "export default {\n  action: {\n    countdown: '{0}s to close',\n    fullview: 'Full View',\n  },\n  hot: {\n    title: 'Hot Se"
  },
  {
    "path": "packages/shared/locales/lang/en-US/index.ts",
    "chars": 369,
    "preview": "import componentsLocale from 'tdesign-vue-next/es/locale/en_US';\n\nimport aigc from './aigc';\nimport common from './commo"
  },
  {
    "path": "packages/shared/locales/lang/en-US/media.ts",
    "chars": 479,
    "preview": "export default {\n  decoder: 'Decoder',\n  decoderMap: {\n    audio: 'Audio',\n    hls: 'Hls',\n    flv: 'Flv',\n    mp4: 'Mp4"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/binary-help.md",
    "chars": 447,
    "preview": "- Click to install and it will be added to the task queue, no need to click multiple times to trigger, wait patiently.\n-"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/custom-player.md",
    "chars": 477,
    "preview": "> Dependent software path or env\n\n- How to set:\n  - Windows: `software -> right-click -> properties -> target`\n  - Mac: "
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/disclaimer.md",
    "chars": 5445,
    "preview": "> Release date: December 1, 2025\n\n> Effective Date: December 1, 2025\n\n**Thank you for choosing to use `zyfun` (hereinaft"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/lab-edit-help.md",
    "chars": 859,
    "preview": "- Init\n  - The ext parameter will be lost every time it is initialized, to use the ext parameter you need to go to [Sett"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/live-epg.md",
    "chars": 658,
    "preview": "**The absence of electronic program listings for some channels is a normal phenomenon and is controlled by a third-party"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/assets/live-logo.md",
    "chars": 368,
    "preview": "**It is normal that some channels are not labeled, which is controlled by third-party data platforms.**\n\n- Configuration"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/browser.ts",
    "chars": 394,
    "preview": "export default {\n  title: 'Browser',\n  message: {\n    tabOverflow: 'Too many tabs, please close some tabs',\n    noSuppor"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/film.ts",
    "chars": 1759,
    "preview": "export default {\n  title: 'Film',\n  noDesc: 'No plot summary',\n  info: {\n    type: 'Type',\n    area: 'Area',\n    release"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/index.ts",
    "chars": 401,
    "preview": "import browser from './browser';\nimport film from './film';\nimport lab from './lab';\nimport live from './live';\nimport m"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/lab.ts",
    "chars": 7442,
    "preview": "export default {\n  title: 'Lab',\n  crypto: {\n    title: 'Char Encoding',\n    field: {\n      content: 'Content',\n      ke"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/live.ts",
    "chars": 682,
    "preview": "export default {\n  title: 'Live',\n  delay: 'Delay',\n  infiniteLoading: {\n    noConfig: 'Please go to [Setting->Live Conf"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/md.ts",
    "chars": 1030,
    "preview": "import binaryHelpMD from './assets/binary-help.md?raw';\nimport customPlayerMD from './assets/custom-player.md?raw';\nimpo"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/moment.ts",
    "chars": 399,
    "preview": "export default {\n  title: 'Moment',\n  history: {\n    title: 'History',\n  },\n  star: {\n    title: 'Favorite',\n    checkUp"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/parse.ts",
    "chars": 1006,
    "preview": "export default {\n  title: 'Analyze',\n  play: 'Play',\n  search: {\n    input: 'Enter keyword to search',\n    enter: 'Enter"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/player.ts",
    "chars": 2005,
    "preview": "export default {\n  title: 'Player',\n  film: {\n    desc: 'Description',\n    anthology: 'Anthology',\n    episode: 'Episode"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/plugin.ts",
    "chars": 968,
    "preview": "export default {\n  title: 'Plugin',\n  field: {\n    typeMap: {\n      ui: 'UI',\n      system: 'System',\n      mix: 'Mix',\n"
  },
  {
    "path": "packages/shared/locales/lang/en-US/pages/setting.ts",
    "chars": 5013,
    "preview": "export default {\n  title: 'Setting',\n  nav: {\n    baseConfig: 'Base Config',\n    dataManage: 'Data Manage',\n    filmSour"
  },
  {
    "path": "packages/shared/locales/lang/en-US/system.ts",
    "chars": 1177,
    "preview": "export default {\n  app: {\n    about: 'About {{ name }}',\n    hide: 'Hide',\n    hideOthers: 'Hide Others',\n    show: 'Sho"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/aigc.ts",
    "chars": 701,
    "preview": "export default {\n  title: '智能助手',\n  subheading: 'AIGC',\n  field: {\n    key: '密钥',\n    model: '模型',\n    providerMap: {\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/common.ts",
    "chars": 2783,
    "preview": "export default {\n  success: '成功',\n  fail: '失败',\n  copy: '复制',\n  copySuccess: '复制成功',\n  copyFail: '复制失败',\n  error: '错误',\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/component.ts",
    "chars": 950,
    "preview": "export default {\n  action: {\n    countdown: '{0}秒后关闭',\n    fullview: '全屏预览',\n  },\n  hot: {\n    title: '热门搜索',\n    catego"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/index.ts",
    "chars": 366,
    "preview": "import componentsLocale from 'tdesign-vue-next/es/locale/zh_CN';\n\nimport aigc from './aigc';\nimport common from './commo"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/media.ts",
    "chars": 437,
    "preview": "export default {\n  decoder: '解码器',\n  decoderMap: {\n    audio: '音频',\n    hls: 'Hls',\n    flv: 'Flv',\n    mp4: 'Mp4',\n    "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/binary-help.md",
    "chars": 122,
    "preview": "- 点击安装会添加到任务队列, 无需多次点击触发, 耐心等待\n- 如安装时间过久可尝试刷新页面后重新安装\n- 部分安装可能需科学上网(受限于网络提供商)\n- 部分二进制文件仅兼容部分操作系统(受限于服务提供商)\n- 安装失败原因具体需查看日"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/custom-player.md",
    "chars": 410,
    "preview": "> 该功能依赖于系统命令, 可调用`环境变量`或`指定路径`\n\n- 如何设置:\n  - Windows: `[右键图标->右键属性->目标]`查看路径\n  - Mac: `/Applications/软件名.app`\n  - Linux: "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/disclaimer.md",
    "chars": 1664,
    "preview": "> 发布日期:2025 年 12 月 1 日\n\n> 生效日期:2025 年 12 月 1 日\n\n**感谢您选择使用`zyfun`(以下简称本软件),用户(以下简称您)在使用本软件之前,请您仔细阅读和理解以下内容:**\n\n1. 若您不同意如下"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/lab-edit-help.md",
    "chars": 313,
    "preview": "- 初始化\n  - 每次初始化ext参数会丢失, 需使用ext参数需前往 [设置->影视配置] 手动配置debug源\n  - 如提示debug源不存在, 可刷新页面或前往 [设置->影视配置] 手动创建debug源(标识填写debug, 其"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/live-epg.md",
    "chars": 321,
    "preview": "**部分频道无电子节目单属于正常现象, 由第三方数据平台控制**\n\n> 接口支持 `diyp` 和 `xml` 模式\n\n- diyp\n  - 需配置参数: {'{'}name{'}'}(标识需查询频道名称)和{'{'}date{'}'}(标"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/assets/live-logo.md",
    "chars": 172,
    "preview": "**部分频道无台标属于正常现象, 由第三方数据平台控制**\n\n- 需配置参数{'{'}name{'}'}(标识需查询台标名称)\n- 例: `https://epg.xxx.com/logo/{name}.png`\n\n> 优先级: [频道自带"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/browser.ts",
    "chars": 274,
    "preview": "export default {\n  title: '浏览',\n  message: {\n    tabOverflow: '标签页过多, 请关闭部分标签页',\n    noSupportProtocol: '不支持该协议链接打开',\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/film.ts",
    "chars": 1298,
    "preview": "export default {\n  title: '影视',\n  noDesc: '暂无剧情简介',\n  info: {\n    type: '类型',\n    area: '地区',\n    release: '上映',\n  },\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/index.ts",
    "chars": 401,
    "preview": "import browser from './browser';\nimport film from './film';\nimport lab from './lab';\nimport live from './live';\nimport m"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/lab.ts",
    "chars": 6245,
    "preview": "export default {\n  title: '实验室',\n  crypto: {\n    title: '字符编码',\n    field: {\n      content: '内容',\n      key: '密钥',\n     "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/live.ts",
    "chars": 415,
    "preview": "export default {\n  title: '直播',\n  delay: '超时',\n  infiniteLoading: {\n    noConfig: '请前往 [设置->直播配置] 配置数据',\n  },\n  field: {"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/md.ts",
    "chars": 888,
    "preview": "import binaryHelpMD from './assets/binary-help.md?raw';\nimport customPlayerMD from './assets/custom-player.md?raw';\nimpo"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/moment.ts",
    "chars": 334,
    "preview": "export default {\n  title: '时刻',\n  history: {\n    title: '历史',\n  },\n  star: {\n    title: '收藏',\n    checkUpdate: '更新',\n   "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/parse.ts",
    "chars": 737,
    "preview": "export default {\n  title: '解析',\n  play: '播放',\n  search: {\n    input: '输入关键词搜索',\n    enter: '回车',\n    clear: '清空',\n    ti"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/player.ts",
    "chars": 1367,
    "preview": "export default {\n  title: '播放器',\n  film: {\n    desc: '简介',\n    anthology: '选集',\n    episode: '剧集',\n    recommend: '猜你喜欢'"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/plugin.ts",
    "chars": 454,
    "preview": "export default {\n  title: '插件',\n  field: {\n    typeMap: {\n      ui: '界面',\n      system: '系统',\n      mix: '混合',\n    },\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/pages/setting.ts",
    "chars": 3869,
    "preview": "export default {\n  title: '设置',\n  nav: {\n    baseConfig: '基础配置',\n    dataManage: '数据配置',\n    filmSource: '影视配置',\n    liv"
  },
  {
    "path": "packages/shared/locales/lang/zh-CN/system.ts",
    "chars": 989,
    "preview": "export default {\n  app: {\n    about: '关于 {{ name }}',\n    hide: '隐藏',\n    hideOthers: '隐藏其他',\n    show: '显示',\n    showAl"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/aigc.ts",
    "chars": 699,
    "preview": "export default {\n  title: '智能助手',\n  subheading: 'AIGC',\n  field: {\n    key: '密鑰',\n    model: '模型',\n    providerMap: {\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/common.ts",
    "chars": 2783,
    "preview": "export default {\n  success: '成功',\n  fail: '失敗',\n  copy: '複製',\n  copySuccess: '複製成功',\n  copyFail: '複製失敗',\n  error: '錯誤',\n"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/component.ts",
    "chars": 950,
    "preview": "export default {\n  action: {\n    countdown: '{0}秒後關閉',\n    fullview: '全屏預覽',\n  },\n  hot: {\n    title: '熱門搜索',\n    catego"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/index.ts",
    "chars": 366,
    "preview": "import componentsLocale from 'tdesign-vue-next/es/locale/zh_TW';\n\nimport aigc from './aigc';\nimport common from './commo"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/media.ts",
    "chars": 437,
    "preview": "export default {\n  decoder: '解碼器',\n  decoderMap: {\n    audio: '音頻',\n    hls: 'Hls',\n    flv: 'Flv',\n    mp4: 'Mp4',\n    "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/binary-help.md",
    "chars": 122,
    "preview": "- 點擊安裝會添加到任務隊列, 無需多次點擊觸發, 耐心等待\n- 如安裝時間過久可嘗試刷新頁面後重新安裝\n- 部分安裝可能需科學上網(受限於網絡提供商)\n- 部分二進製文件僅兼容部分操作系統(受限於服務提供商)\n- 安裝失敗原因具體需查看日"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/custom-player.md",
    "chars": 410,
    "preview": "> 該功能依賴於系統命令, 可調用`環境變量`或`指定路徑`\n\n- 如何設置:\n  - Windows: `[右鍵圖標->右鍵屬性->目標]`查看路徑\n  - Mac: `/Applications/軟件名.app`\n  - Linux: "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/disclaimer.md",
    "chars": 1661,
    "preview": "> 發布日期:2025 年 12 月 1 日\n\n> 生效日期:2025 年 12 月 1 日\n\n**感謝您選擇使用`zyfun`(以下簡稱本軟件),用戶(以下簡稱您)在使用本軟件之前,請您仔細閱讀和理解以下內容:**\n\n1. 若您不同意如下"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/lab-edit-help.md",
    "chars": 313,
    "preview": "- 初始化\n  - 每次初始化ext參數會丟失, 需使用ext參數需前往 [設置->影視配置] 手動配置debug源\n  - 如提示debug源不存在, 可刷新頁面或前往 [設置->影視配置] 手動創建debug源(標識填寫debug, 其"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/live-epg.md",
    "chars": 321,
    "preview": "**部分頻道無電子節目單屬於正常現象, 由第三方數據平臺控製**\n\n> 接口支持 `diyp` 和 `xml` 模式\n\n- diyp\n  - 需配置參數: {'{'}name{'}'}(標識需查詢頻道名稱)和{'{'}date{'}'}(標"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/assets/live-logo.md",
    "chars": 172,
    "preview": "**部分頻道無臺標屬於正常現象, 由第三方數據平臺控製**\n\n- 需配置參數{'{'}name{'}'}(標識需查詢臺標名稱)\n- 例: `https://epg.xxx.com/logo/{name}.png`\n\n> 優先級: [頻道自帶"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/browser.ts",
    "chars": 274,
    "preview": "export default {\n  title: '瀏覽',\n  message: {\n    tabOverflow: '標簽頁過多, 請關閉部分標簽頁',\n    noSupportProtocol: '不支持該協議連結打開',\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/film.ts",
    "chars": 1298,
    "preview": "export default {\n  title: '影視',\n  noDesc: '暫無劇情簡介',\n  info: {\n    type: '類型',\n    area: '地區',\n    release: '上映',\n  },\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/index.ts",
    "chars": 401,
    "preview": "import browser from './browser';\nimport film from './film';\nimport lab from './lab';\nimport live from './live';\nimport m"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/lab.ts",
    "chars": 6245,
    "preview": "export default {\n  title: '實驗室',\n  crypto: {\n    title: '字符編碼',\n    field: {\n      content: '內容',\n      key: '密鑰',\n     "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/live.ts",
    "chars": 415,
    "preview": "export default {\n  title: '直播',\n  delay: '超時',\n  infiniteLoading: {\n    noConfig: '請前往 [設置->直播配置] 配置數據',\n  },\n  field: {"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/md.ts",
    "chars": 888,
    "preview": "import binaryHelpMD from './assets/binary-help.md?raw';\nimport customPlayerMD from './assets/custom-player.md?raw';\nimpo"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/moment.ts",
    "chars": 333,
    "preview": "export default {\n  name: '時刻',\n  history: {\n    title: '歷史',\n  },\n  star: {\n    title: '收藏',\n    checkUpdate: '更新',\n    "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/parse.ts",
    "chars": 737,
    "preview": "export default {\n  title: '解析',\n  play: '播放',\n  search: {\n    input: '輸入關鍵詞搜索',\n    enter: '回車',\n    clear: '清空',\n    ti"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/player.ts",
    "chars": 1367,
    "preview": "export default {\n  title: '播放器',\n  film: {\n    desc: '簡介',\n    anthology: '選集',\n    episode: '劇集',\n    recommend: '猜你喜歡'"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/plugin.ts",
    "chars": 454,
    "preview": "export default {\n  title: '插件',\n  field: {\n    typeMap: {\n      ui: '界面',\n      system: '系統',\n      mix: '混合',\n    },\n  "
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/pages/setting.ts",
    "chars": 3869,
    "preview": "export default {\n  title: '設置',\n  nav: {\n    baseConfig: '基礎配置',\n    dataManage: '數據配置',\n    filmSource: '影視配置',\n    liv"
  },
  {
    "path": "packages/shared/locales/lang/zh-TW/system.ts",
    "chars": 989,
    "preview": "export default {\n  app: {\n    about: '關於 {{ name }}',\n    hide: '隱藏',\n    hideOthers: '隱藏其他',\n    show: '顯示',\n    showAl"
  },
  {
    "path": "packages/shared/modules/__tests__/camelcase.test.ts",
    "chars": 2727,
    "preview": "import { describe, expect, it } from 'vitest';\n\nimport {\n  camelCase,\n  constantCase,\n  delimiterLowerCase,\n  delimiterU"
  },
  {
    "path": "packages/shared/modules/__tests__/headers.test.ts",
    "chars": 9095,
    "preview": "import { describe, expect, it } from 'vitest';\n\nimport { convertStandardToUri, convertUriToStandard, newUrl, stripUrlPar"
  },
  {
    "path": "packages/shared/modules/__tests__/obj.test.ts",
    "chars": 1021,
    "preview": "import { describe, expect, it } from 'vitest';\n\nimport { objPathValue } from '../obj';\n\ndescribe('obj', () => {\n  descri"
  },
  {
    "path": "packages/shared/modules/__tests__/validate.test.ts",
    "chars": 1915,
    "preview": "import { describe, expect, it } from 'vitest';\n\nimport { isMultidimensionalArray } from '../validate';\n\ndescribe('valida"
  },
  {
    "path": "packages/shared/modules/cache.ts",
    "chars": 1710,
    "preview": "interface CacheItem<T> {\n  data: T;\n  timestamp: number;\n  duration: number;\n}\n\nexport class CacheService {\n  private st"
  },
  {
    "path": "packages/shared/modules/camelcase.ts",
    "chars": 5944,
    "preview": "import { isStrEmpty } from './validate';\n\n/**\n * Input validation and cleaning\n * @param str Input string\n * @returns Cl"
  },
  {
    "path": "packages/shared/modules/crypto/core/base.ts",
    "chars": 2345,
    "preview": "import type { UUIDTypes } from 'uuid';\nimport { v3 as uuidv3, v4 as uuidv4, v5 as uuidv5 } from 'uuid';\n\nimport { toStri"
  },
  {
    "path": "packages/shared/modules/crypto/core/encode.ts",
    "chars": 12329,
    "preview": "import CryptoJS from 'crypto-js';\nimport * as he from 'he';\nimport pako from 'pako';\n\nimport { atob, btoa } from '../mod"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/aes.ts",
    "chars": 7749,
    "preview": "import { cipher } from 'node-forge';\n\nimport type { AesOptionsNew, Pad } from '../../type';\nimport {\n  arrayToBytes as f"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/crypto.ts",
    "chars": 22619,
    "preview": "import CryptoJS from 'crypto-js';\n\nimport type {\n  AesOptions,\n  DesOptions,\n  RabbitLegacyOptions,\n  RabbitOptions,\n  R"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/index.ts",
    "chars": 94,
    "preview": "export * from './aes';\nexport * from './crypto';\nexport * from './rsa';\nexport * from './sm';\n"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/rsa.ts",
    "chars": 12407,
    "preview": "import { md, pki } from 'node-forge';\n\nimport type { RsaOptions } from '../../type';\nimport { arrayToBytes as forgeArray"
  },
  {
    "path": "packages/shared/modules/crypto/core/encrypt/sm.ts",
    "chars": 6279,
    "preview": "import * as SmCrypto from 'sm-crypto-v2';\n\nimport type { Sm4Options } from '../../type';\nimport {\n  arrayToWordArray,\n  "
  },
  {
    "path": "packages/shared/modules/crypto/core/mac.ts",
    "chars": 13237,
    "preview": "import CryptoJS from 'crypto-js';\nimport { hmac as forgeHmac, md as forgeMd } from 'node-forge';\nimport * as SmCrypto fr"
  },
  {
    "path": "packages/shared/modules/crypto/index.ts",
    "chars": 317,
    "preview": "import * as base from './core/base';\nimport * as encode from './core/encode';\nimport * as encrypt from './core/encrypt';"
  },
  {
    "path": "packages/shared/modules/crypto/modules/atob-btoa.ts",
    "chars": 3367,
    "preview": "/* eslint-disable antfu/consistent-list-newline */\n// Base64 Encoded Character Mapping Table\nconst BASE64_CHARS = 'ABCDE"
  },
  {
    "path": "packages/shared/modules/crypto/type.ts",
    "chars": 4603,
    "preview": "import type * as CryptoJS from 'crypto-js';\n\nexport type Pad = 'pkcs5padding' | 'pkcs7padding' | 'ansix923' | 'iso10126'"
  },
  {
    "path": "packages/shared/modules/crypto/utils/base.ts",
    "chars": 3796,
    "preview": "/**\n * Converts a UTF-8 string to a Uint8Array.\n * @param {string} str - The UTF-8 string to convert.\n * @returns {Uint8"
  },
  {
    "path": "packages/shared/modules/crypto/utils/forge.ts",
    "chars": 1755,
    "preview": "import { util } from 'node-forge';\n\nconst bytesTobase64 = (bytes: string): string => {\n  return util.encode64(bytes);\n};"
  },
  {
    "path": "packages/shared/modules/crypto/utils/wordArray.ts",
    "chars": 7243,
    "preview": "import CryptoJS from 'crypto-js';\n\nimport type { Encode, ParseFunction, StringifyFunction } from '../type';\n\nconst wordA"
  },
  {
    "path": "packages/shared/modules/date.ts",
    "chars": 10183,
    "preview": "import type { ConfigType, Dayjs, ManipulateType, UnitType } from 'dayjs';\nimport dayjs from 'dayjs';\n\nimport { isNumber,"
  },
  {
    "path": "packages/shared/modules/function.ts",
    "chars": 2012,
    "preview": "import { isFunction, isNil, isPositiveFiniteNumber } from './validate';\n\nexport const runFunction = async <T>(fn: () => "
  },
  {
    "path": "packages/shared/modules/headers.ts",
    "chars": 15668,
    "preview": "import JSON5 from 'json5';\nimport type { ParsedQs } from 'qs';\nimport qs from 'qs';\n\nimport { pascalCase } from './camel"
  },
  {
    "path": "packages/shared/modules/ip.ts",
    "chars": 2179,
    "preview": "import ipaddr from 'ipaddr.js';\n\nimport { isStrEmpty } from './validate';\n\nexport type IPVersion = 4 | 6 | -1;\n\nexport i"
  },
  {
    "path": "packages/shared/modules/lrucache.ts",
    "chars": 3433,
    "preview": "export class LruCache<K = string, V = any> {\n  readonly cache: Map<K, V>;\n  readonly capacity: number;\n\n  constructor(ca"
  },
  {
    "path": "packages/shared/modules/obj.ts",
    "chars": 2097,
    "preview": "import JSON5 from 'json5';\n\nimport { isJson, isJsonStr, isStrEmpty, isString } from './validate';\n\n/**\n * Convert a JSON"
  },
  {
    "path": "packages/shared/modules/request/axios/Axios.ts",
    "chars": 8380,
    "preview": "import type {\n  AxiosError,\n  AxiosInstance,\n  AxiosRequestConfig,\n  AxiosRequestHeaders,\n  AxiosResponse,\n  InternalAxi"
  },
  {
    "path": "packages/shared/modules/request/axios/AxiosCancel.ts",
    "chars": 1428,
    "preview": "import type { AxiosRequestConfig, Canceler } from 'axios';\nimport axios from 'axios';\nimport { isFunction } from 'es-too"
  },
  {
    "path": "packages/shared/modules/request/axios/AxiosTransform.ts",
    "chars": 1362,
    "preview": "import type { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\n\nimport type { RequestOptions"
  },
  {
    "path": "packages/shared/modules/request/constants.ts",
    "chars": 195,
    "preview": "export enum ContentTypeEnum {\n  Json = 'application/json;charset=UTF-8',\n  FormURLEncoded = 'application/x-www-form-urle"
  },
  {
    "path": "packages/shared/modules/request/index.ts",
    "chars": 83,
    "preview": "export * from './axios/Axios';\nexport * from './sse/Sse';\nexport * from './ws/Ws';\n"
  },
  {
    "path": "packages/shared/modules/request/sse/Sse.ts",
    "chars": 7160,
    "preview": "import type { EventSourceMessage } from '@microsoft/fetch-event-source';\nimport { fetchEventSource } from '@microsoft/fe"
  },
  {
    "path": "packages/shared/modules/request/sse/SseCancel.ts",
    "chars": 1315,
    "preview": "import { isFunction } from 'es-toolkit';\n\n// 存储请求与取消令牌的键值对列表\nlet pendingMap = new Map<string, AbortController>();\n\n/**\n "
  },
  {
    "path": "packages/shared/modules/request/sse/SseTransform.ts",
    "chars": 1822,
    "preview": "import type { EventSourceMessage } from '@microsoft/fetch-event-source';\n\nimport type { RequestOptions } from '../type';"
  },
  {
    "path": "packages/shared/modules/request/type.ts",
    "chars": 1300,
    "preview": "import type { AxiosRequestConfig } from 'axios';\n\n/**\n * 请求配置\n */\nexport interface RequestOptions {\n  /**\n   * 接口地址\n   *"
  },
  {
    "path": "packages/shared/modules/request/utils.ts",
    "chars": 1430,
    "preview": "import { isObject, isString } from '../validate';\n\nconst DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\nexport function join"
  },
  {
    "path": "packages/shared/modules/request/ws/Ws.ts",
    "chars": 7979,
    "preview": "import { cloneDeep, debounce, isFunction, throttle } from 'es-toolkit';\nimport WebSocket from 'isomorphic-ws';\n\nimport t"
  },
  {
    "path": "packages/shared/modules/request/ws/WsCancel.ts",
    "chars": 1314,
    "preview": "import { isFunction } from 'es-toolkit';\n\n// 存储请求与取消令牌的键值对列表\nlet pendingMap = new Map<string, AbortController>();\n\n/**\n "
  },
  {
    "path": "packages/shared/modules/request/ws/WsTransform.ts",
    "chars": 3761,
    "preview": "import type WebSocket from 'isomorphic-ws';\n\nimport type { RequestOptions } from '../type';\n\nexport const WsCloseCodeRea"
  },
  {
    "path": "packages/shared/modules/schedule.ts",
    "chars": 4191,
    "preview": "/**\n * Schedule option interface\n */\nexport interface RegisterScheduleOption {\n  name: string;\n  fun: () => void;\n  inte"
  },
  {
    "path": "packages/shared/modules/singleton.ts",
    "chars": 424,
    "preview": "export const singleton = <T extends new (...args: any[]) => any>(className: T): T => {\n  let instance: InstanceType<T> |"
  },
  {
    "path": "packages/shared/modules/size.ts",
    "chars": 2023,
    "preview": "import { isPositiveFiniteNumber } from './validate';\n\nexport type ISizeUnit = 'B' | 'KB' | 'MB' | 'GB' | 'TB';\n\nexport i"
  },
  {
    "path": "packages/shared/modules/toString.ts",
    "chars": 1075,
    "preview": "import JSON5 from 'json5';\n\nimport { isBoolean, isDate, isFunction, isJson, isMap, isNil, isNumber, isSet, isString, isS"
  },
  {
    "path": "packages/shared/modules/validate.ts",
    "chars": 14138,
    "preview": "import {\n  isArrayBuffer,\n  isBoolean,\n  isBuffer,\n  isJSONArray,\n  isJSONObject,\n  isJSONValue,\n  isMap,\n  isNil,\n  isS"
  },
  {
    "path": "packages/shared/modules/zip/7z.ts",
    "chars": 1438,
    "preview": "import sevenZipBin from '7zip-bin-full';\nimport sevenZip from 'node-7z';\n\nimport { isStrEmpty, isString } from '../valid"
  },
  {
    "path": "packages/shared/modules/zip/gz.ts",
    "chars": 1267,
    "preview": "import fs from 'node:fs';\nimport zlib from 'node:zlib';\n\nimport { isStrEmpty, isString } from '../validate';\n\n/**\n * Com"
  },
  {
    "path": "packages/shared/modules/zip/index.ts",
    "chars": 118,
    "preview": "export * as '7z' from './7z';\nexport * as gz from './gz';\nexport * as tgz from './tgz';\nexport * as zip from './zip';\n"
  },
  {
    "path": "packages/shared/modules/zip/tgz.ts",
    "chars": 1206,
    "preview": "import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nimport { isStrEmpty, isString } from "
  },
  {
    "path": "packages/shared/modules/zip/zip.ts",
    "chars": 1976,
    "preview": "import { readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport AdmZip from 'adm-zip';\nimport St"
  },
  {
    "path": "packages/shared/types/barrage.ts",
    "chars": 377,
    "preview": "export interface IBarrage {\n  id: string;\n  type: 'top' | 'bottom' | 'left' | 'right';\n  text: string;\n  time: number;\n "
  },
  {
    "path": "packages/shared/types/cms.ts",
    "chars": 8387,
    "preview": "import type {\n  CMS_ACTION_SPECIAL_ID_TYPE,\n  CMS_ACTION_TYPE,\n  ICmsActionButtonType,\n  ICmsActionFormType,\n  ICmsActio"
  },
  {
    "path": "packages/shared/types/common.ts",
    "chars": 704,
    "preview": "export type DeepMutable<T> = T extends (...args: any[]) => any\n  ? T\n  : T extends readonly (infer R)[]\n    ? DeepMutabl"
  },
  {
    "path": "packages/shared/types/db.ts",
    "chars": 823,
    "preview": "import type { Client, Config } from '@libsql/client';\nimport type { Models, Schemas, TableName } from '@main/services/Db"
  },
  {
    "path": "packages/shared/types/sift.ts",
    "chars": 159,
    "preview": "export interface ISiftCategoryResult {\n  title: string;\n  uuid: string;\n  raw: Array<{ title: string; uuid: string; path"
  },
  {
    "path": "packages/shared/types/systeminfo.ts",
    "chars": 296,
    "preview": "export type IPlatform = 'win32' | 'darwin' | 'linux' | 'ohos' | 'unknown';\nexport type IArch = 'x86_64' | 'x86_32' | 'ar"
  },
  {
    "path": "patches/@oplayer-core-npm-1.2.38-beta.2-66bf7d6252.patch",
    "chars": 204257,
    "preview": "diff --git a/dist/index.es.js b/dist/index.es.js\nindex 7c8e168da09439a3169ad59a7f8ff2c37f30ea68..88ca1f38dab846ad12f6c6e"
  },
  {
    "path": "patches/@oplayer-torrent-npm-1.2.25-beta.2-6efddccea2.patch",
    "chars": 5001,
    "preview": "diff --git a/dist/index.es.js b/dist/index.es.js\nindex 8f1ac84be65e4dde278503ec9a04e15c7c6ad715..6a428ec3d6563c54ad68764"
  },
  {
    "path": "patches/artplayer@5.4.0.patch",
    "chars": 539891,
    "preview": "diff --git a/dist/artplayer.js b/dist/artplayer.js\nindex 623b028e09a2c1c7cc53126f30edf038b9cb6764..6d39060964d47c8793753"
  },
  {
    "path": "patches/atomically-npm-1.7.0-e742e5293b.patch",
    "chars": 444,
    "preview": "diff --git a/dist/utils/temp.js b/dist/utils/temp.js\nindex c0844f640f7927ff87edda13f7c853d10ebb8dd0..3ca3d29e0f4ee700c43"
  },
  {
    "path": "patches/dplayer@1.32.7.patch",
    "chars": 3257191,
    "preview": "diff --git a/dist/DPlayer.min.js b/dist/DPlayer.min.js\nindex e88af993f345e0fc0f7c6b1f8084582352d416cf..d78fbbcfe5b9cd6f2"
  },
  {
    "path": "patches/electron-devtools-installer-npm-4.0.0-ea55a28d94.patch",
    "chars": 1108,
    "preview": "diff --git a/dist/index.js b/dist/index.js\nindex c428018df26dbeb7300644c938caf13d339c8f7b..5902353901b546296f28f50459df6"
  },
  {
    "path": "patches/electron-updater-npm-6.7.0-47b11bb0d4.patch",
    "chars": 555,
    "preview": "diff --git a/out/util.js b/out/util.js\nindex 9294ffd6ca8f02c2e0f90c663e7e9cdc02c1ac37..f52107493e2995320ee4efd0eb2a8c9bf"
  },
  {
    "path": "patches/file-stream-rotator-npm-0.6.1-eab45fb13d.patch",
    "chars": 452,
    "preview": "diff --git a/FileStreamRotator.js b/FileStreamRotator.js\nindex 639bb9c8f972ba672bd27d9f8b1739d1030cb44b..a12a6d93b61fe78"
  },
  {
    "path": "patches/libsql-npm-0.4.7-444e260fb1.patch",
    "chars": 434,
    "preview": "diff --git a/index.js b/index.js\nindex 4e8423491ab51a9eb9fee22182e4ea0fcc3d3d3b..2846c5d4354c130d478dc99565b3ecd6d85b7d2"
  },
  {
    "path": "patches/shaka-player-npm-4.13.0-5e61f852f3.patch",
    "chars": 1665,
    "preview": "diff --git a/dist/shaka-player.compiled.d.ts b/dist/shaka-player.compiled.d.ts\nindex 0971e580f818994d0bddca4f19b142f07e9"
  },
  {
    "path": "pnpm-workspace.yaml",
    "chars": 93,
    "preview": "packages:\n  - 'packages/*'\n\nsupportedArchitectures:\n  os:\n    - current\n  cpu:\n    - current\n"
  },
  {
    "path": "resources/scripts/download.js",
    "chars": 2618,
    "preview": "const https = require('node:https');\nconst fs = require('node:fs');\nconst path = require('node:path');\nconst { execSync "
  }
]

// ... and 437 more files (download for full content)

About this extraction

This page contains the full source code of the Hiram-Wong/zyfun GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 637 files (7.4 MB), approximately 2.0M tokens, and a symbol index with 2915 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!