<!-- (Đây là comment)Dù sao đây cũng chỉ là template nên không nhất thiết phải chèn tất cả các mục vào -->
<!-- (Đây là comment) Template thêm chức năng -->
# Khái quát
- Bật xác thực mã hóa trong chế độ Pseudo Live
### Task cần làm:[Task](#Task)
### Detail design:[Nội dung đề xuất](#Nội dung đề xuất)
# Mục đích
Cung cấp cho User bản livestream đã được mã hóa và xác thực trong chế độ Pseudo Live (Vì nhu cầu này rất lớn trong lĩnh vực giải trí)
# Nội dung đề xuất
## ■ Flow xử lý
- Thực hiện xử lý flow này cho những trường hợp bên dưới
- Ẩn nắp live
- Khi thay đổi chất lượng video
※Vì phần background xám đã có xử lý sẵn có rồi nên không cần thêm , Phần cần thực hiện sửa, thêm xử lý là phần background đỏ**
```mermaid
graph TD
A[Livestream mã hóa / xác thực] --> B{Loại livestream }
B -->|Pseudo Live| D1(Có hiển thị Live Thumbnail trước khi bắt bắt đầu livestream không)
D1 --> |Không hiển thị |D2(Ẩn Live Thumbnail trước khi bắt đầu livestream)
D2 --> D4(Get thông tin setting Pseudo Live)
D4 --> DA(Get thông tin setting video)
DA --> F
F{Flag Livestream mã hóa / xác thực có đang enable không }
F --> |Enable|Fa1(set off preload)
Fa1 --> G(Chờ thao tác phát lần đầu)
G --> H{Đã có thao tác phát lần đầu chưa}
H --> |Vẫn chưa có thao tác phát|G
H --> |Đã thác phát|I{"Có sử dụng xác thực JCloud không "}
I --> |Có dùng|J(Request xác thực bằng API xác thực)
I --> |Không dùng|La1
J --> Ka1{Kết quả request API xác thực ntn}
Ka1 --> |Xác thực OK|Ka2(Set URL xem đã get đc thành URL xem hiện tại)
Ka2 --> L{"Thao tác phát"}
L --> |Fail|LErr(Hiển thị MH Error)
L --> |Pass|La1(PhátPhát)
Ka1 --> |Xác thực NG|KErr(Hiển thị MH Error)
KErr --> Z(Kết thúc)
LErr --> Z(Kết thúc)
M(Xử lý thay đổi chất lượng video) --> I
%% Setting màu background cho các Chart
style D4 fill:#ff8080
style F fill:#ff8080
style Fa1 fill:#ff8080
style I fill:#ff8080
style J fill:#ff8080
style Ka1 fill:#ff8080
style KErr fill:#ff8080
```
## Get thông tin setting Pseudo Live
- Data type của `LiveMetafileModel.streamId`đc thay đổi
- **※Dự định share sau khi chốt detail **
## Flag Livestream mã hóa / xác thực có enable không
- Các mục bên dưới đc thêm vào Response API của File live meta
|Property|Type|Detail|
|-|-|-|
|`hls_auth_enable`|`string`|`"0"`:Flag livesream mã hóa / xác thực là disable br>`"1"`:Flag livestream mã hóa / xác thực là enable|
- Sử dụng Property sẵn có như bên dưới để thực hiện phán đoán
|Tên file|Tên Class|Tên Property|Detail|
|-|-|-|-|
|`live_metafile_model.ts`|`LiveMetafileModel`|`enableAuthentication`|`true`: Flag livestream mã hóa/ xác thực đang enable<br>`false`: Flag livestream mã hóa/ xác thực đang disabledisable|
**※Các mục bên dưới đã đc thêm vào response API của file live meta rồi nhưng vốn đã có cả xử lý thêm vào `LiveMetafileModel.enableAuthentication` rồi nên không cần thêm property nữa**
## Set off cho preload
- Chỉ TH Flag livestream mã hóa/ xác thực đang enable thì mới set `preload` thành `off`
**▽Lí do off cài preload như dưới đây**
Khi mã hóa/ xác thực enable thì trong file live mate sẽ không có URL xem
Vì thế khi định tham chiếu đến URL xem (mà nó không tồn tại khi preload) sẽ dẫn đến error
## Có sử dụng Chức năng xác thực của JCloud không
- Sử dụng property sẵn có bên dưới để thực hiện phán định
|File Name|Class Name|Property Name|Details|
|-|-|-|-|
|`live_metafile_model.ts`|`LiveMetafileModel`|`enableAuthentication`|`true`: Flag Livestream mã hóa / xác thực enable <br>`false`: Flag Livestream mã hóa / xác thực disabledisable|
**※Bên trong hàm có sẵn `encryptionLive.ts > parseEncryptionLive` đang thực hiện phán định bên dưới nên lần này không cần thêm nữa**
```
async parseEncryptionLive(enableAuthentication: boolean): Promise<void> {
if (!enableAuthentication) {
return;
}
...
```
## Request xác thực bằng API xác thực
- Gửi request tới API xác thực dùng cho Pseudo live rồi get URL dùng để xem
- Gửi request chỉ chứa stream ID của chất lượng video xem
```
VD)TH gửi request với Chất lượng video hiện tại là「低画質_Thấp」
{
cid: "6769",
flpid: "100",
stream_id: {
low: "EC53eNaX2jeoR6DbwWIi"
},
stream_id_main: {
low: "EC53eNaX2jeoR6DbwWIi"
},
stream_id_back: {
low: "EC53eNaX2jeoR6DbwWIi"
},
}
```
### URL request
|Môi trường|URL|
|-|-|
|Mtrg dev|`https://live-dev.stream.co.jp/eqlive/filetolive/encryptLive`|
Mtg Staging|`https://live-stg.stream.co.jp/eqlive/filetolive/encryptLive`|
|Mtrg product|`https://live.stream.co.jp/eqlive/filetolive/encryptLive`|
### Param request
|Item Name|Type|Details|
|-|-|-|
|cid|`string`|ID hợp đồng|
|flpid|`string`|Pseudo Live Profile ID|
|stream_id|`object`|Object đã tổng hợp stream ID theo chất lượng video|
|stream_id_main|`object`|Object đã tổng hợp stream ID theo chất lượng video(Main system only)|
|stream_id_back|`object`|Object đã tổng hợp stream ID theo chất lượng video(Back system only)|
||Item Name|Type|Details
|-|-|-|-|
|stream_id |master|`string` or `undefined`|Stream ID(Chất lượng master)|
| |low|`string` or `undefined`|Stream ID(Chất lượng thấp)|
| |standard|`string` or `undefined`|tream ID(Chất lượng tiêu chuẩn)|
| |high|`string` or `undefined`|Stream ID(Chất lượng cao)|
| |hd|`string` or `undefined`|Stream ID(Chất lượng HD)|
| |fhd|`string` or `undefined`|Stream ID(Chất lượng fullHD)|
|stream_id_main|master|`string` or `undefined`|Stream ID(Chất lượng master)|
| |low|`string` or `undefined`|Stream ID(Chất lượng thấp)|
| |standard|`string` or `undefined`|Stream ID(Chất lượng tiêu chuẩn)|
| |high|`string` or `undefined`|Stream ID(Chất lượng cao)|
| |hd|`string` or `undefined`|Stream ID(Chất lượng HD)|
| |fhd|`string` or `undefined`|Stream ID(Chất lượng fullHD)|
|stream_id_back|master|`string` or `undefined`|Stream ID(Chất lượng master)|
| |low|`string` or `undefined`|Stream ID(Chất lượng thấp)|
| |standard|`string` or `undefined`|Stream ID(Chất lượng tiêu chuẩn)|
| |high|`string` or `undefined`|Stream ID(Chất lượng cao)|
| |hd|`string` or `undefined`|Stream ID(Chất lượng HD)|
| |fhd|`string` or `undefined`|Stream ID(Chất lượng fullHD)|
**Sử dụng `encryptionLive.ts > parseEncryptionLive` đang có để xử lý request API
# Kết quả request API xác thực ntn
Thực hiện phán định [Xác thực OK] [Xác thực NG] dựa vào response của [Request xác thực bằng API xác thực](#request xác thực bằng api xác thực)
VD)Response API trong TH request video chất lượng thấp tới API xác thực
※Chỉ có URL xem đc trả về với chất lượng video đã request
```
{
response: 200,
wlives: {
low: "https://xxx.stream.co.jp/aaaaa.m3u8",
},
wlives_main: {
low: "https://xxx.stream.co.jp/bbbbb.m3u8",
},
wlives_back: {
low: "https://xxx.stream.co.jp/ccccc.m3u8",
},
}
```
### Response
|Properties|Types|Details|
|-|-|-|
|`response`|`number`|Status Code|
|`wlives`|`object`|Object dùng để lưu URL xem|
||Itemname|Type|Detail|
|-|-|-|-|
|wlives |master|`string` or `undefined`|URL để xem(Chất lượng master)|
| |low|`string` or `undefined`|URL để xem(Chất lượng thấp )|
| |standard|`string` or `undefined`|URL để xem(Chất lượng tiêu chuẩn )|
| |high|`string` or `undefined`|URL để xem(Chất lượng cao )|
| |hd|`string` or `undefined`|URL để xem(Chất lượng HD )|
| |fhd|`string` or `undefined`|URL để xem(Chất lượng fullHD)|
|wlives_main|master|`string` or `undefined`|URL để xem(Chất lượng master)|
| |low|`string` or `undefined`|URL để xem(Chất lượng thấp )|
| |standard|`string` or `undefined`|URL để xem(Chất lượng tiêu chuẩn )|
| |high|`string` or `undefined`|URL để xem(Chất lượng cao )|
| |hd|`string` or `undefined`|URL để xem(Chất lượng HD )|
| |fhd|`string` or `undefined`|URL để xem(Chất lượng fullHD)|
|wlives_back|master|`string` or `undefined`|URL để xem(Chất lượng master)|
| |low|`string` or `undefined`|URL để xem(Chất lượng thấp )|
| |standard|`string` or `undefined`|URL để xem(Chất lượng tiêu chuẩn )|
| |high|`string` or `undefined`|URL để xem(Chất lượng cao )|
| |hd|`string` or `undefined`|URL để xem(Chất lượng HD )|
| |fhd|`string` or `undefined`|URL để xem(Chất lượng fullHD)|
- Bên dưới là điều kiện phán định kết quả xác thực
|Điều kiện|Xử lý tiếp theo|
|-|-|
|Nếu `response`không phải `200` thì |[Hiển thị màn hình Error](#Hiển thị màn hình Error)|
|Nếu `wlives` là object rỗng thì |[Hiển thị màn hình Error](#Hiển thị màn hình Error)|
|Nếu đã quá 30s kể từ khi request mà vẫn chưa có response thì |[Hiển thị màn hình Error](#Hiển thị màn hình Error)|
|Nếu tồn tại `wlives` và không phải là object rỗng thì |[Set URL xem đã get đc thành URL xem hiện tại](#Set URL xem đã get đc thành URL xem hiện tại)|
**※Không có trong `encryptionLive.ts > parseEncryptionLive`, Thêm [TH đã quá 30s kể từ khi request mà vẫn chưa có response**
## Set URL đã get đc thành URL xem hiện tại
- Ghi đè URL có chưa response của [Kết quả request API xác thực ntn](#Kết quả rquest api xác thực ntnvào URL hiện có
URL xem hiện có đc hold như bên dưới
|Tên file|Tên property|
|-|-|
|`EQCoreParams.ts`|`movieURLList`|
VD1)TH đã phát live mà có chất lượng video default là [Chất lượng thấp]
- get `wilives.low` từ response API xác thực
- Thay thế `wlives.low` thành `EQCoreParams.movieURLList.lq`
VD2)TH chuyển chất lượng video thành [Chất lượng cao]
- Get `wilives.high` từ response của API xác thực
- Thay thế `wlives.high` thành `EQCoreParams.movieURLList.hq`
**※Vì sẽ sử dụng `EQCore.ts > rewriteLiveUrl`hiện có nên lần này không cần thêm nữa**
## Hiển thị màn hình Error
- Cho hiển thị error bên dưới
- `P5202`(Error khi việc xác thực live mã hóa bị fail)
※※Cách hiển thị error thì như trong[ドDocument]
Tham khảo (https://gitlab.stream.co.jp/developer/player/eqplayer-with-jsplayer/-/blob/develop/docs/error/%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E8%A1%A8%E7%A4%BA.md)
**※Vì trong `encryptionLive.ts > parseEncryptionLive` hiện có đã có xử lý hiển thị error rồi nên lần này không cần thêm vào nữa **
# Task
#### ※Bên dưới đây có mô tả sourrce code thực tế nhưng nếu có phương pháp code nào ok hơn thì bên mình cứ đề xuất nhé ạ 。
<br>
<br>
- [ ] **Thêm phán định flag Mã hóa/ xác thực**
Thêm xử lý [Phán định flag Mã hóa / Xác thực] [Thay đổi Preload] vào phía trước resolve của `EQCore.ts > getLiveMetafilePromise`
```
if (this.liveMetafileModel.enableAuthentication) {
this.params.eqPlayerParams.settings.preload == "off";
}
```
<br>
<br>
- [ ] **Tạo hàm số để get URL request API xác thực**
|Tên hàm số|Đối số|Giá trị trả về|Details|
|-|-|-|-|
|Get request URL request của |getRequestParams|`object`|API xác thực|
<br>
※Chi tiết tham khảo bên dưới
- Nếu type của Player là Live (`this.EQCore.params.playerMode === EQCore.LIVE`)thì cho trả về như bên dưới
- Chỉ trích xuất và set chất lượng phù hợp với `EQCore.ts currentQuality` từ `this.EQCore.liveMetafileModel.streamId`, `this.EQCore.liveMetafileModel.streamIdForMain`, `this.EQCore.liveMetafileModel.streamIdForBackup`
```
VD)Nếu currentQuality là「0」thì sẽ có giá trị trả về như bên dưới
{
cid: this.EQCore.params.eqPlayerParams.contractId,
lpid: this.EQCore.params.eqPlayerParams.lpid,
stream_id: {
master: "2IfQMQP5FgtdVvF7rqB6",
},
stream_id_main: {
master: "2IfQMQP5FgtdVvF7rqB6",
},
stream_id_back: {
master: "2IfQMQP5FgtdVvF7rqB6",
},
}
```
- Nếu type của Player à Pseudo live (`this.EQCore.params.playerMode === EQCore.FL`)thì trả về giá trị bên dưới
- Chỉ trích xuất và set chất lượng video phù hợp với `EQCore.ts currentQuality` từ `this.EQCore.liveMetafileModel.streamId`, `this.EQCore.liveMetafileModel.streamIdForMain`, `this.EQCore.liveMetafileModel.streamIdForBackup`
```
VD )Nếu currentQuality là「0」thì giá trị trả về sẽ như bên dưới
{
cid: this.EQCore.params.eqPlayerParams.contractId,
flpid: this.EQCore.params.eqPlayerParams.flpid,
stream_id: {
master: "2IfQMQP5FgtdVvF7rqB6",
},
stream_id_main: {
master: "2IfQMQP5FgtdVvF7rqB6",
},
stream_id_back: {
master: "2IfQMQP5FgtdVvF7rqB6",
},
}
```
※Sự kết hợp của `currentQuality 'và item name của Stream ID như sau
|currentQuality|Property của streamId|
|-|-|
|`0`|`master`|
|`1`|`low`|
|`2`|`standard`|
|`3`|`high`|
|`4`|`hd`|
|`5`|`fhd`|
|`9`|`original`|
<br>
<br>
- [ ] **Tạo hàm số để get URL request API xác thực**
|Tên hàm số|Đối số|Giá trị trả về|Details|
|-|-|-|-|
|Get request URL request của |getRequestURL|`string`|API xác thực|
<br>
※Chi tiết tham khảo bên dưới
Nếu Player Type là Live(`this.EQCore.params.playerMode === EQCore.LIVE`)thì trả về như bên dưới
```
https://live.stream.co.jp/eqlive/encryptLive
```
Nếu Player Type là Pseudo Live(`this.EQCore.params.playerMode === EQCore.FL`)thì trả về như bên dưới
```
https://live.stream.co.jp/eqlive/filetolive/encryptLive
```
<br>
<br>
- [ ] **Truyền param, URL request vào API xác thực**
- Truyền param, URL request vào hàm số `requestAuthentication` đang call bằng `encryptionLive.ts`
- Param :Get từ `getRequestParams`
- URL request:Get từ `getRequestURL`
```
[encryption.ts]
const authentication = new EncryptionAuthenticationApi(this.EQCore);
const response = await authentication.requestAuthentication(params, requestURL);
```
<br>
<br>
- [ ] **Thêm [Trường hợp đã quá 30s kể từ khi request mà vẫn chưa có response] vào Điều kiện xác thực fail**
- Thêm xử lý thỏa mãn những cái bên dưới vào trong `encryptionLive.ts`
- Nếu đã quá 30s kể từ khi request mà vẫn chưa có response thì hiển thị MH Error
- Error Code là `P5202`, Phương pháp hiẹn thị MH eror thì tham chiều code bên dưới
- ※Về mắt logic thì nếu có phương pháp ok hơn thì bên mình cứ đề xuất nhé
```
[Phương pháp hiển thị MH Error]
StatusHelper.throw(
this.EQCore,
StatusCodeDefinition.P5202,
this.EQCore.statusView
);
```