├── packages ├── feiyu │ ├── .prettierignore │ ├── .stylelintignore │ ├── .eslintignore │ ├── src │ │ ├── utils │ │ │ ├── env.ts │ │ │ ├── clone.ts │ │ │ ├── m3u8 │ │ │ │ └── valid.ts │ │ │ ├── flatten.ts │ │ │ ├── string.ts │ │ │ ├── xml.ts │ │ │ ├── feiyu │ │ │ │ └── useFeiyuSearch.ts │ │ │ ├── douban │ │ │ │ ├── useSearchKeywords.ts │ │ │ │ └── useSearchHotMovies.ts │ │ │ ├── clipborad.ts │ │ │ ├── types.ts │ │ │ ├── abort.ts │ │ │ ├── p-timeout.ts │ │ │ ├── is.ts │ │ │ ├── base.ts │ │ │ ├── dom.ts │ │ │ └── diff.ts │ │ ├── vite-env.d.ts │ │ ├── components │ │ │ ├── AspectRatio │ │ │ │ ├── style.css │ │ │ │ └── index.tsx │ │ │ ├── SearchEmpty.tsx │ │ │ ├── LazyImage │ │ │ │ ├── style.css │ │ │ │ └── LazyImage.tsx │ │ │ ├── InputKey │ │ │ │ ├── index.tsx │ │ │ │ └── style.css │ │ │ ├── LongText.tsx │ │ │ ├── SwitchDark.tsx │ │ │ ├── Stack │ │ │ │ ├── position.tsx │ │ │ │ └── index.tsx │ │ │ ├── Loading │ │ │ │ └── index.tsx │ │ │ ├── Text.tsx │ │ │ ├── Box.tsx │ │ │ ├── Tab │ │ │ │ ├── state.ts │ │ │ │ └── index.tsx │ │ │ ├── Flex.tsx │ │ │ └── Dialog.tsx │ │ ├── hooks │ │ │ ├── useRefCallback.ts │ │ │ ├── useID.ts │ │ │ ├── usePrevious.ts │ │ │ ├── useInterval.ts │ │ │ ├── useUnmount.ts │ │ │ ├── useRebuild.ts │ │ │ ├── useMediaQuery.ts │ │ │ ├── useAbort.ts │ │ │ ├── useInit.ts │ │ │ ├── useDesktopUpdater.ts │ │ │ ├── useScreen.ts │ │ │ ├── usePWA.ts │ │ │ ├── useSearchHistory.ts │ │ │ ├── useDarkMode.ts │ │ │ ├── useMeasure.ts │ │ │ ├── useBreakpoint.ts │ │ │ └── useSearchDatas.ts │ │ ├── pages │ │ │ ├── settings │ │ │ │ └── style.css │ │ │ ├── home │ │ │ │ ├── useHomePages.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── hot │ │ │ │ │ ├── style.css │ │ │ │ │ └── index.tsx │ │ │ │ └── play │ │ │ │ │ ├── style.css │ │ │ │ │ ├── xg-preset.ts │ │ │ │ │ └── player.tsx │ │ │ ├── history │ │ │ │ └── index.tsx │ │ │ ├── favorite │ │ │ │ └── index.tsx │ │ │ ├── playlist │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── app │ │ │ ├── TitleBar │ │ │ │ ├── styles.css │ │ │ │ └── index.tsx │ │ │ ├── RootPages.tsx │ │ │ ├── index.tsx │ │ │ ├── MyHeader.tsx │ │ │ ├── style.css │ │ │ ├── SideMenu.tsx │ │ │ └── initAPP.tsx │ │ ├── main.tsx │ │ ├── data │ │ │ ├── movies.ts │ │ │ ├── config │ │ │ │ ├── types.ts │ │ │ │ └── storage.ts │ │ │ └── default.ts │ │ ├── services │ │ │ ├── storage │ │ │ │ └── storage.ts │ │ │ ├── routes │ │ │ │ ├── index.tsx │ │ │ │ ├── listener.tsx │ │ │ │ ├── location.ts │ │ │ │ └── router.ts │ │ │ └── cache │ │ │ │ └── index.ts │ │ ├── styles │ │ │ ├── colors.ts │ │ │ └── scrollbar.css │ │ ├── index.css │ │ └── overlays │ │ │ └── APPConfigModal.tsx │ ├── public │ │ ├── logo.gif │ │ ├── pwa │ │ │ ├── logo-192.png │ │ │ └── logo-512.png │ │ └── logo.svg │ ├── .prettierrc │ ├── scripts │ │ ├── web.ts │ │ ├── desktop.ts │ │ ├── docker.sh │ │ ├── utils │ │ │ └── io.ts │ │ ├── pwa.ts │ │ └── test.ts │ ├── tsconfig.node.json │ ├── README.md │ ├── .stylelintrc.js │ ├── .vscode │ │ ├── settings.json │ │ └── launch.json │ ├── tsconfig.json │ ├── index.html │ ├── .eslintrc.js │ ├── package.json │ ├── .gitignore │ └── vite.config.ts ├── feiyu-desktop │ ├── src-tauri │ │ ├── build.rs │ │ ├── .gitignore │ │ ├── icons │ │ │ ├── 32x32.png │ │ │ ├── icon.icns │ │ │ ├── icon.ico │ │ │ ├── icon.png │ │ │ ├── 128x128.png │ │ │ ├── 128x128@2x.png │ │ │ ├── StoreLogo.png │ │ │ ├── Square30x30Logo.png │ │ │ ├── Square44x44Logo.png │ │ │ ├── Square71x71Logo.png │ │ │ ├── Square89x89Logo.png │ │ │ ├── Square107x107Logo.png │ │ │ ├── Square142x142Logo.png │ │ │ ├── Square150x150Logo.png │ │ │ ├── Square284x284Logo.png │ │ │ └── Square310x310Logo.png │ │ ├── images │ │ │ ├── nsis_header.bmp │ │ │ ├── nsis_sidebar.bmp │ │ │ ├── wix_banner.png │ │ │ ├── wix_dialog.png │ │ │ └── dmg-background.jpg │ │ ├── gen │ │ │ └── schemas │ │ │ │ └── capabilities.json │ │ ├── src │ │ │ └── main.rs │ │ ├── Cargo.toml │ │ ├── capabilities │ │ │ └── main.json │ │ └── tauri.conf.json │ ├── app-icon.png │ ├── src │ │ ├── index.js │ │ ├── index.web.js │ │ ├── platform.js │ │ ├── index.d.ts │ │ ├── updater.js │ │ └── index.desktop.js │ ├── README.md │ ├── .gitignore │ ├── package.json │ └── scripts │ │ ├── dist.js │ │ ├── io.js │ │ └── updater.js ├── feiyu-proxy │ ├── .gitignore │ ├── .dockerignore │ ├── tsup.config.ts │ ├── tsconfig.json │ ├── package.json │ ├── src │ │ ├── proxy.ts │ │ ├── utils │ │ │ ├── scf │ │ │ │ ├── response.ts │ │ │ │ ├── events.ts │ │ │ │ ├── types.ts │ │ │ │ └── context.ts │ │ │ ├── is.ts │ │ │ └── base.ts │ │ └── index.ts │ ├── server.js │ ├── Dockerfile │ └── README.md ├── feiyu-website │ ├── src │ │ ├── components │ │ │ ├── Feature │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── Icons │ │ │ │ ├── index.jsx │ │ │ │ ├── IconMac.jsx │ │ │ │ ├── IconGithub.jsx │ │ │ │ └── IconWindows.jsx │ │ │ └── Button │ │ │ │ ├── index.jsx │ │ │ │ ├── style.css │ │ │ │ └── Download.jsx │ │ ├── main.jsx │ │ ├── App.jsx │ │ ├── hooks │ │ │ ├── useShadow.js │ │ │ ├── useHover.js │ │ │ └── useMousePosition.js │ │ ├── layouts │ │ │ ├── Footer.jsx │ │ │ ├── Header.jsx │ │ │ ├── Features.jsx │ │ │ └── Intro.jsx │ │ ├── utils │ │ │ └── os.js │ │ └── index.css │ ├── public │ │ ├── screenshots │ │ │ ├── home.webp │ │ │ ├── play.webp │ │ │ ├── size.webp │ │ │ ├── search.webp │ │ │ ├── platform.webp │ │ │ └── subscribe.webp │ │ └── logo.svg │ ├── vite.config.js │ ├── README.md │ ├── .gitignore │ ├── index.html │ └── package.json └── feiyu-docker │ ├── .dockerignore │ ├── Dockerfile │ └── README.md ├── screenshots ├── play.webp ├── home-preview.jpg ├── play-preview.jpg └── mobile-preview.jpg ├── TODO.md ├── CHANGELOG.md ├── feiyu.example.json └── .gitignore /packages/feiyu/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | dist -------------------------------------------------------------------------------- /packages/feiyu/.stylelintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | dist -------------------------------------------------------------------------------- /packages/feiyu/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | dist 4 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /packages/feiyu/src/utils/env.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | export const envs = import.meta.env; 3 | -------------------------------------------------------------------------------- /screenshots/play.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/screenshots/play.webp -------------------------------------------------------------------------------- /packages/feiyu-proxy/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | api 4 | .env 5 | .DS_Store 6 | .vercel 7 | -------------------------------------------------------------------------------- /packages/feiyu-website/src/components/Feature/style.css: -------------------------------------------------------------------------------- 1 | .feature + .feature { 2 | margin-top: 6rem; 3 | } 4 | -------------------------------------------------------------------------------- /screenshots/home-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/screenshots/home-preview.jpg -------------------------------------------------------------------------------- /screenshots/play-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/screenshots/play-preview.jpg -------------------------------------------------------------------------------- /packages/feiyu/public/logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu/public/logo.gif -------------------------------------------------------------------------------- /screenshots/mobile-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/screenshots/mobile-preview.jpg -------------------------------------------------------------------------------- /packages/feiyu-docker/.dockerignore: -------------------------------------------------------------------------------- 1 | # 排除全部文件 2 | **/* 3 | 4 | # 保留相关构建文件 5 | !dist 6 | !httpd.conf 7 | !busybox.conf 8 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/app-icon.png -------------------------------------------------------------------------------- /packages/feiyu/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | -------------------------------------------------------------------------------- /packages/feiyu/public/pwa/logo-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu/public/pwa/logo-192.png -------------------------------------------------------------------------------- /packages/feiyu/public/pwa/logo-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu/public/pwa/logo-512.png -------------------------------------------------------------------------------- /packages/feiyu/src/utils/clone.ts: -------------------------------------------------------------------------------- 1 | export const deepClone = (obj: any): T => { 2 | return JSON.parse(JSON.stringify(obj)); 3 | }; 4 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /packages/feiyu-docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM lipanski/docker-static-website:latest 2 | 3 | COPY dist . 4 | 5 | CMD ["/busybox-httpd", "-f", "-v", "-p", "3000"] 6 | -------------------------------------------------------------------------------- /packages/feiyu-website/public/screenshots/home.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-website/public/screenshots/home.webp -------------------------------------------------------------------------------- /packages/feiyu-website/public/screenshots/play.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-website/public/screenshots/play.webp -------------------------------------------------------------------------------- /packages/feiyu-website/public/screenshots/size.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-website/public/screenshots/size.webp -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /packages/feiyu-website/public/screenshots/search.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-website/public/screenshots/search.webp -------------------------------------------------------------------------------- /packages/feiyu/src/components/AspectRatio/style.css: -------------------------------------------------------------------------------- 1 | .aspect-ratio-box .arco-image-img { 2 | width: 100%; 3 | height: 100%; 4 | object-fit: cover; 5 | } 6 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/images/nsis_header.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/images/nsis_header.bmp -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/images/nsis_sidebar.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/images/nsis_sidebar.bmp -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/images/wix_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/images/wix_banner.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/images/wix_dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/images/wix_dialog.png -------------------------------------------------------------------------------- /packages/feiyu-website/public/screenshots/platform.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-website/public/screenshots/platform.webp -------------------------------------------------------------------------------- /packages/feiyu-website/public/screenshots/subscribe.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-website/public/screenshots/subscribe.webp -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/images/dmg-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/images/dmg-background.jpg -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /packages/feiyu-desktop/src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/idootop/feiyu-player/HEAD/packages/feiyu-desktop/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /packages/feiyu/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "useTabs": false, 6 | "trailingComma": "all", 7 | "endOfLine": "lf" 8 | } 9 | -------------------------------------------------------------------------------- /packages/feiyu-proxy/.dockerignore: -------------------------------------------------------------------------------- 1 | # 排除全部文件 2 | **/* 3 | 4 | # 只保留构建相关的文件 5 | !src 6 | !server.js 7 | !package.json 8 | !tsconfig.json 9 | !tsup.config.ts 10 | !package-lock.json 11 | -------------------------------------------------------------------------------- /packages/feiyu/src/components/SearchEmpty.tsx: -------------------------------------------------------------------------------- 1 | import { Empty } from '@arco-design/web-react'; 2 | 3 | export const SearchEmpty = () => { 4 | return ; 5 | }; 6 | -------------------------------------------------------------------------------- /packages/feiyu/src/components/LazyImage/style.css: -------------------------------------------------------------------------------- 1 | .fill-img { 2 | width: 100%; 3 | } 4 | 5 | .fill-img .arco-image-img { 6 | width: 100%; 7 | aspect-ratio: 80 / 112; 8 | object-fit: cover; 9 | } 10 | -------------------------------------------------------------------------------- /packages/feiyu/src/hooks/useRefCallback.ts: -------------------------------------------------------------------------------- 1 | import { useRef } from "react"; 2 | 3 | export const useRefCallback = (fn: any) => { 4 | const ref = useRef(); 5 | ref.current = fn; 6 | return ref; 7 | }; -------------------------------------------------------------------------------- /packages/feiyu/src/pages/settings/style.css: -------------------------------------------------------------------------------- 1 | .subscribe-title .arco-dropdown-popup-visible .arco-icon-down { 2 | transform: rotate(180deg); 3 | } 4 | 5 | .table-row:hover { 6 | background: var(--color-bg-card); 7 | } 8 | -------------------------------------------------------------------------------- /packages/feiyu/src/hooks/useID.ts: -------------------------------------------------------------------------------- 1 | import { useRef } from "react"; 2 | 3 | let id = 0; 4 | export const newID = () => (id++).toString() 5 | 6 | export const useID = () => { 7 | const ref = useRef(newID()); 8 | return ref.current 9 | } -------------------------------------------------------------------------------- /packages/feiyu/src/pages/home/useHomePages.tsx: -------------------------------------------------------------------------------- 1 | import { usePages } from '@/services/routes/page'; 2 | 3 | export const useHomePages = () => { 4 | return usePages({ 5 | parent: '/home/', 6 | index: 'hot', 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/src/index.js: -------------------------------------------------------------------------------- 1 | class _FeiyuDesktop { 2 | isDesktop = false; 3 | isMac = false; 4 | isWindows = false; 5 | isLinux = false; 6 | init() {} 7 | } 8 | 9 | export const FeiyuDesktop = new _FeiyuDesktop(); 10 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/src/index.web.js: -------------------------------------------------------------------------------- 1 | class _FeiyuDesktop { 2 | isDesktop = false; 3 | isMac = false; 4 | isWindows = false; 5 | isLinux = false; 6 | init() {} 7 | } 8 | 9 | export const FeiyuDesktop = new _FeiyuDesktop(); 10 | -------------------------------------------------------------------------------- /packages/feiyu/scripts/web.ts: -------------------------------------------------------------------------------- 1 | import { copyFile } from './utils/io'; 2 | 3 | export const main = async () => { 4 | const dir = 'node_modules/feiyu-desktop/src'; 5 | await copyFile(`${dir}/index.web.js`, `${dir}/index.js`); 6 | }; 7 | 8 | main(); 9 | -------------------------------------------------------------------------------- /packages/feiyu-website/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | server: { host: true }, 8 | }); 9 | -------------------------------------------------------------------------------- /packages/feiyu/scripts/desktop.ts: -------------------------------------------------------------------------------- 1 | import { copyFile } from './utils/io'; 2 | 3 | export const main = async () => { 4 | const dir = 'node_modules/feiyu-desktop/src'; 5 | await copyFile(`${dir}/index.desktop.js`, `${dir}/index.js`); 6 | }; 7 | 8 | main(); 9 | -------------------------------------------------------------------------------- /packages/feiyu/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /packages/feiyu/README.md: -------------------------------------------------------------------------------- 1 | # 飞鱼网页版 2 | 3 | ```bash 4 | # 克隆本项目 5 | git clone https://github.com/idootop/feiyu-player && cd feiyu-player 6 | 7 | # 切换到项目所在路径 8 | cd packages/feiyu 9 | 10 | # 安装依赖,并启动本地项目 11 | pnpm install && pnpm build:web && pnpm dev 12 | ``` 13 | -------------------------------------------------------------------------------- /packages/feiyu-website/src/components/Icons/index.jsx: -------------------------------------------------------------------------------- 1 | export function getIconProps({ size = "1.5rem" }) { 2 | return { 3 | fill: "currentColor", 4 | width: "256", 5 | height: "256", 6 | viewBox: "0 0 256 256", 7 | style: { width: size, height: size }, 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /packages/feiyu/src/hooks/usePrevious.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | 3 | export const usePrevious = (value: T) => { 4 | const ref = useRef(); 5 | 6 | useEffect(() => { 7 | ref.current = value; 8 | }, [value]); 9 | 10 | return ref; 11 | }; 12 | -------------------------------------------------------------------------------- /packages/feiyu/src/app/TitleBar/styles.css: -------------------------------------------------------------------------------- 1 | .titlebar { 2 | display: flex; 3 | gap: 6px; 4 | position: fixed; 5 | top: 8px; 6 | left: 8px; 7 | } 8 | 9 | .feiyu-content { 10 | color: #fff; 11 | background: #1f1f1f; 12 | font-size: 12px; 13 | padding: 4px 8px; 14 | border-radius: 4px; 15 | } -------------------------------------------------------------------------------- /packages/feiyu/src/utils/m3u8/valid.ts: -------------------------------------------------------------------------------- 1 | import { http } from '@/services/http'; 2 | 3 | export const isValidM3U8 = async (m3u8: string) => { 4 | const result = await http.get(m3u8, undefined, { 5 | cache: true, 6 | cacheEmpty: true, 7 | }); 8 | return result?.includes('#EXTM3U'); 9 | }; 10 | -------------------------------------------------------------------------------- /packages/feiyu-website/src/main.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App.jsx' 4 | import './index.css' 5 | 6 | ReactDOM.createRoot(document.getElementById('root')).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/README.md: -------------------------------------------------------------------------------- 1 | # 飞鱼桌面版 2 | 3 | 桌面版基于 [Tauri](https://tauri.app/) 构建,请确保已正确配置开发环境。 4 | 5 | ```bash 6 | # 克隆本项目 7 | git clone https://github.com/idootop/feiyu-player && cd feiyu-player 8 | 9 | # 切换到项目所在路径 10 | cd packages/feiyu-desktop 11 | 12 | # 安装依赖,并启动本地项目 13 | pnpm install && pnpm dev 14 | ``` 15 | -------------------------------------------------------------------------------- /packages/feiyu-website/README.md: -------------------------------------------------------------------------------- 1 | ### 🔍 海量资源,随心搜索 2 | 3 | 支持多种视频源,聚合搜索,看你想看。 4 | 5 | ### 🔗 一键订阅,自由分享 6 | 7 | 一键订阅视频源,找资源不求人。 8 | 9 | ### ✨ 极简高颜值,给你极致观影体验 10 | 11 | 极简设计,亮暗色模式,颜值即正义。 12 | 13 | ### ⚡️ 体积小巧,快如闪电 14 | 15 | 极至精简,安装包不足 10 MB 16 | 17 | ### 💻 全平台支持,随时随地,想看就看 18 | 19 | 网页,Windows,macOS,Linux 统统不在话下 20 | -------------------------------------------------------------------------------- /packages/feiyu/scripts/docker.sh: -------------------------------------------------------------------------------- 1 | rm -rf dist \ 2 | && pnpm build:web 3 | 4 | cd ../feiyu-docker \ 5 | && rm -rf dist \ 6 | && cp -r ../feiyu/dist . 7 | 8 | docker build \ 9 | --platform linux/amd64,linux/arm64,linux/arm/v7 \ 10 | -t idootop/feiyu:2.2.0 \ 11 | -t idootop/feiyu:latest . --push -------------------------------------------------------------------------------- /packages/feiyu/src/components/InputKey/index.tsx: -------------------------------------------------------------------------------- 1 | import './style.css'; 2 | 3 | import { Box, BoxProps } from '../Box'; 4 | 5 | export const InputKey = (props?: BoxProps) => { 6 | return ( 7 | 8 | {props?.children} 9 | 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | # TODOs 2 | 3 | - ~夜间模式~ 4 | - ~代理请求~ 5 | - ~请求缓存~ 6 | - ~首页热门电影推荐 COS 缓存~ 7 | - ~PWA 更新提示~ 8 | - ~片源可用性检测~ 9 | - ~网页 Metadata 更新~ 10 | - ~导入导出~ 11 | - ~Docker~ 12 | - ~PC 客户端(Tauri~ 13 | - ~自动构建(Github action)~ 14 | - ~Windows 视频全屏~ 15 | - ~桌面端版本自动更新~ 16 | - ~搜索历史~ 17 | - 记忆播放位置 18 | - 历史记录 19 | - 时长统计 20 | - M3U8 下载 21 | -------------------------------------------------------------------------------- /packages/feiyu/src/main.tsx: -------------------------------------------------------------------------------- 1 | import './index.css'; 2 | import './styles/scrollbar.css'; 3 | 4 | import ReactDOM from 'react-dom/client'; 5 | 6 | import { App } from './app'; 7 | import { LRouter } from './services/routes'; 8 | 9 | ReactDOM.createRoot(document.getElementById('app') as any).render( 10 | 11 | 12 | , 13 | ); 14 | -------------------------------------------------------------------------------- /packages/feiyu/src/hooks/useInterval.ts: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | 3 | export const useInterval = (callback: () => void, duration = 100) => { 4 | useEffect(() => { 5 | const timer = setInterval(() => { 6 | callback?.(); 7 | }, duration); 8 | return () => { 9 | clearInterval(timer); 10 | }; 11 | }, [callback, duration]); 12 | }; 13 | -------------------------------------------------------------------------------- /packages/feiyu-proxy/tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup"; 2 | 3 | export default defineConfig(() => ({ 4 | entry: ["src/proxy.ts"], 5 | outDir: "api", 6 | target: "node16", 7 | platform: "node", 8 | format: ["esm"], 9 | sourcemap: false, 10 | treeshake: true, 11 | minify: true, 12 | clean: true, 13 | shims: true, 14 | dts: false, 15 | })); 16 | -------------------------------------------------------------------------------- /packages/feiyu/src/app/RootPages.tsx: -------------------------------------------------------------------------------- 1 | import { kRoutePages } from '@/pages'; 2 | import { LRoute, LRoutes } from '@/services/routes'; 3 | 4 | export const RootPages = () => { 5 | return ( 6 | 7 | {kRoutePages.map((e) => { 8 | return ; 9 | })} 10 | 11 | ); 12 | }; 13 | -------------------------------------------------------------------------------- /packages/feiyu-desktop/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /packages/feiyu-website/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /packages/feiyu/src/data/movies.ts: -------------------------------------------------------------------------------- 1 | import { pickOne } from '../utils/base'; 2 | 3 | export const randomMovie = () => { 4 | return pickOne([ 5 | '请回答1988', 6 | '漫长的季节', 7 | '白色巨塔', 8 | '非自然死亡', 9 | '半泽直树', 10 | '孤独又灿烂的神鬼怪', 11 | '想见你', 12 | '我们与恶的距离', 13 | '俗女养成记', 14 | '爱的迫降', 15 | '恶作剧之吻', 16 | '悠长假期', 17 | '东京爱情故事', 18 | ]); 19 | }; 20 | -------------------------------------------------------------------------------- /packages/feiyu/src/hooks/useUnmount.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | 3 | /** 4 | * const isUnmountRef = useUnmount() 5 | * 6 | * const isUnmount = isUnmountRef.current 7 | */ 8 | export const useUnmount = () => { 9 | const ref = useRef(false); 10 | useEffect(() => { 11 | return () => { 12 | ref.current = true; 13 | }; 14 | }, []); 15 | return ref; 16 | }; 17 | -------------------------------------------------------------------------------- /packages/feiyu/public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/feiyu/src/utils/flatten.ts: -------------------------------------------------------------------------------- 1 | import { Fragment } from 'react'; 2 | 3 | export const flattenChildren = (children: any) => { 4 | return Array.isArray(children) 5 | ? [].concat( 6 | ...children.map((c) => 7 | c?.type === Fragment 8 | ? flattenChildren(c.props.children) 9 | : flattenChildren(c), 10 | ), 11 | ) 12 | : [children]; 13 | }; 14 | -------------------------------------------------------------------------------- /packages/feiyu/src/components/LongText.tsx: -------------------------------------------------------------------------------- 1 | import { Text } from './Text'; 2 | 3 | const _longText = Array(100).fill('________').join('________'); 4 | 5 | export const LongText = () => { 6 | return ( 7 | 14 | {_longText} 15 | 16 | ); 17 | }; 18 | -------------------------------------------------------------------------------- /packages/feiyu-website/src/App.jsx: -------------------------------------------------------------------------------- 1 | import { Features } from "./layouts/Features"; 2 | import { Footer } from "./layouts/Footer"; 3 | import { Header } from "./layouts/Header"; 4 | import { Intro } from "./layouts/Intro"; 5 | 6 | function App() { 7 | return ( 8 | <> 9 |
10 | 11 | 12 |