# pymonalisa A Python library to decrypt IQIYI DRM License Ticket using the MonaLisa Content Decryption Module. ## Installation ```shell pip install pymonalisa ``` Run `pymonalisa --help` to view available CLI functions. ## Devices To use pymonalisa, you need a MonaLisa device file (.mld). These device files load the WASM module required to process IQIYI DRM License Tickets correctly. ## License Processing Process a MonaLisa encoded license and extract decryption keys: ```shell pymonalisa license "AAAADgMwAADECisAAAdoS7HZAQEASDVEQ0lELVYzLVAxLTIwMjUwNTE5LTE0NDM1Mi1NRDc0N0RBNS0xNzQ0NjQ0OTk3LUExMTJERwEQcMHbn2aue/wLGYFpS2aNngMCADhAACCzbv21P1LuugXC34EhhYOfBQm1K7vNBcxClOM9nTS50AIQxPPew5UYQhKhOg3UrJqXLQQBAwMDADkBADCvjimPScsXNIyb9HxbzkHRB7Bhv3J8Pvpgm54TFhIKSwH32SedaLf7dJ6PRExsjyoBAQECASADBAA4QAAgIreHYYp2nI86fJDaAxR6CJyvM1h+OKXATIn9aj43O2ADEIDB259mrnv8CxmBaUtmjZ4EAQMEBQATARBwwdufZq57/AsZgWlLZo2eAP8GADQBEIDB259mrnv8CxmBaUtmjZ4AIM11WGlDSqV01Aw8PkaTUEgYPVduGGQpxMTnWbNx7qpP" device.mld ``` ### Options - `-t, --key-type`: Filter keys by type (CONTENT or FULL). Default: FULL - `-v, --version`: Print version information ## Usage An example code snippet: ```python from pymonalisa.cdm import Cdm from pymonalisa.module import Module from pymonalisa.license import License from pymonalisa.types import KeyType # Load the MonaLisa device module module = Module.load("path/to/device.mld") # Initialize CDM from module cdm = Cdm.from_module(module) # Open a new session session_id = cdm.open() # Create license object from base64 encoded license data license_data = "AAAADgMwAADECisAAAdoS7HZAQEASDVEQ0lELVYzLVAxLTIwMjUwNTE5LTE0NDM1Mi1NRDc0N0RBNS0xNzQ0NjQ0OTk3LUExMTJERwEQcMHbn2aue/wLGYFpS2aNngMCADhAACCzbv21P1LuugXC34EhhYOfBQm1K7vNBcxClOM9nTS50AIQxPPew5UYQhKhOg3UrJqXLQQBAwMDADkBADCvjimPScsXNIyb9HxbzkHRB7Bhv3J8Pvpgm54TFhIKSwH32SedaLf7dJ6PRExsjyoBAQECASADBAA4QAAgIreHYYp2nI86fJDaAxR6CJyvM1h+OKXATIn9aj43O2ADEIDB259mrnv8CxmBaUtmjZ4EAQMEBQATARBwwdufZq57/AsZgWlLZo2eAP8GADQBEIDB259mrnv8CxmBaUtmjZ4AIM11WGlDSqV01Aw8PkaTUEgYPVduGGQpxMTnWbNx7qpP" license_obj = License(license_data) # Parse the license cdm.parse_license(session_id, license_obj) # Get content keys keys = cdm.get_keys(session_id, KeyType.CONTENT) # Print extracted keys for key in keys: print(f"{key.key.hex()}") # Content key only # or for full key info: # print(f"{key.kid.hex()}:{key.key.hex()}") # Close the session cdm.close(session_id) ``` ## Key Types - `CONTENT`: Returns only the content decryption KEY - `FULL`: Returns both Key ID and content key in KID:KEY format ## Notes - This implementation is designed specifically for IQIYI DRM content - The library currently focuses on content key extraction for decrypting IQIYI BBTS streams - LicenseVersion 3 and below are supported - Keys are typically returned in hexadecimal format ## TODO - Add support for LicenseVersion up to 3 ## Credits Thanks to xhlove and duck. ## License This project is intended for educational and research purposes only.