TG-PlatformPlus/appProductor/productor.py

169 lines
7.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# This Python file uses the following encoding: utf-8
import sys
import uuid
import re
import shutil
import zipfile
import hashlib
import os
import json
from PyQt6 import *
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *
from ui_form import Ui_Widget
class Widget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_Widget()
self.ui.setupUi(self)
self.block = False
self.appjs = ""
self.ui.pbPackage.clicked.connect(self.compressPackage)
self.ui.leappId.textChanged.connect(self.updateInfo)
self.ui.leDes.textChanged.connect(self.updateInfo)
self.ui.leName.textChanged.connect(self.updateInfo)
self.ui.leVersion.textChanged.connect(self.updateInfo)
self.ui.pbOpenFile.clicked.connect(self.openFileDialog)
self.ui.pbOpen.clicked.connect(self.openDir)
def openFileDialog(self):
file_dialog = QFileDialog(self)
file_dialog.setWindowTitle("选择工程")
file_dialog.setFileMode(QFileDialog.FileMode.Directory)
if file_dialog.exec():
file_path = file_dialog.selectedFiles()[0]
# 获取info文件的路径
info_path = os.path.join(file_path, "info")
self.block = True
if os.path.exists(info_path):
# 读取文件内容
with open(info_path, 'r', encoding="utf-8") as f:
content = f.read()
info = json.loads(content)
# 将文件内容保存到列表中
self.ui.leappId.setText(info["General"]["AppId"])
self.ui.leName.setText(info["General"]["Name"])
self.ui.leDes.setText(info["General"]["Description"])
self.ui.leVersion.setText(info["General"]["Version"])
else:
self.ui.leappId.setText(str(uuid.uuid4()))
self.ui.leName.setText("")
self.ui.leDes.setText("")
self.ui.leVersion.setText("")
self.block = False
self.ui.lePro.setText(file_path)
def updateInfo(self):
if self.block:
return
# 获取info文件的路径
info_path = os.path.join(self.ui.lePro.text(), "info")
info = {
"General": {
"AppId": self.ui.leappId.text(),
"Name": self.ui.leName.text(),
"Description": self.ui.leDes.text(),
"Version": self.ui.leVersion.text(),
"Show": False
}
}
# 将文件内容保存到列表中
with open(info_path, 'w', encoding="utf-8") as f:
json.dump(info, f, ensure_ascii=False, indent=4)
def calculate_file_md5(self, file_path):
# 计算给定文件的MD5值。
md5 = hashlib.md5()
with open(file_path, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b""):
md5.update(chunk)
return md5.hexdigest()
def calculate_directory_md5(self, directory_path):
#计算给定目录下除md5.txt文件以外的全部文件的MD5值。
md5_values = {}
with os.scandir(directory_path) as it:
for entry in it:
if entry.is_file() and entry.name != 'md5.txt':
file_md5 = self.calculate_file_md5(entry.path)
md5_values[entry.name] = file_md5
elif entry.is_dir():
sub_directory_md5 = self.calculate_directory_md5(entry.path)
md5_values[entry.name] = sub_directory_md5
return {k: v for k, v in md5_values.items() if v != {} }
def openDir(self):
directory_path = self.ui.leDir.text()
os.makedirs( directory_path, exist_ok=True)
os.startfile(directory_path)
def compressPackage(self):
try:
filename = self.ui.leName.text()+".tpa"
packeagePath = os.path.join(self.ui.leDir.text(), filename)
fname = QFileDialog.getSaveFileName(self, '保存文件', packeagePath, 'TPA files (*.tpa)')
if fname[0]:
packeagePath = fname[0]
if os.path.exists(packeagePath):
os.remove(packeagePath)
print('文件已删除')
filename_with_extension = os.path.basename(fname[0]) # 获取带有后缀的文件名
filename = filename_with_extension.replace('.tpa', '') # 删除后缀,获取没有后缀的文件名
#更新app.js
js_path = os.path.join(self.ui.lePro.text(), "app.js")
with open(js_path, 'r') as file:
self.appjs = file.read()
with open(js_path, 'w', encoding="utf-8") as file:
file.write('var appId = \"' + self.ui.leappId.text() + '\"\nvar plusFile = \"plus\"')
self.ui.lbStatus.setText("开始打包")
directory_path = self.ui.lePro.text()
target_path = os.path.dirname(fname[0])
directory_md5 = self.calculate_directory_md5(directory_path)
json_str = json.dumps(directory_md5, indent=4, sort_keys=True)
md5_str = ""
md5_str = hashlib.md5(json_str.encode('utf-8')).hexdigest()
if md5_str != "":
with open(os.path.join(self.ui.lePro.text(),"md5.txt"), 'w') as f:
f.write(md5_str)
os.makedirs( self.ui.leDir.text(), exist_ok=True)
zip_path = os.path.join(self.ui.leDir.text(), filename +".zip")
# 创建ZIP文件并添加目录内容
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
# 递归添加目录和文件到ZIP文件中
self.add_dir_to_zip(directory_path, zipf, directory_path)
filename, ext = os.path.splitext(zip_path)
os.rename( zip_path, os.path.join( target_path, filename_with_extension) )
#还原debug app.js
with open(js_path, 'w', encoding="utf-8") as file:
file.write(self.appjs)
self.ui.lbStatus.setText("打包成功")
else:
self.ui.lbStatus.setText("md5为空")
except Exception as e:
try:
os.remove(zip_path)
except:
pass
self.ui.lbStatus.setText(f"打包失败{e}")
def add_dir_to_zip(self, dir_path, zipf, parent_dir):
for root, dirs, files in os.walk(dir_path):
for file in files:
file_path = os.path.join(root, file)
# 使用os.path.relpath获取相对于parent_dir的路径作为归档名称
arcname = os.path.relpath(file_path, parent_dir)
zipf.write(file_path, arcname=arcname)
for subdir in dirs:
subdir_path = os.path.join(root, subdir)
# 递归调用add_dir_to_zip()函数将空目录也添加到ZIP文件中
self.add_dir_to_zip(subdir_path, zipf, parent_dir)
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec())