image-index-py/func.py

281 lines
10 KiB
Python
Raw Normal View History

2022-11-12 21:35:50 +01:00
import os,shutil,hashlib,re
from uuid import uuid4
import sqlite3 as sql
2022-11-16 10:36:34 +01:00
from config import *
2022-11-12 21:35:50 +01:00
class database():
def __init__(self,filepath):
self.connection=None
self.crsr=None
if not os.path.exists(filepath) :
self.create_database(filepath)
else:
self.connection = sql.connect(filepath)
self.crsr = self.connection.cursor()
def add_index(self,vallist):
# compile the options into a command for the SQLite database
2022-11-12 21:35:50 +01:00
colstring=",".join(self.collist)
valstring="'{}'".format("','".join(vallist))
self.crsr.execute("""INSERT INTO {table} ({cols})
VALUES ({vals});
""".format(table=self.name,cols=colstring,vals=valstring))
self.connection.commit()
def create_database(self, filepath):
# create the database and tables
2022-11-12 21:35:50 +01:00
self.connection = sql.connect(filepath)
self.crsr = self.connection.cursor()
sqlcommand = """CREATE TABLE FILES(
FILE TEXT PRIMARY KEY NOT NULL,
HASH TEXT NOT NULL,
TITLE TEXT ,
SOURCE TEXT ,
CATEGORY TEXT NOT NULL,
TAGS TEXT ,
CONTENT TEXT
); """
self.crsr.execute(sqlcommand)
'''sqlcommand = """CREATE TABLE META(
TAGS TEXT PRIMARY KEY NOT NULL
); """
self.crsr.execute(sqlcommand)'''
2022-11-16 10:36:34 +01:00
def delete_index(self,typ,item):
self.crsr.execute("DELETE FROM {} WHERE {}='{}'".format(self.name,typ,item))
self.connection.commit()
return
2022-11-12 21:35:50 +01:00
def get_col(self,column = "*"):
# get the column of some table. If no options given, return all columns
2022-11-12 21:35:50 +01:00
self.crsr.execute("SELECT {} FROM {}".format(column,self.name))
tres=self.crsr.fetchall()
res=[]
for i in tres:
res.append(i)
# if the table is empty, return ".".
#print(column,"res ",res)
2022-11-12 21:35:50 +01:00
if not res:
res="."
return res
2022-11-16 10:36:34 +01:00
def get_item(self,column,where):
if column == "*":
for col in self.collist:
self.crsr.execute("SELECT * FROM {} WHERE {} GLOB '*{}*'".format(self.name,col,where))
else:
self.crsr.execute("SELECT * FROM {} WHERE {} GLOB '*{}*'".format(self.name,column,where))
tres=self.crsr.fetchall()
#print("Tres: ",tres)
n=0
res=[]
for i in tres:
m=0
for j in tres:
if i in j and n!=m:
continue
else:
res.append(i)
m+=1
n+=1
#print("RES: ",tres)
# if the table is empty, return ".".
if not res:
return ["."]
return res
2022-11-12 21:35:50 +01:00
class metatable(database):
def __init__(self,filepath = os.getcwd() + "/index.db"):
self.name="META"
self.collist=["TAGS"]
super().__init__(filepath)
def add_index(self):
super().add_index(vallist)
class filestable(database):
def __init__(self,filepath = os.getcwd() + "/index.db"):
self.name="FILES"
self.collist=["FILE","HASH","TITLE","SOURCE","CATEGORY","TAGS","CONTENT"]
super().__init__(filepath)
def add_index(self,filepath,category,title="",source="",tags="",content=""):
filehash=self.get_hash(filepath) # make of hash of file before copy
n=0 # TODO: show the duplicate file (Title, Category and filename)
category="default" if not category else category
if filehash in self.get_col("HASH"):
2022-11-12 21:35:50 +01:00
print("This file already exists!")
return
filetype=os.path.splitext(filepath)[1]
filename=str(uuid4()) + filetype
if not os.path.exists("{}/{}".format(ROOT_DIR,category)):
os.makedirs("{}/{}".format(ROOT_DIR,category))
# try to copy the file, return if error.
2022-11-12 21:35:50 +01:00
try:
shutil.copy(filepath,"{}/{}/{}".format(ROOT_DIR,category,filename))
except Exception as e:
print(e)
print("COULDN'T COPY FILE TO DESTINATION!")
return
2022-11-12 21:35:50 +01:00
print("Executing")
vallist=[filename,filehash,title,source,category,tags,content]
super().add_index(vallist)
2022-11-16 10:36:34 +01:00
def delete_index(self,sel_list):
self.get_item("HASH",sel_list[1])
super().delete_index("HASH",sel_list[1])
def sql_compare_list(self,typ,firstlist,secondlist): # TODO: Fix (fixed?)
if firstlist:
n=0
temp_list=[]
if not secondlist:
n=0
for i in self.get_col(typ):
#print(i)
success=0
for j in firstlist:
#print(j)
if j in str(i):
#print("Yay")
if not success == -1:
success=1
else:
success=-1
if success > 0:
#print("Hey",i[0])
if typ == "*":
2022-11-16 10:36:34 +01:00
temp_list.append(self.get_item("FILE",j[0])[0])
else:
#print("TE",n,self.get_item(typ,i[0])[1])
2022-11-16 10:36:34 +01:00
for k in self.get_item(typ,j[0]):
if not k in temp_list:
temp_list.append(k)
#print("Self: ",self.get_item(typ,i[0])[n])
2022-11-16 10:36:34 +01:00
#print(temp_list)
n+=1
2022-11-12 21:35:50 +01:00
else:
#print("Second: ",secondlist)
if not secondlist[0] == ".":
for i in secondlist:
for j in firstlist:
if j in i:
temp_list.append(secondlist[n])
n+=1
else:
#print("secondlist")
return secondlist
2022-11-16 10:36:34 +01:00
#print("Temp_list: ",temp_list)
if not temp_list:
return ["."]
return temp_list
return secondlist
2022-11-12 21:35:50 +01:00
def get_hash(self,filepath):
#https://www.quickprogrammingtips.com/python/how-to-calculate-md5-hash-of-a-file-in-python.html
md5_hash = hashlib.md5()
# hash selected file in chunks of 4KiB, read the link above if you ask why.
2022-11-12 21:35:50 +01:00
with open(filepath,"rb") as f:
for byte_block in iter(lambda: f.read(4096),b""):
md5_hash.update(byte_block)
f.close()
return str(md5_hash.hexdigest())
2022-11-16 10:36:34 +01:00
def search_index(self,args):
#print(args)
####
## WARNING!!!!!! UGLY CODE INCOMING!!!!!!
####
snext="all"
shash=[]
alle=[]
category=[]
sfile=[]
content=[]
source=[]
title=[]
tags=[]
2022-11-16 10:36:34 +01:00
for arg in args:
if re.match('^[-]\w{1}$', arg):
if arg == "-h":
snext="hash"
elif arg == "-a": # technically unneeded because of else at the end
snext="all"
elif arg == "-c":
snext="category"
elif arg == "-f":
snext="file"
elif arg == "-i": # Inhalt
snext="content"
elif arg == "-s":
snext="source"
elif arg == "-t":
snext="title"
elif arg == "-g": # Gruppe
snext="tags"
else:
snext="all"
continue
if snext == "hash":
shash.append(arg)
elif snext == "all":
alle.append(arg)
elif snext == "category":
category.append(arg)
elif snext == "file":
sfile.append(arg)
elif snext == "content":
content.append(arg)
elif snext == "source":
source.append(arg)
elif snext == "title":
title.append(arg)
elif snext == "tags":
tags.append(arg)
else:
alle.append(arg)
# search for the right items
selection=[]
selection=self.sql_compare_list("*",alle,selection)
selection=self.sql_compare_list("HASH",shash,selection)
selection=self.sql_compare_list("CATEGORY",category,selection)
selection=self.sql_compare_list("FILE",sfile,selection)
selection=self.sql_compare_list("CONTENT",content,selection)
selection=self.sql_compare_list("SOURCE",source,selection)
selection=self.sql_compare_list("TITLE",title,selection)
selection=self.sql_compare_list("TAGS",tags,selection)
#print("Selection: ",selection)
if selection:
res=[]
if len(selection) > 1:
n=0
#print(selection)
2022-11-16 10:36:34 +01:00
print("Found several matches:")
for tup in selection:
temp_list=[]
for j in tup:
temp_list.append(j)
2022-11-16 10:36:34 +01:00
#print("sdf",temp_list)
print("Match [{}]".format(n))
print("\tTitle:\t ",temp_list[2])
print("\tCategory:",temp_list[4])
print("\tTags:\t ",temp_list[5])
n+=1
eingabe=input("Enter number 0-{}: ".format(n-1))
if int(eingabe) < n:
for i in selection[int(eingabe)]:
res.append(i)
print("\n\nFinal match:")
else:
print(type(eingabe))
# TODO: Fix
else:
if selection[0] == ".":
print("No matching entry found!")
return ["."]
tempres=selection[0]
for i in tempres:
res.append(i)
print("\nMatch found!")
print("Title:\t ",res[2])
print("Category:",res[4])
print("Filename:",res[0])
print("Tags:\t ",res[5])
return res
return 1