diff --git a/.gitignore b/.gitignore index 6c82ff2..afa8897 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,5 @@ /* -__pycache__/ -!gamdl.py -!song_genres.py -!music_video_genres.py -!storefront_ids.py -!pywidevine +__pycache__ +!gamdl !requirements.txt -!.gitignore -device_client_id_blob -device_private_key +!pyproject.toml diff --git a/README.md b/README.md index a8da0d8..5c01a37 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,83 @@ # Glomatico's ✨ Apple Music ✨ Downloader A Python script to download Apple Music songs/music videos/albums/playlists. -![Windows CMD usage example](https://i.imgur.com/byjqmGF.png) +![Windows CMD usage example](https://i.imgur.com/6WeUCFh.png) This is a rework of https://github.com/loveyoursupport/AppleMusic-Downloader/tree/661a274d62586b521feec5a7de6bee0e230fdb7d. Some new features that I added: -- MP4Box for muxing -- Tags for music videos -- Multiple URLs input -- iTunes folder structure -- Embedded lyrics and .lrc file -- Auto set region -- Playlist support -- And much more! +* MP4Box for muxing +* Tags for music videos +* Multiple URLs input +* iTunes folder structure +* Embedded lyrics and .lrc file +* Auto set region +* Playlist support +* And much more! ## Setup -1. Install Python 3.8 or higher -2. Install the required packages using pip: +1. Install Python 3.7 or newer +2. Install gamdl with pip ``` - pip install -r requirements.txt + pip install gamdl ``` 3. Add MP4Box and mp4decrypt to your PATH * You can get them from here: * MP4Box: https://gpac.wp.imt.fr/downloads/ * mp4decrypt: https://www.bento4.com/downloads/ -4. Export your Apple Music cookies as `cookies.txt` and put it in the same folder as the script +4. Export your Apple Music cookies as `cookies.txt` and put it on the same folder that you will run the script * You can export your cookies by using this Google Chrome extension on Apple Music website: https://chrome.google.com/webstore/detail/open-cookiestxt/gdocmgbfkjnnpapoeobnolbbkoibbcif. Make sure to be logged in. -5. Put your L3 Widevine Keys (`device_client_id_blob` and `device_private_key` files) on `./pywidevine/L3/cdm/devices/android_generic` folder - * You can get your L3 Widevine Keys by using Dumper: https://github.com/Diazole/dumper +5. Put your L3 Widevine Device Keys (`device_client_id_blob` and `device_private_key` files) on the same folder that you will run the script + * You can get your L3 Widevine Device Keys by using Dumper: https://github.com/Diazole/dumper * The generated `private_key.pem` and `client_id.bin` files should be renamed to `device_private_key` and `device_client_id_blob` respectively. 6. (optional) Add aria2c to your PATH for faster downloads - * You can get it from here: https://aria2.github.io/. + * You can get it from here: https://github.com/aria2/aria2/releases. ## Usage ``` -python gamdl.py [OPTIONS] [URLS] -``` -Tracks are saved in `./Apple Music` by default, but the directory can be changed using `--final-path` argument. +usage: gamdl [-h] [-u [URLS_TXT]] [-d DEVICE_PATH] [-f FINAL_PATH] [-t TEMP_PATH] [-c COOKIES_LOCATION] [-m] + [-p] [-n] [-s] [-e] [-y] [-v] + [url ...] -Use `--help` argument to see all available options. +Download Apple Music songs/music videos/albums/playlists + +positional arguments: + url Apple Music song/music video/album/playlist URL(s) (default: None) + +options: + -h, --help show this help message and exit + -u [URLS_TXT], --urls-txt [URLS_TXT] + Read URLs from a text file (default: None) + -d DEVICE_PATH, --device-path DEVICE_PATH + Widevine L3 device keys path (default: .) + -f FINAL_PATH, --final-path FINAL_PATH + Final Path (default: Apple Music) + -t TEMP_PATH, --temp-path TEMP_PATH + Temp Path (default: temp) + -c COOKIES_LOCATION, --cookies-location COOKIES_LOCATION + Cookies location (default: cookies.txt) + -m, --disable-music-video-skip + Disable music video skip on playlists/albums (default: False) + -p, --prefer-hevc Prefer HEVC over AVC (default: False) + -n, --no-lrc Don't create .lrc file (default: False) + -s, --skip-cleanup Skip cleanup (default: False) + -e, --print-exceptions + Print execeptions (default: False) + -y, --print-video-playlist + Print Video M3U8 Playlist (default: False) + -v, --version show program's version number and exit +``` ## Songs/Music Videos quality * Songs: - * AAC 256kbps M4A + * 256kbps AAC * Music Videos (varies depending on the video): - * HEVC 4K 12~20mbps M4V / AAC 256kbps (achieved by using `--prefer-hevc` argument) - * AVC 1080p 6.5~10mbps M4V / AAC 256kbps - * AVC 720p 4mbps M4V / AAC 256kbps - * AVC 480p 1.5mbps M4V / AAC 256kbps - * AVC 360p 1mbps M4V / AAC 256kbps + * 4K HEVC 20mbps / AAC 256kbps + * 4K HEVC 12mbps / AAC 256kbps + * 1080p AVC 10mbps / AAC 256kbps + * 1080p AVC 6.5bps / AAC 256kbps + * 720p AVC 4mbps / AAC 256kbps + * 480p AVC 1.5mbps / AAC 256kbps + * 360p AVC 1mbps / AAC 256kbps -Some videos may include EIA-608 captions. +Some videos may include EIA-608 closed captions. diff --git a/gamdl/__init__.py b/gamdl/__init__.py new file mode 100644 index 0000000..3c11314 --- /dev/null +++ b/gamdl/__init__.py @@ -0,0 +1,172 @@ +import shutil +import argparse +import traceback +from .gamdl import Gamdl + +__version__ = '1.0' + + +def main(): + if not shutil.which('mp4decrypt'): + raise Exception('mp4decrypt is not on PATH') + if not shutil.which('MP4Box'): + raise Exception('MP4Box is not on PATH') + parser = argparse.ArgumentParser( + description = 'Download Apple Music songs/music videos/albums/playlists', + formatter_class = argparse.ArgumentDefaultsHelpFormatter + ) + parser.add_argument( + 'url', + help = 'Apple Music song/music video/album/playlist URL(s)', + nargs = '*' + ) + parser.add_argument( + '-u', + '--urls-txt', + help = 'Read URLs from a text file', + nargs = '?' + ) + parser.add_argument( + '-d', + '--device-path', + default = '.', + help = 'Widevine L3 device keys path' + ) + parser.add_argument( + '-f', + '--final-path', + default = 'Apple Music', + help = 'Final Path' + ) + parser.add_argument( + '-t', + '--temp-path', + default = 'temp', + help = 'Temp Path' + ) + parser.add_argument( + '-c', + '--cookies-location', + default = 'cookies.txt', + help = 'Cookies location' + ) + parser.add_argument( + '-m', + '--disable-music-video-skip', + action = 'store_true', + help = 'Disable music video skip on playlists/albums' + ) + parser.add_argument( + '-p', + '--prefer-hevc', + action = 'store_true', + help = 'Prefer HEVC over AVC' + ) + parser.add_argument( + '-n', + '--no-lrc', + action = 'store_true', + help = "Don't create .lrc file" + ) + parser.add_argument( + '-s', + '--skip-cleanup', + action = 'store_true', + help = 'Skip cleanup' + ) + parser.add_argument( + '-e', + '--print-exceptions', + action = 'store_true', + help = 'Print execeptions' + ) + parser.add_argument( + '-y', + '--print-video-playlist', + action = 'store_true', + help = 'Print Video M3U8 Playlist' + ) + parser.add_argument( + '-v', + '--version', + action = 'version', + version = f'%(prog)s {__version__}' + ) + args = parser.parse_args() + if not args.url and not args.urls_txt: + parser.error('you must specify an url or a text file using -u/--urls-txt') + if args.urls_txt: + with open(args.urls_txt, 'r', encoding = 'utf8') as f: + args.url = f.read().splitlines() + dl = Gamdl( + args.device_path, + args.cookies_location, + args.disable_music_video_skip, + args.prefer_hevc, + args.temp_path, + args.final_path, + args.no_lrc, + args.skip_cleanup + ) + error_count = 0 + download_queue = [] + for i, url in enumerate(args.url): + try: + download_queue.append(dl.get_download_queue(url.strip())) + except KeyboardInterrupt: + exit(1) + except: + error_count += 1 + print(f'* Failed to check URL {i + 1}.') + if args.print_exceptions: + traceback.print_exc() + for i, url in enumerate(download_queue): + for j, track in enumerate(url): + print(f'Downloading "{track["attributes"]["name"]}" (track {j + 1} from URL {i + 1})...') + track_id = track['id'] + try: + webplayback = dl.get_webplayback(track_id) + if track['type'] == 'music-videos': + playlist = dl.get_playlist_music_video(webplayback) + if args.print_video_playlist: + print(playlist.dumps()) + stream_url_audio = dl.get_stream_url_music_video_audio(playlist) + decryption_keys_audio = dl.get_decryption_keys_music_video(stream_url_audio, track_id) + encrypted_location_audio = dl.get_encrypted_location_audio(track_id) + dl.download(encrypted_location_audio, stream_url_audio) + decrypted_location_audio = dl.get_decrypted_location_audio(track_id) + dl.decrypt(encrypted_location_audio, decrypted_location_audio, decryption_keys_audio) + stream_url_video = dl.get_stream_url_music_video_video(playlist) + decryption_keys_video = dl.get_decryption_keys_music_video(stream_url_video, track_id) + encrypted_location_video = dl.get_encrypted_location_video(track_id) + dl.download(encrypted_location_video, stream_url_video) + decrypted_location_video = dl.get_decrypted_location_video(track_id) + dl.decrypt(encrypted_location_video, decrypted_location_video, decryption_keys_video) + tags = dl.get_tags_music_video(track['attributes']['url'].split('/')[-1]) + fixed_location = dl.get_fixed_location(track_id, '.m4v') + final_location = dl.get_final_location('.m4v', tags) + dl.fixup_music_video(decrypted_location_audio, decrypted_location_video, fixed_location) + dl.make_final(final_location, fixed_location, tags) + else: + stream_url = dl.get_stream_url_song(webplayback) + decryption_keys = dl.get_decryption_keys_song(stream_url, track_id) + encrypted_location = dl.get_encrypted_location_audio(track_id) + dl.download(encrypted_location, stream_url) + decrypted_location = dl.get_decrypted_location_audio(track_id) + dl.decrypt(encrypted_location, decrypted_location, decryption_keys) + unsynced_lyrics, synced_lyrics = dl.get_lyrics(track_id) + tags = dl.get_tags_song(webplayback, unsynced_lyrics, track['attributes']['genreNames'][0]) + fixed_location = dl.get_fixed_location(track_id, '.m4a') + final_location = dl.get_final_location('.m4a', tags) + dl.fixup_song(decrypted_location, fixed_location) + dl.make_final(final_location, fixed_location, tags) + dl.make_lrc(final_location, synced_lyrics) + except KeyboardInterrupt: + exit(1) + except: + error_count += 1 + print(f'* Failed to download "{track["attributes"]["name"]}" (track {j + 1} from URL {i + 1}).') + if args.print_exceptions: + traceback.print_exc() + dl.cleanup() + print(f'Done ({error_count} error(s)).') diff --git a/gamdl/__main__.py b/gamdl/__main__.py new file mode 100644 index 0000000..01b6a99 --- /dev/null +++ b/gamdl/__main__.py @@ -0,0 +1,4 @@ +import gamdl + +if __name__ == "__main__": + gamdl.main() diff --git a/gamdl.py b/gamdl/gamdl.py similarity index 55% rename from gamdl.py rename to gamdl/gamdl.py index 2ba9ed6..ddd76aa 100644 --- a/gamdl.py +++ b/gamdl/gamdl.py @@ -1,56 +1,59 @@ from pathlib import Path -import datetime -import argparse -import shutil -import traceback -import subprocess +from http.cookiejar import MozillaCookieJar import re -from xml.etree import ElementTree import base64 +import datetime +from xml.etree import ElementTree import functools -import song_genres -import music_video_genres -import storefront_ids -from pywidevine.L3.cdm.cdm import Cdm -from pywidevine.L3.cdm import deviceconfig -from pywidevine.L3.cdm.formats.widevine_pssh_data_pb2 import WidevinePsshData +import subprocess +import shutil +import gamdl.storefront_ids +from pywidevine import Cdm +from pywidevine import Device import requests import m3u8 from yt_dlp import YoutubeDL -from mutagen.mp4 import MP4Cover, MP4 +from pywidevine.pssh import PSSH +from pywidevine.license_protocol_pb2 import WidevinePsshData +from mutagen.mp4 import MP4, MP4Cover class Gamdl: - def __init__(self, disable_music_video_skip, cookies_location, temp_path, prefer_hevc, final_path, skip_cleanup, print_video_playlist, no_lrc): - self.cdm = Cdm() + def __init__(self, device_path, cookies_location, disable_music_video_skip, prefer_hevc, temp_path, final_path, no_lrc, skip_cleanup): self.disable_music_video_skip = disable_music_video_skip - self.temp_path = Path(temp_path) self.prefer_hevc = prefer_hevc + self.temp_path = Path(temp_path) self.final_path = Path(final_path) - self.skip_cleanup = skip_cleanup - self.print_video_playlist = print_video_playlist self.no_lrc = no_lrc - cookies = {} - with open(Path(cookies_location), 'r') as f: - for l in f: - if not re.match(r"^#", l) and not re.match(r"^\n", l): - line_fields = l.strip().replace('"', '"').split('\t') - cookies[line_fields[5]] = line_fields[6] + self.skip_cleanup = skip_cleanup + with open(Path(device_path) / 'device_client_id_blob', 'rb') as client_id, open(Path(device_path) / 'device_private_key', 'rb') as private_key: + self.cdm = Cdm.from_device( + Device( + type_ = 'ANDROID', + security_level = 3, + flags = None, + private_key = private_key.read(), + client_id = client_id.read() + ) + ) + self.cdm_session = self.cdm.open() + cookies = MozillaCookieJar(Path(cookies_location)) + cookies.load(ignore_discard = True, ignore_expires = True) self.session = requests.Session() self.session.cookies.update(cookies) self.session.headers.update({ - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0", - "Accept": "application/json", - "Accept-Language": "en-US,en;q=0.5", - "Accept-Encoding": "gzip, deflate, br", - "content-type": "application/json", - "Media-User-Token": self.session.cookies.get_dict()["media-user-token"], - "x-apple-renewal": "true", - "DNT": "1", - "Connection": "keep-alive", - "Sec-Fetch-Dest": "empty", - "Sec-Fetch-Mode": "cors", - "Sec-Fetch-Site": "same-site", + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0', + 'Accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.5', + 'Accept-Encoding': 'gzip, deflate, br', + 'content-type': 'application/json', + 'Media-User-Token': self.session.cookies.get_dict()['media-user-token'], + 'x-apple-renewal': 'true', + 'DNT': '1', + 'Connection': 'keep-alive', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-site', 'origin': 'https://beta.music.apple.com' }) web_page = self.session.get('https://beta.music.apple.com').text @@ -58,14 +61,14 @@ class Gamdl: index_js_page = self.session.get(f'https://beta.music.apple.com/assets/index.{index_js_uri}.js').text token = re.search('(?=eyJh)(.*?)(?=")', index_js_page).group(1) self.session.headers.update({"authorization": f'Bearer {token}'}) - self.country = cookies['itua'].lower() - self.storefront = getattr(storefront_ids, self.country.upper()) + self.country = self.session.cookies.get_dict()['itua'] + self.storefront = getattr(gamdl.storefront_ids, self.country.upper()) def get_download_queue(self, url): download_queue = [] product_id = url.split('/')[-1].split('i=')[-1].split('&')[0].split('?')[0] - response = self.session.get(f'https://amp-api.music.apple.com/v1/catalog/{self.country}/?ids[songs]={product_id}&ids[albums]={product_id}&ids[playlists]={product_id}&ids[music-videos]={product_id}').json()['data'][0] + response = self.session.get(f'https://amp-api.music.apple.com/v1/catalog/{self.country}/?ids[songs]={product_id}&ids[albums]={product_id}&ids[playlists]={product_id}&ids[music-videos]={product_id}&l=en').json()['data'][0] if response['type'] in ('songs', 'music-videos') and 'playParams' in response['attributes']: download_queue.append(response) if response['type'] == 'albums' or response['type'] == 'playlists': @@ -78,7 +81,7 @@ class Gamdl: if not download_queue: raise Exception('Criteria not met') return download_queue - + def get_webplayback(self, track_id): response = self.session.post( @@ -91,10 +94,7 @@ class Gamdl: def get_playlist_music_video(self, webplayback): - playlist = m3u8.load(webplayback['hls-playlist-url']) - if self.print_video_playlist: - print(playlist.dumps()) - return playlist + return m3u8.load(webplayback['hls-playlist-url']) def get_stream_url_song(self, webplayback): @@ -111,17 +111,25 @@ class Gamdl: else: return [i for i in playlist.playlists if 'avc' in i.stream_info.codecs][-1].uri - - def get_encrypted_location(self, extension, track_id): - return self.temp_path / f'{track_id}_encrypted{extension}' + + def get_encrypted_location_video(self, track_id): + return self.temp_path / f'{track_id}_encrypted_video.mp4' - def get_decrypted_location(self, extension, track_id): - return self.temp_path / f'{track_id}_decrypted{extension}' + def get_encrypted_location_audio(self, track_id): + return self.temp_path / f'{track_id}_encrypted_audio.mp4' - def get_fixed_location(self, extension, track_id): - return self.temp_path / f'{track_id}_fixed{extension}' + def get_decrypted_location_video(self, track_id): + return self.temp_path / f'{track_id}_decrypted_video.mp4' + + + def get_decrypted_location_audio(self, track_id): + return self.temp_path / f'{track_id}_decrypted_audio.mp4' + + + def get_fixed_location(self, track_id, file_extension): + return self.temp_path / f'{track_id}_fixed{file_extension}' def download(self, encrypted_location, stream_url): @@ -135,8 +143,8 @@ class Gamdl: 'external_downloader': 'aria2c' }) as ydl: ydl.download(stream_url) - + def get_license_b64(self, challenge, track_uri, track_id): return self.session.post( 'https://play.itunes.apple.com/WebObjects/MZPlay.woa/wa/acquireWebPlaybackLicense', @@ -149,60 +157,29 @@ class Gamdl: 'user-initiated': True } ).json()['license'] - - def check_pssh(self, pssh_b64): - WV_SYSTEM_ID = [237, 239, 139, 169, 121, 214, 74, 206, 163, 200, 39, 220, 213, 29, 33, 237] - pssh = base64.b64decode(pssh_b64) - if not pssh[12:28] == bytes(WV_SYSTEM_ID): - new_pssh = bytearray([0, 0, 0]) - new_pssh.append(32 + len(pssh)) - new_pssh[4:] = bytearray(b'pssh') - new_pssh[8:] = [0, 0, 0, 0] - new_pssh[13:] = WV_SYSTEM_ID - new_pssh[29:] = [0, 0, 0, 0] - new_pssh[31] = len(pssh) - new_pssh[32:] = pssh - return base64.b64encode(new_pssh) - else: - return pssh_b64 - - + def get_decryption_keys_music_video(self, stream_url, track_id): playlist = m3u8.load(stream_url) track_uri = next(i for i in playlist.keys if i.keyformat == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed").uri - session = self.cdm.open_session( - self.check_pssh(track_uri.split(',')[1]), - deviceconfig.DeviceConfig(deviceconfig.device_android_generic) - ) - challenge = base64.b64encode(self.cdm.get_license_request(session)).decode('utf8') + pssh = PSSH(track_uri.split(',')[1]) + challenge = base64.b64encode(self.cdm.get_license_challenge(self.cdm_session, pssh)).decode('utf-8') license_b64 = self.get_license_b64(challenge, track_uri, track_id) - self.cdm.provide_license(session, license_b64) - decryption_keys = [] - for key in self.cdm.get_keys(session): - if key.type == 'CONTENT': - decryption_keys.append(f'1:{key.key.hex()}') - return decryption_keys[0] + self.cdm.parse_license(self.cdm_session, license_b64) + return f'1:{next(i for i in self.cdm.get_keys(self.cdm_session) if i.type == "CONTENT").key.hex()}' def get_decryption_keys_song(self, stream_url, track_id): track_uri = m3u8.load(stream_url).keys[0].uri wvpsshdata = WidevinePsshData() wvpsshdata.algorithm = 1 - wvpsshdata.key_id.append(base64.b64decode(track_uri.split(",")[1])) - session = self.cdm.open_session( - self.check_pssh(base64.b64encode(wvpsshdata.SerializeToString()).decode("utf8")), - deviceconfig.DeviceConfig(deviceconfig.device_android_generic) - ) - challenge = base64.b64encode(self.cdm.get_license_request(session)).decode('utf8') + wvpsshdata.key_ids.append(base64.b64decode(track_uri.split(",")[1])) + pssh = PSSH(base64.b64encode(wvpsshdata.SerializeToString()).decode('utf-8')) + challenge = base64.b64encode(self.cdm.get_license_challenge(self.cdm_session, pssh)).decode('utf-8') license_b64 = self.get_license_b64(challenge, track_uri, track_id) - self.cdm.provide_license(session, license_b64) - decryption_keys = [] - for key in self.cdm.get_keys(session): - if key.type == 'CONTENT': - decryption_keys.append(f'{key.kid.hex()}:{key.key.hex()}') - return decryption_keys[0] - + self.cdm.parse_license(self.cdm_session, license_b64) + return f'1:{next(i for i in self.cdm.get_keys(self.cdm_session) if i.type == "CONTENT").key.hex()}' + def decrypt(self, encrypted_location, decrypted_location, decryption_keys): subprocess.run( @@ -258,12 +235,12 @@ class Gamdl: return requests.get(url).content - def get_tags_song(self, webplayback, unsynced_lyrics): + def get_tags_song(self, webplayback, unsynced_lyrics, genre): metadata = next(i for i in webplayback["assets"] if i["flavor"] == "28:ctrp256")['metadata'] cover_url = next(i for i in webplayback["assets"] if i["flavor"] == "28:ctrp256")['artworkURL'] tags = { '\xa9nam': [metadata['itemName']], - '\xa9gen': [getattr(song_genres, f'ID{metadata["genreId"]}')], + '\xa9gen': [genre], 'aART': [metadata['playlistArtistName']], '\xa9alb': [metadata['playlistName']], 'soar': [metadata['sort-artist']], @@ -298,17 +275,17 @@ class Gamdl: if unsynced_lyrics: tags['\xa9lyr'] = [unsynced_lyrics] return tags - + def get_tags_music_video(self, track_id): - metadata = requests.get(f'https://itunes.apple.com/lookup?id={track_id}&entity=album&limit=200&country={self.country}').json()['results'] + metadata = requests.get(f'https://itunes.apple.com/lookup?id={track_id}&entity=album&limit=200&country={self.country}&lang=en_US').json()['results'] extra_metadata = requests.get(f'https://music.apple.com/music-video/{metadata[0]["trackId"]}', headers = {'X-Apple-Store-Front': f'{self.storefront} t:music31'}).json()['storePlatformData']['product-dv']['results'][str(metadata[0]['trackId'])] tags = { '\xa9ART': [metadata[0]["artistName"]], '\xa9nam': [metadata[0]["trackCensoredName"]], '\xa9day': [metadata[0]["releaseDate"]], 'cprt': [extra_metadata['copyright']], - '\xa9gen': [getattr(music_video_genres, f'ID{extra_metadata["genres"][0]["genreId"]}')], + '\xa9gen': [metadata[0]['primaryGenreName']], 'stik': [6], 'atID': [metadata[0]['artistId']], 'cnID': [metadata[0]["trackId"]], @@ -329,7 +306,7 @@ class Gamdl: tags['disk'] = [(metadata[0]["discNumber"], metadata[0]["discCount"])] tags['trkn'] = [(metadata[0]["trackNumber"], metadata[0]["trackCount"])] return tags - + def get_sanizated_string(self, dirty_string, is_folder): for character in ['\\', '/', ':', '*', '?', '"', '<', '>', '|', ';']: @@ -386,7 +363,6 @@ class Gamdl: decrypted_location_video, '-itags', 'artist=placeholder', - '-new', fixed_location ], check = True @@ -401,8 +377,7 @@ class Gamdl: '-add', decrypted_location, '-itags', - 'album=placeholder', - '-new', + 'artist=placeholder', fixed_location ], check = True @@ -419,163 +394,11 @@ class Gamdl: final_location.parent.mkdir(parents = True, exist_ok = True) shutil.copy(fixed_location, final_location) file = MP4(final_location).tags - for key, value in tags.items(): - file[key] = value + file.update(tags) file.save(final_location) def cleanup(self): if self.temp_path.exists() and not self.skip_cleanup: shutil.rmtree(self.temp_path) - -if __name__ == '__main__': - if not shutil.which('mp4decrypt'): - raise Exception('mp4decrypt is not on PATH') - if not shutil.which('MP4Box'): - raise Exception('MP4Box is not on PATH') - parser = argparse.ArgumentParser( - description = 'A Python script to download Apple Music songs/music videos/albums/playlists.', - formatter_class = argparse.ArgumentDefaultsHelpFormatter - ) - parser.add_argument( - 'url', - help = 'Apple Music song/music video/album/playlist URL(s).', - nargs = '*' - ) - parser.add_argument( - '-u', - '--urls-txt', - help = 'Read URLs from a text file.', - nargs = '?' - ) - parser.add_argument( - '-f', - '--final-path', - default = 'Apple Music', - help = 'Final Path.' - ) - parser.add_argument( - '-t', - '--temp-path', - default = 'temp', - help = 'Temp Path.' - ) - parser.add_argument( - '-c', - '--cookies-location', - default = 'cookies.txt', - help = 'Cookies location.' - ) - parser.add_argument( - '-d', - '--disable-music-video-skip', - action = 'store_true', - help = 'Disable music video skip on playlists/albums.' - ) - parser.add_argument( - '-p', - '--prefer-hevc', - action = 'store_true', - help = 'Prefer HEVC over AVC.' - ) - parser.add_argument( - '-n', - '--no-lrc', - action = 'store_true', - help = "Don't create .lrc file." - ) - parser.add_argument( - '-s', - '--skip-cleanup', - action = 'store_true', - help = 'Skip cleanup.' - ) - parser.add_argument( - '-e', - '--print-exceptions', - action = 'store_true', - help = 'Print execeptions.' - ) - parser.add_argument( - '-v', - '--print-video-playlist', - action = 'store_true', - help = 'Print Video M3U8 Playlist.' - ) - args = parser.parse_args() - if not args.url and not args.urls_txt: - parser.error('you must specify an url or a text file using -u/--urls-txt.') - if args.urls_txt: - with open(args.urls_txt, 'r', encoding = 'utf8') as f: - args.url = f.read().splitlines() - dl = Gamdl( - args.disable_music_video_skip, - args.cookies_location, - args.temp_path, - args.prefer_hevc, - args.final_path, - args.skip_cleanup, - args.print_video_playlist, - args.no_lrc - ) - error_count = 0 - download_queue = [] - for i, url in enumerate(args.url): - try: - download_queue.append(dl.get_download_queue(url.strip())) - except KeyboardInterrupt: - exit(1) - except: - error_count += 1 - print(f'* Failed to check URL {i + 1}.') - if args.print_exceptions: - traceback.print_exc() - for i, url in enumerate(download_queue): - for j, track in enumerate(url): - print(f'Downloading "{track["attributes"]["name"]}" (track {j + 1} from URL {i + 1})...') - track_id = track['id'] - try: - webplayback = dl.get_webplayback(track_id) - if track['type'] == 'music-videos': - playlist = dl.get_playlist_music_video(webplayback) - stream_url_audio = dl.get_stream_url_music_video_audio(playlist) - decryption_keys_audio = dl.get_decryption_keys_music_video(stream_url_audio, track_id) - encrypted_location_audio = dl.get_encrypted_location('.m4a', track_id) - dl.download(encrypted_location_audio, stream_url_audio) - decrypted_location_audio = dl.get_decrypted_location('.m4a', track_id) - dl.decrypt(encrypted_location_audio, decrypted_location_audio, decryption_keys_audio) - stream_url_video = dl.get_stream_url_music_video_video(playlist) - decryption_keys_video = dl.get_decryption_keys_music_video(stream_url_video, track_id) - encrypted_location_video = dl.get_encrypted_location('.m4v', track_id) - dl.download(encrypted_location_video, stream_url_video) - decrypted_location_video = dl.get_decrypted_location('.m4v', track_id) - dl.decrypt(encrypted_location_video, decrypted_location_video, decryption_keys_video) - tags = dl.get_tags_music_video(track['attributes']['url'].split('/')[-1]) - fixed_location = dl.get_fixed_location('.m4v', track_id) - final_location = dl.get_final_location('.m4v', tags) - dl.fixup_music_video(decrypted_location_audio, decrypted_location_video, fixed_location) - dl.make_final(final_location, fixed_location, tags) - else: - stream_url = dl.get_stream_url_song(webplayback) - decryption_keys = dl.get_decryption_keys_song(stream_url, track_id) - encrypted_location = dl.get_encrypted_location('.m4a', track_id) - dl.download(encrypted_location, stream_url) - decrypted_location = dl.get_decrypted_location('.m4a', track_id) - dl.decrypt(encrypted_location, decrypted_location, decryption_keys) - unsynced_lyrics, synced_lyrics = dl.get_lyrics(track_id) - tags = dl.get_tags_song(webplayback, unsynced_lyrics) - fixed_location = dl.get_fixed_location('.m4a', track_id) - final_location = dl.get_final_location('.m4a', tags) - dl.fixup_song(decrypted_location, fixed_location) - dl.make_final(final_location, fixed_location, tags) - dl.make_lrc(final_location, synced_lyrics) - except KeyboardInterrupt: - exit(1) - except: - error_count += 1 - print(f'* Failed to download "{track["attributes"]["name"]}" (track {j + 1} from URL {i + 1}).') - if args.print_exceptions: - traceback.print_exc() - dl.cleanup() - print(f'Done ({error_count} error(s)).') diff --git a/storefront_ids.py b/gamdl/storefront_ids.py similarity index 100% rename from storefront_ids.py rename to gamdl/storefront_ids.py diff --git a/music_video_genres.py b/music_video_genres.py deleted file mode 100644 index 53fea73..0000000 --- a/music_video_genres.py +++ /dev/null @@ -1,433 +0,0 @@ -ID31 = "Music Videos" -ID1904 = "African" -ID2037 = "African Dancehall" -ID2038 = "African Reggae" -ID1710 = "Afrikaans" -ID1976 = "Afro House" -ID1977 = "Afro Soul" -ID1905 = "Afro-Beat" -ID1906 = "Afro-Pop" -ID2035 = "Afro-folk" -ID2036 = "Afro-fusion" -ID1978 = "Afrobeats" -ID2033 = "Alte" -ID2034 = "Amapiano" -ID1979 = "Benga" -ID1980 = "Bongo-Flava" -ID1981 = "Coupé-Décalé" -ID1982 = "Gqom" -ID1983 = "Highlife" -ID1985 = "Kizomba" -ID1984 = "Kuduro" -ID1986 = "Kwaito" -ID2000 = "Maskandi" -ID1987 = "Mbalax" -ID1988 = "Ndombolo" -ID1989 = "Shangaan Electro" -ID1990 = "Soukous" -ID1991 = "Taarab" -ID1992 = "Zouglou" -ID1620 = "Alternative" -ID1635 = "Chinese Alt" -ID1731 = "College Rock" -ID1945 = "EMO" -ID1732 = "Goth Rock" -ID1733 = "Grunge" -ID2025 = "Indie Egyptian" -ID2024 = "Indie Levant" -ID2026 = "Indie Maghreb" -ID1947 = "Indie Pop" -ID1734 = "Indie Rock" -ID1636 = "Korean Indie" -ID1735 = "New Wave" -ID1946 = "Pop Punk" -ID1736 = "Punk" -ID1998 = "Turkish Alternative" -ID1629 = "Anime" -ID1713 = "Arabic" -ID1716 = "Arabic Pop" -ID1717 = "Islamic" -ID1714 = "Khaleeji" -ID2009 = "Khaleeji Jalsat" -ID2010 = "Khaleeji Shailat" -ID2006 = "Levant" -ID2007 = "Dabke" -ID2008 = "Maghreb Rai" -ID1715 = "North African" -ID1602 = "Blues" -ID1737 = "Acoustic Blues" -ID1738 = "Chicago Blues" -ID1739 = "Classic Blues" -ID1740 = "Contemporary Blues" -ID1741 = "Country Blues" -ID1742 = "Delta Blues" -ID1743 = "Electric Blues" -ID1671 = "Brazilian" -ID1672 = "Axé" -ID1673 = "Baile Funk" -ID1674 = "Bossa Nova" -ID1675 = "Choro" -ID1676 = "Forro" -ID1677 = "Frevo" -ID1678 = "MPB" -ID1679 = "Pagode" -ID1680 = "Samba" -ID1681 = "Sertanejo" -ID1604 = "Children's Music" -ID1744 = "Lullabies" -ID1745 = "Sing-Along" -ID1746 = "Stories" -ID1637 = "Chinese" -ID1638 = "Chinese Classical" -ID1639 = "Chinese Flute" -ID1640 = "Chinese Opera" -ID1641 = "Chinese Orchestral" -ID1642 = "Chinese Regional Folk" -ID1643 = "Chinese Strings" -ID1644 = "Taiwanese Folk" -ID1645 = "Tibetan Native Music" -ID1622 = "Christian" -ID1747 = "CCM" -ID1748 = "Christian Metal" -ID1749 = "Christian Pop" -ID1750 = "Christian Rap" -ID1751 = "Christian Rock" -ID1752 = "Classic Christian" -ID1753 = "Contemporary Gospel" -ID1754 = "Gospel" -ID1755 = "Praise & Worship" -ID1756 = "Southern Gospel" -ID1757 = "Traditional Gospel" -ID1605 = "Classical" -ID1928 = "Art Song" -ID1758 = "Avant-Garde" -ID1759 = "Baroque Era" -ID1929 = "Brass & Woodwinds" -ID1933 = "Cantata" -ID1939 = "Cello" -ID1760 = "Chamber Music" -ID1761 = "Chant" -ID1762 = "Choral" -ID1763 = "Classical Crossover" -ID1682 = "High Classical" -ID1931 = "Contemporary Era" -ID1764 = "Early Music" -ID1934 = "Electronic" -ID1936 = "Guitar" -ID1765 = "Impressionist" -ID1766 = "Medieval Era" -ID1767 = "Minimalism" -ID1768 = "Modern Era" -ID1609 = "Opera" -ID1932 = "Oratorio" -ID1769 = "Orchestral" -ID1940 = "Percussion" -ID1337 = "Piano" -ID1770 = "Renaissance" -ID1771 = "Romantic Era" -ID1935 = "Sacred" -ID1930 = "Solo Instrumental" -ID1938 = "Violin" -ID1772 = "Wedding Music" -ID1603 = "Comedy" -ID1773 = "Novelty" -ID1774 = "Standup Comedy" -ID1606 = "Country" -ID1775 = "Alternative Country" -ID1776 = "Americana" -ID1777 = "Bluegrass" -ID1778 = "Contemporary Bluegrass" -ID1779 = "Contemporary Country" -ID1780 = "Country Gospel" -ID1781 = "Honky Tonk" -ID1782 = "Outlaw Country" -ID1724 = "Thai Country" -ID1783 = "Traditional Bluegrass" -ID1784 = "Traditional Country" -ID1785 = "Urban Cowboy" -ID1951 = "Cuban" -ID1956 = "Bolero" -ID1953 = "Chachacha" -ID1954 = "Guajira" -ID1957 = "Guaracha" -ID1952 = "Mambo" -ID1955 = "Son" -ID1958 = "Timba" -ID1617 = "Dance" -ID1786 = "Breakbeat" -ID1787 = "Exercise" -ID1788 = "Garage" -ID1789 = "Hardcore" -ID1790 = "House" -ID1791 = "Jungle/Drum'n'bass" -ID2032 = "Maghreb Dance" -ID1792 = "Techno" -ID1793 = "Trance" -ID1631 = "Disney" -ID1625 = "Easy Listening" -ID1794 = "Lounge" -ID1795 = "Swing" -ID1607 = "Electronic" -ID1796 = "Ambient" -ID1942 = "Bass" -ID1797 = "Downtempo" -ID1941 = "Dubstep" -ID2028 = "Electro-Cha'abi" -ID1798 = "Electronica" -ID1799 = "IDM/Experimental" -ID1800 = "Industrial" -ID2027 = "Levant Electronic" -ID2029 = "Maghreb Electronic" -ID1628 = "Enka" -ID1683 = "Fitness & Workout" -ID1719 = "Folk" -ID2030 = "Iraqi Folk" -ID2031 = "Khaleeji Folk" -ID1632 = "French Pop" -ID1634 = "German Folk" -ID1633 = "German Pop" -ID1618 = "Hip-Hop/Rap" -ID1801 = "Alternative Rap" -ID1646 = "Chinese Hip-Hop" -ID1802 = "Dirty South" -ID1803 = "East Coast Rap" -ID2021 = "Egyptian Hip-Hop" -ID1804 = "Gangsta Rap" -ID1805 = "Hardcore Rap" -ID1806 = "Hip-Hop" -ID2023 = "Khaleeji Hip-Hop" -ID1647 = "Korean Hip-Hop" -ID1807 = "Latin Rap" -ID2020 = "Levant Hip-Hop" -ID2022 = "Maghreb Hip-Hop" -ID1808 = "Old School Rap" -ID1809 = "Rap" -ID2005 = "Hip-Hop in Russian" -ID1999 = "Turkish Hip-Hop/Rap" -ID1943 = "UK Hip-Hop" -ID1810 = "Underground Rap" -ID1811 = "West Coast Rap" -ID1608 = "Holiday" -ID1812 = "Chanukah" -ID1813 = "Christmas" -ID1814 = "Christmas: Children's" -ID1815 = "Christmas: Classic" -ID1816 = "Christmas: Classical" -ID2039 = "Christmas: Country" -ID1817 = "Christmas: Jazz" -ID1818 = "Christmas: Modern" -ID1819 = "Christmas: Pop" -ID1820 = "Christmas: R&B" -ID1821 = "Christmas: Religious" -ID1822 = "Christmas: Rock" -ID1823 = "Easter" -ID1824 = "Halloween" -ID1825 = "Thanksgiving" -ID2040 = "Hörspiele" -ID1690 = "Indian" -ID1691 = "Bollywood" -ID1695 = "Devotional & Spiritual" -ID1707 = "Ghazals" -ID1697 = "Indian Classical" -ID1974 = "Carnatic Classical" -ID1975 = "Hindustani Classical" -ID1708 = "Indian Folk" -ID1704 = "Indian Pop" -ID1694 = "Regional Indian" -ID1966 = "Assamese" -ID1973 = "Bengali" -ID1961 = "Rabindra Sangeet" -ID1967 = "Bhojpuri" -ID1965 = "Gujarati" -ID1968 = "Haryanvi" -ID1963 = "Kannada" -ID1962 = "Malayalam" -ID1964 = "Marathi" -ID1969 = "Odia" -ID1972 = "Punjabi" -ID1960 = "Punjabi Pop" -ID1970 = "Rajasthani" -ID1692 = "Tamil" -ID1693 = "Telugu" -ID1971 = "Urdu" -ID1696 = "Sufi" -ID1926 = "Inspirational" -ID1684 = "Instrumental" -ID1627 = "J-Pop" -ID1611 = "Jazz" -ID1826 = "Avant-Garde Jazz" -ID1828 = "Bop" -ID1685 = "Big Band" -ID1829 = "Contemporary Jazz" -ID1830 = "Cool Jazz" -ID1831 = "Crossover Jazz" -ID1832 = "Dixieland" -ID1833 = "Fusion" -ID1834 = "Hard Bop" -ID1835 = "Latin Jazz" -ID1836 = "Mainstream Jazz" -ID1837 = "Ragtime" -ID1838 = "Smooth Jazz" -ID1839 = "Trad Jazz" -ID1902 = "Vocal Jazz" -ID1687 = "Karaoke" -ID1630 = "Kayokyoku" -ID1648 = "Korean" -ID1651 = "Korean Trad Instrumental" -ID1650 = "Korean Trad Song" -ID1652 = "Korean Trad Theater" -ID1649 = "Korean Classical" -ID1612 = "Latin" -ID1840 = "Alternative & Rock in Spanish" -ID1841 = "Baladas y Boleros" -ID1842 = "Contemporary Latin" -ID1843 = "Latin Jazz" -ID1844 = "Latin Urban" -ID1845 = "Pop in Spanish" -ID1846 = "Raices" -ID1847 = "Música Mexicana" -ID1848 = "Salsa y Tropical" -ID1721 = "Marching" -ID1613 = "New Age" -ID1849 = "Healing" -ID1850 = "Meditation" -ID1851 = "Nature" -ID1852 = "Relaxation" -ID1853 = "Travel" -ID1948 = "Yoga" -ID1720 = "Orchestral" -ID1626 = "Podcasts" -ID1614 = "Pop" -ID1854 = "Adult Contemporary" -ID1855 = "Britpop" -ID1655 = "C-Pop" -ID1656 = "Cantopop/HK-Pop" -ID2017 = "Egyptian Pop" -ID1664 = "Indo Pop" -ID2016 = "Iraqi Pop" -ID1686 = "K-Pop" -ID2019 = "Khaleeji Pop" -ID1657 = "Korean Folk-Pop" -ID2015 = "Levant Pop" -ID2018 = "Maghreb Pop" -ID1660 = "Malaysian Pop" -ID1658 = "Mandopop" -ID1663 = "Manilla Sound" -ID1723 = "Oldies" -ID1662 = "Original Pilipino Music" -ID1661 = "Pinoy Pop" -ID1856 = "Pop/Rock" -ID2003 = "Pop in Russian" -ID1950 = "Shows" -ID1857 = "Soft Rock" -ID1659 = "Tai-Pop" -ID1858 = "Teen Pop" -ID1665 = "Thai Pop" -ID1949 = "Tribute" -ID1996 = "Turkish Pop" -ID1615 = "R&B/Soul" -ID1859 = "Contemporary R&B" -ID1860 = "Disco" -ID1861 = "Doo Wop" -ID1862 = "Funk" -ID1863 = "Motown" -ID1864 = "Neo-Soul" -ID1865 = "Soul" -ID1624 = "Reggae" -ID1867 = "Dub" -ID1944 = "Lovers Rock" -ID1866 = "Modern Dancehall" -ID1868 = "Roots Reggae" -ID1869 = "Ska" -ID1621 = "Rock" -ID1870 = "Adult Alternative" -ID1871 = "American Trad Rock" -ID1872 = "Arena Rock" -ID1873 = "Blues-Rock" -ID1874 = "British Invasion" -ID1653 = "Chinese Rock" -ID1875 = "Death Metal/Black Metal" -ID1876 = "Glam Rock" -ID1877 = "Hair Metal" -ID1878 = "Hard Rock" -ID1688 = "Heavy Metal" -ID1879 = "Jam Bands" -ID1654 = "Korean Rock" -ID1880 = "Prog-Rock/Art Rock" -ID1881 = "Psychedelic" -ID1882 = "Rock & Roll" -ID1883 = "Rockabilly" -ID1884 = "Roots Rock" -ID2004 = "Rock in Russian" -ID1885 = "Singer/Songwriter" -ID1886 = "Southern Rock" -ID1887 = "Surf" -ID1888 = "Tex-Mex" -ID1997 = "Turkish Rock" -ID1729 = "Russian" -ID2002 = "Bard in Russian" -ID1698 = "Chanson in Russian" -ID2001 = "Romance in Russian" -ID1610 = "Singer/Songwriter" -ID1889 = "Alternative Folk" -ID1890 = "Contemporary Folk" -ID1891 = "Contemporary Singer/Songwriter" -ID1892 = "Folk-Rock" -ID1893 = "New Acoustic" -ID1894 = "Traditional Folk" -ID1616 = "Soundtrack" -ID1895 = "Foreign Cinema" -ID1896 = "Musicals" -ID1897 = "Original Score" -ID1718 = "Sound Effects" -ID1898 = "Soundtrack" -ID1899 = "TV Soundtrack" -ID1959 = "Video Game" -ID1689 = "Spoken Word" -ID2011 = "Tarab" -ID2013 = "Egyptian Tarab" -ID2012 = "Iraqi Tarab" -ID2014 = "Khaleeji Tarab" -ID1730 = "Turkish" -ID1709 = "Arabesque" -ID1994 = "Fantezi" -ID1700 = "Halk" -ID1995 = "Religious" -ID1701 = "Sanat" -ID1993 = "Özgün" -ID1623 = "Vocal" -ID1900 = "Standards" -ID1901 = "Traditional Pop" -ID1666 = "Trot" -ID1903 = "Vocal Pop" -ID1619 = "World" -ID1907 = "Asia" -ID1908 = "Australia" -ID1909 = "Cajun" -ID1705 = "Calypso" -ID1910 = "Caribbean" -ID1911 = "Celtic" -ID1912 = "Celtic Folk" -ID1913 = "Contemporary Celtic" -ID1702 = "Dangdut" -ID1699 = "Dini" -ID1914 = "Europe" -ID1727 = "Fado" -ID1711 = "Farsi" -ID1725 = "Flamenco" -ID1915 = "France" -ID1916 = "Hawaii" -ID1728 = "Iberia" -ID1703 = "Indonesian Religious" -ID1712 = "Israeli" -ID1917 = "Japan" -ID1918 = "Klezmer" -ID1919 = "North America" -ID1920 = "Polka" -ID1706 = "Soca" -ID1921 = "South Africa" -ID1922 = "South America" -ID1726 = "Tango" -ID1923 = "Traditional Celtic" -ID1924 = "Worldbeat" -ID1925 = "Zydeco" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9182529 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,24 @@ +[project] +name = "gamdl" +description = "Download Apple Music songs/music videos/albums/playlists" +requires-python = ">=3.7" +authors = [{name = "glomatico"}] +dependencies = [ + "pywidevine", + "pyyaml", + "m3u8", + "yt-dlp" +] +readme = "README.md" +dynamic = ["version"] + +[project.urls] +homepage = "https://github.com/glomatico/gamdl" +repository = "https://github.com/glomatico/gamdl" + +[build-system] +requires = ["flit_core"] +build-backend = "flit_core.buildapi" + +[project.scripts] +gamdl = "gamdl:main" diff --git a/pywidevine/L3/__init__.py b/pywidevine/L3/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pywidevine/L3/cdm/__init__.py b/pywidevine/L3/cdm/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pywidevine/L3/cdm/cdm.py b/pywidevine/L3/cdm/cdm.py deleted file mode 100644 index a83caa6..0000000 --- a/pywidevine/L3/cdm/cdm.py +++ /dev/null @@ -1,362 +0,0 @@ -import base64 - -import os -import time -import binascii - -from google.protobuf.message import DecodeError -from google.protobuf import text_format - -from pywidevine.L3.cdm.formats import wv_proto2_pb2 as wv_proto2 -from pywidevine.L3.cdm.session import Session -from pywidevine.L3.cdm.key import Key -from Cryptodome.Random import get_random_bytes -from Cryptodome.Random import random -from Cryptodome.Cipher import PKCS1_OAEP, AES -from Cryptodome.Hash import CMAC, SHA256, HMAC, SHA1 -from Cryptodome.PublicKey import RSA -from Cryptodome.Signature import pss -from Cryptodome.Util import Padding -import logging - -class Cdm: - def __init__(self): - self.logger = logging.getLogger(__name__) - self.sessions = {} - - def open_session(self, init_data_b64, device, raw_init_data = None, offline=False): - self.logger.debug("open_session(init_data_b64={}, device={}".format(init_data_b64, device)) - self.logger.info("opening new cdm session") - if device.session_id_type == 'android': - # format: 16 random hexdigits, 2 digit counter, 14 0s - rand_ascii = ''.join(random.choice('ABCDEF0123456789') for _ in range(16)) - counter = '01' # this resets regularly so its fine to use 01 - rest = '00000000000000' - session_id = rand_ascii + counter + rest - session_id = session_id.encode('ascii') - elif device.session_id_type == 'chrome': - rand_bytes = get_random_bytes(16) - session_id = rand_bytes - else: - # other formats NYI - self.logger.error("device type is unusable") - return 1 - if raw_init_data and isinstance(raw_init_data, (bytes, bytearray)): - # used for NF key exchange, where they don't provide a valid PSSH - init_data = raw_init_data - self.raw_pssh = True - else: - init_data = self._parse_init_data(init_data_b64) - self.raw_pssh = False - - if init_data: - new_session = Session(session_id, init_data, device, offline) - else: - self.logger.error("unable to parse init data") - return 1 - self.sessions[session_id] = new_session - self.logger.info("session opened and init data parsed successfully") - return session_id - - def _parse_init_data(self, init_data_b64): - parsed_init_data = wv_proto2.WidevineCencHeader() - try: - self.logger.debug("trying to parse init_data directly") - parsed_init_data.ParseFromString(base64.b64decode(init_data_b64)[32:]) - except DecodeError: - self.logger.debug("unable to parse as-is, trying with removed pssh box header") - try: - id_bytes = parsed_init_data.ParseFromString(base64.b64decode(init_data_b64)[32:]) - except DecodeError: - self.logger.error("unable to parse, unsupported init data format") - return None - self.logger.debug("init_data:") - for line in text_format.MessageToString(parsed_init_data).splitlines(): - self.logger.debug(line) - return parsed_init_data - - def close_session(self, session_id): - self.logger.debug("close_session(session_id={})".format(session_id)) - self.logger.info("closing cdm session") - if session_id in self.sessions: - self.sessions.pop(session_id) - self.logger.info("cdm session closed") - return 0 - else: - self.logger.info("session {} not found".format(session_id)) - return 1 - - def set_service_certificate(self, session_id, cert_b64): - self.logger.debug("set_service_certificate(session_id={}, cert={})".format(session_id, cert_b64)) - self.logger.info("setting service certificate") - - if session_id not in self.sessions: - self.logger.error("session id doesn't exist") - return 1 - - session = self.sessions[session_id] - - message = wv_proto2.SignedMessage() - - try: - message.ParseFromString(base64.b64decode(cert_b64)) - except DecodeError: - self.logger.error("failed to parse cert as SignedMessage") - - service_certificate = wv_proto2.SignedDeviceCertificate() - - if message.Type: - self.logger.debug("service cert provided as signedmessage") - try: - service_certificate.ParseFromString(message.Msg) - except DecodeError: - self.logger.error("failed to parse service certificate") - return 1 - else: - self.logger.debug("service cert provided as signeddevicecertificate") - try: - service_certificate.ParseFromString(base64.b64decode(cert_b64)) - except DecodeError: - self.logger.error("failed to parse service certificate") - return 1 - - self.logger.debug("service certificate:") - for line in text_format.MessageToString(service_certificate).splitlines(): - self.logger.debug(line) - - session.service_certificate = service_certificate - session.privacy_mode = True - - return 0 - - def get_license_request(self, session_id): - self.logger.debug("get_license_request(session_id={})".format(session_id)) - self.logger.info("getting license request") - - if session_id not in self.sessions: - self.logger.error("session ID does not exist") - return 1 - - session = self.sessions[session_id] - - # raw pssh will be treated as bytes and not parsed - if self.raw_pssh: - license_request = wv_proto2.SignedLicenseRequestRaw() - else: - license_request = wv_proto2.SignedLicenseRequest() - client_id = wv_proto2.ClientIdentification() - - if not os.path.exists(session.device_config.device_client_id_blob_filename): - self.logger.error("no client ID blob available for this device") - return 1 - - with open(session.device_config.device_client_id_blob_filename, "rb") as f: - try: - cid_bytes = client_id.ParseFromString(f.read()) - except DecodeError: - self.logger.error("client id failed to parse as protobuf") - return 1 - - self.logger.debug("building license request") - if not self.raw_pssh: - license_request.Type = wv_proto2.SignedLicenseRequest.MessageType.Value('LICENSE_REQUEST') - license_request.Msg.ContentId.CencId.Pssh.CopyFrom(session.init_data) - else: - license_request.Type = wv_proto2.SignedLicenseRequestRaw.MessageType.Value('LICENSE_REQUEST') - license_request.Msg.ContentId.CencId.Pssh = session.init_data # bytes - - if session.offline: - license_type = wv_proto2.LicenseType.Value('OFFLINE') - else: - license_type = wv_proto2.LicenseType.Value('DEFAULT') - license_request.Msg.ContentId.CencId.LicenseType = license_type - license_request.Msg.ContentId.CencId.RequestId = session_id - license_request.Msg.Type = wv_proto2.LicenseRequest.RequestType.Value('NEW') - license_request.Msg.RequestTime = int(time.time()) - license_request.Msg.ProtocolVersion = wv_proto2.ProtocolVersion.Value('CURRENT') - if session.device_config.send_key_control_nonce: - license_request.Msg.KeyControlNonce = random.randrange(1, 2**31) - - if session.privacy_mode: - if session.device_config.vmp: - self.logger.debug("vmp required, adding to client_id") - self.logger.debug("reading vmp hashes") - vmp_hashes = wv_proto2.FileHashes() - with open(session.device_config.device_vmp_blob_filename, "rb") as f: - try: - vmp_bytes = vmp_hashes.ParseFromString(f.read()) - except DecodeError: - self.logger.error("vmp hashes failed to parse as protobuf") - return 1 - client_id._FileHashes.CopyFrom(vmp_hashes) - self.logger.debug("privacy mode & service certificate loaded, encrypting client id") - self.logger.debug("unencrypted client id:") - for line in text_format.MessageToString(client_id).splitlines(): - self.logger.debug(line) - cid_aes_key = get_random_bytes(16) - cid_iv = get_random_bytes(16) - - cid_cipher = AES.new(cid_aes_key, AES.MODE_CBC, cid_iv) - - encrypted_client_id = cid_cipher.encrypt(Padding.pad(client_id.SerializeToString(), 16)) - - service_public_key = RSA.importKey(session.service_certificate._DeviceCertificate.PublicKey) - - service_cipher = PKCS1_OAEP.new(service_public_key) - - encrypted_cid_key = service_cipher.encrypt(cid_aes_key) - - encrypted_client_id_proto = wv_proto2.EncryptedClientIdentification() - - encrypted_client_id_proto.ServiceId = session.service_certificate._DeviceCertificate.ServiceId - encrypted_client_id_proto.ServiceCertificateSerialNumber = session.service_certificate._DeviceCertificate.SerialNumber - encrypted_client_id_proto.EncryptedClientId = encrypted_client_id - encrypted_client_id_proto.EncryptedClientIdIv = cid_iv - encrypted_client_id_proto.EncryptedPrivacyKey = encrypted_cid_key - - license_request.Msg.EncryptedClientId.CopyFrom(encrypted_client_id_proto) - else: - license_request.Msg.ClientId.CopyFrom(client_id) - - if session.device_config.private_key_available: - key = RSA.importKey(open(session.device_config.device_private_key_filename).read()) - session.device_key = key - else: - self.logger.error("need device private key, other methods unimplemented") - return 1 - - self.logger.debug("signing license request") - - hash = SHA1.new(license_request.Msg.SerializeToString()) - signature = pss.new(key).sign(hash) - - license_request.Signature = signature - - session.license_request = license_request - - self.logger.debug("license request:") - for line in text_format.MessageToString(session.license_request).splitlines(): - self.logger.debug(line) - self.logger.info("license request created") - self.logger.debug("license request b64: {}".format(base64.b64encode(license_request.SerializeToString()))) - return license_request.SerializeToString() - - def provide_license(self, session_id, license_b64): - self.logger.debug("provide_license(session_id={}, license_b64={})".format(session_id, license_b64)) - self.logger.info("decrypting provided license") - - if session_id not in self.sessions: - self.logger.error("session does not exist") - return 1 - - session = self.sessions[session_id] - - if not session.license_request: - self.logger.error("generate a license request first!") - return 1 - - license = wv_proto2.SignedLicense() - try: - license.ParseFromString(base64.b64decode(license_b64)) - except DecodeError: - self.logger.error("unable to parse license - check protobufs") - return 1 - - session.license = license - - self.logger.debug("license:") - for line in text_format.MessageToString(license).splitlines(): - self.logger.debug(line) - - self.logger.debug("deriving keys from session key") - - oaep_cipher = PKCS1_OAEP.new(session.device_key) - - session.session_key = oaep_cipher.decrypt(license.SessionKey) - - lic_req_msg = session.license_request.Msg.SerializeToString() - - enc_key_base = b"ENCRYPTION\000" + lic_req_msg + b"\0\0\0\x80" - auth_key_base = b"AUTHENTICATION\0" + lic_req_msg + b"\0\0\2\0" - - enc_key = b"\x01" + enc_key_base - auth_key_1 = b"\x01" + auth_key_base - auth_key_2 = b"\x02" + auth_key_base - auth_key_3 = b"\x03" + auth_key_base - auth_key_4 = b"\x04" + auth_key_base - - cmac_obj = CMAC.new(session.session_key, ciphermod=AES) - cmac_obj.update(enc_key) - - enc_cmac_key = cmac_obj.digest() - - cmac_obj = CMAC.new(session.session_key, ciphermod=AES) - cmac_obj.update(auth_key_1) - auth_cmac_key_1 = cmac_obj.digest() - - cmac_obj = CMAC.new(session.session_key, ciphermod=AES) - cmac_obj.update(auth_key_2) - auth_cmac_key_2 = cmac_obj.digest() - - cmac_obj = CMAC.new(session.session_key, ciphermod=AES) - cmac_obj.update(auth_key_3) - auth_cmac_key_3 = cmac_obj.digest() - - cmac_obj = CMAC.new(session.session_key, ciphermod=AES) - cmac_obj.update(auth_key_4) - auth_cmac_key_4 = cmac_obj.digest() - - auth_cmac_combined_1 = auth_cmac_key_1 + auth_cmac_key_2 - auth_cmac_combined_2 = auth_cmac_key_3 + auth_cmac_key_4 - - session.derived_keys['enc'] = enc_cmac_key - session.derived_keys['auth_1'] = auth_cmac_combined_1 - session.derived_keys['auth_2'] = auth_cmac_combined_2 - - self.logger.debug('verifying license signature') - - lic_hmac = HMAC.new(session.derived_keys['auth_1'], digestmod=SHA256) - lic_hmac.update(license.Msg.SerializeToString()) - - self.logger.debug("calculated sig: {} actual sig: {}".format(lic_hmac.hexdigest(), binascii.hexlify(license.Signature))) - - if lic_hmac.digest() != license.Signature: - self.logger.info("license signature doesn't match - writing bin so they can be debugged") - with open("original_lic.bin", "wb") as f: - f.write(base64.b64decode(license_b64)) - with open("parsed_lic.bin", "wb") as f: - f.write(license.SerializeToString()) - self.logger.info("continuing anyway") - - self.logger.debug("key count: {}".format(len(license.Msg.Key))) - for key in license.Msg.Key: - if key.Id: - key_id = key.Id - else: - key_id = wv_proto2.License.KeyContainer.KeyType.Name(key.Type).encode('utf-8') - encrypted_key = key.Key - iv = key.Iv - type = wv_proto2.License.KeyContainer.KeyType.Name(key.Type) - - cipher = AES.new(session.derived_keys['enc'], AES.MODE_CBC, iv=iv) - decrypted_key = cipher.decrypt(encrypted_key) - if type == "OPERATOR_SESSION": - permissions = [] - perms = key._OperatorSessionKeyPermissions - for (descriptor, value) in perms.ListFields(): - if value == 1: - permissions.append(descriptor.name) - print(permissions) - else: - permissions = [] - session.keys.append(Key(key_id, type, Padding.unpad(decrypted_key, 16), permissions)) - - self.logger.info("decrypted all keys") - return 0 - - def get_keys(self, session_id): - if session_id in self.sessions: - return self.sessions[session_id].keys - else: - self.logger.error("session not found") - return 1 diff --git a/pywidevine/L3/cdm/deviceconfig.py b/pywidevine/L3/cdm/deviceconfig.py deleted file mode 100644 index eaa382e..0000000 --- a/pywidevine/L3/cdm/deviceconfig.py +++ /dev/null @@ -1,53 +0,0 @@ -import os - -device_android_generic = { - 'name': 'android_generic', - 'description': 'android studio cdm', - 'security_level': 3, - 'session_id_type': 'android', - 'private_key_available': True, - 'vmp': False, - 'send_key_control_nonce': True -} - -devices_available = [device_android_generic] - -FILES_FOLDER = 'devices' - -class DeviceConfig: - def __init__(self, device): - self.device_name = device['name'] - self.description = device['description'] - self.security_level = device['security_level'] - self.session_id_type = device['session_id_type'] - self.private_key_available = device['private_key_available'] - self.vmp = device['vmp'] - self.send_key_control_nonce = device['send_key_control_nonce'] - - if 'keybox_filename' in device: - self.keybox_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['keybox_filename']) - else: - self.keybox_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'keybox') - - if 'device_cert_filename' in device: - self.device_cert_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_cert_filename']) - else: - self.device_cert_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_cert') - - if 'device_private_key_filename' in device: - self.device_private_key_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_private_key_filename']) - else: - self.device_private_key_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_private_key') - - if 'device_client_id_blob_filename' in device: - self.device_client_id_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_client_id_blob_filename']) - else: - self.device_client_id_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_client_id_blob') - - if 'device_vmp_blob_filename' in device: - self.device_vmp_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], device['device_vmp_blob_filename']) - else: - self.device_vmp_blob_filename = os.path.join(os.path.dirname(__file__), FILES_FOLDER, device['name'], 'device_vmp_blob') - - def __repr__(self): - return "DeviceConfig(name={}, description={}, security_level={}, session_id_type={}, private_key_available={}, vmp={})".format(self.device_name, self.description, self.security_level, self.session_id_type, self.private_key_available, self.vmp) diff --git a/pywidevine/L3/cdm/devices/android_generic/keys_here.txt b/pywidevine/L3/cdm/devices/android_generic/keys_here.txt deleted file mode 100644 index e69de29..0000000 diff --git a/pywidevine/L3/cdm/formats/__init__.py b/pywidevine/L3/cdm/formats/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pywidevine/L3/cdm/formats/widevine_pssh_data.proto b/pywidevine/L3/cdm/formats/widevine_pssh_data.proto deleted file mode 100644 index 8c67f00..0000000 --- a/pywidevine/L3/cdm/formats/widevine_pssh_data.proto +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2016 Google Inc. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file or at -// https://developers.google.com/open-source/licenses/bsd -// -// This file defines Widevine Pssh Data proto format. - -syntax = "proto2"; - -package shaka.media; - -message WidevinePsshData { - enum Algorithm { - UNENCRYPTED = 0; - AESCTR = 1; - }; - optional Algorithm algorithm = 1; - repeated bytes key_id = 2; - - // Content provider name. - optional string provider = 3; - - // A content identifier, specified by content provider. - optional bytes content_id = 4; - - // The name of a registered policy to be used for this asset. - optional string policy = 6; - - // Crypto period index, for media using key rotation. - optional uint32 crypto_period_index = 7; - - // Optional protected context for group content. The grouped_license is a - // serialized SignedMessage. - optional bytes grouped_license = 8; - - // Protection scheme identifying the encryption algorithm. Represented as one - // of the following 4CC values: 'cenc' (AES-CTR), 'cbc1' (AES-CBC), - // 'cens' (AES-CTR subsample), 'cbcs' (AES-CBC subsample). - optional uint32 protection_scheme = 9; -} - -// Derived from WidevinePsshData. The JSON format of this proto is used in -// Widevine HLS DRM signaling v1. -// We cannot build JSON from WidevinePsshData as |key_id| is required to be in -// hex format, while |bytes| type is translated to base64 by JSON formatter, so -// we have to use |string| type and do hex conversion in the code. -message WidevineHeader { - repeated string key_ids = 2; - - // Content provider name. - optional string provider = 3; - - // A content identifier, specified by content provider. - optional bytes content_id = 4; -} diff --git a/pywidevine/L3/cdm/formats/widevine_pssh_data_pb2.py b/pywidevine/L3/cdm/formats/widevine_pssh_data_pb2.py deleted file mode 100644 index 36827c0..0000000 --- a/pywidevine/L3/cdm/formats/widevine_pssh_data_pb2.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: widevine_pssh_data.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18widevine_pssh_data.proto\x12\x0bshaka.media\"\x8f\x02\n\x10WidevinePsshData\x12:\n\talgorithm\x18\x01 \x01(\x0e\x32\'.shaka.media.WidevinePsshData.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"G\n\x0eWidevineHeader\x12\x0f\n\x07key_ids\x18\x02 \x03(\t\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c') - - - -_WIDEVINEPSSHDATA = DESCRIPTOR.message_types_by_name['WidevinePsshData'] -_WIDEVINEHEADER = DESCRIPTOR.message_types_by_name['WidevineHeader'] -_WIDEVINEPSSHDATA_ALGORITHM = _WIDEVINEPSSHDATA.enum_types_by_name['Algorithm'] -WidevinePsshData = _reflection.GeneratedProtocolMessageType('WidevinePsshData', (_message.Message,), { - 'DESCRIPTOR' : _WIDEVINEPSSHDATA, - '__module__' : 'widevine_pssh_data_pb2' - # @@protoc_insertion_point(class_scope:shaka.media.WidevinePsshData) - }) -_sym_db.RegisterMessage(WidevinePsshData) - -WidevineHeader = _reflection.GeneratedProtocolMessageType('WidevineHeader', (_message.Message,), { - 'DESCRIPTOR' : _WIDEVINEHEADER, - '__module__' : 'widevine_pssh_data_pb2' - # @@protoc_insertion_point(class_scope:shaka.media.WidevineHeader) - }) -_sym_db.RegisterMessage(WidevineHeader) - -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - _WIDEVINEPSSHDATA._serialized_start=42 - _WIDEVINEPSSHDATA._serialized_end=313 - _WIDEVINEPSSHDATA_ALGORITHM._serialized_start=273 - _WIDEVINEPSSHDATA_ALGORITHM._serialized_end=313 - _WIDEVINEHEADER._serialized_start=315 - _WIDEVINEHEADER._serialized_end=386 -# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/L3/cdm/formats/wv_proto2.proto b/pywidevine/L3/cdm/formats/wv_proto2.proto deleted file mode 100644 index 04c9809..0000000 --- a/pywidevine/L3/cdm/formats/wv_proto2.proto +++ /dev/null @@ -1,466 +0,0 @@ -syntax = "proto2"; - -// from x86 (partial), most of it from the ARM version: -message ClientIdentification { - enum TokenType { - KEYBOX = 0; - DEVICE_CERTIFICATE = 1; - REMOTE_ATTESTATION_CERTIFICATE = 2; - } - message NameValue { - required string Name = 1; - required string Value = 2; - } - message ClientCapabilities { - enum HdcpVersion { - HDCP_NONE = 0; - HDCP_V1 = 1; - HDCP_V2 = 2; - HDCP_V2_1 = 3; - HDCP_V2_2 = 4; - } - optional uint32 ClientToken = 1; - optional uint32 SessionToken = 2; - optional uint32 VideoResolutionConstraints = 3; - optional HdcpVersion MaxHdcpVersion = 4; - optional uint32 OemCryptoApiVersion = 5; - } - required TokenType Type = 1; - //optional bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: - optional SignedDeviceCertificate Token = 2; // use this when parsing, "bytes" when building a client id blob - repeated NameValue ClientInfo = 3; - optional bytes ProviderClientToken = 4; - optional uint32 LicenseCounter = 5; - optional ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later - optional FileHashes _FileHashes = 7; // vmp blob goes here -} - -message DeviceCertificate { - enum CertificateType { - ROOT = 0; - INTERMEDIATE = 1; - USER_DEVICE = 2; - SERVICE = 3; - } - required CertificateType Type = 1; // the compiled code reused this as ProvisionedDeviceInfo.WvSecurityLevel, however that is incorrect (compiler aliased it as they're both identical as a structure) - optional bytes SerialNumber = 2; - optional uint32 CreationTimeSeconds = 3; - optional bytes PublicKey = 4; - optional uint32 SystemId = 5; - optional uint32 TestDeviceDeprecated = 6; // is it bool or int? - optional bytes ServiceId = 7; // service URL for service certificates -} - -// missing some references, -message DeviceCertificateStatus { - enum CertificateStatus { - VALID = 0; - REVOKED = 1; - } - optional bytes SerialNumber = 1; - optional CertificateStatus Status = 2; - optional ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? -} - -message DeviceCertificateStatusList { - optional uint32 CreationTimeSeconds = 1; - repeated DeviceCertificateStatus CertificateStatus = 2; -} - -message EncryptedClientIdentification { - required string ServiceId = 1; - optional bytes ServiceCertificateSerialNumber = 2; - required bytes EncryptedClientId = 3; - required bytes EncryptedClientIdIv = 4; - required bytes EncryptedPrivacyKey = 5; -} - -// todo: fill (for this top-level type, it might be impossible/difficult) -enum LicenseType { - ZERO = 0; - DEFAULT = 1; // 1 is STREAMING/temporary license; on recent versions may go up to 3 (latest x86); it might be persist/don't persist type, unconfirmed - OFFLINE = 2; -} - -// todo: fill (for this top-level type, it might be impossible/difficult) -// this is just a guess because these globals got lost, but really, do we need more? -enum ProtocolVersion { - CURRENT = 21; // don't have symbols for this -} - - -message LicenseIdentification { - optional bytes RequestId = 1; - optional bytes SessionId = 2; - optional bytes PurchaseId = 3; - optional LicenseType Type = 4; - optional uint32 Version = 5; - optional bytes ProviderSessionToken = 6; -} - - -message License { - message Policy { - optional bool CanPlay = 1; // changed from uint32 to bool - optional bool CanPersist = 2; - optional bool CanRenew = 3; - optional uint32 RentalDurationSeconds = 4; - optional uint32 PlaybackDurationSeconds = 5; - optional uint32 LicenseDurationSeconds = 6; - optional uint32 RenewalRecoveryDurationSeconds = 7; - optional string RenewalServerUrl = 8; - optional uint32 RenewalDelaySeconds = 9; - optional uint32 RenewalRetryIntervalSeconds = 10; - optional bool RenewWithUsage = 11; // was uint32 - } - message KeyContainer { - enum KeyType { - SIGNING = 1; - CONTENT = 2; - KEY_CONTROL = 3; - OPERATOR_SESSION = 4; - } - enum SecurityLevel { - SW_SECURE_CRYPTO = 1; - SW_SECURE_DECODE = 2; - HW_SECURE_CRYPTO = 3; - HW_SECURE_DECODE = 4; - HW_SECURE_ALL = 5; - } - message OutputProtection { - enum CGMS { - COPY_FREE = 0; - COPY_ONCE = 2; - COPY_NEVER = 3; - CGMS_NONE = 0x2A; // PC default! - } - optional ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away - optional CGMS CgmsFlags = 2; - } - message KeyControl { - required bytes KeyControlBlock = 1; // what is this? - required bytes Iv = 2; - } - message OperatorSessionKeyPermissions { - optional uint32 AllowEncrypt = 1; - optional uint32 AllowDecrypt = 2; - optional uint32 AllowSign = 3; - optional uint32 AllowSignatureVerify = 4; - } - message VideoResolutionConstraint { - optional uint32 MinResolutionPixels = 1; - optional uint32 MaxResolutionPixels = 2; - optional OutputProtection RequiredProtection = 3; - } - optional bytes Id = 1; - optional bytes Iv = 2; - optional bytes Key = 3; - optional KeyType Type = 4; - optional SecurityLevel Level = 5; - optional OutputProtection RequiredProtection = 6; - optional OutputProtection RequestedProtection = 7; - optional KeyControl _KeyControl = 8; // duped names, etc - optional OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc - repeated VideoResolutionConstraint VideoResolutionConstraints = 10; - } - optional LicenseIdentification Id = 1; - optional Policy _Policy = 2; // duped names, etc - repeated KeyContainer Key = 3; - optional uint32 LicenseStartTime = 4; - optional uint32 RemoteAttestationVerified = 5; // bool? - optional bytes ProviderClientToken = 6; - // there might be more, check with newer versions (I see field 7-8 in a lic) - // this appeared in latest x86: - optional uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) -} - -message LicenseError { - enum Error { - INVALID_DEVICE_CERTIFICATE = 1; - REVOKED_DEVICE_CERTIFICATE = 2; - SERVICE_UNAVAILABLE = 3; - } - //LicenseRequest.RequestType ErrorCode; // clang mismatch - optional Error ErrorCode = 1; -} - -message LicenseRequest { - message ContentIdentification { - message CENC { - //optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: - optional WidevineCencHeader Pssh = 1; - optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) - optional bytes RequestId = 3; - } - message WebM { - optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used - optional LicenseType LicenseType = 2; - optional bytes RequestId = 3; - } - message ExistingLicense { - optional LicenseIdentification LicenseId = 1; - optional uint32 SecondsSinceStarted = 2; - optional uint32 SecondsSinceLastPlayed = 3; - optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! - } - optional CENC CencId = 1; - optional WebM WebmId = 2; - optional ExistingLicense License = 3; - } - enum RequestType { - NEW = 1; - RENEWAL = 2; - RELEASE = 3; - } - optional ClientIdentification ClientId = 1; - optional ContentIdentification ContentId = 2; - optional RequestType Type = 3; - optional uint32 RequestTime = 4; - optional bytes KeyControlNonceDeprecated = 5; - optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this - optional uint32 KeyControlNonce = 7; - optional EncryptedClientIdentification EncryptedClientId = 8; -} - -// raw pssh hack -message LicenseRequestRaw { - message ContentIdentification { - message CENC { - optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: - //optional WidevineCencHeader Pssh = 1; - optional LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) - optional bytes RequestId = 3; - } - message WebM { - optional bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used - optional LicenseType LicenseType = 2; - optional bytes RequestId = 3; - } - message ExistingLicense { - optional LicenseIdentification LicenseId = 1; - optional uint32 SecondsSinceStarted = 2; - optional uint32 SecondsSinceLastPlayed = 3; - optional bytes SessionUsageTableEntry = 4; // interesting! try to figure out the connection between the usage table blob and KCB! - } - optional CENC CencId = 1; - optional WebM WebmId = 2; - optional ExistingLicense License = 3; - } - enum RequestType { - NEW = 1; - RENEWAL = 2; - RELEASE = 3; - } - optional ClientIdentification ClientId = 1; - optional ContentIdentification ContentId = 2; - optional RequestType Type = 3; - optional uint32 RequestTime = 4; - optional bytes KeyControlNonceDeprecated = 5; - optional ProtocolVersion ProtocolVersion = 6; // lacking symbols for this - optional uint32 KeyControlNonce = 7; - optional EncryptedClientIdentification EncryptedClientId = 8; -} - - -message ProvisionedDeviceInfo { - enum WvSecurityLevel { - LEVEL_UNSPECIFIED = 0; - LEVEL_1 = 1; - LEVEL_2 = 2; - LEVEL_3 = 3; - } - optional uint32 SystemId = 1; - optional string Soc = 2; - optional string Manufacturer = 3; - optional string Model = 4; - optional string DeviceType = 5; - optional uint32 ModelYear = 6; - optional WvSecurityLevel SecurityLevel = 7; - optional uint32 TestDevice = 8; // bool? -} - - -// todo: fill -message ProvisioningOptions { -} - -// todo: fill -message ProvisioningRequest { -} - -// todo: fill -message ProvisioningResponse { -} - -message RemoteAttestation { - optional EncryptedClientIdentification Certificate = 1; - optional string Salt = 2; - optional string Signature = 3; -} - -// todo: fill -message SessionInit { -} - -// todo: fill -message SessionState { -} - -// todo: fill -message SignedCertificateStatusList { -} - -message SignedDeviceCertificate { - - //optional bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: - optional DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later - optional bytes Signature = 2; - optional SignedDeviceCertificate Signer = 3; -} - - -// todo: fill -message SignedProvisioningMessage { -} - -// the root of all messages, from either server or client -message SignedMessage { - enum MessageType { - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - optional bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - optional bytes SessionKey = 4; // often RSA wrapped for licenses - optional RemoteAttestation RemoteAttestation = 5; -} - - - -// This message is copied from google's docs, not reversed: -message WidevineCencHeader { - enum Algorithm { - UNENCRYPTED = 0; - AESCTR = 1; - }; - optional Algorithm algorithm = 1; - repeated bytes key_id = 2; - - // Content provider name. - optional string provider = 3; - - // A content identifier, specified by content provider. - optional bytes content_id = 4; - - // Track type. Acceptable values are SD, HD and AUDIO. Used to - // differentiate content keys used by an asset. - optional string track_type_deprecated = 5; - - // The name of a registered policy to be used for this asset. - optional string policy = 6; - - // Crypto period index, for media using key rotation. - optional uint32 crypto_period_index = 7; - - // Optional protected context for group content. The grouped_license is a - // serialized SignedMessage. - optional bytes grouped_license = 8; - - // Protection scheme identifying the encryption algorithm. - // Represented as one of the following 4CC values: - // 'cenc' (AESCTR), 'cbc1' (AESCBC), - // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). - optional uint32 protection_scheme = 9; - - // Optional. For media using key rotation, this represents the duration - // of each crypto period in seconds. - optional uint32 crypto_period_seconds = 10; -} - - -// remove these when using it outside of protoc: - -// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically -message SignedLicenseRequest { - enum MessageType { - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - optional LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - optional bytes SessionKey = 4; // often RSA wrapped for licenses - optional RemoteAttestation RemoteAttestation = 5; -} - -// hack -message SignedLicenseRequestRaw { - enum MessageType { - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - optional LicenseRequestRaw Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - optional bytes SessionKey = 4; // often RSA wrapped for licenses - optional RemoteAttestation RemoteAttestation = 5; -} - - -message SignedLicense { - enum MessageType { - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - optional License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - optional bytes SessionKey = 4; // often RSA wrapped for licenses - optional RemoteAttestation RemoteAttestation = 5; -} - -message SignedServiceCertificate { - enum MessageType { - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - optional MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - optional SignedDeviceCertificate Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - optional bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - optional bytes SessionKey = 4; // often RSA wrapped for licenses - optional RemoteAttestation RemoteAttestation = 5; -} - -//vmp support -message FileHashes { - message Signature { - optional string filename = 1; - optional bool test_signing = 2; //0 - release, 1 - testing - optional bytes SHA512Hash = 3; - optional bool main_exe = 4; //0 for dlls, 1 for exe, this is field 3 in file - optional bytes signature = 5; - } - optional bytes signer = 1; - repeated Signature signatures = 2; -} diff --git a/pywidevine/L3/cdm/formats/wv_proto2_pb2.py b/pywidevine/L3/cdm/formats/wv_proto2_pb2.py deleted file mode 100644 index 44fe743..0000000 --- a/pywidevine/L3/cdm/formats/wv_proto2_pb2.py +++ /dev/null @@ -1,149 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: wv_proto2.proto -"""Generated protocol buffer code.""" -from google.protobuf.internal import builder as _builder -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0fwv_proto2.proto\"\xe7\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x02(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x12 \n\x0b_FileHashes\x18\x07 \x01(\x0b\x32\x0b.FileHashes\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x02(\t\x12\r\n\x05Value\x18\x02 \x02(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x02(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x02(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x02(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x02(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x02(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xa1\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x1a\xbb\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\x08\x12\x12\n\nCanPersist\x18\x02 \x01(\x08\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\x08\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\x08\x1a\xf9\t\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x02(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"J\n\x07KeyType\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"z\n\rSecurityLevel\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\x98\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"`\n\x05\x45rror\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xac\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa9\x07\n\x11LicenseRequestRaw\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12;\n\tContentId\x18\x02 \x01(\x0b\x32(.LicenseRequestRaw.ContentIdentification\x12,\n\x04Type\x18\x03 \x01(\x0e\x32\x1e.LicenseRequestRaw.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\x96\x04\n\x15\x43ontentIdentification\x12=\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.CENC\x12=\n\x06WebmId\x18\x02 \x01(\x0b\x32-.LicenseRequestRaw.ContentIdentification.WebM\x12I\n\x07License\x18\x03 \x01(\x0b\x32\x38.LicenseRequestRaw.ContentIdentification.ExistingLicense\x1aJ\n\x04\x43\x45NC\x12\x0c\n\x04Pssh\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"0\n\x0bRequestType\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\x9b\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xba\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc3\x02\n\x17SignedLicenseRequestRaw\x12\x32\n\x04Type\x18\x01 \x01(\x0e\x32$.SignedLicenseRequestRaw.MessageType\x12\x1f\n\x03Msg\x18\x02 \x01(\x0b\x32\x12.LicenseRequestRaw\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xa5\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xcb\x02\n\x18SignedServiceCertificate\x12\x33\n\x04Type\x18\x01 \x01(\x0e\x32%.SignedServiceCertificate.MessageType\x12%\n\x03Msg\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"}\n\x0bMessageType\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xb5\x01\n\nFileHashes\x12\x0e\n\x06signer\x18\x01 \x01(\x0c\x12)\n\nsignatures\x18\x02 \x03(\x0b\x32\x15.FileHashes.Signature\x1al\n\tSignature\x12\x10\n\x08\x66ilename\x18\x01 \x01(\t\x12\x14\n\x0ctest_signing\x18\x02 \x01(\x08\x12\x12\n\nSHA512Hash\x18\x03 \x01(\x0c\x12\x10\n\x08main_exe\x18\x04 \x01(\x08\x12\x11\n\tsignature\x18\x05 \x01(\x0c*1\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01\x12\x0b\n\x07OFFLINE\x10\x02*\x1e\n\x0fProtocolVersion\x12\x0b\n\x07\x43URRENT\x10\x15') - -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'wv_proto2_pb2', globals()) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - _LICENSETYPE._serialized_start=8339 - _LICENSETYPE._serialized_end=8388 - _PROTOCOLVERSION._serialized_start=8390 - _PROTOCOLVERSION._serialized_end=8420 - _CLIENTIDENTIFICATION._serialized_start=20 - _CLIENTIDENTIFICATION._serialized_end=763 - _CLIENTIDENTIFICATION_NAMEVALUE._serialized_start=343 - _CLIENTIDENTIFICATION_NAMEVALUE._serialized_end=383 - _CLIENTIDENTIFICATION_CLIENTCAPABILITIES._serialized_start=386 - _CLIENTIDENTIFICATION_CLIENTCAPABILITIES._serialized_end=678 - _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION._serialized_start=594 - _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION._serialized_end=678 - _CLIENTIDENTIFICATION_TOKENTYPE._serialized_start=680 - _CLIENTIDENTIFICATION_TOKENTYPE._serialized_end=763 - _DEVICECERTIFICATE._serialized_start=766 - _DEVICECERTIFICATE._serialized_end=1049 - _DEVICECERTIFICATE_CERTIFICATETYPE._serialized_start=974 - _DEVICECERTIFICATE_CERTIFICATETYPE._serialized_end=1049 - _DEVICECERTIFICATESTATUS._serialized_start=1052 - _DEVICECERTIFICATESTATUS._serialized_end=1248 - _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS._serialized_start=1205 - _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS._serialized_end=1248 - _DEVICECERTIFICATESTATUSLIST._serialized_start=1250 - _DEVICECERTIFICATESTATUSLIST._serialized_end=1361 - _ENCRYPTEDCLIENTIDENTIFICATION._serialized_start=1364 - _ENCRYPTEDCLIENTIDENTIFICATION._serialized_end=1539 - _LICENSEIDENTIFICATION._serialized_start=1542 - _LICENSEIDENTIFICATION._serialized_end=1698 - _LICENSE._serialized_start=1701 - _LICENSE._serialized_end=3526 - _LICENSE_POLICY._serialized_start=1935 - _LICENSE_POLICY._serialized_end=2250 - _LICENSE_KEYCONTAINER._serialized_start=2253 - _LICENSE_KEYCONTAINER._serialized_end=3526 - _LICENSE_KEYCONTAINER_OUTPUTPROTECTION._serialized_start=2774 - _LICENSE_KEYCONTAINER_OUTPUTPROTECTION._serialized_end=2993 - _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS._serialized_start=2926 - _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS._serialized_end=2993 - _LICENSE_KEYCONTAINER_KEYCONTROL._serialized_start=2995 - _LICENSE_KEYCONTAINER_KEYCONTROL._serialized_end=3044 - _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS._serialized_start=3046 - _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS._serialized_end=3170 - _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT._serialized_start=3173 - _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT._serialized_end=3326 - _LICENSE_KEYCONTAINER_KEYTYPE._serialized_start=3328 - _LICENSE_KEYCONTAINER_KEYTYPE._serialized_end=3402 - _LICENSE_KEYCONTAINER_SECURITYLEVEL._serialized_start=3404 - _LICENSE_KEYCONTAINER_SECURITYLEVEL._serialized_end=3526 - _LICENSEERROR._serialized_start=3529 - _LICENSEERROR._serialized_end=3681 - _LICENSEERROR_ERROR._serialized_start=3585 - _LICENSEERROR_ERROR._serialized_end=3681 - _LICENSEREQUEST._serialized_start=3684 - _LICENSEREQUEST._serialized_end=4624 - _LICENSEREQUEST_CONTENTIDENTIFICATION._serialized_start=4028 - _LICENSEREQUEST_CONTENTIDENTIFICATION._serialized_end=4574 - _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC._serialized_start=4245 - _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC._serialized_end=4340 - _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM._serialized_start=4342 - _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM._serialized_end=4418 - _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE._serialized_start=4421 - _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE._serialized_end=4574 - _LICENSEREQUEST_REQUESTTYPE._serialized_start=4576 - _LICENSEREQUEST_REQUESTTYPE._serialized_end=4624 - _LICENSEREQUESTRAW._serialized_start=4627 - _LICENSEREQUESTRAW._serialized_end=5564 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION._serialized_start=4980 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION._serialized_end=5514 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC._serialized_start=5206 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_CENC._serialized_end=5280 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM._serialized_start=4342 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_WEBM._serialized_end=4418 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE._serialized_start=4421 - _LICENSEREQUESTRAW_CONTENTIDENTIFICATION_EXISTINGLICENSE._serialized_end=4574 - _LICENSEREQUESTRAW_REQUESTTYPE._serialized_start=4576 - _LICENSEREQUESTRAW_REQUESTTYPE._serialized_end=4624 - _PROVISIONEDDEVICEINFO._serialized_start=5567 - _PROVISIONEDDEVICEINFO._serialized_end=5861 - _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL._serialized_start=5782 - _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL._serialized_end=5861 - _PROVISIONINGOPTIONS._serialized_start=5863 - _PROVISIONINGOPTIONS._serialized_end=5884 - _PROVISIONINGREQUEST._serialized_start=5886 - _PROVISIONINGREQUEST._serialized_end=5907 - _PROVISIONINGRESPONSE._serialized_start=5909 - _PROVISIONINGRESPONSE._serialized_end=5931 - _REMOTEATTESTATION._serialized_start=5933 - _REMOTEATTESTATION._serialized_end=6038 - _SESSIONINIT._serialized_start=6040 - _SESSIONINIT._serialized_end=6053 - _SESSIONSTATE._serialized_start=6055 - _SESSIONSTATE._serialized_end=6069 - _SIGNEDCERTIFICATESTATUSLIST._serialized_start=6071 - _SIGNEDCERTIFICATESTATUSLIST._serialized_end=6100 - _SIGNEDDEVICECERTIFICATE._serialized_start=6103 - _SIGNEDDEVICECERTIFICATE._serialized_end=6237 - _SIGNEDPROVISIONINGMESSAGE._serialized_start=6239 - _SIGNEDPROVISIONINGMESSAGE._serialized_end=6266 - _SIGNEDMESSAGE._serialized_start=6269 - _SIGNEDMESSAGE._serialized_end=6552 - _SIGNEDMESSAGE_MESSAGETYPE._serialized_start=6427 - _SIGNEDMESSAGE_MESSAGETYPE._serialized_end=6552 - _WIDEVINECENCHEADER._serialized_start=6555 - _WIDEVINECENCHEADER._serialized_end=6880 - _WIDEVINECENCHEADER_ALGORITHM._serialized_start=6840 - _WIDEVINECENCHEADER_ALGORITHM._serialized_end=6880 - _SIGNEDLICENSEREQUEST._serialized_start=6883 - _SIGNEDLICENSEREQUEST._serialized_end=7197 - _SIGNEDLICENSEREQUEST_MESSAGETYPE._serialized_start=6427 - _SIGNEDLICENSEREQUEST_MESSAGETYPE._serialized_end=6552 - _SIGNEDLICENSEREQUESTRAW._serialized_start=7200 - _SIGNEDLICENSEREQUESTRAW._serialized_end=7523 - _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE._serialized_start=6427 - _SIGNEDLICENSEREQUESTRAW_MESSAGETYPE._serialized_end=6552 - _SIGNEDLICENSE._serialized_start=7526 - _SIGNEDLICENSE._serialized_end=7819 - _SIGNEDLICENSE_MESSAGETYPE._serialized_start=6427 - _SIGNEDLICENSE_MESSAGETYPE._serialized_end=6552 - _SIGNEDSERVICECERTIFICATE._serialized_start=7822 - _SIGNEDSERVICECERTIFICATE._serialized_end=8153 - _SIGNEDSERVICECERTIFICATE_MESSAGETYPE._serialized_start=6427 - _SIGNEDSERVICECERTIFICATE_MESSAGETYPE._serialized_end=6552 - _FILEHASHES._serialized_start=8156 - _FILEHASHES._serialized_end=8337 - _FILEHASHES_SIGNATURE._serialized_start=8229 - _FILEHASHES_SIGNATURE._serialized_end=8337 -# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/L3/cdm/formats/wv_proto3.proto b/pywidevine/L3/cdm/formats/wv_proto3.proto deleted file mode 100644 index 7861b02..0000000 --- a/pywidevine/L3/cdm/formats/wv_proto3.proto +++ /dev/null @@ -1,389 +0,0 @@ -// beware proto3 won't show missing fields it seems, need to change to "proto2" and add "optional" before every field, and remove all the dummy enum members I added: -syntax = "proto3"; - -// from x86 (partial), most of it from the ARM version: -message ClientIdentification { - enum TokenType { - KEYBOX = 0; - DEVICE_CERTIFICATE = 1; - REMOTE_ATTESTATION_CERTIFICATE = 2; - } - message NameValue { - string Name = 1; - string Value = 2; - } - message ClientCapabilities { - enum HdcpVersion { - HDCP_NONE = 0; - HDCP_V1 = 1; - HDCP_V2 = 2; - HDCP_V2_1 = 3; - HDCP_V2_2 = 4; - } - uint32 ClientToken = 1; - uint32 SessionToken = 2; - uint32 VideoResolutionConstraints = 3; - HdcpVersion MaxHdcpVersion = 4; - uint32 OemCryptoApiVersion = 5; - } - TokenType Type = 1; - //bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: - SignedDeviceCertificate Token = 2; - repeated NameValue ClientInfo = 3; - bytes ProviderClientToken = 4; - uint32 LicenseCounter = 5; - ClientCapabilities _ClientCapabilities = 6; // how should we deal with duped names? will have to look at proto docs later -} - -message DeviceCertificate { - enum CertificateType { - ROOT = 0; - INTERMEDIATE = 1; - USER_DEVICE = 2; - SERVICE = 3; - } - //ProvisionedDeviceInfo.WvSecurityLevel Type = 1; // is this how one is supposed to call it? (it's an enum) there might be a bug here, with CertificateType getting confused with WvSecurityLevel, for now renaming it (verify against other binaries) - CertificateType Type = 1; - bytes SerialNumber = 2; - uint32 CreationTimeSeconds = 3; - bytes PublicKey = 4; - uint32 SystemId = 5; - uint32 TestDeviceDeprecated = 6; // is it bool or int? - bytes ServiceId = 7; // service URL for service certificates -} - -// missing some references, -message DeviceCertificateStatus { - enum CertificateStatus { - VALID = 0; - REVOKED = 1; - } - bytes SerialNumber = 1; - CertificateStatus Status = 2; - ProvisionedDeviceInfo DeviceInfo = 4; // where is 3? is it deprecated? -} - -message DeviceCertificateStatusList { - uint32 CreationTimeSeconds = 1; - repeated DeviceCertificateStatus CertificateStatus = 2; -} - -message EncryptedClientIdentification { - string ServiceId = 1; - bytes ServiceCertificateSerialNumber = 2; - bytes EncryptedClientId = 3; - bytes EncryptedClientIdIv = 4; - bytes EncryptedPrivacyKey = 5; -} - -// todo: fill (for this top-level type, it might be impossible/difficult) -enum LicenseType { - ZERO = 0; - DEFAULT = 1; // do not know what this is either, but should be 1; on recent versions may go up to 3 (latest x86) -} - -// todo: fill (for this top-level type, it might be impossible/difficult) -// this is just a guess because these globals got lost, but really, do we need more? -enum ProtocolVersion { - DUMMY = 0; - CURRENT = 21; // don't have symbols for this -} - - -message LicenseIdentification { - bytes RequestId = 1; - bytes SessionId = 2; - bytes PurchaseId = 3; - LicenseType Type = 4; - uint32 Version = 5; - bytes ProviderSessionToken = 6; -} - - -message License { - message Policy { - uint32 CanPlay = 1; - uint32 CanPersist = 2; - uint32 CanRenew = 3; - uint32 RentalDurationSeconds = 4; - uint32 PlaybackDurationSeconds = 5; - uint32 LicenseDurationSeconds = 6; - uint32 RenewalRecoveryDurationSeconds = 7; - string RenewalServerUrl = 8; - uint32 RenewalDelaySeconds = 9; - uint32 RenewalRetryIntervalSeconds = 10; - uint32 RenewWithUsage = 11; - uint32 UnknownPolicy12 = 12; - } - message KeyContainer { - enum KeyType { - _NOKEYTYPE = 0; // dummy, added to satisfy proto3, not present in original - SIGNING = 1; - CONTENT = 2; - KEY_CONTROL = 3; - OPERATOR_SESSION = 4; - } - enum SecurityLevel { - _NOSECLEVEL = 0; // dummy, added to satisfy proto3, not present in original - SW_SECURE_CRYPTO = 1; - SW_SECURE_DECODE = 2; - HW_SECURE_CRYPTO = 3; - HW_SECURE_DECODE = 4; - HW_SECURE_ALL = 5; - } - message OutputProtection { - enum CGMS { - COPY_FREE = 0; - COPY_ONCE = 2; - COPY_NEVER = 3; - CGMS_NONE = 0x2A; // PC default! - } - ClientIdentification.ClientCapabilities.HdcpVersion Hdcp = 1; // it's most likely a copy of Hdcp version available here, but compiler optimized it away - CGMS CgmsFlags = 2; - } - message KeyControl { - bytes KeyControlBlock = 1; // what is this? - bytes Iv = 2; - } - message OperatorSessionKeyPermissions { - uint32 AllowEncrypt = 1; - uint32 AllowDecrypt = 2; - uint32 AllowSign = 3; - uint32 AllowSignatureVerify = 4; - } - message VideoResolutionConstraint { - uint32 MinResolutionPixels = 1; - uint32 MaxResolutionPixels = 2; - OutputProtection RequiredProtection = 3; - } - bytes Id = 1; - bytes Iv = 2; - bytes Key = 3; - KeyType Type = 4; - SecurityLevel Level = 5; - OutputProtection RequiredProtection = 6; - OutputProtection RequestedProtection = 7; - KeyControl _KeyControl = 8; // duped names, etc - OperatorSessionKeyPermissions _OperatorSessionKeyPermissions = 9; // duped names, etc - repeated VideoResolutionConstraint VideoResolutionConstraints = 10; - } - LicenseIdentification Id = 1; - Policy _Policy = 2; // duped names, etc - repeated KeyContainer Key = 3; - uint32 LicenseStartTime = 4; - uint32 RemoteAttestationVerified = 5; // bool? - bytes ProviderClientToken = 6; - // there might be more, check with newer versions (I see field 7-8 in a lic) - // this appeared in latest x86: - uint32 ProtectionScheme = 7; // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) - bytes UnknownHdcpDataField = 8; -} - -message LicenseError { - enum Error { - DUMMY_NO_ERROR = 0; // dummy, added to satisfy proto3 - INVALID_DEVICE_CERTIFICATE = 1; - REVOKED_DEVICE_CERTIFICATE = 2; - SERVICE_UNAVAILABLE = 3; - } - //LicenseRequest.RequestType ErrorCode; // clang mismatch - Error ErrorCode = 1; -} - -message LicenseRequest { - message ContentIdentification { - message CENC { - // bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: - WidevineCencHeader Pssh = 1; - LicenseType LicenseType = 2; // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 - bytes RequestId = 3; - } - message WebM { - bytes Header = 1; // identical to CENC, aside from PSSH and the parent field number used - LicenseType LicenseType = 2; - bytes RequestId = 3; - } - message ExistingLicense { - LicenseIdentification LicenseId = 1; - uint32 SecondsSinceStarted = 2; - uint32 SecondsSinceLastPlayed = 3; - bytes SessionUsageTableEntry = 4; - } - CENC CencId = 1; - WebM WebmId = 2; - ExistingLicense License = 3; - } - enum RequestType { - DUMMY_REQ_TYPE = 0; // dummy, added to satisfy proto3 - NEW = 1; - RENEWAL = 2; - RELEASE = 3; - } - ClientIdentification ClientId = 1; - ContentIdentification ContentId = 2; - RequestType Type = 3; - uint32 RequestTime = 4; - bytes KeyControlNonceDeprecated = 5; - ProtocolVersion ProtocolVersion = 6; // lacking symbols for this - uint32 KeyControlNonce = 7; - EncryptedClientIdentification EncryptedClientId = 8; -} - -message ProvisionedDeviceInfo { - enum WvSecurityLevel { - LEVEL_UNSPECIFIED = 0; - LEVEL_1 = 1; - LEVEL_2 = 2; - LEVEL_3 = 3; - } - uint32 SystemId = 1; - string Soc = 2; - string Manufacturer = 3; - string Model = 4; - string DeviceType = 5; - uint32 ModelYear = 6; - WvSecurityLevel SecurityLevel = 7; - uint32 TestDevice = 8; // bool? -} - - -// todo: fill -message ProvisioningOptions { -} - -// todo: fill -message ProvisioningRequest { -} - -// todo: fill -message ProvisioningResponse { -} - -message RemoteAttestation { - EncryptedClientIdentification Certificate = 1; - string Salt = 2; - string Signature = 3; -} - -// todo: fill -message SessionInit { -} - -// todo: fill -message SessionState { -} - -// todo: fill -message SignedCertificateStatusList { -} - -message SignedDeviceCertificate { - - //bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: - DeviceCertificate _DeviceCertificate = 1; // how should we deal with duped names? will have to look at proto docs later - bytes Signature = 2; - SignedDeviceCertificate Signer = 3; -} - - -// todo: fill -message SignedProvisioningMessage { -} - -// the root of all messages, from either server or client -message SignedMessage { - enum MessageType { - DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - bytes Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - bytes SessionKey = 4; // often RSA wrapped for licenses - RemoteAttestation RemoteAttestation = 5; -} - - - -// This message is copied from google's docs, not reversed: -message WidevineCencHeader { - enum Algorithm { - UNENCRYPTED = 0; - AESCTR = 1; - }; - Algorithm algorithm = 1; - repeated bytes key_id = 2; - - // Content provider name. - string provider = 3; - - // A content identifier, specified by content provider. - bytes content_id = 4; - - // Track type. Acceptable values are SD, HD and AUDIO. Used to - // differentiate content keys used by an asset. - string track_type_deprecated = 5; - - // The name of a registered policy to be used for this asset. - string policy = 6; - - // Crypto period index, for media using key rotation. - uint32 crypto_period_index = 7; - - // Optional protected context for group content. The grouped_license is a - // serialized SignedMessage. - bytes grouped_license = 8; - - // Protection scheme identifying the encryption algorithm. - // Represented as one of the following 4CC values: - // 'cenc' (AESCTR), 'cbc1' (AESCBC), - // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). - uint32 protection_scheme = 9; - - // Optional. For media using key rotation, this represents the duration - // of each crypto period in seconds. - uint32 crypto_period_seconds = 10; -} - - - - -// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically -message SignedLicenseRequest { - enum MessageType { - DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - LicenseRequest Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - bytes SessionKey = 4; // often RSA wrapped for licenses - RemoteAttestation RemoteAttestation = 5; -} - -message SignedLicense { - enum MessageType { - DUMMY_MSG_TYPE = 0; // dummy, added to satisfy proto3 - LICENSE_REQUEST = 1; - LICENSE = 2; - ERROR_RESPONSE = 3; - SERVICE_CERTIFICATE_REQUEST = 4; - SERVICE_CERTIFICATE = 5; - } - MessageType Type = 1; // has in incorrect overlap with License_KeyContainer_SecurityLevel - License Msg = 2; // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present - // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE - bytes Signature = 3; // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) - bytes SessionKey = 4; // often RSA wrapped for licenses - RemoteAttestation RemoteAttestation = 5; -} \ No newline at end of file diff --git a/pywidevine/L3/cdm/formats/wv_proto3_pb2.py b/pywidevine/L3/cdm/formats/wv_proto3_pb2.py deleted file mode 100644 index 11ae09f..0000000 --- a/pywidevine/L3/cdm/formats/wv_proto3_pb2.py +++ /dev/null @@ -1,2686 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: wv_proto3.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf.internal import enum_type_wrapper -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -from google.protobuf import descriptor_pb2 -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='wv_proto3.proto', - package='', - syntax='proto3', - serialized_pb=_b('\n\x0fwv_proto3.proto\"\xc5\x05\n\x14\x43lientIdentification\x12-\n\x04Type\x18\x01 \x01(\x0e\x32\x1f.ClientIdentification.TokenType\x12\'\n\x05Token\x18\x02 \x01(\x0b\x32\x18.SignedDeviceCertificate\x12\x33\n\nClientInfo\x18\x03 \x03(\x0b\x32\x1f.ClientIdentification.NameValue\x12\x1b\n\x13ProviderClientToken\x18\x04 \x01(\x0c\x12\x16\n\x0eLicenseCounter\x18\x05 \x01(\r\x12\x45\n\x13_ClientCapabilities\x18\x06 \x01(\x0b\x32(.ClientIdentification.ClientCapabilities\x1a(\n\tNameValue\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\r\n\x05Value\x18\x02 \x01(\t\x1a\xa4\x02\n\x12\x43lientCapabilities\x12\x13\n\x0b\x43lientToken\x18\x01 \x01(\r\x12\x14\n\x0cSessionToken\x18\x02 \x01(\r\x12\"\n\x1aVideoResolutionConstraints\x18\x03 \x01(\r\x12L\n\x0eMaxHdcpVersion\x18\x04 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12\x1b\n\x13OemCryptoApiVersion\x18\x05 \x01(\r\"T\n\x0bHdcpVersion\x12\r\n\tHDCP_NONE\x10\x00\x12\x0b\n\x07HDCP_V1\x10\x01\x12\x0b\n\x07HDCP_V2\x10\x02\x12\r\n\tHDCP_V2_1\x10\x03\x12\r\n\tHDCP_V2_2\x10\x04\"S\n\tTokenType\x12\n\n\x06KEYBOX\x10\x00\x12\x16\n\x12\x44\x45VICE_CERTIFICATE\x10\x01\x12\"\n\x1eREMOTE_ATTESTATION_CERTIFICATE\x10\x02\"\x9b\x02\n\x11\x44\x65viceCertificate\x12\x30\n\x04Type\x18\x01 \x01(\x0e\x32\".DeviceCertificate.CertificateType\x12\x14\n\x0cSerialNumber\x18\x02 \x01(\x0c\x12\x1b\n\x13\x43reationTimeSeconds\x18\x03 \x01(\r\x12\x11\n\tPublicKey\x18\x04 \x01(\x0c\x12\x10\n\x08SystemId\x18\x05 \x01(\r\x12\x1c\n\x14TestDeviceDeprecated\x18\x06 \x01(\r\x12\x11\n\tServiceId\x18\x07 \x01(\x0c\"K\n\x0f\x43\x65rtificateType\x12\x08\n\x04ROOT\x10\x00\x12\x10\n\x0cINTERMEDIATE\x10\x01\x12\x0f\n\x0bUSER_DEVICE\x10\x02\x12\x0b\n\x07SERVICE\x10\x03\"\xc4\x01\n\x17\x44\x65viceCertificateStatus\x12\x14\n\x0cSerialNumber\x18\x01 \x01(\x0c\x12:\n\x06Status\x18\x02 \x01(\x0e\x32*.DeviceCertificateStatus.CertificateStatus\x12*\n\nDeviceInfo\x18\x04 \x01(\x0b\x32\x16.ProvisionedDeviceInfo\"+\n\x11\x43\x65rtificateStatus\x12\t\n\x05VALID\x10\x00\x12\x0b\n\x07REVOKED\x10\x01\"o\n\x1b\x44\x65viceCertificateStatusList\x12\x1b\n\x13\x43reationTimeSeconds\x18\x01 \x01(\r\x12\x33\n\x11\x43\x65rtificateStatus\x18\x02 \x03(\x0b\x32\x18.DeviceCertificateStatus\"\xaf\x01\n\x1d\x45ncryptedClientIdentification\x12\x11\n\tServiceId\x18\x01 \x01(\t\x12&\n\x1eServiceCertificateSerialNumber\x18\x02 \x01(\x0c\x12\x19\n\x11\x45ncryptedClientId\x18\x03 \x01(\x0c\x12\x1b\n\x13\x45ncryptedClientIdIv\x18\x04 \x01(\x0c\x12\x1b\n\x13\x45ncryptedPrivacyKey\x18\x05 \x01(\x0c\"\x9c\x01\n\x15LicenseIdentification\x12\x11\n\tRequestId\x18\x01 \x01(\x0c\x12\x11\n\tSessionId\x18\x02 \x01(\x0c\x12\x12\n\nPurchaseId\x18\x03 \x01(\x0c\x12\x1a\n\x04Type\x18\x04 \x01(\x0e\x32\x0c.LicenseType\x12\x0f\n\x07Version\x18\x05 \x01(\r\x12\x1c\n\x14ProviderSessionToken\x18\x06 \x01(\x0c\"\xfa\x0e\n\x07License\x12\"\n\x02Id\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12 \n\x07_Policy\x18\x02 \x01(\x0b\x32\x0f.License.Policy\x12\"\n\x03Key\x18\x03 \x03(\x0b\x32\x15.License.KeyContainer\x12\x18\n\x10LicenseStartTime\x18\x04 \x01(\r\x12!\n\x19RemoteAttestationVerified\x18\x05 \x01(\r\x12\x1b\n\x13ProviderClientToken\x18\x06 \x01(\x0c\x12\x18\n\x10ProtectionScheme\x18\x07 \x01(\r\x12\x1c\n\x14UnknownHdcpDataField\x18\x08 \x01(\x0c\x1a\xd4\x02\n\x06Policy\x12\x0f\n\x07\x43\x61nPlay\x18\x01 \x01(\r\x12\x12\n\nCanPersist\x18\x02 \x01(\r\x12\x10\n\x08\x43\x61nRenew\x18\x03 \x01(\r\x12\x1d\n\x15RentalDurationSeconds\x18\x04 \x01(\r\x12\x1f\n\x17PlaybackDurationSeconds\x18\x05 \x01(\r\x12\x1e\n\x16LicenseDurationSeconds\x18\x06 \x01(\r\x12&\n\x1eRenewalRecoveryDurationSeconds\x18\x07 \x01(\r\x12\x18\n\x10RenewalServerUrl\x18\x08 \x01(\t\x12\x1b\n\x13RenewalDelaySeconds\x18\t \x01(\r\x12#\n\x1bRenewalRetryIntervalSeconds\x18\n \x01(\r\x12\x16\n\x0eRenewWithUsage\x18\x0b \x01(\r\x12\x17\n\x0fUnknownPolicy12\x18\x0c \x01(\r\x1a\x9b\n\n\x0cKeyContainer\x12\n\n\x02Id\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x12\x0b\n\x03Key\x18\x03 \x01(\x0c\x12+\n\x04Type\x18\x04 \x01(\x0e\x32\x1d.License.KeyContainer.KeyType\x12\x32\n\x05Level\x18\x05 \x01(\x0e\x32#.License.KeyContainer.SecurityLevel\x12\x42\n\x12RequiredProtection\x18\x06 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x43\n\x13RequestedProtection\x18\x07 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\x12\x35\n\x0b_KeyControl\x18\x08 \x01(\x0b\x32 .License.KeyContainer.KeyControl\x12[\n\x1e_OperatorSessionKeyPermissions\x18\t \x01(\x0b\x32\x33.License.KeyContainer.OperatorSessionKeyPermissions\x12S\n\x1aVideoResolutionConstraints\x18\n \x03(\x0b\x32/.License.KeyContainer.VideoResolutionConstraint\x1a\xdb\x01\n\x10OutputProtection\x12\x42\n\x04Hdcp\x18\x01 \x01(\x0e\x32\x34.ClientIdentification.ClientCapabilities.HdcpVersion\x12>\n\tCgmsFlags\x18\x02 \x01(\x0e\x32+.License.KeyContainer.OutputProtection.CGMS\"C\n\x04\x43GMS\x12\r\n\tCOPY_FREE\x10\x00\x12\r\n\tCOPY_ONCE\x10\x02\x12\x0e\n\nCOPY_NEVER\x10\x03\x12\r\n\tCGMS_NONE\x10*\x1a\x31\n\nKeyControl\x12\x17\n\x0fKeyControlBlock\x18\x01 \x01(\x0c\x12\n\n\x02Iv\x18\x02 \x01(\x0c\x1a|\n\x1dOperatorSessionKeyPermissions\x12\x14\n\x0c\x41llowEncrypt\x18\x01 \x01(\r\x12\x14\n\x0c\x41llowDecrypt\x18\x02 \x01(\r\x12\x11\n\tAllowSign\x18\x03 \x01(\r\x12\x1c\n\x14\x41llowSignatureVerify\x18\x04 \x01(\r\x1a\x99\x01\n\x19VideoResolutionConstraint\x12\x1b\n\x13MinResolutionPixels\x18\x01 \x01(\r\x12\x1b\n\x13MaxResolutionPixels\x18\x02 \x01(\r\x12\x42\n\x12RequiredProtection\x18\x03 \x01(\x0b\x32&.License.KeyContainer.OutputProtection\"Z\n\x07KeyType\x12\x0e\n\n_NOKEYTYPE\x10\x00\x12\x0b\n\x07SIGNING\x10\x01\x12\x0b\n\x07\x43ONTENT\x10\x02\x12\x0f\n\x0bKEY_CONTROL\x10\x03\x12\x14\n\x10OPERATOR_SESSION\x10\x04\"\x8b\x01\n\rSecurityLevel\x12\x0f\n\x0b_NOSECLEVEL\x10\x00\x12\x14\n\x10SW_SECURE_CRYPTO\x10\x01\x12\x14\n\x10SW_SECURE_DECODE\x10\x02\x12\x14\n\x10HW_SECURE_CRYPTO\x10\x03\x12\x14\n\x10HW_SECURE_DECODE\x10\x04\x12\x11\n\rHW_SECURE_ALL\x10\x05\"\xac\x01\n\x0cLicenseError\x12&\n\tErrorCode\x18\x01 \x01(\x0e\x32\x13.LicenseError.Error\"t\n\x05\x45rror\x12\x12\n\x0e\x44UMMY_NO_ERROR\x10\x00\x12\x1e\n\x1aINVALID_DEVICE_CERTIFICATE\x10\x01\x12\x1e\n\x1aREVOKED_DEVICE_CERTIFICATE\x10\x02\x12\x17\n\x13SERVICE_UNAVAILABLE\x10\x03\"\xc0\x07\n\x0eLicenseRequest\x12\'\n\x08\x43lientId\x18\x01 \x01(\x0b\x32\x15.ClientIdentification\x12\x38\n\tContentId\x18\x02 \x01(\x0b\x32%.LicenseRequest.ContentIdentification\x12)\n\x04Type\x18\x03 \x01(\x0e\x32\x1b.LicenseRequest.RequestType\x12\x13\n\x0bRequestTime\x18\x04 \x01(\r\x12!\n\x19KeyControlNonceDeprecated\x18\x05 \x01(\x0c\x12)\n\x0fProtocolVersion\x18\x06 \x01(\x0e\x32\x10.ProtocolVersion\x12\x17\n\x0fKeyControlNonce\x18\x07 \x01(\r\x12\x39\n\x11\x45ncryptedClientId\x18\x08 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x1a\xa2\x04\n\x15\x43ontentIdentification\x12:\n\x06\x43\x65ncId\x18\x01 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.CENC\x12:\n\x06WebmId\x18\x02 \x01(\x0b\x32*.LicenseRequest.ContentIdentification.WebM\x12\x46\n\x07License\x18\x03 \x01(\x0b\x32\x35.LicenseRequest.ContentIdentification.ExistingLicense\x1a_\n\x04\x43\x45NC\x12!\n\x04Pssh\x18\x01 \x01(\x0b\x32\x13.WidevineCencHeader\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1aL\n\x04WebM\x12\x0e\n\x06Header\x18\x01 \x01(\x0c\x12!\n\x0bLicenseType\x18\x02 \x01(\x0e\x32\x0c.LicenseType\x12\x11\n\tRequestId\x18\x03 \x01(\x0c\x1a\x99\x01\n\x0f\x45xistingLicense\x12)\n\tLicenseId\x18\x01 \x01(\x0b\x32\x16.LicenseIdentification\x12\x1b\n\x13SecondsSinceStarted\x18\x02 \x01(\r\x12\x1e\n\x16SecondsSinceLastPlayed\x18\x03 \x01(\r\x12\x1e\n\x16SessionUsageTableEntry\x18\x04 \x01(\x0c\"D\n\x0bRequestType\x12\x12\n\x0e\x44UMMY_REQ_TYPE\x10\x00\x12\x07\n\x03NEW\x10\x01\x12\x0b\n\x07RENEWAL\x10\x02\x12\x0b\n\x07RELEASE\x10\x03\"\xa6\x02\n\x15ProvisionedDeviceInfo\x12\x10\n\x08SystemId\x18\x01 \x01(\r\x12\x0b\n\x03Soc\x18\x02 \x01(\t\x12\x14\n\x0cManufacturer\x18\x03 \x01(\t\x12\r\n\x05Model\x18\x04 \x01(\t\x12\x12\n\nDeviceType\x18\x05 \x01(\t\x12\x11\n\tModelYear\x18\x06 \x01(\r\x12=\n\rSecurityLevel\x18\x07 \x01(\x0e\x32&.ProvisionedDeviceInfo.WvSecurityLevel\x12\x12\n\nTestDevice\x18\x08 \x01(\r\"O\n\x0fWvSecurityLevel\x12\x15\n\x11LEVEL_UNSPECIFIED\x10\x00\x12\x0b\n\x07LEVEL_1\x10\x01\x12\x0b\n\x07LEVEL_2\x10\x02\x12\x0b\n\x07LEVEL_3\x10\x03\"\x15\n\x13ProvisioningOptions\"\x15\n\x13ProvisioningRequest\"\x16\n\x14ProvisioningResponse\"i\n\x11RemoteAttestation\x12\x33\n\x0b\x43\x65rtificate\x18\x01 \x01(\x0b\x32\x1e.EncryptedClientIdentification\x12\x0c\n\x04Salt\x18\x02 \x01(\t\x12\x11\n\tSignature\x18\x03 \x01(\t\"\r\n\x0bSessionInit\"\x0e\n\x0cSessionState\"\x1d\n\x1bSignedCertificateStatusList\"\x86\x01\n\x17SignedDeviceCertificate\x12.\n\x12_DeviceCertificate\x18\x01 \x01(\x0b\x32\x12.DeviceCertificate\x12\x11\n\tSignature\x18\x02 \x01(\x0c\x12(\n\x06Signer\x18\x03 \x01(\x0b\x32\x18.SignedDeviceCertificate\"\x1b\n\x19SignedProvisioningMessage\"\xb0\x02\n\rSignedMessage\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedMessage.MessageType\x12\x0b\n\x03Msg\x18\x02 \x01(\x0c\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xc5\x02\n\x12WidevineCencHeader\x12\x30\n\talgorithm\x18\x01 \x01(\x0e\x32\x1d.WidevineCencHeader.Algorithm\x12\x0e\n\x06key_id\x18\x02 \x03(\x0c\x12\x10\n\x08provider\x18\x03 \x01(\t\x12\x12\n\ncontent_id\x18\x04 \x01(\x0c\x12\x1d\n\x15track_type_deprecated\x18\x05 \x01(\t\x12\x0e\n\x06policy\x18\x06 \x01(\t\x12\x1b\n\x13\x63rypto_period_index\x18\x07 \x01(\r\x12\x17\n\x0fgrouped_license\x18\x08 \x01(\x0c\x12\x19\n\x11protection_scheme\x18\t \x01(\r\x12\x1d\n\x15\x63rypto_period_seconds\x18\n \x01(\r\"(\n\tAlgorithm\x12\x0f\n\x0bUNENCRYPTED\x10\x00\x12\n\n\x06\x41\x45SCTR\x10\x01\"\xcf\x02\n\x14SignedLicenseRequest\x12/\n\x04Type\x18\x01 \x01(\x0e\x32!.SignedLicenseRequest.MessageType\x12\x1c\n\x03Msg\x18\x02 \x01(\x0b\x32\x0f.LicenseRequest\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05\"\xba\x02\n\rSignedLicense\x12(\n\x04Type\x18\x01 \x01(\x0e\x32\x1a.SignedLicense.MessageType\x12\x15\n\x03Msg\x18\x02 \x01(\x0b\x32\x08.License\x12\x11\n\tSignature\x18\x03 \x01(\x0c\x12\x12\n\nSessionKey\x18\x04 \x01(\x0c\x12-\n\x11RemoteAttestation\x18\x05 \x01(\x0b\x32\x12.RemoteAttestation\"\x91\x01\n\x0bMessageType\x12\x12\n\x0e\x44UMMY_MSG_TYPE\x10\x00\x12\x13\n\x0fLICENSE_REQUEST\x10\x01\x12\x0b\n\x07LICENSE\x10\x02\x12\x12\n\x0e\x45RROR_RESPONSE\x10\x03\x12\x1f\n\x1bSERVICE_CERTIFICATE_REQUEST\x10\x04\x12\x17\n\x13SERVICE_CERTIFICATE\x10\x05*$\n\x0bLicenseType\x12\x08\n\x04ZERO\x10\x00\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x01*)\n\x0fProtocolVersion\x12\t\n\x05\x44UMMY\x10\x00\x12\x0b\n\x07\x43URRENT\x10\x15\x62\x06proto3') -) - -_LICENSETYPE = _descriptor.EnumDescriptor( - name='LicenseType', - full_name='LicenseType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='ZERO', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='DEFAULT', index=1, number=1, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=6713, - serialized_end=6749, -) -_sym_db.RegisterEnumDescriptor(_LICENSETYPE) - -LicenseType = enum_type_wrapper.EnumTypeWrapper(_LICENSETYPE) -_PROTOCOLVERSION = _descriptor.EnumDescriptor( - name='ProtocolVersion', - full_name='ProtocolVersion', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='DUMMY', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='CURRENT', index=1, number=21, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=6751, - serialized_end=6792, -) -_sym_db.RegisterEnumDescriptor(_PROTOCOLVERSION) - -ProtocolVersion = enum_type_wrapper.EnumTypeWrapper(_PROTOCOLVERSION) -ZERO = 0 -DEFAULT = 1 -DUMMY = 0 -CURRENT = 21 - - -_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION = _descriptor.EnumDescriptor( - name='HdcpVersion', - full_name='ClientIdentification.ClientCapabilities.HdcpVersion', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='HDCP_NONE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='HDCP_V1', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='HDCP_V2', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='HDCP_V2_1', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='HDCP_V2_2', index=4, number=4, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=560, - serialized_end=644, -) -_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION) - -_CLIENTIDENTIFICATION_TOKENTYPE = _descriptor.EnumDescriptor( - name='TokenType', - full_name='ClientIdentification.TokenType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='KEYBOX', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='DEVICE_CERTIFICATE', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='REMOTE_ATTESTATION_CERTIFICATE', index=2, number=2, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=646, - serialized_end=729, -) -_sym_db.RegisterEnumDescriptor(_CLIENTIDENTIFICATION_TOKENTYPE) - -_DEVICECERTIFICATE_CERTIFICATETYPE = _descriptor.EnumDescriptor( - name='CertificateType', - full_name='DeviceCertificate.CertificateType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='ROOT', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='INTERMEDIATE', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='USER_DEVICE', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE', index=3, number=3, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=940, - serialized_end=1015, -) -_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATE_CERTIFICATETYPE) - -_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS = _descriptor.EnumDescriptor( - name='CertificateStatus', - full_name='DeviceCertificateStatus.CertificateStatus', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='VALID', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='REVOKED', index=1, number=1, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=1171, - serialized_end=1214, -) -_sym_db.RegisterEnumDescriptor(_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS) - -_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS = _descriptor.EnumDescriptor( - name='CGMS', - full_name='License.KeyContainer.OutputProtection.CGMS', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='COPY_FREE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='COPY_ONCE', index=1, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='COPY_NEVER', index=2, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='CGMS_NONE', index=3, number=42, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=2947, - serialized_end=3014, -) -_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS) - -_LICENSE_KEYCONTAINER_KEYTYPE = _descriptor.EnumDescriptor( - name='KeyType', - full_name='License.KeyContainer.KeyType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='_NOKEYTYPE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SIGNING', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='CONTENT', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='KEY_CONTROL', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='OPERATOR_SESSION', index=4, number=4, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3349, - serialized_end=3439, -) -_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_KEYTYPE) - -_LICENSE_KEYCONTAINER_SECURITYLEVEL = _descriptor.EnumDescriptor( - name='SecurityLevel', - full_name='License.KeyContainer.SecurityLevel', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='_NOSECLEVEL', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SW_SECURE_CRYPTO', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SW_SECURE_DECODE', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='HW_SECURE_CRYPTO', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='HW_SECURE_DECODE', index=4, number=4, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='HW_SECURE_ALL', index=5, number=5, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3442, - serialized_end=3581, -) -_sym_db.RegisterEnumDescriptor(_LICENSE_KEYCONTAINER_SECURITYLEVEL) - -_LICENSEERROR_ERROR = _descriptor.EnumDescriptor( - name='Error', - full_name='LicenseError.Error', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='DUMMY_NO_ERROR', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='INVALID_DEVICE_CERTIFICATE', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='REVOKED_DEVICE_CERTIFICATE', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE_UNAVAILABLE', index=3, number=3, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3640, - serialized_end=3756, -) -_sym_db.RegisterEnumDescriptor(_LICENSEERROR_ERROR) - -_LICENSEREQUEST_REQUESTTYPE = _descriptor.EnumDescriptor( - name='RequestType', - full_name='LicenseRequest.RequestType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='DUMMY_REQ_TYPE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='NEW', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='RENEWAL', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='RELEASE', index=3, number=3, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=4651, - serialized_end=4719, -) -_sym_db.RegisterEnumDescriptor(_LICENSEREQUEST_REQUESTTYPE) - -_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL = _descriptor.EnumDescriptor( - name='WvSecurityLevel', - full_name='ProvisionedDeviceInfo.WvSecurityLevel', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='LEVEL_UNSPECIFIED', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LEVEL_1', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LEVEL_2', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LEVEL_3', index=3, number=3, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=4937, - serialized_end=5016, -) -_sym_db.RegisterEnumDescriptor(_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL) - -_SIGNEDMESSAGE_MESSAGETYPE = _descriptor.EnumDescriptor( - name='MessageType', - full_name='SignedMessage.MessageType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='DUMMY_MSG_TYPE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LICENSE_REQUEST', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LICENSE', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='ERROR_RESPONSE', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE_CERTIFICATE', index=5, number=5, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=5583, - serialized_end=5728, -) -_sym_db.RegisterEnumDescriptor(_SIGNEDMESSAGE_MESSAGETYPE) - -_WIDEVINECENCHEADER_ALGORITHM = _descriptor.EnumDescriptor( - name='Algorithm', - full_name='WidevineCencHeader.Algorithm', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='UNENCRYPTED', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='AESCTR', index=1, number=1, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=6016, - serialized_end=6056, -) -_sym_db.RegisterEnumDescriptor(_WIDEVINECENCHEADER_ALGORITHM) - -_SIGNEDLICENSEREQUEST_MESSAGETYPE = _descriptor.EnumDescriptor( - name='MessageType', - full_name='SignedLicenseRequest.MessageType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='DUMMY_MSG_TYPE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LICENSE_REQUEST', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LICENSE', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='ERROR_RESPONSE', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE_CERTIFICATE', index=5, number=5, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=5583, - serialized_end=5728, -) -_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSEREQUEST_MESSAGETYPE) - -_SIGNEDLICENSE_MESSAGETYPE = _descriptor.EnumDescriptor( - name='MessageType', - full_name='SignedLicense.MessageType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='DUMMY_MSG_TYPE', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LICENSE_REQUEST', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='LICENSE', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='ERROR_RESPONSE', index=3, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE_CERTIFICATE_REQUEST', index=4, number=4, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='SERVICE_CERTIFICATE', index=5, number=5, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=5583, - serialized_end=5728, -) -_sym_db.RegisterEnumDescriptor(_SIGNEDLICENSE_MESSAGETYPE) - - -_CLIENTIDENTIFICATION_NAMEVALUE = _descriptor.Descriptor( - name='NameValue', - full_name='ClientIdentification.NameValue', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Name', full_name='ClientIdentification.NameValue.Name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Value', full_name='ClientIdentification.NameValue.Value', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=309, - serialized_end=349, -) - -_CLIENTIDENTIFICATION_CLIENTCAPABILITIES = _descriptor.Descriptor( - name='ClientCapabilities', - full_name='ClientIdentification.ClientCapabilities', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='ClientToken', full_name='ClientIdentification.ClientCapabilities.ClientToken', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SessionToken', full_name='ClientIdentification.ClientCapabilities.SessionToken', index=1, - number=2, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='VideoResolutionConstraints', full_name='ClientIdentification.ClientCapabilities.VideoResolutionConstraints', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='MaxHdcpVersion', full_name='ClientIdentification.ClientCapabilities.MaxHdcpVersion', index=3, - number=4, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='OemCryptoApiVersion', full_name='ClientIdentification.ClientCapabilities.OemCryptoApiVersion', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=352, - serialized_end=644, -) - -_CLIENTIDENTIFICATION = _descriptor.Descriptor( - name='ClientIdentification', - full_name='ClientIdentification', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Type', full_name='ClientIdentification.Type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Token', full_name='ClientIdentification.Token', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ClientInfo', full_name='ClientIdentification.ClientInfo', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ProviderClientToken', full_name='ClientIdentification.ProviderClientToken', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='LicenseCounter', full_name='ClientIdentification.LicenseCounter', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='_ClientCapabilities', full_name='ClientIdentification._ClientCapabilities', index=5, - number=6, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_CLIENTIDENTIFICATION_NAMEVALUE, _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, ], - enum_types=[ - _CLIENTIDENTIFICATION_TOKENTYPE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=20, - serialized_end=729, -) - - -_DEVICECERTIFICATE = _descriptor.Descriptor( - name='DeviceCertificate', - full_name='DeviceCertificate', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Type', full_name='DeviceCertificate.Type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SerialNumber', full_name='DeviceCertificate.SerialNumber', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='CreationTimeSeconds', full_name='DeviceCertificate.CreationTimeSeconds', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='PublicKey', full_name='DeviceCertificate.PublicKey', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SystemId', full_name='DeviceCertificate.SystemId', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='TestDeviceDeprecated', full_name='DeviceCertificate.TestDeviceDeprecated', index=5, - number=6, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ServiceId', full_name='DeviceCertificate.ServiceId', index=6, - number=7, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _DEVICECERTIFICATE_CERTIFICATETYPE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=732, - serialized_end=1015, -) - - -_DEVICECERTIFICATESTATUS = _descriptor.Descriptor( - name='DeviceCertificateStatus', - full_name='DeviceCertificateStatus', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='SerialNumber', full_name='DeviceCertificateStatus.SerialNumber', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Status', full_name='DeviceCertificateStatus.Status', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='DeviceInfo', full_name='DeviceCertificateStatus.DeviceInfo', index=2, - number=4, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1018, - serialized_end=1214, -) - - -_DEVICECERTIFICATESTATUSLIST = _descriptor.Descriptor( - name='DeviceCertificateStatusList', - full_name='DeviceCertificateStatusList', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='CreationTimeSeconds', full_name='DeviceCertificateStatusList.CreationTimeSeconds', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='CertificateStatus', full_name='DeviceCertificateStatusList.CertificateStatus', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1216, - serialized_end=1327, -) - - -_ENCRYPTEDCLIENTIDENTIFICATION = _descriptor.Descriptor( - name='EncryptedClientIdentification', - full_name='EncryptedClientIdentification', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='ServiceId', full_name='EncryptedClientIdentification.ServiceId', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ServiceCertificateSerialNumber', full_name='EncryptedClientIdentification.ServiceCertificateSerialNumber', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='EncryptedClientId', full_name='EncryptedClientIdentification.EncryptedClientId', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='EncryptedClientIdIv', full_name='EncryptedClientIdentification.EncryptedClientIdIv', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='EncryptedPrivacyKey', full_name='EncryptedClientIdentification.EncryptedPrivacyKey', index=4, - number=5, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1330, - serialized_end=1505, -) - - -_LICENSEIDENTIFICATION = _descriptor.Descriptor( - name='LicenseIdentification', - full_name='LicenseIdentification', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='RequestId', full_name='LicenseIdentification.RequestId', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SessionId', full_name='LicenseIdentification.SessionId', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='PurchaseId', full_name='LicenseIdentification.PurchaseId', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Type', full_name='LicenseIdentification.Type', index=3, - number=4, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Version', full_name='LicenseIdentification.Version', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ProviderSessionToken', full_name='LicenseIdentification.ProviderSessionToken', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1508, - serialized_end=1664, -) - - -_LICENSE_POLICY = _descriptor.Descriptor( - name='Policy', - full_name='License.Policy', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='CanPlay', full_name='License.Policy.CanPlay', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='CanPersist', full_name='License.Policy.CanPersist', index=1, - number=2, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='CanRenew', full_name='License.Policy.CanRenew', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RentalDurationSeconds', full_name='License.Policy.RentalDurationSeconds', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='PlaybackDurationSeconds', full_name='License.Policy.PlaybackDurationSeconds', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='LicenseDurationSeconds', full_name='License.Policy.LicenseDurationSeconds', index=5, - number=6, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RenewalRecoveryDurationSeconds', full_name='License.Policy.RenewalRecoveryDurationSeconds', index=6, - number=7, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RenewalServerUrl', full_name='License.Policy.RenewalServerUrl', index=7, - number=8, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RenewalDelaySeconds', full_name='License.Policy.RenewalDelaySeconds', index=8, - number=9, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RenewalRetryIntervalSeconds', full_name='License.Policy.RenewalRetryIntervalSeconds', index=9, - number=10, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RenewWithUsage', full_name='License.Policy.RenewWithUsage', index=10, - number=11, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='UnknownPolicy12', full_name='License.Policy.UnknownPolicy12', index=11, - number=12, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1931, - serialized_end=2271, -) - -_LICENSE_KEYCONTAINER_OUTPUTPROTECTION = _descriptor.Descriptor( - name='OutputProtection', - full_name='License.KeyContainer.OutputProtection', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Hdcp', full_name='License.KeyContainer.OutputProtection.Hdcp', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='CgmsFlags', full_name='License.KeyContainer.OutputProtection.CgmsFlags', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2795, - serialized_end=3014, -) - -_LICENSE_KEYCONTAINER_KEYCONTROL = _descriptor.Descriptor( - name='KeyControl', - full_name='License.KeyContainer.KeyControl', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='KeyControlBlock', full_name='License.KeyContainer.KeyControl.KeyControlBlock', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Iv', full_name='License.KeyContainer.KeyControl.Iv', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3016, - serialized_end=3065, -) - -_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS = _descriptor.Descriptor( - name='OperatorSessionKeyPermissions', - full_name='License.KeyContainer.OperatorSessionKeyPermissions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='AllowEncrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowEncrypt', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='AllowDecrypt', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowDecrypt', index=1, - number=2, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='AllowSign', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSign', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='AllowSignatureVerify', full_name='License.KeyContainer.OperatorSessionKeyPermissions.AllowSignatureVerify', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3067, - serialized_end=3191, -) - -_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT = _descriptor.Descriptor( - name='VideoResolutionConstraint', - full_name='License.KeyContainer.VideoResolutionConstraint', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='MinResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MinResolutionPixels', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='MaxResolutionPixels', full_name='License.KeyContainer.VideoResolutionConstraint.MaxResolutionPixels', index=1, - number=2, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RequiredProtection', full_name='License.KeyContainer.VideoResolutionConstraint.RequiredProtection', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3194, - serialized_end=3347, -) - -_LICENSE_KEYCONTAINER = _descriptor.Descriptor( - name='KeyContainer', - full_name='License.KeyContainer', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Id', full_name='License.KeyContainer.Id', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Iv', full_name='License.KeyContainer.Iv', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Key', full_name='License.KeyContainer.Key', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Type', full_name='License.KeyContainer.Type', index=3, - number=4, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Level', full_name='License.KeyContainer.Level', index=4, - number=5, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RequiredProtection', full_name='License.KeyContainer.RequiredProtection', index=5, - number=6, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RequestedProtection', full_name='License.KeyContainer.RequestedProtection', index=6, - number=7, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='_KeyControl', full_name='License.KeyContainer._KeyControl', index=7, - number=8, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='_OperatorSessionKeyPermissions', full_name='License.KeyContainer._OperatorSessionKeyPermissions', index=8, - number=9, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='VideoResolutionConstraints', full_name='License.KeyContainer.VideoResolutionConstraints', index=9, - number=10, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_LICENSE_KEYCONTAINER_OUTPUTPROTECTION, _LICENSE_KEYCONTAINER_KEYCONTROL, _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, ], - enum_types=[ - _LICENSE_KEYCONTAINER_KEYTYPE, - _LICENSE_KEYCONTAINER_SECURITYLEVEL, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=2274, - serialized_end=3581, -) - -_LICENSE = _descriptor.Descriptor( - name='License', - full_name='License', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Id', full_name='License.Id', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='_Policy', full_name='License._Policy', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Key', full_name='License.Key', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='LicenseStartTime', full_name='License.LicenseStartTime', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RemoteAttestationVerified', full_name='License.RemoteAttestationVerified', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ProviderClientToken', full_name='License.ProviderClientToken', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ProtectionScheme', full_name='License.ProtectionScheme', index=6, - number=7, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='UnknownHdcpDataField', full_name='License.UnknownHdcpDataField', index=7, - number=8, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_LICENSE_POLICY, _LICENSE_KEYCONTAINER, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1667, - serialized_end=3581, -) - - -_LICENSEERROR = _descriptor.Descriptor( - name='LicenseError', - full_name='LicenseError', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='ErrorCode', full_name='LicenseError.ErrorCode', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _LICENSEERROR_ERROR, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3584, - serialized_end=3756, -) - - -_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC = _descriptor.Descriptor( - name='CENC', - full_name='LicenseRequest.ContentIdentification.CENC', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Pssh', full_name='LicenseRequest.ContentIdentification.CENC.Pssh', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='LicenseType', full_name='LicenseRequest.ContentIdentification.CENC.LicenseType', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RequestId', full_name='LicenseRequest.ContentIdentification.CENC.RequestId', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=4320, - serialized_end=4415, -) - -_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM = _descriptor.Descriptor( - name='WebM', - full_name='LicenseRequest.ContentIdentification.WebM', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Header', full_name='LicenseRequest.ContentIdentification.WebM.Header', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='LicenseType', full_name='LicenseRequest.ContentIdentification.WebM.LicenseType', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RequestId', full_name='LicenseRequest.ContentIdentification.WebM.RequestId', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=4417, - serialized_end=4493, -) - -_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE = _descriptor.Descriptor( - name='ExistingLicense', - full_name='LicenseRequest.ContentIdentification.ExistingLicense', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='LicenseId', full_name='LicenseRequest.ContentIdentification.ExistingLicense.LicenseId', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SecondsSinceStarted', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceStarted', index=1, - number=2, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SecondsSinceLastPlayed', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SecondsSinceLastPlayed', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SessionUsageTableEntry', full_name='LicenseRequest.ContentIdentification.ExistingLicense.SessionUsageTableEntry', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=4496, - serialized_end=4649, -) - -_LICENSEREQUEST_CONTENTIDENTIFICATION = _descriptor.Descriptor( - name='ContentIdentification', - full_name='LicenseRequest.ContentIdentification', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='CencId', full_name='LicenseRequest.ContentIdentification.CencId', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='WebmId', full_name='LicenseRequest.ContentIdentification.WebmId', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='License', full_name='LicenseRequest.ContentIdentification.License', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=4103, - serialized_end=4649, -) - -_LICENSEREQUEST = _descriptor.Descriptor( - name='LicenseRequest', - full_name='LicenseRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='ClientId', full_name='LicenseRequest.ClientId', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ContentId', full_name='LicenseRequest.ContentId', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Type', full_name='LicenseRequest.Type', index=2, - number=3, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RequestTime', full_name='LicenseRequest.RequestTime', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='KeyControlNonceDeprecated', full_name='LicenseRequest.KeyControlNonceDeprecated', index=4, - number=5, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ProtocolVersion', full_name='LicenseRequest.ProtocolVersion', index=5, - number=6, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='KeyControlNonce', full_name='LicenseRequest.KeyControlNonce', index=6, - number=7, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='EncryptedClientId', full_name='LicenseRequest.EncryptedClientId', index=7, - number=8, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_LICENSEREQUEST_CONTENTIDENTIFICATION, ], - enum_types=[ - _LICENSEREQUEST_REQUESTTYPE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=3759, - serialized_end=4719, -) - - -_PROVISIONEDDEVICEINFO = _descriptor.Descriptor( - name='ProvisionedDeviceInfo', - full_name='ProvisionedDeviceInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='SystemId', full_name='ProvisionedDeviceInfo.SystemId', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Soc', full_name='ProvisionedDeviceInfo.Soc', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Manufacturer', full_name='ProvisionedDeviceInfo.Manufacturer', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Model', full_name='ProvisionedDeviceInfo.Model', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='DeviceType', full_name='ProvisionedDeviceInfo.DeviceType', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ModelYear', full_name='ProvisionedDeviceInfo.ModelYear', index=5, - number=6, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SecurityLevel', full_name='ProvisionedDeviceInfo.SecurityLevel', index=6, - number=7, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='TestDevice', full_name='ProvisionedDeviceInfo.TestDevice', index=7, - number=8, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=4722, - serialized_end=5016, -) - - -_PROVISIONINGOPTIONS = _descriptor.Descriptor( - name='ProvisioningOptions', - full_name='ProvisioningOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5018, - serialized_end=5039, -) - - -_PROVISIONINGREQUEST = _descriptor.Descriptor( - name='ProvisioningRequest', - full_name='ProvisioningRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5041, - serialized_end=5062, -) - - -_PROVISIONINGRESPONSE = _descriptor.Descriptor( - name='ProvisioningResponse', - full_name='ProvisioningResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5064, - serialized_end=5086, -) - - -_REMOTEATTESTATION = _descriptor.Descriptor( - name='RemoteAttestation', - full_name='RemoteAttestation', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Certificate', full_name='RemoteAttestation.Certificate', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Salt', full_name='RemoteAttestation.Salt', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Signature', full_name='RemoteAttestation.Signature', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5088, - serialized_end=5193, -) - - -_SESSIONINIT = _descriptor.Descriptor( - name='SessionInit', - full_name='SessionInit', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5195, - serialized_end=5208, -) - - -_SESSIONSTATE = _descriptor.Descriptor( - name='SessionState', - full_name='SessionState', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5210, - serialized_end=5224, -) - - -_SIGNEDCERTIFICATESTATUSLIST = _descriptor.Descriptor( - name='SignedCertificateStatusList', - full_name='SignedCertificateStatusList', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5226, - serialized_end=5255, -) - - -_SIGNEDDEVICECERTIFICATE = _descriptor.Descriptor( - name='SignedDeviceCertificate', - full_name='SignedDeviceCertificate', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='_DeviceCertificate', full_name='SignedDeviceCertificate._DeviceCertificate', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Signature', full_name='SignedDeviceCertificate.Signature', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Signer', full_name='SignedDeviceCertificate.Signer', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5258, - serialized_end=5392, -) - - -_SIGNEDPROVISIONINGMESSAGE = _descriptor.Descriptor( - name='SignedProvisioningMessage', - full_name='SignedProvisioningMessage', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5394, - serialized_end=5421, -) - - -_SIGNEDMESSAGE = _descriptor.Descriptor( - name='SignedMessage', - full_name='SignedMessage', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Type', full_name='SignedMessage.Type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Msg', full_name='SignedMessage.Msg', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Signature', full_name='SignedMessage.Signature', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SessionKey', full_name='SignedMessage.SessionKey', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RemoteAttestation', full_name='SignedMessage.RemoteAttestation', index=4, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _SIGNEDMESSAGE_MESSAGETYPE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5424, - serialized_end=5728, -) - - -_WIDEVINECENCHEADER = _descriptor.Descriptor( - name='WidevineCencHeader', - full_name='WidevineCencHeader', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='algorithm', full_name='WidevineCencHeader.algorithm', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='key_id', full_name='WidevineCencHeader.key_id', index=1, - number=2, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='provider', full_name='WidevineCencHeader.provider', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='content_id', full_name='WidevineCencHeader.content_id', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='track_type_deprecated', full_name='WidevineCencHeader.track_type_deprecated', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='policy', full_name='WidevineCencHeader.policy', index=5, - number=6, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='crypto_period_index', full_name='WidevineCencHeader.crypto_period_index', index=6, - number=7, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='grouped_license', full_name='WidevineCencHeader.grouped_license', index=7, - number=8, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='protection_scheme', full_name='WidevineCencHeader.protection_scheme', index=8, - number=9, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='crypto_period_seconds', full_name='WidevineCencHeader.crypto_period_seconds', index=9, - number=10, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _WIDEVINECENCHEADER_ALGORITHM, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=5731, - serialized_end=6056, -) - - -_SIGNEDLICENSEREQUEST = _descriptor.Descriptor( - name='SignedLicenseRequest', - full_name='SignedLicenseRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Type', full_name='SignedLicenseRequest.Type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Msg', full_name='SignedLicenseRequest.Msg', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Signature', full_name='SignedLicenseRequest.Signature', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SessionKey', full_name='SignedLicenseRequest.SessionKey', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RemoteAttestation', full_name='SignedLicenseRequest.RemoteAttestation', index=4, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _SIGNEDLICENSEREQUEST_MESSAGETYPE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=6059, - serialized_end=6394, -) - - -_SIGNEDLICENSE = _descriptor.Descriptor( - name='SignedLicense', - full_name='SignedLicense', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='Type', full_name='SignedLicense.Type', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Msg', full_name='SignedLicense.Msg', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='Signature', full_name='SignedLicense.Signature', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='SessionKey', full_name='SignedLicense.SessionKey', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=_b(""), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='RemoteAttestation', full_name='SignedLicense.RemoteAttestation', index=4, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _SIGNEDLICENSE_MESSAGETYPE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=6397, - serialized_end=6711, -) - -_CLIENTIDENTIFICATION_NAMEVALUE.containing_type = _CLIENTIDENTIFICATION -_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.fields_by_name['MaxHdcpVersion'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION -_CLIENTIDENTIFICATION_CLIENTCAPABILITIES.containing_type = _CLIENTIDENTIFICATION -_CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION.containing_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES -_CLIENTIDENTIFICATION.fields_by_name['Type'].enum_type = _CLIENTIDENTIFICATION_TOKENTYPE -_CLIENTIDENTIFICATION.fields_by_name['Token'].message_type = _SIGNEDDEVICECERTIFICATE -_CLIENTIDENTIFICATION.fields_by_name['ClientInfo'].message_type = _CLIENTIDENTIFICATION_NAMEVALUE -_CLIENTIDENTIFICATION.fields_by_name['_ClientCapabilities'].message_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES -_CLIENTIDENTIFICATION_TOKENTYPE.containing_type = _CLIENTIDENTIFICATION -_DEVICECERTIFICATE.fields_by_name['Type'].enum_type = _DEVICECERTIFICATE_CERTIFICATETYPE -_DEVICECERTIFICATE_CERTIFICATETYPE.containing_type = _DEVICECERTIFICATE -_DEVICECERTIFICATESTATUS.fields_by_name['Status'].enum_type = _DEVICECERTIFICATESTATUS_CERTIFICATESTATUS -_DEVICECERTIFICATESTATUS.fields_by_name['DeviceInfo'].message_type = _PROVISIONEDDEVICEINFO -_DEVICECERTIFICATESTATUS_CERTIFICATESTATUS.containing_type = _DEVICECERTIFICATESTATUS -_DEVICECERTIFICATESTATUSLIST.fields_by_name['CertificateStatus'].message_type = _DEVICECERTIFICATESTATUS -_LICENSEIDENTIFICATION.fields_by_name['Type'].enum_type = _LICENSETYPE -_LICENSE_POLICY.containing_type = _LICENSE -_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['Hdcp'].enum_type = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES_HDCPVERSION -_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.fields_by_name['CgmsFlags'].enum_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS -_LICENSE_KEYCONTAINER_OUTPUTPROTECTION.containing_type = _LICENSE_KEYCONTAINER -_LICENSE_KEYCONTAINER_OUTPUTPROTECTION_CGMS.containing_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION -_LICENSE_KEYCONTAINER_KEYCONTROL.containing_type = _LICENSE_KEYCONTAINER -_LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS.containing_type = _LICENSE_KEYCONTAINER -_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION -_LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT.containing_type = _LICENSE_KEYCONTAINER -_LICENSE_KEYCONTAINER.fields_by_name['Type'].enum_type = _LICENSE_KEYCONTAINER_KEYTYPE -_LICENSE_KEYCONTAINER.fields_by_name['Level'].enum_type = _LICENSE_KEYCONTAINER_SECURITYLEVEL -_LICENSE_KEYCONTAINER.fields_by_name['RequiredProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION -_LICENSE_KEYCONTAINER.fields_by_name['RequestedProtection'].message_type = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION -_LICENSE_KEYCONTAINER.fields_by_name['_KeyControl'].message_type = _LICENSE_KEYCONTAINER_KEYCONTROL -_LICENSE_KEYCONTAINER.fields_by_name['_OperatorSessionKeyPermissions'].message_type = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS -_LICENSE_KEYCONTAINER.fields_by_name['VideoResolutionConstraints'].message_type = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT -_LICENSE_KEYCONTAINER.containing_type = _LICENSE -_LICENSE_KEYCONTAINER_KEYTYPE.containing_type = _LICENSE_KEYCONTAINER -_LICENSE_KEYCONTAINER_SECURITYLEVEL.containing_type = _LICENSE_KEYCONTAINER -_LICENSE.fields_by_name['Id'].message_type = _LICENSEIDENTIFICATION -_LICENSE.fields_by_name['_Policy'].message_type = _LICENSE_POLICY -_LICENSE.fields_by_name['Key'].message_type = _LICENSE_KEYCONTAINER -_LICENSEERROR.fields_by_name['ErrorCode'].enum_type = _LICENSEERROR_ERROR -_LICENSEERROR_ERROR.containing_type = _LICENSEERROR -_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['Pssh'].message_type = _WIDEVINECENCHEADER -_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.fields_by_name['LicenseType'].enum_type = _LICENSETYPE -_LICENSEREQUEST_CONTENTIDENTIFICATION_CENC.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION -_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.fields_by_name['LicenseType'].enum_type = _LICENSETYPE -_LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION -_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.fields_by_name['LicenseId'].message_type = _LICENSEIDENTIFICATION -_LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE.containing_type = _LICENSEREQUEST_CONTENTIDENTIFICATION -_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['CencId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC -_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['WebmId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM -_LICENSEREQUEST_CONTENTIDENTIFICATION.fields_by_name['License'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE -_LICENSEREQUEST_CONTENTIDENTIFICATION.containing_type = _LICENSEREQUEST -_LICENSEREQUEST.fields_by_name['ClientId'].message_type = _CLIENTIDENTIFICATION -_LICENSEREQUEST.fields_by_name['ContentId'].message_type = _LICENSEREQUEST_CONTENTIDENTIFICATION -_LICENSEREQUEST.fields_by_name['Type'].enum_type = _LICENSEREQUEST_REQUESTTYPE -_LICENSEREQUEST.fields_by_name['ProtocolVersion'].enum_type = _PROTOCOLVERSION -_LICENSEREQUEST.fields_by_name['EncryptedClientId'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION -_LICENSEREQUEST_REQUESTTYPE.containing_type = _LICENSEREQUEST -_PROVISIONEDDEVICEINFO.fields_by_name['SecurityLevel'].enum_type = _PROVISIONEDDEVICEINFO_WVSECURITYLEVEL -_PROVISIONEDDEVICEINFO_WVSECURITYLEVEL.containing_type = _PROVISIONEDDEVICEINFO -_REMOTEATTESTATION.fields_by_name['Certificate'].message_type = _ENCRYPTEDCLIENTIDENTIFICATION -_SIGNEDDEVICECERTIFICATE.fields_by_name['_DeviceCertificate'].message_type = _DEVICECERTIFICATE -_SIGNEDDEVICECERTIFICATE.fields_by_name['Signer'].message_type = _SIGNEDDEVICECERTIFICATE -_SIGNEDMESSAGE.fields_by_name['Type'].enum_type = _SIGNEDMESSAGE_MESSAGETYPE -_SIGNEDMESSAGE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION -_SIGNEDMESSAGE_MESSAGETYPE.containing_type = _SIGNEDMESSAGE -_WIDEVINECENCHEADER.fields_by_name['algorithm'].enum_type = _WIDEVINECENCHEADER_ALGORITHM -_WIDEVINECENCHEADER_ALGORITHM.containing_type = _WIDEVINECENCHEADER -_SIGNEDLICENSEREQUEST.fields_by_name['Type'].enum_type = _SIGNEDLICENSEREQUEST_MESSAGETYPE -_SIGNEDLICENSEREQUEST.fields_by_name['Msg'].message_type = _LICENSEREQUEST -_SIGNEDLICENSEREQUEST.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION -_SIGNEDLICENSEREQUEST_MESSAGETYPE.containing_type = _SIGNEDLICENSEREQUEST -_SIGNEDLICENSE.fields_by_name['Type'].enum_type = _SIGNEDLICENSE_MESSAGETYPE -_SIGNEDLICENSE.fields_by_name['Msg'].message_type = _LICENSE -_SIGNEDLICENSE.fields_by_name['RemoteAttestation'].message_type = _REMOTEATTESTATION -_SIGNEDLICENSE_MESSAGETYPE.containing_type = _SIGNEDLICENSE -DESCRIPTOR.message_types_by_name['ClientIdentification'] = _CLIENTIDENTIFICATION -DESCRIPTOR.message_types_by_name['DeviceCertificate'] = _DEVICECERTIFICATE -DESCRIPTOR.message_types_by_name['DeviceCertificateStatus'] = _DEVICECERTIFICATESTATUS -DESCRIPTOR.message_types_by_name['DeviceCertificateStatusList'] = _DEVICECERTIFICATESTATUSLIST -DESCRIPTOR.message_types_by_name['EncryptedClientIdentification'] = _ENCRYPTEDCLIENTIDENTIFICATION -DESCRIPTOR.message_types_by_name['LicenseIdentification'] = _LICENSEIDENTIFICATION -DESCRIPTOR.message_types_by_name['License'] = _LICENSE -DESCRIPTOR.message_types_by_name['LicenseError'] = _LICENSEERROR -DESCRIPTOR.message_types_by_name['LicenseRequest'] = _LICENSEREQUEST -DESCRIPTOR.message_types_by_name['ProvisionedDeviceInfo'] = _PROVISIONEDDEVICEINFO -DESCRIPTOR.message_types_by_name['ProvisioningOptions'] = _PROVISIONINGOPTIONS -DESCRIPTOR.message_types_by_name['ProvisioningRequest'] = _PROVISIONINGREQUEST -DESCRIPTOR.message_types_by_name['ProvisioningResponse'] = _PROVISIONINGRESPONSE -DESCRIPTOR.message_types_by_name['RemoteAttestation'] = _REMOTEATTESTATION -DESCRIPTOR.message_types_by_name['SessionInit'] = _SESSIONINIT -DESCRIPTOR.message_types_by_name['SessionState'] = _SESSIONSTATE -DESCRIPTOR.message_types_by_name['SignedCertificateStatusList'] = _SIGNEDCERTIFICATESTATUSLIST -DESCRIPTOR.message_types_by_name['SignedDeviceCertificate'] = _SIGNEDDEVICECERTIFICATE -DESCRIPTOR.message_types_by_name['SignedProvisioningMessage'] = _SIGNEDPROVISIONINGMESSAGE -DESCRIPTOR.message_types_by_name['SignedMessage'] = _SIGNEDMESSAGE -DESCRIPTOR.message_types_by_name['WidevineCencHeader'] = _WIDEVINECENCHEADER -DESCRIPTOR.message_types_by_name['SignedLicenseRequest'] = _SIGNEDLICENSEREQUEST -DESCRIPTOR.message_types_by_name['SignedLicense'] = _SIGNEDLICENSE -DESCRIPTOR.enum_types_by_name['LicenseType'] = _LICENSETYPE -DESCRIPTOR.enum_types_by_name['ProtocolVersion'] = _PROTOCOLVERSION -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ClientIdentification = _reflection.GeneratedProtocolMessageType('ClientIdentification', (_message.Message,), dict( - - NameValue = _reflection.GeneratedProtocolMessageType('NameValue', (_message.Message,), dict( - DESCRIPTOR = _CLIENTIDENTIFICATION_NAMEVALUE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:ClientIdentification.NameValue) - )) - , - - ClientCapabilities = _reflection.GeneratedProtocolMessageType('ClientCapabilities', (_message.Message,), dict( - DESCRIPTOR = _CLIENTIDENTIFICATION_CLIENTCAPABILITIES, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:ClientIdentification.ClientCapabilities) - )) - , - DESCRIPTOR = _CLIENTIDENTIFICATION, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:ClientIdentification) - )) -_sym_db.RegisterMessage(ClientIdentification) -_sym_db.RegisterMessage(ClientIdentification.NameValue) -_sym_db.RegisterMessage(ClientIdentification.ClientCapabilities) - -DeviceCertificate = _reflection.GeneratedProtocolMessageType('DeviceCertificate', (_message.Message,), dict( - DESCRIPTOR = _DEVICECERTIFICATE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:DeviceCertificate) - )) -_sym_db.RegisterMessage(DeviceCertificate) - -DeviceCertificateStatus = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatus', (_message.Message,), dict( - DESCRIPTOR = _DEVICECERTIFICATESTATUS, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:DeviceCertificateStatus) - )) -_sym_db.RegisterMessage(DeviceCertificateStatus) - -DeviceCertificateStatusList = _reflection.GeneratedProtocolMessageType('DeviceCertificateStatusList', (_message.Message,), dict( - DESCRIPTOR = _DEVICECERTIFICATESTATUSLIST, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:DeviceCertificateStatusList) - )) -_sym_db.RegisterMessage(DeviceCertificateStatusList) - -EncryptedClientIdentification = _reflection.GeneratedProtocolMessageType('EncryptedClientIdentification', (_message.Message,), dict( - DESCRIPTOR = _ENCRYPTEDCLIENTIDENTIFICATION, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:EncryptedClientIdentification) - )) -_sym_db.RegisterMessage(EncryptedClientIdentification) - -LicenseIdentification = _reflection.GeneratedProtocolMessageType('LicenseIdentification', (_message.Message,), dict( - DESCRIPTOR = _LICENSEIDENTIFICATION, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:LicenseIdentification) - )) -_sym_db.RegisterMessage(LicenseIdentification) - -License = _reflection.GeneratedProtocolMessageType('License', (_message.Message,), dict( - - Policy = _reflection.GeneratedProtocolMessageType('Policy', (_message.Message,), dict( - DESCRIPTOR = _LICENSE_POLICY, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:License.Policy) - )) - , - - KeyContainer = _reflection.GeneratedProtocolMessageType('KeyContainer', (_message.Message,), dict( - - OutputProtection = _reflection.GeneratedProtocolMessageType('OutputProtection', (_message.Message,), dict( - DESCRIPTOR = _LICENSE_KEYCONTAINER_OUTPUTPROTECTION, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:License.KeyContainer.OutputProtection) - )) - , - - KeyControl = _reflection.GeneratedProtocolMessageType('KeyControl', (_message.Message,), dict( - DESCRIPTOR = _LICENSE_KEYCONTAINER_KEYCONTROL, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:License.KeyContainer.KeyControl) - )) - , - - OperatorSessionKeyPermissions = _reflection.GeneratedProtocolMessageType('OperatorSessionKeyPermissions', (_message.Message,), dict( - DESCRIPTOR = _LICENSE_KEYCONTAINER_OPERATORSESSIONKEYPERMISSIONS, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:License.KeyContainer.OperatorSessionKeyPermissions) - )) - , - - VideoResolutionConstraint = _reflection.GeneratedProtocolMessageType('VideoResolutionConstraint', (_message.Message,), dict( - DESCRIPTOR = _LICENSE_KEYCONTAINER_VIDEORESOLUTIONCONSTRAINT, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:License.KeyContainer.VideoResolutionConstraint) - )) - , - DESCRIPTOR = _LICENSE_KEYCONTAINER, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:License.KeyContainer) - )) - , - DESCRIPTOR = _LICENSE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:License) - )) -_sym_db.RegisterMessage(License) -_sym_db.RegisterMessage(License.Policy) -_sym_db.RegisterMessage(License.KeyContainer) -_sym_db.RegisterMessage(License.KeyContainer.OutputProtection) -_sym_db.RegisterMessage(License.KeyContainer.KeyControl) -_sym_db.RegisterMessage(License.KeyContainer.OperatorSessionKeyPermissions) -_sym_db.RegisterMessage(License.KeyContainer.VideoResolutionConstraint) - -LicenseError = _reflection.GeneratedProtocolMessageType('LicenseError', (_message.Message,), dict( - DESCRIPTOR = _LICENSEERROR, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:LicenseError) - )) -_sym_db.RegisterMessage(LicenseError) - -LicenseRequest = _reflection.GeneratedProtocolMessageType('LicenseRequest', (_message.Message,), dict( - - ContentIdentification = _reflection.GeneratedProtocolMessageType('ContentIdentification', (_message.Message,), dict( - - CENC = _reflection.GeneratedProtocolMessageType('CENC', (_message.Message,), dict( - DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_CENC, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.CENC) - )) - , - - WebM = _reflection.GeneratedProtocolMessageType('WebM', (_message.Message,), dict( - DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_WEBM, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.WebM) - )) - , - - ExistingLicense = _reflection.GeneratedProtocolMessageType('ExistingLicense', (_message.Message,), dict( - DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION_EXISTINGLICENSE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification.ExistingLicense) - )) - , - DESCRIPTOR = _LICENSEREQUEST_CONTENTIDENTIFICATION, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:LicenseRequest.ContentIdentification) - )) - , - DESCRIPTOR = _LICENSEREQUEST, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:LicenseRequest) - )) -_sym_db.RegisterMessage(LicenseRequest) -_sym_db.RegisterMessage(LicenseRequest.ContentIdentification) -_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.CENC) -_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.WebM) -_sym_db.RegisterMessage(LicenseRequest.ContentIdentification.ExistingLicense) - -ProvisionedDeviceInfo = _reflection.GeneratedProtocolMessageType('ProvisionedDeviceInfo', (_message.Message,), dict( - DESCRIPTOR = _PROVISIONEDDEVICEINFO, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:ProvisionedDeviceInfo) - )) -_sym_db.RegisterMessage(ProvisionedDeviceInfo) - -ProvisioningOptions = _reflection.GeneratedProtocolMessageType('ProvisioningOptions', (_message.Message,), dict( - DESCRIPTOR = _PROVISIONINGOPTIONS, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:ProvisioningOptions) - )) -_sym_db.RegisterMessage(ProvisioningOptions) - -ProvisioningRequest = _reflection.GeneratedProtocolMessageType('ProvisioningRequest', (_message.Message,), dict( - DESCRIPTOR = _PROVISIONINGREQUEST, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:ProvisioningRequest) - )) -_sym_db.RegisterMessage(ProvisioningRequest) - -ProvisioningResponse = _reflection.GeneratedProtocolMessageType('ProvisioningResponse', (_message.Message,), dict( - DESCRIPTOR = _PROVISIONINGRESPONSE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:ProvisioningResponse) - )) -_sym_db.RegisterMessage(ProvisioningResponse) - -RemoteAttestation = _reflection.GeneratedProtocolMessageType('RemoteAttestation', (_message.Message,), dict( - DESCRIPTOR = _REMOTEATTESTATION, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:RemoteAttestation) - )) -_sym_db.RegisterMessage(RemoteAttestation) - -SessionInit = _reflection.GeneratedProtocolMessageType('SessionInit', (_message.Message,), dict( - DESCRIPTOR = _SESSIONINIT, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SessionInit) - )) -_sym_db.RegisterMessage(SessionInit) - -SessionState = _reflection.GeneratedProtocolMessageType('SessionState', (_message.Message,), dict( - DESCRIPTOR = _SESSIONSTATE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SessionState) - )) -_sym_db.RegisterMessage(SessionState) - -SignedCertificateStatusList = _reflection.GeneratedProtocolMessageType('SignedCertificateStatusList', (_message.Message,), dict( - DESCRIPTOR = _SIGNEDCERTIFICATESTATUSLIST, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SignedCertificateStatusList) - )) -_sym_db.RegisterMessage(SignedCertificateStatusList) - -SignedDeviceCertificate = _reflection.GeneratedProtocolMessageType('SignedDeviceCertificate', (_message.Message,), dict( - DESCRIPTOR = _SIGNEDDEVICECERTIFICATE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SignedDeviceCertificate) - )) -_sym_db.RegisterMessage(SignedDeviceCertificate) - -SignedProvisioningMessage = _reflection.GeneratedProtocolMessageType('SignedProvisioningMessage', (_message.Message,), dict( - DESCRIPTOR = _SIGNEDPROVISIONINGMESSAGE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SignedProvisioningMessage) - )) -_sym_db.RegisterMessage(SignedProvisioningMessage) - -SignedMessage = _reflection.GeneratedProtocolMessageType('SignedMessage', (_message.Message,), dict( - DESCRIPTOR = _SIGNEDMESSAGE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SignedMessage) - )) -_sym_db.RegisterMessage(SignedMessage) - -WidevineCencHeader = _reflection.GeneratedProtocolMessageType('WidevineCencHeader', (_message.Message,), dict( - DESCRIPTOR = _WIDEVINECENCHEADER, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:WidevineCencHeader) - )) -_sym_db.RegisterMessage(WidevineCencHeader) - -SignedLicenseRequest = _reflection.GeneratedProtocolMessageType('SignedLicenseRequest', (_message.Message,), dict( - DESCRIPTOR = _SIGNEDLICENSEREQUEST, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SignedLicenseRequest) - )) -_sym_db.RegisterMessage(SignedLicenseRequest) - -SignedLicense = _reflection.GeneratedProtocolMessageType('SignedLicense', (_message.Message,), dict( - DESCRIPTOR = _SIGNEDLICENSE, - __module__ = 'wv_proto3_pb2' - # @@protoc_insertion_point(class_scope:SignedLicense) - )) -_sym_db.RegisterMessage(SignedLicense) - - -# @@protoc_insertion_point(module_scope) diff --git a/pywidevine/L3/cdm/key.py b/pywidevine/L3/cdm/key.py deleted file mode 100644 index 0f0b956..0000000 --- a/pywidevine/L3/cdm/key.py +++ /dev/null @@ -1,14 +0,0 @@ -import binascii - -class Key: - def __init__(self, kid, type, key, permissions=[]): - self.kid = kid - self.type = type - self.key = key - self.permissions = permissions - - def __repr__(self): - if self.type == "OPERATOR_SESSION": - return "key(kid={}, type={}, key={}, permissions={})".format(self.kid, self.type, binascii.hexlify(self.key), self.permissions) - else: - return "key(kid={}, type={}, key={})".format(self.kid, self.type, binascii.hexlify(self.key)) diff --git a/pywidevine/L3/cdm/session.py b/pywidevine/L3/cdm/session.py deleted file mode 100644 index 0f7295c..0000000 --- a/pywidevine/L3/cdm/session.py +++ /dev/null @@ -1,18 +0,0 @@ -class Session: - def __init__(self, session_id, init_data, device_config, offline): - self.session_id = session_id - self.init_data = init_data - self.offline = offline - self.device_config = device_config - self.device_key = None - self.session_key = None - self.derived_keys = { - 'enc': None, - 'auth_1': None, - 'auth_2': None - } - self.license_request = None - self.license = None - self.service_certificate = None - self.privacy_mode = False - self.keys = [] diff --git a/pywidevine/L3/cdm/vmp.py b/pywidevine/L3/cdm/vmp.py deleted file mode 100644 index 42ab1bf..0000000 --- a/pywidevine/L3/cdm/vmp.py +++ /dev/null @@ -1,102 +0,0 @@ -try: - from google.protobuf.internal.decoder import _DecodeVarint as _di # this was tested to work with protobuf 3, but it's an internal API (any varint decoder might work) -except ImportError: - # this is generic and does not depend on pb internals, however it will decode "larger" possible numbers than pb decoder which has them fixed - def LEB128_decode(buffer, pos, limit = 64): - result = 0 - shift = 0 - while True: - b = buffer[pos] - pos += 1 - result |= ((b & 0x7F) << shift) - if not (b & 0x80): - return (result, pos) - shift += 7 - if shift > limit: - raise Exception("integer too large, shift: {}".format(shift)) - _di = LEB128_decode - - -class FromFileMixin: - @classmethod - def from_file(cls, filename): - """Load given a filename""" - with open(filename,"rb") as f: - return cls(f.read()) - -# the signatures use a format internally similar to -# protobuf's encoding, but without wire types -class VariableReader(FromFileMixin): - """Protobuf-like encoding reader""" - - def __init__(self, buf): - self.buf = buf - self.pos = 0 - self.size = len(buf) - - def read_int(self): - """Read a variable length integer""" - # _DecodeVarint will take care of out of range errors - (val, nextpos) = _di(self.buf, self.pos) - self.pos = nextpos - return val - - def read_bytes_raw(self, size): - """Read size bytes""" - b = self.buf[self.pos:self.pos+size] - self.pos += size - return b - - def read_bytes(self): - """Read a bytes object""" - size = self.read_int() - return self.read_bytes_raw(size) - - def is_end(self): - return (self.size == self.pos) - - -class TaggedReader(VariableReader): - """Tagged reader, needed for implementing a WideVine signature reader""" - - def read_tag(self): - """Read a tagged buffer""" - return (self.read_int(), self.read_bytes()) - - def read_all_tags(self, max_tag=3): - tags = {} - while (not self.is_end()): - (tag, bytes) = self.read_tag() - if (tag > max_tag): - raise IndexError("tag out of bound: got {}, max {}".format(tag, max_tag)) - - tags[tag] = bytes - return tags - -class WideVineSignatureReader(FromFileMixin): - """Parses a widevine .sig signature file.""" - - SIGNER_TAG = 1 - SIGNATURE_TAG = 2 - ISMAINEXE_TAG = 3 - - def __init__(self, buf): - reader = TaggedReader(buf) - self.version = reader.read_int() - if (self.version != 0): - raise Exception("Unsupported signature format version {}".format(self.version)) - self.tags = reader.read_all_tags() - - self.signer = self.tags[self.SIGNER_TAG] - self.signature = self.tags[self.SIGNATURE_TAG] - - extra = self.tags[self.ISMAINEXE_TAG] - if (len(extra) != 1 or (extra[0] > 1)): - raise Exception("Unexpected 'ismainexe' field value (not '\\x00' or '\\x01'), please check: {0}".format(extra)) - - self.mainexe = bool(extra[0]) - - @classmethod - def get_tags(cls, filename): - """Return a dictionary of each tag in the signature file""" - return cls.from_file(filename).tags diff --git a/requirements.txt b/requirements.txt index b74a3e8..24b4d4e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -yt-dlp -protobuf==3.20.* -requests +pywidevine +pyyaml m3u8 +yt-dlp diff --git a/song_genres.py b/song_genres.py deleted file mode 100644 index 1a87b90..0000000 --- a/song_genres.py +++ /dev/null @@ -1,438 +0,0 @@ -ID34 = "Music" -ID1203 = "African" -ID45 = "African Dancehall" -ID46 = "African Reggae" -ID1281 = "Afrikaans" -ID100049 = "Afro House" -ID100050 = "Afro Soul" -ID1177 = "Afro-Beat" -ID1178 = "Afro-Pop" -ID43 = "Afro-folk" -ID44 = "Afro-fusion" -ID100051 = "Afrobeats" -ID41 = "Alte" -ID42 = "Amapiano" -ID100052 = "Benga" -ID100053 = "Bongo-Flava" -ID100054 = "Coupé-Décalé" -ID100055 = "Gqom" -ID100056 = "Highlife" -ID100058 = "Kizomba" -ID100057 = "Kuduro" -ID100059 = "Kwaito" -ID100073 = "Maskandi" -ID100060 = "Mbalax" -ID100061 = "Ndombolo" -ID100062 = "Shangaan Electro" -ID100063 = "Soukous" -ID100064 = "Taarab" -ID100065 = "Zouglou" -ID20 = "Alternative" -ID1230 = "Chinese Alt" -ID1001 = "College Rock" -ID100018 = "EMO" -ID1002 = "Goth Rock" -ID1003 = "Grunge" -ID100098 = "Indie Egyptian" -ID100097 = "Indie Levant" -ID100099 = "Indie Maghreb" -ID100020 = "Indie Pop" -ID1004 = "Indie Rock" -ID1231 = "Korean Indie" -ID1005 = "New Wave" -ID100019 = "Pop Punk" -ID1006 = "Punk" -ID100071 = "Turkish Alternative" -ID29 = "Anime" -ID1197 = "Arabic" -ID1286 = "Arabic Pop" -ID1287 = "Islamic" -ID1284 = "Khaleeji" -ID100082 = "Khaleeji Jalsat" -ID100083 = "Khaleeji Shailat" -ID100079 = "Levant" -ID100080 = "Dabke" -ID100081 = "Maghreb Rai" -ID1285 = "North African" -ID2 = "Blues" -ID1210 = "Acoustic Blues" -ID1007 = "Chicago Blues" -ID1009 = "Classic Blues" -ID1010 = "Contemporary Blues" -ID1011 = "Country Blues" -ID1012 = "Delta Blues" -ID1013 = "Electric Blues" -ID1122 = "Brazilian" -ID1220 = "Axé" -ID1229 = "Baile Funk" -ID1221 = "Bossa Nova" -ID1222 = "Choro" -ID1223 = "Forró" -ID1224 = "Frevo" -ID1225 = "MPB" -ID1226 = "Pagode" -ID1227 = "Samba" -ID1228 = "Sertanejo" -ID4 = "Children's Music" -ID1014 = "Lullabies" -ID1015 = "Sing-Along" -ID1016 = "Stories" -ID1232 = "Chinese" -ID1233 = "Chinese Classical" -ID1234 = "Chinese Flute" -ID1235 = "Chinese Opera" -ID1236 = "Chinese Orchestral" -ID1237 = "Chinese Regional Folk" -ID1238 = "Chinese Strings" -ID1239 = "Taiwanese Folk" -ID1240 = "Tibetan Native Music" -ID22 = "Christian" -ID1094 = "CCM" -ID1095 = "Christian Metal" -ID1096 = "Christian Pop" -ID1097 = "Christian Rap" -ID1098 = "Christian Rock" -ID1099 = "Classic Christian" -ID1100 = "Contemporary Gospel" -ID1101 = "Gospel" -ID1103 = "Praise & Worship" -ID1104 = "Southern Gospel" -ID1105 = "Traditional Gospel" -ID5 = "Classical" -ID100001 = "Art Song" -ID1017 = "Avant-Garde" -ID1018 = "Baroque Era" -ID100002 = "Brass & Woodwinds" -ID100006 = "Cantata" -ID100012 = "Cello" -ID1019 = "Chamber Music" -ID1020 = "Chant" -ID1021 = "Choral" -ID1022 = "Classical Crossover" -ID1211 = "High Classical" -ID100004 = "Contemporary Era" -ID1023 = "Early Music" -ID100007 = "Electronic" -ID100009 = "Guitar" -ID1024 = "Impressionist" -ID1025 = "Medieval Era" -ID1026 = "Minimalism" -ID1027 = "Modern Era" -ID9 = "Opera" -ID1028 = "Opera" -ID100005 = "Oratorio" -ID1029 = "Orchestral" -ID100013 = "Percussion" -ID100010 = "Piano" -ID1030 = "Renaissance" -ID1031 = "Romantic Era" -ID100008 = "Sacred" -ID100003 = "Solo Instrumental" -ID100011 = "Violin" -ID1032 = "Wedding Music" -ID3 = "Comedy" -ID1167 = "Novelty" -ID1171 = "Standup Comedy" -ID6 = "Country" -ID1033 = "Alternative Country" -ID1034 = "Americana" -ID1035 = "Bluegrass" -ID1036 = "Contemporary Bluegrass" -ID1037 = "Contemporary Country" -ID1038 = "Country Gospel" -ID1039 = "Honky Tonk" -ID1040 = "Outlaw Country" -ID1294 = "Thai Country" -ID1041 = "Traditional Bluegrass" -ID1042 = "Traditional Country" -ID1043 = "Urban Cowboy" -ID100024 = "Cuban" -ID100029 = "Bolero" -ID100026 = "Chachacha" -ID100027 = "Guajira" -ID100030 = "Guaracha" -ID100025 = "Mambo" -ID100028 = "Son" -ID100031 = "Timba" -ID17 = "Dance" -ID1044 = "Breakbeat" -ID1045 = "Exercise" -ID1046 = "Garage" -ID1047 = "Hardcore" -ID1048 = "House" -ID1049 = "Jungle/Drum'n'bass" -ID100105 = "Maghreb Dance" -ID1050 = "Techno" -ID1051 = "Trance" -ID50000063 = "Disney" -ID25 = "Easy Listening" -ID1054 = "Lounge" -ID1055 = "Swing" -ID7 = "Electronic" -ID1056 = "Ambient" -ID100015 = "Bass" -ID1057 = "Downtempo" -ID100014 = "Dubstep" -ID100101 = "Electro-Cha'abi" -ID1058 = "Electronica" -ID1060 = "IDM/Experimental" -ID1061 = "Industrial" -ID100100 = "Levant Electronic" -ID100102 = "Maghreb Electronic" -ID28 = "Enka" -ID50 = "Fitness & Workout" -ID1289 = "Folk" -ID100103 = "Iraqi Folk" -ID100104 = "Khaleeji Folk" -ID50000064 = "French Pop" -ID50000068 = "German Folk" -ID50000066 = "German Pop" -ID18 = "Hip-Hop/Rap" -ID1068 = "Alternative Rap" -ID1241 = "Chinese Hip-Hop" -ID1069 = "Dirty South" -ID1070 = "East Coast Rap" -ID100094 = "Egyptian Hip-Hop" -ID1071 = "Gangsta Rap" -ID1072 = "Hardcore Rap" -ID1073 = "Hip-Hop" -ID100096 = "Khaleeji Hip-Hop" -ID1242 = "Korean Hip-Hop" -ID1074 = "Latin Rap" -ID100093 = "Levant Hip-Hop" -ID100095 = "Maghreb Hip-Hop" -ID1075 = "Old School Rap" -ID1076 = "Rap" -ID100078 = "Hip-Hop in Russian" -ID100072 = "Turkish Hip-Hop/Rap" -ID100016 = "UK Hip-Hop" -ID1077 = "Underground Rap" -ID1078 = "West Coast Rap" -ID8 = "Holiday" -ID1079 = "Chanukah" -ID1080 = "Christmas" -ID1081 = "Christmas: Children's" -ID1082 = "Christmas: Classic" -ID1083 = "Christmas: Classical" -ID100106 = "Christmas: Country" -ID1084 = "Christmas: Jazz" -ID1085 = "Christmas: Modern" -ID1086 = "Christmas: Pop" -ID1087 = "Christmas: R&B" -ID1088 = "Christmas: Religious" -ID1089 = "Christmas: Rock" -ID1090 = "Easter" -ID1091 = "Halloween" -ID1092 = "Holiday: Other" -ID1093 = "Thanksgiving" -ID100107 = "Hörspiele" -ID1262 = "Indian" -ID1263 = "Bollywood" -ID1267 = "Devotional & Spiritual" -ID1278 = "Ghazals" -ID1269 = "Indian Classical" -ID100047 = "Carnatic Classical" -ID100048 = "Hindustani Classical" -ID1279 = "Indian Folk" -ID1185 = "Indian Pop" -ID1266 = "Regional Indian" -ID100039 = "Assamese" -ID100046 = "Bengali" -ID100034 = "Rabindra Sangeet" -ID100040 = "Bhojpuri" -ID100038 = "Gujarati" -ID100041 = "Haryanvi" -ID100036 = "Kannada" -ID100035 = "Malayalam" -ID100037 = "Marathi" -ID100042 = "Odia" -ID100045 = "Punjabi" -ID100033 = "Punjabi Pop" -ID100043 = "Rajasthani" -ID1264 = "Tamil" -ID1265 = "Telugu" -ID100044 = "Urdu" -ID1268 = "Sufi" -ID100000 = "Inspirational" -ID53 = "Instrumental" -ID27 = "J-Pop" -ID11 = "Jazz" -ID1106 = "Avant-Garde Jazz" -ID1053 = "Bop" -ID1052 = "Big Band" -ID1107 = "Contemporary Jazz" -ID1209 = "Cool Jazz" -ID1108 = "Crossover Jazz" -ID1109 = "Dixieland" -ID1110 = "Fusion" -ID1207 = "Hard Bop" -ID1111 = "Latin Jazz" -ID1112 = "Mainstream Jazz" -ID1113 = "Ragtime" -ID1114 = "Smooth Jazz" -ID1208 = "Trad Jazz" -ID1175 = "Vocal Jazz" -ID52 = "Karaoke" -ID30 = "Kayokyoku" -ID1243 = "Korean" -ID1246 = "Korean Trad Instrumental" -ID1245 = "Korean Trad Song" -ID1247 = "Korean Trad Theater" -ID1244 = "Korean Classical" -ID12 = "Latin" -ID1121 = "Rock y Alternativo" -ID1120 = "Baladas y Boleros" -ID1116 = "Contemporary Latin" -ID1115 = "Latin Jazz" -ID1119 = "Urbano latino" -ID1117 = "Pop Latino" -ID1118 = "Raíces" -ID1123 = "Música Mexicana" -ID1124 = "Música tropical" -ID1291 = "Marching" -ID13 = "New Age" -ID1125 = "Environmental" -ID1126 = "Healing" -ID1127 = "Meditation" -ID1128 = "Nature" -ID1129 = "Relaxation" -ID1130 = "Travel" -ID100021 = "Yoga" -ID1290 = "Orchestral" -ID14 = "Pop" -ID1131 = "Adult Contemporary" -ID1132 = "Britpop" -ID1250 = "C-Pop" -ID1251 = "Cantopop/HK-Pop" -ID100090 = "Egyptian Pop" -ID1259 = "Indo Pop" -ID100089 = "Iraqi Pop" -ID51 = "K-Pop" -ID100092 = "Khaleeji Pop" -ID1252 = "Korean Folk-Pop" -ID100088 = "Levant Pop" -ID100091 = "Maghreb Pop" -ID1255 = "Malaysian Pop" -ID1253 = "Mandopop" -ID1258 = "Manilla Sound" -ID1293 = "Oldies" -ID1257 = "Original Pilipino Music" -ID1256 = "Pinoy Pop" -ID1133 = "Pop/Rock" -ID100076 = "Pop in Russian" -ID100023 = "Shows" -ID1134 = "Soft Rock" -ID1254 = "Tai-Pop" -ID1135 = "Teen Pop" -ID1260 = "Thai Pop" -ID100022 = "Tribute" -ID100069 = "Turkish Pop" -ID15 = "R&B/Soul" -ID1136 = "Contemporary R&B" -ID1137 = "Disco" -ID1138 = "Doo Wop" -ID1139 = "Funk" -ID1140 = "Motown" -ID1141 = "Neo-Soul" -ID1142 = "Quiet Storm" -ID1143 = "Soul" -ID24 = "Reggae" -ID1193 = "Dub" -ID100017 = "Lovers Rock" -ID1183 = "Modern Dancehall" -ID1192 = "Roots Reggae" -ID1194 = "Ska" -ID21 = "Rock" -ID1144 = "Adult Alternative" -ID1145 = "American Trad Rock" -ID1146 = "Arena Rock" -ID1147 = "Blues-Rock" -ID1148 = "British Invasion" -ID1248 = "Chinese Rock" -ID1149 = "Death Metal/Black Metal" -ID1150 = "Glam Rock" -ID1151 = "Hair Metal" -ID1152 = "Hard Rock" -ID1153 = "Metal" -ID1154 = "Jam Bands" -ID1249 = "Korean Rock" -ID1155 = "Prog-Rock/Art Rock" -ID1156 = "Psychedelic" -ID1157 = "Rock & Roll" -ID1158 = "Rockabilly" -ID1159 = "Roots Rock" -ID100077 = "Rock in Russian" -ID1160 = "Singer/Songwriter" -ID1161 = "Southern Rock" -ID1162 = "Surf" -ID1163 = "Tex-Mex" -ID100070 = "Turkish Rock" -ID1299 = "Russian" -ID100075 = "Bard in Russian" -ID1270 = "Chanson in Russian" -ID100074 = "Romance in Russian" -ID10 = "Singer/Songwriter" -ID1062 = "Alternative Folk" -ID1063 = "Contemporary Folk" -ID1064 = "Contemporary Singer/Songwriter" -ID1065 = "Folk-Rock" -ID1066 = "New Acoustic" -ID1067 = "Traditional Folk" -ID16 = "Soundtrack" -ID1165 = "Foreign Cinema" -ID1166 = "Musicals" -ID1168 = "Original Score" -ID1288 = "Sound Effects" -ID1169 = "Soundtrack" -ID1172 = "TV Soundtrack" -ID100032 = "Video Game" -ID50000061 = "Spoken Word" -ID100084 = "Tarab" -ID100086 = "Egyptian Tarab" -ID100085 = "Iraqi Tarab" -ID100087 = "Khaleeji Tarab" -ID1300 = "Turkish" -ID1280 = "Arabesque" -ID100067 = "Fantezi" -ID1272 = "Halk" -ID100068 = "Religious" -ID1273 = "Sanat" -ID100066 = "Özgün" -ID23 = "Vocal" -ID1173 = "Standards" -ID1174 = "Traditional Pop" -ID1261 = "Trot" -ID1176 = "Vocal Pop" -ID19 = "Worldwide" -ID1204 = "Asia" -ID1200 = "Australia" -ID1179 = "Cajun" -ID1276 = "Calypso" -ID1195 = "Caribbean" -ID1180 = "Celtic" -ID1181 = "Celtic Folk" -ID1182 = "Contemporary Celtic" -ID1274 = "Dangdut" -ID1271 = "Dini" -ID1184 = "Drinking Songs" -ID1205 = "Europe" -ID1297 = "Fado" -ID1282 = "Farsi" -ID1295 = "Flamenco" -ID1202 = "France" -ID1199 = "Hawaii" -ID1298 = "Iberia" -ID1275 = "Indonesian Religious" -ID1283 = "Israeli" -ID1201 = "Japan" -ID1186 = "Japanese Pop" -ID1187 = "Klezmer" -ID1198 = "North America" -ID1188 = "Polka" -ID1277 = "Soca" -ID1206 = "South Africa" -ID1196 = "South America" -ID1296 = "Tango" -ID1189 = "Traditional Celtic" -ID1190 = "Worldbeat" -ID1191 = "Zydeco"