mirror of
https://cdm-project.com/How-To/Obtaining-PSSH.git
synced 2025-04-29 15:14:27 +02:00
Obtaining PSSH
This commit is contained in:
commit
fa49768b1a
60
README.md
Normal file
60
README.md
Normal file
@ -0,0 +1,60 @@
|
||||
# Obtaining PSSH
|
||||
|
||||
|
||||
|
||||
## Getting started
|
||||
|
||||
4 methods to find PSSH:
|
||||
|
||||
1) The simplest one: PSSH is clearly indicated in MPD file. Download MPD file (browser add-on "MPD Detector" will give you MPD link or filtering for `mpd` in the `network` tab of devoloper tools (ctrl + shift + c)), open it with Notepad, search for pssh value.
|
||||
|
||||
2) If there is KID, but no PSSH in MPD, calculate PSSH by using KID:
|
||||
|
||||
Using [this](https://tools.axinom.com/generators/PsshBox "this") website you can get the PSSH by entering in the `urn:uuid:` into the `System ID` field and entering the `cenc:default_KID=` into the `KEY IDs` field without the quotes `""`
|
||||
|
||||
Eample:
|
||||

|
||||
|
||||
## Recommended method
|
||||
|
||||
3) [EME Logger Script](https://greasyfork.org/en/scripts/373903-eme-logger "EME Logger Script") (installed on [Tampermonkey](https://www.tampermonkey.net/ "Tampermonkey") add-on) will give you init data. That's your PSSH. This can be found on Developer Tools (ctrl + shift + c) > Console, in the filter bar search for `MediaKeySession::generateRequest` you will find Init Data.
|
||||
|
||||
**Optional, may be rquired:**
|
||||
|
||||
If that Init Data is very very long, convert it to HEX:
|
||||
https://base64.guru/converter/decode/hex
|
||||
|
||||
Here's what mine looked like before conversion.
|
||||

|
||||
|
||||
|
||||
After Base64 > HEX conversion, you will find a Widevine-PSSH box, this can be found easily by searching with ctrl + f and searching for `70737368`
|
||||
|
||||
PSSH header is always in a `000000xx70737368` where the `xx` is varied and can be from 1-9 in both x spots.
|
||||
You always want to copy the 6 `0`'s before the xx as well.
|
||||
|
||||
Example:
|
||||

|
||||
|
||||
The end of the header is always then followed by 8 more `0`s, if you see this, you are in the right place.
|
||||
|
||||
Once you find the header start at the beginning 0 from the header and copy until the end of the converted hex, it should look like this
|
||||
|
||||
Example:
|
||||

|
||||
|
||||
In this case the full value was `000000577073736800000000edef8ba979d64acea3c827dcd51d21ed0000003708011210162f7d326cf24f6dbd1319bc572bbc151a0b62757964726d6b65796f732210162f7d326cf24f6dbd1319bc572bbc152a024844`
|
||||
|
||||
convert the hex back into base64 using
|
||||
https://base64.guru/converter/encode/hex
|
||||
|
||||
Example:
|
||||

|
||||
|
||||
In this case we got the PSSH value of `AAAAV3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAADcIARIQFi99MmzyT229Exm8Vyu8FRoLYnV5ZHJta2V5b3MiEBYvfTJs8k9tvRMZvFcrvBUqAkhE`
|
||||
|
||||
Congrats, you have the PSSH!
|
||||
|
||||
4) Using init files
|
||||
|
||||
You can use [this tool](https://cdm-project.com/CDM-Tools/Obtaining-PSSH/src/branch/main/get_pssh_from_init.py "this tool") to obtain the PSSH from an init file
|
BIN
example_five.png
Normal file
BIN
example_five.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 42 KiB |
BIN
example_four.png
Normal file
BIN
example_four.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 68 KiB |
BIN
example_one.png
Normal file
BIN
example_one.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
example_three.png
Normal file
BIN
example_three.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 69 KiB |
BIN
example_two.png
Normal file
BIN
example_two.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
29
get_pssh_from_init.py
Normal file
29
get_pssh_from_init.py
Normal file
@ -0,0 +1,29 @@
|
||||
import base64
|
||||
|
||||
import requests
|
||||
import xmltodict
|
||||
|
||||
|
||||
def read_pssh_from_bytes(bytes: bytes):
|
||||
pssh_offset = bytes.rfind(b"pssh")
|
||||
_start = pssh_offset - 4
|
||||
_end = pssh_offset - 4 + bytes[pssh_offset - 1]
|
||||
pssh = bytes[_start:_end]
|
||||
return pssh
|
||||
|
||||
|
||||
url = input("Enter Init segment url: ")
|
||||
headers = {
|
||||
# "Range": "bytes=0-962",
|
||||
}
|
||||
print("Downloading...")
|
||||
|
||||
res = requests.get(url, headers=headers)
|
||||
if not res.ok:
|
||||
print(f"Could not download init segment: {res.text}")
|
||||
|
||||
pssh = read_pssh_from_bytes(res.content)
|
||||
if pssh is not None:
|
||||
print(f"PSSH: {base64.b64encode(pssh).decode('utf8')}")
|
||||
else:
|
||||
print("Failed to extract PSSH!")
|
Loading…
x
Reference in New Issue
Block a user