|
| 1 | +import base64 |
| 2 | +import json |
1 | 3 | import uuid |
2 | 4 | import time |
3 | | -import json |
4 | | -import base64 |
5 | 5 | import qencode |
6 | | -from qencode.drm.buydrm import create_cpix_user_request |
| 6 | +from qencode.drm.buydrm_v4 import create_cpix_user_request |
7 | 7 | from qencode import QencodeClientException, QencodeTaskException |
8 | 8 |
|
9 | 9 | # replace with your API KEY (can be found in your Project settings on Qencode portal) |
| 10 | +# https://portal.qencode.com/ |
10 | 11 | API_KEY = 'your-api-qencode-key' |
11 | 12 |
|
12 | | -# specify path to your BuyDRM certificate files |
13 | | -USER_PVT_KEY_PATH = './keys/user_private_key.pem' |
14 | | -USER_PUB_CERT_PATH = './keys/user_public_cert.pem' |
| 13 | +# specify path to your BuyDRM certificate files, |
| 14 | +# for example create dir keys/ and put keys into |
| 15 | +USER_PVT_KEY_PATH = 'keys/user-private_key.pem' |
| 16 | +USER_PUB_CERT_PATH = 'keys/user-public_cert.pem' |
15 | 17 |
|
| 18 | +# Qencode query template for job with {cpix_request} |
| 19 | +query_json = 'query.json' |
| 20 | +# correspond to stream resolution in query.json |
16 | 21 | key_ids = [ |
17 | 22 | { 'kid': str(uuid.uuid4()), 'track_type': 'SD' }, |
18 | 23 | { 'kid': str(uuid.uuid4()), 'track_type': 'HD' } |
19 | 24 | ] |
20 | | -media_id = 'my first stream' |
21 | | - |
22 | | - |
23 | 25 |
|
24 | | -QUERY = """ |
25 | | -{ |
26 | | - "query": { |
27 | | - "format": [ |
28 | | - { |
29 | | - "output": "advanced_dash", |
30 | | - "stream": [ |
31 | | - { |
32 | | - "video_codec": "libx264", |
33 | | - "height": 360, |
34 | | - "audio_bitrate": 128, |
35 | | - "keyframe": 25, |
36 | | - "bitrate": 950 |
37 | | - } |
38 | | - ], |
39 | | - "buydrm_drm": { |
40 | | - "request": "{cpix_request}" |
41 | | - } |
42 | | - } |
43 | | - ], |
44 | | - "source": "https://nyc3.s3.qencode.com/qencode/bbb_30s.mp4" |
45 | | - } |
| 26 | +media_id = 'my first stream' |
| 27 | +content_id = 'my movies group' |
| 28 | +common_encryption = 'cenc' |
| 29 | + |
| 30 | +# unified with the new BuyDRM API params |
| 31 | +drm_list = { |
| 32 | + 'PR': True, # use_playready |
| 33 | + 'WV': True, # use_widevine |
| 34 | + 'FP': False # use_fairplay |
46 | 35 | } |
47 | | -""" |
48 | | - |
49 | 36 |
|
50 | 37 | def start_encode(): |
51 | | - # this creates signed request to BuyDRM |
52 | 38 | cpix_request = create_cpix_user_request( |
53 | | - key_ids, media_id, USER_PVT_KEY_PATH, USER_PUB_CERT_PATH, |
54 | | - use_playready=True, use_widevine=True |
| 39 | + key_ids, media_id, |
| 40 | + content_id, common_encryption, |
| 41 | + USER_PVT_KEY_PATH, USER_PUB_CERT_PATH, |
| 42 | + use_playready=drm_list['PR'], use_widevine=drm_list['WV'], use_fairplay=drm_list['FP'] |
55 | 43 | ) |
56 | 44 |
|
57 | 45 | client = qencode.client(API_KEY) |
58 | 46 | if client.error: |
59 | 47 | raise QencodeClientException(client.message) |
60 | 48 |
|
61 | | - print 'The client created. Expire date: %s' % client.expire |
| 49 | + print('The client created. Expire date: %s' % client.expire) |
62 | 50 |
|
63 | 51 | task = client.create_task() |
64 | 52 |
|
65 | 53 | if task.error: |
66 | 54 | raise QencodeTaskException(task.message) |
67 | 55 |
|
68 | | - query = QUERY.replace('{cpix_request}', base64.b64encode(cpix_request)) |
| 56 | + template = open(query_json, 'r').read() |
| 57 | + |
| 58 | + query = template.replace('{cpix_request}', base64.b64encode(cpix_request)) |
69 | 59 |
|
70 | 60 | task.custom_start(query) |
71 | 61 |
|
72 | 62 | if task.error: |
73 | 63 | raise QencodeTaskException(task.message) |
74 | | - |
75 | | - print 'Start encode. Task: %s' % task.task_token |
| 64 | + task_token = task.task_token |
| 65 | + print('Start encode. Task: %s' % task_token) |
76 | 66 |
|
77 | 67 | while True: |
78 | 68 | status = task.status() |
79 | | - # print status |
80 | | - print json.dumps(status, indent=2, sort_keys=True) |
| 69 | + print('Job %s status: \n %s' % (task_token, json.dumps(status, indent=2, sort_keys=True))) |
81 | 70 | if status['error'] or status['status'] == 'completed': |
82 | 71 | break |
83 | 72 | time.sleep(5) |
84 | | - |
85 | | - |
| 73 | + status = task.extend_status() |
| 74 | + print('Job %s finished with status "%s" and error: %s' % \ |
| 75 | + (task_token, status['status'], status['error']) |
| 76 | + ) |
| 77 | + |
86 | 78 | if __name__ == '__main__': |
87 | 79 | start_encode() |
0 commit comments