Lịch sử thay đổi
Mọi lần sửa trang này, mới nhất ở trên. Mở từng mục để xem đã đổi gì.
- 03/10/2026 · +0 −2 dòng
Xem thay đổi
⋯ > **TL;DR** — Để phát một tập, backend của bạn xin `POST /playback` một **vé**: token cho một tập trên một thiết bị, hiệu lực 30 phút. Gửi hai giá trị thiết bị lấy từ Player SDK, `viewer_ref` ổn định của riêng bạn, và `"intent": "play"` khi người xem bắt đầu một tập. Một lần gọi trả về tối đa 3 vé (tập đó và hai tập kế). Dùng lại vé cho cùng người xem, thiết bị và tập là được, cho tới 5 phút trước khi vé hết hạn. - > **Đang triển khai.** Nếu Wandura đã dựng kho riêng cho bạn, bạn lấy link từ kho đó thay vì xin vé: [Kho video riêng](own-space.md). - ## Khi nào xin vé {#when-to-request} ⋯
- 03/10/2026 · +2 −0 dòng
Xem thay đổi
⋯ > **TL;DR** — Để phát một tập, backend của bạn xin `POST /playback` một **vé**: token cho một tập trên một thiết bị, hiệu lực 30 phút. Gửi hai giá trị thiết bị lấy từ Player SDK, `viewer_ref` ổn định của riêng bạn, và `"intent": "play"` khi người xem bắt đầu một tập. Một lần gọi trả về tối đa 3 vé (tập đó và hai tập kế). Dùng lại vé cho cùng người xem, thiết bị và tập là được, cho tới 5 phút trước khi vé hết hạn. + > **Đang triển khai.** Nếu Wandura đã dựng kho riêng cho bạn, bạn lấy link từ kho đó thay vì xin vé: [Kho video riêng](own-space.md). + ## Khi nào xin vé {#when-to-request} ⋯
- 02/10/2026 · +38 −65 dòng
Xem thay đổi
- # Playback - - Để phát một tập, backend của bạn xin Wandura vé playback bằng `POST /api/delivery/v1/playback`, và Player SDK của người xem dùng vé đó để tải stream đã mã hoá. Trang này giải thích cách xin vé, vé chứa gì, hiệu lực bao lâu và phải làm gì khi vé hết hạn. - - ## Khi nào xin vé + # Playback và vé - Xin một vé cho mỗi lần bắt đầu phát: khi người xem chạm vào một tập, hoặc khi app tải trước tập kế tiếp. Đừng xin vé hàng loạt rồi lưu lại, vì mỗi vé hết hạn 30 phút sau khi được cấp. + > **TL;DR** — Để phát một tập, backend của bạn xin `POST /playback` một **vé**: token cho một tập trên một thiết bị, hiệu lực 30 phút. Gửi hai giá trị thiết bị lấy từ Player SDK, `viewer_ref` ổn định của riêng bạn, và `"intent": "play"` khi người xem bắt đầu một tập. Một lần gọi trả về tối đa 3 vé (tập đó và hai tập kế). Dùng lại vé cho cùng người xem, thiết bị và tập là được, cho tới 5 phút trước khi vé hết hạn. - Một request có thể gồm tới ba tập: tập đang phát cộng tối đa hai tập kế, bằng `next` hoặc `episodes`. Xem [Phát mượt khi tải cao](../guides/smooth-playback.md#request-early). + ## Khi nào xin vé {#when-to-request} - Wandura kiểm tra giấy phép của bạn ở mọi request: tổ chức của bạn phải đang hoạt động, và giấy phép streaming cho phim phải đang hoạt động và nằm trong khung thời gian. Có mặt trong catalog không đảm bảo được cấp vé; request xin vé là bước kiểm tra cuối cùng. + - **Khi người xem bắt đầu một tập**: luôn có một request với `"intent": "play"` cho tập đó. Chính request này được tính là lượt xem. + - **Xin trước** cho một hoặc hai tập kế, với `"intent": "prefetch"`, trong cùng request (`next` hoặc `episodes`). Prefetch không phải lượt xem. + - **Thêm một lần** khi Player SDK báo lỗi, kể cả khi vé hết hạn. - ## Xác định tập + Không bao giờ xin vé cho cả bộ phim, và không bao giờ cho tập mà paywall của bạn chưa mở khoá: Wandura kiểm tra **giấy phép** của bạn, không kiểm tra người xem của bạn. Luật về thời hạn, dùng lại và lô nằm chung một chỗ: [Hành vi chuẩn của API · Vé playback](../reference/behaviour.md#tickets). - Bạn có thể chỉ định tập theo một trong hai cách: + ## Xác định tập {#identify-the-episode} | Cách | Trường | Ví dụ | ⋯ | Theo phim và số tập | `film_ref` (film ID hoặc slug) và `episode_no` (số JSON, bắt đầu từ 1) | `"film_ref": "the-heiress-returns", "episode_no": 3` | - Nếu gửi cả hai, `episode_id` được dùng. Phim không tồn tại, tập không tồn tại và tập chưa sẵn sàng đều trả về cùng một `404` với `error_code` `not_ready`. + Nếu gửi cả hai, `episode_id` được dùng. Dùng cùng một cách mỗi lần cho cùng một tập: việc dùng lại vé so khớp tập đúng như bạn đã gửi. ## Gửi giá trị thiết bị {#send-the-device-values} - Các tập được cấp phép đều đã mã hoá, và chỉ Player SDK giải mã được. Một HLS player thông thường sẽ tải playlist rồi đứng hình, không có lỗi nào giải thích lý do. Trước mỗi request xin vé, app trên thiết bị người xem lấy hai giá trị từ Player SDK và chuyển về backend của bạn: + Các tập được cấp phép đều đã mã hoá, và chỉ Player SDK giải mã được. Trước mỗi request, app đọc hai giá trị từ SDK và gửi về backend của bạn: | Trường | Là gì | ⋯ | `drm_kek` | Device public key do Player SDK tạo ra. Private key tương ứng không bao giờ rời khỏi thiết bị. | - Hướng dẫn Player SDK ở partner.wandura.ai → **Developers** → **Player SDK** ghi rõ các lệnh gọi SDK cụ thể; hướng dẫn có sau khi [onboarding](../before-you-start.md#get-onboarded), cho thành viên vai **Developer** hoặc **Admin**. Wandura đăng ký app ID của bạn và cấp license Player SDK; tổ chức của bạn trả tiền license đó. - - Quy tắc cho giá trị thiết bị: + - Gửi cả hai hoặc không gửi cái nào. Chỉ gửi một: `400` `invalid_request`. + - Gửi đúng output thật của SDK. Một giá trị bị từ chối bằng `400` `invalid_device_info` khi, sau khi bỏ khoảng trắng hai đầu, nó ngắn hơn 8 ký tự hoặc là `(null)`, `null`, `nil`, `undefined`, `nan`, `<null>` hay `none` (hoa thường đều tính). `fields` nêu tên giá trị sai. + - Không gửi cái nào, với tập đã mã hoá: `409` `sdk_required`. - - Gửi cả hai hoặc không gửi cái nào. Chỉ gửi một giá trị sẽ trả `400` `invalid_request`. - - Gửi đúng output thật của SDK. Một giá trị bị từ chối bằng `400` `invalid_device_info` khi, sau khi bỏ khoảng trắng hai đầu, nó ngắn hơn 8 ký tự hoặc là một trong `(null)`, `null`, `nil`, `undefined`, `nan`, `<null>`, `none` (chữ hoa hay thường đều tính). Response liệt kê các trường sai trong `fields`. Thường điều này có nghĩa là một lệnh gọi SDK không trả về gì và code của bạn đã biến nó thành chuỗi. - - Không gửi cả hai cho một tập đã mã hoá sẽ trả `409` `sdk_required`. + Cách đọc chúng trong app: [Player SDK](../player-sdk/index.md). - ## Vé chứa gì + ## Vé chứa gì {#what-the-ticket-contains} | Trường | Mô tả | |---|---| | `vid` | Video ID để tải trong Player SDK. | - | `play_auth_token` | Play token để đưa cho Player SDK. Hãy coi nó là secret. | - | `expires_at` | Thời điểm vé hết hạn, dạng timestamp ISO 8601 theo UTC. | - | `protection` | Mức bảo vệ của nội dung bạn nhận được. `private-encrypted` với các tập được cấp phép. | - | `subtitles` | Mọi phụ đề gắn với tập. Có thể là mảng rỗng. | - - Trên thiết bị, đặt video ID và play token cho Player SDK rồi bắt đầu phát. SDK tự tải playlist và các khoá giải mã được tham chiếu trong đó; code của bạn không phải xử lý khoá. - - ### Kiểm tra `protection` - - Đọc `protection` ở mọi response. Chỉ bán tập trả phí khi giá trị là `private-encrypted`. Nếu bạn nhận được giá trị khác, đừng bán tập đó và hãy liên hệ Wandura. - - ## Thời hạn {#expiry} - - Vé có hiệu lực 30 phút kể từ lúc được cấp. `expires_at` cho biết hạn chót chính xác. - - Khi Player SDK báo lỗi trong lúc phát, kể cả khi vé hết hạn: - - 1. Xin một vé mới từ backend và tải lại player tại vị trí hiện tại. - 2. Nếu request đó thất bại, đọc `error_code` trong response của API để quyết định thông báo gì cho người xem. Xem [Lỗi](errors.md). - - Đừng dựa vào mã lỗi riêng của Player SDK để phát hiện vé hết hạn; chúng khác nhau giữa các phiên bản SDK. Retry một lần, không retry theo vòng lặp. + | `play_auth_token` | Token cho Player SDK. Đây là secret: xem [Bảo mật](security.md#tickets-and-links). | + | `expires_at` | Thời điểm hết hạn (ISO 8601, UTC). | + | `protection` | `private-encrypted` với các tập được cấp phép. | + | `subtitles` | Các file WebVTT, mỗi ngôn ngữ một file; có thể rỗng. Xem [Phụ đề](../guides/subtitles.md). | - ## Lượt phát, prefetch và `intent` + **Kiểm tra `protection`** ở mọi vé. Chỉ bán tập trả phí khi giá trị là `private-encrypted`. Giá trị khác: đừng phát, và báo cho Wandura. - Mỗi request xin vé thành công được ghi nhận phía Wandura và tính là một lượt phát, trừ khi được đánh dấu là prefetch. Nếu app tải tập trước khi người xem chạm vào, hãy báo cho Wandura bằng trường tuỳ chọn `intent`: + Một lô trả về `{ "items": [...] }` theo thứ tự trong request, mỗi phần tử có `status` riêng. Mọi trường: [Xin playback](../reference/playback.md). - | Giá trị | Ý nghĩa | - |---|---| - | `play` | Người xem vừa chạm vào tập. | - | `prefetch` | App đang tải tập trước khi người xem chạm. Không tính là lượt phát. | + ## `intent` {#intent} - `intent` không bao giờ làm thay đổi response. Giá trị bị thiếu hoặc viết sai được ghi nhận là không xác định, không bị từ chối, và request đó vẫn tính là một lượt phát: chỉ `prefetch` được loại khỏi số lượt phát. Request prefetch vẫn tính vào [rate limit](rate-limits.md) của bạn. + | Giá trị | Ý nghĩa | Tính là lượt xem | + |---|---|---| + | `play` | Người xem vừa bắt đầu tập. | Có | + | `prefetch` | App tải tập trước. | Không | + | thiếu hoặc giá trị khác | Ghi nhận là không xác định, không bao giờ bị từ chối. | Có | - Khi gần chạm rate limit, request prefetch bị tạm dừng trước và nhận `429` `rate_limited` kèm `"reason": "prefetch_shed"`, trong khi request play vẫn được cấp vé. Trong lô, phần tử prefetch bị từ chối trước, mỗi phần tử có `429` riêng. Prefetch bị từ chối không phải lỗi với người xem: hãy xin tập đó với `"intent": "play"` khi người xem chạm vào. Xem [Quá tải nhẹ nhàng](rate-limits.md#graceful-overload). + Khi gần chạm rate limit, vé `prefetch` bị từ chối trước (`429` kèm `"reason": "prefetch_shed"`) để vé `play` vẫn chạy đều. Prefetch bị từ chối không phải lỗi với người xem: xin lại tập đó với `"intent": "play"` khi người xem tới tập. Xem [Rate limit](rate-limits.md#graceful-overload). ## `viewer_ref` {#viewer-ref} - `viewer_ref` là một chuỗi opaque tuỳ chọn mà Wandura lưu cùng vé để tra cứu khi hỗ trợ. Hãy dùng định danh phiên hoặc thiết bị của riêng bạn, ví dụ `<user-id>:<device-id>`. Đừng đưa dữ liệu cá nhân như email hay tên vào đây. - - Hãy gửi cùng một `viewer_ref` cho cùng người xem trên cùng thiết bị. Request lặp lại cho cùng một tập, với cùng `viewer_ref`, `intent` (`play` hay `prefetch`) và giá trị thiết bị, trong lúc vé trước còn ít nhất 5 phút, nhận lại đúng vé đó: cùng `play_auth_token`, cùng `expires_at` (không bao giờ gia hạn). Request đó không bị tính vào rate limit hay thành một lượt phát mới. Không có `viewer_ref` thì mỗi request nhận một vé mới. + Một chuỗi opaque tuỳ chọn của bạn, tối đa 256 ký tự, được lưu cùng vé để tra cứu khi hỗ trợ. Hãy làm nó **ổn định theo người xem và thiết bị** và không chứa dữ liệu cá nhân, ví dụ HMAC của user ID cộng hash của install ID. Có nó, Wandura có thể trả lại đúng vé cũ cho request lặp lại thay vì cấp (và tính) vé mới. Quyền riêng tư và thời gian lưu: [Bảo mật](security.md#viewer-data). - ## Phụ đề {#subtitles} + ## Hết hạn và khôi phục {#expiry} - `subtitles` có một phần tử cho mỗi phụ đề gắn với tập: + Vé sống 30 phút (`expires_at`). Khi Player SDK báo lỗi trong lúc phát, kể cả khi vé hết hạn: - | Trường | Mô tả | - |---|---| - | `lang` | Mã ngôn ngữ đúng như studio giao, ví dụ `en`, `vi` hoặc `pt-BR`. | - | `url` | Địa chỉ tải file phụ đề. | - | `format` | Luôn là `webvtt`. | + 1. Xin **một** vé mới và tải lại player tại vị trí hiện tại. + 2. Nếu request đó thất bại, ánh xạ `error_code` của nó sang thông báo cho người xem ([Lỗi](errors.md#viewer-messages)). - - Mảng rỗng nghĩa là chưa có phụ đề nào được gắn. Đó không phải lỗi. - - URL phụ đề không gắn với thời hạn của vé, nên bạn vẫn dùng được sau khi vé hết hạn. Khi Wandura thay một file phụ đề, file mới có URL mới và URL cũ thôi chạy: nếu URL đã lưu bị lỗi, hãy lấy URL hiện tại từ một vé mới. - - Player native có thể nhận URL trực tiếp. Trong web player, đừng thêm thuộc tính `crossorigin` vào thẻ video để tải phụ đề bằng `<track>`: việc đó thay đổi cách chính video được request và có thể khiến video không phát được. Thay vào đó, hãy tải file WebVTT bằng `fetch` và thêm cue bằng `video.addTextTrack()`. + Đừng rẽ nhánh theo mã lỗi riêng của Player SDK (chúng đổi giữa các phiên bản) và không bao giờ retry theo vòng lặp. Khi app quay lại từ nền mà vé còn dưới một phút, hãy thay vé trước khi phát tiếp. - ## Liên quan + ## Liên quan {#related} - - [Tài liệu tham chiếu playback](../reference/playback.md) - - [Lỗi](errors.md) - - [Rate limit](rate-limits.md) + - [Luồng playback và paywall](../guides/playback-flow.md): endpoint phía backend, kèm code. + - [Phát mượt khi tải cao](../guides/smooth-playback.md) + - [Xin playback](../reference/playback.md)
- 02/10/2026 · +2 −2 dòng
Xem thay đổi
⋯ `intent` không bao giờ làm thay đổi response. Giá trị bị thiếu hoặc viết sai được ghi nhận là không xác định, không bị từ chối, và request đó vẫn tính là một lượt phát: chỉ `prefetch` được loại khỏi số lượt phát. Request prefetch vẫn tính vào [rate limit](rate-limits.md) của bạn. - **Đang triển khai:** khi gần chạm rate limit, request prefetch bị tạm dừng trước và nhận `429` `rate_limited` kèm `"reason": "prefetch_shed"`, trong khi request play vẫn được cấp vé. Trong lô, phần tử prefetch bị từ chối trước, mỗi phần tử có `429` riêng. Prefetch bị từ chối không phải lỗi với người xem: hãy xin tập đó với `"intent": "play"` khi người xem chạm vào. Xem [Quá tải nhẹ nhàng](rate-limits.md#graceful-overload). + Khi gần chạm rate limit, request prefetch bị tạm dừng trước và nhận `429` `rate_limited` kèm `"reason": "prefetch_shed"`, trong khi request play vẫn được cấp vé. Trong lô, phần tử prefetch bị từ chối trước, mỗi phần tử có `429` riêng. Prefetch bị từ chối không phải lỗi với người xem: hãy xin tập đó với `"intent": "play"` khi người xem chạm vào. Xem [Quá tải nhẹ nhàng](rate-limits.md#graceful-overload). ## `viewer_ref` {#viewer-ref} ⋯ `viewer_ref` là một chuỗi opaque tuỳ chọn mà Wandura lưu cùng vé để tra cứu khi hỗ trợ. Hãy dùng định danh phiên hoặc thiết bị của riêng bạn, ví dụ `<user-id>:<device-id>`. Đừng đưa dữ liệu cá nhân như email hay tên vào đây. - **Đang triển khai:** hãy gửi cùng một `viewer_ref` cho cùng người xem trên cùng thiết bị. Request lặp lại cho cùng một tập, với cùng `viewer_ref`, `intent` (`play` hay `prefetch`) và giá trị thiết bị, trong lúc vé trước còn ít nhất 5 phút, nhận lại đúng vé đó: cùng `play_auth_token`, cùng `expires_at` (không bao giờ gia hạn). Request đó không bị tính vào rate limit hay thành một lượt phát mới. Không có `viewer_ref` thì mỗi request nhận một vé mới. + Hãy gửi cùng một `viewer_ref` cho cùng người xem trên cùng thiết bị. Request lặp lại cho cùng một tập, với cùng `viewer_ref`, `intent` (`play` hay `prefetch`) và giá trị thiết bị, trong lúc vé trước còn ít nhất 5 phút, nhận lại đúng vé đó: cùng `play_auth_token`, cùng `expires_at` (không bao giờ gia hạn). Request đó không bị tính vào rate limit hay thành một lượt phát mới. Không có `viewer_ref` thì mỗi request nhận một vé mới. ## Phụ đề {#subtitles} ⋯
- 02/10/2026 · +5 −1 dòng
Xem thay đổi
⋯ `intent` không bao giờ làm thay đổi response. Giá trị bị thiếu hoặc viết sai được ghi nhận là không xác định, không bị từ chối, và request đó vẫn tính là một lượt phát: chỉ `prefetch` được loại khỏi số lượt phát. Request prefetch vẫn tính vào [rate limit](rate-limits.md) của bạn. - ## `viewer_ref` + **Đang triển khai:** khi gần chạm rate limit, request prefetch bị tạm dừng trước và nhận `429` `rate_limited` kèm `"reason": "prefetch_shed"`, trong khi request play vẫn được cấp vé. Trong lô, phần tử prefetch bị từ chối trước, mỗi phần tử có `429` riêng. Prefetch bị từ chối không phải lỗi với người xem: hãy xin tập đó với `"intent": "play"` khi người xem chạm vào. Xem [Quá tải nhẹ nhàng](rate-limits.md#graceful-overload). + ## `viewer_ref` {#viewer-ref} + `viewer_ref` là một chuỗi opaque tuỳ chọn mà Wandura lưu cùng vé để tra cứu khi hỗ trợ. Hãy dùng định danh phiên hoặc thiết bị của riêng bạn, ví dụ `<user-id>:<device-id>`. Đừng đưa dữ liệu cá nhân như email hay tên vào đây. + **Đang triển khai:** hãy gửi cùng một `viewer_ref` cho cùng người xem trên cùng thiết bị. Request lặp lại cho cùng một tập, với cùng `viewer_ref`, `intent` (`play` hay `prefetch`) và giá trị thiết bị, trong lúc vé trước còn ít nhất 5 phút, nhận lại đúng vé đó: cùng `play_auth_token`, cùng `expires_at` (không bao giờ gia hạn). Request đó không bị tính vào rate limit hay thành một lượt phát mới. Không có `viewer_ref` thì mỗi request nhận một vé mới. + ## Phụ đề {#subtitles} ⋯
- 02/10/2026 · +1 −1 dòng
Xem thay đổi
⋯ Xin một vé cho mỗi lần bắt đầu phát: khi người xem chạm vào một tập, hoặc khi app tải trước tập kế tiếp. Đừng xin vé hàng loạt rồi lưu lại, vì mỗi vé hết hạn 30 phút sau khi được cấp. - Mỗi request chỉ dành cho đúng một tập. Không có endpoint batch. + Một request có thể gồm tới ba tập: tập đang phát cộng tối đa hai tập kế, bằng `next` hoặc `episodes`. Xem [Phát mượt khi tải cao](../guides/smooth-playback.md#request-early). Wandura kiểm tra giấy phép của bạn ở mọi request: tổ chức của bạn phải đang hoạt động, và giấy phép streaming cho phim phải đang hoạt động và nằm trong khung thời gian. Có mặt trong catalog không đảm bảo được cấp vé; request xin vé là bước kiểm tra cuối cùng. ⋯
- 01/10/2026 · +6 −6 dòng
Xem thay đổi
⋯ ## Khi nào xin vé - Xin một vé cho mỗi lần bắt đầu phát: khi người xem chạm vào một tập, hoặc khi app tải trước tập kế tiếp. Đừng xin vé hàng loạt rồi lưu lại, vì mỗi vé hết hạn trong vòng vài phút. + Xin một vé cho mỗi lần bắt đầu phát: khi người xem chạm vào một tập, hoặc khi app tải trước tập kế tiếp. Đừng xin vé hàng loạt rồi lưu lại, vì mỗi vé hết hạn 30 phút sau khi được cấp. Mỗi request chỉ dành cho đúng một tập. Không có endpoint batch. ⋯ | `drm_kek` | Device public key do Player SDK tạo ra. Private key tương ứng không bao giờ rời khỏi thiết bị. | - Bộ tài liệu onboarding Player SDK của bạn ghi rõ các lệnh gọi SDK cụ thể. Wandura cung cấp giấy phép SDK và đăng ký bundle ID hoặc package name của app bạn trong quá trình onboarding. + Hướng dẫn Player SDK ở partner.wandura.ai → **Developers** → **Player SDK** ghi rõ các lệnh gọi SDK cụ thể; hướng dẫn có sau khi [onboarding](../before-you-start.md#get-onboarded), cho thành viên vai **Developer** hoặc **Admin**. Wandura đăng ký app ID của bạn và cấp license Player SDK; tổ chức của bạn trả tiền license đó. Quy tắc cho giá trị thiết bị: - Gửi cả hai hoặc không gửi cái nào. Chỉ gửi một giá trị sẽ trả `400` `invalid_request`. - - Gửi đúng output thật của SDK. Giá trị trông như rỗng, ví dụ chuỗi `"(null)"`, `"null"` hoặc `"undefined"`, hoặc ngắn hơn 8 ký tự, sẽ trả `400` `invalid_device_info`. Response liệt kê các trường sai trong `fields`. Thường điều này có nghĩa là một lệnh gọi SDK không trả về gì và code của bạn đã biến nó thành chuỗi. + - Gửi đúng output thật của SDK. Một giá trị bị từ chối bằng `400` `invalid_device_info` khi, sau khi bỏ khoảng trắng hai đầu, nó ngắn hơn 8 ký tự hoặc là một trong `(null)`, `null`, `nil`, `undefined`, `nan`, `<null>`, `none` (chữ hoa hay thường đều tính). Response liệt kê các trường sai trong `fields`. Thường điều này có nghĩa là một lệnh gọi SDK không trả về gì và code của bạn đã biến nó thành chuỗi. - Không gửi cả hai cho một tập đã mã hoá sẽ trả `409` `sdk_required`. ⋯ ## Lượt phát, prefetch và `intent` - Mỗi request xin vé thành công được ghi nhận phía Wandura và tính là một lượt phát. Nếu app tải tập trước khi người xem chạm vào, hãy báo cho Wandura bằng trường tuỳ chọn `intent`: + Mỗi request xin vé thành công được ghi nhận phía Wandura và tính là một lượt phát, trừ khi được đánh dấu là prefetch. Nếu app tải tập trước khi người xem chạm vào, hãy báo cho Wandura bằng trường tuỳ chọn `intent`: | Giá trị | Ý nghĩa | ⋯ | `prefetch` | App đang tải tập trước khi người xem chạm. Không tính là lượt phát. | - `intent` không bao giờ làm thay đổi response. Giá trị bị thiếu hoặc viết sai được ghi nhận là không xác định, không bị từ chối. Request prefetch vẫn tính vào [rate limit](rate-limits.md) của bạn. + `intent` không bao giờ làm thay đổi response. Giá trị bị thiếu hoặc viết sai được ghi nhận là không xác định, không bị từ chối, và request đó vẫn tính là một lượt phát: chỉ `prefetch` được loại khỏi số lượt phát. Request prefetch vẫn tính vào [rate limit](rate-limits.md) của bạn. ## `viewer_ref` ⋯ - Mảng rỗng nghĩa là chưa có phụ đề nào được gắn. Đó không phải lỗi. - - URL phụ đề không gắn với thời hạn của vé, nên bạn vẫn dùng được sau khi vé hết hạn. + - URL phụ đề không gắn với thời hạn của vé, nên bạn vẫn dùng được sau khi vé hết hạn. Khi Wandura thay một file phụ đề, file mới có URL mới và URL cũ thôi chạy: nếu URL đã lưu bị lỗi, hãy lấy URL hiện tại từ một vé mới. - Player native có thể nhận URL trực tiếp. Trong web player, đừng thêm thuộc tính `crossorigin` vào thẻ video để tải phụ đề bằng `<track>`: việc đó thay đổi cách chính video được request và có thể khiến video không phát được. Thay vào đó, hãy tải file WebVTT bằng `fetch` và thêm cue bằng `video.addTextTrack()`. ⋯
- 01/10/2026 · +1 −1 dòng
Xem thay đổi
⋯ ### Kiểm tra `protection` - Đọc `protection` ở mọi response. Chỉ bán tập trả phí khi giá trị là `private-encrypted`. Nếu bạn nhận được giá trị khác, đừng bán tập đó và hãy liên hệ đầu mối đối tác Wandura của bạn. + Đọc `protection` ở mọi response. Chỉ bán tập trả phí khi giá trị là `private-encrypted`. Nếu bạn nhận được giá trị khác, đừng bán tập đó và hãy liên hệ Wandura. ## Thời hạn {#expiry} ⋯
- 29/09/2026 · Tạo trang