From d84b1071774bd08d5b75259302a04279c5aa8474 Mon Sep 17 00:00:00 2001 From: Julian Freeman Date: Fri, 2 Feb 2024 09:35:56 -0400 Subject: [PATCH] dev 02020935 --- Pipfile | 1 + Pipfile.lock | 74 ++++++++++++++++++++++++++++++++++++++++++--- da_show_profiles.py | 6 ++-- main.py | 33 ++++++++++++-------- mw_dailycheck.py | 5 +-- util_ext.py | 8 +++-- util_func.py | 2 +- wg_extensions.py | 44 +++++++++++++++------------ 8 files changed, 129 insertions(+), 44 deletions(-) diff --git a/Pipfile b/Pipfile index 99a9094..44cd01d 100644 --- a/Pipfile +++ b/Pipfile @@ -7,6 +7,7 @@ name = "pypi" pyside6 = "==6.6.1" requests = "==2.31.0" wmi = "==1.5.1" +pyinstaller = "==6.3.0" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index e86faa1..4d22bf4 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9fb9aefd0be8259a8edb7585a24d4f9480d2ffccf9320d3971b34c4aa306b7ef" + "sha256": "c9e6c224ff1fb7073100c794e46ce72371b7c482473c9704fc5709aefe9f1f33" }, "pipfile-spec": 6, "requires": { @@ -16,13 +16,20 @@ ] }, "default": { + "altgraph": { + "hashes": [ + "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406", + "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff" + ], + "version": "==0.17.4" + }, "certifi": { "hashes": [ - "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", - "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" ], "markers": "python_version >= '3.6'", - "version": "==2023.11.17" + "version": "==2024.2.2" }, "charset-normalizer": { "hashes": [ @@ -128,6 +135,49 @@ "markers": "python_version >= '3.5'", "version": "==3.6" }, + "packaging": { + "hashes": [ + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + ], + "markers": "python_version >= '3.7'", + "version": "==23.2" + }, + "pefile": { + "hashes": [ + "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", + "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6" + ], + "markers": "sys_platform == 'win32'", + "version": "==2023.2.7" + }, + "pyinstaller": { + "hashes": [ + "sha256:0597fb04337695e5cc5250253e0655530bf14f264b7a5b7d219cc65f6889c4bd", + "sha256:156b32ba943e0090bcc68e40ae1cb68fd92b7f1ab6fe0bdf8faf3d3cfc4e12dd", + "sha256:1eadbd1fae84e2e6c678d8b4ed6a232ec5c8fe3a839aea5a3071c4c0282f98cc", + "sha256:41c937fe8f07ae02009b3b5a96ac3eb0800a4f8a97af142d4100060fe2135bb9", + "sha256:75a6f2a6f835a2e6e0899d10e60c10caf5defd25aced38b1dd48fbbabc89de07", + "sha256:886b3b995b674905a20ad5b720b47cc395897d7b391117831027a4c8c5d67a58", + "sha256:914d4c96cc99472e37ac552fdd82fbbe09e67bb592d0717fcffaa99ea74273df", + "sha256:96c37a1ee5b2fd5bb25c098ef510661d6d17b6515d0b86d8fc93727dd2475ba3", + "sha256:abe91106a3bbccc3f3a27af4325676ecdb6f46cb842ac663625002a870fc503b", + "sha256:b721d793a33b6d9946c7dd95d3ea7589c0424b51cf1b9fe580f03c544f1336b2", + "sha256:de25beb176f73a944758553caacec46cc665bf3910ad8a174706d79cf6e95340", + "sha256:e436fcc0ea87c3f132baac916d508c24c84a8f6d8a06c3154fbc753f169b76c7" + ], + "index": "pypi", + "markers": "python_version < '3.13' and python_version >= '3.8'", + "version": "==6.3.0" + }, + "pyinstaller-hooks-contrib": { + "hashes": [ + "sha256:469b5690df53223e2e8abffb2e44d6ee596e7d79d4b1eed9465123b67439875a", + "sha256:a7118c1a5c9788595e5c43ad058a7a5b7b6d59e1eceb42362f6ec1f0b61986b0" + ], + "markers": "python_version >= '3.7'", + "version": "==2024.0" + }, "pyside6": { "hashes": [ "sha256:0a67587c088cb80e90d4ce3023b02466ea858c93a6dc9c4e062b13314e03d464", @@ -178,6 +228,14 @@ ], "version": "==306" }, + "pywin32-ctypes": { + "hashes": [ + "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60", + "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.2.2" + }, "requests": { "hashes": [ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", @@ -187,6 +245,14 @@ "markers": "python_version >= '3.7'", "version": "==2.31.0" }, + "setuptools": { + "hashes": [ + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" + ], + "markers": "python_version >= '3.8'", + "version": "==69.0.3" + }, "shiboken6": { "hashes": [ "sha256:072c35c4fe46ec13b364d9dc47b055bb2277ee3aeaab18c23650280ec362f62a", diff --git a/da_show_profiles.py b/da_show_profiles.py index 3075431..474bf45 100644 --- a/da_show_profiles.py +++ b/da_show_profiles.py @@ -60,7 +60,7 @@ class DaShowProfiles(QtWidgets.QDialog): def __init__(self, browser: str, - is_chrome_compat: bool, + is_compat: bool, profiles_data: ProfilesData, ext_id: str, ext_name: str, @@ -71,7 +71,7 @@ class DaShowProfiles(QtWidgets.QDialog): self.setWindowTitle(ext_name) self.setWindowIcon(ext_icon) self.browser = browser - self.is_chrome_compat = is_chrome_compat + self.is_compat = is_compat self.process = QtCore.QProcess(self) @@ -132,7 +132,7 @@ class DaShowProfiles(QtWidgets.QDialog): def on_pbn_delete_selected_clicked(self): us = QtCore.QSettings() user_data_path = str(us.value(f"{self.browser}Data", "")) - if self.browser == "Chrome" and self.is_chrome_compat: + if self.is_compat: pref_name = "Preferences" else: pref_name = "Secure Preferences" diff --git a/main.py b/main.py index fbdec6c..6a2542c 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,7 @@ from mw_dailycheck import MwDailyCheck import daily_check_rc -version = (0, 1, 0) +version = (0, 2, 0) ORG_NAME = "JnPrograms" APP_NAME = "DailyCheck" @@ -18,14 +18,14 @@ def set_default_settings(): user_path = os.path.expanduser("~") user_data_path_map = { "win32": { - "Chrome": Path(user_path, r"AppData\Local\Google\Chrome\User Data"), - "Edge": Path(user_path, r"AppData\Local\Microsoft\Edge\User Data"), - "Brave": Path(user_path, r"AppData\Local\BraveSoftware\Brave-Browser\User Data"), + "Chrome": str(Path(user_path, r"AppData\Local\Google\Chrome\User Data")), + "Edge": str(Path(user_path, r"AppData\Local\Microsoft\Edge\User Data")), + "Brave": str(Path(user_path, r"AppData\Local\BraveSoftware\Brave-Browser\User Data")), }, "darwin": { - "Chrome": Path(user_path, "Library/Application Support/Google/Chrome"), - "Edge": Path(user_path, "Library/Application Support/Microsoft Edge"), - "Brave": Path(user_path, "Library/Application Support/BraveSoftware/Brave-Browser"), + "Chrome": str(Path(user_path, "Library/Application Support/Google/Chrome")), + "Edge": str(Path(user_path, "Library/Application Support/Microsoft Edge")), + "Brave": str(Path(user_path, "Library/Application Support/BraveSoftware/Brave-Browser")), }, } exec_path_map = { @@ -42,13 +42,20 @@ def set_default_settings(): } user_data_path = user_data_path_map[plat] exec_path = exec_path_map[plat] + settings_map = { + "ChromeExec": exec_path["Chrome"], + "EdgeExec": exec_path["Edge"], + "BraveExec": exec_path["Brave"], + "ChromeData": user_data_path["Chrome"], + "EdgeData": user_data_path["Edge"], + "BraveData": user_data_path["Brave"], + } us = QtCore.QSettings() - us.setValue("ChromeExec", exec_path["Chrome"]) - us.setValue("EdgeExec", exec_path["Edge"]) - us.setValue("BraveExec", exec_path["Brave"]) - us.setValue("ChromeData", user_data_path["Chrome"]) - us.setValue("EdgeData", user_data_path["Edge"]) - us.setValue("BraveData", user_data_path["Brave"]) + exist_keys = us.childKeys() + for s in settings_map: + if s not in exist_keys: + us.setValue(s, settings_map[s]) + # print(f"Add key {s}") def main(): diff --git a/mw_dailycheck.py b/mw_dailycheck.py index c3a59aa..daaad78 100644 --- a/mw_dailycheck.py +++ b/mw_dailycheck.py @@ -1,6 +1,7 @@ # coding: utf8 import json from pathlib import Path +from datetime import datetime from PySide6 import QtWidgets, QtGui, QtCore from wg_basic import WgBasic from wg_software import WgSoftware @@ -81,8 +82,8 @@ class MwDailyCheck(QtWidgets.QMainWindow): dirname = QtWidgets.QFileDialog.getExistingDirectory(self, "导出未知") if len(dirname) == 0: return - - ex_file = Path(dirname, f"未知信息.json") + now = datetime.strftime(datetime.now(), "%y%m%d%H%M") + ex_file = Path(dirname, f"未知信息{now}.json") if accept_warning(self, ex_file.exists(), "警告", "文件已存在,确认覆盖吗?"): return diff --git a/util_ext.py b/util_ext.py index a03e301..4f2f946 100644 --- a/util_ext.py +++ b/util_ext.py @@ -70,10 +70,12 @@ def get_extension_icon_path(ext_icons: dict[str, str], ext_path: str, profile_pa icon_file = icon_file[1:] full_path = Path(profile_path, "Extensions", ext_path, icon_file) + if not full_path.exists(): + return "" return str(full_path) -def scan_extensions(browser: str, is_chrome_compat=False) -> tuple[ExtensionsData, ProfilesData]: +def scan_extensions(browser: str, is_compat=False) -> tuple[ExtensionsData, ProfilesData]: us = QtCore.QSettings() user_data_path = str(us.value(f"{browser}Data", "")) if len(user_data_path) == 0 or not Path(user_data_path).exists(): @@ -82,11 +84,13 @@ def scan_extensions(browser: str, is_chrome_compat=False) -> tuple[ExtensionsDat profile_data = scan_profiles(user_data_path) extensions_data: ExtensionsData = {} - if browser == "Chrome" and is_chrome_compat: + if is_compat: pref_file = "Preferences" else: pref_file = "Secure Preferences" + # print(pref_file) + for profile_id in profile_data: profile_path = Path(user_data_path, profile_id) secure_pref_path = Path(profile_path, pref_file) diff --git a/util_func.py b/util_func.py index efcc054..915ad30 100644 --- a/util_func.py +++ b/util_func.py @@ -69,7 +69,7 @@ def extract_win_icon_from_file(icon: str, default: QIcon) -> QIcon: icon = icon.replace("'", "") if not os.path.exists(icon): return default - if not icon.endswith(("exe", "EXE")): + if not icon.endswith(("exe", "EXE", "dll", "DLL")): return QIcon(icon) large, small = win32gui.ExtractIconEx(icon, 0) diff --git a/wg_extensions.py b/wg_extensions.py index 5394a39..70e5334 100644 --- a/wg_extensions.py +++ b/wg_extensions.py @@ -24,7 +24,7 @@ class UiWgExtensions(object): self.cbx_safe.setChecked(True) self.cbx_unsafe.setChecked(True) self.cbx_unknown.setChecked(True) - self.cbx_chrome_compat = QtWidgets.QCheckBox("谷歌兼容模式", window) + self.cbx_compat = QtWidgets.QCheckBox("兼容模式", window) self.pbn_update = QtWidgets.QPushButton("更新", window) self.pbn_settings = QtWidgets.QPushButton("设置", window) self.hly_top.addWidget(self.cmbx_browsers) @@ -32,7 +32,7 @@ class UiWgExtensions(object): self.hly_top.addWidget(self.cbx_unsafe) self.hly_top.addWidget(self.cbx_unknown) self.hly_top.addStretch(1) - self.hly_top.addWidget(self.cbx_chrome_compat) + self.hly_top.addWidget(self.cbx_compat) self.hly_top.addWidget(self.pbn_update) self.hly_top.addWidget(self.pbn_settings) @@ -51,17 +51,20 @@ class BaseExtensionsListModel(QtCore.QAbstractListModel): self.safe_info = {} # type: dict[str, dict] self.blank_icon = QtGui.QIcon(":/images/blank_128.png") - def update(self, **kwargs): + self.last_is_compat = False + + def update(self, is_compat=False): raise NotImplementedError - def update_ext(self, browser: str, is_chrome_compat=False): + def update_ext(self, browser: str, is_compat=False): """内部用""" self.all_profiles.clear() self.all_extensions.clear() self.names.clear() self.icons.clear() - self.all_extensions, self.all_profiles = scan_extensions(browser, is_chrome_compat) + self.all_extensions, self.all_profiles = scan_extensions(browser, is_compat) + self.last_is_compat = is_compat for ext_id in self.all_extensions: name = self.all_extensions[ext_id].name icon = self.all_extensions[ext_id].icon @@ -108,20 +111,20 @@ class BaseExtensionsListModel(QtCore.QAbstractListModel): class ChromeExtensionsListModel(BaseExtensionsListModel): - def update(self, is_chrome_compat=False): - super().update_ext("Chrome", is_chrome_compat) + def update(self, is_compat=False): + super().update_ext("Chrome", is_compat) class EdgeExtensionsListModel(BaseExtensionsListModel): - def update(self, **kwargs): - super().update_ext("Edge") + def update(self, is_compat=False): + super().update_ext("Edge", is_compat) class BraveExtensionsListModel(BaseExtensionsListModel): - def update(self, **kwargs): - super().update_ext("Brave") + def update(self, is_compat=False): + super().update_ext("Brave", is_compat) class BrowsersListModel(QtCore.QAbstractListModel): @@ -168,7 +171,7 @@ class WgExtensions(QtWidgets.QWidget): } self.switch_model(self.get_current_browser()) - self.ui.cbx_chrome_compat.clicked.connect(self.on_cbx_chrome_compat_clicked) + self.ui.cbx_compat.clicked.connect(self.on_cbx_compat_clicked) self.ui.cmbx_browsers.currentTextChanged.connect(self.on_cmbx_browsers_current_text_changed) self.ui.cbx_safe.clicked.connect(self.on_cbx_safe_clicked) self.ui.cbx_unsafe.clicked.connect(self.on_cbx_unsafe_clicked) @@ -199,7 +202,7 @@ class WgExtensions(QtWidgets.QWidget): def update_model(self, browser: str): model = self.ext_list_models[browser] self.show_all_rows() - model.update(is_chrome_compat=self.ui.cbx_chrome_compat.isChecked()) + model.update(is_compat=self.ui.cbx_compat.isChecked()) self.apply_rows_hidden() def switch_model(self, browser: str): @@ -207,15 +210,18 @@ class WgExtensions(QtWidgets.QWidget): self.update_model(browser) self.model_is_initial[browser] = False - self.ui.lv_extensions.setModel(self.ext_list_models[browser]) + model = self.ext_list_models[browser] + self.show_all_rows() + self.ui.lv_extensions.setModel(model) + self.apply_rows_hidden() + # 单纯的切换浏览器不一定会导致更新数据,所以需要同步兼容模式的设置 + self.ui.cbx_compat.setChecked(model.last_is_compat) - def on_cbx_chrome_compat_clicked(self): - if self.get_current_browser() == "Chrome": - self.update_model("Chrome") + def on_cbx_compat_clicked(self): + self.update_model(self.get_current_browser()) def on_cmbx_browsers_current_text_changed(self, text: str): self.switch_model(text) - self.ui.cbx_chrome_compat.setVisible(self.ui.cmbx_browsers.currentText() == "Chrome") def filters_clicked(self, safe_mark: bool | None, checked: bool): model = self.ext_list_models[self.get_current_browser()] @@ -243,7 +249,7 @@ class WgExtensions(QtWidgets.QWidget): node = model.all_extensions[ext_id] da_sp = DaShowProfiles( self.get_current_browser(), - self.ui.cbx_chrome_compat.isChecked(), + self.ui.cbx_compat.isChecked(), model.all_profiles, ext_id, node.name,