个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
🎵 Melo: nghe nhạc kiểu Spotify trên iPhone Tìm và nghe YouTube Music với giao diện kiểu Spotify. Tắt màn hình vẫn phát, tự chuyển bài, tải về nghe offline. Chạy hoàn toàn trên iPhone, không cần server.查看完整 README ↗
Tìm và nghe YouTube Music với giao diện kiểu Spotify. Tắt màn hình vẫn phát, tự chuyển bài, tải về nghe offline. Chạy hoàn toàn trên iPhone, không cần server.
| Trang chủ | Tìm kiếm | Album |
|---|---|---|
| Chọn nhanh, playlist, album mới, nghệ sĩ. | Lọc theo bài hát, video, album, nghệ sĩ. | Tải cả album bằng 1 nút ⬇. |
| Trình phát | Lời bài hát | Hàng chờ |
|---|---|---|
| Màu nền theo ảnh bìa, vuốt xuống để đóng. | Lời chạy theo nhạc, chạm một dòng để tua. | Kéo thả đổi thứ tự, bật/tắt radio. |
| Thư viện | Đang tải | Cài đặt tải về |
|---|---|---|
| Bài đã thích, đã tải, playlist của bạn. | Tải nhiều bài cùng lúc, hiện tốc độ. | Tự động hoặc cố định 1–15 bài. |
Ảnh chụp ở chế độ dữ liệu mẫu (npm run dev:mock), khổ iPhone 390×844. Ảnh bìa là tranh SVG tự vẽ theo tên bài (src/youtube/mock/covers.ts), không phải ảnh bìa thật; khi dùng thật, app hiện ảnh bìa từ YouTube Music.
Apple chỉ cho cài app đã được ký. Melo không có trên App Store (lý do), nên có 2 cách:
| 🆓 Cách 1: SideStore (khuyên dùng) | 💳 Cách 2: Cài 1 chạm (Ad Hoc) | |
|---|---|---|
| Chi phí | 0 đ | Apple Developer 99 USD/năm |
| Máy tính | Cần 1 lần, khoảng 15 phút | Cần 1 lần (lấy UDID, tạo chứng chỉ) |
| Cập nhật | Bấm UPDATE trong SideStore | Mở trang cài đặt, bấm Cài đặt Melo |
| Gia hạn | 7 ngày, tự gia hạn trên iPhone | 1 năm |
flowchart LR
PC["💻 PC Windows<br/>iTunes + iloader"] -->|"cài SideStore<br/>(chỉ 1 lần)"| IP["📱 iPhone<br/>Tin cậy + Chế độ<br/>nhà phát triển"]
IP --> SS["🧩 SideStore<br/>+ source Melo"]
SS -->|"GET / UPDATE"| M["🎵 Melo"]
SC["⏰ Phím tắt<br/>3:00 hằng ngày"] -.->|"tự gia hạn 7 ngày"| SS
Chuẩn bị:
.msi): https://github.com/nab138/iloader/releasesLink source để dán vào SideStore (Sources → +):
https://github.com/HoangDuc1003/music_melo/releases/download/ios-latest/source.json
Xong! Từ giờ:
| Hiện tượng | Cách xử lý |
|---|---|
| iloader không thấy iPhone | Cài iTunes bản tải từ Apple, không dùng bản Microsoft Store. Vẫn không được thì thử app Apple Devices. Cắm lại cáp, bấm Tin cậy. |
| Mở app báo "Nhà phát triển không được tin cậy" | Làm lại bước 2, mục Tin cậy. |
| SideStore báo lỗi khi cài, cập nhật hoặc gia hạn | Mở LocalDevVPN, bấm Connect, dùng Wi‑Fi rồi thử lại. |
| Melo không mở được sau 7 ngày | Mở SideStore, bấm 7 DAYS cạnh Melo. Nhạc đã tải không mất. |
| Báo đã đủ số app | Apple ID miễn phí cho tối đa 3 app tự cài, tính cả SideStore. Gỡ bớt một app. |
| Melo lỗi khi đang dùng | Trong Melo: Cài đặt → Nhật ký lỗi → Copy, rồi gửi cho người sửa app. Nhật ký đã tự ẩn IP, link và token. |
Sau khi thiết lập một lần, mỗi lần cài hay cập nhật chỉ cần:
Không cần SideStore, không cần VPN, không phải gia hạn 7 ngày. Hồ sơ dùng được 1 năm.
Thiết lập một lần:
CI sẽ tự ký và đăng trang cài đặt. Hướng dẫn từng lệnh (làm được trên Windows): docs/CAI_DAT.md.
iOS tạm dừng JavaScript khi app chạy nền. Vì vậy hàng chờ và việc phát nhạc nằm trong plugin Swift (AVPlayer); phần JavaScript chỉ lo những việc cần mạng.
sequenceDiagram
participant U as 👤 Bạn
participant UI as 💻 Giao diện (React)
participant C as 🎛️ controller.ts
participant N as 🍎 MeloPlayer (Swift)
participant YT as ▶️ YouTube Music
U->>UI: Bấm phát album
UI->>C: playTracks()
C->>N: setQueue (cả hàng chờ, bài đã tải dùng file)
C->>YT: Lấy link 20 bài tới (youtubei.js, bằng IP của iPhone)
C->>N: updateItem(link)
Note over N: Khoá màn hình: AVPlayer tự chuyển bài,<br/>điều khiển trên màn hình khoá
N-->>C: needsUrl (link hết hạn hoặc lỗi)
C->>YT: Lấy link mới
C->>N: updateItem(link mới)
C->>YT: Còn ≤ 3 bài: lấy radio, nối vào hàng chờ
music_melo/
├── src/ # Giao diện + logic (React, TypeScript)
│ ├── pages/ # Trang chủ, Tìm kiếm, Thư viện, Album, Nghệ sĩ, Đã tải, Cài đặt
│ ├── components/ # Trình phát mini/toàn màn hình, hàng chờ, lời bài hát, menu bài
│ ├── player/ # Bộ điều khiển: hàng chờ, lấy link trước, radio, lưu/khôi phục
│ ├── downloads/ # Tải về: hàng đợi, tải song song tự điều chỉnh, lưu file
│ ├── sync/ # Đồng bộ Spotify: đăng nhập PKCE, Web API, ghép bài sang YouTube Music
│ ├── youtube/ # youtubei.js, BotGuard, chọn client, dữ liệu mẫu (mock/)
│ ├── lib/ # IndexedDB (Dexie), thư viện, lời bài hát, nhật ký lỗi
│ └── ui/ # Điều hướng theo tab, lớp phủ, thông báo
├── plugins/player/ # Plugin Swift "MeloPlayer": AVPlayer, hàng chờ native, màn hình khoá
│ └── ios/Tests/ # XCTest cho hàng chờ native
├── ios/App/ # Dự án Xcode (Capacitor), PrivacyInfo.xcprivacy
├── scripts/ # Ký Ad Hoc, tạo source SideStore, kiểm tra giao diện, chụp ảnh README
├── docs/ # Kế hoạch, hướng dẫn cài, App Store, chính sách quyền riêng tư, ảnh
└── .github/workflows/ios.yml # CI: quét bí mật → test → build IPA → Release → trang cài đặt
| Phần | Công nghệ |
|---|---|
| Giao diện | React 19, TypeScript, Vite, Tailwind CSS 4, Zustand, TanStack Query |
| App iPhone | Capacitor 8, plugin Swift tự viết (AVPlayer, MediaPlayer, AVAudioSession) |
| Nguồn nhạc | youtubei.js (InnerTube), BotGuard / PO token (bgutils-js) |
| Đồng bộ Spotify | Spotify Web API, OAuth PKCE (không client secret), token trong Keychain, ghép bài sang YouTube Music |
| Lưu trên máy | IndexedDB (Dexie), file nhạc trong Library/NoCloud, File Transfer |
| Lời bài hát | LRCLIB, dự phòng bằng lời trên YouTube |
| Kiểm thử | Vitest (85 test), XCTest (15 test), Playwright (9 luồng giao diện) |
| CI/CD | GitHub Actions trên macOS: gitleaks, npm audit, build IPA, giới hạn dung lượng JS, Release, Pages |
| Phát hành | GitHub Releases + source SideStore/AltStore, trang cài Ad Hoc trên GitHub Pages |
git clone https://github.com/HoangDuc1003/music_melo.git
cd music_melo
npm install
npm run dev:mock # dữ liệu mẫu, không cần YouTube: http://localhost:5173
npm run dev # dữ liệu thật qua proxy của Vite
npm test # vitest
npm run build # kiểm tra kiểu + build
cd plugins/player && swift test # test hàng chờ native (macOS/Linux)
Melo.ipa và đăng lên Releases.MELO_LAN=1 npm run dev. Lưu ý lệnh này mở cả proxy dev ra mạng LAN.scripts/readme-shots.mjs và scripts/install-illustrations.mjs.https hoặc file trong máy.Dự án dùng cho cá nhân, không phát hành lên App Store và không chia sẻ file IPA cho người khác. Nội dung nhạc thuộc YouTube và chủ sở hữu quyền. Vì sao không thể lên App Store và cách làm một phiên bản hợp lệ: docs/APP_STORE.md.
Nguyễn Đức Hoàng
Nếu thấy dự án hữu ích, hãy cho một ⭐ nhé!