Skip to content

Commit 780a517

Browse files
author
markjrzhang
committed
update PrivateM3U8 API
1 parent 74aeef8 commit 780a517

File tree

5 files changed

+137
-10
lines changed

5 files changed

+137
-10
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@
150150
<artifactId>xstream</artifactId>
151151
<version>1.4.20</version>
152152
</dependency>
153+
154+
<dependency>
155+
<groupId>com.auth0</groupId>
156+
<artifactId>java-jwt</artifactId>
157+
<version>4.4.0</version>
158+
</dependency>
153159
</dependencies>
154160

155161
<distributionManagement>

src/main/java/com/qcloud/cos/COS.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
import com.qcloud.cos.model.ciModel.job.v2.*;
5252
import com.qcloud.cos.model.ciModel.mediaInfo.MediaInfoRequest;
5353
import com.qcloud.cos.model.ciModel.mediaInfo.MediaInfoResponse;
54+
import com.qcloud.cos.model.ciModel.metaInsight.CreateDatasetRequest;
55+
import com.qcloud.cos.model.ciModel.metaInsight.CreateDatasetResponse;
5456
import com.qcloud.cos.model.ciModel.persistence.AIGameRecResponse;
5557
import com.qcloud.cos.model.ciModel.persistence.CIUploadResult;
5658
import com.qcloud.cos.model.ciModel.persistence.AIRecRequest;
@@ -3256,6 +3258,8 @@ SelectObjectContentResult selectObjectContent(SelectObjectContentRequest selectR
32563258
InputStream getPlayList(GetPlayListRequest request);
32573259

32583260
RecognizeLogoResponse recognizeLogo(RecognizeLogoRequest customRequest);
3261+
3262+
CreateDatasetResponse createDataset(CreateDatasetRequest customRequest);
32593263
}
32603264

32613265

src/main/java/com/qcloud/cos/COSClient.java

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@
102102
import com.qcloud.cos.model.ciModel.job.v2.*;
103103
import com.qcloud.cos.model.ciModel.mediaInfo.MediaInfoRequest;
104104
import com.qcloud.cos.model.ciModel.mediaInfo.MediaInfoResponse;
105+
import com.qcloud.cos.model.ciModel.metaInsight.CreateDatasetRequest;
106+
import com.qcloud.cos.model.ciModel.metaInsight.CreateDatasetResponse;
105107
import com.qcloud.cos.model.ciModel.persistence.AIGameRecResponse;
106108
import com.qcloud.cos.model.ciModel.persistence.CIUploadResult;
107109
import com.qcloud.cos.model.ciModel.persistence.AIRecRequest;
@@ -139,14 +141,7 @@
139141
import com.qcloud.cos.model.transform.ObjectTaggingXmlFactory;
140142
import com.qcloud.cos.region.Region;
141143
import com.qcloud.cos.retry.RetryUtils;
142-
import com.qcloud.cos.utils.Base64;
143-
import com.qcloud.cos.utils.BinaryUtils;
144-
import com.qcloud.cos.utils.DateUtils;
145-
import com.qcloud.cos.utils.Jackson;
146-
import com.qcloud.cos.utils.Md5Utils;
147-
import com.qcloud.cos.utils.ServiceUtils;
148-
import com.qcloud.cos.utils.StringUtils;
149-
import com.qcloud.cos.utils.UrlEncoderUtils;
144+
import com.qcloud.cos.utils.*;
150145
import com.qcloud.cos.http.TimeOutCosHttpClient;
151146

152147
import org.apache.commons.codec.DecoderException;
@@ -5102,7 +5097,6 @@ public GetHLSPlayKeyResponse getHLSPlayKey(GetHLSPlayKeyRequest customRequest) {
51025097

51035098
CosHttpRequest<GetHLSPlayKeyRequest> request = createRequest(customRequest.getBucketName(), "/playKey", customRequest , HttpMethodName.GET);
51045099

5105-
51065100
return invoke(request, new Unmarshallers.CICommonUnmarshaller<GetHLSPlayKeyResponse>(GetHLSPlayKeyResponse.class));
51075101
}
51085102

@@ -5132,11 +5126,25 @@ public MediaListTemplateResponse describeMediaTemplatesV2(MediaTemplateRequest r
51325126

51335127
@Override
51345128
public InputStream getPlayList(GetPlayListRequest getPlayListRequest) {
5135-
CosHttpRequest<GetPlayListRequest> request = createRequest(getPlayListRequest.getBucketName(), "/getplaylist", getPlayListRequest, HttpMethodName.GET);
5129+
CosHttpRequest<GetPlayListRequest> request = createRequest(getPlayListRequest.getBucketName(), getPlayListRequest.getObject(), getPlayListRequest, HttpMethodName.GET);
5130+
request.addParameter("ci-process","pm3u8");
51365131
addParameterIfNotNull(request, "object", getPlayListRequest.getObject());
51375132
addParameterIfNotNull(request, "expires", getPlayListRequest.getExpires());
5133+
addParameterIfNotNull(request, "tokenType", getPlayListRequest.getTokenType());
5134+
addParameterIfNotNull(request, "token", getPlayListRequest.getToken());
5135+
51385136
return invoke(request, new CIGetSnapshotResponseHandler());
51395137
}
5138+
//@Override
5139+
// public InputStream getPlayList(GetPlayListRequest getPlayListRequest) {
5140+
// CosHttpRequest<GetPlayListRequest> request = createRequest(getPlayListRequest.getBucketName(), "/getplaylist", getPlayListRequest, HttpMethodName.GET);
5141+
// addParameterIfNotNull(request, "object", getPlayListRequest.getObject());
5142+
// addParameterIfNotNull(request, "expires", getPlayListRequest.getExpires());
5143+
// addParameterIfNotNull(request, "tokenType", getPlayListRequest.getTokenType());
5144+
// addParameterIfNotNull(request, "token", getPlayListRequest.getToken());
5145+
//
5146+
// return invoke(request, new CIGetSnapshotResponseHandler());
5147+
// }
51405148

51415149
@Override
51425150
public RecognizeLogoResponse recognizeLogo(RecognizeLogoRequest customRequest) {
@@ -5148,7 +5156,39 @@ public RecognizeLogoResponse recognizeLogo(RecognizeLogoRequest customRequest) {
51485156
return invoke(request, new Unmarshallers.CICommonUnmarshaller<RecognizeLogoResponse>(RecognizeLogoResponse.class));
51495157
}
51505158

5159+
@Override
5160+
public CreateDatasetResponse createDataset(CreateDatasetRequest customRequest) {
5161+
rejectNull(customRequest, "The request parameter must be specified setting the object tags");
5162+
5163+
CosHttpRequest<CreateDatasetRequest> request = createRequest(customRequest.getAppId(), "/dataset", customRequest , HttpMethodName.POST);
5164+
request.addHeader("Accept", "application/json");
5165+
this.setContent(request, CIJackson.toJsonString(request).getBytes(), "application/json", false);
5166+
return invoke(request, new Unmarshallers.CICommonUnmarshaller<CreateDatasetResponse>(CreateDatasetResponse.class));
5167+
}
51515168

51525169

5170+
public String generateCosDomainPrivateM3U8Url(PrivateM3U8Request privateM3U8Request) {
5171+
CosHttpRequest<PrivateM3U8Request> request = createRequest(privateM3U8Request.getBucketName(), privateM3U8Request.getObject(), privateM3U8Request, HttpMethodName.GET);
5172+
request.addParameter("ci-process","pm3u8");
5173+
addParameterIfNotNull(request, "object", privateM3U8Request.getObject());
5174+
addParameterIfNotNull(request, "expires", privateM3U8Request.getExpires());
5175+
addParameterIfNotNull(request, "tokenType", privateM3U8Request.getTokenType());
5176+
addParameterIfNotNull(request, "token", privateM3U8Request.getToken());
5177+
5178+
return buildPrivateM3U8Url(request,clientConfig);
5179+
}
5180+
5181+
private String buildPrivateM3U8Url(CosHttpRequest<PrivateM3U8Request> request, ClientConfig clientConfig) {
5182+
Date expiredTime = new Date(System.currentTimeMillis() + clientConfig.getSignExpired() * 1000);
5183+
HashMap<String, String> params = new HashMap<>();
5184+
params.put("ci-process", "pm3u8");
5185+
PrivateM3U8Request originalRequest = request.getOriginalRequest();
5186+
putIfNotNull(params, "object", originalRequest.getObject());
5187+
putIfNotNull(params, "expires", originalRequest.getExpires());
5188+
putIfNotNull(params, "tokenType", originalRequest.getTokenType());
5189+
putIfNotNull(params, "token", originalRequest.getToken());
5190+
URL url = generatePresignedUrl(request.getBucketName(), request.getResourcePath(), expiredTime, HttpMethodName.GET, new HashMap<String, String>(), params, false, false);
5191+
return url.toString();
5192+
}
51535193
}
51545194

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.qcloud.cos.demo.ci;
2+
3+
import com.auth0.jwt.JWT;
4+
import com.auth0.jwt.JWTCreator;
5+
import com.auth0.jwt.algorithms.Algorithm;
6+
import com.qcloud.cos.COSClient;
7+
import com.qcloud.cos.model.ciModel.snapshot.PrivateM3U8Request;
8+
9+
import java.io.UnsupportedEncodingException;
10+
import java.net.URLEncoder;
11+
import java.time.Instant;
12+
import java.time.temporal.ChronoUnit;
13+
import java.util.Date;
14+
15+
public class LiveTranscodeDemo {
16+
private static String appId = "1251704708";
17+
private static String bucket = "markjrzhang-1251704708";
18+
private static String objectKey = "output/media/test.m3u8";
19+
private static String expires = "3600";
20+
private static byte[] secret = "ui0KZSbUbhApT2OjF1BNiU04FvqloQEL".getBytes();
21+
22+
23+
public static void main(String[] args) {
24+
COSClient client = ClientUtils.getTestClient();
25+
String url = generateCosDomainPrivateM3U8Url(client);
26+
System.out.println("Generated url: " + url);
27+
}
28+
29+
public static String generateCosDomainPrivateM3U8Url(COSClient client) {
30+
PrivateM3U8Request request = new PrivateM3U8Request();
31+
request.setBucketName(bucket);
32+
request.setObject(objectKey);
33+
request.setExpires(expires);
34+
String token =generateToken(appId, bucket, objectKey, secret,expires);
35+
request.setTokenType(token);
36+
return client.generateCosDomainPrivateM3U8Url(request);
37+
}
38+
39+
public static String generateToken(String appId, String bucketId, String objectKey, byte[] secret, String expires) {
40+
41+
Instant now = Instant.now();
42+
Instant expire = now.plus(6, ChronoUnit.DAYS);
43+
44+
String encodedObjectKey;
45+
try {
46+
encodedObjectKey = URLEncoder.encode(objectKey, "UTF-8");
47+
} catch (UnsupportedEncodingException e) {
48+
throw new RuntimeException("Error encoding object key", e);
49+
}
50+
51+
Algorithm algorithm = Algorithm.HMAC256(secret);
52+
JWTCreator.Builder builder = JWT.create().withIssuer("client").withIssuedAt(Date.from(now)).withExpiresAt(Date.from(expire)).withClaim("Type", "CosCiToken").withClaim("AppId", appId).withClaim("BucketId", bucketId).withClaim("Object", encodedObjectKey).withClaim("Issuer", "client").withClaim("IssuedTimeStamp", now.getEpochSecond()).withClaim("ExpireTimeStamp", expire.getEpochSecond()).withClaim("UsageLimit", 20).withClaim("ProtectSchema", "rsa1024")
53+
// .withClaim("PublicKey", "xxx")
54+
.withClaim("ProtectContentKey", 0);
55+
return builder.sign(algorithm);
56+
}
57+
58+
59+
}

src/main/java/com/qcloud/cos/model/ciModel/snapshot/PrivateM3U8Request.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,24 @@ public class PrivateM3U8Request extends CosServiceRequest implements Serializabl
2323
*/
2424
private String expires;
2525

26+
private String tokenType;
27+
private String token;
28+
29+
public String getTokenType() {
30+
return tokenType;
31+
}
32+
33+
public void setTokenType(String tokenType) {
34+
this.tokenType = tokenType;
35+
}
36+
37+
public String getToken() {
38+
return token;
39+
}
40+
41+
public void setToken(String token) {
42+
this.token = token;
43+
}
2644
public String getBucketName() {
2745
return bucketName;
2846
}

0 commit comments

Comments
 (0)