Clip tự động giờ đã là video ngắn thực thụ
Mỗi ván đấu kết thúc vốn đã được dựng thành clip dọc. Chỉ có điều clip nào cũng na ná nhau. Giờ mỗi clip mở đầu bằng một cái móc, làm nổi bật số tiền và khép lại bằng một tấm thẻ.

Nói đơn giản
opolyx biến các ván đã kết thúc thành clip dọc và tự đăng chúng. Phần đó đã chạy được một thời gian. Vấn đề là xem ba clip cũng chẳng khác gì xem một clip.
- khoảng 40% khung hình chỉ là nền trống quanh bàn cờ đặt ở giữa;
- clip mở ra giữa ván tại một cú đổ xúc xắc bất kỳ — mà đó cũng chính là ảnh thu nhỏ;
- cao trào không đọc nổi: khoản thuê 12.000 chỉ là một dòng chữ xám trong khung nhỏ;
- mọi sự kiện đều có thời lượng như nhau, nên đoạn dẫn dài ngang khoảnh khắc chính;
- chúng không có tiếng, không có kết, còn chú thích và thẻ tag thì không bao giờ đổi.
Giờ mỗi clip được dàn dựng chứ không phải đổ ra: mở đầu bằng một cái móc cho biết bạn sắp xem gì, bàn cờ lấp đầy khung hình, tiền bạc và các pha lớn được chú thích ngay lúc xảy ra, và khép lại bằng một tấm thẻ chỉ chỗ để chơi. Nhịp phim lướt qua phần sổ sách và chậm lại ở khoảnh khắc đáng giá — kể cả một quãng đứng hình ngắn trước một kết cục mà bạn đã đoán được.
Chú thích, tiêu đề và thẻ tag giờ được lấy từ các kho thay vì một dòng cố định, và khi một ván sinh ra nhiều clip, chúng được chọn sao cho nói về những chuyện khác nhau chứ không phải ba góc nhìn của cùng một pha phá sản.
Cho người thích chi tiết kỹ thuật
Bộ dựng là một worker trên máy chủ ảo nhỏ, nạp trang web đang chạy trong Chromium không giao diện rồi ghi lại tuyến phát lại. Đó chính là đòn bẩy: toàn bộ diện mạo của clip là mã web, nên nó đi kèm một lần triển khai bình thường và không đòi hỏi gì ở worker.
Mấu chốt là khôi phục khoảnh khắc neo. Tuyến phát lại chỉ nhận một khoảng thời gian chứ không nhận "khoảnh khắc" — nên trang sẽ chạy lại chính thuật toán chấm điểm điểm nhấn của engine trên toàn bộ nhật ký sự kiện rồi lấy điểm cao nhất nằm trong khoảng đó. Cách này khôi phục đúng khoảnh khắc mà worker đã chọn, và đó là lý do phần hình ảnh có thể ra mắt mà không cần đụng tới worker.
// lib/clip/pacing.ts — screen time is a function of what the event is
const BOOKKEEPING = 110; // turn_ended, dice_rolled: skim
const NORMAL = 320;
const ANCHOR_MIN = 1400; // the moment the clip exists for
const PREDICT_FREEZE = 600; // "what happens next?" before a guessable payoff
export function paceFor(event: DomainEvent, isAnchor: boolean): number {
if (isAnchor) return Math.max(ANCHOR_MIN, NORMAL);
return isBookkeeping(event) ? BOOKKEEPING : NORMAL;
}| Trước đây | Hiện nay | |
|---|---|---|
| Cấu trúc | một đoạn phát lại liền mạch | móc mở đầu, diễn biến, thẻ kết |
| Nhịp | 700 ms × 65 sự kiện | 110–1400 ms tùy trọng số sự kiện |
| Độ dài | luôn khoảng 45 giây | 14–27 giây, khớp nội dung |
| Nội dung bài đăng | một chú thích, bốn thẻ tag cố định | kho nội dung có hạt giống cho từng clip |
| Âm thanh | tắt cứng trong mã | âm thanh trò chơi, nhạc nền tùy chọn |
Khâu chọn lọc cũng đổi: khi một ván cho ra nhiều khoảnh khắc ứng viên, bộ chọn giữ lại cái tốt nhất của từng loại khác nhau, nên một trận đấu không còn sinh ra ba clip gần như giống hệt về cùng một pha phá sản.
