{"id":49631734,"url":"https://github.com/franklioxygen/MyTube","last_synced_at":"2026-05-05T18:01:15.694Z","repository":{"id":281438131,"uuid":"945275070","full_name":"franklioxygen/MyTube","owner":"franklioxygen","description":"Self-hosted downloader and player for YouTube, Bilibili, Twitch, MissAV, and yt-dlp sites. Features channel subscriptions, auto-downloads, and local storage for media. Organize your library into collections with a sleek UI. Includes built-in Cloudflare Tunnel support for secure remote access without port forwarding. Docker-ready deployment.","archived":false,"fork":false,"pushed_at":"2026-05-04T19:34:54.000Z","size":16728,"stargazers_count":972,"open_issues_count":8,"forks_count":83,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-05-04T21:27:52.301Z","etag":null,"topics":["bilibili","bilibili-download","cloudflare-tunnel","docker","downloader","expressjs","missav","mui","nas","sqlite","tanstack-query","twitch","typescript","video-hosting","video-player","youtube","youtube-downloader","yt-dlp"],"latest_commit_sha":null,"homepage":"https://mytube-demo.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/franklioxygen.png","metadata":{"files":{"readme":"README-zh.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-09T03:33:55.000Z","updated_at":"2026-05-04T02:00:07.000Z","dependencies_parsed_at":"2025-10-11T00:08:39.787Z","dependency_job_id":"967c3377-b6e8-43de-bcb4-7dc72184fb17","html_url":"https://github.com/franklioxygen/MyTube","commit_stats":null,"previous_names":["franklioxygen/mytube"],"tags_count":323,"template":false,"template_full_name":null,"purl":"pkg:github/franklioxygen/MyTube","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franklioxygen%2FMyTube","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franklioxygen%2FMyTube/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franklioxygen%2FMyTube/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franklioxygen%2FMyTube/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/franklioxygen","download_url":"https://codeload.github.com/franklioxygen/MyTube/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/franklioxygen%2FMyTube/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32661193,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-05T11:29:49.557Z","status":"ssl_error","status_checked_at":"2026-05-05T11:29:48.587Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bilibili","bilibili-download","cloudflare-tunnel","docker","downloader","expressjs","missav","mui","nas","sqlite","tanstack-query","twitch","typescript","video-hosting","video-player","youtube","youtube-downloader","yt-dlp"],"created_at":"2026-05-05T13:00:55.716Z","updated_at":"2026-05-05T18:01:15.681Z","avatar_url":"https://github.com/franklioxygen.png","language":"TypeScript","funding_links":[],"categories":["Software"],"sub_categories":["Media Management"],"readme":"# MyTube\n\n支持 YouTube、Bilibili、Twitch、MissAV 及 [yt-dlp 站点](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md) 的自托管视频下载器与播放器。具备频道订阅、自动下载、本地化存储以及面向外部阅读器的私密 RSS 订阅链接。UI 设计精美，支持收藏集分类管理。内置 Cloudflare Tunnel 支持，无需端口映射即可实现安全远程访问。支持 Docker 一键部署。\n\n🚀 100% 提示工程构建，零人工介入代码。\n\n[![GitHub License](https://img.shields.io/github/license/franklioxygen/mytube)](https://github.com/franklioxygen/mytube)\n![Docker Pulls](https://img.shields.io/docker/pulls/franklioxygen/mytube)\n[![Discord](https://img.shields.io/badge/Discord-Join_Us-7289DA?logo=discord\u0026logoColor=white)](https://discord.gg/dXn4u9kQGN)\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/franklioxygen/MyTube/master.yml)\n![GHCR 镜像工作流状态](https://img.shields.io/github/actions/workflow/status/franklioxygen/MyTube/ghcr.yml?label=GHCR%20Image)\n[![Lighthouse 性能](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/franklioxygen/MyTube/master/badges/lighthouse-performance.json)](https://github.com/franklioxygen/MyTube/actions/workflows/lighthouse.yml)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/266f0b53788f463a97230cb0c9d1d890)](https://app.codacy.com/gh/franklioxygen/MyTube/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade)\n[![Codacy Badge](https://app.codacy.com/project/badge/Coverage/266f0b53788f463a97230cb0c9d1d890)](https://app.codacy.com/gh/franklioxygen/MyTube/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_coverage)\n[![GitHub Repo stars](https://img.shields.io/github/stars/franklioxygen/mytube)](https://github.com/franklioxygen/mytube)\n\n[English](README.md) | [更新日志](CHANGELOG.md)\n\n## 在线演示\n\n🌐 **访问在线演示(只读): [https://mytube-demo.vercel.app](https://mytube-demo.vercel.app)**\n\n[![Watch the video](https://img.youtube.com/vi/0_5ZpgsWTp0/maxresdefault.jpg)](https://www.youtube.com/watch?v=0_5ZpgsWTp0)\n\n## 功能特点\n\n- **视频下载**：通过简单的 URL 输入下载 YouTube、Bilibili、Twitch、MissAV 以及其他 yt-dlp 支持的视频。\n- **视频上传**：直接上传本地视频文件到您的库，并自动生成缩略图。\n- **TMDB 元数据抓取**：基于文件名自动从 TMDB 抓取电影和电视剧元数据（标题、描述、封面、导演、年份、评分）。支持根据站点语言获取本地化内容。\n- **并行下载**：支持队列下载，可同时追踪多个下载任务的进度。\n- **批量下载**：一次性添加多个视频链接到下载队列。\n- **并发下载限制**：设置同时下载的数量限制以管理带宽。\n- **云存储集成**：下载后自动将视频和缩略图上传到云存储（OpenList/Alist）。\n- **字幕**：自动下载 YouTube / Bilibili 默认语言字幕。\n- **收藏夹**：创建自定义收藏夹以整理您的视频。\n- **订阅功能**：管理 YouTube、Bilibili 和 Twitch 频道订阅，并在新内容发布后自动下载。\n- **RSS 订阅**：为外部 RSS 阅读器创建私密订阅链接，并可按频道、作者、标签、来源、最近时间范围和条目上限分别配置过滤条件。\n- **登录保护**：支持密码登录并可选使用通行密钥 (WebAuthn)。\n- **访客用户**：启用只读角色，便于分享但不允许修改。\n- **国际化**：支持多种语言，包括英语、中文、西班牙语、法语、德语、日语、韩语、阿拉伯语、葡萄牙语和俄语。\n- **移动端优化**：移动端友好的标签菜单和针对小屏幕优化的布局。\n- **Cookie 管理**：支持上传 `cookies.txt` 以启用年龄限制或会员内容的下载。\n- **yt-dlp 配置**: 通过用户界面自定义全局 `yt-dlp` 参数、网络代理及其他高级设置。\n- **TMDB 集成**：在设置中配置您的 TMDB API 密钥，即可为本地视频文件启用自动元数据抓取。抓取器会智能解析文件名以提取标题并与 TMDB 数据库匹配。\n- **Cloudflare Tunnel 集成**: 内置 Cloudflare Tunnel 支持，无需端口转发即可轻松将本地 MyTube 实例暴露到互联网。\n- **任务钩子**: 在下载任务的各个阶段（开始、成功、失败、取消）执行自定义 Shell 脚本，以实现集成和自动化。详见 [任务钩子指南](documents/zh/hooks-guide.md)。\n- **Telegram 通知**: 当下载任务成功或失败时，通过 Telegram 机器人接收即时通知。\n- **浏览器扩展**: 提供 Chrome 扩展，支持直接从浏览器下载视频。支持所有 yt-dlp 支持的站点。\n\n## 浏览器扩展\n\n有关安装和使用说明，请参阅 [浏览器扩展](documents/zh/chrome-extension.md)。\n\n## MikMok\n\n[MikMok](https://github.com/franklioxygen/MikMok) 是 MyTube 的短视频 Web 客户端，可通过 API 连接 MyTube，提供更适合短视频浏览的流式观看体验。\n\n## 目录结构\n\n有关项目结构的详细说明，请参阅 [目录结构](documents/zh/directory-structure.md)。\n\n## 开始使用\n\n有关安装和设置说明，请参阅 [开始使用](documents/zh/getting-started.md)。\n\n## 部署安全模型\n\n有关管理员三档信任边界与部署安全模型的说明，请参阅 [部署安全模型](documents/zh/deployment-security-model.md)。\n\n## API 端点\n\n有关可用 API 端点的列表，请参阅 [API 端点](documents/zh/api-endpoints.md)。\n\n## 技术栈\n\n### 后端\n\n- **运行时**: Node.js with TypeScript\n- **框架**: Express.js\n- **数据库**: SQLite with Drizzle ORM\n- **测试**: Vitest\n- **架构**: 分层架构 (路由 → 控制器 → 服务 → 数据库)\n\n### 前端\n\n- **框架**: React 19 with TypeScript\n- **构建工具**: Vite\n- **UI 库**: Material-UI (MUI)\n- **状态管理**: React Context API\n- **路由**: React Router v7\n- **HTTP 客户端**: Axios with React Query\n\n### 关键架构特性\n\n- **模块化存储服务**: 拆分为专注的模块以提高可维护性\n- **下载器模式**: 用于平台特定实现的抽象基类\n- **数据库迁移**: 使用 Drizzle Kit 自动更新模式\n- **下载队列管理**: 支持队列的并发下载\n- **视频下载跟踪**: 防止跨会话重复下载\n\n## 环境变量\n\n该应用使用环境变量进行配置。\n\n### 前端 (`frontend/.env`)\n\n```env\nVITE_API_URL=/api\nVITE_BACKEND_URL=\n```\n\n### 后端 (`backend/.env`)\n\n```env\nPORT=5551\n# 可选：声明当前部署中管理员的信任边界。\n# 可选值：application | container | host\n# 默认值：container\n# MYTUBE_ADMIN_TRUST_LEVEL=container\n```\n\n默认数据与上传路径位于 `backend/data` 和 `backend/uploads`（相对于后端工作目录）。\n\n将 `backend/.env.example` 复制为 `backend/.env` 并按需调整。前端已提供 `frontend/.env`，可使用 `frontend/.env.local` 覆盖默认值。\n\n## 数据库\n\nMyTube 使用 **SQLite** 和 **Drizzle ORM** 进行数据持久化。数据库在首次启动时自动创建和迁移：\n\n- **位置**: `backend/data/mytube.db`\n- **迁移**: 在服务器启动时自动运行\n- **模式**: 通过 Drizzle Kit 迁移管理\n- **旧版支持**: 提供迁移工具以从基于 JSON 的存储转换\n\n关键数据库表：\n\n- `videos`: 视频元数据和文件路径\n- `collections`: 视频收藏夹/播放列表\n- `subscriptions`: 频道/创作者订阅\n- `rss_tokens`: 私密 RSS 订阅链接、过滤条件、启停状态和访问统计\n- `downloads`: 活动下载队列\n- `download_history`: 完成的下载历史\n- `video_downloads`: 跟踪已下载的视频以防止重复\n- `settings`: 应用程序配置\n\n## 贡献\n\n我们欢迎贡献！请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何开始、我们的开发工作流程以及代码质量指南。\n\n## 部署\n\n有关 Docker 部署的详细说明（包括 GitHub 官方容器镜像 `ghcr.io/franklioxygen/mytube:latest` 与单容器 `stacks/docker-compose.single-container.yml`），请参阅 [Docker 部署指南](documents/zh/docker-guide.md).\n有关 `application` / `container` / `host` 三档管理员信任边界，请参阅 [部署安全模型](documents/zh/deployment-security-model.md)。\n\n## 星标历史\n\n\u003ca href=\"https://www.star-history.com/#franklioxygen/MyTube\u0026type=date\u0026legend=bottom-right\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=franklioxygen/MyTube\u0026type=date\u0026theme=dark\u0026legend=bottom-right\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=franklioxygen/MyTube\u0026type=date\u0026legend=bottom-right\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=franklioxygen/MyTube\u0026type=date\u0026legend=bottom-right\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n\n## 免责声明\n\n- 使用目的与限制 本软件（及相关代码、文档）仅供个人学习、研究及技术交流使用。严禁将本软件用于任何形式的商业用途，或利用本软件进行违反国家法律法规的犯罪活动。\n\n- 责任界定 开发者对用户使用本软件的具体行为概不知情，亦无法控制。因用户非法或不当使用本软件（包括但不限于侵犯第三方版权、下载违规内容等）而产生的任何法律责任、纠纷或损失，均由用户自行承担，开发者不承担任何直接、间接或连带责任。\n\n- 二次开发与分发 本项目代码开源，任何个人或组织基于本项目代码进行修改、二次开发时，应遵守开源协议。 特别声明： 若第三方人为修改代码以规避、去除本软件原有的用户认证机制/安全限制，并进行公开分发或传播，由此引发的一切责任事件及法律后果，需由该代码修改发布者承担全部责任。我们强烈不建议用户规避或篡改任何安全验证机制。\n\n- 非盈利声明 本项目为完全免费的开源项目。开发者从未在任何平台发布捐赠信息，本软件本身不收取任何费用，亦不提供任何形式的付费增值服务。任何声称代表本项目收取费用、销售软件或寻求捐赠的信息均为虚假信息，请用户仔细甄别，谨防上当受骗。\n\n## 许可证\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranklioxygen%2FMyTube","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffranklioxygen%2FMyTube","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffranklioxygen%2FMyTube/lists"}