├── icon.png ├── _config.yml ├── scripts ├── __pycache__ │ └── md_to_versions_json.cpython-313.pyc ├── debug_links.py └── md_to_versions_json.py ├── doc ├── install-apk-obb.md ├── unzip-parsed-file.md ├── api-rule.md ├── special.md └── why-donate.md ├── .github ├── ISSUE_TEMPLATE │ ├── 提交建议.md │ ├── 版本更新请求.md │ ├── 提交版本.md │ └── 异常报告.md └── workflows │ └── jekyll-gh-pages.yml ├── api ├── v1 │ └── versions │ │ ├── index.json │ │ ├── 2.json │ │ └── 1.json └── glados.json ├── _includes └── head-custom-google-analytics.html ├── LICENSE ├── .gitignore ├── editor ├── README.md ├── version-editor.css ├── index.html └── version-editor.js ├── Sample.md ├── 404.md ├── index.html ├── README_en-us.md ├── README_VN.md ├── README.md ├── README_old.md └── assets └── js └── main.js /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SteveZMTstudios/Phigros-history/HEAD/icon.png -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman 2 | title: Phigros 历史版本收集 3 | description: 可能是最全的 Phigros 旧版本收集 4 | show_downloads: false 5 | google_analytics: G-STRYCQ7E8X 6 | -------------------------------------------------------------------------------- /scripts/__pycache__/md_to_versions_json.cpython-313.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SteveZMTstudios/Phigros-history/HEAD/scripts/__pycache__/md_to_versions_json.cpython-313.pyc -------------------------------------------------------------------------------- /doc/install-apk-obb.md: -------------------------------------------------------------------------------- 1 | # APK+OBB 简单安装指南 2 | ### 准备工作 3 | - 手机上准备好任一文件管理器,要能够访问手机目录,如[MT管理器](https://www.coolapk.com/apk/bin.mt.plus) 4 | - 下载好`apk`和`obb`两个包。 5 | 6 | ### 安装 7 | 1. 直接打开`apk`文件安装好,安装好后先不要打开。 8 | 2. 找到obb文件,将它移动到`/storage/emulated/0/Android/obb/com.PigeonGames.Phigros/`目录下。 9 | 3. 打开游戏。 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/提交建议.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 提交建议 3 | about: 我们的仓库有许多不完善的地方。通过提交建议来帮助我们改善它们。 4 | title: 建议:(想要我们改进的功能) 5 | labels: enhancement 6 | assignees: SteveZMTstudios 7 | 8 | --- 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | @SteveZMTstudios 18 | -------------------------------------------------------------------------------- /api/v1/versions/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "versions": [ 3 | { 4 | "version": "1.x", 5 | "url": "/api/v1/versions/1.json" 6 | }, 7 | { 8 | "version": "2.x", 9 | "url": "/api/v1/versions/2.json" 10 | }, 11 | { 12 | "version": "3.x", 13 | "url": "/api/v1/versions/3.json" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /api/glados.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "ok", 3 | "response": "still alive", 4 | "announce":[ 5 | { 6 | "type": "info", 7 | "message": "欢迎访问 Phigros History!查看历史版本及其更新内容。" 8 | }, 9 | { 10 | "type": "error", 11 | "message": "站点正在维护,部分旧版本安装包暂时不可达。" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /_includes/head-custom-google-analytics.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/版本更新请求.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 版本更新请求 3 | about: 因为各种原因,我们错过了一个更新的版本。在此发布提醒来催促更新。 4 | title: 更新版本 x.y.z 已经可用。 5 | labels: Update 6 | assignees: SteveZMTstudios 7 | 8 | --- 9 | 10 | ### Phigros新版本已经发布。 11 | 12 | 最新版本: `x.y.z` 13 | 14 | 15 | 网盘地址: 16 | 17 | ```URL 18 | https:// 19 | ``` 20 | 21 | 22 | 23 | 24 | 请尽快处理,以防版本丢失。 25 | 26 | @SteveZMTstudios 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2004 Sam Hocevar 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/提交版本.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 版本提交 3 | about: 部分版本已经难以在互联网上重新找到,如果您保留了它们的副本并且乐于共享,请通过此处提交。 4 | title: 版本 x.y.z 已经找到。 5 | labels: Update 6 | assignees: SteveZMTstudios 7 | 8 | --- 9 | 10 | ### Phigros版本已经找到。 11 | 12 | 版本: `x.y.z` 13 | 14 | 15 | 16 | 17 | 18 | 网盘地址: 19 | 20 | ```URL 21 | https:// 22 | ``` 23 | 24 | 25 | 26 | 27 | 请尽快处理,以防版本丢失。 28 | 29 | @SteveZMTstudios 30 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/异常报告.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 异常报告 3 | about: 在该网站和界面提供的程序存在异常。 4 | title: Bug: (简要描述异常的内容) 5 | labels: bug 6 | assignees: SteveZMTstudios 7 | 8 | --- 9 | 10 | ### 故障描述 11 | 12 | 13 | 14 | 15 | 16 | 17 | ### 触发流程 18 | 19 | 20 | 21 | 22 | ### 预期结果 23 | 24 | 25 | 26 | 27 | ### 实际情况 28 | 29 | 30 | 31 | 32 | ### 附加信息 33 | 34 | 35 | 36 | 37 | 38 | @SteveZMTstudios 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS generated files 2 | .DS_Store 3 | .DS_Store? 4 | ._* 5 | .Spotlight-V100 6 | .Trashes 7 | ehthumbs.db 8 | Thumbs.db 9 | 10 | # IDE and Editor files 11 | .idea/ 12 | .vscode/ 13 | *.swp 14 | *.swo 15 | *~ 16 | 17 | # Jekyll specific 18 | _site/ 19 | .sass-cache/ 20 | .jekyll-cache/ 21 | .jekyll-metadata 22 | .bundle/ 23 | vendor/ 24 | *.gem 25 | 26 | # Node modules (if using any Node.js tools) 27 | node_modules/ 28 | 29 | # Ruby environment 30 | .ruby-version 31 | .ruby-gemset 32 | 33 | # Log files 34 | *.log 35 | 36 | # Temporary files 37 | tmp/ 38 | .tmp/ 39 | *.tmp 40 | 41 | # Build output 42 | dist/ 43 | build/ 44 | 45 | # Environment variables 46 | .env 47 | .env.* -------------------------------------------------------------------------------- /scripts/debug_links.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import importlib.util, json, sys 3 | spec = importlib.util.spec_from_file_location('mdparser','scripts/md_to_versions_json.py') 4 | mod = importlib.util.module_from_spec(spec) 5 | spec.loader.exec_module(mod) 6 | with open('ver_data/VersionList_2.x.md','r',encoding='utf-8') as f: 7 | md = f.read() 8 | res = mod.parse_markdown_versions(md, debug=False) 9 | for d in res['details']: 10 | if d['versionName'] in ('v2.4.5','v2.4.6','v2.4.7'): 11 | print('---', d['versionName']) 12 | print('downloads:', json.dumps(d.get('downloads',{}),ensure_ascii=False,indent=2)) 13 | # find block start to inspect raw lines 14 | lines = md.splitlines() 15 | start = None 16 | for i,l in enumerate(lines): 17 | if l.strip().startswith('###') and d['versionName'].lstrip('v') in l: 18 | start = i 19 | break 20 | if start is not None: 21 | snippet = lines[start:start+20] 22 | print('\n'.join(snippet)) 23 | else: 24 | print('block not found') 25 | print('\nDone') 26 | -------------------------------------------------------------------------------- /editor/README.md: -------------------------------------------------------------------------------- 1 | # Phigros 版本编辑器 2 | 3 | 这是一个**独立的**静态网页应用,用于编辑遵循 `api/v1/versions/*` 规范的版本列表 JSON 文件。 4 | 5 | 主要功能 ✅ 6 | - 从本地文件载入或粘贴 JSON 7 | - 载入仓库示例(若服务器允许 CORS) 8 | - 添加 / 修改版本条目(版本名、版本码、发布日期、标签、changelog) 9 | - 添加 / 修改下载渠道及其键值对(任意渠道) 10 | - 从剪贴板直接粘贴网盘链接并添加为下载条目 11 | - 在小窗口打开链接以便快速检查可用性 12 | - 支持“保存到文件…”(使用 File System Access API,当浏览器不支持时回退为导出文件) 13 | - 导出 JSON(压缩与美化格式) 14 | 15 | - 新增“粘贴批量版本日志”功能:可以将发布日志(见样例)粘贴到剪贴板并导入为多个版本条目。导入时会检测已有 `versionName` 并询问是否覆盖已有条目或跳过。 16 | 17 | 使用方法 🔧 18 | 1. 打开 `editor/version-editor.html`(直接在浏览器中打开文件) 19 | 2. 使用“从文件载入”载入现有 `1.json` 或其他版本文件,或使用“粘贴JSON”从剪贴板载入。也可以点击“载入仓库示例”尝试直接通过相对路径加载 `/api/v1/versions/1.json`(注意CORS限制)。 20 | 3. 在左侧列表选择版本开始编辑。添加渠道、添加链接、并使用“小窗检查”打开链接检查可用性。 21 | 4. 编辑完后点击“导出为JSON”下载文件,或“美化导出”得到可读性更强的版本。将导出的文件手动放回 `api/v1/versions/` 以供部署。 22 | 23 | 注意事项 ⚠️ 24 | - 这是一个前端静态编辑器;它不能直接写回仓库。请手动将导出的 JSON 文件提交到仓库或通过你的工作流上传。 25 | - 若浏览器支持 File System Access API(例如 Chromium 系列),可以在“从文件载入”时打开并维持文件句柄,随后使用“保存到文件…”直接写回该文件;如果不支持,会自动回退到导出下载的方式。 26 | - 编辑器在检测到未保存更改时会在关闭/刷新页面前弹出系统提示以避免数据丢失(浏览器会显示类似“系统可能不会保存您所作的更改”的提醒)。 27 | 28 | 贡献 💡 29 | 欢迎提交改进建议: 30 | - 增强校验与差异视图(diff) 31 | - 支持直接提交到 git / GitHub(需认证) 32 | - 更灵活的批量导入/导出格式 33 | 34 | --- 35 | Created by GitHub Copilot (Raptor mini (Preview)) — 这是一个独立编辑器,与 `index.html` 无关。 -------------------------------------------------------------------------------- /.github/workflows/jekyll-gh-pages.yml: -------------------------------------------------------------------------------- 1 | # Sample workflow for building and deploying a Jekyll site to GitHub Pages 2 | name: Deploy Jekyll with GitHub Pages dependencies preinstalled 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | push: 7 | branches: ["main"] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 19 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 20 | concurrency: 21 | group: "pages" 22 | cancel-in-progress: false 23 | 24 | jobs: 25 | # Build job 26 | build: 27 | runs-on: ubuntu-latest 28 | steps: 29 | - name: Checkout 30 | uses: actions/checkout@v4 31 | - name: Setup Pages 32 | uses: actions/configure-pages@v5 33 | - name: Build with Jekyll 34 | uses: actions/jekyll-build-pages@v1 35 | with: 36 | source: ./ 37 | destination: ./_site 38 | - name: Upload artifact 39 | uses: actions/upload-pages-artifact@v3 40 | 41 | # Deployment job 42 | deploy: 43 | environment: 44 | name: github-pages 45 | url: ${{ steps.deployment.outputs.page_url }} 46 | runs-on: ubuntu-latest 47 | needs: build 48 | steps: 49 | - name: Deploy to GitHub Pages 50 | id: deployment 51 | uses: actions/deploy-pages@v4 52 | -------------------------------------------------------------------------------- /editor/version-editor.css: -------------------------------------------------------------------------------- 1 | *{box-sizing:border-box;font-family:Inter,Segoe UI,Helvetica,Arial,sans-serif} 2 | body{margin:0;color:#222;background:#f6f7fb} 3 | .topbar{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:#fff;border-bottom:1px solid #eee} 4 | .topbar h1{margin:0;font-size:18px} 5 | .controls button{margin-left:8px} 6 | .container{display:flex;min-height:calc(100vh - 100px)} 7 | .sidebar{width:320px;background:#fff;border-right:1px solid #eee;padding:12px} 8 | .version-list{list-style:none;padding:0;margin:12px 0;max-height:calc(100vh - 200px);overflow:auto} 9 | .version-list li{padding:8px;border:1px solid #eee;border-radius:6px;margin-bottom:8px;cursor:pointer;background:#fafafa} 10 | .version-list li.active{border-color:#3b82f6;background:linear-gradient(#ffffff,#eef6ff)} 11 | .editor{flex:1;padding:20px} 12 | .panel{background:#fff;padding:16px;border-radius:8px;border:1px solid #eee} 13 | .hidden{display:none} 14 | .row{display:flex;gap:12px;margin-bottom:12px} 15 | .row label{flex:1} 16 | label{display:block} 17 | input,textarea{width:100%;padding:8px;border:1px solid #ddd;border-radius:6px} 18 | .channels{margin-top:10px} 19 | .channel{border:1px dashed #ddd;padding:8px;border-radius:6px;margin-bottom:8px;background:#fafafa} 20 | .channel h4{display:flex;justify-content:space-between;align-items:center;margin:0 0 8px 0} 21 | .channel .links{display:flex;flex-direction:column;gap:6px} 22 | .link-row{display:flex;gap:8px;align-items:center} 23 | .link-row input{flex:1} 24 | .link-row button{white-space:nowrap} 25 | .actions{margin-top:16px;display:flex;gap:8px} 26 | .danger{background:#ffdddd;border:1px solid #ffaaaa} 27 | .footer{padding:12px;text-align:center;color:#666} 28 | .empty{color:#666;font-size:14px;padding:20px} 29 | .hint{font-size:12px;color:#888;margin-top:8px} -------------------------------------------------------------------------------- /doc/unzip-parsed-file.md: -------------------------------------------------------------------------------- 1 | # 分卷压缩包解压指南 2 | 3 | 本指南将帮助您解压 7z 格式的分卷压缩包。 4 | 5 | ## 前置要求 6 | 7 | ### 1. 安装解压缩软件 8 | 9 | 您需要安装支持 7z 格式的解压缩软件。推荐以下选项: 10 | 11 | **Windows 平台:** 12 | - [7-Zip zstd 增强版](https://github.com/mcmilk/7-Zip-zstd/releases/latest "您所在的区域可能无法访问此链接。") (推荐) 13 | 14 | **Android 平台:** 15 | - [ZArchiver](https://play.google.com/store/apps/details?id=ru.zdevs.zarchiver "您所在的区域可能无法访问此链接。") (Google Play) 16 | - [ZArchiver Pro](https://github.com/SteveZMTstudios/sharepoint/releases/tag/zarchive "您所在的区域可能无法访问此链接。") (第三方版本) 17 | 18 | ### 2. 准备分卷文件 19 | 20 | 确保您拥有完整的分卷文件集合。分卷文件通常按以下格式命名: 21 | (具体以发布页面为准) 22 | 23 | ``` 24 | ├── Phigros_x.y.z.7z.001 25 | ├── Phigros_x.y.z.7z.002 26 | ├── Phigros_x.y.z.7z.003 27 | └── ... 28 | ``` 29 | 30 | > **重要提示:** 31 | > - 必须下载所有分卷文件,缺失任何一个都无法完成解压 32 | > - 不要重命名分卷文件,保持原始文件名不变 33 | > - 将所有分卷文件放置在同一文件夹中 34 | 35 | ## 解压操作步骤 36 | 37 | ### 方法一:双击解压(推荐) 38 | 39 | 1. 打开存放分卷文件的文件夹 40 | 2. 找到编号为 `001` 的第一个分卷文件 41 | 3. 双击 `*.7z.001` 文件 42 | 4. 如果正确操作,将显示压缩包内容 43 | 44 | ### 方法二:右键菜单解压 45 | 46 | 如果双击无法正常工作,请按以下步骤操作: 47 | 48 | 1. 右键点击 `*.7z.001` 文件 49 | 2. 选择解压选项: 50 | - **7-Zip 用户**:选择 "7-Zip" → "解压到当前文件夹" 51 | - **WinRAR 用户**:选择 "解压到当前文件夹" 52 | 3. 等待解压完成 53 | 54 | 55 | **Q:为什么只需要点击第一个分卷文件?** 56 | A:分卷压缩包是一个整体,解压软件会自动按顺序读取所有分卷文件。通常情况下,解压软件只会注册第一个分卷文件的扩展名作为默认打开方式,虽然技术上可以点击任意分卷,但选择第一个(001)是最安全的做法。 57 | 58 | **Q:解压时提示文件损坏怎么办?** 59 | A:通常是因为分卷文件不完整或下载过程中出现错误。请检查: 60 | - 是否下载了所有分卷文件 61 | - 文件大小和sha256是否与发布页面标注的一致 62 | - 重新下载可能损坏的分卷文件 63 | 64 | **Q:解压速度很慢是正常的吗?** 65 | A:是的。分卷压缩包包含大量数据,解压需要时间。请耐心等待,不要中途取消操作。 66 | 67 | **Q: 尝试解压时提示“无法识别的文件格式”怎么办?** 68 | A:请确保您使用的解压软件支持 7z LZMA2 格式。推荐使用最新版本的 7-Zip 或 ZArchiver。 69 | 70 | **Q: 我遇到了其他问题,并且我确定问题来自你们提供的文件。** 71 | A: 请在[此处](https://github.com/SteveZMTstudios/Phigros-history/issues/new/)发送反馈,注明以下信息: 72 | 73 | - 您使用的操作系统和解压软件版本 74 | - 具体的错误信息或截图 75 | - 您尝试解压的文件名和路径 76 | 77 | 78 | -------------------------------------------------------------------------------- /editor/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 版本编辑器 — Phigros Version Editor 7 | 8 | 9 | 10 |
11 |

版本编辑器 ✅

12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 | 27 |
28 | 35 | 36 |
37 |
请选择或创建一个版本以开始编辑 ✍️
38 | 69 |
70 |
71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /doc/api-rule.md: -------------------------------------------------------------------------------- 1 | # 版本API规范 2 | 此文档为版本API规范,定义了版本API的设计原则、命名规范、请求和响应格式等内容。 3 | 4 | ## 0. 状态测试 5 | 状态测试接口用于检查API服务的运行状态,确保服务可用。 6 | 请求示例: 7 | ``` 8 | GET /api/v1/glados 9 | ``` 10 | 响应: 11 | ```json 12 | { 13 | "status": "ok", 14 | "message": "still alive", 15 | "announce":[ 16 | { 17 | "type":"info", // 可选值 info/warning/error/error_persist 18 | "content":"欢迎使用Phigros History!" // 公告内容 19 | }, 20 | { 21 | "type":"warning", 22 | "content":"注意:愚人节版本仅在4月1日有效,过期后请更新至最新版本以继续使用全部功能。" 23 | }// ...更多公告... 24 | ] 25 | } 26 | ``` 27 | 28 | 29 | ## 1. 大版本目录 30 | 大版本目录用于区分不同的大版本。每个大版本目录下包含该版本的细节版本列表地址。 31 | 32 | 请求示例: 33 | ``` 34 | GET /api/v1/versions/index 35 | ``` 36 | 37 | 响应: 38 | ```json 39 | { 40 | "versions": [ 41 | { 42 | "version": "1.x", 43 | "url": "/api/v1/versions/1.json" // 指向v1.x.x大版本的细节版本列表 44 | }, 45 | { 46 | "version": "2.x", 47 | "url": "/api/v1/versions/2.json" 48 | }, 49 | { 50 | "version": "3.x", 51 | "url": "/api/v1/versions/3.json" 52 | } 53 | ] 54 | } 55 | ``` 56 | 57 | ## 2. 细节版本列表 58 | 细节版本列表用于列出某个大版本下的所有细节版本信息,包括版本号、发布日期和更新内容和下载链接集合 59 | 60 | 请求示例: 61 | ``` 62 | GET /api/v1/versions/1 63 | ``` 64 | 65 | 响应: 66 | ```json 67 | { 68 | "version": "v1", 69 | "details": [ 70 | { 71 | "versionName": "v1.0.0", 72 | "versionCode": 1, 73 | "releaseDate": "2022-01-15", 74 | "changelog": [ 75 | "- Initial release", 76 | "Support Multi-line", 77 | "- Bug fixes", 78 | "..etc",// 多行文本 79 | ], 80 | "tag":[],// 可选字段,发布时的标签,如"april-fools","big-update" 81 | "downloads":{ 82 | "taptap":{ // 渠道服版本不一致,分为taptap和playstore两个子对象 83 | "123":"https://www.123pan.com/s/xxxxxx", // 每个子对象有多个下载负载点 84 | "huang1111":"https://www.huang1111.com/xxxxxx", 85 | "github":"https://github.com/stevezmtstudios/Phigros-history/releases/tag/v1.0.0", 86 | "caiyun":"https://cloud.139.com/t/xxxxxx", 87 | "onedrive":"https://1drv.ms/u/xxxxxx", 88 | // 可扩充其他下载渠道,解析时将键值对视为渠道名称和对应链接 89 | }, 90 | "playstore":{ 91 | "123":"https://www.123pan.com/s/yyyyyy", 92 | "huang1111":"https://www.huang1111.com/yyyyyy", 93 | "github":"https://github.com/stevezmtstudios/Phigros-history/releases/tag/v1.0.0", 94 | "caiyun":"https://cloud.139.com/t/yyyyyy", 95 | "onedrive":"https://1drv.ms/u/yyyyyy", 96 | }// 暂时不存在其他渠道 97 | }, 98 | }, 99 | { 100 | "versionName": "v1.0.1", 101 | "versionCode": 2, 102 | "releaseDate": "2022-02-10", 103 | "changelog": [ 104 | "- Bug fixes", 105 | "- Performance improvements", 106 | "..etc", 107 | ], 108 | "tag":["april-fools"],// 可选字段,发布时的标签,如"april-fools","big-update" 109 | "downloads":{ 110 | "taptap":{ 111 | "123pan":"https://www.123pan.com/s/aaaaaa", 112 | "huang1111":"https://www.huang1111.com/aaaaaa", 113 | "github":"https://github.com/stevezmtstudios/Phigros-history/releases/tag/v1.0.1", 114 | "caiyun":"https://cloud.139.com/t/aaaaaa", 115 | "onedrive":"https://1drv.ms/u/aaaaaa", 116 | }, 117 | "playstore":{}, // 如果某个渠道没有该版本的下载链接,可以返回空对象 118 | }, 119 | } 120 | // ...更多版本... 121 | ] 122 | } 123 | ``` 124 | 125 | ## 3. 错误处理 126 | API在处理请求时可能会遇到各种错误情况。任何不为JSON格式的响应都视为错误响应。 -------------------------------------------------------------------------------- /Sample.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ### Version 0.0.0.0 (0) 0000/01/01 5 | Any Update log from https://www.taptap.cn/app/165287/all-info 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | ![版本已遗失](https://img.shields.io/badge/无法下载-red.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik0yMC44NCAyMi43M0wxOC4xMSAyMEg1di0yaDExLjExbC0zLjA1LTMuMDVMMTIgMTZMNSA5aDIuMTFsLTYtNmwxLjI4LTEuMjdsMTkuNzIgMTkuNzN6TTE5IDloLTRWM0g5djIuOGw2LjYgNi42eiIvPjwvc3ZnPg== "在互联网上找不到这个版本的任何有效分发包,我们的版本库中也并未存储它。") 19 | 20 | ![v3.x](https://img.shields.io/badge/3.x-更新版本-blue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik0xOCAxMXYyaC04bDMuNSAzLjVsLTEuNDIgMS40Mkw2LjE2IDEybDUuOTItNS45MkwxMy41IDcuNUwxMCAxMXpNMiAxMkExMCAxMCAwIDAgMSAxMiAyYTEwIDEwIDAgMCAxIDEwIDEwYTEwIDEwIDAgMCAxLTEwIDEwQTEwIDEwIDAgMCAxIDIgMTJtMiAwYTggOCAwIDAgMCA4IDhhOCA4IDAgMCAwIDgtOGE4IDggMCAwIDAtOC04YTggOCAwIDAgMC04IDgiLz48L3N2Zz4=) 21 | [![1.x](https://img.shields.io/badge/1.x-更旧版本-blue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik0yMiAxMmExMCAxMCAwIDAgMS0xMCAxMEExMCAxMCAwIDAgMSAyIDEyQTEwIDEwIDAgMCAxIDEyIDJhMTAgMTAgMCAwIDEgMTAgMTBNNiAxM2g4bC0zLjUgMy41bDEuNDIgMS40MkwxNy44NCAxMmwtNS45Mi01LjkyTDEwLjUgNy41TDE0IDExSDZ6Ii8+PC9zdmc+)](/ver_data/VersionList_1.x.md) 22 | 23 | 24 | 25 | [![遇到问题?](https://img.shields.io/badge/遇到问题-yellow.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik0xMSAxOGgydi0yaC0yem0xLTEyYy0yLjIgMC00IDEuOC00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuOC0zIDVoMmMwLTIuMiAzLTIuNSAzLTVjMC0yLjItMS44LTQtNC00bTctMXYxNEg1VjV6bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTIiLz48L3N2Zz4=)](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose) [![View in Github](https://img.shields.io/badge/Github_%E9%A1%B5%E9%9D%A2-%E5%89%8D%E5%BE%80-brightgreen?logo=github) 26 | ](https://github.com/SteveZMTstudios/Phigros-history) 27 | 28 | 29 | -------------------------------------------------------------------------------- /404.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ## 找不到页面 5 | 6 | 7 | 8 | 9 |
10 | HTTP 404 Not Found 11 |
12 | 13 | 14 | 71 | 72 |
73 | 你肯定知道那是什么意思。 74 |
75 | 76 | 77 | 请尝试以下解决办法: 78 | 79 | - 稍后重新加载此网页。 80 | - 在[Wayback Machine](https://web.archive.org/web/20250801000000*/stevezmt.top/Phigros-history)中查找此页面的存档副本。 81 | - 向带你来的人确认此页面的地址是否正确。 82 | - 使用搜索引擎搜索你在找的关键字。 83 |
84 |
85 | 88 | 89 | 92 |
93 |
94 | 102 | 103 | 104 | 如果你确信这是一个错误,请[在这里反馈](https://github.com/stevezmtstudios/Phigros-history/issues/new/choose)。 105 | 106 | [返回主页](/) 107 | 返回上一页 108 | 109 | 110 | > 本页面继承自[SteveZMTstudios](https://blog.stevezmt.top)的博客页面。 111 | > 基于CC BY-NC-SA 4.0协议转载。 -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Phigros History 7 | 8 | 9 | 10 | 11 | 12 | 32 |
33 |
34 | 35 |
点 击 屏 幕 开 始
36 |
37 |
38 |
39 | 40 |
41 |
42 | 43 | 44 |
45 | 46 | 47 | 61 | 62 |
63 | 72 |
73 | 77 |
78 |
79 |
80 | data_usage 81 | 290.0 GB 82 |
83 |
84 |
85 | 86 |
87 | 90 | 91 |
92 |
93 | 94 |
95 |
96 | 97 | 125 |
126 | 127 |
128 | 131 |
 
132 | Phigros History / 选择版本
133 |
134 |
SATURN  Virtual OS 
135 |
Powerednotby PhigrOS
136 |
137 |
138 | 141 |
142 |
143 | 144 | 145 | 146 | 147 | -------------------------------------------------------------------------------- /doc/special.md: -------------------------------------------------------------------------------- 1 | # Phigros 特别版本 2 | 你是否在寻找一些特别的版本,如第一个在TapTap/Google Play发布的版本?抑或者是正在找2020,2021至2024年的愚人节版本?全部都可以在此找到! 3 | 4 | ------ 5 | 6 | ## 1.0.1(11) 7 | 这是PigeonGames在2019年8月向公众发布的首个Release. 8 | 9 | ### 更新日志 10 | ``` 11 | Version 1.0.0 (1) 2019/08/29 12 | 一些软件优化 13 | 14 | Version 1.0.0 (1) 2019/08/28 15 | 更改了游戏关卡画面的初始亮度 16 | ``` 17 | 18 | ### 下载 19 | [![从 Github 下载](https://img.shields.io/badge/Github-下载_共存APK-lightgreen?logo=Github)](https://kkgithub.com/SteveZMTstudios/Phigros-history/releases/tag/v1.0.0)
20 | [![huang1111](https://img.shields.io/badge/huang1111.cn-下载_APK+OBB-green)](https://pan.huang1111.cn/s/GWA6fW) 21 | 22 | 23 | 24 | 真1版本?来自互联网 25 | 26 | [![ TapTap 版本(huang1111)](https://img.shields.io/badge/bilibili-备选下载-lightblue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://pan.huang1111.cn/s/oX72lC8) 提取码:`stevezmt` 27 | 28 | ----------- 29 | ## 1.4.1(17) 30 | 这是2020年PigeonGames的愚人节专版。 31 | 32 | ### 虚假的更新日志 33 | ``` 34 | Version 1.4.1 (17) 2020/03/30 35 | 36 | 1、新增一首全新单曲: 37 | Dead Soul 38 | 2、除此之外没有任何新内容,请放心游玩 39 | ``` 40 | 41 | ### 注释 42 | 愚人节谱面需要调整设备日期。
43 | 进入方法:[bilibili by顾筱霜](https://www.bilibili.com/video/BV1fA411875E) 44 | > 现已知愚人节谱如下: 45 | > 46 | > Rubbish Sorting:在曲绘中自左到右点击垃圾桶 47 | > 48 | > Burn:点击曲绘左侧的香烟 49 | > 50 | > Dead Soul:多次点击EZ 51 | > 52 | > もぺもぺ:点击曲绘中人物手中的花 53 | > 54 | > spamodic 点击(光)最亮的地方 55 | > 56 | > HAZARD 按照EZ-HD-IN-HD-EZ的顺序点几遍 57 | > 58 | > Sigma 1. 长按任意难度的大图标,进入第一个SP 2. SP-1打到600000及以上,结算后点继续,即可进入里SP(小心黄色郁金香!) 59 | 60 | --来自[Phigros Fandom](https://phigros.fandom.com/zh/wiki/愚人节谱) 61 | 62 | 63 | ### 下载 64 | [![huang1111](https://img.shields.io/badge/huang1111.cn-下载_APK+OBB-green)](https://pan.huang1111.cn/s/LENXT6) 65 | [![ TapTap 版本(huang1111)](https://img.shields.io/badge/TapTap-备选下载-lightblue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://pan.huang1111.cn/s/75ekDSg) 66 | [![ TapTap 版本(Github)](https://img.shields.io/badge/共存版-全局下载-blue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://github.com/SteveZMTstudios/Phigros-history/releases/download/v1.4.1/Phigros_V1.4.1_clone.apk) 67 | 68 | ------ 69 | ## 1.6.5(42) 70 | 这是2021年PigeonGames的愚人节专版。 71 | 72 | ### 更新日志(能不能有点新意) 73 | ``` 74 | Version 1.6.5 (42) 2021/03/29 75 | 76 | 1、一首全新单曲: 77 | Wavetapper 78 | 2、修复了部分信息显示错误的问题。 79 | 3、修复了Legacy谱面无法进入的问题。 80 | 4、除此之外没有任何新内容,请放心游玩。 81 | ``` 82 | 83 | ### 注释 84 | Spasmodic (Haocore Mix):多次点击《光》曲绘白色部分 85 | 86 | Wave Tapper:随音乐节奏点击中间立方体两面(一说乱点) 87 | 88 | ### 下载 89 | [![huang1111](https://img.shields.io/badge/huang1111.cn-下载_APK+OBB-green)](https://pan.huang1111.cn/s/KNlgiY) 90 | [![ TapTap 版本(huang1111)](https://img.shields.io/badge/TapTap-备选下载-lightblue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://pan.huang1111.cn/s/Qzk1mUm) 91 | 92 | 93 | -------- 94 | 95 | ## 2.1.4(57) 96 | 2022年Phigros愚人节专版。 97 | 98 | ### 更新日志 99 | ``` 100 | Version 2.1.4 (57) 2022/03/28 101 | 102 | 1.一首新曲:FULi AUTO BUSTER 103 | (真的没有新内容(真的(心虚 104 | ``` 105 | 106 | ### 注释 107 | 108 | 1. HAZARD 难度不断切换: EZ HD IN HD EZ HD IN, 一直切就能进入 109 | 2. SIGMA 选择 IN 难度, 长按左边歌曲列表中的SIGMA 右边的难度 '15 IN', 长按它大概五秒, 就能进入表里谱 110 | 3. 按照 2 中的方法进入表里谱, 然后控分到 60w+ (必须小于 70w) 获得 F 评级, 然后点右下角的继续就能进入里里谱 111 | 112 | ---来自[TapTap TT-684593](https://www.taptap.cn/moment/258770435015969399) 113 | 114 | ### 下载 115 | [![huang1111](https://img.shields.io/badge/huang1111.cn-下载_APK+OBB-green)](https://pan.huang1111.cn/s/nlX9Im) 116 | [![ TapTap 版本(huang1111)](https://img.shields.io/badge/TapTap-备选下载-lightblue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://pan.huang1111.cn/s/G8q8xFW) 117 | 118 | ------ 119 | ## 2.5.1(77) 120 | 这是鸽游在2023年愚人节发布的~~大雪花~~特别版本。 121 | 122 | ### 更新日志 (怎么这么朴素) 123 | ``` 124 | Version 2.5.1 (77) 2023/03/29 125 | 126 | 1. 新增一首与 Paradigm: Reboot 联动的单曲:「零號車輛」 by seatrus 127 | 2. 新增一首单曲:「Random」 by Sobrem × Silentroom 128 | ``` 129 | 130 | ### 注释 131 | 解锁方法: 132 | 133 | 1.Random 长按随机键[Random愚人节谱共七个差分] 134 | 135 | 2.雪降 进游戏点击右下角难度→打开空调遥控器→点击mode→狂点到0度 136 | 137 | ------转自[bilibili CatGames-猫游](https://www.bilibili.com/read/mobile?id=22777506) 138 | 139 | ### 下载 140 | [![从 Github 下载](https://img.shields.io/badge/Github-下载_APK-lightgreen?logo=Github)](https://github.com/SteveZMTstudios/Phigros-history/releases/tag/v2.5.1) 141 |
[![123云盘](https://img.shields.io/badge/123云盘-下载_APK-lightgreen?logo=Github)](https://www.123pan.com/s/OS4KVv-uZbrv.html) 142 | 143 | ------- 144 | ## 3.5.2(100) 145 | 这是鸽游在2024年愚人节发布的~~美女与野兽~~特别版本。 146 | 147 | ### 更新日志 148 | ``` 149 | Version 3.5.2 (100) 2024/03/29 150 | 151 | 1. 新增一首单曲: 152 | •「BRAIN HACKER」 by SOMON 153 | 2. 漂流瓶経由で募集されたデザイナーたちを追加 154 | 3. 甘美な歌声を追加 155 | 4. 背後にお気を付けください 156 | 5. 其他错误修复 157 | ``` 158 | 159 | ### 注释 160 | 在第八章中找到“Retribution”。 161 | 162 | 点击下面中间的白色“OS”按钮切换。 163 | 164 | 接着点击左下方的“Mirror”背景没有变色的话多点击几次就可以了。 165 | 166 | 或者在“Retribution”歌曲页面中将屏幕翻转过来。 167 | 168 | ### 下载 169 | [![从 Github 下载](https://img.shields.io/badge/Github-获取-lightgreen?logo=Github)](https://github.com/SteveZMTstudios/Phigros-history/releases/tag/v3.5.2) 170 |
[![123云盘](https://img.shields.io/badge/123云盘-下载_APK-green)](https://www.123pan.com/s/OS4KVv-nPerv.html) 171 |
[![huang1111](https://img.shields.io/badge/huang1111.cn-下载_APK+OBB-green)](https://pan.huang1111.cn/s/jA5efy) 172 | 173 | --------- 174 | ## 3.12.0(124) 175 | 这是鸽游在2025年愚人节发布的~~眼病~~特别版本。 176 | 177 | ### 更新日志 178 | ``` 179 | 180 | 1. 新增与EGTS的联动章节,包含以下曲目: 181 | •「Resolver」 by: Gomadare 182 | •「Luminous Entities Lost Heart」 by: NormalM feat. Usagi Denki 183 | •「KIZUNA Resolution」 by: TAG 184 | •「AbsoluTe disoRdeR」 by: Acute Disarray 185 | 186 | 下列曲目将从「单曲」移至「EGTS 精选集」: 187 | •「Silence is Golden, Speech is Golden」 by: NIWASHI 188 | •「Fractured Angel」 by: DJ Raisei 189 | 2. 其他错误修复 190 | ``` 191 | 192 | ### 注释 193 | 194 | 打开“虫眼”(在Collection收集品选项下,长按“重演”按钮) 195 | 196 | 然后打开“过去的章节”,找到“Dlyrotz”曲目,选择IN难度放置,在音乐第三段时,精准接住七个小节的字符note(不接任何红flick),确保最终分数为0113699,然后等候曲目结束。 197 | 198 | 详见视频指南 199 | 200 | 201 | 202 | 203 | ### 下载 204 | [![ Taptap 版本(123pan)](https://img.shields.io/badge/TapTap_(123云盘)-下载-brightgreen.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://www.123684.com/s/OS4KVv-hH98v "通过123云盘下载TapTap版本,可能需要付费") 205 | [![ Taptap 版本(中国移动云盘)](https://img.shields.io/badge/TapTap_(彩云网盘)-下载-green.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://caiyun.139.com/m/i?2jexCagSU4bd0 "通过中国移动云盘下载TapTap版本,需要登录和客户端,对中国移动用户免流量") 206 | [![ TapTap 版本(huang1111)](https://img.shields.io/badge/TapTap_(huang1111)-备选下载-lightblue.svg?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiNmZmZmZmYiIGQ9Ik01IDIwaDE0di0ySDVtMTQtOWgtNFYzSDl2Nkg1bDcgN3oiLz48L3N2Zz4=)](https://pan.huang1111.cn/s/k2ooQcB) 207 | 208 | --------- 209 | 210 | 211 | 备注: 212 | 213 | 更新日志来自TapTap 214 | 215 | 第一个版本的判定依据是Play商店的最小的版本序号。 216 | 217 | 如果此文章或者本存储库中的任何内容侵犯到了您的权益,请立刻发布[issue](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose)告知我,我会在收到后尽快删除他们。 218 | -------------------------------------------------------------------------------- /README_en-us.md: -------------------------------------------------------------------------------- 1 | > This page may not up to date. 2 | ![New icon](icon.png "New Icon") 3 | # Phigros Old version Collection 4 | 5 | **English(US)** | [简体中文](https://stevezmt.top/Phigros-history/README_old) | [Tiếng Việt](https://stevezmt.top/Phigros-history/README_VN) 6 | 7 | Phigros is a "laneless" music game with dynamic judgement lines and four different types of notes, bringing you a refreshing rhythm experience like never before! 8 | 9 | [![View in TapTap](https://img.shields.io/badge/TapTap-View-cyan?logo=data%3Aimage%2Fsvg%2Bxml%3Bcharset%3Dutf-8%3Bbase64%2CPHN2ZyB0PSIxNzM5NTQ1ODcwMDM3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQxOTYiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNMjQ5LjEyNzEwOCAxMDIzLjk0OTAwM0EyNTUuOTg2NzUxIDI1NS45ODY3NTEgMCAwIDEgMC4wMDAwMDMgNzcyLjY3MjAwOFYyNTEuNDMxOTg2YTI1NS45ODY3NTEgMjU1Ljk4Njc1MSAwIDAgMSAyNTUuOTg2NzUtMjUxLjQyOTk4Nmg1MTEuOTczNTAyYTI1NS45ODY3NTEgMjU1Ljk4Njc1MSAwIDAgMSAyNTUuOTg2NzUgMjU1Ljk4Njc1MXY1MTEuOTczNTAxYTI1NS45ODY3NTEgMjU1Ljk4Njc1MSAwIDAgMS0yNDkuMDc0MTA4IDI1NS45ODY3NTF6IG0zODguMzMxOTAxLTY3NC4wNjUxMTJhNS43MzM3MDMgNS43MzM3MDMgMCAwIDAgMi4wNDc4OTQgMTAuMjM5NDdjMTguNzM5MDMgMy4xNzQ4MzYgMjYuNDE4NjMzIDE5LjA5NzAxMiAyNi40MTg2MzMgNjcuNTI5NTA1djMxMC45NzM5MDRhMTEuMzY1NDEyIDExLjM2NTQxMiAwIDAgMCAxMS40MTY0MDkgMTEuMzY1NDEyaDY0LjQ1NjY2NGExMS4zNjU0MTIgMTEuMzY1NDEyIDAgMCAwIDExLjQxNzQwOS0xMS4zMTU0MTRWNjMyLjM0MDI3MWE1LjY4MjcwNiA1LjY4MjcwNiAwIDAgMSA5LjY3NjQ5OS0zLjk5Mzc5MyA3Ni43OTYwMjUgNzYuNzk2MDI1IDAgMCAwIDE3LjU2MTA5MSAxMi4wODMzNzUgNzkuNTYwODgyIDc5LjU2MDg4MiAwIDAgMCAzNS44MzgxNDUgNy43Mjk2YzM0LjQwNDIxOSAwIDExNS43NTcwMDktMjUuNTk4Njc1IDExNS43NTcwMDktMTQ0LjYzMjUxNCAwLTExNi45ODQ5NDUtODEuNjU5NzczLTE0NS4zNDg0NzctMTE2LjI2ODk4Mi0xNDUuMzQ4NDc4YTcyLjU0NjI0NSA3Mi41NDYyNDUgMCAwIDAtMzcuMDY4MDgyIDkuMzE3NTE4IDc5LjU2MDg4MiA3OS41NjA4ODIgMCAwIDAtMTkuNjA3OTg1IDE1LjkyMzE3NiA1LjYzMTcwOSA1LjYzMTcwOSAwIDAgMS05Ljc3ODQ5NC0yLjUwOTg3IDcxLjY3NjI5IDcxLjY3NjI5IDAgMCAwLTMuNjg1ODA5LTExLjcyMzM5MyA3Mi4yOTAyNTggNzIuMjkwMjU4IDAgMCAwLTYwLjUxNTg2OC0zNS44MzgxNDUgODMuMzQ5Njg2IDgzLjM0OTY4NiAwIDAgMC00Ny42NjQ1MzMgMTYuNTM3MTQ0ek01MzYuMzQ0MjQzIDYxMC45OTEzNzZjMTAuMjM5NDcgMjkuMDgwNDk1IDQwLjk1Nzg4IDYwLjQ2NDg3IDEwNi42NDQ0OCAyMy4zNDY3OTJhNS43MzM3MDMgNS43MzM3MDMgMCAwIDAtMC43MTY5NjMtMTAuMjM5NDdjLTI4LjI2MTUzNy05LjQyMDUxMi0yNC4xNjU3NDktNDkuMjUyNDUxLTI0LjE2NTc0OS02Mi4yMDQ3OFYzNzMuMzgzNjc0YTExLjQxNzQwOSAxMS40MTc0MDkgMCAwIDAtMTEuNDE2NDA5LTExLjM2NTQxMWgtNjMuNjM4NzA2YTExLjQxNzQwOSAxMS40MTc0MDkgMCAwIDAtMTEuMjEyNDIgOS4zMTc1MTdsLTEuMDIzOTQ3IDUuNDc4NzE3YTE4NS4wMjc0MjMgMTg1LjAyNzQyMyAwIDAgMC01MC4xMjE0MDYtNS4zNzU3MjJjLTExNS43MDYwMTEtMC4wNTA5OTctMTI3LjQzMDQwNCAxMDEuMDYzNzY5LTEyNy40MzA0MDQgMTQ3LjY1MjM1OCAwIDMzLjQ4MzI2NyAxOC45NDMwMiAxMjcuOTkzMzc1IDEwOC4zMzMzOTIgMTI3Ljk5MzM3NWE2Ny43ODU0OTIgNjcuNzg1NDkyIDAgMCAwIDQzLjU2ODc0NS0xMy4yNTkzMTMgMTAwLjgwNzc4MiAxMDAuODA3NzgyIDAgMCAwIDIxLjE5NTkwMy0yMy43NTU3NzEgNS42MzE3MDkgNS42MzE3MDkgMCAwIDEgNC43NjE3NTQtMi41NTk4NjcgNS40Nzc3MTYgNS40Nzc3MTYgMCAwIDEgNS4yNzI3MjcgMy41ODM4MTR6TTEwOC4xMjk0MDYgMjc1LjgwMjcyNWE2MS40MzY4MiA2MS40MzY4MiAwIDAgMC0xNC4xODEyNjYgNTQuNTI1MTc4YzEwLjgwMjQ0MSAyOC4wNTY1NDggMzAuNzY5NDA3IDI4LjA1NjU0OCA2NS40Mjk2MTQgMjguMDU2NTQ4aDQ2Ljc0MzU4YTExLjM2NTQxMiAxMS4zNjU0MTIgMCAwIDEgMTEuMzY1NDEyIDExLjQxNjQwOVY2MzYuNTkwMDUxYTExLjM2NTQxMiAxMS4zNjU0MTIgMCAwIDAgMTEuNDE3NDA5IDExLjM2NTQxMmg2NC41MDg2NjFhMTEuMzY1NDEyIDExLjM2NTQxMiAwIDAgMCAxMS40MTc0MDktMTEuMzY1NDEyVjM2OS45MDI4NTVhMTEuMzY1NDEyIDExLjM2NTQxMiAwIDAgMSAxMS40MTY0MDktMTEuNTE5NDA0aDc2Ljc5NjAyNmExMS4zNjU0MTIgMTEuMzY1NDEyIDAgMCAwIDExLjQxNzQwOS0xMS4yNjM0MTd2LTQ0LjMzNzcwNWExMS4zNjU0MTIgMTEuMzY1NDEyIDAgMCAwLTExLjM2NjQxMi0xMS40MTY0MDlIMTMyLjU1MTE0MmMtMTEuMjYzNDE3IDAtMTUuMzU5MjA1LTUuMTE5NzM1LTE0LjQzODI1My0xMS4zMTQ0MTVhNS41Mjk3MTQgNS41Mjk3MTQgMCAwIDAtNS42MzE3MDgtNi4yNDY2NzcgNS43ODU3MDEgNS43ODU3MDEgMCAwIDAtNC4zNTE3NzUgMS45OTY4OTd6IG0zODcuNjE0OTM4IDE0Mi4wMjE2NDlhODAuMDcyODU2IDgwLjA3Mjg1NiAwIDAgMSAyNy4zMzk1ODUgMS43OTE5MDggMTEuMTYxNDIyIDExLjE2MTQyMiAwIDAgMSA3Ljc4MjU5NyAxMC44NTM0Mzh2MTE4LjkzMTg0NGEzNS44MzgxNDUgMzUuODM4MTQ1IDAgMCAxLTE3LjE1MTExMiAyNi40Njg2MyA3Mi4zNDIyNTYgNzIuMzQyMjU2IDAgMCAxLTI4LjMxMjUzNSA4LjgwNjU0NCA0OC4wNzQ1MTIgNDguMDc0NTEyIDAgMCAxLTYuMjQ1Njc2IDAuNDA5OTc5Yy02OC43MDY0NDQtMC4wNTE5OTctODIuMTIwNzUtMTYxLjY4MTYzMiAxNi41ODcxNDEtMTY3LjI2MjM0M3ogbTI3My44NTU4MjYgMTU4LjcxMTc4NmEzOS4xNjU5NzMgMzkuMTY1OTczIDAgMCAxLTkuMjY3NTItNS42MzE3MDkgMjEuMTk1OTAzIDIxLjE5NTkwMyAwIDAgMS03LjExNjYzMi0xNi41MzcxNDRWNDUzLjg2NjUwOWEyMi4yMTg4NSAyMi4yMTg4NSAwIDAgMSA1LjY4MjcwNi0xNS4zNTkyMDUgMzkuNzc5OTQxIDM5Ljc3OTk0MSAwIDAgMSAxMC4yMzk0Ny04LjAzODU4NCA1OS4xMzI5MzkgNTkuMTMyOTM5IDAgMCAxIDI2LjUyMDYyNy03LjA2NDYzNGMxNS4zNTkyMDUgMCA2MS4wMjY4NDEgMTEuNTE5NDA0IDYxLjAyNjg0MiA3OS44Njc4NjZhNzIuNDQ0MjUgNzIuNDQ0MjUgMCAwIDEtNjIuMTAxNzg2IDc3LjUxMjk4OCA2My40ODQ3MTQgNjMuNDg0NzE0IDAgMCAxLTI0Ljk4NDcwNy00LjE5ODc4M3oiIGZpbGw9IiNmZmZmZmYiIHAtaWQ9IjQxOTciPjwvcGF0aD48L3N2Zz4K&logoColor=white 10 | )](https://www.taptap.cn/app/165287)  [![View in Play Store](https://img.shields.io/badge/Play_Store-View-lightgreen?logo=googleplay&logoColor=white 11 | )](https://play.google.com/store/apps/details?id=com.PigeonGames.Phigros)  [![View in App Store](https://img.shields.io/badge/App_Store-View-blue?logo=appstore&logoColor=white 12 | )](https://apps.apple.com/cn/app/phigros/id1454809109) 13 | 14 | #### [**🔄Check for updates**](https://github.com/SteveZMTstudios/Phiros-history/issues) [🆙Reminder for updates](https://github.com/SteveZMTstudios/Phigros-history/issues/new) 15 | 16 | If the content on [this page](https://stevezmt-top.translate.goog/Phigros-history/ver_data/VersionList_3.x?_x_tr_sl=zh-CN&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp) is not the latest version available, please contact me by clicking the Check for Updates button above 🥳THANKS! 17 | 18 | > [!CAUTION] 19 | > This project urgently needs your support to continue. 20 | > 21 | > As all upstream storage has started to charge higher fees, the cost and expenses of storing the project are beyond our ability to bear. 22 | > 23 | > If you want to support us to continue to provide free services, please consider donating. Thank you for your support! 24 | > 25 | > 26 | > Donate Via Patreon
[More Information](https://stevezmt-top.translate.goog/Phigros-history/doc/why-donate?_x_tr_sl=zh-CN&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp) 27 | 28 | ## How do I download them? 29 | [**↗️Check the version List**](https://stevezmt-top.translate.goog/Phigros-history/ver_data/VersionList_3.x?_x_tr_sl=zh-CN&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp) 30 |
[↗️Early version](https://stevezmt-top.translate.goog/Phigros-history/ver_data/VersionList_2.x?_x_tr_sl=zh-CN&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
31 | These changelog was edited by the company who release them. They speak chinese and i am not suitable to translate them. 32 | 33 | 34 | ## Announcement 35 | Cause I do not have enough time to maintain it, future update uploads may be delayed. If you want to help this project, or if you already have a new cloud disk version, please send the sharing link to the issue partition. Thank you very much for your help! 36 | 37 | ### For Global user 38 | This project may use some website that from China Mainland. If you have problems to visit them directly, you can check such as [apkmirror.com](https://apkmirror.com) or [apkcombo.com](https://apkconbo.com). 39 | 40 | This is not the official program source code of Phigros. Here we only provide some historical versions of the Android armv8a apk package download from Nanjing Pigeon Games Network limited company. Please do not use it for any other commercial purposes.
All materials are collected from the Internet. If they infringe your rights, please post an issue in this section and I will delete them immediately after seeing them. 41 |
42 | Warning: Some versions may be restricted by real-name verification and cannot be entered. Try to enable the airplane mode? 43 |
44 | 45 | ## Some instructions 46 | Tip: All packages with clone characters are modified package name versions and can coexist with your existing Phigros. The ones containing crack are extracted directly from the old installed equipment.
47 | In other words, the crack suffix is the same as the application published on TapTap. It can be updated from this repository or from TapTap. It will not be affected in any way, but it cannot coexist.
48 | The clone suffix is a coexistence version, which can coexist with the crack version or the latest version of TapTap, but the archive cannot coexist, which is a headache. 49 |
50 | 51 | 52 | ## Can't find all versions?
53 | **You can** [**Click here**](https://github.com/SteveZMTstudios/Phiros-history/issues) **to initiate an issue to remind me to update related Phigros components.** 54 | 55 | ## Need help? 56 | [**Click here**](https://github.com/SteveZMTstudios/Phiros-history/issues) **to initiate an issue** or mail to [admin@stevezmt.top](mailto:admin@stevezmt.top) 57 | 58 |
59 | 60 | > Copyright belongs to ©Nanjing PigeonGames Network Co., Ltd.
All right reserved by them. [Company Website](https://pigeon-games.com/?utm_source=Phigros-history&utm_medium=OfficialWebsite) [Privacy Policy](https://pigeon-games.com/news/2) 61 | -------------------------------------------------------------------------------- /README_VN.md: -------------------------------------------------------------------------------- 1 | > Page này không được dịch chính thức từ chủ web
2 | > Page này có thể lỗi thời nếu mình lười hoặc quên 🐧 3 | 4 | Bản dịch tiếng Việt bởi [**Huy Hoang Cao**](https://www.facebook.com/huyhoangcao39393939/) 5 | ![新九鸟](icon.png "新图标") 6 | # BỘ SƯU TẬP APK PHIGROS 7 | 8 | **Tiếng Việt** | [简体中文](https://stevezmt.top/Phigros-history/README_old) | [English(US)](https://stevezmt.top/Phigros-history/README_en-us) 9 | 10 | Phigros là một trò chơi âm nhạc "không có làn đường" với các đường phán đoán năng động và bốn loại nốt nhạc khác nhau, mang đến cho bạn trải nghiệm nhịp điệu mới mẻ chưa từng có! 11 | 12 | [![xem in TapTap](https://img.shields.io/badge/TapTap-xem-cyan?logo=data%3Aimage%2Fsvg%2Bxml%3Bcharset%3Dutf-8%3Bbase64%2CPHN2ZyB0PSIxNzM5NTQ1ODcwMDM3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQxOTYiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNMjQ5LjEyNzEwOCAxMDIzLjk0OTAwM0EyNTUuOTg2NzUxIDI1NS45ODY3NTEgMCAwIDEgMC4wMDAwMDMgNzcyLjY3MjAwOFYyNTEuNDMxOTg2YTI1NS45ODY3NTEgMjU1Ljk4Njc1MSAwIDAgMSAyNTUuOTg2NzUtMjUxLjQyOTk4Nmg1MTEuOTczNTAyYTI1NS45ODY3NTEgMjU1Ljk4Njc1MSAwIDAgMSAyNTUuOTg2NzUgMjU1Ljk4Njc1MXY1MTEuOTczNTAxYTI1NS45ODY3NTEgMjU1Ljk4Njc1MSAwIDAgMS0yNDkuMDc0MTA4IDI1NS45ODY3NTF6IG0zODguMzMxOTAxLTY3NC4wNjUxMTJhNS43MzM3MDMgNS43MzM3MDMgMCAwIDAgMi4wNDc4OTQgMTAuMjM5NDdjMTguNzM5MDMgMy4xNzQ4MzYgMjYuNDE4NjMzIDE5LjA5NzAxMiAyNi40MTg2MzMgNjcuNTI5NTA1djMxMC45NzM5MDRhMTEuMzY1NDEyIDExLjM2NTQxMiAwIDAgMCAxMS40MTY0MDkgMTEuMzY1NDEyaDY0LjQ1NjY2NGExMS4zNjU0MTIgMTEuMzY1NDEyIDAgMCAwIDExLjQxNzQwOS0xMS4zMTU0MTRWNjMyLjM0MDI3MWE1LjY4MjcwNiA1LjY4MjcwNiAwIDAgMSA5LjY3NjQ5OS0zLjk5Mzc5MyA3Ni43OTYwMjUgNzYuNzk2MDI1IDAgMCAwIDE3LjU2MTA5MSAxMi4wODMzNzUgNzkuNTYwODgyIDc5LjU2MDg4MiAwIDAgMCAzNS44MzgxNDUgNy43Mjk2YzM0LjQwNDIxOSAwIDExNS43NTcwMDktMjUuNTk4Njc1IDExNS43NTcwMDktMTQ0LjYzMjUxNCAwLTExNi45ODQ5NDUtODEuNjU5NzczLTE0NS4zNDg0NzctMTE2LjI2ODk4Mi0xNDUuMzQ4NDc4YTcyLjU0NjI0NSA3Mi41NDYyNDUgMCAwIDAtMzcuMDY4MDgyIDkuMzE3NTE4IDc5LjU2MDg4MiA3OS41NjA4ODIgMCAwIDAtMTkuNjA3OTg1IDE1LjkyMzE3NiA1LjYzMTcwOSA1LjYzMTcwOSAwIDAgMS05Ljc3ODQ5NC0yLjUwOTg3IDcxLjY3NjI5IDcxLjY3NjI5IDAgMCAwLTMuNjg1ODA5LTExLjcyMzM5MyA3Mi4yOTAyNTggNzIuMjkwMjU4IDAgMCAwLTYwLjUxNTg2OC0zNS44MzgxNDUgODMuMzQ5Njg2IDgzLjM0OTY4NiAwIDAgMC00Ny42NjQ1MzMgMTYuNTM3MTQ0ek01MzYuMzQ0MjQzIDYxMC45OTEzNzZjMTAuMjM5NDcgMjkuMDgwNDk1IDQwLjk1Nzg4IDYwLjQ2NDg3IDEwNi42NDQ0OCAyMy4zNDY3OTJhNS43MzM3MDMgNS43MzM3MDMgMCAwIDAtMC43MTY5NjMtMTAuMjM5NDdjLTI4LjI2MTUzNy05LjQyMDUxMi0yNC4xNjU3NDktNDkuMjUyNDUxLTI0LjE2NTc0OS02Mi4yMDQ3OFYzNzMuMzgzNjc0YTExLjQxNzQwOSAxMS40MTc0MDkgMCAwIDAtMTEuNDE2NDA5LTExLjM2NTQxMWgtNjMuNjM4NzA2YTExLjQxNzQwOSAxMS40MTc0MDkgMCAwIDAtMTEuMjEyNDIgOS4zMTc1MTdsLTEuMDIzOTQ3IDUuNDc4NzE3YTE4NS4wMjc0MjMgMTg1LjAyNzQyMyAwIDAgMC01MC4xMjE0MDYtNS4zNzU3MjJjLTExNS43MDYwMTEtMC4wNTA5OTctMTI3LjQzMDQwNCAxMDEuMDYzNzY5LTEyNy40MzA0MDQgMTQ3LjY1MjM1OCAwIDMzLjQ4MzI2NyAxOC45NDMwMiAxMjcuOTkzMzc1IDEwOC4zMzMzOTIgMTI3Ljk5MzM3NWE2Ny43ODU0OTIgNjcuNzg1NDkyIDAgMCAwIDQzLjU2ODc0NS0xMy4yNTkzMTMgMTAwLjgwNzc4MiAxMDAuODA3NzgyIDAgMCAwIDIxLjE5NTkwMy0yMy43NTU3NzEgNS42MzE3MDkgNS42MzE3MDkgMCAwIDEgNC43NjE3NTQtMi41NTk4NjcgNS40Nzc3MTYgNS40Nzc3MTYgMCAwIDEgNS4yNzI3MjcgMy41ODM4MTR6TTEwOC4xMjk0MDYgMjc1LjgwMjcyNWE2MS40MzY4MiA2MS40MzY4MiAwIDAgMC0xNC4xODEyNjYgNTQuNTI1MTc4YzEwLjgwMjQ0MSAyOC4wNTY1NDggMzAuNzY5NDA3IDI4LjA1NjU0OCA2NS40Mjk2MTQgMjguMDU2NTQ4aDQ2Ljc0MzU4YTExLjM2NTQxMiAxMS4zNjU0MTIgMCAwIDEgMTEuMzY1NDEyIDExLjQxNjQwOVY2MzYuNTkwMDUxYTExLjM2NTQxMiAxMS4zNjU0MTIgMCAwIDAgMTEuNDE3NDA5IDExLjM2NTQxMmg2NC41MDg2NjFhMTEuMzY1NDEyIDExLjM2NTQxMiAwIDAgMCAxMS40MTc0MDktMTEuMzY1NDEyVjM2OS45MDI4NTVhMTEuMzY1NDEyIDExLjM2NTQxMiAwIDAgMSAxMS40MTY0MDktMTEuNTE5NDA0aDc2Ljc5NjAyNmExMS4zNjU0MTIgMTEuMzY1NDEyIDAgMCAwIDExLjQxNzQwOS0xMS4yNjM0MTd2LTQ0LjMzNzcwNWExMS4zNjU0MTIgMTEuMzY1NDEyIDAgMCAwLTExLjM2NjQxMi0xMS40MTY0MDlIMTMyLjU1MTE0MmMtMTEuMjYzNDE3IDAtMTUuMzU5MjA1LTUuMTE5NzM1LTE0LjQzODI1My0xMS4zMTQ0MTVhNS41Mjk3MTQgNS41Mjk3MTQgMCAwIDAtNS42MzE3MDgtNi4yNDY2NzcgNS43ODU3MDEgNS43ODU3MDEgMCAwIDAtNC4zNTE3NzUgMS45OTY4OTd6IG0zODcuNjE0OTM4IDE0Mi4wMjE2NDlhODAuMDcyODU2IDgwLjA3Mjg1NiAwIDAgMSAyNy4zMzk1ODUgMS43OTE5MDggMTEuMTYxNDIyIDExLjE2MTQyMiAwIDAgMSA3Ljc4MjU5NyAxMC44NTM0Mzh2MTE4LjkzMTg0NGEzNS44MzgxNDUgMzUuODM4MTQ1IDAgMCAxLTE3LjE1MTExMiAyNi40Njg2MyA3Mi4zNDIyNTYgNzIuMzQyMjU2IDAgMCAxLTI4LjMxMjUzNSA4LjgwNjU0NCA0OC4wNzQ1MTIgNDguMDc0NTEyIDAgMCAxLTYuMjQ1Njc2IDAuNDA5OTc5Yy02OC43MDY0NDQtMC4wNTE5OTctODIuMTIwNzUtMTYxLjY4MTYzMiAxNi41ODcxNDEtMTY3LjI2MjM0M3ogbTI3My44NTU4MjYgMTU4LjcxMTc4NmEzOS4xNjU5NzMgMzkuMTY1OTczIDAgMCAxLTkuMjY3NTItNS42MzE3MDkgMjEuMTk1OTAzIDIxLjE5NTkwMyAwIDAgMS03LjExNjYzMi0xNi41MzcxNDRWNDUzLjg2NjUwOWEyMi4yMTg4NSAyMi4yMTg4NSAwIDAgMSA1LjY4MjcwNi0xNS4zNTkyMDUgMzkuNzc5OTQxIDM5Ljc3OTk0MSAwIDAgMSAxMC4yMzk0Ny04LjAzODU4NCA1OS4xMzI5MzkgNTkuMTMyOTM5IDAgMCAxIDI2LjUyMDYyNy03LjA2NDYzNGMxNS4zNTkyMDUgMCA2MS4wMjY4NDEgMTEuNTE5NDA0IDYxLjAyNjg0MiA3OS44Njc4NjZhNzIuNDQ0MjUgNzIuNDQ0MjUgMCAwIDEtNjIuMTAxNzg2IDc3LjUxMjk4OCA2My40ODQ3MTQgNjMuNDg0NzE0IDAgMCAxLTI0Ljk4NDcwNy00LjE5ODc4M3oiIGZpbGw9IiNmZmZmZmYiIHAtaWQ9IjQxOTciPjwvcGF0aD48L3N2Zz4K&logoColor=white 13 | )](https://www.taptap.cn/app/165287)  [![xem in CH Play](https://img.shields.io/badge/CH_Play-xem-lightgreen?logo=googleplay&logoColor=white 14 | )](https://play.google.com/store/apps/details?id=com.PigeonGames.Phigros)  [![xem in App Store](https://img.shields.io/badge/App_Store-xem-blue?logo=appstore&logoColor=white 15 | )](https://apps.apple.com/cn/app/phigros/id1454809109) 16 | 17 | > [!CAUTION] 18 | > Dự án này rất cần sự hỗ trợ của bạn để có thể tiếp tục hoạt động. 19 | > 20 | > Khi các dịch vụ lưu trữ bắt đầu tính phí cao hơn, chi phí lưu trữ dự án trở nên vượt quá khả năng chi trả của chúng mình. 21 | > 22 | > 23 | > Nếu bạn muốn hỗ trợ mình và chủ web tiếp tục cung cấp các dịch vụ miễn phí, vui lòng cân nhắc quyên góp. Cảm ơn sự ủng hộ của các bạn! 24 | > 25 | > "Đô nết" chủ web qua Patreon
[Xem chi tiết tại](https://stevezmt-top.translate.goog/Phigros-history/doc/why-donate?_x_tr_sl=zh-CN&_x_tr_tl=vi&_x_tr_hl=vi&_x_tr_pto=wapp) 26 | 27 | 28 | 29 | ### THÔNG BÁO NÂNG CẤP WEBSITE 30 | Chúng mình đã cố gắng tìm kiếm và đồng bộ nhưng vẫn còn thiếu một số phiên bản. Dù rất khó để lấy lại chúng nhưng chúng mình sẽ cố gắng hết sức. 31 |
32 |
Vì dự án này do chủ web thực hiện thủ công nên nó tiêu tốn rất nhiều thời gian và sức lực của chính chủ web. Nếu bạn có các phiên bản còn thiếu, vui lòng liên hệ với mình qua [**Facebook**](https://www.facebook.com/huyhoangcao39393939/) 33 | 34 | 35 | Gần đây, trang web đang được lên kế hoạch nâng cấp và chỉnh sửa để mang lại trải nghiệm tốt hơn cho mọi người. Khi đó, một số thứ trên trang web có thể biến mất, bố cục lộn xộn và liên kết có thể không hợp lệ. Nếu bạn gặp phải những vấn đề như vậy, vui lòng kiên nhẫn chờ đợi, làm mới và thử lại hoặc gửi [vấn đề](https://github.com/SteveZMTstudios/Phigros-history/issues/new/) 36 |
-----Huy Hoang Cao----- 37 | 38 | Nếu nội dung trên [trang này](https://stevezmt-top.translate.goog/Phigros-history/ver_data/VersionList_3.x?_x_tr_sl=zh-CN&_x_tr_tl=vi&_x_tr_hl=vi&_x_tr_pto=wapp) không phải là phiên bản mới nhất, vui lòng liên hệ với chúng mình bằng cách nhấp vào nút Kiểm tra cập nhật ở trên. Cảm ơn!🥳🥳🥳 39 | 40 | ## THÔNG BÁO 41 | Do vấn đề bản quyền nên phiên bản `clone` tồn tại song song có thể không được cập nhật trong tương lai. Chỉ các APK phân phối chính thức (từ Play Store hoặc TapTap) mới có tại đây. 42 | 43 | Nếu bạn muốn trợ giúp dự án này hoặc nếu bạn có phiên bản còn thiếu, vui lòng gửi liên kết chia sẻ đến phần Issue hoặc gửi cho [**mình**](https://www.facebook.com/huyhoangcao39393939/). Cảm ơn rất nhiều vì sự giúp đỡ của bạn!🥳🥳🥳 44 | 45 | 46 | ## [**👉🔗TẤT CẢ PHIÊN BẢN👈**](https://stevezmt-top.translate.goog/Phigros-history/ver_data/VersionList_3.x?_x_tr_sl=zh-CN&_x_tr_tl=vi&_x_tr_hl=vi&_x_tr_pto=wapp) 47 | 48 |
49 | Đây không phải là hoạt động chính thức của Phigros. Ở đây chúng mình chỉ cung cấp một số phiên bản APK Phigros cũ của Pigeon Game.
Tất cả tài liệu được thu thập từ Internet. Nếu chúng vi phạm quyền của bạn, vui lòng đăng vấn đề trong phần này và chúng mình sẽ xóa chúng ngay. 50 | 51 | NGOÀI RA:ĐẶC BIỆT CẢM ƠN[**Huy Hoang Cao @WiBuMan**](https://www.facebook.com/huyhoangcao39393939/) 52 | PHẦN LỚN CÁC APK TỪ TAPTAP (VÀ CẢ CÁC PHIÊN BẢN GOOGLE PLAY) ĐƯỢC CUNG CẤP NHỜ SỰ GIÚP ĐỠ CỦA ANH ẤY, NẾU KHÔNG DỰ ÁN SẼ KHÔNG THỂ PHÁT TRIỂN ĐẾN QUY MÔ LỚN ĐẾN VẬY
(tự dịch lời khen dành cho mình nên ngại ghê hihi 🐧) (mới đó đã gần 3 năm rồi 😭) 53 | 54 | ## BẠN ĐANG TÌM KIẾM CÁC PHIÊN BẢN ĐẶC BIỆT KHÁC? 55 | 56 | [**Bộ sưu tập Phigros cá tháng tư**](https://stevezmt-top.translate.goog/Phigros-history/doc/special?_x_tr_sl=zh-CN&_x_tr_tl=vi&_x_tr_hl=vi&_x_tr_pto=wapp)
Vl lười dịch đống chữ trong đó lắm nên là cứ nhìn số phiên bản mà tìm nhé =)) 57 | 58 | [Bộ sưu tập các phiên bản Phigros (IOS)](https://github.com/YimingOvO/Phigros-History-iOS) (duy trì bởi @YimingOvO)
59 | 👆Dự án này hình như đã ngừng phát triển. Anh ấy nói rằng iPad của anh ấy bị hỏng (ai muốn có thể liên hệ để giúp đỡ chúng mình nhen) 60 | 61 | Cảnh báo: Một số phiên bản có thể bị hạn chế bởi việc xác minh tên thật và không thể truy cập được. Bạn có thể thứ thoát game ra và vào lại, nếu vẫn không được, hãy liên lạc [**với mình**](https://www.facebook.com/huyhoangcao39393939/) 62 |
63 | ## LIÊN KẾT TẢI XUỐNG 64 | 65 | [**Các phiên bản sau 3.0**](https://stevezmt-top.translate.goog/Phigros-history/ver_data/VersionList_3.x?_x_tr_sl=zh-CN&_x_tr_tl=vi&_x_tr_hl=vi&_x_tr_pto=wapp) 66 | 67 |
(Vl lười Việt hóa đống thông tin cập nhật nên nếu ai cần thì vẫn alo mình nhé, mình vẫn cứ để như thế thôi 🐧🐧🐧) 68 | 69 | ## MẸO 70 | Tất cả các gói có ký tự `clone` trong phần "Releases" đều là phiên bản package name đã được sửa đổi và có thể cùng tồn tại song song với Phigros hiện có của bạn. Còn `crack` là các phiên bản trích xuất trực tiếp từ các thiết bị đã cài đặt Phigros
71 | Nói cách khác, hậu tố `crack` là các APK được lấy từ các phát hành trên TapTap. Nó có thể được cập nhật từ kho lưu trữ này hoặc từ TapTap. Nhưng nó không thể cùng tồn tại với phiên bản Phigros trên máy bạn XD.。 72 |
(trừ khi dùng bí thuật làng lá để thay đổi package name, shhhh bí mật đó nhen 🐧)
73 | Hậu tố của `clone` là phiên bản cùng tồn tại, có thể cùng tồn tại với phiên bản crack hoặc phiên bản TapTap mới nhất, nhưng tiến trình sẽ không thể tồn tại trừ khi thực hiện các phương pháp đặc biệt như root, điều này thật đau đầu T_T. 74 |
`apk+obb` là phiên bản từ Google Play, đây cũng là phiên bản chính thức nhưng được phát hành trên Google Play. Về cách cài đặt gói cài đặt `apk+obb`, vui lòng tham khảo [Hướng dẫn cài đặt]([[https://blogchiasekienthuc.com/thu-thuat-hay/cai-file-apk-co-kem-data-tren-android.html]) 75 | 76 | 77 | 78 | ## KHÔNG THỂ TÌM THẤY TẤT CẢ CÁC PHIÊN BẢN?
79 | [**NHẤN VÀO ĐÂY**](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose) **Đưa ra "issue" để nhắc nhở mình "gõ đầu" chủ web cập nhật phiên bản mới nhất 🐧. 80 |
81 | 82 | [admin@stevezmt.top](mailto:admin@stevezmt.top) 83 | 84 | > Bản quyền thuộc về © Nanjing Geyou Network Co., Ltd. [Trang web chính thức](https://pigeon-games.com/?utm_source=Phhiros-history&utm_medium=OfficialWebsite&utm_campaign=Android) [Chính sách quyền riêng tư](https://pigeon-games.com/news/2) 85 | 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ![新九鸟](icon.png "新图标") 3 | # Phigros 历史版本收集 4 | 6 | **简体中文** | [English(US)](https://stevezmt.top/Phigros-history/README_en-us) | [Tiếng Việt](https://stevezmt.top/Phigros-history/README_VN) 7 | 8 | > 新页面已可供使用![点击这里前往新页面](https://stevezmt.top/Phigros-history/) 9 | 10 | 《Phigros》是由Pigeon Games(鸽游)开发的节奏类游戏。 11 | Pigeon Games是由初创通过bilibili视频网站发起的、由众多节奏类游戏爱好者组成的完全用爱发电的项目组。我们希望Phigros新颖的游戏模式和精心制作的插画与关卡可以让你感受到节奏类游戏的魅力。 12 | 13 | [![View in TapTap](https://img.shields.io/badge/TapTap-%E6%9F%A5%E7%9C%8B-cyan?logo=data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzM5NTkxMDIwNDYyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQ5OTQiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTczNS42MTYgNDc3LjU2OGM1LjYzMi03LjgwOCAxNC43Mi0xMi4wMzIgMjMuNjE2LTE0LjU5MiAyNS42LTcuMTY4IDUyLjQ4IDExLjMyOCA2MS4xODQgMzUuOTY4IDguMjU2IDIzLjQ4OCA4Ljk2IDUwLjgxNi0xLjUzNiA3My42LTExLjA3MiAyMy4wNC0zNi44NjQgNDEuMDI0LTYyLjQ2NCAzNC44OC0xMS4xMzYtMS45Mi0yNC4xOTItOS4xNTItMjQuMjU2LTIyLjMzNi0wLjEyOC0xNy4yOC0wLjEyOC0zNC40OTYtMC4xMjgtNTEuNzc2di0zOC4xNDRjMC02LjAxNiAwLTEyLjU0NCAzLjU4NC0xNy42ek00OTIuMTYgNDU2LjMyYTYyLjI3MiA2Mi4yNzIgMCAwIDAtNDYuODQ4IDMwLjRjLTE0LjA4IDI0LTE2IDU0LjE0NC04LjgzMiA4MC44MzIgNC42NzIgMTYuNDQ4IDEzLjYzMiAzMy4xNTIgMjkuMTg0IDQxLjAyNCAxMi4zNTIgNi40NjQgMjYuNzUyIDMuNjQ4IDM5LjM2LTAuNjQgMTMuNzYtNC42NzIgMjUuNzI4LTE4LjM2OCAyNC4xOTItMzMuOTg0di01NC4zMzYtNTAuNTZjMC4zODQtNS4xMi0yLjU2LTEwLjU2LTcuNjE2LTExLjY0OGE3Ny44ODggNzcuODg4IDAgMCAwLTI5LjQ0LTEuMDg4eiIgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iNDk5NSI+PC9wYXRoPjxwYXRoIGQ9Ik02NCAxOTJhMTI4IDEyOCAwIDAgMSAxMjgtMTI4aDY0MGExMjggMTI4IDAgMCAxIDEyOCAxMjh2NjQwYTEyOCAxMjggMCAwIDEtMTI4IDEyOEgxOTJhMTI4IDEyOCAwIDAgMS0xMjgtMTI4VjE5MnogbTg4LjE5MiAxMzEuMmMtMS43MjgtMi42MjQtNS43Ni0zLjUyLTgtMS4xNTItMTQuMzM2IDE2LjI1Ni0yMS42OTYgNDMuNTItOC4xMjggNjIuNTkyIDYuNCA5LjkyIDE4LjExMiAxNC4wOCAyOS4xMiAxNC44NDggMTMuNTA0IDAuODk2IDI3LjA3MiAwLjgzMiA0MC41NzYgMC43MDQgOS42IDAgMTkuMi0wLjA2NCAyOC43MzYgMC4xOTIgNS42OTYgMC42NCA5LjQ3MiA2LjUyOCA4Ljk2IDEyLjE2bC0wLjA2NCA4Mi41NnYxNjUuMTJjLTAuNjQgNi40NjQgNS4yNDggMTIuMTYgMTEuNTIgMTEuMzkyaDE5Ljk2OGMxMi44IDAuMDY0IDI1LjYgMC4xMjggMzguNC0wLjA2NCA1Ljc2IDAgMTAuMjQtNS43NiA5Ljc5Mi0xMS40NTZWNDEyLjYwOGMtMC43MDQtNi4wOCAzLjg0LTEyLjM1MiA5Ljk4NC0xMi4yODggMTIuOC0wLjEyOCAyNS42LTAuMTI4IDM4LjQtMC4xMjhoMzEuMTA0YzUuNDQgMC41MTIgMTEuMDA4LTQuMDMyIDExLjA3Mi05Ljc5MmEyMTM1LjA0IDIxMzUuMDQgMCAwIDAgMC00My4zMjggMTAuMzY4IDEwLjM2OCAwIDAgMC0xMS4wNzItOS44NTZIMTY3LjY4Yy00LjQ4LTAuMTI4LTkuNTM2LTAuMTkyLTEyLjkyOC0zLjU4NC0xLjY2NC0xLjkyLTEuOTItNC4zNTItMi4wNDgtNi43ODRhMjIuOTEyIDIyLjkxMiAwIDAgMC0wLjUxMi0zLjcxMnogbTU0OS45NTIgNjIuODQ4YTU5LjUyIDU5LjUyIDAgMCAwLTQ2Ljk3Ni03Ljc0NCA4Mi44MTYgODIuODE2IDAgMCAwLTI5LjU2OCAxNC41MjhjLTMuMjY0IDMuNTItMC40NDggOS4yMTYgNC4wMzIgOS4yOCA4LjMyIDEuNDcyIDE0Ljc4NCA4LjMyIDE3LjQwOCAxNi4zMiA0Ljg2NCAxNC4yNzIgNS4xMiAyOS41MDQgNS4zMTIgNDQuNDE2djI5My4xMmMtMC40NDggNi4yMDggNS4wNTYgMTEuODQgMTEuMDcyIDExLjMyOGgxMi45MjhsNDUuNjMyLTAuMDY0YzUuNzYgMC4xMjggMTAuNjI0LTUuNjMyIDEwLjA0OC0xMS40NTZ2LTQ0Ljk5Mi01Mi40OGMtMC41NzYtMy42NDggMi40MzItNy40ODggNi4yMDgtNi41OTJhMzEuODA4IDMxLjgwOCAwIDAgMSA2LjQgNC42MDhjMS40NzIgMS4yOCAzLjAwOCAyLjU2IDQuNzM2IDMuNjQ4IDE2Ljg5NiAxMS43NzYgMzguNjU2IDE0LjA4IDU4LjI0IDkuNmExMDQuNzY4IDEwNC43NjggMCAwIDAgNjcuODQtNDkuOTJjMTYuNTEyLTI4LjE2IDIwLjgtNjIuMDggMTkuMzkyLTk0LjMzNi0xLjI4LTMxLjE2OC05LjkyLTYzLjE2OC0zMC4wOC04Ny4xNjgtMTkuMzkyLTIzLjQyNC00OC44OTYtMzguODQ4LTc5LjEwNC0zOC4yNzJhNjYuODggNjYuODggMCAwIDAtNDguMzIgMjMuMzZjLTIuNTYgMy44NC04LjY0IDEuNzkyLTguOTYtMi42ODgtMi43NTItMTUuMTY4LTE0LjA4LTI2LjU2LTI2LjI0LTM0LjQ5NnogbS0xNjMuMDcyIDE3LjQ3MmMtNi43MiAwLjMyLTkuNDcyIDcuNTUyLTkuOTg0IDEzLjQ0YTEzNy45MiAxMzcuOTIgMCAwIDAtMjkuOTUyLTQuNDhjLTIxLjQ0LTEuMDI0LTQzLjM5Mi0wLjA2NC02My42MTYgNy45MzZhOTUuMzYgOTUuMzYgMCAwIDAtNDkuMDI0IDQzLjI2NGMtMTUuMzYgMjcuNTItMTkuNzEyIDYwLjE2LTE5LjIgOTEuNTIgMi4xMTIgMzIuNjQgMTIuNzM2IDY2LjI0IDM1LjUyIDg5Ljg1NiAyMC45MjggMjEuODg4IDUzLjMxMiAyOS43NiA4Mi4xMTIgMjMuMjk2IDE2LTMuNjQ4IDI4LjY3Mi0xNS41NTIgMzcuNzYtMjguOTkybDEuMTUyLTEuNmMxLjYtMi4zNjggMy4yNjQtNC45MjggNi40LTQuMjg4IDIuODE2IDAuMzg0IDMuNzc2IDIuOTQ0IDQuNjcyIDUuMzc2IDAuMzIgMC44MzIgMC42NCAxLjY2NCAxLjAyNCAyLjM2OCA1Ljg4OCAxNS4yOTYgMTguNDMyIDI4LjQxNiAzNC4zNjggMzIgMTkuMzI4IDQuNjA4IDM5LjA0LTIuNDMyIDU2LjEyOC0xMS40NTZhMjguOCAyOC44IDAgMCAxIDIuMTc2LTEuMjE2YzIuNTYtMS4zNDQgNS40NC0yLjgxNiA1LjYzMi02LjA4IDAuMTkyLTMuODQtMi44OC01LjI0OC01Ljk1Mi02LjUyOC0xLjQwOC0wLjY0LTIuODE2LTEuMjgtMy44NC0yLjA0OC0xMi4wMzItOC4xMjgtMTUuMTA0LTI0LjE5Mi0xNS42MTYtMzguMDE2di0xOTMuMjhjMC40NDgtNi4yMDgtNS4xMi0xMS43NzYtMTEuMDcyLTExLjJoLTE5LjUyYy0xMy4wNTYgMC0yNi4xMTIgMC0zOS4xNjggMC4xMjh6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSI0OTk2Ij48L3BhdGg+PC9zdmc+&logoColor=white 14 | )](https://www.taptap.cn/app/165287)  [![View in Play Store](https://img.shields.io/badge/Play_%E5%95%86%E5%BA%97-%E6%9F%A5%E7%9C%8B-lightgreen?logo=googleplay&logoColor=white 15 | )](https://play.google.com/store/apps/details?id=com.PigeonGames.Phigros)  [![View in App Store](https://img.shields.io/badge/App_Store-%E6%9F%A5%E7%9C%8B-blue?logo=appstore&logoColor=white 16 | )](https://apps.apple.com/cn/app/phigros/id1454809109) 17 | 18 | > 此项目希望能够得到您的帮助! 19 | > 20 | > 由于所有的上游存储开始收取更加高昂的费用,项目存储的费用和花销超出了我们所能承受的范围。 21 | > 22 | > 如果您想支持我们继续提供免费的服务,请考虑捐赠。感谢您的支持! 23 | > 24 | > [ 通过爱发电捐赠](https://afdian.com/a/stevezmtstudios) [了解详细信息](doc/why-donate.md)
25 | 26 | 27 | 28 | #### 2025-11-11 更新 [**🔄检查更新**](https://github.com/SteveZMTstudios/Phigros-history/issues) [🆙提醒更新](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose) 29 | 30 | ## [**👉🔗查找所有版本👈**](https://stevezmt.top/Phigros-history/) 31 | 32 | 33 | ## 在找其他版本? 34 | 35 | Phigros 特别版本合集:[**前往此处**](https://stevezmt.top/Phigros-history/doc/special) 36 | 37 | Phigros iOS 版本:[**前往此处**](https://github.com/YimingOvO/Phigros-History-iOS) (Maintained by [@YimingOvO](https://github.com/YimingOvO))
38 | 39 | ### 公告 40 | **2025-11-11 更新**:我们即将重新设计现有的页面结构,以便更好地支持未来的版本发布和存储需求,并带来更好的访问体验。
41 | 42 | 这不是Phigros的官方程序源代码,此处仅提供一些关于来自厦门鸽游(Pigeon Games)的一些历史版本的安卓端的apk包下载,请勿用做其他任何涉及商业用途。
所有素材收集自网络,如果他们侵犯了您的权益,请在该板块发布issue,我会在看到后立即删除它们。 43 | 44 | 123云盘近日开始限制每个用户的最大下载流量为1GB,超出将需要支付费用。目前对此的缓解方案是(1)使用来自huang1111.cn的网盘;(2)下载123云盘的[客户端](https://www.123pan.com/Downloadclient);(3)从Github上下载。 45 | 46 | 我们将加快调整结构,尽快移除123云盘的链接(尽管这短期内可能根本无法实现),并提供更多的下载选项。 47 | 48 | 特别感谢[**Huy Hoang Cao @WiBuMan**](https://www.facebook.com/huyhoangcao39393939/) 49 | 提供的数百个来自TapTap的安装包,没有他的帮助,该项目不可能发展地如此庞大。 50 | 51 | 我们同步并跟进了数十个版本记录,但是仍有少数版本散佚。虽然找回它们较为困难,但我们会尽力尝试。 52 |
由于该项目为我个人纯手工维护,消耗了我个人大量的时间和精力。如果您想要支持此项目,请考虑[🎉通过爱发电捐赠🎉](https://afdian.com/a/stevezmtstudios)或[**在bilibili关注我们**](https://space.bilibili.com/474130186) 53 | 54 | 如果[此页面](./ver_data/VersionList_3.x)上的内容并不是现有的最新版本,请通过点击上面的检查更新按钮与我联系🥳感谢! 55 | 56 | 出于版权问题,未来共存版`clone`可能不会再更新。此处将仅提供官方(来自Play Store或TapTap)的发行包。 57 | 58 | 如果您想帮助此项目,或者您已有新版云盘版本,请将分享链接传送到issue分区,非常感谢您的帮助! 59 | 60 |
61 | 部分版本可能会受实名验证的限制无法进入,您也许可以尝试启用飞行模式。 62 |
63 | 64 | ## 我要如何下载它们? 65 | 66 | [**↗️前往存储索引**](https://stevezmt.top/Phigros-history/ver_data/VersionList_3.x) 67 |
[↗️早期版本](https://stevezmt.top/Phigros-history/ver_data/VersionList_2.x) 68 |
69 | 70 | ## 说明 71 | 所有带有`clone`字符的均为已修改包名版本,可以与您现有的Phigros共存。
72 | 包含`crack`的为直接提取自已安装的旧设备 。
73 | 也就是说,`crack`后缀的是和TapTap上发布的应用一致,可以从TapTap更新,但是在一般设备上安装前必须先卸载旧版本。
74 | `clone`后缀的是共存版本,可以与crack版本或TapTap的最新版本共存,但是存档不能同步共享(除非您使用的两者均支持TapTap云存档)。 75 |
`apk+obb`是来自404商店的版本,同样是官方发布。至于如何安装`apk+obb`的安装包,请参见[安装指南](https://stevezmt.top/Phigros-history/doc/install-apk-obb) 76 |
若您发现您下载的文件名称像`*.7z.001`这样的文件,您需要使用7-Zip或WinRAR等支持7z格式的解压缩软件来解压缩。请参阅[如何解压缩](https://stevezmt.top/Phigros-history/doc/unzip-parsed-file) 77 | 78 | ## 找不到所有版本?
79 | [**轻点此处**](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose)**发起issue来提醒我更新相关的Phigros组件。**(***推荐***) 80 | 81 | ## 需要帮助? 82 | [**轻点此处**](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose)**发起issue**或电子邮件[admin@stevezmt.top](mailto:admin@stevezmt.top) 83 |
84 | 85 | --- 86 | 87 | > 相关资料和可发行文件版权归属于©南京鸽游网络有限公司。[公司主页](https://pigeon-games.com/?utm_source=Phigros-history&utm_medium=OfficialWebsite&utm_campaign=Android) [隐私政策](https://pigeon-games.com/news/2) 88 | 89 | -------------------------------------------------------------------------------- /README_old.md: -------------------------------------------------------------------------------- 1 | 2 | ![新九鸟](icon.png "新图标") 3 | # Phigros 历史版本收集 4 | 6 | **简体中文** | [English(US)](https://stevezmt.top/Phigros-history/README_en-us) | [Tiếng Việt](https://stevezmt.top/Phigros-history/README_VN) 7 | 8 | > 新页面已可供使用![点击这里前往新页面](https://stevezmt.top/Phigros-history/) 9 | 10 | 《Phigros》是由Pigeon Games(鸽游)开发的节奏类游戏。 11 | Pigeon Games是由初创通过bilibili视频网站发起的、由众多节奏类游戏爱好者组成的完全用爱发电的项目组。我们希望Phigros新颖的游戏模式和精心制作的插画与关卡可以让你感受到节奏类游戏的魅力。 12 | 13 | [![View in TapTap](https://img.shields.io/badge/TapTap-%E6%9F%A5%E7%9C%8B-cyan?logo=data:image/svg+xml;charset=utf-8;base64,PHN2ZyB0PSIxNzM5NTkxMDIwNDYyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQ5OTQiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTczNS42MTYgNDc3LjU2OGM1LjYzMi03LjgwOCAxNC43Mi0xMi4wMzIgMjMuNjE2LTE0LjU5MiAyNS42LTcuMTY4IDUyLjQ4IDExLjMyOCA2MS4xODQgMzUuOTY4IDguMjU2IDIzLjQ4OCA4Ljk2IDUwLjgxNi0xLjUzNiA3My42LTExLjA3MiAyMy4wNC0zNi44NjQgNDEuMDI0LTYyLjQ2NCAzNC44OC0xMS4xMzYtMS45Mi0yNC4xOTItOS4xNTItMjQuMjU2LTIyLjMzNi0wLjEyOC0xNy4yOC0wLjEyOC0zNC40OTYtMC4xMjgtNTEuNzc2di0zOC4xNDRjMC02LjAxNiAwLTEyLjU0NCAzLjU4NC0xNy42ek00OTIuMTYgNDU2LjMyYTYyLjI3MiA2Mi4yNzIgMCAwIDAtNDYuODQ4IDMwLjRjLTE0LjA4IDI0LTE2IDU0LjE0NC04LjgzMiA4MC44MzIgNC42NzIgMTYuNDQ4IDEzLjYzMiAzMy4xNTIgMjkuMTg0IDQxLjAyNCAxMi4zNTIgNi40NjQgMjYuNzUyIDMuNjQ4IDM5LjM2LTAuNjQgMTMuNzYtNC42NzIgMjUuNzI4LTE4LjM2OCAyNC4xOTItMzMuOTg0di01NC4zMzYtNTAuNTZjMC4zODQtNS4xMi0yLjU2LTEwLjU2LTcuNjE2LTExLjY0OGE3Ny44ODggNzcuODg4IDAgMCAwLTI5LjQ0LTEuMDg4eiIgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iNDk5NSI+PC9wYXRoPjxwYXRoIGQ9Ik02NCAxOTJhMTI4IDEyOCAwIDAgMSAxMjgtMTI4aDY0MGExMjggMTI4IDAgMCAxIDEyOCAxMjh2NjQwYTEyOCAxMjggMCAwIDEtMTI4IDEyOEgxOTJhMTI4IDEyOCAwIDAgMS0xMjgtMTI4VjE5MnogbTg4LjE5MiAxMzEuMmMtMS43MjgtMi42MjQtNS43Ni0zLjUyLTgtMS4xNTItMTQuMzM2IDE2LjI1Ni0yMS42OTYgNDMuNTItOC4xMjggNjIuNTkyIDYuNCA5LjkyIDE4LjExMiAxNC4wOCAyOS4xMiAxNC44NDggMTMuNTA0IDAuODk2IDI3LjA3MiAwLjgzMiA0MC41NzYgMC43MDQgOS42IDAgMTkuMi0wLjA2NCAyOC43MzYgMC4xOTIgNS42OTYgMC42NCA5LjQ3MiA2LjUyOCA4Ljk2IDEyLjE2bC0wLjA2NCA4Mi41NnYxNjUuMTJjLTAuNjQgNi40NjQgNS4yNDggMTIuMTYgMTEuNTIgMTEuMzkyaDE5Ljk2OGMxMi44IDAuMDY0IDI1LjYgMC4xMjggMzguNC0wLjA2NCA1Ljc2IDAgMTAuMjQtNS43NiA5Ljc5Mi0xMS40NTZWNDEyLjYwOGMtMC43MDQtNi4wOCAzLjg0LTEyLjM1MiA5Ljk4NC0xMi4yODggMTIuOC0wLjEyOCAyNS42LTAuMTI4IDM4LjQtMC4xMjhoMzEuMTA0YzUuNDQgMC41MTIgMTEuMDA4LTQuMDMyIDExLjA3Mi05Ljc5MmEyMTM1LjA0IDIxMzUuMDQgMCAwIDAgMC00My4zMjggMTAuMzY4IDEwLjM2OCAwIDAgMC0xMS4wNzItOS44NTZIMTY3LjY4Yy00LjQ4LTAuMTI4LTkuNTM2LTAuMTkyLTEyLjkyOC0zLjU4NC0xLjY2NC0xLjkyLTEuOTItNC4zNTItMi4wNDgtNi43ODRhMjIuOTEyIDIyLjkxMiAwIDAgMC0wLjUxMi0zLjcxMnogbTU0OS45NTIgNjIuODQ4YTU5LjUyIDU5LjUyIDAgMCAwLTQ2Ljk3Ni03Ljc0NCA4Mi44MTYgODIuODE2IDAgMCAwLTI5LjU2OCAxNC41MjhjLTMuMjY0IDMuNTItMC40NDggOS4yMTYgNC4wMzIgOS4yOCA4LjMyIDEuNDcyIDE0Ljc4NCA4LjMyIDE3LjQwOCAxNi4zMiA0Ljg2NCAxNC4yNzIgNS4xMiAyOS41MDQgNS4zMTIgNDQuNDE2djI5My4xMmMtMC40NDggNi4yMDggNS4wNTYgMTEuODQgMTEuMDcyIDExLjMyOGgxMi45MjhsNDUuNjMyLTAuMDY0YzUuNzYgMC4xMjggMTAuNjI0LTUuNjMyIDEwLjA0OC0xMS40NTZ2LTQ0Ljk5Mi01Mi40OGMtMC41NzYtMy42NDggMi40MzItNy40ODggNi4yMDgtNi41OTJhMzEuODA4IDMxLjgwOCAwIDAgMSA2LjQgNC42MDhjMS40NzIgMS4yOCAzLjAwOCAyLjU2IDQuNzM2IDMuNjQ4IDE2Ljg5NiAxMS43NzYgMzguNjU2IDE0LjA4IDU4LjI0IDkuNmExMDQuNzY4IDEwNC43NjggMCAwIDAgNjcuODQtNDkuOTJjMTYuNTEyLTI4LjE2IDIwLjgtNjIuMDggMTkuMzkyLTk0LjMzNi0xLjI4LTMxLjE2OC05LjkyLTYzLjE2OC0zMC4wOC04Ny4xNjgtMTkuMzkyLTIzLjQyNC00OC44OTYtMzguODQ4LTc5LjEwNC0zOC4yNzJhNjYuODggNjYuODggMCAwIDAtNDguMzIgMjMuMzZjLTIuNTYgMy44NC04LjY0IDEuNzkyLTguOTYtMi42ODgtMi43NTItMTUuMTY4LTE0LjA4LTI2LjU2LTI2LjI0LTM0LjQ5NnogbS0xNjMuMDcyIDE3LjQ3MmMtNi43MiAwLjMyLTkuNDcyIDcuNTUyLTkuOTg0IDEzLjQ0YTEzNy45MiAxMzcuOTIgMCAwIDAtMjkuOTUyLTQuNDhjLTIxLjQ0LTEuMDI0LTQzLjM5Mi0wLjA2NC02My42MTYgNy45MzZhOTUuMzYgOTUuMzYgMCAwIDAtNDkuMDI0IDQzLjI2NGMtMTUuMzYgMjcuNTItMTkuNzEyIDYwLjE2LTE5LjIgOTEuNTIgMi4xMTIgMzIuNjQgMTIuNzM2IDY2LjI0IDM1LjUyIDg5Ljg1NiAyMC45MjggMjEuODg4IDUzLjMxMiAyOS43NiA4Mi4xMTIgMjMuMjk2IDE2LTMuNjQ4IDI4LjY3Mi0xNS41NTIgMzcuNzYtMjguOTkybDEuMTUyLTEuNmMxLjYtMi4zNjggMy4yNjQtNC45MjggNi40LTQuMjg4IDIuODE2IDAuMzg0IDMuNzc2IDIuOTQ0IDQuNjcyIDUuMzc2IDAuMzIgMC44MzIgMC42NCAxLjY2NCAxLjAyNCAyLjM2OCA1Ljg4OCAxNS4yOTYgMTguNDMyIDI4LjQxNiAzNC4zNjggMzIgMTkuMzI4IDQuNjA4IDM5LjA0LTIuNDMyIDU2LjEyOC0xMS40NTZhMjguOCAyOC44IDAgMCAxIDIuMTc2LTEuMjE2YzIuNTYtMS4zNDQgNS40NC0yLjgxNiA1LjYzMi02LjA4IDAuMTkyLTMuODQtMi44OC01LjI0OC01Ljk1Mi02LjUyOC0xLjQwOC0wLjY0LTIuODE2LTEuMjgtMy44NC0yLjA0OC0xMi4wMzItOC4xMjgtMTUuMTA0LTI0LjE5Mi0xNS42MTYtMzguMDE2di0xOTMuMjhjMC40NDgtNi4yMDgtNS4xMi0xMS43NzYtMTEuMDcyLTExLjJoLTE5LjUyYy0xMy4wNTYgMC0yNi4xMTIgMC0zOS4xNjggMC4xMjh6IiBmaWxsPSIjRkZGRkZGIiBwLWlkPSI0OTk2Ij48L3BhdGg+PC9zdmc+&logoColor=white 14 | )](https://www.taptap.cn/app/165287)  [![View in Play Store](https://img.shields.io/badge/Play_%E5%95%86%E5%BA%97-%E6%9F%A5%E7%9C%8B-lightgreen?logo=googleplay&logoColor=white 15 | )](https://play.google.com/store/apps/details?id=com.PigeonGames.Phigros)  [![View in App Store](https://img.shields.io/badge/App_Store-%E6%9F%A5%E7%9C%8B-blue?logo=appstore&logoColor=white 16 | )](https://apps.apple.com/cn/app/phigros/id1454809109) 17 | 18 | > 此项目希望能够得到您的帮助! 19 | > 20 | > 由于所有的上游存储开始收取更加高昂的费用,项目存储的费用和花销超出了我们所能承受的范围。 21 | > 22 | > 如果您想支持我们继续提供免费的服务,请考虑捐赠。感谢您的支持! 23 | > 24 | > [ 通过爱发电捐赠](https://afdian.com/a/stevezmtstudios) [了解详细信息](doc/why-donate.md)
25 | 26 | 27 | 28 | #### 2025-11-11 更新 [**🔄检查更新**](https://github.com/SteveZMTstudios/Phigros-history/issues) [🆙提醒更新](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose) 29 | 30 | ## [**👉🔗查找所有版本👈**](https://stevezmt.top/Phigros-history/ver_data/VersionList_3.x) 31 | 32 | 33 | ## 在找其他版本? 34 | 35 | Phigros 特别版本合集:[**前往此处**](https://stevezmt.top/Phigros-history/doc/special) 36 | 37 | Phigros iOS 版本:[**前往此处**](https://github.com/YimingOvO/Phigros-History-iOS) (Maintained by [@YimingOvO](https://github.com/YimingOvO))
38 | 39 | ### 公告 40 | **2025-11-11 更新**:我们即将重新设计现有的页面结构,以便更好地支持未来的版本发布和存储需求,并带来更好的访问体验。
41 | 42 | 这不是Phigros的官方程序源代码,此处仅提供一些关于来自厦门鸽游(Pigeon Games)的一些历史版本的安卓端的apk包下载,请勿用做其他任何涉及商业用途。
所有素材收集自网络,如果他们侵犯了您的权益,请在该板块发布issue,我会在看到后立即删除它们。 43 | 44 | 123云盘近日开始限制每个用户的最大下载流量为1GB,超出将需要支付费用。目前对此的缓解方案是(1)使用来自huang1111.cn的网盘;(2)下载123云盘的[客户端](https://www.123pan.com/Downloadclient);(3)从Github上下载。 45 | 46 | 我们将加快调整结构,尽快移除123云盘的链接(尽管这短期内可能根本无法实现),并提供更多的下载选项。 47 | 48 | 特别感谢[**Huy Hoang Cao @WiBuMan**](https://www.facebook.com/huyhoangcao39393939/) 49 | 提供的数百个来自TapTap的安装包,没有他的帮助,该项目不可能发展地如此庞大。 50 | 51 | 我们同步并跟进了数十个版本记录,但是仍有少数版本散佚。虽然找回它们较为困难,但我们会尽力尝试。 52 |
由于该项目为我个人纯手工维护,消耗了我个人大量的时间和精力。如果您想要支持此项目,请考虑[🎉通过爱发电捐赠🎉](https://afdian.com/a/stevezmtstudios)或[**在bilibili关注我们**](https://space.bilibili.com/474130186) 53 | 54 | 如果[此页面](./ver_data/VersionList_3.x)上的内容并不是现有的最新版本,请通过点击上面的检查更新按钮与我联系🥳感谢! 55 | 56 | 出于版权问题,未来共存版`clone`可能不会再更新。此处将仅提供官方(来自Play Store或TapTap)的发行包。 57 | 58 | 如果您想帮助此项目,或者您已有新版云盘版本,请将分享链接传送到issue分区,非常感谢您的帮助! 59 | 60 |
61 | 部分版本可能会受实名验证的限制无法进入,您也许可以尝试启用飞行模式。 62 |
63 | 64 | ## 我要如何下载它们? 65 | 66 | [**↗️前往存储索引**](https://stevezmt.top/Phigros-history/ver_data/VersionList_3.x) 67 |
[↗️早期版本](https://stevezmt.top/Phigros-history/ver_data/VersionList_2.x) 68 |
69 | 70 | ## 说明 71 | 所有带有`clone`字符的均为已修改包名版本,可以与您现有的Phigros共存。
72 | 包含`crack`的为直接提取自已安装的旧设备 。
73 | 也就是说,`crack`后缀的是和TapTap上发布的应用一致,可以从TapTap更新,但是在一般设备上安装前必须先卸载旧版本。
74 | `clone`后缀的是共存版本,可以与crack版本或TapTap的最新版本共存,但是存档不能同步共享(除非您使用的两者均支持TapTap云存档)。 75 |
`apk+obb`是来自404商店的版本,同样是官方发布。至于如何安装`apk+obb`的安装包,请参见[安装指南](https://stevezmt.top/Phigros-history/doc/install-apk-obb) 76 |
若您发现您下载的文件名称像`*.7z.001`这样的文件,您需要使用7-Zip或WinRAR等支持7z格式的解压缩软件来解压缩。请参阅[如何解压缩](https://stevezmt.top/Phigros-history/doc/unzip-parsed-file) 77 | 78 | ## 找不到所有版本?
79 | [**轻点此处**](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose)**发起issue来提醒我更新相关的Phigros组件。**(***推荐***) 80 | 81 | ## 需要帮助? 82 | [**轻点此处**](https://github.com/SteveZMTstudios/Phigros-history/issues/new/choose)**发起issue**或电子邮件[admin@stevezmt.top](mailto:admin@stevezmt.top) 83 |
84 | 85 | --- 86 | 87 | > 相关资料和可发行文件版权归属于©南京鸽游网络有限公司。[公司主页](https://pigeon-games.com/?utm_source=Phigros-history&utm_medium=OfficialWebsite&utm_campaign=Android) [隐私政策](https://pigeon-games.com/news/2) 88 | 89 | -------------------------------------------------------------------------------- /api/v1/versions/2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "v1", 3 | "details": [ 4 | { 5 | "versionName": "v2.5.1", 6 | "versionCode": 77, 7 | "releaseDate": "2023/03/29", 8 | "tag": ["april-fools"], 9 | "changelog": [ 10 | "1. 新增一首与 Paradigm: Reboot 联动的单曲:「零號車輛」 by seatrus", 11 | "2. 新增一首单曲:「Random」 by Sobrem × Silentroom" 12 | ], 13 | "downloads": { 14 | "taptap": { 15 | "huang1111": "https://pan.huang1111.cn/s/wePeBTK", 16 | "123": "https://www.123pan.com/s/OS4KVv-uZbrv.html", 17 | "github": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v2.5.1/Phigros_2.5.1.apk" 18 | } 19 | } 20 | }, 21 | { 22 | "versionName": "v2.5.0.1", 23 | "versionCode": 74, 24 | "releaseDate": "2023/02/25", 25 | "changelog": [ 26 | "修复了部分情况下隐藏歌曲无法解锁的问题" 27 | ], 28 | "downloads": { 29 | "taptap": { 30 | "huang1111": "https://pan.huang1111.cn/s/laoaksL" 31 | } 32 | } 33 | }, 34 | { 35 | "versionName": "v2.5.0", 36 | "versionCode": 73, 37 | "releaseDate": "2023/02/21", 38 | "changelog": [ 39 | "1.更新了三首新曲", 40 | "「インフェルノシティ」 by Ponchi♪ feat. はぁち", 41 | "「Upshift」 by Iriss-Frantzz", 42 | "「Poison AND÷OR Affection」 by LeaF", 43 | "2.修改了部分歌曲的谱面、难度和曲绘" 44 | ], 45 | "downloads": { 46 | "taptap": { 47 | "huang1111": "https://pan.huang1111.cn/s/Nk9k8s1" 48 | } 49 | } 50 | }, 51 | { 52 | "versionName": "v2.4.7", 53 | "versionCode": 72, 54 | "releaseDate": "2023/01/15", 55 | "changelog": [ 56 | "1. 新增「茶鸣拾贰律精选集」,内含歌曲「青芽」、「盏茗」和两首新曲「瓷岁」、「Feast远东之宴」", 57 | "2. 新增茶鸣拾贰律联动头像" 58 | ], 59 | "downloads": { 60 | "playstore": { 61 | "huang1111": "https://pan.huang1111.cn/s/3egm7fm" 62 | } 63 | } 64 | }, 65 | { 66 | "versionName": "v2.4.6", 67 | "versionCode": 71, 68 | "releaseDate": "2023/01/03", 69 | "changelog": [ 70 | "更新了一首新曲", 71 | "「青丘」 by BLACK 0" 72 | ], 73 | "downloads": { 74 | "playstore": { 75 | "huang1111": "https://pan.huang1111.cn/s/eNzOycg" 76 | } 77 | } 78 | }, 79 | { 80 | "versionName": "v2.4.5", 81 | "versionCode": 70, 82 | "releaseDate": "2022/12/21", 83 | "changelog": [ 84 | "更新了两首新曲", 85 | "「Believe Light (feat. 果丸哒呦)」 by Scaler & Mestie & 果丸哒呦", 86 | "「Pont des souvenirs」 by VeetaCrush vs. [itsu(feat.itsu)]" 87 | ], 88 | "downloads": { 89 | "playstore": { 90 | "huang1111": "https://pan.huang1111.cn/s/vV1O9TE" 91 | } 92 | } 93 | }, 94 | { 95 | "versionName": "v2.4.4", 96 | "versionCode": 69, 97 | "releaseDate": "2022/11/20", 98 | "changelog": [ 99 | "更新了两首新曲", 100 | "「El Condor Pasa (Phigros Edit)」by Plastic Fruits", 101 | "「Break Over」by K-forest" 102 | ], 103 | "downloads": { 104 | "taptap": { 105 | "huang1111": "https://pan.huang1111.cn/s/G8q8oiW" 106 | } 107 | } 108 | }, 109 | { 110 | "versionName": "v2.4.3", 111 | "versionCode": 68, 112 | "releaseDate": "2022/10/26", 113 | "changelog": [ 114 | "更新了两首新曲", 115 | "「Eternal Snow」 by Abyss Idols", 116 | "「Rainy Season」 by Abyss Idols" 117 | ] 118 | }, 119 | { 120 | "versionName": "v2.4.2", 121 | "versionCode": 66, 122 | "releaseDate": "2022/10/07", 123 | "changelog": [ 124 | "更新了两首新曲", 125 | "「盏茗」 by 茶鸣拾贰律", 126 | "「青芽」 by 茶鸣拾贰律" 127 | ] 128 | }, 129 | { 130 | "versionName": "v2.4.1", 131 | "versionCode": 65, 132 | "releaseDate": "2022/09/16", 133 | "changelog": [ 134 | "1.两首单曲", 135 | "「c.s.q.n.」 by Aoi", 136 | "「Brave Notes」 by Turquoise(DRIVE.+Nota)", 137 | "2.移除了legacy谱面", 138 | "3.修改了部分谱面" 139 | ] 140 | }, 141 | { 142 | "versionName": "v2.4.0", 143 | "versionCode": 64, 144 | "releaseDate": "2022/08/26", 145 | "changelog": [ 146 | "1.姜米條精选集回归,内含现有歌曲「Shadow」与两首新曲:", 147 | "「心之所向」 by 姜米條", 148 | "「inferior」by 姜米條", 149 | "除此之外歌曲「Shadow」将追加AT难度", 150 | "2.一首单曲:", 151 | "「DataErr0r」by Cosmograph", 152 | "3.新增云存档系统,使用TapTap账号登录即可在云端保存自己的游戏进度", 153 | "4.新增谱面镜像功能", 154 | "5.新增了一些Tips,部分UI更改" 155 | ], 156 | "downloads": { 157 | "taptap": { 158 | "huang1111": "https://pan.huang1111.cn/s/4R2R3sg" 159 | } 160 | } 161 | }, 162 | { 163 | "versionName": "v2.3.3", 164 | "versionCode": 63, 165 | "releaseDate": "2022/08/05", 166 | "changelog": [ 167 | "新增一首单曲:「On And On!!」 by ETIA. feat. Jenga" 168 | ], 169 | "downloads": { 170 | "taptap": { 171 | "huang1111": "https://pan.huang1111.cn/s/bywyaIY" 172 | } 173 | } 174 | }, 175 | { 176 | "versionName": "v2.3.2", 177 | "versionCode": 62, 178 | "releaseDate": "2022/07/16", 179 | "changelog": [ 180 | "新增一首单曲:「月下缭乱」 by 月見静華 vs. LUNARiUM" 181 | ], 182 | "downloads": { 183 | "taptap": { 184 | "huang1111": "https://pan.huang1111.cn/s/A636vCB" 185 | } 186 | } 187 | }, 188 | { 189 | "versionName": "v2.3.1", 190 | "versionCode": 61, 191 | "releaseDate": "2022/06/28", 192 | "changelog": [ 193 | "1. 新增一首单曲:「いざ、参ります」 by U-ske feat. 棗いつき", 194 | "2. 部分 UI 与功能优化" 195 | ], 196 | "downloads": { 197 | "taptap": { 198 | "huang1111": "https://pan.huang1111.cn/s/mxqxBh1" 199 | } 200 | } 201 | }, 202 | { 203 | "versionName": "v2.3.0", 204 | "versionCode": 60, 205 | "releaseDate": "2022/06/06", 206 | "changelog": [ 207 | "1.更新了Lanota联动精选集,内含五首歌曲", 208 | "「Protoflicker」by Silentroom", 209 | "「Apocalypse」by アリスシャッハと魔法の楽団", 210 | "「Stasis」by Maozon", 211 | "「Horizon Blue」by Nothing But Requiem feat. Aikapin & Chiyoko", 212 | "「You are the Miserable」by t+pazolite" 213 | ], 214 | "downloads": { 215 | "taptap": { 216 | "huang1111": "https://pan.huang1111.cn/s/Nk9kGi1" 217 | } 218 | } 219 | }, 220 | { 221 | "versionName": "v2.2.1", 222 | "versionCode": 59, 223 | "releaseDate": "2022/05/16", 224 | "changelog": [ 225 | "1、新增两首单曲", 226 | "·「opia」by rN", 227 | "·「I Must Say No」by TangJuan", 228 | "2、更改了歌曲「NYA!!!」的插画" 229 | ], 230 | "downloads": { 231 | "taptap": { 232 | "huang1111": "https://pan.huang1111.cn/s/8QyQ8cQ" 233 | } 234 | } 235 | }, 236 | { 237 | "versionName": "v2.2.0", 238 | "versionCode": 58, 239 | "releaseDate": "2022/04/25", 240 | "changelog": [ 241 | "1.支线章节二新增五首歌曲:", 242 | "「Demonkin」by Forged Reigns", 243 | "「Re_Nascence (Psystyle Ver.)」by Rinth_live", 244 | "「Ark」by kanoryo", 245 | "「After Dawn」by S9ryne", 246 | "「INFiNiTE ENERZY -Overdoze-」by Reku Mochizuki", 247 | "2.略微修改了歌曲「Luminescent」的IN谱面" 248 | ], 249 | "downloads": { 250 | "taptap": { 251 | "huang1111": "https://pan.huang1111.cn/s/G8q8xFW" 252 | } 253 | } 254 | }, 255 | { 256 | "versionName": "v2.1.4", 257 | "versionCode": 57, 258 | "releaseDate": "2022/03/28", 259 | "tag": ["april-fools"], 260 | "changelog": [ 261 | "1.一首新曲:FULi AUTO BUSTER", 262 | "(真的没有新内容(真的(心虚" 263 | ], 264 | "downloads": { 265 | "taptap": { 266 | "huang1111": "https://pan.huang1111.cn/s/LxXxzt6" 267 | }, 268 | "playstore":{ 269 | "huang1111": "https://pan.huang1111.cn/s/nlX9Im" 270 | } 271 | } 272 | }, 273 | { 274 | "versionName": "v2.1.3", 275 | "versionCode": 56, 276 | "releaseDate": "2022/03/15", 277 | "changelog": [ 278 | "1.一首单曲 Luminescemt", 279 | "2.支线章节二前瞻曲目 Demiurge" 280 | ], 281 | "downloads": { 282 | "taptap": { 283 | "huang1111": "https://pan.huang1111.cn/s/K9k9ZIY" 284 | } 285 | } 286 | }, 287 | { 288 | "versionName": "v2.1.3", 289 | "versionCode": 56, 290 | "releaseDate": "2022/03/13", 291 | "changelog": [ 292 | "1.一首单曲 Luminescemt", 293 | "2.支线章节二前瞻曲目 Demiurge", 294 | "~为啥会有2个一样的版本~" 295 | ], 296 | "downloads": { 297 | "taptap": { 298 | "huang1111": "https://pan.huang1111.cn/s/nqVqECm" 299 | } 300 | } 301 | }, 302 | { 303 | "versionName": "v2.1.2", 304 | "versionCode": 55, 305 | "releaseDate": "2022/02/21", 306 | "changelog": [ 307 | "1.一首新歌 Future Mind", 308 | "2.修复了部分谱面的一些错误", 309 | "3.修复了部分歌曲难度数值错误的问题" 310 | ], 311 | "downloads": { 312 | "taptap": { 313 | "huang1111": "https://pan.huang1111.cn/s/6eKaesN" 314 | } 315 | } 316 | }, 317 | { 318 | "versionName": "v2.1.1", 319 | "versionCode": 54, 320 | "releaseDate": "2022/01/21", 321 | "changelog": [ 322 | "1、三首全新单曲:", 323 | "Dreamland", 324 | "Another Round", 325 | "996" 326 | ], 327 | "downloads": { 328 | "taptap": { 329 | "huang1111": "https://pan.huang1111.cn/s/Xqd11hl" 330 | } 331 | } 332 | }, 333 | { 334 | "versionName": "v2.1.0", 335 | "versionCode": 53, 336 | "releaseDate": "2021/12/24", 337 | "changelog": [ 338 | "1、新增 KALPA 精选集,共五首曲目", 339 | "Time to Night Sky (feat. Lee Yu Jin)", 340 | "HAZARD", 341 | "Another Me", 342 | "Don't Never Around", 343 | "RESSiSTANCE", 344 | "2、两首全新单曲:", 345 | "Concvssion", 346 | "ジングルベル(Jingle Bell)" 347 | ], 348 | "downloads": { 349 | "taptap": { 350 | "huang1111": "https://pan.huang1111.cn/s/aEVlNSG" 351 | } 352 | } 353 | }, 354 | { 355 | "versionName": "v2.0.1", 356 | "versionCode": 52, 357 | "releaseDate": "2021/11/12", 358 | "changelog": [ 359 | "1、一首全新单曲:", 360 | "ρars/ey", 361 | "2、添加低分辨率模式。在性能较差的设备上,低分辨率模式可以获得较高帧率。" 362 | ], 363 | "downloads": { 364 | "taptap": { 365 | "huang1111": "https://pan.huang1111.cn/s/VLkqkud" 366 | } 367 | } 368 | }, 369 | { 370 | "versionName": "v2.0.0", 371 | "versionCode": 51, 372 | "releaseDate": "2021/10/22", 373 | "changelog": [ 374 | "1、新增主线章节七《时钟链接》。包含5首歌曲:", 375 | "「Clock Paradox」by WyvernP", 376 | "「Chronomia」by Lime", 377 | "「Nick of Time」by P4koo", 378 | "「Chronologika」by Hundotte", 379 | "「Chronos Collapse - La Campanella」by SunsetRay", 380 | "2、3首全新单曲:", 381 | "「Nhelv」by Silentroom", 382 | "「-Arkhei-」by Sera Amagi", 383 | "「Kerberos」by Zris", 384 | "3、新增 dB doll AT难度。", 385 | "4、全新的2.0UI。", 386 | "焕然一新的界面,随之而来的是易用性的大大提升。请进入游戏慢慢体验!", 387 | "5、新增课题系统。", 388 | "在更严格的判定下享受更纯粹的实力挑战!", 389 | "6、收集品更新:", 390 | "新增《支线章节一》。在一系列的碎片中,拼凑出忘忧宫的精彩篇章。", 391 | "7、重置了大量老旧谱面:", 392 | "混乱Confusion", 393 | "Dash", 394 | "云女孩", 395 | "Pixel Rebelz", 396 | "ENERGY SYNERGY MATRIX", 397 | "華灯爱", 398 | "Ripper", 399 | "Khronostasis Katharsis", 400 | "狂喜籣舞", 401 | "Winter ↑cube↓", 402 | "Drop it", 403 | "Another me", 404 | "开心病", 405 | "Miracle Forest (VIP Mix)", 406 | "Break Through The Barrier", 407 | "Glaciaxion", 408 | "8、替换了部分曲绘:", 409 | "Aphasia", 410 | "万吨匿名信", 411 | "Speed Up!", 412 | "Cipher", 413 | "Cereris", 414 | "9、对大量谱面进行微调。", 415 | "10、商店系统、头像系统改版。", 416 | "11、全新的新手教程。", 417 | "12、现在Hold类型的按键也会显示多押辅助的提示。", 418 | "13、游玩界面新增了锁定屏幕方向的功能。", 419 | "14、一系列BUG的修复。", 420 | "> 版权归属于©南京鸽游网络有限公司。" 421 | ], 422 | "downloads": { 423 | "taptap": { 424 | "huang1111": "https://pan.huang1111.cn/s/Zqez5FL", 425 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v2.0.0/phigros_V2.0.0_clone.apk" 426 | } 427 | } 428 | } 429 | ] 430 | } -------------------------------------------------------------------------------- /editor/version-editor.js: -------------------------------------------------------------------------------- 1 | // 简单的版本列表编辑器(无依赖,纯前端) 2 | (function(){ 3 | // State 4 | let data = {version:'v?',details:[]}; 5 | let selectedIndex = -1; 6 | // File handle for File System Access API (when available) 7 | let fileHandle = null; 8 | // Dirty tracking: 当用户未保存修改时为 true 9 | let isDirty = false; 10 | 11 | // Elements 12 | const fileInput = document.getElementById('fileInput'); 13 | const btnLoadFile = document.getElementById('btnLoadFile'); 14 | const btnFetchSample = document.getElementById('btnFetchSample'); 15 | const btnPaste = document.getElementById('btnPaste'); 16 | const btnPasteBatch = document.getElementById('btnPasteBatch'); 17 | const btnNew = document.getElementById('btnNew'); 18 | const btnExport = document.getElementById('btnExport'); 19 | const btnPrettyExport = document.getElementById('btnPrettyExport'); 20 | const search = document.getElementById('search'); 21 | 22 | const versionList = document.getElementById('versionList'); 23 | const btnAddVersion = document.getElementById('btnAddVersion'); 24 | 25 | const emptyNote = document.getElementById('emptyNote'); 26 | const editorPanel = document.getElementById('editorPanel'); 27 | 28 | const versionName = document.getElementById('versionName'); 29 | const versionCode = document.getElementById('versionCode'); 30 | const releaseDate = document.getElementById('releaseDate'); 31 | const tags = document.getElementById('tags'); 32 | const changelog = document.getElementById('changelog'); 33 | const channelsDiv = document.getElementById('channels'); 34 | const newChannel = document.getElementById('newChannel'); 35 | const btnAddChannel = document.getElementById('btnAddChannel'); 36 | const btnPasteLink = document.getElementById('btnPasteLink'); 37 | 38 | const btnSaveChanges = document.getElementById('btnSaveChanges'); 39 | const btnDeleteVersion = document.getElementById('btnDeleteVersion'); 40 | 41 | // Helpers 42 | function updateTitleIndicator(){ 43 | const span = document.getElementById('statusIndicator'); 44 | if(!span) return; 45 | span.textContent = isDirty ? '未保存 *' : ''; 46 | const base = '版本编辑器 — Phigros Version Editor'; 47 | document.title = (isDirty ? '* ' : '') + base; 48 | } 49 | function setDirty(v){ isDirty = !!v; updateTitleIndicator(); } 50 | 51 | function renderList(){ 52 | versionList.innerHTML = ''; 53 | const q = search.value.trim().toLowerCase(); 54 | data.details.forEach((d,i)=>{ 55 | const text = (d.versionName||'').toLowerCase() + ' ' + (d.changelog||[]).join(' ').toLowerCase(); 56 | if(q && text.indexOf(q) === -1) return; 57 | const li = document.createElement('li'); 58 | li.textContent = d.versionName || `#${i}`; 59 | li.classList.toggle('active', i === selectedIndex); 60 | li.onclick = ()=>{ selectIndex(i); }; 61 | versionList.appendChild(li); 62 | }); 63 | } 64 | 65 | function selectIndex(i){ 66 | selectedIndex = i; 67 | if(i < 0 || !data.details[i]){ 68 | editorPanel.classList.add('hidden'); emptyNote.style.display='block'; 69 | renderList(); 70 | return; 71 | } 72 | emptyNote.style.display='none'; editorPanel.classList.remove('hidden'); 73 | const d = data.details[i]; 74 | versionName.value = d.versionName || ''; 75 | versionCode.value = d.versionCode || ''; 76 | releaseDate.value = d.releaseDate ? d.releaseDate.replace(/\//g,'-') : ''; 77 | tags.value = (d.tag || []).join(','); 78 | changelog.value = (d.changelog || []).join('\n'); 79 | renderChannels(d); 80 | // attach listeners to mark dirty when fields change 81 | versionName.oninput = ()=> setDirty(true); 82 | versionCode.oninput = ()=> setDirty(true); 83 | releaseDate.onchange = ()=> setDirty(true); 84 | tags.oninput = ()=> setDirty(true); 85 | changelog.oninput = ()=> setDirty(true); 86 | renderList(); 87 | } 88 | 89 | function renderChannels(d){ 90 | channelsDiv.innerHTML = ''; 91 | d.downloads = d.downloads || {}; 92 | Object.keys(d.downloads).forEach(channelName=>{ 93 | const container = createChannelBlock(channelName, d.downloads[channelName]); 94 | channelsDiv.appendChild(container); 95 | }); 96 | } 97 | 98 | function createChannelBlock(name, obj){ 99 | const div = document.createElement('div'); div.className='channel'; 100 | const h4 = document.createElement('h4'); 101 | const title = document.createElement('span'); title.textContent = name; 102 | const actions = document.createElement('span'); 103 | const btnAddLink = document.createElement('button'); btnAddLink.textContent='添加条目'; 104 | const btnDeleteChan = document.createElement('button'); btnDeleteChan.textContent='删除渠道'; 105 | actions.appendChild(btnAddLink); actions.appendChild(btnDeleteChan); 106 | h4.appendChild(title); h4.appendChild(actions); 107 | div.appendChild(h4); 108 | 109 | const links = document.createElement('div'); links.className='links'; 110 | Object.keys(obj||{}).forEach(k=>{ 111 | links.appendChild(createLinkRow(name,k,obj[k])); 112 | }); 113 | div.appendChild(links); 114 | 115 | btnAddLink.onclick = async ()=>{ 116 | const key = prompt('键名(如 123, huang1111, github 等)'); 117 | if(!key) return; 118 | const pasted = await navigator.clipboard.readText().catch(()=>null); 119 | const url = pasted && pasted.startsWith('http') ? pasted : prompt('链接'); 120 | if(!url) return; 121 | obj[key]=url; 122 | links.appendChild(createLinkRow(name,key,url)); 123 | commitDownloadChange(name,obj); 124 | setDirty(true); 125 | }; 126 | btnDeleteChan.onclick = ()=>{ 127 | if(!confirm('确认删除渠道 “'+name+'”?')) return; 128 | const d = data.details[selectedIndex]; 129 | delete d.downloads[name]; 130 | renderChannels(d); 131 | setDirty(true); 132 | }; 133 | 134 | return div; 135 | } 136 | 137 | function createLinkRow(channel,key,value){ 138 | const row = document.createElement('div'); row.className='link-row'; 139 | const keyInput = document.createElement('input'); keyInput.value = key; keyInput.disabled = true; 140 | const urlInput = document.createElement('input'); urlInput.value = value || ''; 141 | const btnOpen = document.createElement('button'); btnOpen.textContent='打开'; 142 | const btnCheck = document.createElement('button'); btnCheck.textContent='小窗检查'; 143 | const btnDel = document.createElement('button'); btnDel.textContent='删除'; 144 | 145 | btnOpen.onclick = ()=>{ window.open(urlInput.value,'_blank'); }; 146 | btnCheck.onclick = ()=>{ openSmallWindow(urlInput.value); }; 147 | btnDel.onclick = ()=>{ 148 | if(!confirm('删除此下载条目?')) return; 149 | const d = data.details[selectedIndex]; 150 | if(d && d.downloads){ 151 | if(d.downloads[channel] && d.downloads[channel][key]) delete d.downloads[channel][key]; 152 | renderChannels(d); 153 | } 154 | }; 155 | 156 | urlInput.onchange = ()=>{ commitUrlChange(channel,key,urlInput.value); setDirty(true); }; 157 | 158 | row.appendChild(keyInput); row.appendChild(urlInput); 159 | row.appendChild(btnOpen); row.appendChild(btnCheck); row.appendChild(btnDel); 160 | return row; 161 | } 162 | 163 | function openSmallWindow(url){ 164 | if(!url) return alert('空链接'); 165 | const w = 900, h = 650; const left = (screen.width-w)/2; const top = (screen.height-h)/2; 166 | // open with minimal features so user can quickly check 167 | window.open(url,'_phigros_link','toolbar=no,menubar=no,scrollbars=yes,resizable=yes,width='+w+',height='+h+',top='+top+',left='+left); 168 | } 169 | 170 | function commitDownloadChange(channel,obj){ 171 | const d = data.details[selectedIndex]; d.downloads[channel]=obj; // ensure saved 172 | } 173 | 174 | function commitUrlChange(channel,key,url){ 175 | const d = data.details[selectedIndex]; if(!d.downloads) d.downloads = {}; 176 | if(!d.downloads[channel]) d.downloads[channel]={}; 177 | d.downloads[channel][key]=url; 178 | } 179 | 180 | // Actions 181 | btnAddVersion.onclick = ()=>{ 182 | const v = {versionName:'vNew',versionCode:0,releaseDate:'',changelog:[],downloads:{}} 183 | data.details.unshift(v); selectIndex(0); renderList(); 184 | setDirty(true); 185 | }; 186 | 187 | btnSaveChanges.onclick = ()=>{ 188 | if(selectedIndex<0) return; 189 | const d = data.details[selectedIndex]; 190 | d.versionName = versionName.value.trim(); 191 | d.versionCode = Number(versionCode.value)||0; 192 | d.releaseDate = releaseDate.value ? releaseDate.value : ''; // keep as-is 193 | d.tag = tags.value.split(',').map(s=>s.trim()).filter(Boolean); 194 | d.changelog = changelog.value.split('\n').map(s=>s.trim()).filter(Boolean); 195 | renderList(); 196 | setDirty(true); 197 | alert('保存成功(编辑器已保存到内存)。如需写入磁盘,请使用“保存到文件…”或“导出”。'); 198 | }; 199 | 200 | btnDeleteVersion.onclick = ()=>{ 201 | if(selectedIndex<0) return; 202 | if(!confirm('确认删除版本 '+(data.details[selectedIndex].versionName||'')+' ?')) return; 203 | data.details.splice(selectedIndex,1); 204 | selectedIndex = -1; selectIndex(-1); renderList(); 205 | setDirty(true); 206 | }; 207 | 208 | btnAddChannel.onclick = ()=>{ 209 | if(selectedIndex<0) return alert('请选择版本'); 210 | const name = newChannel.value.trim(); if(!name) return alert('请输入渠道名'); 211 | const d = data.details[selectedIndex]; d.downloads = d.downloads||{}; d.downloads[name] = d.downloads[name] || {}; 212 | renderChannels(d); newChannel.value=''; 213 | setDirty(true); 214 | }; 215 | 216 | btnPasteLink.onclick = async ()=>{ 217 | if(selectedIndex<0) return alert('请选择版本'); 218 | const txt = await navigator.clipboard.readText().catch(()=>null); 219 | if(!txt) return alert('剪贴板没有文本或读取失败'); 220 | const url = txt.trim(); if(!url.startsWith('http')) return alert('剪贴板内容不是有效的URL'); 221 | // prompt for channel and key 222 | const channel = prompt('渠道名 (如 taptap)') || 'taptap'; 223 | const key = prompt('键名 (如 huang1111)') || 'pasted'; 224 | const d = data.details[selectedIndex]; d.downloads = d.downloads || {}; 225 | d.downloads[channel] = d.downloads[channel]||{}; d.downloads[channel][key]=url; 226 | renderChannels(d); 227 | setDirty(true); 228 | alert('已添加'); 229 | }; 230 | 231 | // Import/export (支持 File System Access API 的文件流优先方案) 232 | btnLoadFile.onclick = async ()=>{ 233 | if(window.showOpenFilePicker){ 234 | try{ 235 | const [handle] = await window.showOpenFilePicker({types:[{description:'JSON',accept:{'application/json':['.json']}}], multiple:false}); 236 | fileHandle = handle; 237 | const file = await handle.getFile(); 238 | const txt = await file.text(); 239 | data = JSON.parse(txt); 240 | setDirty(false); 241 | selectedIndex=-1; selectIndex(-1); renderList(); 242 | alert('文件已载入: ' + (handle.name||'(unknown)')); 243 | return; 244 | }catch(e){ /* 用户取消或失败,回退到 input */ } 245 | } 246 | fileInput.click(); 247 | }; 248 | fileInput.onchange = e=>{ 249 | const f = e.target.files[0]; if(!f) return; 250 | const reader = new FileReader(); 251 | reader.onload = ()=>{ 252 | try{ data = JSON.parse(reader.result); selectedIndex=-1; selectIndex(-1); renderList(); setDirty(false); alert('载入成功'); } 253 | catch(err){ alert('JSON解析失败: '+err); } 254 | }; 255 | reader.readAsText(f); 256 | }; 257 | 258 | btnFetchSample.onclick = async ()=>{ 259 | // try fetch with possible relative path 260 | try{ 261 | const res = await fetch('/api/v1/versions/1.json'); 262 | if(!res.ok) throw new Error('网络返回 '+res.status); 263 | data = await res.json(); selectedIndex=-1; selectIndex(-1); renderList(); alert('从仓库示例载入成功'); 264 | }catch(e){ 265 | alert('无法通过网络加载示例(可能被CORS阻止)。你可以手动使用“从文件载入”或“粘贴JSON”。'); 266 | } 267 | }; 268 | 269 | btnPaste.onclick = async ()=>{ 270 | const txt = await navigator.clipboard.readText().catch(()=>null); 271 | if(!txt) return alert('剪贴板没有文本或读取失败'); 272 | try{ data = JSON.parse(txt); selectedIndex=-1; selectIndex(-1); renderList(); alert('粘贴并载入JSON成功'); } 273 | catch(e){ alert('JSON解析失败: '+e); } 274 | }; 275 | 276 | // 粘贴批量版本日志并解析(支持样例格式) 277 | btnPasteBatch.onclick = async ()=>{ 278 | const txt = await navigator.clipboard.readText().catch(()=>null); 279 | if(!txt) return alert('剪贴板没有文本或读取失败'); 280 | const parsed = parseBatchVersions(txt); 281 | if(!parsed || !parsed.length) return alert('未解析到任何版本'); 282 | // 检查与现有版本是否冲突 283 | const existingMap = {}; 284 | data.details.forEach(d=>{ if(d.versionName) existingMap[d.versionName]=d; }); 285 | let newCount=0, updatedCount=0, skippedCount=0; 286 | // ask user whether to overwrite existing entries 287 | const doOverwrite = confirm(`检测到 ${parsed.length} 条版本,若存在同名版本是否覆盖? 按“确定”覆盖,按“取消”跳过已有版本。`); 288 | parsed.forEach(item=>{ 289 | // normalize versionName to start with 'v' 290 | const vname = item.versionName && item.versionName.startsWith('v') ? item.versionName : ('v'+item.versionName); 291 | item.versionName = vname; 292 | const exists = data.details.findIndex(d=>d.versionName === vname); 293 | if(exists >= 0){ 294 | if(doOverwrite){ 295 | // merge: replace changelog and releaseDate/versionCode, keep downloads if any 296 | const target = data.details[exists]; 297 | target.versionCode = item.versionCode || target.versionCode; 298 | target.releaseDate = item.releaseDate || target.releaseDate; 299 | target.changelog = item.changelog || target.changelog; 300 | if(item.tag && item.tag.length) target.tag = item.tag; 301 | updatedCount++; 302 | }else{ 303 | skippedCount++; 304 | } 305 | }else{ 306 | // insert at front 307 | data.details.unshift(item); 308 | newCount++; 309 | } 310 | }); 311 | setDirty(true); 312 | renderList(); 313 | alert(`完成:新增 ${newCount},更新 ${updatedCount},跳过 ${skippedCount}`); 314 | }; 315 | 316 | // 解析批量版本文本,返回 [{versionName, versionCode, releaseDate, changelog:[]}, ...] 317 | function parseBatchVersions(text){ 318 | const lines = text.split(/\r?\n/); 319 | const results = []; 320 | let current = null; 321 | const verRe = /^\s*Version\s+([^\s]+)\s*\((\d+)\)\s*(\d{4}[\-/]\d{1,2}[\-/]\d{1,2})?\s*$/i; 322 | for(let raw of lines){ 323 | const line = raw.trim(); 324 | if(!line) continue; 325 | const m = line.match(verRe); 326 | if(m){ 327 | // start new 328 | if(current) results.push(current); 329 | current = {versionName: m[1].trim(), versionCode: Number(m[2])||0, releaseDate: m[3] ? m[3].replace(/-/g,'/'): '', changelog: []}; 330 | continue; 331 | } 332 | if(!current) continue; // ignore text before first Version 333 | // filter out numbering headers like "1." or bullets 334 | let clean = line.replace(/^\d+\.\s*/,'').replace(/^•\s*/,'').replace(/^\u2022\s*/,''); 335 | // remove leading special bullets like • or - 336 | clean = clean.replace(/^[\-\u2022\u2023\u25E6\*\s]+/,''); 337 | if(clean) current.changelog.push(clean); 338 | } 339 | if(current) results.push(current); 340 | return results; 341 | } 342 | 343 | btnExport.onclick = ()=>{ 344 | const blob = new Blob([JSON.stringify(data)],{type:'application/json'}); 345 | const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href=url; a.download='versions.json'; a.click(); URL.revokeObjectURL(url); 346 | // 视为 "已导出",如果希望把导出视作保存,则可以取消下一行注释 347 | // setDirty(false); 348 | }; 349 | 350 | btnPrettyExport.onclick = ()=>{ 351 | const blob = new Blob([JSON.stringify(data,null,2)],{type:'application/json'}); 352 | const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href=url; a.download='versions.prettified.json'; a.click(); URL.revokeObjectURL(url); 353 | // setDirty(false); 354 | }; 355 | 356 | // 保存到文件(使用 File System Access API,当不可用时回退到导出) 357 | const btnSaveToFile = document.getElementById('btnSaveToFile'); 358 | async function saveToFile(){ 359 | try{ 360 | if(window.showSaveFilePicker){ 361 | if(!fileHandle){ 362 | fileHandle = await window.showSaveFilePicker({suggestedName:'versions.json',types:[{description:'JSON',accept:{'application/json':['.json']}}]}); 363 | } 364 | const writable = await fileHandle.createWritable(); 365 | await writable.write(JSON.stringify(data,null,2)); 366 | await writable.close(); 367 | setDirty(false); 368 | alert('已保存到文件:' + (fileHandle.name || '(unknown)')); 369 | return; 370 | }else{ 371 | // 回退:使用导出作为保存方法 372 | btnPrettyExport.click(); 373 | setDirty(false); 374 | alert('您的浏览器不支持直接写文件,已使用导出作为回退。'); 375 | } 376 | }catch(e){ 377 | alert('保存失败: '+e); 378 | } 379 | } 380 | btnSaveToFile.onclick = saveToFile; 381 | 382 | // Search 383 | search.oninput = ()=> renderList(); 384 | 385 | // beforeunload:如果有未保存修改,提示用户 386 | window.addEventListener('beforeunload', (e)=>{ 387 | if(isDirty){ 388 | e.preventDefault(); 389 | e.returnValue = ''; 390 | return ''; 391 | } 392 | }); 393 | 394 | // Init 395 | function initSample(){ 396 | // if repo has a local copy copy? leave empty by default 397 | data = {version:'v1', details:[]}; 398 | // try to load the existing file (if served) silently 399 | fetch('/api/v1/versions/1.json').then(r=>r.json()).then(j=>{ if(j && j.details) { data=j; renderList(); }}).catch(()=>{}); 400 | renderList(); 401 | setDirty(false); 402 | } 403 | initSample(); 404 | 405 | })(); -------------------------------------------------------------------------------- /doc/why-donate.md: -------------------------------------------------------------------------------- 1 | 63 | 64 | ## 关于捐赠 About donation 65 | 66 | 本项目一开始只是出于方便我自己以及其他想要收集全头像和体验愚人节版本的玩家创建的小型项目,从一开始的寥寥几个在Github Release存储的几个版本到现在几乎收集了版本记录上的所有版本,这一路上我也收到了很多玩家的支持和鼓励,也有很多玩家提供了一些版本的下载链接,这些都让我感到很开心。 67 | 68 | 但是从头到尾,这个项目几乎都在依赖像Github Release、[huang1111](https://huang1111.cn)、[123云盘](https://123yunpan.com)等网盘的资源,这些资源并不都是免费的,并且也有很多限制,比如Github Release的存储空间有限且上传极其困难、在国内的下载速度不佳,123云盘的资源需要用户额外付费,这些都会对项目的持续性和稳定性造成一定的影响。 69 | 70 | 况且在2025年年初,huang1111网盘和123云盘几乎完全停止了免费存储分享,我们绝大部分的版本都存储在此处。为了维持项目运营,我们不得不选择了购买了huang1111的容量,为这个项目花费了一笔不小的费用,并且我也几乎没有足够的金钱来续订了。 71 | 72 | 所以,如果您觉得这个项目对您有所帮助,或者您觉得这个项目值得持续下去,您可以考虑通过捐赠来支持这个项目,您的每一份捐赠都会让这个项目变得更好。 73 | 74 | 任何一笔捐赠都会支持这个项目继续运作,并在此页面上被永久记录。 75 | 76 | ### 捐赠/支持方式 77 | 78 | [🎉通过爱发电捐赠🎉 推荐](https://afdian.com/a/stevezmtstudios)
79 | [在bilibili关注我们(免费)](https://space.bilibili.com/474130186) 80 | 81 |
82 | ▶ 更多方式 Other ways to donation 83 | 84 | Via Patreon
85 | 86 | Copy Binance ID
87 | 88 |
89 | ▶ Via Digital Wallet 90 | 91 | BTC (taproot):`bc1pttt2u35sweww86qlh6hnvx9zq46phkyr8p8f6jdh3syw65j5a3mq6zmjf9`
92 | 93 | ETH (Ethereum):`0x637ed7f6DD3BfEC9a0513650F14a34963E69a217`
94 | 95 | TON:`UQAK-SngM0rAfNuHRcBvkMyXFtqFarqWjHPbHc3bBci2vleo`
96 | 97 | 98 | 99 |
100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 |
109 | 110 | --- 111 | 112 | 113 | [上月爱发电赞助用户列表](https://afdian.com/a/stevezmtstudios/thank) 114 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 |
捐赠用户捐赠金额捐赠时间续命时长备注
¥365.002025-02-15 09:11:14+1年自掏腰包
爱发电用户_f4749¥5.002025-02-20 20:43:52+1个月-
南风¥80.002025-02-24 22:29:30+1年80够了应该(
爱发电用户_902b4¥5.002025-03-07 21:00:44+1个月Thank you for your work.
南风¥10.002025-04-06 22:07:04+2个月屁股肉站点一定要维护下去ᕦ(ò_óˇ)ᕤ
南风¥10.002025-06-01 19:02:18+2个月
爱发电用户_9fwm¥10.002025-06-11 05:02:38+2个月
爱发电用户_f4749¥5.002025-07-05 09:30:56+1个月
爱发电用户_f4749¥10.002025-07-08 17:44:38+2个月给你推荐一个网盘:https://pan.miaostars.com/quota 站点一定要维持下去啊!
南风¥10.002025-08-12 19:26::5+2个月
243 | -------------------------------------------------------------------------------- /scripts/md_to_versions_json.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """md_to_versions_json.py 3 | 4 | Convert a Markdown version list (like `ver_data/VersionList_1.x.md`) into a JSON 5 | file following the project's API spec (e.g., `api/v1/versions/1.json`). 6 | 7 | Features: 8 | - Remove/ignore HTML comments () entirely. 9 | - Extract version headings like `### 1.6.11 (50) 2021/07/25` -> versionName, versionCode, releaseDate. 10 | - Extract changelog lines (ignore badge-only lines and commented content). 11 | - Extract download links from markdown links (e.g., `[![TapTap]...](https://...)`), but DO NOT treat 12 | `img.shields.io` (or shields.io) image URLs as download endpoints. 13 | - Normalize channel names (heuristic): lowercased, remove non-alphanumeric characters. 14 | 15 | Usage: 16 | python scripts/md_to_versions_json.py --input ver_data/VersionList_1.x.md --output api/v1/versions/1.json 17 | 18 | """ 19 | 20 | from __future__ import annotations 21 | import re 22 | import json 23 | import argparse 24 | from collections import defaultdict 25 | from urllib.parse import urlparse 26 | 27 | 28 | # Helpers 29 | RE_HEADING = re.compile(r'^\s*#{1,6}\s*(?Pv?\d+(?:\.\d+)*)(?:\s*\((?P\d+)\))?(?:\s+(?P\d{4}/\d{2}/\d{2}))?\s*$') 30 | RE_NESTED_IMAGE_LINK = re.compile(r'\[!\[([^\]]*)\]\(([^)]+)\)\]\(([^)]+)\)') # groups: alt, img_src, url 31 | RE_MARKDOWN_LINK = re.compile(r'!\[([^\]]*)\]\(([^)]+)\)|\[([^\]]+)\]\(([^)]+)\)') 32 | RE_HTML_COMMENT = re.compile(r'', re.S) 33 | # remove entire
...
sections (ignore their content) 34 | RE_DETAILS = re.compile(r'.*?', re.S | re.I) 35 | # HTML anchor with nested image: 36 | RE_HTML_A_IMG = re.compile(r']+href=[\"\\\'](?P[^\"\'\)]+)[\"\'\)][^>]*>\s*]+src=[\"\'](?P[^\"\']+)[\"\'][^>]*>\s*', re.I) 37 | # Generic HTML anchor 38 | RE_HTML_A = re.compile(r']+href=[\"\\\'](?P[^\"\'\)]+)[\"\'\)][^>]*>(?P.*?)', re.I | re.S) 39 | # Generic img tag 40 | RE_IMG_TAG = re.compile(r']+src=[\"\\\'](?P[^\"\']+)[\"\'][^>]*>', re.I) 41 | 42 | SHIELDS_DOMAINS = ("img.shields.io", "shields.io") 43 | 44 | 45 | def remove_html_comments(text: str) -> str: 46 | """Remove HTML comments () from text.""" 47 | return RE_HTML_COMMENT.sub('', text) 48 | 49 | 50 | def normalize_channel_name(text: str) -> str: 51 | key = re.sub(r'[^0-9a-zA-Z]+', '_', text.strip()).strip('_').lower() 52 | return key or 'unknown' 53 | 54 | 55 | def guess_mirror_key_from_url(url: str) -> str: 56 | """Return a short key for a mirror based on URL or hostname.""" 57 | try: 58 | p = urlparse(url) 59 | host = p.netloc.lower() 60 | # common shortcuts 61 | if 'github.com' in host: 62 | return 'github' 63 | if '123pan' in host or '123' in host: 64 | return '123' 65 | if 'huang1111' in host: 66 | return 'huang1111' 67 | if 'cloud.139' in host or 'caiyun' in host: 68 | return 'caiyun' 69 | # yun.139.com and related 139 domains should map to caiyun 70 | if '139.com' in host or 'yun.139' in host: 71 | return 'caiyun' 72 | if '1drv' in host or 'onedrive' in host: 73 | return 'onedrive' 74 | # else take the first part of hostname 75 | return host.split('.')[0] 76 | except Exception: 77 | return 'link' 78 | 79 | 80 | def is_shield_url(url: str) -> bool: 81 | try: 82 | p = urlparse(url) 83 | return any(domain in p.netloc for domain in SHIELDS_DOMAINS) 84 | except Exception: 85 | return False 86 | 87 | 88 | from html.parser import HTMLParser 89 | 90 | 91 | class AnchorHTMLParser(HTMLParser): 92 | def __init__(self): 93 | super().__init__() 94 | # stack to handle nested tags and collect inner text per anchor 95 | self._anchor_stack: list[dict] = [] 96 | self.links: list[tuple[str, str]] = [] 97 | 98 | def handle_starttag(self, tag, attrs): 99 | tag = tag.lower() 100 | if tag == 'a': 101 | href = None 102 | title = None 103 | for k, v in attrs: 104 | if k.lower() == 'href': 105 | href = v 106 | if k.lower() == 'title': 107 | title = v 108 | # push a new anchor context 109 | self._anchor_stack.append({'href': href or '', 'title': title or '', 'text': ''}) 110 | elif tag == 'img': 111 | # record image alt text to current anchor context if any 112 | alt = '' 113 | for k, v in attrs: 114 | if k.lower() == 'alt': 115 | alt = v or '' 116 | if self._anchor_stack and alt: 117 | # append alt text to anchor's text so it can be used as label 118 | self._anchor_stack[-1]['text'] += (' ' + alt) 119 | 120 | def handle_data(self, data): 121 | if self._anchor_stack: 122 | self._anchor_stack[-1]['text'] += data 123 | 124 | def handle_endtag(self, tag): 125 | if tag.lower() == 'a' and self._anchor_stack: 126 | ctx = self._anchor_stack.pop() 127 | text = (ctx.get('text') or '').strip() 128 | title = (ctx.get('title') or '').strip() 129 | href = (ctx.get('href') or '').strip() 130 | label = text or title or '' 131 | if href: 132 | self.links.append((label, href)) 133 | 134 | 135 | def render_markdown_to_html(md_text): 136 | """Render Markdown to HTML. Prefer `markdown` package if available; otherwise use a minimal fallback that converts markdown links/images to anchors.""" 137 | try: 138 | from markdown import markdown 139 | return markdown(md_text) 140 | except Exception: 141 | text = md_text 142 | # images -> anchors 143 | text = re.sub(r'!\[([^\]]*)\]\(([^)]+)\)', r'\1', text) 144 | # links -> anchors 145 | text = re.sub(r'\[([^\]]+)\]\(([^)]+)\)', r'\1', text) 146 | return text 147 | 148 | 149 | def extract_links_from_html(html): 150 | parser = AnchorHTMLParser() 151 | parser.feed(html) 152 | return parser.links 153 | 154 | 155 | class VersionBlock: 156 | def __init__(self, heading: str): 157 | self.heading = heading 158 | self.version = '' 159 | self.code = None 160 | self.date = None 161 | self.lines: list[str] = [] 162 | self.download_links: list[tuple[str, str]] = [] # (label, url) 163 | 164 | def parse_heading(self): 165 | m = RE_HEADING.match(self.heading) 166 | if not m: 167 | return False 168 | self.version = m.group('version') 169 | if not self.version.startswith('v'): 170 | self.version = 'v' + self.version 171 | code = m.group('code') 172 | self.code = int(code) if code else None 173 | self.date = m.group('date') 174 | return True 175 | 176 | def add_line(self, line: str): 177 | self.lines.append(line.rstrip()) 178 | 179 | def extract_links_from_lines(self): 180 | for ln in self.lines: 181 | # A) handle HTML anchors that wrap an (e.g., ) 182 | for m in RE_HTML_A_IMG.finditer(ln): 183 | href = (m.group('href') or '').strip() 184 | src = (m.group('src') or '').strip() 185 | if not href: 186 | continue 187 | parsed = urlparse(href) 188 | if parsed.scheme not in ('http','https'): 189 | continue 190 | if is_shield_url(href): 191 | continue 192 | # try to get alt text from the img tag; if absent, use filename from src 193 | alt_m = re.search(r'alt=[\"\']([^\"\']+)[\"\']', m.group(0) or '', re.I) 194 | if alt_m: 195 | label = alt_m.group(1).strip() 196 | else: 197 | label = src.split('/')[-1] 198 | # if the image filename or src contains play/商店, prefer that as a hint 199 | if re.search(r'play|商店', (label + ' ' + src).lower()): 200 | # make label explicitly indicate play so downstream heuristics pick it up 201 | label = (label + ' Play').strip() 202 | self.download_links.append((label, href)) 203 | 204 | # B) handle generic HTML anchors text 205 | for m in RE_HTML_A.finditer(ln): 206 | href = (m.group('href') or '').strip() 207 | if not href: 208 | continue 209 | parsed = urlparse(href) 210 | if parsed.scheme not in ('http','https'): 211 | continue 212 | if is_shield_url(href): 213 | continue 214 | # extract visible text if any (strip inner tags) 215 | inner = re.sub(r'<[^>]+>', '', m.group('text') or '').strip() 216 | self.download_links.append((inner, href)) 217 | 218 | # C) handle nested image-inside-link markdown: [![alt](img)](url) 219 | for m in RE_NESTED_IMAGE_LINK.finditer(ln): 220 | alt = (m.group(1) or '').strip() 221 | img_src = (m.group(2) or '').strip() 222 | url = (m.group(3) or '').strip() 223 | # skip non-http links (anchors, local files) 224 | parsed = urlparse(url) 225 | if parsed.scheme not in ('http','https'): 226 | continue 227 | if is_shield_url(url): 228 | continue 229 | # prefer visible alt text; if alt doesn't indicate Play but image filename does, add Play hint 230 | label = alt or img_src.split('/')[-1] 231 | if re.search(r'play|商店', (label + ' ' + img_src).lower()): 232 | label = (label + ' Play').strip() 233 | self.download_links.append((label, url.strip())) 234 | 235 | # D) handle normal markdown links and images 236 | for match in RE_MARKDOWN_LINK.finditer(ln): 237 | # match groups for image: group1(text) group2(url) 238 | # match groups for link: group3(text) group4(url) 239 | if match.group(2): 240 | # image syntax: ![alt](imgurl) -> ignore images (unless outer link captured above) 241 | url = match.group(2).strip() 242 | if is_shield_url(url): 243 | continue 244 | continue 245 | else: 246 | label = match.group(3) or '' 247 | url = (match.group(4) or '').strip() 248 | # skip anchors, fragments, local references and non-http(s) urls 249 | if not url: 250 | continue 251 | parsed = urlparse(url) 252 | if parsed.scheme not in ('http', 'https'): 253 | # ignore internal anchors and local links like ./VersionList_2.x or #top 254 | continue 255 | if is_shield_url(url): 256 | # links directly to shields (rare) - skip 257 | continue 258 | # record as potential download link 259 | self.download_links.append((label.strip(), url.strip())) 260 | 261 | # Also render the entire markdown block to HTML and parse any anchors there. 262 | try: 263 | md_block = '\n'.join(self.lines) 264 | html = render_markdown_to_html(md_block) 265 | for title, href in extract_links_from_html(html): 266 | if not href: 267 | continue 268 | parsed = urlparse(href) 269 | if parsed.scheme not in ('http', 'https'): 270 | continue 271 | if is_shield_url(href): 272 | continue 273 | # avoid duplicates 274 | if any(href == ex[1] for ex in self.download_links): 275 | continue 276 | self.download_links.append(((title or '').strip(), href.strip())) 277 | except Exception: 278 | # be conservative: if HTML rendering fails, continue with previously found links 279 | pass 280 | 281 | def build_changelog(self) -> list[str]: 282 | changelog: list[str] = [] 283 | for ln in self.lines: 284 | s = ln.strip() 285 | if not s: 286 | continue 287 | # skip lines that are only badge/link markup (after removing links) 288 | s_no_links = RE_MARKDOWN_LINK.sub('', s) 289 | s_no_links = re.sub(r'<[^>]+>', '', s_no_links).strip() 290 | if s_no_links == '': 291 | continue 292 | # remove markdown links entirely from changelog text 293 | s = RE_MARKDOWN_LINK.sub('', s) 294 | # remove leftover bracket(parenthesis) fragments like '](http://...)' or broken link parts 295 | s = re.sub(r'\]\s*\([^\)]*\)', '', s) 296 | s = re.sub(r'!\[[^\]]*\]', '', s) 297 | # remove inline references to shield SVG tokens or badge filenames (e.g., '下载-brightgreen.svg?logo=...') 298 | s = re.sub(r'\S*svg\?logo=\S*', '', s) 299 | # strip remaining HTML tags (e.g.,
) and weird whitespace 300 | s = re.sub(r'<[^>]+>', '', s).strip() 301 | # remove leading bullets 302 | s = re.sub(r'^\s*[-*•]\s*', '', s) 303 | # final small cleanup: collapse multiple spaces 304 | s = re.sub(r'\s{2,}', ' ', s).strip() 305 | # skip lines that are only punctuation or separators (e.g., ")", "--", ")-->" etc.) 306 | if not s or re.match(r'^[\W_]+$', s): 307 | continue 308 | # skip lines that are just separators like '--' or '|' 309 | if re.match(r'^[\-|]{2,}$', s): 310 | continue 311 | changelog.append(s) 312 | return changelog 313 | 314 | 315 | def parse_markdown_versions(md_text: str, debug: bool = False) -> dict: 316 | """Parse markdown and return JSON-friendly dict eg {'version': 'v1', 'details': [...]}""" 317 | text = remove_html_comments(md_text) 318 | # remove
blocks entirely (user requested: ignore their content) 319 | text = RE_DETAILS.sub('', text) 320 | lines = text.splitlines() 321 | 322 | blocks: list[VersionBlock] = [] 323 | current: VersionBlock | None = None 324 | 325 | for ln in lines: 326 | # heading 327 | if RE_HEADING.match(ln): 328 | current = VersionBlock(ln) 329 | current.parse_heading() 330 | blocks.append(current) 331 | continue 332 | if current is None: 333 | continue 334 | current.add_line(ln) 335 | 336 | # process each block 337 | details = [] 338 | for b in blocks: 339 | b.extract_links_from_lines() 340 | changelog = b.build_changelog() 341 | # Normalize to two channels only: 'taptap' and 'playstore'. 342 | # Heuristics: 343 | # - if label mentions 'play' -> playstore 344 | # - if any link in this version is an .obb file, then .obb/.apk links are grouped into playstore 345 | # - otherwise default to taptap 346 | downloads = {'taptap': {}, 'playstore': {}} 347 | 348 | # build temporary link objects with metadata 349 | link_objs = [] 350 | md_block = '\n'.join(b.lines) 351 | 352 | def url_has_play_context(url: str) -> bool: 353 | """Return True if nearby markdown context suggests this link is a Play-store build.""" 354 | try: 355 | lower_block = md_block.lower() 356 | idx = lower_block.find(url.lower()) 357 | if idx >= 0: 358 | start = max(0, idx - 80) 359 | end = min(len(lower_block), idx + len(url) + 80) 360 | ctx = lower_block[start:end] 361 | else: 362 | ctx = lower_block 363 | return bool(re.search(r'play|play[_\s]?商店|play\s*版本|商店|google', ctx, re.I)) 364 | except Exception: 365 | return False 366 | 367 | for label, url in b.download_links: 368 | lbl = (label or '').strip() 369 | u = (url or '').strip() 370 | if not u: 371 | continue 372 | parsed = urlparse(u) 373 | scheme = parsed.scheme.lower() if parsed.scheme else '' 374 | if scheme not in ('http', 'https'): 375 | continue 376 | is_apk = u.lower().endswith('.apk') or ('.apk' in parsed.path.lower()) 377 | is_obb = '.obb' in u.lower() or 'obb' in lbl.lower() 378 | lower_lbl = lbl.lower() 379 | lower_u = u.lower() 380 | # label or URL hints that this is a Play Store build 381 | is_play_label = ('play' in lower_lbl) or ('play' in lower_u) or ('google' in lower_u) or ('play_商店' in lower_lbl) 382 | # also inspect nearby markdown context (fix cases where badge text says TapTap but context indicates Play) 383 | if url_has_play_context(u): 384 | is_play_label = True 385 | 386 | # derive mirror key: prefer URL-derived keys for known hosts (e.g., caiyun, huang1111) 387 | derived = guess_mirror_key_from_url(u) 388 | if derived and derived not in ('www', 'link'): 389 | mirror_key = derived 390 | else: 391 | m = re.search(r'([0-9A-Za-z_\-]{2,})', lbl) 392 | if m: 393 | mirror_key = re.sub(r'[^0-9a-zA-Z]+', '', m.group(1)).lower() 394 | else: 395 | mirror_key = derived or 'link' 396 | 397 | link_objs.append({'label': lbl, 'url': u, 'mirror': mirror_key, 'is_apk': is_apk, 'is_obb': is_obb, 'is_play_label': is_play_label, 'by_host': None}) 398 | 399 | # determine if there are obb files in this version 400 | version_has_obb = any(x['is_obb'] for x in link_objs) 401 | 402 | for link in link_objs: 403 | # decide channel 404 | if link['is_play_label']: 405 | channel = 'playstore' 406 | elif version_has_obb and (link['is_apk'] or link['is_obb']): 407 | # apk + obb rule: these files belong to playstore 408 | channel = 'playstore' 409 | else: 410 | # default to taptap 411 | channel = 'taptap' 412 | 413 | downloads[channel].setdefault(link['mirror'], link['url']) 414 | 415 | # remove empty channels 416 | downloads = {k: v for k, v in downloads.items() if v} 417 | 418 | detail = { 419 | 'versionName': b.version, 420 | } 421 | if b.code is not None: 422 | detail['versionCode'] = b.code 423 | if b.date: 424 | detail['releaseDate'] = b.date 425 | if changelog: 426 | detail['changelog'] = changelog 427 | if downloads: 428 | detail['downloads'] = downloads 429 | details.append(detail) 430 | 431 | if debug: 432 | print(f"Parsed {b.version}: code={b.code} date={b.date} changelog_len={len(changelog)} downloads={sum(len(v) for v in downloads.values())}") 433 | 434 | return {'version': 'v1', 'details': details} 435 | 436 | 437 | def main(): 438 | p = argparse.ArgumentParser() 439 | p.add_argument('--input', '-i', required=True, help='Input markdown file') 440 | p.add_argument('--output', '-o', required=True, help='Output JSON file') 441 | p.add_argument('--debug', '-d', action='store_true') 442 | args = p.parse_args() 443 | 444 | with open(args.input, 'r', encoding='utf-8') as f: 445 | md = f.read() 446 | 447 | data = parse_markdown_versions(md, debug=args.debug) 448 | 449 | with open(args.output, 'w', encoding='utf-8') as f: 450 | json.dump(data, f, ensure_ascii=False, indent=2) 451 | 452 | if args.debug: 453 | print(json.dumps(data, ensure_ascii=False, indent=2)) 454 | 455 | 456 | if __name__ == '__main__': 457 | main() 458 | -------------------------------------------------------------------------------- /assets/js/main.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', () => { 2 | const startScreen = document.getElementById('start-screen'); 3 | const mainScreen = document.getElementById('main-screen'); 4 | const versionSelector = document.querySelector('.version-selector'); 5 | const versionList = document.getElementById('version-list'); 6 | const currentVersionDisplay = document.getElementById('current-version-display'); 7 | const backBtn = document.getElementById('back-btn'); 8 | const infoBtn = document.getElementById('info-btn'); 9 | const rksDisplay = document.querySelector('.rks'); 10 | const searchInput = document.getElementById('version-search'); 11 | 12 | // Announcement elements 13 | const notificationContainer = document.getElementById('notification-container'); 14 | const announcementModal = document.getElementById('announcement-modal'); 15 | const modalIcon = document.getElementById('modal-icon'); 16 | const modalTitle = document.getElementById('modal-title'); 17 | const modalBody = document.getElementById('modal-body'); 18 | const closeAnnouncementBtn = document.getElementById('close-announcement'); 19 | 20 | let currentDetails = []; // Store current major version's details for filtering 21 | 22 | // Randomize RKS 23 | const randomRKS = (Math.random() * (16.99 - 12.00) + 12.00).toFixed(2); 24 | rksDisplay.textContent = `RKS ${randomRKS}`; 25 | 26 | // Initial fetch for announcements 27 | fetchAnnouncements(); 28 | 29 | // Panel elements 30 | const contentContainer = document.querySelector('.content-container'); 31 | const detailPanel = document.getElementById('version-detail-panel'); 32 | const detailTitle = document.getElementById('detail-title'); 33 | const detailMeta = document.getElementById('detail-meta'); 34 | const detailChangelog = document.getElementById('detail-changelog'); 35 | const downloadGrid = document.getElementById('download-list'); 36 | const downloadMessage = document.getElementById('download-message'); 37 | const closeDetailMobile = document.getElementById('close-detail-mobile'); 38 | const closeDetailDesktop = document.getElementById('close-detail-desktop'); 39 | 40 | // Sound effects (optional, placeholders) 41 | const playTapSound = () => { 42 | // console.log('Tap sound'); 43 | }; 44 | 45 | // Start Screen Interaction 46 | startScreen.addEventListener('click', () => { 47 | playTapSound(); 48 | startScreen.classList.remove('active'); 49 | mainScreen.classList.add('active'); 50 | 51 | // Load data when entering main screen 52 | loadMajorVersions(); 53 | }); 54 | 55 | // Back Button 56 | backBtn.addEventListener('click', () => { 57 | playTapSound(); 58 | // If panel is open, close it first 59 | if (contentContainer.classList.contains('panel-open')) { 60 | closePanel(); 61 | } else { 62 | mainScreen.classList.remove('active'); 63 | startScreen.classList.add('active'); 64 | } 65 | }); 66 | 67 | // Mobile Close Button 68 | if (closeDetailMobile) { 69 | closeDetailMobile.addEventListener('click', () => { 70 | closePanel(); 71 | }); 72 | } 73 | 74 | // Desktop Close Button 75 | if (closeDetailDesktop) { 76 | closeDetailDesktop.addEventListener('click', () => { 77 | closePanel(); 78 | }); 79 | } 80 | 81 | // Close panel when clicking on the shadow mask 82 | contentContainer.addEventListener('click', (e) => { 83 | if (e.target === contentContainer && contentContainer.classList.contains('panel-open')) { 84 | closePanel(); 85 | } 86 | }); 87 | 88 | // Info Button 89 | if (infoBtn) { 90 | infoBtn.addEventListener('click', () => { 91 | playTapSound(); 92 | showAbout(); 93 | }); 94 | } 95 | 96 | // Search Logic 97 | if (searchInput) { 98 | searchInput.addEventListener('input', (e) => { 99 | const query = e.target.value.toLowerCase().trim(); 100 | if (!query) { 101 | renderVersionList(currentDetails); 102 | return; 103 | } 104 | 105 | const filtered = currentDetails.filter(ver => { 106 | const nameMatch = ver.versionName.toLowerCase().includes(query); 107 | const codeMatch = ver.versionCode.toString().toLowerCase().includes(query); 108 | const changelogMatch = ver.changelog && ver.changelog.some(line => line.toLowerCase().includes(query)); 109 | return nameMatch || codeMatch || changelogMatch; 110 | }); 111 | 112 | renderVersionList(filtered, true); // Pass true to skip animation delay for search results 113 | }); 114 | } 115 | 116 | function showAbout() { 117 | closePanel(); 118 | currentVersionDisplay.textContent = '关于项目'; 119 | 120 | versionList.innerHTML = ` 121 |
122 |

关于 Phigros History

123 |
124 |

《Phigros》是由 Pigeon Games(鸽游)开发的节奏类游戏。Pigeon Games 是由初创通过 bilibili 视频网站发起的、由众多节奏类游戏爱好者组成的完全用爱发电的项目组。我们希望 Phigros 新颖的游戏模式和精心制作的插画与关卡可以让你感受到节奏类游戏的魅力。

125 |

本项目致力于收集并整理 Phigros 的历史版本及更新日志,方便玩家回顾与下载。

126 |

特别感谢 Cao Huy Hoang 提供的部分历史版本数据,没有他的帮助,该项目不可能发展得如此庞大。

127 |

此项目和 Pigeon Games(鸽游)、Apple Inc等公司及其关联方无任何关系,所有内容均来自公开渠道,仅供学习和研究使用。如有侵权,请联系我们删除相关内容。

128 |
129 |

支持我们

130 |
131 |

这是一个完全由爱好者维护的非营利项目。由于所有的上游存储开始收取更加高昂的费用,项目存储的费用和花销超出了我们所能承受的范围。如果您想支持我们继续提供免费的服务,请考虑捐赠。感谢您的支持!

132 | 133 | favorite 134 | 支持我们 135 | 136 |
137 |

关于此页面

138 |
139 |

此页面是最近开发的实验性浏览器,用于浏览 Phigros 的历史版本。尚未广泛测试,可能存在一些问题。

140 |

您也可以访问我们的旧版网页,不过它将在未来被弃用。

141 |

如果您发现任何问题或有改进建议,请随时通过 GitHub 提交 issue 或 pull request。

142 | 143 | 144 | code 145 | 访问 GitHub 仓库 146 | 147 | 148 | bug_report 149 | 报告问题 150 | 151 |
152 | 浙ICP备2025213066号-1 153 |
154 | `; 155 | 156 | // Unselect any active major version buttons 157 | document.querySelectorAll('.major-version-btn').forEach(b => b.classList.remove('active')); 158 | } 159 | 160 | function closePanel() { 161 | contentContainer.classList.remove('panel-open'); 162 | // Remove active state from cards 163 | document.querySelectorAll('.version-card').forEach(c => c.classList.remove('active')); 164 | } 165 | 166 | async function loadMajorVersions() { 167 | try { 168 | const response = await fetch('api/v1/versions/index.json'); 169 | if (!response.ok) throw new Error('无法加载版本索引'); 170 | 171 | const data = await response.json(); 172 | renderMajorVersions(data.versions); 173 | 174 | if (data.versions.length > 0) { 175 | const latest = data.versions[data.versions.length - 1]; 176 | selectMajorVersion(latest); 177 | } 178 | } catch (error) { 179 | console.error('Error loading versions:', error); 180 | versionSelector.innerHTML = ` 181 |
182 | error 183 |
加载失败
184 |
185 | `; 186 | } 187 | } 188 | 189 | function renderMajorVersions(versions) { 190 | versionSelector.innerHTML = ''; 191 | [...versions].reverse().forEach(v => { 192 | const btn = document.createElement('div'); 193 | btn.className = 'major-version-btn'; 194 | btn.innerHTML = `${v.version}`; 195 | btn.addEventListener('click', () => { 196 | playTapSound(); 197 | selectMajorVersion(v); 198 | }); 199 | v.element = btn; 200 | versionSelector.appendChild(btn); 201 | }); 202 | } 203 | 204 | async function selectMajorVersion(versionObj) { 205 | closePanel(); // Close panel when switching major versions 206 | 207 | // Clear search when switching major versions 208 | if (searchInput) searchInput.value = ''; 209 | 210 | document.querySelectorAll('.major-version-btn').forEach(b => b.classList.remove('active')); 211 | if (versionObj.element) versionObj.element.classList.add('active'); 212 | 213 | currentVersionDisplay.textContent = versionObj.version; 214 | versionList.innerHTML = ` 215 |
216 |
217 |
加载中...
218 |
219 | `; 220 | 221 | try { 222 | // Use the URL directly from the version object as requested 223 | // If it starts with /, we make it relative to ensure it works in subpaths 224 | let jsonPath = versionObj.url; 225 | if (jsonPath.startsWith('/')) { 226 | jsonPath = jsonPath.substring(1); 227 | } 228 | 229 | const response = await fetch(jsonPath); 230 | if (!response.ok) throw new Error(`无法加载 ${versionObj.version} 的详情`); 231 | 232 | const data = await response.json(); 233 | currentDetails = data.details || []; 234 | renderVersionList(currentDetails); 235 | } catch (error) { 236 | console.error(error); 237 | versionList.innerHTML = ` 238 |
239 | error_outline 240 |
加载版本详情失败
241 |
${error.message}
242 |
243 | `; 244 | } 245 | } 246 | 247 | function renderVersionList(details, isSearch = false) { 248 | versionList.innerHTML = ''; 249 | 250 | if (!details || details.length === 0) { 251 | versionList.innerHTML = ` 252 |
253 | search_off 254 |
在此版本分支中未找到匹配项
255 |
256 | `; 257 | return; 258 | } 259 | 260 | const now = new Date(); 261 | const thirtyDaysAgo = new Date(); 262 | thirtyDaysAgo.setDate(now.getDate() - 30); 263 | 264 | details.forEach((ver, index) => { 265 | const card = document.createElement('div'); 266 | card.className = 'version-card'; 267 | 268 | // Check if downloads exist and are not empty 269 | const hasDownloads = ver.downloads && Object.keys(ver.downloads).length > 0; 270 | 271 | if (!hasDownloads) { 272 | card.classList.add('disabled'); 273 | } 274 | 275 | // Check for icons 276 | let iconsHtml = ''; 277 | 278 | // 1. Effective content tag (yellow) 279 | if (ver.tag && ver.tag.length > 0) { 280 | iconsHtml += ``; 281 | } 282 | 283 | // 2. Recent release (green) - within 30 days 284 | const releaseDate = new Date(ver.releaseDate); 285 | if (releaseDate >= thirtyDaysAgo) { 286 | iconsHtml += `new_releases`; 287 | } 288 | 289 | if (isSearch) { 290 | card.style.animation = 'none'; 291 | card.style.opacity = '1'; 292 | } else { 293 | card.style.animationDelay = `${index * 0.05}s`; 294 | } 295 | 296 | const changelogHtml = ver.changelog ? ver.changelog.join('
') : '暂无更新日志。'; 297 | 298 | card.innerHTML = ` 299 |
300 |
301 | 302 | ${ver.versionName} 303 | ${iconsHtml} 304 | 305 | ${ver.releaseDate} 306 |
307 |
${changelogHtml}
308 |
309 | `; 310 | 311 | card.addEventListener('click', () => { 312 | playTapSound(); 313 | // Highlight active card 314 | document.querySelectorAll('.version-card').forEach(c => c.classList.remove('active')); 315 | card.classList.add('active'); 316 | 317 | showVersionDetails(ver); 318 | }); 319 | 320 | versionList.appendChild(card); 321 | }); 322 | } 323 | 324 | function showVersionDetails(ver) { 325 | detailTitle.textContent = ver.versionName; 326 | detailMeta.textContent = `发布日期: ${ver.releaseDate} | 版本号: ${ver.versionCode}`; 327 | 328 | // April Fools Warning 329 | let aprilFoolsHtml = ''; 330 | if (ver.tag && ver.tag.includes('april-fools')) { 331 | aprilFoolsHtml = '
new_releases此版本为特别的愚人节版本,包含仅在4月1日有效的内容!
'; 332 | } 333 | 334 | // Full Changelog 335 | if (ver.changelog && ver.changelog.length > 0) { 336 | detailChangelog.innerHTML = `${aprilFoolsHtml}
    ${ver.changelog.map(line => `
  • ${line}
  • `).join('')}
`; 337 | } else { 338 | detailChangelog.innerHTML = `${aprilFoolsHtml}

暂无更新日志。

`; 339 | } 340 | 341 | downloadGrid.innerHTML = ''; 342 | downloadMessage.textContent = ''; 343 | 344 | const hasDownloads = ver.downloads && Object.keys(ver.downloads).length > 0; 345 | 346 | if (hasDownloads) { 347 | const mirrorMap = { 348 | "123": "123网盘", 349 | "caiyun": "彩云网盘", 350 | "huang1111": "huang1111 网盘", 351 | "lanzou": "蓝奏云", 352 | "onedrive": "OneDrive", 353 | "google": "Google Drive", 354 | "mega": "MEGA" 355 | }; 356 | 357 | // Iterate over sources (e.g., taptap, googleplay) 358 | for (const [source, mirrors] of Object.entries(ver.downloads)) { 359 | const groupDiv = document.createElement('div'); 360 | groupDiv.className = 'download-group'; 361 | 362 | const sourceTitle = document.createElement('h4'); 363 | // Capitalize first letter 364 | sourceTitle.textContent = source.charAt(0).toUpperCase() + source.slice(1); 365 | groupDiv.appendChild(sourceTitle); 366 | 367 | const gridDiv = document.createElement('div'); 368 | gridDiv.className = 'download-grid'; 369 | 370 | // mirrors is an object like { "123": "url", "caiyun": "url" } 371 | if (typeof mirrors === 'object' && mirrors !== null) { 372 | for (const [mirrorKey, url] of Object.entries(mirrors)) { 373 | if (url) { 374 | const btn = document.createElement('a'); 375 | btn.className = 'phigros-btn'; 376 | btn.href = url; 377 | btn.target = '_blank'; 378 | 379 | const mirrorName = mirrorMap[mirrorKey] || mirrorKey; 380 | 381 | btn.innerHTML = ` 382 | download 383 | ${mirrorName} 384 | `; 385 | gridDiv.appendChild(btn); 386 | } 387 | } 388 | } else if (typeof mirrors === 'string') { 389 | // Fallback if structure is flat 390 | const btn = document.createElement('a'); 391 | btn.className = 'phigros-btn'; 392 | btn.href = mirrors; 393 | btn.target = '_blank'; 394 | btn.innerHTML = ` 395 | download 396 | 下载 397 | `; 398 | gridDiv.appendChild(btn); 399 | } 400 | 401 | if (gridDiv.children.length > 0) { 402 | groupDiv.appendChild(gridDiv); 403 | downloadGrid.appendChild(groupDiv); 404 | } 405 | } 406 | } else { 407 | downloadMessage.innerHTML = ` 408 |
409 | info 410 | 未找到该版本的应用包。如果您有可用的版本,请与我们分享。 411 |
412 | `; 413 | } 414 | 415 | // Open panel 416 | contentContainer.classList.add('panel-open'); 417 | } 418 | 419 | async function fetchAnnouncements() { 420 | try { 421 | const response = await fetch('api/glados.json'); 422 | if (!response.ok) return; 423 | 424 | const data = await response.json(); 425 | if (data.announce && Array.isArray(data.announce)) { 426 | data.announce.forEach(ann => { 427 | const type = ann.type || 'info'; 428 | const content = ann.content || ann.message; // Support both content and message keys 429 | 430 | if (type === 'error' || type === 'error_persist') { 431 | showAnnouncementModal(type, content); 432 | } else { 433 | showNotification(type, content); 434 | } 435 | }); 436 | } 437 | } catch (error) { 438 | console.error('Failed to fetch announcements:', error); 439 | } 440 | } 441 | 442 | function showNotification(type, message) { 443 | const notification = document.createElement('div'); 444 | notification.className = `notification ${type}`; 445 | notification.innerHTML = ` 446 |
447 | ${type === 'warning' ? 'warning' : 'info'} 448 | ${message} 449 |
450 | `; 451 | 452 | notificationContainer.appendChild(notification); 453 | 454 | // Auto remove after 5 seconds 455 | setTimeout(() => { 456 | notification.classList.add('fade-out'); 457 | setTimeout(() => notification.remove(), 500); 458 | }, 5000); 459 | } 460 | 461 | function showAnnouncementModal(type, message) { 462 | modalBody.textContent = message; 463 | 464 | if (type === 'error_persist') { 465 | modalIcon.textContent = 'report'; 466 | modalIcon.style.color = '#ff0055'; 467 | modalTitle.textContent = '严重错误'; 468 | closeAnnouncementBtn.style.display = 'none'; 469 | } else { 470 | modalIcon.textContent = 'error'; 471 | modalIcon.style.color = '#ffcc00'; 472 | modalTitle.textContent = '系统提示'; 473 | closeAnnouncementBtn.style.display = 'flex'; 474 | } 475 | 476 | announcementModal.classList.add('active'); 477 | } 478 | 479 | if (closeAnnouncementBtn) { 480 | closeAnnouncementBtn.addEventListener('click', () => { 481 | announcementModal.classList.remove('active'); 482 | }); 483 | } 484 | }); 485 | -------------------------------------------------------------------------------- /api/v1/versions/1.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "v1", 3 | "details": [ 4 | { 5 | "versionName": "v1.6.11", 6 | "versionCode": 50, 7 | "releaseDate": "2021/07/25", 8 | "changelog": [ 9 | "1、一首全新单曲:", 10 | "energy trixxx" 11 | ], 12 | "downloads": { 13 | "taptap": { 14 | "huang1111": "https://pan.huang1111.cn/s/gg9wqUQ", 15 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v1.6.11/Phigros_V1.6.11_clone.apk" 16 | } 17 | } 18 | }, 19 | { 20 | "versionName": "v1.6.10", 21 | "versionCode": 49, 22 | "releaseDate": "2021/07/08", 23 | "changelog": [ 24 | "1、两首全新单曲:", 25 | "Apocalyptic", 26 | "游园地", 27 | "2、添加登陆入口。暂未开放注册功能,请以offline模式登陆。" 28 | ], 29 | "downloads": { 30 | "taptap": { 31 | "huang1111": "https://pan.huang1111.cn/s/1Q9Bxfv" 32 | } 33 | } 34 | }, 35 | { 36 | "versionName": "v1.6.9", 37 | "versionCode": 48, 38 | "releaseDate": "2021/06/17", 39 | "changelog": [ 40 | "1、两首全新单曲:", 41 | "Unorthodox Thoughts", 42 | "With You", 43 | "2、修复了一些设备的音频问题。因音频系统改动,更新后请重新调节音频延迟。" 44 | ], 45 | "downloads": { 46 | "taptap": { 47 | "huang1111": "https://pan.huang1111.cn/s/y5gAjt6" 48 | } 49 | } 50 | }, 51 | { 52 | "versionName": "v1.6.8", 53 | "versionCode": 47, 54 | "releaseDate": "2021/05/27", 55 | "changelog": [ 56 | "1、新增Muse Dash精选集,共3首歌曲:", 57 | "XING", 58 | "Final Step!", 59 | "Cthugha", 60 | "2、修复部分关卡等级显示错误的问题。" 61 | ], 62 | "downloads": { 63 | "taptap": { 64 | "huang1111": "https://pan.huang1111.cn/s/jRD6zty" 65 | } 66 | } 67 | }, 68 | { 69 | "versionName": "v1.6.7.1", 70 | "versionCode": 46, 71 | "releaseDate": "2021/05/07", 72 | "changelog": [ 73 | "1、修复了若干BUG", 74 | "2、优化触摸、判定系统。" 75 | ], 76 | "downloads": { 77 | "taptap": { 78 | "huang1111": "https://pan.huang1111.cn/s/zM6nNuM" 79 | } 80 | } 81 | }, 82 | { 83 | "versionName": "v1.6.7", 84 | "versionCode": 45, 85 | "releaseDate": "2021/04/29", 86 | "changelog": [ 87 | "1、新增WAVEAT精选集,包含4首歌曲:", 88 | "Initialize", 89 | "桜樹街道", 90 | "Get Ready!!", 91 | "volcanic", 92 | "2、一首全新单曲:", 93 | "Better Graphic Animation" 94 | ], 95 | "downloads": { 96 | "taptap": { 97 | "huang1111": "https://pan.huang1111.cn/s/2vQENhN" 98 | } 99 | } 100 | }, 101 | { 102 | "versionName": "v1.6.6", 103 | "versionCode": 44, 104 | "releaseDate": "2021/04/14", 105 | "changelog": [ 106 | "1、两首全新单曲:", 107 | "Eltaw", 108 | "大和撫子 -Wild Dances-", 109 | "2、修复了部分谱面中结尾Hold时间超过歌曲总时长的问题。", 110 | "3、修复了部分Legacy谱面信息显示错误的问题。" 111 | ], 112 | "downloads": { 113 | "taptap": { 114 | "huang1111": "https://pan.huang1111.cn/s/9QydETd" 115 | } 116 | } 117 | }, 118 | { 119 | "versionName": "v1.6.5", 120 | "versionCode": 42, 121 | "releaseDate": "2021/03/29", 122 | "tag":["april-fools"], 123 | "changelog": [ 124 | "1、一首全新单曲:", 125 | "Wavetapper", 126 | "2、修复了部分信息显示错误的问题。", 127 | "3、修复了Legacy谱面无法进入的问题。", 128 | "4、除此之外没有任何新内容,请放心游玩。" 129 | ], 130 | "downloads": { 131 | "taptap": { 132 | "huang1111": "https://pan.huang1111.cn/s/Qzk1mUm" 133 | }, 134 | "playstore":{ 135 | "huang1111": "https://pan.huang1111.cn/s/NkvkGT1" 136 | } 137 | } 138 | }, 139 | { 140 | "versionName": "v1.6.4", 141 | "versionCode": 41, 142 | "releaseDate": "2021/03/03", 143 | "changelog": [ 144 | "1、新增姜米條精选集,包含3首歌曲:", 145 | "Shadow", 146 | "Anomaly", 147 | "Destination", 148 | "2、修复了部分设备加载图片素材时画面可能会出现卡顿的问题。", 149 | "3、Lyrith -迷宮リリス- IN谱面轻微修改。", 150 | "4、Pixel Rebelz曲绘替换为第一版。", 151 | "5、改正modulus的IN谱面的难度数值。" 152 | ], 153 | "downloads": { 154 | "taptap": { 155 | "huang1111": "https://pan.huang1111.cn/s/k26aDcB" 156 | } 157 | } 158 | }, 159 | { 160 | "versionName": "v1.6.3", 161 | "versionCode": 39, 162 | "releaseDate": "2021/01/13", 163 | "changelog": [ 164 | "1、新增两首全新单曲:", 165 | "Cervelle Connexion", 166 | "modulus", 167 | "2、修复「Ποσειδών」无法正常游玩的问题。" 168 | ], 169 | "downloads": { 170 | "taptap": { 171 | "huang1111": "https://pan.huang1111.cn/s/MNenBhx" 172 | } 173 | } 174 | }, 175 | { 176 | "versionName": "v1.6.2", 177 | "versionCode": 38, 178 | "releaseDate": "2020/12/20", 179 | "changelog": [ 180 | "圣诞节快乐!", 181 | "1、三首全新单曲:", 182 | "Äventyr", 183 | "Träne", 184 | "雪降り、メリクリ", 185 | "2、全新的单曲选择页面。" 186 | ] 187 | }, 188 | { 189 | "versionName": "v1.6.1", 190 | "versionCode": 37, 191 | "releaseDate": "2020/12/10", 192 | "changelog": [ 193 | "1、更新一首单曲", 194 | "Hardcore Kwaya", 195 | "2、Sein [IN] 谱面微调" 196 | ] 197 | }, 198 | { 199 | "versionName": "v1.6.0", 200 | "versionCode": 36, 201 | "releaseDate": "2020/11/26", 202 | "changelog": [ 203 | "1、新增支线章节一,包含5首歌曲:", 204 | "Ποσειδών", 205 | "WATER", 206 | "Miracle Forest (VIP Mix)", 207 | "MOBILYS", 208 | "Lyrith -迷宮リリス-", 209 | "2、修复了画面正中央无法点击的问题。", 210 | "3、修复了[PRAW]、MARENOL的IN难度中部分Hold的判定问题。", 211 | "4、更换了商店页面歌曲。" 212 | ], 213 | "downloads": { 214 | "taptap": { 215 | "huang1111": "https://pan.huang1111.cn/s/qg2eku3" 216 | } 217 | } 218 | }, 219 | { 220 | "versionName": "v1.5.7", 221 | "versionCode": 35, 222 | "releaseDate": "2020/11/12", 223 | "changelog": [ 224 | "1、新增两首全新单曲:", 225 | "SIGMA", 226 | "Electron", 227 | "2、修复了多个BUG,优化了音频系统。请前往设置页面重新调整谱面延时。" 228 | ], 229 | "downloads": { 230 | "taptap": { 231 | "huang1111": "https://pan.huang1111.cn/s/O8XqGfL" 232 | } 233 | } 234 | }, 235 | { 236 | "versionName": "v1.5.6", 237 | "versionCode": 34, 238 | "releaseDate": "2020/11/09", 239 | "changelog": [ 240 | "一系列BUG修复。" 241 | ] 242 | }, 243 | { 244 | "versionName": "v1.5.5", 245 | "versionCode": 32, 246 | "releaseDate": "2020/10/29", 247 | "changelog": [ 248 | "一系列BUG修复。" 249 | ] 250 | }, 251 | { 252 | "versionName": "v1.5.3", 253 | "versionCode": 31, 254 | "releaseDate": "2020/10/21", 255 | "changelog": [ 256 | "1、新增两首全新单曲:", 257 | "Starduster", 258 | "Parallel Retrogression(Game Ver.)", 259 | "2、修改了音频系统", 260 | "由于音频系统的变动,大部分玩家需要重新调整谱面延时。请在【设置】-【谱面延时】中调整。" 261 | ], 262 | "downloads": { 263 | "taptap": { 264 | "huang1111": "https://pan.huang1111.cn/s/3eo8nHm" 265 | } 266 | } 267 | }, 268 | { 269 | "versionName": "v1.5.3", 270 | "versionCode": 30, 271 | "releaseDate": "2020/10/14", 272 | "changelog": [ 273 | "1、新增两首全新单曲:", 274 | "Starduster", 275 | "Parallel Retrogression(Game Ver.)", 276 | "2、修改了音频系统" 277 | ], 278 | "downloads": { 279 | "taptap": { 280 | "huang1111": "https://pan.huang1111.cn/s/eNvxmfg" 281 | } 282 | } 283 | }, 284 | { 285 | "versionName": "v1.5.2", 286 | "versionCode": 29, 287 | "releaseDate": "2020/09/18", 288 | "changelog": [ 289 | "1、新增两首全新单曲:", 290 | "Orthodox", 291 | "End Me", 292 | "2、修复了一个可能导致玩家无法进入单曲集的BUG。", 293 | "3、部分修改关卡添加Legacy谱面。" 294 | ] 295 | }, 296 | { 297 | "versionName": "v1.5.1", 298 | "versionCode": 28, 299 | "releaseDate": "2020/09/08", 300 | "changelog": [ 301 | "Bug修复。" 302 | ] 303 | }, 304 | { 305 | "versionName": "v1.5.0", 306 | "versionCode": 27, 307 | "releaseDate": "2020/08/28", 308 | "changelog": [ 309 | "1、更新主线章节第六章,包含5首曲目:", 310 | "Colorful Days♪", 311 | "micro.wav", 312 | "重生", 313 | "NO ONE YES MAN", 314 | "望影の方舟Six", 315 | "2、与《同步音律喵赛克》的联动!一首全新联动曲目:", 316 | "The Mountain Eater", 317 | "2、新增了第二章收集品,以及一些额外章节收集品。", 318 | "3、一大批较老的关卡进行了翻新,其中有一些谱面进行了完全的重置。", 319 | "4、游戏中的引导做了大量的优化,新手找不到路的时代终结了!" 320 | ], 321 | "downloads": { 322 | "taptap": { 323 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v1.5.0/Phigros_V1.5.0_clone.apk" 324 | } 325 | } 326 | }, 327 | { 328 | "versionName": "v1.5.0", 329 | "versionCode": 26, 330 | "releaseDate": "2020/08/28", 331 | "changelog": [ 332 | "1、更新主线章节第六章,包含5首曲目:", 333 | "Colorful Days♪", 334 | "micro.wav", 335 | "重生", 336 | "NO ONE YES MAN", 337 | "望影の方舟Six", 338 | "2、与《同步音律喵赛克》的联动!一首全新联动曲目:", 339 | "The Mountain Eater", 340 | "2、新增了第二章收集品,以及一些额外章节收集品。", 341 | "3、一大批较老的关卡进行了翻新,其中有一些谱面进行了完全的重置。", 342 | "4、游戏中的引导做了大量的优化,新手找不到路的时代终结了!" 343 | ] 344 | }, 345 | { 346 | "versionName": "v1.4.7", 347 | "versionCode": 25, 348 | "releaseDate": "2020/07/15", 349 | "changelog": [ 350 | "1、新增了 GOOD系列 精选集,包含五首全新曲目:", 351 | "GOODTEK", 352 | "GOODBOUNCE", 353 | "GOODWORLD", 354 | "GOODFORTUNE", 355 | "GOODRAGE", 356 | "2、优化游戏在某些设备上的流畅度。" 357 | ], 358 | "downloads": { 359 | "taptap": { 360 | "huang1111": "https://pan.huang1111.cn/s/5XgLPUl" 361 | } 362 | } 363 | }, 364 | { 365 | "versionName": "v1.4.6", 366 | "versionCode": 24, 367 | "releaseDate": "2020/06/29", 368 | "changelog": [ 369 | "1、主线章节五中新增一首全新歌曲:", 370 | "Leave All Behind", 371 | "在通关主线章节5后就会出现。。" 372 | ], 373 | "downloads": { 374 | "taptap": { 375 | "huang1111": "https://pan.huang1111.cn/s/4R2B3Cg", 376 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v1.4.6/phigros_V1.4.6_clone.apk" 377 | } 378 | } 379 | }, 380 | { 381 | "versionName": "v1.4.5.1", 382 | "versionCode": 23, 383 | "releaseDate": "2020/06/22", 384 | "changelog": [ 385 | "一系列BUG修复。" 386 | ] 387 | }, 388 | { 389 | "versionName": "v1.4.5", 390 | "versionCode": 22, 391 | "releaseDate": "2020/06/15", 392 | "changelog": [ 393 | "1、新增一首全新单曲:", 394 | "Palescreen", 395 | "2、一系列BUG修复。", 396 | "3、优化了软件存储空间占用(因此需要存储空间权限,请勿慌张)。" 397 | ] 398 | }, 399 | { 400 | "versionName": "v1.4.4", 401 | "versionCode": 21, 402 | "releaseDate": "2020/05/29", 403 | "changelog": [ 404 | "1、新增一首全新单曲:", 405 | "Get Back", 406 | "2、一系列BUG修复。" 407 | ], 408 | "downloads": { 409 | "taptap": { 410 | "huang1111": "https://pan.huang1111.cn/s/bywdaHY" 411 | } 412 | } 413 | }, 414 | { 415 | "versionName": "v1.4.3", 416 | "versionCode": 20, 417 | "releaseDate": "2020/05/18", 418 | "changelog": [ 419 | "1、为庆祝TapTap平台突破50w下载量,全部单曲半价优惠!", 420 | "2、新增两首全新单曲", 421 | "Speed Up!", 422 | "Magenta Potion", 423 | "3、全新的选曲页面UI,以及大量的视觉调整。", 424 | "4、现在新进入游戏的玩家可以在第一次通过教程关卡时获得32MB+基础奖励(最高32.125MB)的奖励(需分数超过880000)", 425 | "5、现在第一次查看新收集品时将获得512KB的奖励" 426 | ], 427 | "downloads": { 428 | "taptap": { 429 | "huang1111": "https://pan.huang1111.cn/s/A63dvhB" 430 | } 431 | } 432 | }, 433 | { 434 | "versionName": "v1.4.3", 435 | "versionCode": 19, 436 | "releaseDate": "2020/05/18", 437 | "changelog": [ 438 | "1、为庆祝TapTap平台突破50w下载量,全部单曲半价优惠!", 439 | "2、新增两首全新单曲", 440 | "Speed Up!", 441 | "Magenta Potion", 442 | "3、全新的选曲页面UI,以及大量的视觉调整。", 443 | "4、现在新进入游戏的玩家可以在第一次通过教程关卡时获得32MB+基础奖励(最高32.125MB)的奖励(需分数超过880000)", 444 | "5、现在第一次查看新收集品时将获得512KB的奖励" 445 | ] 446 | }, 447 | { 448 | "versionName": "v1.4.3", 449 | "versionCode": 19, 450 | "releaseDate": "2020/05/18", 451 | "changelog": [ 452 | "1、为庆祝TapTap平台突破50w下载量,全部单曲半价优惠!", 453 | "2、新增两首全新单曲", 454 | "Speed Up!", 455 | "Magenta Potion", 456 | "3、全新的选曲页面UI,以及大量的视觉调整。", 457 | "4、现在新进入游戏的玩家可以在第一次通过教程关卡时获得32MB+基础奖励(最高32.125MB)的奖励(需分数超过880000)", 458 | "5、现在第一次查看新收集品时将获得512KB的奖励" 459 | ] 460 | }, 461 | { 462 | "versionName": "v1.4.2", 463 | "versionCode": 18, 464 | "releaseDate": "2020/04/24", 465 | "changelog": [ 466 | "1、新增了 HyuN 精选集,包含三首全新曲目:", 467 | "Infinity Heaven", 468 | "Disorder", 469 | "CROSS†SOUL" 470 | ], 471 | "downloads": { 472 | "taptap": { 473 | "huang1111": "https://pan.huang1111.cn/s/mxqVBS1" 474 | } 475 | } 476 | }, 477 | { 478 | "versionName": "v1.4.1", 479 | "versionCode": 17, 480 | "releaseDate": "2020/03/30", 481 | "tag": ["april-fools"], 482 | "changelog": [ 483 | "1、新增一首全新单曲:", 484 | "Dead Soul", 485 | "2、除此之外没有任何新内容,请放心游玩" 486 | ], 487 | "downloads": { 488 | "taptap": { 489 | "huang1111": "https://pan.huang1111.cn/s/75ekDSg", 490 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v1.4.1/Phigros_V1.4.1_clone.apk" 491 | 492 | }, 493 | "playstore": { 494 | "huang1111": "https://pan.huang1111.cn/s/LENXT6" 495 | } 496 | } 497 | }, 498 | { 499 | "versionName": "v1.4.0", 500 | "versionCode": 16, 501 | "releaseDate": "2020/03/18", 502 | "changelog": [ 503 | "1、新增了 Rising Sun Traxx 精选集,包含五首全新曲目:", 504 | "Another Me", 505 | "mechanted", 506 | "life flashes before weeb eyes", 507 | "Break Through The Barrier", 508 | "Chronostasis", 509 | "2、一些视觉上的调整。" 510 | ], 511 | "downloads": { 512 | "playstore": { 513 | "huang1111": "https://pan.huang1111.cn/s/5X6lAul" 514 | } 515 | } 516 | }, 517 | { 518 | "versionName": "v1.3.2", 519 | "versionCode": 15, 520 | "releaseDate": "2020/03/04", 521 | "changelog": [ 522 | "新增两首全新单曲", 523 | "Next Time", 524 | "Rubbish Sorting" 525 | ], 526 | "downloads": { 527 | "playstore": { 528 | "huang1111": "https://pan.huang1111.cn/s/4R67WSg" 529 | } 530 | } 531 | }, 532 | { 533 | "versionName": "v1.3.1", 534 | "versionCode": 14, 535 | "releaseDate": "2020/02/29", 536 | "changelog": [ 537 | "1、新增了Google Play排行榜。", 538 | "2、修复了章节选择界面可能无法正常显示的问题。", 539 | "3、修复了某个收集品无法被收集到的问题。", 540 | "4、一系列收集品文本修改。", 541 | "5、修复了第一次进入隐藏曲目时打击音无法正常播放的问题。", 542 | "6、Data mining调整。" 543 | ], 544 | "downloads": { 545 | "playstore": { 546 | "huang1111": "https://pan.huang1111.cn/s/A6zaRSB" 547 | } 548 | } 549 | }, 550 | { 551 | "versionName": "v1.3.0", 552 | "versionCode": 12, 553 | "releaseDate": "2020/02/20", 554 | "changelog": [ 555 | "1.3.0版本更新", 556 | "1、新增了主线第五章,包含五首曲目", 557 | "NYA!!! -by FLuoRiTe/姜米條", 558 | "JunXion Between Life And Death(VIP Mix) -by 1N6Fs", 559 | "cryout -by Ju_E", 560 | "Reimei -by 影虎。", 561 | "尊師 ~The Guru~ -by rider", 562 | "2、新增了收集品系统。", 563 | "3、在商店中新增了抽奖系统。", 564 | "4、设置中新增了音频问题修复页面,若你的设备存在音频问题,请前往设置中查看该页面。", 565 | "5、一些视觉上的调整" 566 | ], 567 | "downloads": { 568 | "taptap": { 569 | "huang1111": "https://pan.huang1111.cn/s/E7x6LHb", 570 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v1.3.0/phigros_v1.3.0_clone.apk" 571 | 572 | }, 573 | "playstore": { 574 | "huang1111": "https://pan.huang1111.cn/s/mxwOvF1" 575 | } 576 | } 577 | }, 578 | { 579 | "versionName": "[GHOST RELEASE]", 580 | "versionCode": 11, 581 | "releaseDate": "[GHOST RELEASE]", 582 | "changelog": [ 583 | "(事实上,此版本不存在在版本历史中)" 584 | ], 585 | "downloads": { 586 | "playstore": { 587 | "huang1111": "https://pan.huang1111.cn/s/75RE6Hg" 588 | } 589 | } 590 | }, 591 | { 592 | "versionName": "v1.2.5", 593 | "versionCode": 10, 594 | "releaseDate": "2020/01/22", 595 | "changelog": [ 596 | "1、祝各位玩家春节快乐!", 597 | "2、新增全新单曲:", 598 | "Aleph-0", 599 | "3、一些视觉上的调整" 600 | ] 601 | }, 602 | { 603 | "versionName": "v1.2.4", 604 | "versionCode": 9, 605 | "releaseDate": "2019/12/20", 606 | "changelog": [ 607 | "圣诞快乐!新增了两首全新单曲:", 608 | "Snow Desert", 609 | "Burn" 610 | ], 611 | "downloads": { 612 | "taptap": { 613 | "huang1111": "https://pan.huang1111.cn/s/8Qyx8fQ" 614 | } 615 | } 616 | }, 617 | { 618 | "versionName": "v1.2.4", 619 | "versionCode": 9, 620 | "releaseDate": "2019/12/20", 621 | "changelog": [ 622 | "1、圣诞节快乐!新增了全新单曲:", 623 | "Snow Desert", 624 | "Burn" 625 | ], 626 | "downloads": { 627 | "taptap": { 628 | "huang1111": "https://pan.huang1111.cn/s/8Qyx8fQ" 629 | } 630 | } 631 | }, 632 | { 633 | "versionName": "v1.2.3", 634 | "versionCode": 8, 635 | "releaseDate": "2019/12/04", 636 | "changelog": [ 637 | "1、新增了一首全新单曲", 638 | "Khronostasis Katharsis", 639 | "2、新增了插画商店与头像商店。", 640 | "3、修复了一处翻译错误。", 641 | "4、一些视觉方面的微调。" 642 | ] 643 | }, 644 | { 645 | "versionName": "v1.2.2", 646 | "versionCode": 7, 647 | "releaseDate": "2019/11/22", 648 | "changelog": [ 649 | "1、新增了一首全新单曲", 650 | "Sparkle New Life", 651 | "2、修复了部分玩家服务费数额显示错误的Bug。", 652 | "3、为新增的商店优化了引导。", 653 | "4、全新的打击动效。" 654 | ] 655 | }, 656 | { 657 | "versionName": "v1.2.1", 658 | "versionCode": 6, 659 | "releaseDate": "2019/11/22", 660 | "changelog": [ 661 | "1、新增了一首全新单曲", 662 | "Sparkle New Life", 663 | "2、修复了部分玩家服务费数额显示错误的Bug。", 664 | "3、为新增的商店优化了引导。", 665 | "4、全新的打击动效。" 666 | ] 667 | }, 668 | { 669 | "versionName": "v1.2.1", 670 | "versionCode": 6, 671 | "releaseDate": "2019/11/16", 672 | "changelog": [ 673 | "1、更新了三首全新单曲:", 674 | "Find_Me", 675 | "Sein", 676 | "狂喜蘭舞", 677 | "2、新增了“单曲集”和“商店”。", 678 | "3、继续尝试尝试修复音频问题。如果您的设备依然存在音频问题,请在TapTap社区的“音频问题”专题帖下留言。" 679 | ] 680 | }, 681 | { 682 | "versionName": "v1.2.0", 683 | "versionCode": 5, 684 | "releaseDate": "2019/10/23", 685 | "changelog": [ 686 | "1.2.0更新", 687 | "1、更新了“闫东炜精选集2”,包含三首曲目:", 688 | "Alphasia", 689 | "華灯爱", 690 | "开心病", 691 | "2、原统计界面升级为“个人名片”。", 692 | "3、尝试修复了十余款机型的音频问题。如果您的设备依然存在音频问题,请在TapTap社区的“音频问题”专题帖下留言。" 693 | ], 694 | "downloads": { 695 | "taptap": { 696 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/download/v1.2.0/phigros_V1.2.0_clone.apk" 697 | } 698 | } 699 | }, 700 | { 701 | "versionName": "v1.1.1", 702 | "versionCode": 4, 703 | "releaseDate": "2019/10/11", 704 | "changelog": [ 705 | "1.1.1更新:", 706 | "大幅优化大部分设备音频延时,请更新后在设置中重新调整。若更新后存在音频问题,请在社区专题贴中留言" 707 | ], 708 | "downloads": { 709 | "taptap": { 710 | "huang1111": "https://pan.huang1111.cn/s/G8qdxiW" 711 | } 712 | } 713 | }, 714 | { 715 | "versionName": "v1.1.0", 716 | "versionCode": 3, 717 | "releaseDate": "2019/09/26", 718 | "changelog": [ 719 | "1、新增了主线章节四。", 720 | "五首全新曲目——", 721 | "由Monst Death创作的Sultan Rage", 722 | "由Antistar feat. Ctymax创作的Class Memories", 723 | "由Itsuki创作的-SURREALISM-", 724 | "由Megalo_PaleWhite创作的Bonus Time", 725 | "由Tanchiky创作的Energy Synergy Matrix", 726 | "2、增加了FC/AP指示器,您可以在设置中开启。", 727 | "3、修复了一系列的BUG。" 728 | ], 729 | "downloads": { 730 | "taptap": { 731 | "huang1111": "https://pan.huang1111.cn/s/LxXkzU6" 732 | } 733 | } 734 | }, 735 | { 736 | "versionName": "v1.1.0", 737 | "versionCode": 3, 738 | "releaseDate": "2019/09/25", 739 | "changelog": [ 740 | "1.1.0版本更新:", 741 | "1、新增了主线章节四。", 742 | "五首全新曲目——", 743 | "由Monst Death创作的Sultan Rage", 744 | "由Antistar feat. Ctymax创作的Class Memories", 745 | "由Itsuki创作的-SURREALISM-", 746 | "由Megalo_PaleWhite创作的Bonus Time", 747 | "由Tanchiky创作的Energy Synergy Matrix", 748 | "2、增加了FC/AP指示器,您可以在设置中开启。", 749 | "3、修复了一系列的BUG。" 750 | ], 751 | "downloads": { 752 | "taptap": { 753 | "huang1111": "https://pan.huang1111.cn/s/LxXkzU6" 754 | } 755 | } 756 | }, 757 | { 758 | "versionName": "v1.0.1", 759 | "versionCode": 2, 760 | "releaseDate": "2019/09/09", 761 | "changelog": [ 762 | "1.0.1版本更新:", 763 | "1、修复了iPhone 6、iPhone 6 Plus、iPhone 5 C、iPad mini2等设备的闪退问题。", 764 | "2、延时调整的范围从0ms~500ms变为-400ms ~ 600ms。", 765 | "3、一些视觉上的调整。" 766 | ], 767 | "downloads": { 768 | "taptap": { 769 | "huang1111": "https://pan.huang1111.cn/s/K9knZhY" 770 | } 771 | } 772 | }, 773 | { 774 | "versionName": "v1.0.0", 775 | "versionCode": 1, 776 | "releaseDate": "2019/08/29", 777 | "changelog": [ 778 | "一些软件优化" 779 | ], 780 | "downloads": { 781 | "taptap": { 782 | "repacked": "https://github.com/SteveZMTstudios/Phigros-history/releases/tag/v1.0.0" 783 | } 784 | } 785 | }, 786 | { 787 | "versionName": "v1.0.0", 788 | "versionCode": 1, 789 | "releaseDate": "2019/08/28", 790 | "changelog": [ 791 | "更改了游戏关卡画面的初始亮度", 792 | "提取码:`stevezmt`" 793 | ], 794 | "downloads": { 795 | "taptap": { 796 | "huang1111": "https://pan.huang1111.cn/s/oX72lC8" 797 | } 798 | } 799 | } 800 | ] 801 | } --------------------------------------------------------------------------------