widevinedump 2021-12-23 15:57:57 +05:30
rodzic 0d48afbb7f
commit 333e2446f5
197 zmienionych plików z 13549 dodań i 0 usunięć

40
- COMANDS -.txt 100644
Wyświetl plik

@ -0,0 +1,40 @@
Proxy en cofig:
set https_proxy=https://IP:PORT
..:: NETFLIX ::..
* Download MOVIE 1080p + AUDIO + SUBS:
python netflix.py -t TITLE -q X -a en,es -o X
* Download SERIES 1080p + AUDIO + SUBS:
python netflix.py -t TITLE -q X -s X -a en,es
python netflix.py -t TITLE -q X -s X -e XX -a en,es
..:: COMANDS ::..
-q X = Quality 720p or 1080p
-o X = Tittle movie " EXAMPLE.MOVIE.2018 " Only put comand in movies
-s X = Season select
-e XX = Episode select
-a en,es = Select audio:
English: 'en'
French: 'fr'
German: 'de'
Italian: 'it'
Spanish: 'es'
Flemish: 'nl-BE'
Finnish: 'fi'
No Dialogue: 'zxx'
Czech: 'cs'
European Spanish: 'es-ES'
Japanese: 'ja'
Brazilian Portuguese: 'pt-BR'
Polish: 'pl'
Turkish: 'tr'
Mandarin: 'zh'
Cantonese: 'yue'
Arabic: 'ar'
Korean: 'ko'
Hebrew: 'he'
Norwegian: 'nb'

719
MyFrame.py 100644
Wyświetl plik

@ -0,0 +1,719 @@
# -*- coding: utf-8 -*-
###########################################################################
## Python code generated with wxFormBuilder (version Oct 26 2018)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc
import subprocess
import threading
import sys
import os
###########################################################################
## Class MyFrame
###########################################################################
class MyFrame ( wx.Frame ):
def __init__( self, parent ):
wx.Frame.__init__ ( self,parent,id = -1,title='',pos = wx.Point(1,1),size = wx.Size(740,740),style = wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX,name = 'frame' )
self.SetTitle('NFTool Gui by flix88')
self.Show(False)
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
#codec
self.chc54c = wx.Choice(self,-1,wx.Point(10,30),wx.Size(120,41),[r'H264',r'HEVC',r'HDR'])
self.chc54c.SetFont(wx.Font(12,74,90,90,0,"Tahoma"))
#reslution
self.chc64c = wx.Choice(self,-1,wx.Point(150,30),wx.Size(120,41),[r'SD',r'720p',r'1080p'])
self.chc64c.SetFont(wx.Font(12,74,90,90,0,"Tahoma"))
#series
self.chc74c = wx.Choice(self,-1,wx.Point(290,30),wx.Size(120,41),[r'1',r'2',r'3',r'4',r'5',r'6',r'7',r'8',r'9',r'10',r'11',r'12',r'13',r'14',r'15',r'16',r'17',r'18',r'19',r'20'])
self.chc74c.SetFont(wx.Font(12,74,90,90,0,"Tahoma"))
#episode
self.chc84c = wx.Choice(self,-1,wx.Point(420,30),wx.Size(120,41),[r'1',r'2',r'3',r'4',r'5',r'6',r'7',r'8',r'9',r'10',r'11',r'12',r'13',r'14',r'15',r'16',r'17',r'18',r'19',r'20'])
self.chc84c.SetFont(wx.Font(12,74,90,90,0,"Tahoma"))
#audio
self.lc7c = wx.CheckListBox(self,-1,wx.Point(550,30),wx.Size(120,120),[r'de',r'en',r'es-ES',r'es',r'fr',r'it',r'ja',r'pl',r'pt-BR',r'ru',r'tr',r'nl-BE',r'nb',r'fi',r'cs',r'zh',r'yue',r'ko',r'ar',r'he',r'zxx'])
self.st64c = wx.StaticText(self,-1,"",wx.Point(50,10),wx.Size(104,20),wx.ST_NO_AUTORESIZE)
self.st64c.SetLabel("Codec")
self.st64c.SetFont(wx.Font(9,74,90,90,0,"Tahoma"))
self.st74c = wx.StaticText(self,-1,"",wx.Point(180,10),wx.Size(104,20),wx.ST_NO_AUTORESIZE)
self.st74c.SetLabel("Resolution")
self.st74c.SetFont(wx.Font(9,74,90,90,0,"Tahoma"))
self.st84c = wx.StaticText(self,-1,"",wx.Point(330,10),wx.Size(104,20),wx.ST_NO_AUTORESIZE)
self.st84c.SetLabel("Series")
self.st84c.SetFont(wx.Font(9,74,90,90,0,"Tahoma"))
self.st94c = wx.StaticText(self,-1,"",wx.Point(455,10),wx.Size(104,20),wx.ST_NO_AUTORESIZE)
self.st94c.SetLabel("Episode")
self.st94c.SetFont(wx.Font(9,74,90,90,0,"Tahoma"))
self.st54c = wx.StaticText(self,-1,"",wx.Point(590,10),wx.Size(104,20),wx.ST_NO_AUTORESIZE)
self.st54c.SetLabel("Audio")
self.st54c.SetFont(wx.Font(9,74,90,90,0,"Tahoma"))
self.st44c = wx.StaticText(self,-1,"",wx.Point(50,65),wx.Size(104,15),wx.ST_NO_AUTORESIZE)
self.st44c.SetLabel("Url")
self.st44c.SetFont(wx.Font(9,74,90,90,0,"Tahoma"))
self.txm17c = wx.TextCtrl(self,-1,"",wx.Point(10,85),wx.Size(320,55),wx.TE_MULTILINE)
self.txm17c.SetFont(wx.Font(11,74,90,90,0,"Tahoma"))
self.txm23c = wx.TextCtrl(self,-1,"",wx.Point(10,155),wx.Size(660,450),wx.FULL_REPAINT_ON_RESIZE|wx.VSCROLL|wx.HSCROLL|wx.TE_MULTILINE)
self.txm23c.SetFont(wx.Font(10,74,90,90,0,"Tahoma"))
self.bt55c = wx.Button(self,-1,"",wx.Point(10,620),wx.Size(150,60))
self.bt55c.SetLabel("Download")
self.bt55c.SetFont(wx.Font(12,74,90,90,0,"Tahoma"))
self.Bind(wx.EVT_BUTTON,self.bt55c_VwXEvOnButtonClick,self.bt55c)
self.bt65c = wx.Button(self,-1,"",wx.Point(180,620),wx.Size(150,60))
self.bt65c.SetLabel("Playlist")
self.bt65c.SetFont(wx.Font(12,74,90,90,0,"Tahoma"))
self.Bind(wx.EVT_BUTTON,self.bt65c_VwXEvOnButtonClick,self.bt65c)
self.ck66c = wx.CheckBox(self,-1,"",wx.Point(470,80),wx.Size(18,21))
self.st66c = wx.StaticText(self,-1,"",wx.Point(460,60),wx.Size(90,22),wx.ST_NO_AUTORESIZE)
self.st66c.SetLabel("Debug")
#self.SetSizer( bSizer2 )
self.Layout()
self.Centre( wx.BOTH )
def __del__( self ):
pass
def get_playlist(self, event):
if self.chc54c.GetSelection() == 0:
#self.txm23c.SetValue('h264')
codec = 'h264'
if self.chc54c.GetSelection() == 1:
#self.txm23c.SetValue('hevc')
codec = 'hevc'
if self.chc54c.GetSelection() == 2:
#self.txm23c.SetValue('hdr')
codec = 'hdr'
if self.chc64c.GetSelection() == 0:
#self.txm23c.SetValue('sd')
res = 'sd'
if self.chc64c.GetSelection() == 1:
#self.txm23c.SetValue('720p')
res = '720p'
if self.chc64c.GetSelection() == 2:
#self.txm23c.SetValue('1080p')
res = '1080p'
if self.chc74c.GetSelection() == 0:
#self.txm23c.SetValue('1')
series = '1'
if self.chc74c.GetSelection() == 1:
#self.txm23c.SetValue('2')
series = '2'
if self.chc74c.GetSelection() == 2:
#self.txm23c.SetValue('3')
series = '3'
if self.chc74c.GetSelection() == 3:
#self.txm23c.SetValue('4')
series = '4'
if self.chc74c.GetSelection() == 4:
#self.txm23c.SetValue('5')
series = '5'
if self.chc74c.GetSelection() == 5:
#self.txm23c.SetValue('6')
series = '6'
if self.chc74c.GetSelection() == 6:
#self.txm23c.SetValue('7')
series = '7'
if self.chc74c.GetSelection() == 7:
#self.txm23c.SetValue('8')
series = '8'
if self.chc74c.GetSelection() == 8:
#self.txm23c.SetValue('9')
series = '9'
if self.chc74c.GetSelection() == 9:
#self.txm23c.SetValue('10')
series = '10'
if self.chc74c.GetSelection() == 10:
#self.txm23c.SetValue('11')
series = '11'
if self.chc74c.GetSelection() == 11:
#self.txm23c.SetValue('12')
series = '12'
if self.chc74c.GetSelection() == 12:
#self.txm23c.SetValue('13')
series = '13'
if self.chc74c.GetSelection() == 13:
#self.txm23c.SetValue('14')
series = '14'
if self.chc74c.GetSelection() == 14:
#self.txm23c.SetValue('15')
series = '15'
if self.chc74c.GetSelection() == 15:
#self.txm23c.SetValue('16')
series = '16'
if self.chc74c.GetSelection() == 16:
#self.txm23c.SetValue('17')
series = '17'
if self.chc74c.GetSelection() == 17:
#self.txm23c.SetValue('18')
series = '18'
if self.chc74c.GetSelection() == 18:
#self.txm23c.SetValue('19')
series = '19'
if self.chc74c.GetSelection() == 19:
#self.txm23c.SetValue('20')
series = '20'
if self.chc84c.GetSelection() == 0:
#self.txm23c.SetValue('1')
episode = '1'
if self.chc84c.GetSelection() == 1:
#self.txm23c.SetValue('2')
episode = '2'
if self.chc84c.GetSelection() == 2:
#self.txm23c.SetValue('3')
episode = '3'
if self.chc84c.GetSelection() == 3:
#self.txm23c.SetValue('4')
episode = '4'
if self.chc84c.GetSelection() == 4:
#self.txm23c.SetValue('5')
episode = '5'
if self.chc84c.GetSelection() == 5:
#self.txm23c.SetValue('6')
episode = '6'
if self.chc84c.GetSelection() == 6:
#self.txm23c.SetValue('7')
episode = '7'
if self.chc84c.GetSelection() == 7:
#self.txm23c.SetValue('8')
episode = '8'
if self.chc84c.GetSelection() == 8:
#self.txm23c.SetValue('9')
episode = '9'
if self.chc84c.GetSelection() == 9:
#self.txm23c.SetValue('10')
episode = '10'
if self.chc84c.GetSelection() == 10:
#self.txm23c.SetValue('11')
episode = '11'
if self.chc84c.GetSelection() == 11:
#self.txm23c.SetValue('12')
episode = '12'
if self.chc84c.GetSelection() == 12:
#self.txm23c.SetValue('13')
episode = '13'
if self.chc84c.GetSelection() == 13:
#self.txm23c.SetValue('14')
episode = '14'
if self.chc84c.GetSelection() == 14:
#self.txm23c.SetValue('15')
episode = '15'
if self.chc84c.GetSelection() == 15:
#self.txm23c.SetValue('16')
episode = '16'
if self.chc84c.GetSelection() == 16:
#self.txm23c.SetValue('17')
episode = '17'
if self.chc84c.GetSelection() == 17:
#self.txm23c.SetValue('18')
episode = '18'
if self.chc84c.GetSelection() == 18:
#self.txm23c.SetValue('19')
episode = '19'
if self.chc84c.GetSelection() == 19:
#self.txm23c.SetValue('20')
episode = '20'
audio = []
#self.txm23c.SetValue(str(self.lc7c.GetCheckedItems()))
if self.lc7c.IsChecked(0):
audio.append('de')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(1):
audio.append('en')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(2):
audio.append('es-ES')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(3):
audio.append('es')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(4):
audio.append('fr')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(5):
audio.append('it')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(6):
audio.append('ja')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(7):
audio.append('pl')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(8):
audio.append('pt-BR')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(9):
audio.append('ru')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(10):
audio.append('tr')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(11):
audio.append('nl-BE')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(12):
audio.append('nb')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(13):
audio.append('fi')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(14):
audio.append('cs')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(15):
audio.append('zh')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(16):
audio.append('yue')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(17):
audio.append('ko')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(18):
audio.append('ar')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(19):
audio.append('he')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(20):
audio.append('zxx')
#self.txm23c.SetValue(str(audio))
print(audio)
#cmd = "python netflix.py -t 80149092 -q sd -p h264 -a de"
cmd = "python netflix.py -i"
if self.ck66c.IsChecked():
cmd1 = " -d"
else:
cmd1 = ""
#https://www.netflix.com/de/title/80200571
title = self.txm17c.GetValue()
cmd0 = title.split('title/')
cmd0 = " -t " + cmd0[1]
cmd2 = " -p " + codec
cmd3 = " -q " + res
cmd4 = " -a " + ','.join(audio)
se = self.chc74c.GetSelection()
ep = self.chc84c.GetSelection()
if se == -1 and ep == -1:
cmd5 = ""
if se >= 0 and ep == -1:
cmd5 = " -s " + series
if se >= 0 and ep >= 0:
cmd5 = " -s " + series + " -e " + episode
cmdd = cmd + cmd0 + cmd2 + cmd3 + cmd1 + cmd4 + cmd5
print(cmdd)
popenobj = subprocess.Popen(cmdd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while not popenobj.poll():
stdoutdata = popenobj.stdout.readline()
if stdoutdata:
#sys.stdout.write(stdoutdata.decode('cp1252'))
wx.CallAfter(self.txm23c.AppendText, stdoutdata.decode('cp1252').encode('utf-8'))
else:
break
print("Return code", popenobj.returncode)
def get_download(self, event):
if self.chc54c.GetSelection() == 0:
#self.txm23c.SetValue('h264')
codec = 'h264'
if self.chc54c.GetSelection() == 1:
#self.txm23c.SetValue('hevc')
codec = 'hevc'
if self.chc54c.GetSelection() == 2:
#self.txm23c.SetValue('hdr')
codec = 'hdr'
if self.chc64c.GetSelection() == 0:
#self.txm23c.SetValue('sd')
res = 'sd'
if self.chc64c.GetSelection() == 1:
#self.txm23c.SetValue('720p')
res = '720p'
if self.chc64c.GetSelection() == 2:
#self.txm23c.SetValue('1080p')
res = '1080p'
if self.chc74c.GetSelection() == 0:
#self.txm23c.SetValue('1')
series = '1'
if self.chc74c.GetSelection() == 1:
#self.txm23c.SetValue('2')
series = '2'
if self.chc74c.GetSelection() == 2:
#self.txm23c.SetValue('3')
series = '3'
if self.chc74c.GetSelection() == 3:
#self.txm23c.SetValue('4')
series = '4'
if self.chc74c.GetSelection() == 4:
#self.txm23c.SetValue('5')
series = '5'
if self.chc74c.GetSelection() == 5:
#self.txm23c.SetValue('6')
series = '6'
if self.chc74c.GetSelection() == 6:
#self.txm23c.SetValue('7')
series = '7'
if self.chc74c.GetSelection() == 7:
#self.txm23c.SetValue('8')
series = '8'
if self.chc74c.GetSelection() == 8:
#self.txm23c.SetValue('9')
series = '9'
if self.chc74c.GetSelection() == 9:
#self.txm23c.SetValue('10')
series = '10'
if self.chc74c.GetSelection() == 10:
#self.txm23c.SetValue('11')
series = '11'
if self.chc74c.GetSelection() == 11:
#self.txm23c.SetValue('12')
series = '12'
if self.chc74c.GetSelection() == 12:
#self.txm23c.SetValue('13')
series = '13'
if self.chc74c.GetSelection() == 13:
#self.txm23c.SetValue('14')
series = '14'
if self.chc74c.GetSelection() == 14:
#self.txm23c.SetValue('15')
series = '15'
if self.chc74c.GetSelection() == 15:
#self.txm23c.SetValue('16')
series = '16'
if self.chc74c.GetSelection() == 16:
#self.txm23c.SetValue('17')
series = '17'
if self.chc74c.GetSelection() == 17:
#self.txm23c.SetValue('18')
series = '18'
if self.chc74c.GetSelection() == 18:
#self.txm23c.SetValue('19')
series = '19'
if self.chc74c.GetSelection() == 19:
#self.txm23c.SetValue('20')
series = '20'
if self.chc84c.GetSelection() == 0:
#self.txm23c.SetValue('1')
episode = '1'
if self.chc84c.GetSelection() == 1:
#self.txm23c.SetValue('2')
episode = '2'
if self.chc84c.GetSelection() == 2:
#self.txm23c.SetValue('3')
episode = '3'
if self.chc84c.GetSelection() == 3:
#self.txm23c.SetValue('4')
episode = '4'
if self.chc84c.GetSelection() == 4:
#self.txm23c.SetValue('5')
episode = '5'
if self.chc84c.GetSelection() == 5:
#self.txm23c.SetValue('6')
episode = '6'
if self.chc84c.GetSelection() == 6:
#self.txm23c.SetValue('7')
episode = '7'
if self.chc84c.GetSelection() == 7:
#self.txm23c.SetValue('8')
episode = '8'
if self.chc84c.GetSelection() == 8:
#self.txm23c.SetValue('9')
episode = '9'
if self.chc84c.GetSelection() == 9:
#self.txm23c.SetValue('10')
episode = '10'
if self.chc84c.GetSelection() == 10:
#self.txm23c.SetValue('11')
episode = '11'
if self.chc84c.GetSelection() == 11:
#self.txm23c.SetValue('12')
episode = '12'
if self.chc84c.GetSelection() == 12:
#self.txm23c.SetValue('13')
episode = '13'
if self.chc84c.GetSelection() == 13:
#self.txm23c.SetValue('14')
episode = '14'
if self.chc84c.GetSelection() == 14:
#self.txm23c.SetValue('15')
episode = '15'
if self.chc84c.GetSelection() == 15:
#self.txm23c.SetValue('16')
episode = '16'
if self.chc84c.GetSelection() == 16:
#self.txm23c.SetValue('17')
episode = '17'
if self.chc84c.GetSelection() == 17:
#self.txm23c.SetValue('18')
episode = '18'
if self.chc84c.GetSelection() == 18:
#self.txm23c.SetValue('19')
episode = '19'
if self.chc84c.GetSelection() == 19:
#self.txm23c.SetValue('20')
episode = '20'
audio = []
#self.txm23c.SetValue(str(self.lc7c.GetCheckedItems()))
if self.lc7c.IsChecked(0):
audio.append('de')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(1):
audio.append('en')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(2):
audio.append('es-ES')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(3):
audio.append('es')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(4):
audio.append('fr')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(5):
audio.append('it')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(6):
audio.append('ja')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(7):
audio.append('pl')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(8):
audio.append('pt-BR')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(9):
audio.append('ru')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(10):
audio.append('tr')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(11):
audio.append('nl-BE')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(12):
audio.append('nb')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(13):
audio.append('fi')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(14):
audio.append('cs')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(15):
audio.append('zh')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(16):
audio.append('yue')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(17):
audio.append('ko')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(18):
audio.append('ar')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(19):
audio.append('he')
#self.txm23c.SetValue(str(audio))
print(audio)
if self.lc7c.IsChecked(20):
audio.append('zxx')
#self.txm23c.SetValue(str(audio))
print(audio)
#cmd = "python netflix.py -t 80149092 -q sd -p h264 -a de"
cmd = "python netflix.py"
if self.ck66c.IsChecked():
cmd1 = " -d"
else:
cmd1 = ""
#https://www.netflix.com/de/title/80200571
title = self.txm17c.GetValue()
cmd0 = title.split('title/')
cmd0 = " -t " + cmd0[1]
cmd2 = " -p " + codec
cmd3 = " -q " + res
cmd4 = " -a " + ','.join(audio)
se = self.chc74c.GetSelection()
ep = self.chc84c.GetSelection()
if se == -1 and ep == -1:
cmd5 = ""
if se >= 0 and ep == -1:
cmd5 = " -s " + series
if se >= 0 and ep >= 0:
cmd5 = " -s " + series + " -e " + episode
cmdd = cmd + cmd0 + cmd2 + cmd3 + cmd1 + cmd4 + cmd5
print(cmdd)
popenobj = subprocess.Popen(cmdd, stdout=subprocess.PIPE)
while not popenobj.poll():
stdoutdata = popenobj.stdout.readline()
if stdoutdata:
#sys.stdout.write(stdoutdata.decode('cp1252'))
wx.CallAfter(self.txm23c.AppendText, stdoutdata.decode('cp1252').encode('utf-8'))
else:
break
print("Return code", popenobj.returncode)
def bt65c_VwXEvOnButtonClick(self,event):
th = threading.Thread(target=self.get_playlist, args=(event,))
th.start()
return
def bt55c_VwXEvOnButtonClick(self,event):
th = threading.Thread(target=self.get_download, args=(event,))
th.start()
return

Wyświetl plik

@ -0,0 +1,3 @@
python netflix.py -t 80230399 -q 2160p -p hdr
echo.
pause

Wyświetl plik

@ -0,0 +1,4 @@
python netflix.py -t 80215488 -q 2160p -p hdr -s 1 -e 1 -a en
echo *** PROCESO FINALIZADO ***
echo.
pause

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

108
addressprotecmac 100644
Wyświetl plik

@ -0,0 +1,108 @@
important comment=D0-17-C2-95-00-BE
.vscode/settings.json
binaries/*
cookies/*
output/*
temp/*
pywidevine/clients/*/*config.py
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/

0
binaries/.gitignore vendored 100644
Wyświetl plik

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

BIN
binaries/avconv.exe 100644

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

BIN
binaries/avplay.exe 100644

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

BIN
binaries/avutil.lib 100644

Plik binarny nie jest wyświetlany.

BIN
binaries/ffmpeg.exe 100644

Plik binarny nie jest wyświetlany.

BIN
binaries/ffplay.exe 100644

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,3 @@
mp4dump = 1.5.0.614
phantomjs = 2.1.1
mkvmerge = 11.0.0-64

1
binaries/video 100644
Wyświetl plik

@ -0,0 +1 @@
generic 20170809T051653-05-1463071

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

BIN
binaries/youtube-dl 100644

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

BIN
binaries/zlib1.dll 100644

Plik binarny nie jest wyświetlany.

15
cookies.txt 100644
Wyświetl plik

@ -0,0 +1,15 @@
# HTTP Cookie File for domains related to netflix.com.
# Downloaded with cookies.txt Chrome Extension (https://chrome.google.com/webstore/detail/njabckikapfpffapmjgojcnbfjonfjfg)
# Example: wget -x --load-cookies cookies.txt https://www.netflix.com/browse
#
.netflix.com TRUE / FALSE 1669278820 memclid e74b9e5e-91ca-4892-8632-0cb8c6603941
.netflix.com TRUE / FALSE 1645518812 pas %7B%22supplementals%22%3A%7B%22muted%22%3Afalse%7D%7D
.netflix.com TRUE / FALSE 1645518812 playerPerfMetrics %7B%22uiValue%22%3A%7B%22throughput%22%3A1761.05%2C%22throughputNiqr%22%3A0.6072196932211776%7D%2C%22mostRecentValue%22%3A%7B%22throughput%22%3A1761.05%2C%22throughputNiqr%22%3A0.6072196932211776%7D%7D
.netflix.com TRUE / FALSE 0 clSharedContext 27ec0ee1-e55d-4fea-aa8a-dabceec64933
.netflix.com TRUE / FALSE 1637744614 profilesNewSession 0
.netflix.com TRUE / FALSE 1637753611 flwssn cbf22a14-2a7e-4600-9bdd-b1fa7066265a
.netflix.com TRUE / FALSE 1669278811 nfvdid BQFmAAEBEEr1G4bCRtYMy71LrGowUb9g2zSaS2Gfvil0m7U5Q4pu3WKx5yM4XwwfWihPLA7px_GvXKP635bGWUK6H24DcM6GK9bQOFp9905LYuNO8BRrdxs4BFQ37uGmInll8XPG6c37SWowfHP2ZLV2sEZ7n-Pe
.netflix.com TRUE / TRUE 1669278811 SecureNetflixId v%3D2%26mac%3DAQEAEQABABS2V1fpBFCM7yoXuwJ8HQonzDVujurxUxE.%26dt%3D1637742810595
.netflix.com TRUE / TRUE 1669278811 NetflixId v%3D2%26ct%3DBQAOAAEBEHQhvoGIsgJ1s4AkHEfifJOB0OXHsrGk7wfJEIPW5AkQTvu73fMNWPKcPdATmNFwxzqdK5rGCqmjVwC1w71qsK_Y8DjjOcXHB3Zkmz2WUBUhF_JqAbEGvwW6HMo90mcoxWEExYHLudE6OJKeh_eeKvKsf-7c3iDxWVK1xBe1Q7ejeW6vv_iqFdV2qRC9JJi8dF4Vsz2omok0cu9ynaudFU0_BNHBxw4bBoqIQaqk5OHy2xEYk5nZRle-H1F7AshXstptrkvCVousFEOvA7_CWcu-GBoNckG8UtRfNnN8CMQi892E_LLRwYvVdOCl0VAW17TN4lExppSIPLO7QC9qqXrwGyeBkCOxdEkwGOeLlqVBQvEAcW9rsgjWKqnub2Cuy5wbF4xSF921NxeXRynPkD9HKWVWdOmO0s85cCsGIuZyeLAe0Zu0LxGLr5UApVF95uSREskq-51Y4kuVTHjnBAbZ6vXM4x5mqM1Mx4qa5S7QO1EYKPYuJjdcUuoPk8oSqZx4VSOL2kdz8r5qeqT-LTDBMtvRJII0y6JWu8SXcX8DY-9tMUKYWUn-eXKTCbrpDitls9aKM_CCknBSf4Tcw7ejaD7UBOWe8IKV_m1oLD8Es-P_qMPGg7xIOnnMI9AltmC1%26bt%3Ddbl%26ch%3DAQEAEAABABSMhx-Q3cKesfd5g62kOwDjP9LvfDg0j1Q.%26mac%3DAQEAEAABABSbl-uW04K698qYjACgMO4Te_COxD67puQ.
.www.netflix.com TRUE / FALSE 0 cL 1637742812398%7C163774279369203149%7C163774279395967530%7C%7C5%7CNQGTGSO5SRHXRPPBVPZMU6RUSA
.netflix.com TRUE / FALSE 1669278812 OptanonConsent isIABGlobal=false&datestamp=Wed+Nov+24+2021+14%3A03%3A32+GMT%2B0530+(India+Standard+Time)&version=6.6.0&consentId=995f08da-e373-45c0-afb5-94226bba5d02&interactionCount=1&landingPath=NotLandingPage&groups=C0001%3A1%2CC0002%3A1%2CC0004%3A1&hosts=H12%3A1%2CH13%3A1%2CH27%3A1%2CH28%3A1%2CH30%3A1&AwaitingReconsent=false

1
cookies/msl.json 100644
Wyświetl plik

@ -0,0 +1 @@
{"encryption_key": "oPpCxzLmhnoq2j6yxDmDug==", "sign_key": "NhnmNhfx3W9+yJwoBR/O6AQSUVUOk/eAlB4pWs2CIq4=", "tokens": {"mastertoken": {"tokendata": "eyJzZXNzaW9uZGF0YSI6IkJRQ0FBQUVCRUpVcFNhU0NmRTRqUXFEYWxYYVpvMytCNEtFcCtjdXJwazlHYzh6NHIyRW1FYnVYVGY0T1RMVGlMQnlvQlZZTDJydjc1MW15bWxNQmI4U1dnbkpuaUZmK2MySjJMYjRQZEtGRUN5TEF6eitHb2lRa1pGOU1JazJRWXpKZG5HdjdxQ252dVA5UkJpUHo5VFFzaDllY2Fqa1IxWFViTTBGQ0tDdGVLNk0xMFlpWEY3MGVZZm1MQk5teW5MK2RYQm1VOWpEMDBPM1BJNitFSlFXa3FFT3ZwVXVYVUMxbHRzSDdOVFNkWExrTXhiUXFjUFB4MXYvL1VMT3dYUVMwaFBDL1lnR0Q2Sm1wQ2x3b0o2WXN1ejZqb1FMY0RwTnlDeVY1WU9GcUYwZkF6VlVFeWtZa3JDMFF1ZldEdlE3YmFtNTA4d1RqT0ZVMEc5TnpONTdGb3lTSUJWcm0rTUI2cTV4UmpmSWlGQUhDbVFRY1JGUnR4UEpoUU8vdk5ETGUwRFM2QmFJSEFRdkZ5VmpWSHZnMUc2SGUvZzVvSnZHRk5QbkYzL1d0VFI1SGQyVVB3N0pzYytuVFlaWGYrR0p6c3JQazU0bjVSVWdoZjRYZUhLeHhxK0pWUjJxRUt4bWc4UkVJWVVGQkpxQ0lxaGlJUTdONjlWdU8vZTVqTTh5VENic2NESFJic0dIeldla1N3cnQzR2gwR05TZXVwZU44SEkxb0hFS291U3l5cFZsV1hxTmJKVlpMYWFHdTY4cHp6amZzUXNUdVhMeWNwR1JTNGtWNytieDhrTG9wMncwdHhIdnhSQUd3K0RPU0xTVm5HcWdxSHQ0UlRjM1o4aHd6ZUZzdVFuYlRqSnJyN0kvUk1FRGhPTVBqK3NKSHl3PT0iLCJyZW5ld2Fsd2luZG93IjoxNjM3ODI5NTExLCJzZXJpYWxudW1iZXIiOjg4NjE3ODYxMDAwOTM2MDQsImV4cGlyYXRpb24iOjE2Mzg5NTI3MTEsInNlcXVlbmNlbnVtYmVyIjoyN30=", "signature": "AQEAgQABASBFZUtJcaaqs6+8UyjpafykZUeUYd6JEg3plZeCFlmZ+EwJ1ms="}}}

27
cookies/rsa.bin 100644
Wyświetl plik

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAr8jT0KjVIKBQTocunmzU0e9lk+J20W4fuG3e4d+fTaOvfJFH
HPxQvcYIx6EBl/CVL8jYnq5b7Vn5FTJvLhJAyNZXkHNCR89qafoJu9EpiHfVE5rJ
pdpX/XJmR4RGIJ7mwjkqgKMnlZqLRPB193zIhOcvTP76hQMxJZ7D7rlsBRY1K95r
sU6UuZSJkXhVKao/VjTCfUUoYylHxeYh9FJ4E+MY0lenZD0anB3zCPTeJWuSy3tT
nfd9y1UeKXprc8uwtHN55sjwbTthyOosOvAwXlQmLj2RWaFOMgk2k5opTVIf4A3f
DVmKNTlSMrhFEAPPnobeZO9wJo5V9aoG/47bDQIDAQABAoIBAAZToVIBfZg8xN8q
rOIdUySSK/MAY9viTYh3Bd5VzNc/xK1kUi2oJCTMZ5z9vb+w9EGhxjAh4OOgSR96
7vb2x7eixUiI6XIJtFAHpImKu+ayP2xC9i5+twuDbkx1JYv/hBkp8w5psN9Izmnn
CKvlZRcpdfGcvLoEVSTAO9eP+2QMawbSq6H9tSOaOEsRdIP3x3ghdLm7lHymQ8AQ
AVsL9AF87bNGh20gdKNO179irTv3pHw1jGX1EndOKt0Q9GX619HKNVy7Mq2uK/eV
HwZkttOJE72pwHQSpOSTslrFoKXQZkF4dtftaCA45d0UxCoPOws82a8MKwB4sEmK
VINMfrECgYEAyK3u5rgj/PE8pbgCfIkJu5+schNqMJXB7ffzc9RKmd7soGjMRLjo
lzxi10/QDkLM9a/W0qPEQucyFpqAzJhg6+5WgcidJB3Ll2UiXcwLlJWmHHmIEscJ
qeCKErBBb8qcgJyjAkDI3JM7jH/Mm8D/B6BXDKk5EczwB0QPy2SvY3ECgYEA4D4L
CYAksN/GQFd+TXh3Hci4PyLscec1ALfqVQPAcr1JQof2fBNzy8NrcJINp5O66yib
yE82CHbUn7jjYBQSXSpkzQmELhxje7sOzUPOlG5PbBddiy5vDfo6JfsQEjb54Zcu
KLOvJJHmGlsvd56xTxCDV9zikBjN1+9RPT7/610CgYAae+HgbwLI2elgEXW6i7dO
HJd8gpVsDgeG6UcmzSh/QA1IaiwzEZgYhW6h7bWOfEBiWC9ooxY+ohZZJ1DCL4Xy
/QRLoncikhARTdaIPGp21H0UmvFbUQs0cR6nsr0gDMQ0sPdOT9ByU7fzJdaR45mE
nyN910Nh1wMCYngXJpWC8QKBgDQhuGcpB16nZ2ul65MPIoImG89xyw5f9g6Is024
ZZFHODTjbwZBb3Y7pEqzacE/swDgm/bhk2o8Vgob7aB0iiBmrrCMOdKOfwJQ5owJ
64jObGBwviqRTPgu6D3UNFRHu6gagXys6VbTJG+UK2Df39DFwgM3MuTVH2XIGVbn
wo9xAoGAM1kAWIipKpphWms/v874kUtI/aUeGrr1Qh0OghYxecJfOtWixQrngvSa
zQgnjfJwFxnD1J5E8Mv4AuXOOLmry2LIjq5OASmLlQpa7N9wTNFCPNAqo3m4yLJ0
3dTSmRNeLP2Xnn37QxXjSOTBpWtUuJ3XEuyE5LN4rf8FQ02j188=
-----END RSA PRIVATE KEY-----

0
fonts/.gitignore vendored 100644
Wyświetl plik

Plik binarny nie jest wyświetlany.

1
license.json 100644
Wyświetl plik

@ -0,0 +1 @@
{'version': 2, 'id': 16087085638925, 'serverTime': 1608708564066, 'from': 'nq_cadmium_pbo_licenses@2.56.0/pbo-client@2.56.0', 'result': [{'error': {'pboc': True, 'code': 'FAIL', 'detail': 'license/pbl-1044: IssueLicensePolicyError (E2-BQFRAAELEISgIsOLo2MW4GA3BfKAY06At4kVy6MrBAAzT82uyWw8qJdUSJPfOVf8gtcBZnzv_pPaZI2dRGRpdXoC1BlCmdYDWsLTB8k5ycO4z6rbgxHhaHo8H_ZDh11CZ3yNmzLiQL8-SGHqyrPaOLBBU_xvKwNsZtBbO6D5N4VL8oL2UV8uYy-9ADUH3uB8cVtyayaJL5cjZD6uQl_RaXYHh0e6GwEl_L-GJIsZFlOhj7jgwAWC9l0ANY8nG61SWkOJ7agmDYDwTFJ5Vvy0GA..) (nq_cadmium_pbo_licenses@2.56.0/pbo-client@2.56.0)', 'display': 'Dieser Titel steht nicht zum Streaming zur Verfügung. Bitte versuchen Sie einen anderen Titel. 1044', 'alertTag': '', 'errorDisplayMessage': 'Dieser Titel steht nicht zum Streaming zur Verfügung. Bitte versuchen Sie einen anderen Titel. 1044', 'errorActionId': 3, 'nccpError': {}, 'errorSubCode': 0, 'errorReasonCode': 0, 'errorNccpCode': 0, 'errorExternalCode': 0, 'bladeRunnerMessage': 'license/pbl-1044: IssueLicensePolicyError (E2-BQFRAAELEISgIsOLo2MW4GA3BfKAY06At4kVy6MrBAAzT82uyWw8qJdUSJPfOVf8gtcBZnzv_pPaZI2dRGRpdXoC1BlCmdYDWsLTB8k5ycO4z6rbgxHhaHo8H_ZDh11CZ3yNmzLiQL8-SGHqyrPaOLBBU_xvKwNsZtBbO6D5N4VL8oL2UV8uYy-9ADUH3uB8cVtyayaJL5cjZD6uQl_RaXYHh0e6GwEl_L-GJIsZFlOhj7jgwAWC9l0ANY8nG61SWkOJ7agmDYDwTFJ5Vvy0GA..) (nq_cadmium_pbo_licenses@2.56.0/pbo-client@2.56.0)', 'bladeRunnerCode': '1044'}, 'errorParams': {'sessionId': '123456'}}]}

1
manifest.json 100644

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
manifest_sd.json 100644

File diff suppressed because one or more lines are too long

382
netflix.py 100644
Wyświetl plik

@ -0,0 +1,382 @@
import argparse
import logging
import sys
import requests
import re
import json
try:
from http.cookiejar import CookieJar
except ImportError:
from cookielib import CookieJar
import colorama
from pywidevine.clients.netflix.client import NetflixClient
from pywidevine.clients.netflix.config import NetflixConfig
from pywidevine.clients.netflix.profiles import NetflixProfiles
from pywidevine.downloader.wvdownloader import WvDownloader
from pywidevine.downloader.wvdownloaderconfig import WvDownloaderConfig
parser = argparse.ArgumentParser(
description="netflix content downloader"
)
parser.add_argument('-t', '--title',
help='title id',
nargs='+',
type=int,
required=True)
parser.add_argument('-o', '--outputfile',
default='out',
nargs='?',
help='output filename (no extension)')
parser.add_argument('-q', '--quality',
help='video resolution',
choices=['480p', '720p', '1080p', '2160p'])
parser.add_argument('-a', '--audiolang',
help='audio language',
type=lambda x: x.split(','))
parser.add_argument('-p', '--profile',
default='h264',
#choices=['h264', 'hevc', 'hdr', 'all'],
choices=['h264_main', 'h264_high', 'hevc', 'hdr', 'vp9', 'all'],
#choices=['h264', 'h264_hpl', 'hevc', 'hdr', 'vp9', 'all'],
help='video type to download')
parser.add_argument('-k', '--skip-cleanup', action='store_true', help='skip cleanup step')
parser.add_argument('-m', '--dont-mux',
action='store_true',
help='move unmuxed tracks instead of muxing')
parser.add_argument('-i', '--info', action='store_true', help='print track information and exit')
parser.add_argument('-d', '--debug', action='store_true', help='print debug statements')
parser.add_argument('-S', '--subs-only', action='store_true', help='download subtitles and exit')
parser.add_argument('-u', '--sub-type', default='srt', choices=['srt', 'ass', 'none'],
help='subtitle type (or none)')
parser.add_argument('-s', '--season', type=int, help='lookup and download season from title id')
parser.add_argument('-e',
'--episode_start',
dest="episode_start",
help="Recursively rip season number that provided viewable ID belongs to, starting at the episode provided")
parser.add_argument('--skip', type=int, default=0, help='skip episodes in season mode')
parser.add_argument('--region', default='us', choices=['us', 'uk', 'jp', 'ca', 'se', 'ru'], help='region to proxy')
parser.add_argument('--license',
action='store_true',
help='do license request and print decryption keys only')
args = parser.parse_args()
DEBUG_LEVELKEY_NUM = 21
logging.addLevelName(DEBUG_LEVELKEY_NUM, "LOGKEY")
def logkey(self, message, *args, **kws):
# Yes, logger takes its '*args' as 'args'.
if self.isEnabledFor(DEBUG_LEVELKEY_NUM):
self._log(DEBUG_LEVELKEY_NUM, message, args, **kws)
logging.Logger.logkey = logkey
logger = logging.getLogger()
if args.license:
logger.setLevel(21)
else:
logger.setLevel(logging.INFO)
if args.debug:
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(module)s - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
colorama.init()
BUILD = ''
SESSION = requests.Session()
"""
login_pag = SESSION.get("https://www.netflix.com/login").text
authURL = re.search('name="authURL" value="([^"]+)"', login_pag)
print(authURL)
#authURL = re.search(r'authURL\" value\=\"(.*?)\"', login_pag)
authURL = authURL[1]
def login(username, password):
#
post_data = {
'email': username,
'password': password,
'rememberMe': 'true',
'mode': 'login',
'action': 'loginAction',
'withFields': 'email,password,rememberMe,nextPage,showPassword',
'nextPage': '',
'showPassword': '',
'authURL': authURL
}
req = SESSION.post('https://www.netflix.com/login', post_data)
#match =re.search (r'.*"BUILD_IDENTIFIER":"([a-z0-9]+)"', req.text)
match = re.search(r'"BUILD_IDENTIFIER":"([a-z0-9]+)"', req.text) #fix by Castle / https://gist.github.com/xor10/8f65c1e66a34386e1131f8c28ff6bf64#gistcomment-2668063
if match is not None:
return match.group(1)
else:
return None
"""
def login(username, password):
r = SESSION.get('https://www.netflix.com/login', stream=True, allow_redirects=False, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'})
loc = None
while 'Location' in r.headers:
loc = r.headers['Location']
r = SESSION.get(loc, stream=True, allow_redirects=False, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'})
x = re.search('name="authURL" value="([^"]+)"', r.text)
if not x:
return
authURL = x.group(1)
post_data = {'userLoginId':username,
'password':password,
'rememberMe':'true',
'mode':'login',
'flow':'websiteSignUp',
'action':'loginAction',
'authURL':authURL,
'withFields':'userLoginId,password,rememberMe,nextPage,showPassword',
'nextPage':'',
'showPassword':''}
req = SESSION.post(loc, post_data, headers={'User-Agent': 'Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.90 Safari/537.36 CrKey/1.17.46278'})
try:
req.raise_for_status()
except requests.exceptions.HTTPError as e:
print(e)
logger.error(e)
sys.exit(1)
match = re.search('"BUILD_IDENTIFIER":"([a-z0-9]+)"', req.text)
if match is not None:
return match.group(1)
else:
return
"""
def fetch_metadata(movieid):
#Fetches metadata for a netflix id
req = SESSION.get('https://www.netflix.com/api/shakti/' + BUILD + '/metadata?movieid=' + movieid)
return json.loads(req.text)
"""
def parseCookieFile(cookiefile):
"""Parse a cookies.txt file and return a dictionary of key value pairs
compatible with requests."""
cookies = {}
with open (cookiefile, 'r') as fp:
for line in fp:
if not re.match(r'^\#', line):
lineFields = line.strip().split('\t')
cookies[lineFields[5]] = lineFields[6]
return cookies
#proxies = {"https": "159.100.246.156:45382"}
def get_build():
cookies = parseCookieFile('cookies.txt')
post_data = ''
#req1 = SESSION.get('https://www.netflix.com', headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}, cookies=cookies, proxies=proxies)
#print(req1.text)
#exit(1)
req = SESSION.post('https://www.netflix.com/browse', post_data, headers={'User-Agent': 'Gibbon/2018.1.6.3/2018.1.6.3: Netflix/2018.1.6.3 (DEVTYPE=NFANDROID2-PRV-FIRETVSTICK2016; CERTVER=0)'}, cookies=cookies)
#req = SESSION.get('https://www.netflix.com/browse', headers={'User-Agent': 'Gibbon/2018.1.6.3/2018.1.6.3: Netflix/2018.1.6.3 (DEVTYPE=NFANDROID2-PRV-FIRETVSTICK2016; CERTVER=0)'}, cookies=cookies, proxies=proxies)
match = re.search(r'"BUILD_IDENTIFIER":"([a-z0-9]+)"', req.text) #fix by Castle / https://gist.github.com/xor10/8f65c1e66a34386e1131f8c28ff6bf64#gistcomment-2668063
return match.group(1)
def fetch_metadata(movieid):
global BUILD
cookies = parseCookieFile('cookies.txt')
#BUILD = get_build()
BUILD = 'vafe38bd5'
print(BUILD)
#cookies = 'on'
#if BUILD == '':
# BUILD = login(username, password)
"""
if cookies == 'off':
req = SESSION.get('https://www.netflix.com/api/shakti/' + BUILD + '/metadata?movieid=' + movieid + '&drmSystem=widevine&isWatchlistEnabled=false&isShortformEnabled=false&isVolatileBillboardsEnabled=false')
else:
req = requests.get('https://www.netflix.com/api/shakti/' + BUILD + '/metadata?movieid=' + movieid + '&drmSystem=widevine&isWatchlistEnabled=false&isShortformEnabled=false&isVolatileBillboardsEnabled=false', cookies=cookies)
"""
req = requests.get('https://www.netflix.com/api/shakti/' + BUILD + '/metadata?movieid=' + movieid + '&drmSystem=widevine&isWatchlistEnabled=false&isShortformEnabled=false&isVolatileBillboardsEnabled=false', cookies=cookies)
return json.loads(req.text)
def fetch_metadata_movie(BUILD, movieid):
#global BUILD
#cookies = 'on'
#if BUILD == '':
# BUILD = login(username, password)
cookies = parseCookieFile('cookies.txt')
#BUILD = get_build()
BUILD = 'vafe38bd5'
print(BUILD)
"""
if cookies == 'off':
req = SESSION.get('https://www.netflix.com/api/shakti/' + BUILD + '/metadata?movieid=' + movieid + '&drmSystem=widevine&isWatchlistEnabled=false&isShortformEnabled=false&isVolatileBillboardsEnabled=false')
else:
req = requests.get('https://www.netflix.com/api/shakti/' + BUILD + '/metadata?movieid=' + movieid + '&drmSystem=widevine&isWatchlistEnabled=false&isShortformEnabled=false&isVolatileBillboardsEnabled=false', cookies=cookies)
"""
req = requests.get('https://www.netflix.com/api/shakti/' + BUILD + '/metadata?movieid=' + movieid + '&drmSystem=widevine&isWatchlistEnabled=false&isShortformEnabled=false&isVolatileBillboardsEnabled=false', cookies=cookies)
return json.loads(req.text)
episodes = []
if args.season:
nf_cfg = NetflixConfig(0, None, None, [], ['all'], None, args.region)
username, password = nf_cfg.get_login()
#BUILD = login(username, password)
if BUILD is not None:
info = fetch_metadata(str(args.title[0]))
serial_title = info['video']['title']
serial_title = re.sub(r'[/\\:*?"<>|]', '', serial_title)
for season in info['video']['seasons']:
if season['seq'] == args.season:
episode_list = season['episodes']
#print(len(episode_list))
if args.episode_start:
#episode_list = episode_list[(int(args.episode_start) - 1):]
episode_list = [episode_list[(int(args.episode_start) - 1)]]
#print(episode_list)
for episode in episode_list:
if episode['seq'] > args.skip:
episodes.append((
episode['episodeId'],
"{}.S{}E{}.{}".format(
serial_title.replace(' ', '.').replace('"', '.').replace('"', '.').replace('(', '').replace(')', ''),
str(season['seq']).zfill(2),
str(episode['seq']).zfill(2),
episode['title'].replace(',', '').replace(':', '').replace('?', '').replace("'", '').replace(' ', '.').replace('/', '').replace('"', '.').replace('"', '.').replace('(', '').replace(')', ''))))
else:
episodes = [(args.title[0], args.outputfile)]
def get_movie_name():
#nf_cfg = NetflixConfig(0, None, None, [], ['all'], None, args.region)
#username, password = nf_cfg.get_login()
#BUILD = ''
#BUILD = login(username, password)
#print(BUILD)
BUILD = globals()['BUILD']
if BUILD is not None:
info = fetch_metadata_movie(BUILD, str(args.title[0]))
serial_title = info['video']['title']
#serial_title = 'title'
synopsis = info['video']['synopsis']
#synopsis = ''
year = info['video']['year']
#year = str('2019')
try:
boxart = info['video']['boxart'][0]['url']
except IndexError:
boxart = ''
serial_title = re.sub(r'[/\\:*?"<>|]', '', serial_title)
#print(serial_title)
logger.info("ripping {} {}".format(serial_title, serial_title.replace('"', '.').replace('"', '.').replace('(', '').replace(')', '')))
logger.info("boxart {} ".format(boxart))
logger.info("synopsis {} ".format(synopsis))
logger.info("year {} ".format(year))
return str(serial_title.replace('"', '.').replace('"', '.').replace('(', '').replace(')', ''))
else:
return str('')
nf_profiles = NetflixProfiles(args.profile, args.quality)
for title, outputfile in episodes:
if args.season:
if args.profile == 'h264':
codec_name = 'x264'
if args.profile == 'h264_main':
codec_name = 'x264'
if args.profile == 'h264_high':
codec_name = 'x264'
if args.profile == 'hevc':
codec_name = 'h265'
if args.profile == 'hdr':
codec_name = 'hdr'
if args.profile == 'vp9':
codec_name = 'VP9'
if args.profile == 'all':
codec_name = 'x264'
group = 'MI'
logger.info("ripping {}: {}".format(title, outputfile))
outputfile = outputfile + '.' + str(args.quality) + '.NF.WEB-DL.' + 'AUDIOCODEC' + '.' + codec_name + '-' + group
outputfile1 = outputfile + '.' + str(args.quality) + '.NF.WEB-DL.' + 'AUDIOCODEC' + '.' + codec_name + '-' + group
if not args.season:
if args.profile == 'h264':
codec_name = 'x264'
if args.profile == 'h264_main':
codec_name = 'x264'
if args.profile == 'h264_high':
codec_name = 'x264'
if args.profile == 'hevc':
codec_name = 'h265'
if args.profile == 'hdr':
codec_name = 'hdr'
if args.profile == 'vp9':
codec_name = 'VP9'
if args.profile == 'all':
codec_name = 'x264'
group = 'NFT'
logger.info("ripping {}: {}".format(title, outputfile))
info = fetch_metadata_movie(BUILD, str(args.title[0]))
#print(info)
year = info['video']['year']
#year = str('2019')
outputfile = get_movie_name().replace("'", '').replace(' ', '.').replace('"', '.').replace('"', '.').replace('(', '').replace(')', '') + '.'+ str(year) + '.' + str(args.quality) + '.NF.WEB-DL.'+ 'AUDIOCODEC' + '.' + codec_name + '-' + group
outputfile1 = get_movie_name().replace("'", '').replace(' ', '.').replace('"', '.').replace('"', '.').replace('(', '').replace(')', '') + '.'+ str(year) + '.' + str(args.quality) + '.NF.WEB-DL.'+ 'AUDIOCODEC' + '.' + codec_name + '-' + group
if args.audiolang:
audiolang = args.audiolang
else:
audiolang = None
if args.quality is not None:
profiles = nf_profiles.get_all()
else:
profiles = nf_profiles.get_all()
nf_cfg = NetflixConfig(title, profiles, None, [], ['all'], audiolang, args.region)
nf_client = NetflixClient(nf_cfg)
"""
if not args.season:
outputfile = outputfile + '_' + str(args.profile)
outputfile1 = outputfile + '_' + str(args.profile)
else:
outputfile1 = outputfile + '_' + str(args.profile)
outputfile = outputfile + '_' + str(args.profile)
"""
wvdownloader_config = WvDownloaderConfig(nf_client,
outputfile,
args.sub_type,
args.info,
args.skip_cleanup,
args.dont_mux,
args.subs_only,
args.license,
args.quality,
args.profile)
wvdownloader = WvDownloader(wvdownloader_config)
wvdownloader.run()

33
netflix.spec 100644
Wyświetl plik

@ -0,0 +1,33 @@
# -*- mode: python -*-
block_cipher = None
a = Analysis(['netflix.py'],
pathex=['e:\\netflix\\NFTool'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='netflix',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='netflix')

24
netflix_gui.py 100644
Wyświetl plik

@ -0,0 +1,24 @@
# -*- coding: iso-8859-1 -*-
import wx
#import xenforo
#provider = wx.SimpleHelpProvider()
#wx.HelpProvider_Set(provider)
import MyFrame
class App(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
self.main = MyFrame.MyFrame(None)
self.main.Show()
self.SetTopWindow(self.main)
return 1
def main():
#application = App(0)
application = App()
application.MainLoop()
if __name__ == '__main__':
main()

Wyświetl plik

@ -0,0 +1 @@
52 comment=365978a0d3f430e2e24b025580c24cba75154132

BIN
pip.exe 100644

Plik binarny nie jest wyświetlany.

Wyświetl plik

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Some files were not shown because too many files have changed in this diff Show More