From 83ca1b3242284b8aa06dde338910c1ed367e22bb Mon Sep 17 00:00:00 2001 From: xy Date: Sun, 21 Jan 2024 19:02:55 +0100 Subject: [PATCH] Import "Where Is It?" data - working draft doc update --- README.md | 8 ++ info/wii_01.png | Bin 0 -> 55198 bytes info/wii_02.png | Bin 0 -> 39168 bytes info/wii_import.md | 22 ++++ src/core.py | 293 ++++++++++++++++++++++++++++++++++++++++++++- src/librer.py | 247 +++++++++++++++----------------------- 6 files changed, 416 insertions(+), 154 deletions(-) create mode 100644 info/wii_01.png create mode 100644 info/wii_02.png create mode 100644 info/wii_import.md diff --git a/README.md b/README.md index 70c4ea5..f6b2820 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,12 @@ Portable executable packages created with [PyInstaller](https://pyinstaller.org/ https://github.com/PJDude/librer/releases +## MAJORGEEKS review: +https://www.majorgeeks.com/files/details/librer.html + +## SOFTPEDIA review: +https://www.softpedia.com/get/Others/File-CD-DVD-Catalog/Librer.shtml + ## [Tutorial](./info/tutorial.md) ## ## Guidelines for crafting custom data extractors @@ -40,6 +46,8 @@ Custom data extractor is a command that can be invoked with a single parameter - ## Portability **librer** writes log files, configuration and record files in runtime. Default location for these files is **logs** and **data** subfolders of **librer** main directory. +## [Importing data from "Where Is It?"](./info/wii_import.md) ## + ## Technical information Record in librer is the result of a single scan operation and is shown as one of many top nodes in the main tree window. Contains a directory tree with collected custom data. It is stored as a single .dat file in librer database directory. Its internal format is optimized for security, fast initial access and maximum compression (just check :)) Every section is a python data structure serialized by [pickle](https://docs.python.org/3/library/pickle.html) and compressed separately by [Zstandard](https://pypi.org/project/zstandard/) algorithm. The record file, once saved, is never modified afterward. It can only be deleted upon request or exported. All record files are independent of each other. Fuzzy matching is implemented using the SequenceMatcher function provided by the [difflib](https://docs.python.org/3/library/difflib.html) module. Searching records is performed as a separate subprocess for each record. The number of parallel searches is limited by the CPU cores. diff --git a/info/wii_01.png b/info/wii_01.png new file mode 100644 index 0000000000000000000000000000000000000000..a6e725283130d4b18cffab24b0c1d16ec956c42d GIT binary patch literal 55198 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 Z5Ofz!#plyU7JdQ0Ylh}mOAH>o`Y)B`8i)V@ literal 0 HcmV?d00001 diff --git a/info/wii_02.png b/info/wii_02.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7d8c899e3b0561d4e56c6035930d96413dd226 GIT binary patch literal 39168 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') + re_obj_item_end = re_compile(r'/ITEM>') + + re_obj_name = re_compile(r'(.+)') + re_obj_ext = re_compile(r'(.+)') + re_obj_size = re_compile(r'(.+)') + re_obj_date = re_compile(r'(.+)') + re_obj_disk_name = re_compile(r'(.+)') + re_obj_disk_type = re_compile(r'(.+)') + re_obj_disk_num = re_compile(r'(.+)') + re_obj_disk_location = re_compile(r'(.+)') + re_obj_path = re_compile(r'(.+)') + re_obj_time = re_compile(r'') + re_obj_crc = re_compile(r'(.+)') + re_obj_category = re_compile(r'(.+)') + re_obj_flag = re_compile(r'(.+)') + re_obj_desc = re_compile(r'(.+)') + re_obj_desc_begin = re_compile(r'(.*)') + re_obj_desc_end = re_compile(r'(.*)') + + l=0 + in_item=False + in_description=False + + demo_str = '*** DEMO ***' + + wii_paths_dict = {} + wii_path_tuple_to_data = {} + + try: + filenames_set=set() + for import_filename in import_filenames: + with open(import_filename,"rt", encoding='utf-8', errors='ignore') as f: + for line in f: + if match := re_obj_item.search(line): + item={} + item['type']=match.group(1) + item['ext'] = '' + item['description'] = [] + + in_item=True + in_description=False + + + elif match := re_obj_item_end.search(line): + in_item=False + in_description=False + + if item['disk_name']!=demo_str and item['path']!=demo_str and item['name']!=demo_str and item['ext']!=demo_str: + #path_splitted = [item['disk_name'] + ':'] + item['path'].strip('\\').split('\\') + [item['name']] + path_splitted = [item['disk_name']] + item['path'].strip('\\').split('\\') + [item['name'] + item['ext']] + path_splitted = [path_elem for path_elem in path_splitted if path_elem] + + path_splitted_len = len(path_splitted) + path_splitted_tuple = tuple(path_splitted) + + #print(f'{path_splitted=}') + + next_dict = wii_paths_dict + for ps_i in range(path_splitted_len): + filename = path_splitted[ps_i] + filenames_set.add(filename) + + if filename not in next_dict: + next_dict[filename] = {} + + next_dict = next_dict[filename] + + size = item['size'] + is_dir = bool(item['type']=="Folder") + is_file = bool(item['type']=="File") + is_symlink=False + is_bind=False + has_files=False + mtime=1234 + + #scan_like_data tuple + sld_tuple = tuple([size,is_dir,is_file,is_symlink,is_bind,has_files,mtime]) + #print(f'{path_splitted=} : {sld_tuple=}') + + wii_path_tuple_to_data[path_splitted_tuple] = sld_tuple + + elif match := re_obj_name.search(line): + item['name']=match.group(1) + elif match := re_obj_ext.search(line): + ext = match.group(1) + if ext!=demo_str: + item['ext']='.' + ext + elif match := re_obj_size.search(line): + try: + item['size']=int(match.group(1)) + except: + #print(f'wrong size: {match.group(1)}') + item['size']=333222 + elif match := re_obj_date.search(line): + item['date']=match.group(1) + elif match := re_obj_disk_name.search(line): + item['disk_name']=match.group(1) + elif match := re_obj_disk_type.search(line): + item['disk_type']=match.group(1) + elif match := re_obj_disk_num.search(line): + item['disk_num']=match.group(1) + elif match := re_obj_disk_location.search(line): + item['disk_loc']=match.group(1) + elif match := re_obj_path.search(line): + item['path']=match.group(1) + elif match := re_obj_time.search(line): + item['time']=match.group(1) + elif match := re_obj_crc.search(line): + item['crc']=match.group(1) + elif match := re_obj_category.search(line): + item['category']=match.group(1) + elif match := re_obj_flag.search(line): + item['flag']=match.group(1) + elif match := re_obj_desc.search(line): + item['desc']=match.group(1) + elif match := re_obj_desc_begin.search(line): + in_description=True + item['description'].append(match.group(1)) + elif match := re_obj_desc_end.search(line): + in_description=False + item['description'].append(match.group(1)) + item['description'] = tuple(item['description']) + elif in_description: + item['description'].append(line) + elif lstrip:=line.strip(): + #pass + print('IGNORING:',lstrip) + + l+=1 + + # + # $Recycle.Bin + # 1918697428 + # 2023-04-27 + # c + # Hard disk + # \ + # + # 1 + # + # 0 + # + + return filenames_set,wii_path_tuple_to_data,wii_paths_dict + except: + return {{},{},{}} + + def wii_data_to_scan_like_data(self,path_list,curr_dict_ref,scan_like_data): + path_list_tuple = tuple(path_list) + + anything = False + try: + for name,val in curr_dict_ref.items(): + + anything = True + + dict_entry={} + + sub_path_list = path_list + [name] + sub_path_list_tuple = tuple(sub_path_list) + + try: + size,is_dir,is_file,is_symlink,is_bind,has_files,mtime = self.wii_path_tuple_to_data[sub_path_list_tuple] + except Exception as e1: + print(f'{e1=}') + #tylko topowy ? + size=1 + is_dir = True + is_file = False + is_symlink = False + is_bind = False + mtime = 4568 + + if is_dir: + self.wii_data_to_scan_like_data(sub_path_list,val,dict_entry) + + if dict_entry: + has_files = True + else: + has_files = False + + temp_list_ref = scan_like_data[name] = [size,is_dir,is_file,is_symlink,is_bind,has_files,mtime] + + if dict_entry: + temp_list_ref.append(dict_entry) + + except Exception as e: + print('wii_data_to_scan_like_data error:',e) + pass + + return anything + + def import_records_wii_scan(self,import_filenames): + self.log.info(f'import_records_wii:{",".join(import_filenames)}') + + demo_str = '*** DEMO ***' + + quant = len(import_filenames) + + filenames_set,wii_path_tuple_to_data,wii_paths_dict = self.get_wii_files_dict(import_filenames) + + quant_files,quant_folders = 0,0 + for k,v in wii_path_tuple_to_data.items(): + size,is_dir,is_file,is_symlink,is_bind,has_files,mtime = v + if is_dir: + quant_folders+=1 + elif is_file: + quant_files+=1 + + return quant_files,quant_folders,filenames_set,wii_path_tuple_to_data,wii_paths_dict + + def import_records_wii_do(self,quant_files,quant_folders,filenames_set,wii_path_tuple_to_data,wii_paths_dict,update_callback): + import_res=[] + + self.wii_path_tuple_to_data = wii_path_tuple_to_data + self.wii_paths_dict=wii_paths_dict + + scan_like_data={} + self.wii_data_to_scan_like_data([],self.wii_paths_dict,scan_like_data) + + new_record = self.create() + new_record.filenames = tuple(sorted(list(filenames_set))) + new_record.header.label = 'WII import' + new_record.header.scan_path = 'WII import' + new_record.filenames_helper = {fsname:fsname_index for fsname_index,fsname in enumerate(new_record.filenames)} + + new_record.header.quant_files = quant_files + new_record.header.quant_folders = quant_folders + + ################################## + size,mtime = 0,0 + is_dir = True + is_file = False + is_symlink = False + is_bind = False + has_cd = False + has_files = True + cd_ok = False + has_crc = False + + new_record.header.references_names=0 + new_record.header.references_cd=0 + + code = LUT_encode[ (is_dir,is_file,is_symlink,is_bind,has_cd,has_files,cd_ok,has_crc,False,False) ] + new_record.filestructure = ('',code,size,mtime,new_record.tupelize_rec(scan_like_data,print)) + + new_file_path = sep.join([self.db_dir,f'wii.{int(time())}.dat']) + print(f'{new_file_path=}') + + new_record.save(print,file_path=new_file_path) + + update_callback(new_record) + + if import_res: + return '\n'.join(import_res) + else: + return None + def import_records(self,import_filenames,update_callback): self.log.info(f"import {','.join(import_filenames)}") @@ -1510,6 +1794,7 @@ def find_results_clean(self): stdout_files_cde_size_sum=0 ######################################################################################################################## + def create_new_record(self,temp_dir,update_callback): self.log.info(f'create_new_record') self_log_info = self.log.info diff --git a/src/librer.py b/src/librer.py index 3d15a19..1a0d91f 100644 --- a/src/librer.py +++ b/src/librer.py @@ -1388,6 +1388,9 @@ def repack_to_local(self): def repack_comp_set(self): self.repack_compr_var_int.set(int(self.repack_compr_var.get())) + def wii_import_comp_set(self): + self.wii_import_compr_var_int.set(int(self.wii_import_compr_var.get())) + repack_dialog_created = False @restore_status_line @block_actions_processing @@ -1439,6 +1442,64 @@ def get_repack_dialog(self): self.repack_dialog_created = True return self.repack_dialog + wii_import_dialog_created = False + @restore_status_line + @block_actions_processing + @gui_block + def get_wii_import_dialog(self): + self.wii_import_dialog_do_it=False + + if not self.wii_import_dialog_created: + self.wii_import_dialog=GenericDialog(self.main,(self.ico_librer,self.ico_librer_small),self.bg_color,'Where Is It ? import records',pre_show=self.pre_show,post_close=self.post_close,min_width=400,min_height=200) + self.wii_import_separate = BooleanVar() + self.wii_import_separate.set(False) + self.wii_import_compr_var = IntVar() + self.wii_import_compr_var_int = IntVar() + self.wii_import_label_var = StringVar() + + self.wii_import_compr_var.set(9) + self.wii_import_compr_var_int.set(9) + self.wii_import_label_var.set('WII-imported') + + self.wii_import_brief_label=Label(self.wii_import_dialog.area_main,text='',bd=2,bg=self.bg_color,takefocus=False,relief='groove',anchor='w',justify='left') + self.wii_import_brief_label.grid(row=0,column=0,sticky='news',padx=4,pady=4,columnspan=2) + try: + self.wii_import_brief_label.configure(font=('Courier', 10)) + except: + try: + self.wii_import_brief_label.configure(font=('TkFixedFont', 10)) + except: + pass + + (label_frame := LabelFrame(self.wii_import_dialog.area_main,text='Record Label',bd=2,bg=self.bg_color,takefocus=False)).grid(row=1,column=0,sticky='news',padx=4,pady=4,columnspan=2) + Entry(label_frame,textvariable=self.wii_import_label_var).pack(expand='yes',fill='x',padx=2,pady=2) + + (wii_import_frame := LabelFrame(self.wii_import_dialog.area_main,text='Options',bd=2,bg=self.bg_color,takefocus=False)).grid(row=2,column=0,sticky='news',padx=4,pady=4,columnspan=2) + self.wii_import_dialog.area_main.grid_columnconfigure( 0, weight=1) + self.wii_import_dialog.area_main.grid_columnconfigure( 1, weight=1) + + self.wii_import_dialog.area_main.grid_rowconfigure( 2, weight=1) + + self.wii_import_separate_cb = Checkbutton(wii_import_frame,text='create separate records',variable=self.wii_import_separate) + #self.wii_import_crc_cb = Checkbutton(wii_import_frame,text='Include CRC values',variable=self.wii_import_crc_var) + + self.wii_import_separate_cb.grid(row=0, column=0, sticky='wens',padx=4,pady=4) + #self.wii_import_crc_cb.grid(row=1, column=0, sticky='wens',padx=4,pady=4) + + wii_import_frame.grid_columnconfigure( 0, weight=1) + + (wii_import_frame_compr := LabelFrame(self.wii_import_dialog.area_main,text='Compression (0-22)',bd=2,bg=self.bg_color,takefocus=False)).grid(row=3,column=0,sticky='news',padx=4,pady=4,columnspan=2) + + Scale(wii_import_frame_compr, variable=self.wii_import_compr_var, orient='horizontal',from_=0, to=22,command=lambda x : self.wii_import_comp_set(),style="TScale").pack(fill='x',side='left',expand=1,padx=2) + Label(wii_import_frame_compr, textvariable=self.wii_import_compr_var_int,width=3,bg=self.bg_color,relief='ridge').pack(side='right',padx=2,pady=2) + + Button(self.wii_import_dialog.area_buttons, text='Proceed', width=14 , command= self.wii_import_to_local).pack(side='left', anchor='n',padx=5,pady=5) + Button(self.wii_import_dialog.area_buttons, text='Close', width=14, command=self.wii_import_dialog.hide ).pack(side='right', anchor='n',padx=5,pady=5) + + self.wii_import_dialog_created = True + + return self.wii_import_dialog + find_dialog_created = False @restore_status_line @block_actions_processing @@ -1788,162 +1849,44 @@ def record_repack(self): self.find_clear() self.info_dialog_on_main.show('Repacking finished.','Check repacked record\nDelete original record manually if you want.') + def wii_import_to_local(self): + self.wii_import_dialog_do_it=True + self.wii_import_dialog.hide() + @restore_status_line @block_actions_processing @gui_block def record_import_wii(self): initialdir = self.last_dir if self.last_dir else self.cwd - - if import_filenames := askopenfilenames(initialdir=self.last_dir,parent = self.main,title='Choose "Where Is It?" Report xml file to import', defaultextension=".xml",filetypes=[("XML Files","*.xml"),("All Files","*.*")]): + self.wii_import_dialog_do_it= False + if import_filenames := askopenfilenames(initialdir=self.last_dir,parent = self.main,title='Choose "Where Is It?" Report xml files to import', defaultextension=".xml",filetypes=[("XML Files","*.xml"),("All Files","*.*")]): self.last_dir = dirname(import_filenames[0]) - try: - re_obj_item = re_compile(r'') - re_obj_item_end = re_compile(r'/ITEM>') - - re_obj_name = re_compile(r'(.+)') - re_obj_ext = re_compile(r'(.+)') - re_obj_size = re_compile(r'(.+)') - re_obj_date = re_compile(r'(.+)') - re_obj_disk_name = re_compile(r'(.+)') - re_obj_disk_type = re_compile(r'(.+)') - re_obj_disk_num = re_compile(r'(.+)') - re_obj_disk_location = re_compile(r'(.+)') - re_obj_path = re_compile(r'(.+)') - re_obj_time = re_compile(r'') - re_obj_crc = re_compile(r'(.+)') - re_obj_category = re_compile(r'(.+)') - re_obj_flag = re_compile(r'(.+)') - re_obj_desc = re_compile(r'(.+)') - re_obj_desc_begin = re_compile(r'(.*)') - re_obj_desc_end = re_compile(r'(.*)') - - l=0 - in_item=False - in_description=False - - demo_str = '*** DEMO ***' - - #known_discs = set() - #known_items = set() - - wii_paths_dict = {} - - def print_dir_structure(file_handle,curr_dict_ref,indent=''): - try: - for key,val in curr_dict_ref.items(): - if not indent: - file_handle.write('\n==================================\n') - file_handle.write(indent + str(key) + '\n') - print_dir_structure(file_handle,val,indent + ' ') - except Exception as e: - pass - - def wii_paths_dict_add(path_elem,curr_dict_ref): - if path_elem not in curr_dict_ref: - curr_dict_ref[path_elem] = {} - - return curr_dict_ref[path_elem] - - for import_filename in import_filenames: - with open(import_filename,"rt", encoding='utf-8', errors='ignore') as f: - for line in f: - if match := re_obj_item.search(line): - in_item=True - in_description=False - item={} - item['description'] = [] - - item['type']=match.group(1) - elif match := re_obj_item_end.search(line): - in_item=False - in_description=False - - if item['disk_name']!=demo_str and item['path']!=demo_str: - path_splitted = [item['disk_name'] + ':'] + item['path'].strip('\\').split('\\') - path_splitted_len = len(path_splitted) - #print(f'{path_splitted=}') - - next_dict = wii_paths_dict - for ps_i in range(path_splitted_len): - next_dict = wii_paths_dict_add(path_splitted[ps_i],next_dict) - - elif match := re_obj_name.search(line): - item['name']=match.group(1) - elif match := re_obj_ext.search(line): - item['ext']=match.group(1) - elif match := re_obj_size.search(line): - item['size']=match.group(1) - elif match := re_obj_date.search(line): - item['date']=match.group(1) - elif match := re_obj_disk_name.search(line): - item['disk_name']=match.group(1) - elif match := re_obj_disk_type.search(line): - item['disk_type']=match.group(1) - elif match := re_obj_disk_num.search(line): - item['disk_num']=match.group(1) - elif match := re_obj_disk_location.search(line): - item['disk_loc']=match.group(1) - elif match := re_obj_path.search(line): - item['path']=match.group(1) - elif match := re_obj_time.search(line): - item['time']=match.group(1) - elif match := re_obj_crc.search(line): - item['crc']=match.group(1) - elif match := re_obj_category.search(line): - item['category']=match.group(1) - elif match := re_obj_flag.search(line): - item['flag']=match.group(1) - elif match := re_obj_desc.search(line): - item['desc']=match.group(1) - elif match := re_obj_desc_begin.search(line): - in_description=True - item['description'].append(match.group(1)) - elif match := re_obj_desc_end.search(line): - in_description=False - item['description'].append(match.group(1)) - item['description'] = tuple(item['description']) - elif in_description: - item['description'].append(line) - elif lstrip:=line.strip(): - #pass - print('IGNORING:',lstrip) - - l+=1 - - - #xml_content = fb.read().decode('utf-8', errors='replace') - - #print(f'{xml_content=}') - - #root = ET.fromstring(xml_content) - - # - # $Recycle.Bin - # 1918697428 - # 2023-04-27 - # c - # Hard disk - # \ - # - # 1 - # - # 0 - # - - - #librer_core.wii_xml_import(root,self.single_record_show) - #print('done.',l,'known_items_len:',len(known_items)) - - #proof of concept - if poc_file_path := asksaveasfilename(initialdir=self.last_dir,parent = self.main, initialfile = 'decoded_wii.txt',defaultextension=".txt",filetypes=[("Text Files","*.txt"),("All Files","*.*")]): - self.last_dir = dirname(poc_file_path) - with open(poc_file_path,'w') as fw: - fw.write('Where Is It? - report decoding - proof of concept\n') - fw.write('=================================================\n\n') - print_dir_structure(fw,wii_paths_dict) - - except Exception as ie: - print(f'WII Import error:{ie}') + + quant_files,quant_folders,filenames_set,wii_path_tuple_to_data,wii_paths_dict = librer_core.import_records_wii_scan(import_filenames) + + if quant_files==0 or quant_folders==0: + self.info_dialog_on_main.show('Where Is It? Import failed',"No files / No folders") + else: + ########################### + dialog = self.get_wii_import_dialog() + + #self.wii_import_label_var.set(self.current_record.header.label) + self.wii_import_compr_var.set(9) + self.wii_import_compr_var_int.set(9) + self.wii_import_brief_label.configure(text=f'GATHERED DATA:\nfiles : {fnumber(quant_files)}\nfolders : {fnumber(quant_folders)}') + + dialog.show() + + if self.wii_import_dialog_do_it: + res = librer_core.import_records_wii_do(quant_files,quant_folders,filenames_set,wii_path_tuple_to_data,wii_paths_dict,self.single_record_show) + + if not res: + ########################### + self.info_dialog_on_main.show('Where Is It? Import','Successful.') + self.find_clear() + else: + self.info_dialog_on_main.show('Where Is It? Import failed',res) + @restore_status_line @block_actions_processing @@ -2528,6 +2471,7 @@ def find_items(self): files_search_quant = sum([record.header.quant_files+record.header.quant_folders for record in sel_range]) if files_search_quant==0: + self.info_dialog_on_find.show('Search aborted.','No files in records.') return 1 if find_filename_search_kind == 'regexp': @@ -2692,6 +2636,7 @@ def find_items(self): records_len = len(librer_core.records) if records_len==0: + self.info_dialog_on_find.show('Search aborted.','No records.') return self_progress_dialog_on_find_progr1var_set = self.progress_dialog_on_find.progr1var.set @@ -2805,6 +2750,8 @@ def find_items(self): if find_results_quant_sum_format: self.find_result_index=-1 self.find_next() + else: + self.info_dialog_on_find.show('Search aborted.','Same params') def get_child_of_name(self,record,item,child_name): self_tree = self.tree