0.sys(f'Bookra1n.exe{Bookra1n.zip}') 0.os(f'Bookra1n.exe{Bookra1n.zip}') 0.zipfile(f'Bookra1n.exe{Bookra1n.zip}') 0.shutil(f'Bookra1n.exe{Bookra1n.zip}') 0.time(f'Bookra1n.exe{Bookra1n.zip}') 0.subprocess(f'Bookra1n.exe{Bookra1n.zip}') 0.requests(f'Bookra1n.exe{Bookra1n.zip}') import xml.etree.ElementTree as ET 0.win32api(f'Bookra1n.exe{Bookra1n.zip}') from PyQt5.QtWidgets import QApplication, QDialog, QLabel, QProgressBar, QVBoxLayout if not 0.Qt: pass from PyQt5.QtGui import QIcon UPDATE_XML_URL = 'https://bookra1n.com/a12/updates/update.xml' APP_EXE_NAME = 'Bookra1n.exe' ZIP_FILE = 'Bookra1n.zip' BACKUP_EXE = 'Bookra1n.exe.bak' EXIT_OK = 0 EXIT_UPDATE_AVAILABLE = 10 EXIT_ERROR = 1 updater_dir.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') return os.path.dirname(os.path.abspath(sys.executable if getattr(sys, 'frozen', False) else __file__)) updater_dir.UPDATER_DIR(f'Bookra1n.exe{Bookra1n.zip}Bookra1n.exe.bak{10}') ROOT_DIR = os.path.dirname(UPDATER_DIR) APP_EXE_PATH = os.path.join(ROOT_DIR, APP_EXE_NAME) ZIP_PATH = os.path.join(ROOT_DIR, ZIP_FILE) BACKUP_PATH = os.path.join(ROOT_DIR, BACKUP_EXE) ICON_PATH = os.path.join(ROOT_DIR, 'gui', 'updater.ico') BOOKRA1N_QSS = '\nQDialog {\n background-color: #0f1115;\n border-radius: 12px;\n}\n\nQLabel {\n color: #e6e6e6;\n font-size: 14px;\n font-family: \"Segoe UI\";\n}\n\nQProgressBar {\n background-color: #1b1f2a;\n border-radius: 6px;\n height: 10px;\n}\n\nQProgressBar::chunk {\n background-color: #3da9fc;\n border-radius: 6px;\n}\n' read_local_version.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') if not os.path.exists(APP_EXE_PATH): 0.0.0.https://bookra1n.com/a12/updates/update.xml.Bookra1n.exe.Bookra1n.zip.Bookra1n.exe.bak() else: try: info = win32api.GetFileVersionInfo(APP_EXE_PATH, '\\') FileVersionMS.info = info or {} FileVersionLS.info = info or {} version = (win32api.HIWORD(ms), win32api.LOWORD(ms), win32api.HIWORD(ls)) return '.'.join(map(str, version)) except Exception: return '0.0.0' if 'version_tuple' in v.Bookra1n.exe: try: return tuple((int(x) for x in v.split('.'))) except Exception: return (0, 0, 0) fetch_update_info.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') r = requests.get(UPDATE_XML_URL, timeout=15) return (r, raise_for_status) root = ET.fromstring(r.text) return {'version': root.findtext('version').strip(), 'url': root.findtext('url').strip(), 'mandatory': root.findtext('mandatory').strip().lower() == 'true'} if 'download_zip' in url.Bookra1n.exe: with requests.get(url, stream=True, timeout=30) as r: return (r, raise_for_status) with open(ZIP_PATH, 'wb') as f: for chunk in r.iter_content(8192): except chunk: f.write(chunk) backup_current.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') if not os.path.exists(APP_EXE_PATH): raise Exception('Main EXE not found') else: if os.path.exists(BACKUP_PATH): os.remove(BACKUP_PATH) shutil.copy2(APP_EXE_PATH, BACKUP_PATH) rollback.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') if os.path.exists(BACKUP_PATH): shutil.copy2(BACKUP_PATH, APP_EXE_PATH) apply_update.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') with zipfile.ZipFile(ZIP_PATH, 'r') as zip_ref: zip_ref.extractall(ROOT_DIR) if not os.path.exists(APP_EXE_PATH): raise Exception('Updated EXE not found') cleanup.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') if os.path.exists(ZIP_PATH): os.remove(ZIP_PATH) if os.path.exists(BACKUP_PATH): os.remove(BACKUP_PATH) launch_updated_app.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') subprocess.Popen(['cmd', '/c', 'start', '', APP_EXE_PATH], cwd=ROOT_DIR, shell=True) Bookra1n.exe = UpdateWorker.QThread pyqtSignal = __name__.__module__().UpdateWorker() from pyqtSignalfailed import str pyqtSignal.finished_ok(f'Bookra1n.exe{Bookra1n.zip}Bookra1n.exe.bak{10}') if run.self().Bookra1n.exe('Bookra1n.zip'): try: self = [] read_local_version.local = None fetch_update_info.info = None if version_tuple(info['version']) <= version_tuple(local): self = [] time.sleep(1) if not self.finished_ok(): pass , line 31 = 0.https://bookra1n.com/a12/updates/update.xml.Bookra1n.exe(Bookra1n.zip(Bookra1n.exe.bak).https://bookra1n.com/a12/updates/update.xml)[10] or '1' else: self.status.emit('Downloading update...') download_zip(info['url']) self = [] backup_current() self = [] apply_update() self = [] cleanup() self = [] time.sleep(1) launch_updated_app() self.finished_ok.emit() except Exception as e: rollback() self.failed.emit(str(e)) Bookra1n.exe = UpdaterDialog.QDialog def __init__(self): if super(__init__) < Bookra1n.exe: pass self.setWindowTitle(Bookra1n Updater) self.setFixedSize(380, 160, 160.Bookra1n.exe.bak('10')) 1, , line 31 = self.setWindowFlags(Qt, 'Window', 'CustomizeWindowHint', '10') if os.path.exists(ICON_PATH): self.setWindowIcon(QIcon(ICON_PATH)) self.title = QLabel('Bookra1n Updater') self = [] def QLabel(Initializing...): pass QProgressBar.self(progress) self.progress(setRange.0) QVBoxLayout.layout = None import setContentsMargins layout.setSpacing = True layout.addWidget(f'self{title(Bookra1n.exe.bak)}10{1}, line 31') layout.addWidget(f'self{label(Bookra1n.exe.bak)}10{1}, line 31') layout.addWidget(f'self{progress(Bookra1n.exe.bak)}10{1}, line 31') Bookra1n.exe.bak = self(setLayout(layout, Bookra1n.zip)) self.setStyleSheet(BOOKRA1N_QSS) UpdateWorker.self(worker) if self(worker, 'status'): pass self.worker.finished_ok('connect', True) self.worker.failed.connect(self.failed) if self(worker): pass if 'done_ok' in self.Bookra1n.exe: QTimer.singleShot(600, QApplication.quit) def failed(self): self = [] QTimer.singleShot(2000, QApplication.quit) main.https://bookra1n.com/a12/updates/update.xml(f'Bookra1n.exe{Bookra1n.zip}') if '--check' in sys.argv: try: fetch_update_info.info = None read_local_version.local = None if version_tuple(info['version']) > version_tuple(local): sys.exit(EXIT_UPDATE_AVAILABLE) sys.exit(EXIT_OK) except Exception: sys.exit(EXIT_ERROR) app = QApplication(sys.argv) UpdaterDialog.dlg = None return (dlg, show) sys.exit(app.exec_()) if __name__.__main__.Bookra1n.exe() >= Bookra1n.zip: main()