{"id":29022676,"url":"https://github.com/klypse/cipherdropx","last_synced_at":"2026-04-28T13:35:38.915Z","repository":{"id":300956926,"uuid":"1007673783","full_name":"Klypse/CipherDropX","owner":"Klypse","description":"⚡ A modern, regex-only YouTube signature deciphering library written in Python. Fully dynamic parser – no JavaScript, no execution, no AST. Latest obfuscation fully supported.","archived":false,"fork":false,"pushed_at":"2025-06-24T12:01:37.000Z","size":1135,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-24T12:51:27.006Z","etag":null,"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"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/cipherdropx","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Klypse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-24T11:00:59.000Z","updated_at":"2025-06-24T12:45:31.000Z","dependencies_parsed_at":"2025-06-24T12:51:28.338Z","dependency_job_id":"24e0e43c-4a38-4105-87b5-044be3342823","html_url":"https://github.com/Klypse/CipherDropX","commit_stats":null,"previous_names":["klypse/cipherdropx"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Klypse/CipherDropX","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Klypse%2FCipherDropX","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Klypse%2FCipherDropX/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Klypse%2FCipherDropX/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Klypse%2FCipherDropX/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Klypse","download_url":"https://codeload.github.com/Klypse/CipherDropX/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Klypse%2FCipherDropX/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261990289,"owners_count":23241186,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["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"],"created_at":"2025-06-26T03:03:22.268Z","updated_at":"2026-04-28T13:35:38.909Z","avatar_url":"https://github.com/Klypse.png","language":"Python","readme":"\u003c!-- Google site verification --\u003e\n\u003cmeta name=\"google-site-verification\" content=\"CDAB3nu0Q_rWU0wnwQ-3kPKRtv8g5SPqGxRlSBScqLM\" /\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/Klypse/CipherDropx/main/assets/cdx-logo.png\" alt=\"CDX Logo\" width=\"280\"/\u003e\n  \u003cp align=\"center\"\u003e\n  \u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://readme-typing-svg.demolab.com?font=Orbitron\u0026size=30\u0026duration=3000\u0026pause=1000\u0026color=FF4444\u0026center=true\u0026vCenter=true\u0026width=900\u0026lines=CipherDropX+-+a+resilient+YouTube+deciphering+engine\" alt=\"Typing header\" /\u003e\n\u003c/p\u003e\n\u003c/p\u003e\n  \u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pypi.org/project/cipherdropx/\"\u003e\n    \u003cimg src=\"https://img.shields.io/pypi/v/cipherdropx?color=red\u0026label=pypi\u0026style=flat-square\" alt=\"PyPI version\" style=\"height:28px;\" /\u003e\n  \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Python-3.9%2B-blue.svg?style=flat-square\" alt=\"Python\" style=\"height:28px;\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/Klypse/CipherDropx?style=flat-square\" alt=\"License\" style=\"height:28px;\" /\u003e\n\u003c/p\u003e\n\n---\n\n### 🚀 Overview\n\n**CipherDropX** is a lightweight Python library that dynamically extracts and executes transformation routines from YouTube’s `base.js` player file.  \nUnlike many tools, it:\n- 🧠 **Parses without JS runtime** – no Node.js or browser needed  \n- ⚙️ **Works offline** – just use cached `base.js` and decode anywhere  \n- 📦 **Minimal dependencies** – pure regex \u0026 logic  \n\n\u003e Perfect for CLI tools, embedded devices, or headless batch jobs.\n\n---\n\n## Installation\n\n```bash\npip install cipherdropx\n```\n\n*(Python 3.9 or newer is recommended)*\n\n---\n\n## When is it useful?\n\n\\* 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.\n\\* When you want to keep network, JavaScript and heavy AST libraries out of your build.\n\n---\n\n## Basic workflow\n\n1. **Create** a `CipherDropX` instance with the raw *base.js* text.\n2. **Extract** the algorithm once via `.get_algorithm()` – you can cache or serialise it.\n3. **Feed** the algorithm back with `.update()` *(or skip and keep the internal one)*.\n4. **Run** `.run(sig)` to obtain the transformed signature.\n5. The result is stored in `.signature`.\n\n---\n\n## Example A – live download with *requests*\n\n```python\nimport requests\nfrom cipherdropx import CipherDropX\n\n# 1️⃣ Pull the latest player file (≈100 kB)\nurl = \"https://www.youtube.com/s/player/9fe2e06e/player_ias.vflset/ja_JP/base.js\"\nres = requests.get(url)\nres.raise_for_status()  # ensure HTTP 200\n\n# 2️⃣ Build the decipher helper from raw JS\ncdx = CipherDropX(res.text)           # ↖️ parses method table \u0026 CHALL stub\nalgo = cdx.get_algorithm()            # ↖️ returns Algorithm object (can be cached)\ncdx.update(algo)                      # ↖️ loads the algorithm into the instance\n\n# 3️⃣ Apply it to any signature string\nsig = \"1A2B3C4D5E6F7G8H9I0JKLMNOPQRSTUVWX\"\ncdx.run(sig)                          # ↖️ executes splice / swap / reverse steps\n\nprint(\"Original :\", sig)\nprint(\"Deciphered:\", cdx.signature)   # transformed output\n```\n\n---\n\n## Example B – using a local *base.js* snapshot\n\n```python\nfrom pathlib import Path\nfrom cipherdropx import CipherDropX\n\n# 1️⃣ Load player file that was stored previously\nbasejs_text = Path(\"./assets/base_20250616.js\").read_text(encoding=\"utf‑8\")\n\n# 2️⃣ Initialise helper (parsing happens once)\ncdx = CipherDropX(basejs_text)\n\n# ▶️ If you saved the algorithm earlier you could do:\n#     cached_algo = json.loads(Path(\"algo.json\").read_text())\n#     cdx.update(cached_algo)\n#   otherwise just generate it again:\nalgorithm = cdx.get_algorithm()\ncdx.update(algorithm)\n\n# 3️⃣ Transform signature\nsig = \"ABCDEF1234567890\"\ncdx.run(sig)\nprint(cdx.signature)\n```\n\n---\n\n## Caching tips\n\n* `Algorithm` is just a list of `(action, argument)` tuples – safe to `json.dump` and reuse later.\n* You can keep one *base.js* offline and only refresh it if YouTube ships a new player revision.\n\n---\n\n## License\n\nApache‑2.0 – see the [LICENSE](LICENSE) file for details.\n\n---\n\n### Disclaimer\n\nCipherDropX is provided **solely for educational and integration purposes**.\nYou are responsible for complying with the terms of service of the platform you interact with.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklypse%2Fcipherdropx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklypse%2Fcipherdropx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklypse%2Fcipherdropx/lists"}