From 536c6d7f3620489737583f9bc8503eab27f5935f Mon Sep 17 00:00:00 2001 From: Mike Date: Mon, 9 Mar 2026 08:04:33 +0200 Subject: [PATCH] DRMLab Project --- main.py | 21 +++++ modules/__pycache__/generator.cpython-313.pyc | Bin 0 -> 4354 bytes modules/__pycache__/model.cpython-313.pyc | Bin 0 -> 1169 bytes modules/__pycache__/utils.cpython-313.pyc | Bin 0 -> 1462 bytes modules/generator.py | 72 ++++++++++++++++++ modules/model.py | 22 ++++++ modules/utils.py | 19 +++++ requirements.txt | 1 + 8 files changed, 135 insertions(+) create mode 100644 main.py create mode 100644 modules/__pycache__/generator.cpython-313.pyc create mode 100644 modules/__pycache__/model.cpython-313.pyc create mode 100644 modules/__pycache__/utils.cpython-313.pyc create mode 100644 modules/generator.py create mode 100644 modules/model.py create mode 100644 modules/utils.py create mode 100644 requirements.txt diff --git a/main.py b/main.py new file mode 100644 index 0000000..6d09ff7 --- /dev/null +++ b/main.py @@ -0,0 +1,21 @@ +from modules.generator import NetflixESNGenerator +import pyfiglet +import os +import platform + +def clear_screen(): + """Clear the console screen.""" + if platform.system() == "Windows": + os.system('cls') + else: + os.system('clear') + +def main(): + clear_screen() + title = pyfiglet.figlet_format("ESN Generator") + print(title) + generator = NetflixESNGenerator() + generator.run() + +if __name__ == "__main__": + main() diff --git a/modules/__pycache__/generator.cpython-313.pyc b/modules/__pycache__/generator.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cb38330ce2d5a199ed4f2db18da751c8e78e0ce GIT binary patch literal 4354 zcmey&%ge>Uz`(F--K5O-oD2+)K^z!nfigbZFfcGoWe8>nX7pw#0?|y~j9yGdObQ@2 zvp2IBOA(6~YZ0pgg9L*TLokaJLoll;6GV3rTRNjA+e;9~Pm}Q$YiLPkPO&D_EiRYT zvdrYvkjjG8Tf7i zL3S3g1+z*q6tM@hNih_01hY#q6mbS~NHG*~1#=d0r*mm?-xBsqElJDCtZ)tXb5G4n zElMoOFM7$!z`&3Uvj=1y$mPro3=E&sz;*^RhBD-U#K9QMgR2JfKor?@l;%om38a})DQ(-M&r{4E(Q!K(+81^Kqvf`Ngdf#HU6}bSbF(CgMtesqCi0n!k_1XBPtr?BakA7U`A6Y zTY(`Oqyi$!1QX3;3}p;vwu)e2NaSE(2xbXo$bm;sDNbdJ2wtDMk62DO^T+3Qk4&<;AH* zRg$iGC8S;-P5=l-5=< z6$yi+*dVqSgMvpvp-6;*fuTqNB%y{at})HwXJB9`_5{cJ9S+_LeAZVuZ0-n(T@W|A zENI-pc7t1RLU6b34S9_Ym#aK7H+Y376nDqMxKDTlF9=y&;jz5IBXFHZ`67?l9C9QUzGuB5(zF%LL`%bjQqS*P$CIQOv*_u z;WE}!2nnl_#-392jWw+liX=fX#R}F~Bn@J-LG<2YG`__Y5>_P3z`&r%QX~h8Re2D> z15zZ48jaA>r$`YLmB{Hp6Qo#^a5{h*AO+GNfk+C@S2$e2Nx|f@peZ6LC~1O{f;=oK zC~2W`)xccTl%aN!N9`()2A-6$3TMg)WypaR6$}hWnHyeIAjd6|JTok2Lm6^FX%C#$ zk>pum@}Qz7h!ZT0Lcj`#U{)&+1_tE1A)P^!%?}o@(6Yi8sl>NZs1kuhI!qE&@>?lX zsiTMngKGcB78MDAk_@zP;3~~XiN`D;ZV7_R7FcnTnU|J-OBGu( z!BD0SN+LdxB%-WwLDTKBvOB0IP`D$bctOeHvWz8&CwWIf^@5uJWrY9`PxgtZ)CFnt z%c2$?TsMSeuL~<*6jr`0thz$@qOeW}OD_jzvH+FUph){1#{_EFgfax7L=A)!%m~il zx(p1_phOQA41!nZU@n-5232feRuBi6LLrnGg5gO?mjOMZqe1x%tUd@7&|nsVP+|yX z4rYNhr1BU;8G=Bek5B++X@E%vhC~4rmkL3JktlzDB%gpvawItrGn64n3`C=1Xk7?0 zT>>T(1j@@W4wUxS$DyAM9FC~^WuTgnD1ZKFg!!Nn2}usb3}pxcRXiXj5)NhvW@ljt zQbrPjGGQ4klp#n3DuhH4))x&*j9?w1@YaMrYaUZDM-Zss1Ir+YPqTWro5Mftg@MPNDJ zqQtzE{M`8BlA_GK^ddn}*~{b;R0v7dAJmT(pnLy1$v7I zssdaw+~S4upj87Wj2l)2Dgkb>mKGGG78UV9z?_v=nwykb zbc++z&MZhQDk&}oxmp3*WVpoxZ84_CrxxekQovRiAgj;^l>_&|<-iSY{_EV*7rCWp zR9@!RxFe@=T~7a^ocqf4Zj9d>ST{iN(DCgPX(&K-FN9c)!+)?H$s<}L3c|?!bbsoh_Jc?Vat{Zz?H1@cmrFUJ+_M(>U0rAUP9zDL-dDJfPsNK-k zzpia}QQPi-#$|0Ukf{149`!psl909sxDldqkw;}g(1OGZJQ~+|^e*z~UFI=KpF@7M2LjP$6yRkdfQ_*-1@@sLhheEcn*`1r!o#2ly$e|&seW>IlTPG(+eUVeOh zktoPxpduBkk3ntrTcYvt#U+U)naS~qB_&0fNu?#J#qseg8NjXsr=TKGxPu8$1Qmk{ zv^IuMOzf<(pM*GB)jo-Fvub{lVq?|)B*4$A_eqJ7)!-`|E2{*=1dwJ;_9Amo*}@BP zcd=e6XoLV-=)uHtK}{TRsR%B?z!nw-fII-|4S-#8i^B$@+O8;=fq?;(-ikrh)CXop cM#kF=ymuMo?=u*GXK`j^l=#E|BEfC|0Gc9*z5oCK literal 0 HcmV?d00001 diff --git a/modules/__pycache__/model.cpython-313.pyc b/modules/__pycache__/model.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7bc346f6411a14af19bc2a98511ce7ef03e135c GIT binary patch literal 1169 zcmey&%ge>Uz`(F--K0!+CI*JbAPx+(KpCHP7#J9)GDt8eF$6P6F$6Q3GC^dDAYx2X z48hEBF~)QjP1a6hZt#gUxZenwD_md^xgn;|;D1A0 z5yX^Mxy&K~F%x8*pC%JHtrUSc;Lw7|f$Y1*VFO8Ac13Co3=H7pB+0Uz`(F--K5M{j0_BqK^z!nfigZTFfcGoWe8>nX7pw#Vvt}^VhCoEVhCn7 zWrCL2MXSVhCY^Sy#p|l~sYkSC)Z+n?Zpgoxz+r zjj@QGfq_Aj=@wg2VqQvq?k%?DjQq^xR88hvOnL^l7~^lTCTAoT6&Hj2qoB}G1WJ#$ zIBn8X^HM7citKKwK>`$_JHEK2C^Iiz&n727IWec$P7kgQ6w1Z23=9lEUNST=To7~K z6uW_OO4;<LpQ^5h^7G4yqZwX^@4+lt(BFORvh6e&l9jrI_1^df8%ddzzZwcLDwk7tm znDb?R=L;OpMZ63Q49OtlVc`ezHwb?=0jJqeh9ouyhERrJCaVYrhD2@#21F_jW`+fH zDq|=^Fk>hq3xf)SCQFrhNMd%XLZU)(X%ZxW6!OzR+=A5P%(TqZ6a|Ri6w-?Fa}`Q5 zQWYSo^!$nh7#J9;_=CZrs*qW%keXXiQmM&!iz_TKr!>{Is3^Zklc|W4fq|h&8stfk z%M}zL0mE66n4KCAioIL>kU)V8fP7i34o>(V*cf>DJFRCZFA$ooc}Ga*f~?+UA^i(H z`VaVpCYVof>!`WFAq@_el?;BGj4vHP$%XS4M|^xCCg-M>WaOt5fs#a#49MxA0_>J(d^|)tKCz^v zC^M#EW)CS_}*f epp0J(Qu~3Kk&*E>1Mhbh0Y;fm3<8WYVB-J<8b#Ou literal 0 HcmV?d00001 diff --git a/modules/generator.py b/modules/generator.py new file mode 100644 index 0000000..468debf --- /dev/null +++ b/modules/generator.py @@ -0,0 +1,72 @@ +import random +from modules.utils import Utils +from modules.model import DeviceType, DeviceSubType + +class NetflixESNGenerator: + def __init__(self): + self.device_type = "" + self.device_subtype = "" + self.device_manufacturer = "" + self.device_model = "" + self.device_system_id = "" + self.uhd = False + self.esn_output = "" + + def select_device_type(self): + print("Select Device Type:\n1. Android\n2. Browser") + choice = input("Enter your choice (1/2): ") + if choice == '1': + self.device_type = "Android" + elif choice == '2': + self.device_type = "Browser" + else: + print("Invalid choice. Please select again.") + self.select_device_type() + + def select_device_subtype(self): + print("Select Device Sub Type:\n1. Phone\n2. Tablet\n3. TV") + choice = input("Enter your choice (1/2/3): ") + if choice == '1': + self.device_subtype = "Phone" + elif choice == '2': + self.device_subtype = "Tablet" + elif choice == '3': + self.device_subtype = "TV" + else: + print("Invalid choice. Please select again.") + self.select_device_subtype() + + def input_device_info(self): + self.device_manufacturer = input("Enter Device Manufacturer: ") + self.device_model = input("Enter Device Model: ") + self.device_system_id = input("Enter Device System ID (e.g., 123456): ") + + uhd_choice = input("Is this device 4K? (y/n): ") + self.uhd = uhd_choice.lower() == 'y' + + def generate_esn(self): + if self.device_type == "Browser": + self.esn_output = DeviceType.Chrome + Utils.random_string(30) + return + + random_number = random.randint(1000000000, 9999999999) + esn_parts = [ + DeviceType.AndroidUHD if self.uhd else DeviceType.AndroidFHD, + DeviceSubType.AndroidPhone if self.device_subtype == "Phone" else + DeviceSubType.AndroidTablet if self.device_subtype == "Tablet" else + DeviceSubType.AndroidTV, + self.device_manufacturer[:3].upper(), + self.device_model[:3].upper(), + str(random_number) + ] + self.esn_output = '-'.join(esn_parts) + + def copy_esn(self): + print(f"ESN Output: {self.esn_output}") + + def run(self): + self.select_device_type() + self.select_device_subtype() + self.input_device_info() + self.generate_esn() + self.copy_esn() diff --git a/modules/model.py b/modules/model.py new file mode 100644 index 0000000..208fa81 --- /dev/null +++ b/modules/model.py @@ -0,0 +1,22 @@ +class DeviceType: + Chrome = "NFCDCH-02-" + AndroidFHD = "NFANDROID1" + AndroidUHD = "NFANDROID2" + AndroidWear = "NFANDROIDW" + Roku = "NFRK-" + AppleTV = "NFAPPLETV-" + AmazonFireTV = "NFAFTV-" + SmartTV = "NFSTV-" + GameConsole = "NFGC-" + +class DeviceSubType: + ChromeOS = "-PRV-C" + AndroidTablet = "-PRV-T" + AndroidPhone = "-PRV-P" + AndroidTV = "-PRV" + AndroidWearable = "-PRV-W" + RokuStreaming = "-PRV-RK" + AppleTVStreaming = "-PRV-AT" + FireTVStreaming = "-PRV-FTV" + SmartTVStreaming = "-PRV-STV" + GameConsoleStreaming = "-PRV-GC" diff --git a/modules/utils.py b/modules/utils.py new file mode 100644 index 0000000..801d1b8 --- /dev/null +++ b/modules/utils.py @@ -0,0 +1,19 @@ +import random + +class Utils: + @staticmethod + def to_int(txt): + return int(txt) + + @staticmethod + def random_string(length=64): + chars = "0123456789ABCDEF" + return ''.join(random.choice(chars) for _ in range(length)) + + @staticmethod + def take_char(txt, length): + """Take a substring of a specified length from the string.""" + if txt is None or txt == "": + raise ValueError("String is empty") + + return txt[:length] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8c809f2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pyfiglet==1.0.2