Quản lý toàn bộ thư viện Suno của acc tantalizingsonata615: danh sách bài, check stem đã tách hay chưa, chọn đúng stem cần tải, xuất file cho script tải về máy và chia đợt tải qua Usesuno.
Thứ tự nạp tự động khi mở trang: 1) File cùng host trước — trang tự thử library_index.json / suno_library.csv đặt cùng thư mục với index.html trên cùng host (same-origin, không bị CORS), nếu có thì nạp luôn không cần Drive; 2) Google Drive — dán link Drive rồi bấm tải, hoặc mở bookmark ?drive=<link> để tự nạp, bấm Tải lại để lấy bản mới nhất trên Drive. Nạp file thủ công ở dưới vẫn giữ làm dự phòng.
File chứa danh sách chính. Nếu nạp thêm file Upload riêng ở ô dự phòng, trang tự gộp và đánh dấu nguồn Upload.
Có file này thì stem nào da_co_file sẽ hiện đúng trạng thái và bị bỏ qua khi tải lại.
Chỉ điền khi bạn đã tự dựng Cloudflare Worker thêm header CORS. Khi có link này, trang sẽ thử tải Drive qua Worker của bạn trước, rồi mới thử tải trực tiếp từ Google. Dạng link gợi ý: https://ten-worker.workers.dev/?url= hoặc mẫu có {url} như https://ten-worker.workers.dev/{url} — trang tự gắn URL Drive đã mã hoá vào. Để trống thì trang không dùng proxy nào cả. Xem mã Worker mẫu ở mục hướng dẫn ngay dưới nút tải.
File Drive phải để chế độ “Bất kỳ ai có đường liên kết đều xem được” — nhưng kể cả khi file đã công khai, trình duyệt vẫn có thể chặn CORS khi một trang web khác (như trang này) dùng fetch đọc trực tiếp từ drive.google.com, vì Google không gửi header Access-Control-Allow-Origin cho cách đọc đó. Đó là lỗi “Failed to fetch”, không phải lỗi file chưa công khai. Cách chắc nhất: up thêm file library_index.json lên cùng host, cùng thư mục với index.html (ví dụ cùng chỗ với file này trên suno1.pages.dev) — mở trang là tự nạp. Link Google Sheet cũng dùng được, trang tự xuất sheet đầu tiên thành CSV.
library_index.json (hoặc suno_library.csv) do script xuất ra, up lên cùng thư mục với index.html trên cùng host — up lên Cloudflare Pages thì để 2 file ngang hàng nhau trong cùng bản deploy / cùng thư mục gốc; up lên GitHub thì để cùng thư mục với index.html trong repo. Sau đó mở lại trang: nó tự thử library_index.json rồi suno_library.csv ở cùng host trước (same-origin nên không bị CORS), có file là nạp luôn. Nếu có thêm uploads_index.json / suno_uploads_only.csv và stems_report.csv cùng chỗ, trang cũng tự thử nạp kèm.library_index.json / suno_library.csv từ máy — cách này không qua mạng nên không dính CORS.*.workers.dev, rồi dán vào ô “Worker proxy” ở trên dạng https://ten-worker.workers.dev/?url=. Từ đó bấm “Tải dữ liệu từ Drive” sẽ đi qua Worker của bạn trước.Mã Cloudflare Worker mẫu (dán vào Worker của bạn, deploy, rồi dùng link của nó ở ô trên):
addEventListener('fetch', function(event){
event.respondWith(handle(event.request));
});
async function handle(request){
var target = new URL(request.url).searchParams.get('url');
if (!target) return new Response('Thieu tham so ?url=', { status: 400 });
var res = await fetch(target);
var headers = new Headers(res.headers);
headers.set('Access-Control-Allow-Origin', '*');
return new Response(res.body, { status: res.status, headers: headers });
}
suno_library.csv hoặc library_index.json từ script suno_export.py.
suno_uploads_only.csv hoặc uploads_index.json từ suno_uploads.py — gộp vào và gắn nhãn Upload.
Mỗi dòng 1 stem, cột trang_thai: da_co_file / da_tai / chua_tai.
Quét tự động ngay sau khi nạp danh sách (gồm cả phần Upload): phát hiện bài trùng ID, thiếu tên / ID / link, đã tách stem nhưng chưa có tên stem, chưa rõ trạng thái stem và số bài đã tải chính thức.
Badge stem lấy theo metadata.has_stem: Đã tách Chưa tách Chưa rõ. Bấm Chi tiết stem ở từng bài để xem từng stem (Lead Vocal, Backing Vocals, Drums, Bass, Keyboards…), tick chọn stem cần tải, chọn định dạng và đánh dấu trạng thái tay.
Chỉ gọi đọc GET /api/clip/{id}/stems/ để lấy danh sách stem — không bấm Extract lại nên không tốn credit. Token chỉ nằm trong phiên này, đóng trang là mất.
MP3 tải thẳng từ cdn1.suno.ai/{stem_id}.mp3. WAV phải qua convert_wav rồi poll cdn1.suno.ai/{stem_id}.wav — trang thử gọi khi có token, không được thì dùng lệnh script ở bước 2.
Quy tắc: stem nào đã có file (da_co_file) thì bỏ qua, không tải lại; stem chưa có thì tải; tải lỗi thì ghi chua_tai trong stems_report.csv xuất ra — không lặng lẽ bỏ qua.
File stem_select.json xuất đúng format script đọc được: {"<clip_id>": ["Lead Vocal", "Drums"]} — để cùng thư mục với suno_export.py rồi chạy lệnh dưới đây. WAV 48kHz đi đường script là chắc nhất (script tự gọi convert_wav + poll CDN).
SUNO_TOKEN="..." python3 suno_export.py --metadata-only --liked-only --check-stems --download-stems --stem-format mp3 --stem-select ./stem_select.json --out ./suno_archive_268_liked
Trang tự gom link suno.com/song/… của các bài đang hiện trong danh sách (đang lọc gì thì gom theo đó) rồi chia thành từng đợt. Mỗi đợt copy 1 phát, dán vào Usesuno là tải.
Giới hạn cứng của Usesuno: tối đa 20 link / lần, tải ZIP tối đa 10 bài / gói, và chỉ tải được bài public — bài private sẽ lỗi bên đó. 270 bài Like = 14 đợt 20 link (hoặc 27 gói ZIP).
Bài Upload được Suno lọc ngay trên server bằng filter {"upload":"True"} của POST /api/feed/v3 — acc này trả về 106 bài, cả 106 bài đều mang model chirp-chirp (khác hẳn model AI tạo bài). Lấy danh sách bằng script suno_uploads.py --upload-filter (nút copy lệnh ở bước 2), nạp file suno_uploads_only.csv ở bước 0 là mục này có dữ liệu.