Update .gitignore, StoreXLS.py, and 4 more files...

This commit is contained in:
2024-10-31 16:08:01 +09:00
parent 401627a58f
commit 8f64bb2fc1
6 changed files with 303 additions and 12 deletions

5
.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
venv_mangainfo/
mangaDB.xlsx
temp.db
temp.json
untitled0.py

View File

@@ -83,7 +83,7 @@ class DBXLStorage:
return
#for item in listInfos:
# 클래스 타잎을 확인해야 하지만.. 생략.
# 클래스 타잎을 확인해야 하지만.. 생략.
# ttist, group, series(parady), type, tags, hitomi ID, hitomi file, eh ID, eh tor
@@ -116,7 +116,7 @@ class DBXLStorage:
shtArt.cell(row=last_row, column=1, value=last_row)
shtArt.cell(row=last_row, column=2, value=strUrl)
shtArt.cell(row=last_row, column=3, value=strArt)
shtArt.cell(row=last_row, column=3, value=ArtName)
# list 인 경우
elif isinstance(ArtName, list):
nID = self.SearchIDFromName(shtArt, ArtName)

176
UI.py Normal file
View File

@@ -0,0 +1,176 @@
import sys
import os
import UtilPack as util
from io import BytesIO
from PyQt5.QtCore import Qt, QUrl, QSettings, QSize, QPoint, QByteArray
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QVBoxLayout, QLineEdit, QHBoxLayout, QListWidget, QListWidgetItem, QLabel, QFileDialog
from PyQt5.QtGui import QPixmap, QKeyEvent
QApplication.setAttribute(Qt.AA_ShareOpenGLContexts)
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
self.loadINI()
def closeEvent(self, event):
self.saveINI()
event.accept()
def initUI(self):
layout = self.MakeUI()
# 레이아웃을 윈도우에 적용
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
self.setWindowTitle('Manga Database')
self.move(10, 10)
self.show()
def loadINI(self):
settings = QSettings('MyApp', 'settings')
window_size = settings.value('window/size', '800, 600')
window_position = settings.value('window/position', '100, 100')
def saveINI(self):
settings = QSettings('MyApp', 'settings')
# 키-값 형식으로 데이터 저장
settings.setValue('window/size', "1024,768")
settings.setValue('window/position', "100,100")
def MakeUI_Left(self):
self.list_SrcPath = QListWidget()
btn_Add = QPushButton("Add", self)
btn_Add.clicked.connect(self.on_click_SrcAdd)
btn_Del = QPushButton("Del", self)
btn_Del.clicked.connect(self.on_click_SrcDel)
btn_Read = QPushButton("Read!", self)
btn_Read.clicked.connect(self.on_click_SrcRead)
layout_Btns = QHBoxLayout()
layout_Btns.addWidget(btn_Add)
layout_Btns.addWidget(btn_Del)
layout_Btns.addWidget(btn_Read)
layout_Top = QVBoxLayout()
layout_Top.addWidget(self.list_SrcPath)
layout_Top.addLayout(layout_Btns)
self.list_ArcList = QListWidget(self)
self.list_ArcList.itemSelectionChanged.connect(self.on_Item_SelChanged_listArc)
self.list_Infos = QListWidget(self)
layout = QVBoxLayout()
layout.addLayout(layout_Top)
layout.addWidget(self.list_ArcList)
layout.addWidget(self.list_Infos)
return layout
def MakeUI(self):
layout_L = self.MakeUI_Left()
# show Image in middle Layout
self.label_Image = QLabel(self)
# Load Default Image
pixmap = QPixmap("layoutImg.jpeg")
scaled_Pix = pixmap.scaledToHeight(600)
self.label_Image.setPixmap(scaled_Pix)
self.list_Items = QListWidget(self)
self.list_Items.itemSelectionChanged.connect(self.on_Item_SelChanged_Items)
# 레이아웃 설정
layout = QHBoxLayout()
layout.addLayout(layout_L)
layout.addWidget(self.label_Image)
layout.addWidget(self.list_Items)
return layout
def on_click_SrcAdd(self):
# 폴더 선택 창을 띄움
folder_path = QFileDialog.getExistingDirectory(self, '폴더 선택', '')
self.list_SrcPath.addItem(folder_path)
listFiles = util.ListContainFiles(folder_path)
for pathFile in listFiles:
filename = util.GetParentDirName(pathFile, 0)
fileExt = util.GetExtStr(filename)
if not fileExt.lower() in [".zip", ".cbz"]:
continue
item = QListWidgetItem(filename)
item.setData(Qt.UserRole, pathFile)
self.list_ArcList.addItem(item)
def on_click_SrcDel(self):
items = self.list_SrcPath.selectedItems()
if not items:
return
for item in items:
row = self.list_SrcPath.row(item)
self.list_SrcPath.takeItem(row)
def on_click_SrcRead(self):
pass
def on_Item_SelChanged_listArc(self):
items = self.list_ArcList.selectedItems()
self.list_Infos.clear()
self.pathCurSelZip = ""
for item in items:
self.pathCurSelZip = item.data(Qt.UserRole)
listZipConts = util.GetZipContentList(self.pathCurSelZip)
self.list_Infos.addItem( QListWidgetItem(self.pathCurSelZip) )
self.list_Infos.addItem( QListWidgetItem( f"{len(listZipConts)}" ) )
self.list_Items.clear()
self.list_Items.addItems( listZipConts )
def on_Item_SelChanged_Items(self):
items = self.list_Items.selectedItems()
if 0 >= len(items):
return
data = util.GetZippedFileByte(self.pathCurSelZip, items[0].text())
imageIO = BytesIO(data)
pixmap = QPixmap()
pixmap.loadFromData( QByteArray( imageIO.getvalue() ) )
self.label_Image.setPixmap(pixmap)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setQuitOnLastWindowClosed(True)
main_window = MyApp()
#main_window.show()
sys.exit(app.exec_())

View File

@@ -60,6 +60,25 @@ def ListSubDirectories(root_dir):
return subdirectories
# 자식 폴더를 구해온다. 직계 자식만
def ListChildDirectories(pathDir):
listRet = []
for name in os.listdir(pathDir):
pathChild = os.path.join(pathDir, name)
if os.path.isdir(pathChild):
listRet.append(pathChild)
return listRet
# 파일목록만 구해온다. 자식 폴더에 있는건 무시.
def ListContainFiles(pathDir):
listRet = []
for name in os.listdir(pathDir):
pathChild = os.path.join(pathDir, name)
if not os.path.isdir(pathChild):
listRet.append(pathChild)
return listRet
def ListFileExtRcr(pathTrg, strExt):
listRet= []
@@ -73,6 +92,22 @@ def ListFileExtRcr(pathTrg, strExt):
return listRet
# 입력된 패스에서 부모 폴더를 찾는다. 0 은 자기자신 1은 부모, 숫자대로 위로.
def GetParentDirName(FullPath, nUp):
parts = FullPath.split(os.sep)
nTrgIdx = 0
if nUp < len(parts):
nTrgIdx = len(parts) -nUp -1
elif nUp < 0:
nTrgIdx = len(parts) - 1
else:
nTrgIdx = 0
return parts[nTrgIdx]
# 입력된 경로가 자식 폴더를 가지고 있는지 판단한다.- 최종 폴더인지 여부
# 자식이 없으면 True, 자식이 있으면 False
def IsFinalFolder(path):
@@ -194,6 +229,32 @@ def CreateZIPShExt(zipName, TrgExt):
return bRet
# 압축 파일 내의 모든 파일 및 디렉토리 목록 가져오기
def GetZipContentList(path):
if None == path or not os.path.isfile(path):
return []
listRet = []
with zipfile.ZipFile( path , 'r') as zip_file:
listRet = zip_file.namelist()
return listRet
def GetZippedFileByte(pathZip, FileName):
if None == pathZip or not os.path.isfile(pathZip):
return None
retBytes = None
with zipfile.ZipFile( pathZip , 'r') as zip_file:
if not FileName in zip_file.namelist():
return None
with zip_file.open(FileName) as file:
retBytes = file.read()
return retBytes
# JSON 을 트리 구조로 출력한다.
def PrintJSONTree(data, indent=0):
if isinstance(data, dict):

64
main.py
View File

@@ -5,7 +5,15 @@ import MgrCalibreLibs as mgrCal
import UtilPack as util
import StoreXLS as xls
def main():
import os
import sys
def main(argc, argv):
if argc != 2:
printUsage()
return
trgPath = argv[1]
#getHitomi.GetSearchResult("2890685")
#etEhentai.GetSearchResult("artist%3A%22kotomi+yo-ji%24%22")
@@ -15,18 +23,56 @@ def main():
#artist:"kotomi yo-ji$"
#"artist%3A%22kotomi+yo-ji%24%22"
tempxls = xls.DBXLStorage("./temp.xls")
tempxls.DBXLSOpen()
tempxls.AddArtistInfo("Kuno Inu", "/artist/kunoinu/")
tempxls.AddSeriesInfo("Original", "/serires/original/")
tempxls.AddTagInfo("female:bondage", "/tag/bondage/")
tempxls.AddTagInfo("female:slave", "/tag/slave/")
tempxls.DBXLSClose()
#tempxls = xls.DBXLStorage("./temp.xls")
#tempxls.DBXLSOpen()
#tempxls.AddArtistInfo("Kuno Inu", "/artist/kunoinu/")
#tempxls.AddSeriesInfo("Original", "/serires/original/")
#tempxls.AddTagInfo("female:bondage", "/tag/bondage/")
#tempxls.AddTagInfo("female:slave", "/tag/slave/")
#tempxls.DBXLSClose()
if False == os.path.exists(trgPath):
printUsage()
return
listPaths = util.ListSubDirectories(trgPath)
util.DbgOut(f"Folder Cnt : {len(listPaths)}")
PupilDB_EXT = ".data"
PupilImg_EXT = ".img"
CalbCvr = "cover"
CalbCvr_EXT = ".jpg"
nIdx = 0
# 각 pupil 만화책 폴더 -> path
for path in listPaths:
# 퍼필에서 저장한 만화책 폴더의 절대경로를 구한다
# 퍼필 만화책 정보 파일을 파싱
# - 만약 만화책 파일이 하나도 없거나 정보 파일과 다르다면..
# - - 정보 파일만 적당히 백업하고 다음으로 넘어간다
#
# 캘리버 정보 파일로 저장한다
# 퍼필에서 생성한 표지 파일을 찾는다.
# webp 인지 확인해서 jpg 로 변환하여 저장, JPG 라면 이름만 바꾼다
# 만약 없다면 1번 파일을 적당히 줄여서 표지 파일을 생성
# 이미지 파일 리스트를 생성
# 압축한다
# 압축파일, 캘리버 정보 파일, 표지 파일이 다 있는지 확인하고 메시지 출력
# 하나라도 없으면 에러 리스트에 저장
nIdx += 1
def printUsage():
print("Usage : python main.py <DataFilesFolderPath>")
# For Main Loop
if __name__ == '__main__':
main()
argc = len(sys.argv)
argv = sys.argv
main(argc, argv)

View File

@@ -37,6 +37,9 @@ psutil==5.9.8
ptyprocess==0.7.0
pure-eval==0.2.2
Pygments==2.17.2
PyQt5==5.15.11
PyQt5-Qt5==5.15.14
PyQt5_sip==12.15.0
PyQt6==6.7.0
PyQt6-Qt6==6.7.0
PyQt6-sip==13.6.0