個人 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é!