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 try: Emulating = xbmcgui.Emulating except: Emulating = False ACTION_PREVIOUS_MENU = 10 Title = "NZBsRus.com" # leave these just in case global httpFetcher global curPage global cat curPage = 0 cat = 38 # NZBsRus.com Login Information NZB_User = "" NZB_Pass = "" # FTP Server Login Information FTP_Host = "" FTP_Port = "" FTP_User = "" FTP_Pass = "" FTP_Path = "" Login = "\"Log in!\"" """ 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]+'\\' # Root = "Q:\\scripts\\NZBsRus\\Images\\" Downloads = "Q:\\scripts\\NZBsRus\\Downloads\\" #Root = "Q:\\scripts\\NZBsRus\\Images\\" #Downloads = "Q:\\scripts\\NZBsRus\\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['Misc'] = ['','','',''] 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")) # self.addControl(xbmcgui.ControlImage(0,0,247,70, sys.path[0]+'\\' + "Logo.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.Defaultbtn.controlLeft(self.nzbList) # self.Defaultbtn.controlRight(self.nzbList) self.FTPbtn.controlUp(self.Defaultbtn) self.FTPbtn.controlDown(self.SMBbtn) # self.FTPbtn.controlLeft(self.nzbList) # self.FTPbtn.controlRight(self.nzbList) self.SMBbtn.controlUp(self.FTPbtn) self.SMBbtn.controlDown(self.Miscbtn) # self.SMBbtn.controlLeft(self.nzbList) # self.SMBbtn.controlRight(self.nzbList) self.Miscbtn.controlUp(self.SMBbtn) self.Miscbtn.controlDown(self.Defaultbtn) # self.Miscbtn.controlLeft(self.nzbList) # self.Miscbtn.controlRight(self.nzbList) 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): """ Set your Username and Passowrd here """ def __init__(self): if Emulating: xbmcgui.WindowDialog.__init__(self) #try: self.addControl(xbmcgui.ControlImage(0,0,0,0, 'background.png')) 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(int(205 * self.scaleX),int(133 * self.scaleY), int(500 * self.scaleX), int(90 * self.scaleY), "NZBsRus.com - Login Settings" "font12", "0xFFFFFFFF") 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): if control == self.nzbSavebtn: self.nzbSaveInfo() if control == self.nzbUserbtn: global NZB_User 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: global NZB_Pass 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): Brk = os.linesep curfile=file(sys.path[0]+'\\' + "Cache\\Settings.ini",'wb') curfile.write("[NZB]" + Brk + "Username=" + NZB_User + Brk + "Password=str" + NZB_Pass) curfile.close() dialog = xbmcgui.Dialog().ok(Title,"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 Settings_FTP(xbmcgui.WindowDialog): """ Set your Username and Passowrd here """ def __init__(self): if Emulating: xbmcgui.WindowDialog.__init__(self) #try: self.addControl(xbmcgui.ControlImage(0,0,0,0, 'background.png')) 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(int(205 * self.scaleX),int(133 * self.scaleY), int(500 * self.scaleX), int(90 * self.scaleY), "NZBsRus.com - Login Settings" "font12", "0xFFFFFFFF") 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") #Add controls 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.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.FTPHostbtn) self.FTPHostbtn.controlUp(self.FTPSavebtn) 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) def onAction(self, action): if action == ACTION_PREVIOUS_MENU: self.close() def onControl(self, control): if control == self.FTPSavebtn: self.FTPSaveInfo() if control == self.FTPHostbtn: global FTP_Host 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: global FTP_Port 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: global FTP_User 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: global FTP_Pass 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: global FTP_Path 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): Brk = os.linesep curfile=file(sys.path[0]+'\\' + "Cache\\Settings.ini",'ab') curfile.write(Brk + "[FTP]" + 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): if action == ACTION_PREVIOUS_MENU: self.close() if action == 3 or action == 4 or action == 111 or action == 112: if self.getFocus() == self.nzbList: self.sizeBox.setLabel(NZB_Size[self.nzbList.getSelectedPosition()]) self.addedBox.setLabel(NZB_Added[self.nzbList.getSelectedPosition()]) def onControl(self, control): global curPage global cat 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() """ This section is will log you into your site with your provided credentials "Username" & "Password" are defind at the top of this script """ httpFetcher=cachedhttp.CachedHTTPWithProgress() """ Retrieves the selected file from the list. "str(NZB_ID[CurrentNZBItem])" will load the whole list in the middle of the URL and [CurrentNZBItem] tells the script to use only the ID from the currently selected file in the list """ httpFetcher.urlretrieve("http://www.nzbsrus.com/download.php/" + str(NZB_ID[CurrentNZBItem]) + "/" + str(NZB_ID[CurrentNZBItem]) + ".nzb",None,Downloads + str(NZB_ID[CurrentNZBItem])) httpFetcher.saveCookies() del httpFetcher """ This procedure will rename the recently downloaded file from a *.html to an *.nzb file """ print Downloads + str(NZB_ID[CurrentNZBItem]) + ".html" print Downloads + str(NZB_Title[CurrentNZBItem])[0:37] + ".nzb" nt.rename(Downloads + str(NZB_ID[CurrentNZBItem]) + ".html", Downloads + str(NZB_Title[CurrentNZBItem])[0:37] + ".nzb") # 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() #