%PDF- %PDF-
| Direktori : /home/waritko/build/Bento4/Source/Python/utils/ |
| Current File : //home/waritko/build/Bento4/Source/Python/utils/wv-request.py |
#! /usr/bin/env python
import sys
import json
import aes
import hashlib
from optparse import OptionParser
WV_DEFAULT_SERVER_URL = 'https://license.uat.widevine.com/cenc/getcontentkey'
WV_DEFAULT_PROVIDER = 'widevine_test'
WV_DEFAULT_SIGNING_KEY = '1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9'
WV_DEFAULT_SIGNING_IV = 'd58ce954203b7c9a9a9d467f59839249'
try:
import requests
except:
raise Exception('"Requests" python module not installed. Please install it (use "pip install requests" or "easy_install requests" in a command shell, or consult the "Requests" documentation at http://docs.python-requests.org/en/latest/)')
def base64_encode(str):
return str.encode('base64').replace('\n', '')
### Main
parser = OptionParser(usage="%prog [options]",
description="Request keys and PSSH data from a Widevine key server")
parser.add_option('-v', '--verbose', dest="verbose", action='store_true', default=False,
help="Be verbose")
parser.add_option('-d', '--debug', dest="debug", action='store_true', default=False,
help="Print debug information")
parser.add_option('-u', '--url', dest="server_url", default=WV_DEFAULT_SERVER_URL,
help="Widevine Server URL (default: "+WV_DEFAULT_SERVER_URL+")")
parser.add_option('-p', '--provider', dest="provider", default=WV_DEFAULT_PROVIDER,
help="Widevine provider/signer name (default: "+WV_DEFAULT_PROVIDER+")")
parser.add_option('-k', '--aes-signing-key', dest="aes_signing_key", default=WV_DEFAULT_SIGNING_KEY,
help="AES signing key")
parser.add_option('-i', '--aes-signing-iv', dest="aes_signing_iv", default=WV_DEFAULT_SIGNING_IV,
help="ES signing IV")
parser.add_option('-c', '--content-id', dest="content_id", default=None,
help="Content ID (hex)")
parser.add_option('-t', '--track-types', dest="track_types", default='SD,HD,AUDIO',
help="List of track types, separated by ','")
parser.add_option('-l', '--policy', dest="policy", default='',
help="Policy")
(options, args) = parser.parse_args()
if not options.content_id:
print 'ERROR: missing --content-id option'
parser.print_help()
sys.exit(1)
rq_payload = {
'content_id': base64_encode(options.content_id.decode('hex')),
'drm_types': ['WIDEVINE'],
'policy': options.policy
}
if options.track_types:
rq_payload['tracks'] = [{'type': track_type} for track_type in options.track_types.split(',')]
else:
rq_payload['tracks'] = []
rq_payload_json = json.dumps(rq_payload)
if options.debug:
print 'Request Payload', rq_payload_json
sha1_hasher = hashlib.sha1()
sha1_hasher.update(rq_payload_json)
rq_payload_signature = aes.cbc_encrypt(sha1_hasher.digest(), options.aes_signing_key.decode('hex'), options.aes_signing_iv.decode('hex'))
post_body = {
"request":base64_encode(rq_payload_json),
"signature":base64_encode(rq_payload_signature),
"signer": options.provider
}
if options.debug:
print 'POST Body:'
print post_body
post_url = options.server_url+'/'+options.provider
http_response = requests.post(post_url, data=json.dumps(post_body))
if options.debug:
print 'Response:', http_response.text
parsed_response = json.loads(http_response.text)
parsed_payload = json.loads(parsed_response['response'].decode('base64'))
if options.debug:
print 'JSON Payload:'
print json.dumps(parsed_payload, indent=4)
if parsed_payload['status'] == 'OK':
for track in parsed_payload['tracks']:
print 'Track:'
print ' Type =', track['type']
print ' Key =', track['key'].decode('base64').encode('hex')
print ' KID =', track['key_id'].decode('base64').encode('hex')
print ' PSSH =', track['pssh'][0]['data'], '['+track['pssh'][0]['data'].decode('base64').encode('hex')+']'
else:
print 'ERROR:', parsed_payload['status']