mirror of
https://github.com/widevinedump/Netflix-4K-Script.git
synced 2024-03-24 20:20:46 +01:00
New
This commit is contained in:
parent
0d48afbb7f
commit
333e2446f5
197 changed files with 13549 additions and 0 deletions
40
- COMANDS -.txt
Normal file
40
- COMANDS -.txt
Normal file
|
|
@ -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
Normal file
719
MyFrame.py
Normal file
|
|
@ -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
|
||||||
3
WEBDL_NF_MOVIE.cmd
Normal file
3
WEBDL_NF_MOVIE.cmd
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
python netflix.py -t 80230399 -q 2160p -p hdr
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
4
WEBDL_NF_SERIES.bat
Normal file
4
WEBDL_NF_SERIES.bat
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
python netflix.py -t 80215488 -q 2160p -p hdr -s 1 -e 1 -a en
|
||||||
|
echo *** PROCESO FINALIZADO ***
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
BIN
__pycache__/MyFrame.cpython-37.pyc
Normal file
BIN
__pycache__/MyFrame.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/netflix.cpython-36.pyc
Normal file
BIN
__pycache__/netflix.cpython-36.pyc
Normal file
Binary file not shown.
108
addressprotecmac
Normal file
108
addressprotecmac
Normal file
|
|
@ -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
Normal file
0
binaries/.gitignore
vendored
Normal file
BIN
binaries/Bento4CDll.dll
Normal file
BIN
binaries/Bento4CDll.dll
Normal file
Binary file not shown.
BIN
binaries/aria2c_nf.exe
Normal file
BIN
binaries/aria2c_nf.exe
Normal file
Binary file not shown.
BIN
binaries/avcodec-58.dll
Normal file
BIN
binaries/avcodec-58.dll
Normal file
Binary file not shown.
BIN
binaries/avcodec.lib
Normal file
BIN
binaries/avcodec.lib
Normal file
Binary file not shown.
BIN
binaries/avconv.exe
Normal file
BIN
binaries/avconv.exe
Normal file
Binary file not shown.
BIN
binaries/avdevice-57.dll
Normal file
BIN
binaries/avdevice-57.dll
Normal file
Binary file not shown.
BIN
binaries/avdevice.lib
Normal file
BIN
binaries/avdevice.lib
Normal file
Binary file not shown.
BIN
binaries/avfilter-7.dll
Normal file
BIN
binaries/avfilter-7.dll
Normal file
Binary file not shown.
BIN
binaries/avfilter.lib
Normal file
BIN
binaries/avfilter.lib
Normal file
Binary file not shown.
BIN
binaries/avformat-58.dll
Normal file
BIN
binaries/avformat-58.dll
Normal file
Binary file not shown.
BIN
binaries/avformat.lib
Normal file
BIN
binaries/avformat.lib
Normal file
Binary file not shown.
BIN
binaries/avplay.exe
Normal file
BIN
binaries/avplay.exe
Normal file
Binary file not shown.
BIN
binaries/avprobe.exe
Normal file
BIN
binaries/avprobe.exe
Normal file
Binary file not shown.
BIN
binaries/avresample-4.dll
Normal file
BIN
binaries/avresample-4.dll
Normal file
Binary file not shown.
BIN
binaries/avresample.lib
Normal file
BIN
binaries/avresample.lib
Normal file
Binary file not shown.
BIN
binaries/avutil-56.dll
Normal file
BIN
binaries/avutil-56.dll
Normal file
Binary file not shown.
BIN
binaries/avutil.lib
Normal file
BIN
binaries/avutil.lib
Normal file
Binary file not shown.
BIN
binaries/ffmpeg.exe
Normal file
BIN
binaries/ffmpeg.exe
Normal file
Binary file not shown.
BIN
binaries/ffplay.exe
Normal file
BIN
binaries/ffplay.exe
Normal file
Binary file not shown.
BIN
binaries/ffprobe.exe
Normal file
BIN
binaries/ffprobe.exe
Normal file
Binary file not shown.
BIN
binaries/libbento4.dll
Normal file
BIN
binaries/libbento4.dll
Normal file
Binary file not shown.
BIN
binaries/libexpat-1.dll
Normal file
BIN
binaries/libexpat-1.dll
Normal file
Binary file not shown.
BIN
binaries/libfdk-aac-0.dll
Normal file
BIN
binaries/libfdk-aac-0.dll
Normal file
Binary file not shown.
BIN
binaries/libgmp-10.dll
Normal file
BIN
binaries/libgmp-10.dll
Normal file
Binary file not shown.
BIN
binaries/libgmpxx-4.dll
Normal file
BIN
binaries/libgmpxx-4.dll
Normal file
Binary file not shown.
BIN
binaries/libjpeg-62.dll
Normal file
BIN
binaries/libjpeg-62.dll
Normal file
Binary file not shown.
BIN
binaries/libmp3lame-0.dll
Normal file
BIN
binaries/libmp3lame-0.dll
Normal file
Binary file not shown.
BIN
binaries/libogg-0.dll
Normal file
BIN
binaries/libogg-0.dll
Normal file
Binary file not shown.
BIN
binaries/libopencore-amrnb-0.dll
Normal file
BIN
binaries/libopencore-amrnb-0.dll
Normal file
Binary file not shown.
BIN
binaries/libopencore-amrwb-0.dll
Normal file
BIN
binaries/libopencore-amrwb-0.dll
Normal file
Binary file not shown.
BIN
binaries/libopus-0.dll
Normal file
BIN
binaries/libopus-0.dll
Normal file
Binary file not shown.
BIN
binaries/libpng16-16.dll
Normal file
BIN
binaries/libpng16-16.dll
Normal file
Binary file not shown.
BIN
binaries/libturbojpeg-0.dll
Normal file
BIN
binaries/libturbojpeg-0.dll
Normal file
Binary file not shown.
BIN
binaries/libvo-aacenc-0.dll
Normal file
BIN
binaries/libvo-aacenc-0.dll
Normal file
Binary file not shown.
BIN
binaries/libvo-amrwbenc-0.dll
Normal file
BIN
binaries/libvo-amrwbenc-0.dll
Normal file
Binary file not shown.
BIN
binaries/libvorbis-0.dll
Normal file
BIN
binaries/libvorbis-0.dll
Normal file
Binary file not shown.
BIN
binaries/libvorbisenc-2.dll
Normal file
BIN
binaries/libvorbisenc-2.dll
Normal file
Binary file not shown.
BIN
binaries/libvorbisfile-3.dll
Normal file
BIN
binaries/libvorbisfile-3.dll
Normal file
Binary file not shown.
BIN
binaries/libwebp-4.dll
Normal file
BIN
binaries/libwebp-4.dll
Normal file
Binary file not shown.
BIN
binaries/libwebpdecoder-0.dll
Normal file
BIN
binaries/libwebpdecoder-0.dll
Normal file
Binary file not shown.
BIN
binaries/libwebpdemux-0.dll
Normal file
BIN
binaries/libwebpdemux-0.dll
Normal file
Binary file not shown.
BIN
binaries/libwebpmux-0.dll
Normal file
BIN
binaries/libwebpmux-0.dll
Normal file
Binary file not shown.
BIN
binaries/libx264-142.dll
Normal file
BIN
binaries/libx264-142.dll
Normal file
Binary file not shown.
BIN
binaries/mkvmerge.exe
Normal file
BIN
binaries/mkvmerge.exe
Normal file
Binary file not shown.
BIN
binaries/mkvmerge1.exe
Normal file
BIN
binaries/mkvmerge1.exe
Normal file
Binary file not shown.
BIN
binaries/mkvmerge2.exe
Normal file
BIN
binaries/mkvmerge2.exe
Normal file
Binary file not shown.
BIN
binaries/mp4decrypt.exe
Normal file
BIN
binaries/mp4decrypt.exe
Normal file
Binary file not shown.
BIN
binaries/mp4decrypt1.exe
Normal file
BIN
binaries/mp4decrypt1.exe
Normal file
Binary file not shown.
BIN
binaries/mp4dump.exe
Normal file
BIN
binaries/mp4dump.exe
Normal file
Binary file not shown.
BIN
binaries/phantomjs.exe
Normal file
BIN
binaries/phantomjs.exe
Normal file
Binary file not shown.
BIN
binaries/swscale-5.dll
Normal file
BIN
binaries/swscale-5.dll
Normal file
Binary file not shown.
BIN
binaries/swscale.lib
Normal file
BIN
binaries/swscale.lib
Normal file
Binary file not shown.
3
binaries/versions
Normal file
3
binaries/versions
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
mp4dump = 1.5.0.614
|
||||||
|
phantomjs = 2.1.1
|
||||||
|
mkvmerge = 11.0.0-64
|
||||||
1
binaries/video
Normal file
1
binaries/video
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
generic 20170809T051653-05-1463071
|
||||||
BIN
binaries/widevinecdm.dll
Normal file
BIN
binaries/widevinecdm.dll
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter.rar
Normal file
BIN
binaries/wvDecrypter.rar
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/challenge.bin
Normal file
BIN
binaries/wvDecrypter/challenge.bin
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/libcurl.dll
Normal file
BIN
binaries/wvDecrypter/libcurl.dll
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/libeay32.dll
Normal file
BIN
binaries/wvDecrypter/libeay32.dll
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/openssl.exe
Normal file
BIN
binaries/wvDecrypter/openssl.exe
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/python36.dll
Normal file
BIN
binaries/wvDecrypter/python36.dll
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/ssleay32.dll
Normal file
BIN
binaries/wvDecrypter/ssleay32.dll
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/widevinecdm.dll
Normal file
BIN
binaries/wvDecrypter/widevinecdm.dll
Normal file
Binary file not shown.
BIN
binaries/wvDecrypter/wvDecrypter.exe
Normal file
BIN
binaries/wvDecrypter/wvDecrypter.exe
Normal file
Binary file not shown.
BIN
binaries/wvdecrypt.exe
Normal file
BIN
binaries/wvdecrypt.exe
Normal file
Binary file not shown.
BIN
binaries/youtube-dl
Normal file
BIN
binaries/youtube-dl
Normal file
Binary file not shown.
BIN
binaries/youtube-dl.exe
Normal file
BIN
binaries/youtube-dl.exe
Normal file
Binary file not shown.
BIN
binaries/zlib1.dll
Normal file
BIN
binaries/zlib1.dll
Normal file
Binary file not shown.
15
cookies.txt
Normal file
15
cookies.txt
Normal file
|
|
@ -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
Normal file
1
cookies/msl.json
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"encryption_key": "oPpCxzLmhnoq2j6yxDmDug==", "sign_key": "NhnmNhfx3W9+yJwoBR/O6AQSUVUOk/eAlB4pWs2CIq4=", "tokens": {"mastertoken": {"tokendata": "eyJzZXNzaW9uZGF0YSI6IkJRQ0FBQUVCRUpVcFNhU0NmRTRqUXFEYWxYYVpvMytCNEtFcCtjdXJwazlHYzh6NHIyRW1FYnVYVGY0T1RMVGlMQnlvQlZZTDJydjc1MW15bWxNQmI4U1dnbkpuaUZmK2MySjJMYjRQZEtGRUN5TEF6eitHb2lRa1pGOU1JazJRWXpKZG5HdjdxQ252dVA5UkJpUHo5VFFzaDllY2Fqa1IxWFViTTBGQ0tDdGVLNk0xMFlpWEY3MGVZZm1MQk5teW5MK2RYQm1VOWpEMDBPM1BJNitFSlFXa3FFT3ZwVXVYVUMxbHRzSDdOVFNkWExrTXhiUXFjUFB4MXYvL1VMT3dYUVMwaFBDL1lnR0Q2Sm1wQ2x3b0o2WXN1ejZqb1FMY0RwTnlDeVY1WU9GcUYwZkF6VlVFeWtZa3JDMFF1ZldEdlE3YmFtNTA4d1RqT0ZVMEc5TnpONTdGb3lTSUJWcm0rTUI2cTV4UmpmSWlGQUhDbVFRY1JGUnR4UEpoUU8vdk5ETGUwRFM2QmFJSEFRdkZ5VmpWSHZnMUc2SGUvZzVvSnZHRk5QbkYzL1d0VFI1SGQyVVB3N0pzYytuVFlaWGYrR0p6c3JQazU0bjVSVWdoZjRYZUhLeHhxK0pWUjJxRUt4bWc4UkVJWVVGQkpxQ0lxaGlJUTdONjlWdU8vZTVqTTh5VENic2NESFJic0dIeldla1N3cnQzR2gwR05TZXVwZU44SEkxb0hFS291U3l5cFZsV1hxTmJKVlpMYWFHdTY4cHp6amZzUXNUdVhMeWNwR1JTNGtWNytieDhrTG9wMncwdHhIdnhSQUd3K0RPU0xTVm5HcWdxSHQ0UlRjM1o4aHd6ZUZzdVFuYlRqSnJyN0kvUk1FRGhPTVBqK3NKSHl3PT0iLCJyZW5ld2Fsd2luZG93IjoxNjM3ODI5NTExLCJzZXJpYWxudW1iZXIiOjg4NjE3ODYxMDAwOTM2MDQsImV4cGlyYXRpb24iOjE2Mzg5NTI3MTEsInNlcXVlbmNlbnVtYmVyIjoyN30=", "signature": "AQEAgQABASBFZUtJcaaqs6+8UyjpafykZUeUYd6JEg3plZeCFlmZ+EwJ1ms="}}}
|
||||||
27
cookies/rsa.bin
Normal file
27
cookies/rsa.bin
Normal file
|
|
@ -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
Normal file
0
fonts/.gitignore
vendored
Normal file
BIN
fonts/OpenSans-Semibold.ttf
Normal file
BIN
fonts/OpenSans-Semibold.ttf
Normal file
Binary file not shown.
1
license.json
Normal file
1
license.json
Normal file
|
|
@ -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
Normal file
1
manifest.json
Normal file
File diff suppressed because one or more lines are too long
1
manifest_hpl.json
Normal file
1
manifest_hpl.json
Normal file
File diff suppressed because one or more lines are too long
1
manifest_sd.json
Normal file
1
manifest_sd.json
Normal file
File diff suppressed because one or more lines are too long
382
netflix.py
Normal file
382
netflix.py
Normal file
|
|
@ -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
Normal file
33
netflix.spec
Normal file
|
|
@ -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
Normal file
24
netflix_gui.py
Normal file
|
|
@ -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()
|
||||||
1
pax_global_header
Normal file
1
pax_global_header
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
52 comment=365978a0d3f430e2e24b025580c24cba75154132
|
||||||
BIN
pip.exe
Normal file
BIN
pip.exe
Normal file
Binary file not shown.
0
pywidevine/__init__.py
Normal file
0
pywidevine/__init__.py
Normal file
BIN
pywidevine/__pycache__/__init__.cpython-36.pyc
Normal file
BIN
pywidevine/__pycache__/__init__.cpython-36.pyc
Normal file
Binary file not shown.
BIN
pywidevine/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
pywidevine/__pycache__/__init__.cpython-37.pyc
Normal file
Binary file not shown.
BIN
pywidevine/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
pywidevine/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
0
pywidevine/cdm/__init__.py
Normal file
0
pywidevine/cdm/__init__.py
Normal file
BIN
pywidevine/cdm/__pycache__/__init__.cpython-36.pyc
Normal file
BIN
pywidevine/cdm/__pycache__/__init__.cpython-36.pyc
Normal file
Binary file not shown.
BIN
pywidevine/cdm/__pycache__/__init__.cpython-37.pyc
Normal file
BIN
pywidevine/cdm/__pycache__/__init__.cpython-37.pyc
Normal file
Binary file not shown.
BIN
pywidevine/cdm/__pycache__/__init__.cpython-38.pyc
Normal file
BIN
pywidevine/cdm/__pycache__/__init__.cpython-38.pyc
Normal file
Binary file not shown.
BIN
pywidevine/cdm/__pycache__/__init__.cpython-39.pyc
Normal file
BIN
pywidevine/cdm/__pycache__/__init__.cpython-39.pyc
Normal file
Binary file not shown.
BIN
pywidevine/cdm/__pycache__/cdm.cpython-36.pyc
Normal file
BIN
pywidevine/cdm/__pycache__/cdm.cpython-36.pyc
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue