Spaces:
Running
Running
Commit History
-
fix(core): mọi tool đều giữ chỗ phiên khi chạy, thêm lớp chặn cho việc chạy đồng bộ
Nối tiếp 20e69c0 (mới bọc riêng Dịch/đổi giọng). Cut video, Xào video và Down list dùng chung cơ chế phiên nên vẫn dính: bộ dọn phiên quá hạn có thể xoá trúng thư mục job đang ghi. - Chuyển hàm bọc thành submit_for_session() dùng chung trong core/jobs.py; cả 4 tool (11 chỗ tạo job) đi qua đó, không còn jobs.submit trần. - Listing ảnh chạy THẲNG TRONG REQUEST, không qua job nên không đăng ký được vào sổ phiên-đang-bận. Thêm lớp chặn thứ hai ngay trong cleanup_old: quét sâu tìm dấu vết ghi mới, thấy là bỏ qua. Dừng sớm khi gặp file mới và có trần số mục để phiên vài trăm video không làm chậm đợt dọn. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>c8ce1a0
-
feat(analytics): tab "Quản lý thời lượng" theo dõi người dùng cho quản trị
Ghi log thô raw_events rồi suy ra 9 chỉ số (A1-A5, B1-B4) bằng ETL, không lưu sẵn chỉ số. Lưu Postgres nếu có DATABASE_URL, không thì SQLite trong STORAGE_DIR (giữ 90 ngày, tự dọn). - backend: services/analytics (storage + etl + track), api/analytics (POST /api/events + các endpoint quản trị), middleware reqctx đọc header X-TNT-* để dòng log máy chạy gắn đúng task; JobManager tự phát job_queued/started/done kèm latency_ms (đã trừ thời gian chờ hàng đợi). - frontend: lib/track.js (đồng hồ người), nút 👍/👎 (ThumbsFeedback) cho B3, dashboard SVG thuần trong tab Quản lý thời lượng; gắn điểm đo vào 8 tool. Kèm sửa lỗi phát hiện khi test: - khôi phục core.files.rel_path() + gom mọi đường dẫn phiên ở cut/dub/shuffle/ download về "/" (trước nối "\" của Windows làm hỏng URL). - get_file trả 404 khi trỏ vào thư mục (thay vì 500). - run_tests.py cô lập STORAGE_DIR sang temp (trước dọn nhầm phiên thật). - cập nhật test_cut/test_dub theo API hiện hành + thêm test_analytics (14 test). …00d2c12
-
feat(shuffle): bảng tổ hợp mirror video_cook — ảo hoá 300k + lọc bằng nút (JS)
Làm phần hiển thị list combo giống tool video_cook: - Thứ tự combo: tuần tự từ điển nếu ≤ trần, LẤY MẪU ĐA DẠNG nếu vượt (bỏ cách cũ chỉ lấy N cái đầu theo product). /plan trả sequences + clip_names (payload gọn). - Trần 300.000 combo. Bảng FE ẢO HOÁ (chỉ vẽ dòng đang thấy) -> không treo dù hàng trăm nghìn dòng. Hiển thị "tên + tên + tên" + cột 🎵 Source (xoay vòng theo thứ hạng trong tập đang chọn) + STT + ✓, giống combo_model.py. - Bộ lọc bằng NÚT nối chuỗi trên tập ĐANG CHỌN (giống tab2_output.py): Đặt lại / Chọn hết / Bỏ hết / Lọc ngẫu nhiên % / Lọc tương đồng % + "Ưu tiên khúc khác hoàn toàn". Lọc tương đồng port Y HỆT SimilarityWorker (greedy keep-first + nén, 0%=khác hoàn toàn), chạy Web Worker -> UI không đơ. Đã cross-check 40 case khớp 100% với bản Python. Component mới: ComboTable.jsx, worker: simFilter.js. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>824497d
-
feat(sub+shuffle): tay kéo giãn ô phụ đề + giữ/tắt tiếng gốc khi xào
Phụ đề: thêm 4 tay kéo cạnh cho ô đang chọn — trái/phải đổi BỀ RỘNG vùng (w), trên/dưới GIÃN cỡ chữ (fontSize theo khoảng cách con trỏ tới tâm ô, con trỏ bám cạnh). Bỏ tay kéo góc cũ. Xào video: thêm tùy chọn "Giữ âm thanh gốc" (mặc định BẬT) — ghép nối tiếng gốc các khúc theo đúng thứ tự xào; nếu có lồng track thì TRỘN track lên tiếng gốc. Tắt -> video câm (như cũ) / chỉ còn track. Mô hình theo tool video_cook: - normalize_clip(with_audio): giữ tiếng gốc (aac 44100 stereo), clip câm chèn im lặng để concat copy đồng nhất; cache key riêng theo chế độ audio. - attach_audio(keep_original): amix track lên tiếng gốc (normalize=0) thay vì thay hẳn. Đã verify render thật: giữ/tắt/trộn đều đúng, tiếng gốc đúng vị trí từng khúc. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>ad3a570
-
fix(shuffle): báo rõ khi clip đã bị xoá khỏi vùng tạm, thay vì ffmpeg exit 254
Clip nằm ở STORAGE_DIR=/tmp; trên HF Space /tmp BỊ XOÁ mỗi lần server khởi động lại/deploy -> file clip biến mất trong khi trình duyệt vẫn nhớ danh sách -> ffmpeg chết với "exit status 254" (ENOENT: no such file) và MỌI biến thể fail, thông báo FE lại đoán sai là "clip khác kích thước". Kiểm tra tồn tại file ngay ở /generate -> trả 400 kèm thông báo tiếng Việt rõ: "N clip không còn trên máy chủ ... hãy TẢI LẠI clip rồi xào lại" + tên clip thiếu. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>54b9540
-
feat: dịch dự phòng deep-translator + lọc ảo giác ASR + xào render tới 10k
Dịch (translate.py, asr.py): - Nối deep-translator (Google free, không cần key) làm dự phòng cuối: khi Gemini + Groq lỗi/thiếu key vẫn dịch được từ tiếng bất kỳ trong video sang vi/en/fil (source auto-detect), thay vì trả câu gốc. - Bắt cả trường hợp dịch ra y hệt câu gốc -> vẫn chạy deep-translator. - Log rõ khi Gemini/Groq lỗi (soi HF Logs ra ngay thủ phạm). - Parser batch bền hơn (1. 2) **3.** 4: markdown). - Lọc ảo giác Whisper: bỏ câu dài mà đọc quá chậm + cụm bịa quen ("đăng ký kênh", "cảm ơn đã xem"...) khi tốc độ đọc bất thường. Xào (shuffle.py, ShuffleVideo.jsx): - MAX_RENDER 150 -> 10000 (env SHUFFLE_MAX_RENDER); PLAN_CAP 3000 -> 5000 (env SHUFFLE_PLAN_CAP). FE lấy max_render từ backend nên luôn khớp env. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>3d2064d
-
perf: queue theo loại + code-split FE + streaming upload cho nhiều user
Backend: - Viết lại JobManager thành hàng đợi theo loại tác vụ (heavy/io), có vị trí hàng đợi (queue_pos/total) và tự dọn job cũ để không rò rỉ RAM. Cấu hình qua env JOB_HEAVY_WORKERS/JOB_IO_WORKERS/JOB_HISTORY_MAX. - core/bg.py: pool nền có giới hạn (BG_WORKERS) thay raw thread không giới hạn ở listing/listing_free/flux2. - Đưa OpenAI blocking ra khỏi event loop (listing analyze/create_session, listing_free analyze/auto-generate: async def -> def). - Streaming upload (save_upload_stream) thay vì đọc cả file vào RAM; enforce MAX_UPLOAD_MB. Áp cho dub/cut/shuffle. - Cache: Demucs model, ffprobe theo (path,mtime), client Groq. - thumbnail_strip gộp 40 lần ffmpeg -> 1 pass (fallback chậm khi lỗi). - Endpoint GET /api/queue/stats. Frontend: - Sửa bug double <Outlet> trong Layout (mọi trang mount 2 lần -> chạy đôi upload/poll/API). - Code-split các page bằng React.lazy + Suspense; tách react-vendor chunk. - pollJob nhận AbortSignal; hủy poll khi rời trang (chống rò rỉ setTimeou…3370310 -
update cut, guide, dub
c55c292
-
update: down, cut, shuffle, trans video UX
00a7377 -
feat: auto-save kết quả tool lên Drive + lịch sử cho download/cut/shuffle/listing
b4fd22e -
update shuffle: optimize algorithm to be fast, design new function
e014541
-
refactor: merge app/ vào backend/app/, xoá app/ gốc
de3a7c5
-
deploy merged code
9b53f70