https://github.com/klypse/cipherdropx
⚡ A modern, regex-only YouTube signature deciphering library written in Python. Fully dynamic parser – no JavaScript, no execution, no AST. Latest obfuscation fully supported.
https://github.com/klypse/cipherdropx
basejs cipher decipher deobfuscation dynamic-analysis javascript-obfuscation lightweight modular no-dependencies python python-library regex regex-parser reverse-engineering signature signature-decipher youtube youtube-api youtube-dl youtube-downloader
Last synced: 7 months ago
JSON representation
⚡ A modern, regex-only YouTube signature deciphering library written in Python. Fully dynamic parser – no JavaScript, no execution, no AST. Latest obfuscation fully supported.
- Host: GitHub
- URL: https://github.com/klypse/cipherdropx
- Owner: Klypse
- License: apache-2.0
- Created: 2025-06-24T11:00:59.000Z (7 months ago)
- Default Branch: main
- Last Pushed: 2025-06-24T12:01:37.000Z (7 months ago)
- Last Synced: 2025-06-24T12:51:27.006Z (7 months ago)
- Topics: basejs, cipher, decipher, deobfuscation, dynamic-analysis, javascript-obfuscation, lightweight, modular, no-dependencies, python, python-library, regex, regex-parser, reverse-engineering, signature, signature-decipher, youtube, youtube-api, youtube-dl, youtube-downloader
- Language: Python
- Homepage: https://pypi.org/project/cipherdropx
- Size: 1.08 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
---
### 🚀 Overview
**CipherDropX** is a lightweight Python library that dynamically extracts and executes transformation routines from YouTube’s `base.js` player file.
Unlike many tools, it:
- 🧠 **Parses without JS runtime** – no Node.js or browser needed
- ⚙️ **Works offline** – just use cached `base.js` and decode anywhere
- 📦 **Minimal dependencies** – pure regex & logic
> Perfect for CLI tools, embedded devices, or headless batch jobs.
---
## Installation
```bash
pip install cipherdropx
```
*(Python 3.9 or newer is recommended)*
---
## When is it useful?
\* Whenever you already have a copy of *base.js* (downloaded once, shipped with your own binaries, etc.) and need to transform many signatures without re‑downloading the player file each time.
\* When you want to keep network, JavaScript and heavy AST libraries out of your build.
---
## Basic workflow
1. **Create** a `CipherDropX` instance with the raw *base.js* text.
2. **Extract** the algorithm once via `.get_algorithm()` – you can cache or serialise it.
3. **Feed** the algorithm back with `.update()` *(or skip and keep the internal one)*.
4. **Run** `.run(sig)` to obtain the transformed signature.
5. The result is stored in `.signature`.
---
## Example A – live download with *requests*
```python
import requests
from cipherdropx import CipherDropX
# 1️⃣ Pull the latest player file (≈100 kB)
url = "https://www.youtube.com/s/player/9fe2e06e/player_ias.vflset/ja_JP/base.js"
res = requests.get(url)
res.raise_for_status() # ensure HTTP 200
# 2️⃣ Build the decipher helper from raw JS
cdx = CipherDropX(res.text) # ↖️ parses method table & CHALL stub
algo = cdx.get_algorithm() # ↖️ returns Algorithm object (can be cached)
cdx.update(algo) # ↖️ loads the algorithm into the instance
# 3️⃣ Apply it to any signature string
sig = "1A2B3C4D5E6F7G8H9I0JKLMNOPQRSTUVWX"
cdx.run(sig) # ↖️ executes splice / swap / reverse steps
print("Original :", sig)
print("Deciphered:", cdx.signature) # transformed output
```
---
## Example B – using a local *base.js* snapshot
```python
from pathlib import Path
from cipherdropx import CipherDropX
# 1️⃣ Load player file that was stored previously
basejs_text = Path("./assets/base_20250616.js").read_text(encoding="utf‑8")
# 2️⃣ Initialise helper (parsing happens once)
cdx = CipherDropX(basejs_text)
# ▶️ If you saved the algorithm earlier you could do:
# cached_algo = json.loads(Path("algo.json").read_text())
# cdx.update(cached_algo)
# otherwise just generate it again:
algorithm = cdx.get_algorithm()
cdx.update(algorithm)
# 3️⃣ Transform signature
sig = "ABCDEF1234567890"
cdx.run(sig)
print(cdx.signature)
```
---
## Caching tips
* `Algorithm` is just a list of `(action, argument)` tuples – safe to `json.dump` and reuse later.
* You can keep one *base.js* offline and only refresh it if YouTube ships a new player revision.
---
## License
Apache‑2.0 – see the [LICENSE](LICENSE) file for details.
---
### Disclaimer
CipherDropX is provided **solely for educational and integration purposes**.
You are responsible for complying with the terms of service of the platform you interact with.