{{eyecatch|Note: |You have to set an API key in your profile before autocreqing auto-creqing with avdumpAvdump GUI.}}
{{Avdump-gui}}
'''For Vista and Windows 7 permission issues on installation:'''
*Create a blank .bat file.
*Insert this text into it and modify it to your situation:<br> <tt>"C:\Windows\System32\msiExec.exe" -i "C:\Directory\Where\Located\avdump-gui.msi"</tt>
*Right click and run the .bat file as administrator.
==Changelog==
<pre>
v1v2.07 42 - 0608.0401.20082019 *available as auto update* avdump 0.34 * Avdump2 Build 7080 added fixed a bug with the bufferfield not allowing 16 buffer while that being the default made option o default when no profile exists
v1v2.06 41 - 1205.0201.20082019 *available as auto update* avdump 0.33 added* show error message about too long paths * fallback to cp437 in case shell encoding fails which i guess should work?
v1v2.05 40 - 1303.1101.20072019 *available as auto update* thx to rar for fixing dumping * Avdump2 Build 7070 added * show errors in filelist if we encounter one while processing a file instead of files with characters in non local codepageendless retrying
v1v2.04 33 - 1009.11.20072016 *available as auto update* fix for not being able to dump files with japanese characters in the filename* new icon avdump 0.32 added * progressbar and changes implementedstatus not updating
v1v2.03 32 - 1309.0511.20072016 *available as auto update* added the console again fix for log, export and done pathes with spaces added parents for the dialogs so they die with the program and can't stay open anymore option 9 added (experimental mp3 hashing for ostdb) v1.02 - 13.05.2007 added error and warning dialog boxes to prevent a couple problems added some exceptionhandling for a few fields v1.01 - 12.05.2007 killed a nasty bug with trailing \ in the scanpath v1.00 - 12.05.2007 Initial release</pre>* options not being stored on initial start
==Source== v2.31 - 09.11.2016 *available as auto update*This gui was coded purely in python using wxpython for the framework. * fixed drag and drop
<pre style="fontv2.30 -size: 60%;">03.11.2016 *available as auto update*import wx,os,subprocessw,sys * ported from python 2.7 to 3.4 * path/filename encoding woes fixed(?) * export option removed and made implicit to be always enabled
class mainFrame(wx v2.Frame): __simple = ['p','z','r','m','c','o','9'] __options = {'avdump':'avdump20 - 18.exe','user':'','pass':'','ext':'','misc':'','bsize':'2048:16','port':'','tout':'30','retries':'6','exp':'export08.txt','log':'log.txt','done':'done.txt'}2015 *available as auto update* * Avdump2 Build 6714 added __configfile='config.ini' * dependencies updated
def read_config(self,newconfig=''): '''read the config file and return the content''' if not os.path.exists(self.__configfile): for elem in self.__options: newconfig += ('%s=%s\n') %(elem,self v2.__options[elem]) file(self19 - 11.__configfile,"w")11.write(newconfig)2012 *available as msi installer & auto update* for line in file(self.__configfile,"r").readlines(): * Avdump2 Build 6525 added if * recompiled with updated dependencies which may or may not line.endswith('='): temp,val = line.rstrip('\n').split('=',1) else: val = '' for elem in self.__options: if temp == elem: self.__options[temp] = valfix some issues or cause new ones
def selectClick(self, event,path=''): if self.scantype.GetStringSelection() == 'Files': dialog = wx.FileDialog ( self, message = 'Pick a directory.', style= wx.FD_MULTIPLE) if dialog.ShowModal() == wx.ID_OK: temp = dialog.GetPaths() if len(temp)>1: for elem in temp: path += '"' + elem + '" ' else: path = '"' + temp[0] v2.rstrip("\\") + '"' else: dialog = wx17 - 21.DirDialog ( self, message = 'Pick a directory09.' )2011 *available as auto update* if dialog.ShowModal() == wx.ID_OK: path = '"' + dialog.GetPath().rstrip("\\") + '"' self.filepath.Clear() dialog.Destroy() self.filepath.write(path) self.__options['scanpath'] = path * filename encoding issue fixed
def startClick(self, event): self v2.read_config() self15 - 13.__options['param'] = '' if self09.filepath.GetValue() == '':2011 self.child.error('You have to select some files or folder to scan!') * Avdump2 Build 5028 added elif * text fix (selfOptionen instead of Options.__options['user'] == '' or self.__options['pass'] == ''watch out for da evil germanz ja): self.child.error("You didn't enter your username and/or password in * can now drop files into the options menu.") elif self.__options['avdump'] == '': self.child.error('You must specify the path table to avdump.exe!')process elif self.__options['avdump'] == 'avdump.exe': self.child.info('You should set the _absolute_ path to avdump.exe.\nOtherwise complications might arise.') else: if self.__options['misc'].lstrip * speed improvement when adding lots of files at once (',') really only noticeable > 0: for elem in self.__options['misc'].split(','500): if elem * potentially fixing some issue with the last filehash not being shown in ['retries','']: if elem in self.__simple: self.__options['param'] += ' -' + elem elif elem == 'tout': self.__options['param'] += ' -' + elem + ':' + self.__options[elem] + ':' + self.__options['retries'] else: self.__options['param'] += ' -' + elem + ':' + self.__options[elem] '''debug option to see what avdump actually get's fed''' #self.child.info(('%s%s -ac:%s:%s %s') %(self.__options['avdump'], self.__options['param'], self.__options['user'], self.__options['pass'], self.__options['scanpath'])) arg = (u'%s%s -ac:%s:%s %s') %(self.__options['avdump'], self.__options['param'], self.__options['user'], self.__options['pass'], self.__options['scanpath']) subprocessw.Popen(arg)the export box
class OptionsFrame(wx v2.Frame): __box = {'ext':False,'log':False,'exp':False,'port':False,'done':False,'bsize':False,'tout':False,'c':False,'m':False,'p':False,'r':False,'z':False,'o':True,'9':False} __options = {'avdump':'avdump13 - 06.exe','user':'','pass':'','ext':'','misc':'','bsize':'2048:16','port':'','tout':'30','retries':'6','exp':'export09.txt','log':'log.txt','done':'done.txt'}2011 * Avdump2 Build 4991 added __configfile='config.ini' * fixes to be compatible to the new Avdump2 CLI
def read_config(self): '''read the config file and return the content''' if not os.path.exists(self.__configfile): self.write_config() for line in file(self.__configfile,"r") v2.readlines(): if not line12 - 05.endswith('='): temp,val = line09.rstrip('\n').split('=',1)2011 *pulled* else: val = '' for elem in self.__options: if temp == elem: self.__options[temp] = val * Avdump2 Build 4964 added
def write_config v2.11 - 01.07.2011 * trying to scan files without having provided a username/password -> BOOM (self,newconfig=''trying to kill the subprocess without it running): for elem in self.__options: * removing already scanned files form the list and readding them will process them again even if "done" is set newconfig += ('%s=%s\n') %(elem,selffrom frontend at least.__options[elem]) file(selfavdump itself would ignore them.__configfile,this would leave a couple "wnew").write(newconfigentries in the list)
def set_misc v2.10 - 01.07.2011 * Avdump2 Build 4334 added * Autoupdater implemented * last scanned dir stored in config * window size stored in config (self,misc='unless it's maximized): for elem in self.__box: if self.__box[elem] is True: misc += elem + ',' * use stderr to catch errors instead of stdout self.__options['misc'] = misc * lots of rewriting
def get_checkboxes(self,misc): if misc is not None: misc = misc v2.02 - 09.rstrip(',')06.lstrip(',')2011 if misc.find(',') > 0: * Avdump2 Build 4320 added for elem * ditched subprocess module in misc.splitfavour of qprocess * peek into console output and notice the user when an error happened (','outdated version or wrong password/username): self.__box[elem] = True else: self.__box[misc] = True
def selectavdClick(self, event): dialog = wx v2.FileDialog ( self, message = 'Pick a directory00 - 03.') if dialog06.ShowModal() == wx.ID_OK:2011 self.filepath.Clear() * Avdump2 Build 4260 added self.filepath.write(dialog.GetPath().rstrip("\\")) * rewrote the whole lot and simplified it
def selectlogClick(self, event): dialog = wx v1.07 - 06.FileDialog ( self, message = 'Pick a directory04.')2008 if dialog.ShowModal() == wx * Avdump 0.ID_OK:34 added self.logpath.Clear() * fixed a bug with the bufferfield not allowing 16 buffer while that being the default self.logpath.write(dialog.GetPath().rstrip("\\")) * made option o default when no profile exists
def selectdoneClick(self, event): dialog = wx.FileDialog ( self, message = 'Pick a directory.') if dialog.ShowModal() == wx v1.ID_OK: self05 - 13.donepath11.Clear()2007 self.donepath.write(dialog.GetPath().rstrip("\\")) * thx to rar for fixing dumping of files with characters in non local codepage
def saveClick(self,event): self v1.04 - 10.update() if self11.__options['avdump'] == '':2007 self.error('You must specify the path * fix for not being able to avdump.exe!') elif self.__options['avdump'] == 'avdump.exe': self.info('You should set dump files with Japanese characters in the _absolute_ path to avdump.exe.\nOtherwise complications might arise.') else:filename self * Avdump 0.Show(False)32 added and changes implemented
def cancelClick(self,event): self v1.refresh() self03 - 13.Show(False) def onclose(self,event): self05.Show(False)2007 * added the console again def refresh(self): self.read_config() self.get_checkboxes(self.__options['misc']) self.filepath.Clear() self.filepath.write(self.__options['avdump'].rstrip('"').lstrip('"')) self.username.Clear() self.username.write(self.__options['user']) self.password.Clear() self.password.write(self.__options['pass']) self.extention.Clear() self.extention.write(self.__options['ext']) self.buffersize.Clear() self.buffersize.write(self.__options['bsize']) self.portnumber.Clear() self.portnumber.write(self.__options['port']) self.timeout.Clear() self.timeout.write(self.__options['tout']) self.retries.Clear() self.retries.write(self.__options['retries']) self.exppath.Clear() self.exppath.write(self.__options['exp'].rstrip('"').lstrip('"')) self.logpath.Clear() self.logpath.write(self.__options[' * fix for log'].rstrip('"').lstrip('"')) self.donepath.Clear() self.donepath.write(self.__options['done'].rstrip('"').lstrip('"')) self.ext.SetValue(self.__box['ext']) self.log.SetValue(self.__box['log']) self.exp.SetValue(self.__box['exp']) self.port.SetValue(self.__box['port']) self.done.SetValue(self.__box['done']) self.bsize.SetValue(self.__box['bsize']) self.tout.SetValue(self.__box['tout']) self.recursive.SetValue(self.__box['c']) self.monitor.SetValue(self.__box['m']) self.mp3.SetValue(self.__box['9']) self.pause.SetValue(self.__box['p']) self.random.SetValue(self.__box['r']) self.delete.SetValue(self.__box['z']) self.wait.SetValue(self.__box['o']) def update(self): self.__options['avdump'] = '"' + self.filepath.GetValue() + '"' self.__options['user'] = self.username.GetValue() self.__options['pass'] = self.password.GetValue() self.__options['ext'] = self.extention.GetValue() try: temp,temp2 = self.buffersize.GetValue().split(":") temp = int(temp) temp2 = int(temp2) '''make sure it's mod 8 export and at least 256kb'''done paths with spaces if temp < 256: temp = 256 if not temp % 8: temp = temp - (temp%8) '''make sure * added parents for the dialogues so they die with the buffernumber is between 1 program and 16''can't stay open any more if temp2 > 16 or temp2 <1: temp2 = 1 temp = ("%s:%s") %(temp, temp2) except: temp = "2048:16" self.__options['bsize'] = unicode(temp) try: int(self.portnumber.GetValue()) self.__options['port'] = self.portnumber.GetValue() except: self.__options['port'] = '' self.__options['tout'] = self.timeout.GetValue * option 9 added () temp = int(self.timeout.GetValue()) '''make sure it's at least 20''' try: if int(temp) < 20: temp = 20 except: temp = 30 self.__options['tout'] = unicode(temp) try: int(self.retries.GetValue()) self.__options['retries'] = self.retries.GetValue() except: self.__options['retries'] = 6 self.__options['exp'] = '"' + self.exppath.GetValue() + '"' self.__options['log'] = '"' + self.logpath.GetValue() + '"' self.__options['done'] = '"' + self.donepath.GetValue() + '"' self.__box['ext'] = self.ext.GetValue() self.__box['log'] = self.log.GetValue() self.__box['exp'] = self.exp.GetValue() self.__box['port'] = self.port.GetValue() self.__box['done'] = self.done.GetValue() self.__box['bsize'] = self.bsize.GetValue() self.__box['tout'] = self.tout.GetValue() self.__box['c'] = self.recursive.GetValue() self.__box['m'] = self.monitor.GetValue() self.__box['9'] = self.experimental mp3.GetValue(hashing for ostdb) self.__box['p'] = self.pause.GetValue() self v1.__box['r'] = self02 - 13.random05.GetValue()2007 self.__box['z'] = self.delete.GetValue() self.__box['o'] = self.wait.GetValue() self.set_misc() self.write_config() def * added error(self,text):and warning dialogue boxes to prevent a couple problems message = wx.MessageDialog(self,text,style=wx.ICON_ERROR | wx.OK) message.ShowModal() def info(self,text): message = wx.MessageDialog(self,text,style=wx.ICON_INFORMATION | wx.OK) message.ShowModal()class App(wx.App): def OnInit(self): frame = mainFrame(None, 'App') frame.Show(True) self.SetTopWindow(frame) return Trueif __name__ == '__main__': app = App(True) app.MainLoop()</pre>===wrapper module * added some exception handling for subprocess by rar===a few fields<pre style="font-size: 60%;">import subprocessfrom subprocess import call, PIPE, STDOUT, list2cmdline, mswindowsimport ctypesimport ctypes v1.wintypesCreateProcessW = ctypes01 - 12.windll05.kernel32.CreateProcessW2007CloseHandle = ctypes.windll.kernel32.CloseHandle__all__ = ["Popen", "PIPE", "STDOUT", "call"]class STARTUPINFOW(ctypes.Structure): _fields_ = (("cb", ctypes.wintypes.DWORD), # should init to 17 *4 maybe? ("lpReserved", ctypes.wintypes.LPWSTR), ("lpDesktop", ctypes.wintypes.LPWSTR), ("lpTitle", ctypes.wintypes.LPWSTR), ("dwX", ctypes.wintypes.DWORD), ("dwY", ctypes.wintypes.DWORD), ("dwXSize", ctypes.wintypes.DWORD), ("dwYSize", ctypes.wintypes.DWORD), ("dwXCountChars", ctypes.wintypes.DWORD), ("dwYCountChars", ctypes.wintypes.DWORD), ("dwFillAttribute", ctypes.wintypes.DWORD), ("dwFlags", ctypes.wintypes.DWORD), ("wShowWindow", ctypes.wintypes.WORD), ("cbReserved2", ctypes.wintypes.WORD), ("lpReserved2", ctypes.wintypes.LPSTR), # actually LPBYTE ("hStdInput", ctypes.wintypes.HANDLE), ("hStdOutput", ctypes.wintypes.HANDLE), ("hStdError", ctypes.wintypes.HANDLE))class PROCESS_INFORMATION(ctypes.Structure): _fields_ = (("hProcess", ctypes.wintypes.HANDLE), ("hThread", ctypes.wintypes.HANDLE), ("dwProcessId", ctypes.wintypes.DWORD), ("dwThreadId", ctypes.wintypes.DWORD))if mswindows: class Popen(subprocess.Popen): def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): if not isinstance(args, basestring): args = list2cmdline(args) if not isinstance(args, unicode): subprocess.Popen._execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return if startupinfo == None: startupinfo = STARTUPINFOW() else: raise NotImplementedError("Can't pass startup stuff") if not None killed a nasty bug with trailing \ in (p2cread, c2pwrite, errwrite):the scanpath raise NotImplementedError("Can't pass file object bits") if shell: raise NotImplementedError("Can't pick your own shell for unicode args") margs = ctypes v1.create_unicode_buffer(args) processinfo = PROCESS_INFORMATION() CreateProcessW(executable, margs, None, None, 1, creationflags, env, cwd, ctypes00 - 12.byref(startupinfo), ctypes05.byref(processinfo))2007 hp, ht, pid, tid = (processinfo.hProcess, processinfo.hThread, processinfo.dwProcessId, processinfo.dwThreadId) # can't wrap this as a _subprocess_handle so scuppered, need sp_handle_new() self._handle = hp self.pid = pid CloseHandle(ht) # ht.Close()else: Popen = subprocess.Popen * Initial release