import xml.dom.minidom import urllib, urllib2, re, os, sys, nt import cachedhttp import xbmc, xbmcgui from string import split, replace, find from ConfigParser import ConfigParser, SafeConfigParser from StringIO import StringIO import ftplib try: Emulating = xbmcgui.Emulating except: Emulating = False ACTION_PREVIOUS_MENU = 10 Title = "NZBsRus.com" """ To Do: (Items with a * are only thoughts atm ;-) - Correct All Names - Add Site Login Error Msg - Add FTP On/Off Checkbox - Add Keep Local NZB's Checkbox - Add Delete Cache Button - Add Delete Settings.ini Button - Find/Fix Starting Load Error - Document Script / Credits - * Load Music While Browsing - * SMB Support - * Catagory Icons """ # leave these just in case global httpFetcher global curPage global cat curPage = 0 cat = 38 # NZBsRus.com Login Information NZB_User = "" NZB_Pass = "" Login = "\"Log in!\"" # FTP Server Login Information FTP_YN = "" FTP_Host = '' FTP_Port = "" FTP_User = "" FTP_Pass = "" FTP_Path = "" """ The Website's main browsing url. In most cases this link should end with page= """ nzbURL = "http://www.nzbsrus.com/browse.php?cat=" """ Set your scripts root directory, and other required variables, below: """ # If you are running this script on your Xbox, use: NZB_Path = sys.path[0]+'\\' #Downloads = sys.path[0]+'\\' + "Downloads\\" # If you are Emulating this script on your PC, Use: # Root = "/Images" # Downloads = "/Downloads" """ Pre-define your global Variables """ global NZB_ID global NZB_Title global NZB_Size global NZB_Added NZB_ID = [] NZB_Title = [] NZB_Size = [] NZB_Added = [] button_normal="button-nofocus.png" button_hl="button-focus.png" lcf="iconlist-nofocus.png" lcnf="iconlist-focus.png" fc = "0xFFFFFFFF" cat_tiles = {} cat_id = {} cat_tiles['Consoles'] = ['Xbox','Xbox 360','PlayStation 2','PlayStation 3','Psp','Misc Console'] cat_id['Consoles'] = [38,11,37,12,10,46] cat_tiles['Movies'] = ['DVDR','VCD/SVCD','XViD','HDTV'] cat_id['Movies'] = [22,47,40,7] cat_tiles['TV'] = ['DVDR','VCD/SVCD','XViD'] cat_id['TV'] = [8,9,43] cat_tiles['Music'] = ['Albums','Singles','Videos'] cat_id['Music'] = [5,41,6] cat_tiles['PC'] = ['Apps - 0-Day','Apps - ISO','Apps - Other','Games - PC','Games - DOX'] cat_id['PC'] = [1,23,33,35,3] cat_tiles['Other'] = ['Macintosh','Handhelds','Emulators'] cat_id['Other'] = [48,21,2] cat_tiles['Misc'] = ['Books','Anime','Miscellaneous'] cat_id['Misc'] = [50,32,45] cat_tiles['Settings'] = ['Default','FTP','SMB','Misc'] cat_id['Settings'] = ['','','',''] def SetupButtons(self,x,y,w,h,a="Vert",f="button-focus.png",nf="button-nofocus.png",gap=0,txtOffSet=0,font='font13'): self.numbut = 0 self.butx = x self.buty = y self.butwidth = w self.butheight = h self.butalign = a self.butfocus_img = f self.butnofocus_img = nf self.gap = gap self.txtOffSet = txtOffSet self.font=font def AddButton(self,text): if self.butalign == "Hori": c = xbmcgui.ControlButton(self.butx + (self.numbut * self.butwidth + self.gap * self.numbut),self.buty,self.butwidth,self.butheight,text,self.butfocus_img,self.butnofocus_img,textColor=fc) self.addControl(c) elif self.butalign == "Vert": c = xbmcgui.ControlButton(self.butx ,self.buty + (self.numbut * self.butheight + self.gap* self.numbut) ,self.butwidth,self.butheight,text,self.butfocus_img,self.butnofocus_img,textColor=fc) self.addControl(c) self.numbut += 1 return c class Settings_Main(xbmcgui.Window): def __init__(self): if Emulating: xbmcgui.Window.__init__(self) """ Define your sript's Window size here: """ self.scaleX = ( float(self.getWidth()) / float(720) ) self.scaleY = ( float(self.getHeight()) / float(576) ) """ Add your GUI images to your script here: """ self.addControl(xbmcgui.ControlImage(0,0,720,480,"Background.png")) """ Create your Menu buttons here: """ SetupButtons(self, int(50 * self.scaleX),int(120 * self.scaleY), int(150 * self.scaleX), int(33 * self.scaleY), "Vert", button_hl,button_normal, 2,37) self.Defaultbtn = AddButton(self,'Default') self.FTPbtn = AddButton(self,'FTP') self.SMBbtn = AddButton(self,'SMB') self.Miscbtn = AddButton(self,'Misc.') """ Create a Status Label for use in your script: """ self.lblStatus = xbmcgui.ControlFadeLabel(int(215 * self.scaleX),int(128 * self.scaleY), int(500 * self.scaleX), int(90 * self.scaleY), "font12", "0xFFFFFFFF") self.addControl(self.lblStatus) """ Add your GUI items """ """ Setup your GUI Navigation """ self.Defaultbtn.controlUp(self.Miscbtn) self.Defaultbtn.controlDown(self.FTPbtn) self.FTPbtn.controlUp(self.Defaultbtn) self.FTPbtn.controlDown(self.SMBbtn) self.SMBbtn.controlUp(self.FTPbtn) self.SMBbtn.controlDown(self.Miscbtn) self.Miscbtn.controlUp(self.SMBbtn) self.Miscbtn.controlDown(self.Defaultbtn) self.setFocus(self.Defaultbtn) """ The below section is where you define your GUI items' Actions when executed """ def onAction(self, action): if action == ACTION_PREVIOUS_MENU: self.close() def onControl(self, control): global curPage global cater if control == self.Defaultbtn: cater = "Default" unps = Settings_Default() unps .doModal() del unps if control == self.FTPbtn: cater = "FTP" unps = Settings_FTP() unps .doModal() del unps if control == self.SMBbtn: cater = "SMB" unps = Settings_Default() unps .doModal() del unps if control == self.Miscbtn: cater = "Misc" unps = Settings_Default() unps .doModal() del unps class Settings_Default(xbmcgui.WindowDialog): def __init__(self): if Emulating: xbmcgui.WindowDialog.__init__(self) sw = int(self.getWidth()) sh = int(self.getHeight()) posleft_bg = (sw /2 - 512 / 2) + 60 posttop = (sh /2 - 300 / 2) + 25 self.addControl(xbmcgui.ControlLabel(posleft_bg + 55 , posttop + 15 + 10, 400, 30, 'NZBsRus.com - Login Settings', "special13")) self.addControl(xbmcgui.ControlLabel(posleft_bg + 55 , posttop + 50 + 10, 400, 30, 'Enter Username & Password', "font12")) self.nzbUserlbl = xbmcgui.ControlLabel(posleft_bg + 170 , posttop + 93 + 10, 400, 30, NZB_User) self.nzbPasslbl = xbmcgui.ControlLabel(posleft_bg + 170 , posttop + 128 + 10, 400, 30, NZB_Pass) self.nzbUserbtn = xbmcgui.ControlButton(posleft_bg + 55 , posttop + 90 + 10, 100, 30, "Username: ") self.nzbPassbtn = xbmcgui.ControlButton(posleft_bg + 55 , posttop + 125 + 10, 100, 30, "Password: ") self.nzbSavebtn= xbmcgui.ControlButton(sw/2 - 50 / 2 , posttop + 190, 60, 30, "Save") #Add controls self.addControl(self.nzbPasslbl) self.addControl(self.nzbUserlbl) self.addControl(self.nzbUserbtn) self.addControl(self.nzbPassbtn) self.addControl(self.nzbSavebtn) #Setting Navigation up :P self.nzbUserbtn.controlDown(self.nzbPassbtn) self.nzbPassbtn.controlDown(self.nzbSavebtn) self.nzbSavebtn.controlDown(self.nzbUserbtn) self.nzbUserbtn.controlUp(self.nzbSavebtn) self.nzbPassbtn.controlUp(self.nzbUserbtn) self.nzbSavebtn.controlUp(self.nzbPassbtn) self.setFocus(self.nzbUserbtn) def onAction(self, action): if action == ACTION_PREVIOUS_MENU: self.close() def onControl(self, control): global NZB_User, NZB_Pass if control == self.nzbSavebtn: self.nzbSaveInfo() if control == self.nzbUserbtn: temp = self.unikeyboard(NZB_User) if temp != "": NZB_User = temp self.nzbUserlbl.setLabel(NZB_User) else: dialog = xbmcgui.Dialog().ok(Title,"Username was not changed, you left it blank") if control == self.nzbPassbtn: temp = self.unikeyboard(NZB_Pass) if temp != "": NZB_Pass = temp self.nzbPasslbl.setLabel(NZB_Pass) else: dialog = xbmcgui.Dialog().ok(Title,"Password was not changed, you left it blank") def nzbSaveInfo(self): global FTP_YN, FTP_Host, FTP_Port, FTP_User, FTP_Pass, FTP_Path Brk = os.linesep curfile=file(sys.path[0]+'\\' + "Cache\\Settings.ini",'wb') curfile.write("[NZB]" + Brk + "Username=" + NZB_User + Brk + "Password=" + NZB_Pass) curfile.close() curfile=file(sys.path[0]+'\\' + "Cache\\Settings.ini",'ab') curfile.write(Brk + "[FTP]" + Brk + "Active=" + FTP_YN + Brk + "Host=" + FTP_Host + Brk + "Port=" + FTP_Port + Brk + "Username=" + FTP_User + Brk + "Password=" + FTP_Pass + Brk + "Path=" + FTP_Path) curfile.close() dialog = xbmcgui.Dialog().ok(Title,"Settings Saved") self.close() def unikeyboard(self, default): keyboard = xbmc.Keyboard(default) keyboard.doModal() if (keyboard.isConfirmed()): return keyboard.getText() else: return default class Settings_FTP(xbmcgui.WindowDialog): """ Set your Username and Passowrd here """ def __init__(self): if Emulating: xbmcgui.WindowDialog.__init__(self) sw = int(self.getWidth()) sh = int(self.getHeight()) posleft_bg = (sw /2 - 512 / 2) + 60 posttop = (sh /2 - 300 / 2) + 25 self.addControl(xbmcgui.ControlLabel(posleft_bg + 55 , posttop + 15 + 10, 400, 30, 'NZBsRus.com - Login Settings', "special13")) self.addControl(xbmcgui.ControlLabel(posleft_bg + 55 , posttop + 50 + 10, 400, 30, 'Enter Username & Password', "font12")) self.FTPHostlbl = xbmcgui.ControlLabel(posleft_bg + 170 , posttop + 93 + 10, 400, 30, FTP_Host) self.FTPPortlbl = xbmcgui.ControlLabel(posleft_bg + 170 , posttop + 128 + 10, 400, 30, FTP_Port) self.FTPUserlbl = xbmcgui.ControlLabel(posleft_bg + 170 , posttop + 163 + 10, 400, 30, FTP_User) self.FTPPasslbl = xbmcgui.ControlLabel(posleft_bg + 170 , posttop + 198 + 10, 400, 30, FTP_Pass) self.FTPPathlbl = xbmcgui.ControlLabel(posleft_bg + 170 , posttop + 233 + 10, 400, 30, FTP_Path) self.FTPHostbtn = xbmcgui.ControlButton(posleft_bg + 55 , posttop + 90 + 10, 100, 30, "Host: ") self.FTPPortbtn = xbmcgui.ControlButton(posleft_bg + 55 , posttop + 125 + 10, 100, 30, "Port: ") self.FTPUserbtn = xbmcgui.ControlButton(posleft_bg + 55 , posttop + 160 + 10, 100, 30, "Username: ") self.FTPPassbtn = xbmcgui.ControlButton(posleft_bg + 55 , posttop + 195 + 10, 100, 30, "Password: ") self.FTPPathbtn = xbmcgui.ControlButton(posleft_bg + 55 , posttop + 230 + 10, 100, 30, "Path: ") self.FTPSavebtn= xbmcgui.ControlButton(sw/2 - 50 / 2 , posttop + 190, 60, 30, "Save") self.FTPYNChk = xbmcgui.ControlCheckMark(155, 155, 200, 20,"TestCheckmark") #Add controls self.addControl(self.FTPYNChk) self.addControl(self.FTPHostlbl) self.addControl(self.FTPPortlbl) self.addControl(self.FTPUserlbl) self.addControl(self.FTPPasslbl) self.addControl(self.FTPPathlbl) self.addControl(self.FTPHostbtn) self.addControl(self.FTPPortbtn) self.addControl(self.FTPUserbtn) self.addControl(self.FTPPassbtn) self.addControl(self.FTPPathbtn) self.addControl(self.FTPSavebtn) #Setting Navigation up :P self.FTPYNChk.controlDown(self.FTPHostbtn) self.FTPHostbtn.controlDown(self.FTPPortbtn) self.FTPPortbtn.controlDown(self.FTPUserbtn) self.FTPUserbtn.controlDown(self.FTPPassbtn) self.FTPPassbtn.controlDown(self.FTPPathbtn) self.FTPPathbtn.controlDown(self.FTPSavebtn) self.FTPSavebtn.controlDown(self.FTPYNChk) self.FTPYNChk.controlUp(self.FTPSavebtn) self.FTPHostbtn.controlUp(self.FTPYNChk) self.FTPPortbtn.controlUp(self.FTPHostbtn) self.FTPUserbtn.controlUp(self.FTPPortbtn) self.FTPPassbtn.controlUp(self.FTPUserbtn) self.FTPPathbtn.controlUp(self.FTPPassbtn) self.FTPSavebtn.controlUp(self.FTPPathbtn) self.setFocus(self.FTPHostbtn) global FTP_YN if FTP_YN == "Yes": self.FTPYNChk.setSelected(1) def onAction(self, action): if action == ACTION_PREVIOUS_MENU: self.close() def onControl(self, control): global NZB_User, NZB_Pass global FTP_YN, FTP_Host, FTP_Port, FTP_User, FTP_Pass, FTP_Path if self.FTPYNChk.getSelected() == 1: FTP_YN = "Yes" elif self.FTPYNChk.getSelected() == 0: FTP_YN = "No" if control == self.FTPSavebtn: self.FTPSaveInfo() if control == self.FTPHostbtn: temp = self.unikeyboard(FTP_Host) if temp != "": FTP_Host = temp self.FTPHostlbl.setLabel(FTP_Host) else: dialog = xbmcgui.Dialog().ok(Title,"Host IP Address was not changed, you left it blank") if control == self.FTPPortbtn: temp = self.unikeyboard(FTP_Port) if temp != "": FTP_Port = temp self.FTPPortlbl.setLabel(FTP_Port) else: dialog = xbmcgui.Dialog().ok(Title,"Host Port was not changed, you left it blank") if control == self.FTPUserbtn: temp = self.unikeyboard(FTP_User) if temp != "": FTP_User = temp self.FTPUserlbl.setLabel(FTP_User) else: dialog = xbmcgui.Dialog().ok(Title,"Username was not changed, you left it blank") if control == self.FTPPassbtn: temp = self.unikeyboard(FTP_Pass) if temp != "": FTP_Pass = temp self.FTPPasslbl.setLabel(FTP_Pass) else: dialog = xbmcgui.Dialog().ok(Title,"Password was not changed, you left it blank") if control == self.FTPPathbtn: temp = self.unikeyboard(FTP_Path) if temp != "": FTP_Path = temp self.FTPPathlbl.setLabel(FTP_Path) else: dialog = xbmcgui.Dialog().ok(Title,"Remote Path was left blank") def FTPSaveInfo(self): global FTP_YN, NZB_User, NZB_Pass Brk = os.linesep curfile=file(sys.path[0]+'\\' + "Cache\\Settings.ini",'wb') curfile.write("[NZB]" + Brk + "Username=" + NZB_User + Brk + "Password=" + NZB_Pass) curfile.close() curfile=file(sys.path[0]+'\\' + "Cache\\Settings.ini",'ab') curfile.write(Brk + "[FTP]" + Brk + "Active=" + FTP_YN + Brk + "Host=" + FTP_Host + Brk + "Port=" + FTP_Port + Brk + "Username=" + FTP_User + Brk + "Password=" + FTP_Pass + Brk + "Path=" + FTP_Path) curfile.close() dialog = xbmcgui.Dialog().ok(Title,"FTP Settings Saved") self.close() def unikeyboard(self, default): # Open the Virutal Keyboard. keyboard = xbmc.Keyboard(default) keyboard.doModal() if (keyboard.isConfirmed()): return keyboard.getText() else: return default class NZB_Sub(xbmcgui.Window): def __init__(self): if Emulating: xbmcgui.Window.__init__(self) #cater = "console" """ Define your sript's Window size here: """ self.scaleX = ( float(self.getWidth()) / float(720) ) self.scaleY = ( float(self.getHeight()) / float(576) ) """ Add your GUI images to your script here: """ self.addControl(xbmcgui.ControlImage(0,0,720,480,"Background.png")) """ Create your "Page Toggle" buttons here: """ self.refreshbtn = xbmcgui.ControlButton(int(580 * self.scaleX),int(20 * self.scaleY), int(100 * self.scaleX), int(40 * self.scaleY), "Refresh") self.ffbtn = xbmcgui.ControlButton(int(580 * self.scaleX),int(62 * self.scaleY), int(100 * self.scaleX), int(40 * self.scaleY), "Next Page") self.rewbtn = xbmcgui.ControlButton(int(580 * self.scaleX),int(104 * self.scaleY), int(100 * self.scaleX), int(40 * self.scaleY), "Prev Page") self.nzbList = xbmcgui.ControlList(int(210 * self.scaleX),int(160 * self.scaleY), int(350 * self.scaleX), int(355 * self.scaleY),itemTextXOffset=-5) self.sizeBox = xbmcgui.ControlLabel(int(580 * self.scaleX),int(160 * self.scaleY), int(120 * self.scaleX), int(40 * self.scaleY),"", "font14") self.addedBox = xbmcgui.ControlLabel(int(580 * self.scaleX),int(200 * self.scaleY), int(120 * self.scaleX), int(40 * self.scaleY),"", "font14") """ Create your Menu buttons here: """ SetupButtons(self, int(50 * self.scaleX),int(120 * self.scaleY), int(150 * self.scaleX), int(33 * self.scaleY), "Vert", button_hl,button_normal, 2,37) self.subcat = cat_tiles[cater] self.subcatid = cat_id[cater] self.btns = [] for x in range(0,len(self.subcat)): self.btns.append (AddButton(self,self.subcat[x])) self.btns[x].controlRight(self.nzbList) if x == 0: pass elif x == len(self.subcat): pass else: self.btns[x].controlUp(self.btns[x-1]) self.btns[x-1].controlDown(self.btns[x]) """ Create a Status Label for use in your script: """ self.lblStatus = xbmcgui.ControlFadeLabel(int(215 * self.scaleX),int(128 * self.scaleY), int(500 * self.scaleX), int(90 * self.scaleY), "font12", "0xFFFFFFFF") self.addControl(self.lblStatus) self.lblStatus.addLabel("NZBsRus.com - Page " + str(curPage)) """ Add your GUI items """ self.addControl(self.sizeBox) self.addControl(self.addedBox) self.addControl(self.nzbList) self.addControl(self.refreshbtn) self.addControl(self.ffbtn) self.addControl(self.rewbtn) """ Setup your GUI other Navigation """ self.setFocus(self.btns[0]) self.nzbList.controlLeft(self.btns[0]) self.nzbList.controlRight(self.refreshbtn) self.refreshbtn.controlDown(self.ffbtn) self.refreshbtn.controlRight(self.nzbList) self.refreshbtn.controlUp(self.rewbtn) self.ffbtn.controlDown(self.rewbtn) self.ffbtn.controlRight(self.nzbList) self.ffbtn.controlUp(self.refreshbtn) self.rewbtn.controlRight(self.nzbList) self.rewbtn.controlDown(self.refreshbtn) self.rewbtn.controlUp(self.ffbtn) """ The below section is where you define your GUI items' Actions when executed """ def onAction(self, action): global curPage, cat if action == ACTION_PREVIOUS_MENU: self.close() if action == 3 or action == 4: if self.getFocus() == self.nzbList: self.sizeBox.setLabel(NZB_Size[self.nzbList.getSelectedPosition()]) self.addedBox.setLabel(NZB_Added[self.nzbList.getSelectedPosition()]) # if action == 117: # curPage = int(curPage) - 1 # self.getnzbList(cat) # if action == 0: # curPage = int(curPage) + 1 # self.getnzbList(cat) def onControl(self, control): global curPage, cat global NZB_User, NZB_Pass global FTP_YN, FTP_Host, FTP_Port, FTP_User, FTP_Pass, FTP_Path for x in range(0,len(self.btns)): if self.btns[x] == control: cat = str(self.subcatid[x]) self.getnzbList(cat) if control == self.refreshbtn: curPage = 0 self.getnzbList(cat) if control == self.ffbtn: curPage = int(curPage) + 1 self.getnzbList(cat) if control == self.rewbtn: curPage = int(curPage) - 1 self.getnzbList(cat) if control == self.nzbList: CurrentNZBItem = self.nzbList.getSelectedPosition() httpFetcher=cachedhttp.CachedHTTPWithProgress() txdata = urllib.urlencode({"submit":Login, "username":NZB_User, "password":NZB_Pass}) html = httpFetcher.urlopen('http://www.nzbsrus.com/takelogin.php',txdata) httpFetcher.urlretrieve("http://www.nzbsrus.com/download.php/" + str(NZB_ID[CurrentNZBItem]) + "/" + str(NZB_ID[CurrentNZBItem]) + ".nzb",None,sys.path[0]+'\\Downloads\\' + str(NZB_Title[CurrentNZBItem])[0:37],"nzb") httpFetcher.saveCookies() del httpFetcher curfile = SafeConfigParser() curfile.read(NZB_Path + 'Cache\\Settings.ini') if curfile.has_section('FTP') == True: FTP_YN = str(curfile.get('FTP', 'Active')) if FTP_YN == "Yes": print "FTP Is Enabled" try: ftp = ftplib.FTP() ftp.connect(FTP_Host,FTP_Port) ftp.login(FTP_User, FTP_Pass) ftp.storbinary("STOR " + FTP_Path + str(NZB_Title[CurrentNZBItem])[0:37] + ".nzb", open(sys.path[0]+'\\Downloads\\' + str(NZB_Title[CurrentNZBItem])[0:37] + ".nzb", "rb"), 1024) ftp.close() except ftplib.all_errors: dialog = xbmcgui.Dialog() dialog.ok("FTP Server Error", "Possible Causes:\n - FTP Server errors (Server is Off, Port Forwards, Accounts)\n - Script errors (improper login information was provided)") elif FTP_YN == "No": print "FTP Is Disabled" # self.nzbList.reset() # self.getnzbList(cat) def getnzbList(self,cat=""): """ This will create a Progress dialog when retrieving the list of files """ dialog = xbmcgui.Dialog() progress = xbmcgui.DialogProgress() progress.create("NZBsRus.com", "Downloading the NZB file list...") self.lblStatus.reset() self.lblStatus.addLabel("NZBsRus.com - Page " + str(curPage)) progress.update(10) try: nzb_Sock = urllib.urlopen(nzbURL + cat + "&page=" + str(curPage)) progress.update(30) nzb_HTML = nzb_Sock.read() progress.update(60) nzb_Sock.close() #