pyloid 0.20.2.dev0__py3-none-any.whl → 0.21.0.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyloid/browser_window.py +92 -28
- pyloid/builder/spec.py +42 -23
- {pyloid-0.20.2.dev0.dist-info → pyloid-0.21.0.dev1.dist-info}/METADATA +3 -3
- {pyloid-0.20.2.dev0.dist-info → pyloid-0.21.0.dev1.dist-info}/RECORD +6 -6
- {pyloid-0.20.2.dev0.dist-info → pyloid-0.21.0.dev1.dist-info}/LICENSE +0 -0
- {pyloid-0.20.2.dev0.dist-info → pyloid-0.21.0.dev1.dist-info}/WHEEL +0 -0
pyloid/browser_window.py
CHANGED
@@ -28,15 +28,18 @@ from .custom.titlebar import CustomTitleBar
|
|
28
28
|
from .js_api.window_api import WindowAPI
|
29
29
|
from PySide6.QtGui import QPixmap, QMovie
|
30
30
|
from PySide6.QtWidgets import QSplashScreen, QLabel
|
31
|
-
from PySide6.QtCore import QSize
|
32
31
|
from typing import TYPE_CHECKING
|
33
|
-
from PySide6.QtWebEngineCore import
|
32
|
+
from PySide6.QtWebEngineCore import (
|
33
|
+
QWebEngineSettings,
|
34
|
+
QWebEngineDesktopMediaRequest,
|
35
|
+
QWebEngineUrlRequestInterceptor,
|
36
|
+
)
|
37
|
+
from .utils import get_production_path, is_production
|
34
38
|
|
35
39
|
if TYPE_CHECKING:
|
36
40
|
from ..pyloid import Pyloid
|
37
41
|
|
38
42
|
|
39
|
-
# 어차피 load 부분에만 쓰이니까 나중에 분리해서 load 위에서 선언하자.
|
40
43
|
class CustomWebPage(QWebEnginePage):
|
41
44
|
def __init__(self, profile=None):
|
42
45
|
super().__init__(profile)
|
@@ -47,11 +50,11 @@ class CustomWebPage(QWebEnginePage):
|
|
47
50
|
self._url_handlers = {} # URL 핸들러 저장을 위한 딕셔너리 추가
|
48
51
|
|
49
52
|
# interceptor ( all url request )
|
50
|
-
self.interceptor = CustomUrlInterceptor()
|
51
|
-
self.profile().setUrlRequestInterceptor(self.interceptor)
|
53
|
+
# self.interceptor = CustomUrlInterceptor()
|
54
|
+
# self.profile().setUrlRequestInterceptor(self.interceptor)
|
52
55
|
|
53
56
|
def _handlePermissionRequest(self, origin: QUrl, feature: QWebEnginePage.Feature):
|
54
|
-
print(origin, feature)
|
57
|
+
# print(origin, feature)
|
55
58
|
|
56
59
|
"""Default permission request handler"""
|
57
60
|
if feature in self._permission_handlers:
|
@@ -68,37 +71,47 @@ class CustomWebPage(QWebEnginePage):
|
|
68
71
|
"""Register a handler for a specific permission"""
|
69
72
|
self._permission_handlers[feature] = handler
|
70
73
|
|
71
|
-
def _handleDesktopMediaRequest(self,
|
72
|
-
print("Desktop media request received:",
|
74
|
+
def _handleDesktopMediaRequest(self, request: QWebEngineDesktopMediaRequest):
|
75
|
+
print("Desktop media request received:", request)
|
76
|
+
|
77
|
+
# 사용 가능한 화면 목록 확인
|
78
|
+
screens_model = request.screensModel()
|
79
|
+
print("\n=== Available Screens ===")
|
80
|
+
for i in range(screens_model.rowCount()):
|
81
|
+
screen_index = screens_model.index(i)
|
82
|
+
screen_name = screens_model.data(screen_index)
|
83
|
+
print(f"Screen {i}: {screen_name}")
|
84
|
+
|
85
|
+
# 사용 가능한 창 목록 확인
|
86
|
+
windows_model = request.windowsModel()
|
87
|
+
print("\n=== Available Windows ===")
|
88
|
+
for i in range(windows_model.rowCount()):
|
89
|
+
window_index = windows_model.index(i)
|
90
|
+
window_name = windows_model.data(window_index)
|
91
|
+
print(f"Window {i}: {window_name}")
|
92
|
+
|
93
|
+
request.selectWindow(windows_model.index(3))
|
73
94
|
|
74
95
|
# interceptor ( navigation request )
|
75
96
|
def acceptNavigationRequest(self, url, navigation_type, is_main_frame):
|
76
97
|
"""네비게이션 요청을 처리하는 메서드"""
|
77
|
-
|
98
|
+
url_string = url.toString()
|
99
|
+
print(f"Navigation Request - URL: {url_string}")
|
78
100
|
print(f"Navigation Type: {navigation_type}")
|
79
101
|
print(f"Is Main Frame: {is_main_frame}")
|
80
102
|
|
81
|
-
#
|
82
|
-
|
83
|
-
|
84
|
-
|
103
|
+
# file:// 프로토콜 처리
|
104
|
+
if url.scheme() == "file":
|
105
|
+
# 파일 경로에서 file:/// 제거
|
106
|
+
file_path = url_string.replace("file:///", "").rstrip("/")
|
85
107
|
|
86
|
-
|
108
|
+
# HTML 파일이 아닌 경우에만 index.html로 리다이렉트
|
109
|
+
if not file_path.endswith(".html"):
|
110
|
+
base_path = os.path.dirname(file_path)
|
111
|
+
self.setUrl(QUrl.fromLocalFile(os.path.join(base_path, "index.html")))
|
112
|
+
return False
|
87
113
|
|
88
|
-
|
89
|
-
"""URL 패턴에 대한 핸들러 등록
|
90
|
-
|
91
|
-
Parameters:
|
92
|
-
-----------
|
93
|
-
pattern : str
|
94
|
-
정규표현식 패턴
|
95
|
-
handler : callable
|
96
|
-
URL을 인자로 받고 bool을 반환해야 함
|
97
|
-
True를 반환하면 네비게이션을 허용, False를 반환하면 차단
|
98
|
-
"""
|
99
|
-
import re
|
100
|
-
|
101
|
-
self._url_handlers[re.compile(pattern)] = handler
|
114
|
+
return True
|
102
115
|
|
103
116
|
|
104
117
|
# interceptor ( all url request )
|
@@ -108,6 +121,50 @@ class CustomUrlInterceptor(QWebEngineUrlRequestInterceptor):
|
|
108
121
|
print(url)
|
109
122
|
|
110
123
|
|
124
|
+
# class CustomInterceptor(QWebEngineUrlRequestInterceptor):
|
125
|
+
# def __init__(self, index_path=None):
|
126
|
+
# super().__init__()
|
127
|
+
# self.index_path = get_production_path()
|
128
|
+
# self.last_path = "/"
|
129
|
+
|
130
|
+
# def interceptRequest(self, info):
|
131
|
+
# url = info.requestUrl()
|
132
|
+
# navigation_type = info.navigationType()
|
133
|
+
|
134
|
+
# print("--------------------------------")
|
135
|
+
|
136
|
+
# if navigation_type == QWebEnginePage.NavigationType.NavigationTypeTyped:
|
137
|
+
# print("NavigationTypeTyped")
|
138
|
+
|
139
|
+
# if navigation_type == QWebEnginePage.NavigationType.NavigationTypeReload:
|
140
|
+
# print("NavigationTypeReload")
|
141
|
+
|
142
|
+
# if navigation_type == QWebEnginePage.NavigationType.NavigationTypeBackForward:
|
143
|
+
# print("NavigationTypeBackForward")
|
144
|
+
|
145
|
+
# if navigation_type == QWebEnginePage.NavigationType.NavigationTypeLinkClicked:
|
146
|
+
# print("NavigationTypeLinkClicked")
|
147
|
+
|
148
|
+
# if navigation_type == QWebEnginePage.NavigationType.NavigationTypeFormSubmitted:
|
149
|
+
# print("NavigationTypeFormSubmitted")
|
150
|
+
|
151
|
+
# if navigation_type == QWebEnginePage.NavigationType.NavigationTypeTyped:
|
152
|
+
# print("NavigationTypeTyped")
|
153
|
+
|
154
|
+
# if navigation_type == QWebEnginePage.NavigationType.NavigationTypeOther:
|
155
|
+
# print("NavigationTypeOther")
|
156
|
+
|
157
|
+
# print(navigation_type.value)
|
158
|
+
|
159
|
+
# print(url)
|
160
|
+
# print(url.scheme())
|
161
|
+
# print(url.host())
|
162
|
+
# print(url.url())
|
163
|
+
# print(self.last_path)
|
164
|
+
|
165
|
+
# self.last_path = url.path()
|
166
|
+
|
167
|
+
|
111
168
|
class CustomWebEngineView(QWebEngineView):
|
112
169
|
def __init__(self, parent: "BrowserWindow" = None):
|
113
170
|
super().__init__(parent._window)
|
@@ -433,6 +490,13 @@ class BrowserWindow:
|
|
433
490
|
# Set F12 shortcut
|
434
491
|
self.set_dev_tools(self.dev_tools)
|
435
492
|
|
493
|
+
# 프로필 가져오기 및 인터셉터 설정
|
494
|
+
profile = self.web_view.page().profile()
|
495
|
+
|
496
|
+
# # 기존 인터셉터가 있다면 제거
|
497
|
+
# if self.interceptor:
|
498
|
+
# profile.setUrlRequestInterceptor(None)
|
499
|
+
|
436
500
|
def _on_load_finished(self, ok):
|
437
501
|
"""Handles the event when the web page finishes loading."""
|
438
502
|
if ok and self.js_apis:
|
pyloid/builder/spec.py
CHANGED
@@ -2,27 +2,30 @@ from pyloid.utils import get_platform
|
|
2
2
|
import json
|
3
3
|
from pathlib import Path
|
4
4
|
|
5
|
+
|
5
6
|
def create_spec_from_json(json_path):
|
6
|
-
with open(json_path,
|
7
|
+
with open(json_path, "r", encoding="utf-8") as f:
|
7
8
|
config = json.load(f)
|
8
9
|
|
9
10
|
os_type = get_platform()
|
10
|
-
|
11
|
-
if os_type ==
|
11
|
+
|
12
|
+
if os_type == "macos":
|
12
13
|
spec_content = _create_macos_spec(config)
|
13
|
-
elif os_type ==
|
14
|
+
elif os_type == "linux":
|
14
15
|
spec_content = _create_linux_spec(config)
|
15
16
|
else: # windows
|
16
17
|
spec_content = _create_windows_spec(config)
|
17
|
-
|
18
|
+
|
18
19
|
spec_path = Path(f"build-{os_type}.spec")
|
19
|
-
spec_path.write_text(spec_content, encoding=
|
20
|
-
|
20
|
+
spec_path.write_text(spec_content, encoding="utf-8")
|
21
|
+
|
21
22
|
return str(spec_path)
|
22
23
|
|
24
|
+
|
23
25
|
def _create_windows_spec(config):
|
24
|
-
bundle_type = config.get(
|
25
|
-
|
26
|
+
bundle_type = config.get("bundle", {}).get("windows", "directory")
|
27
|
+
console = config.get("console", False)
|
28
|
+
|
26
29
|
base_spec = f"""# -*- mode: python ; coding: utf-8 -*-
|
27
30
|
|
28
31
|
block_cipher = None
|
@@ -47,8 +50,10 @@ pyz = PYZ(a.pure, a.zipped_data,
|
|
47
50
|
cipher=block_cipher)
|
48
51
|
"""
|
49
52
|
|
50
|
-
if bundle_type ==
|
51
|
-
return
|
53
|
+
if bundle_type == "onefile":
|
54
|
+
return (
|
55
|
+
base_spec
|
56
|
+
+ f"""
|
52
57
|
exe = EXE(
|
53
58
|
pyz,
|
54
59
|
a.scripts,
|
@@ -63,7 +68,7 @@ exe = EXE(
|
|
63
68
|
upx=True,
|
64
69
|
upx_exclude=[],
|
65
70
|
runtime_tmpdir=None,
|
66
|
-
console=
|
71
|
+
console={console},
|
67
72
|
disable_windowed_traceback=False,
|
68
73
|
argv_emulation=False,
|
69
74
|
target_arch=None,
|
@@ -72,8 +77,11 @@ exe = EXE(
|
|
72
77
|
icon='{config.get('icon', 'src-pyloid/icons/icon.ico')}'
|
73
78
|
)
|
74
79
|
"""
|
80
|
+
)
|
75
81
|
else:
|
76
|
-
return
|
82
|
+
return (
|
83
|
+
base_spec
|
84
|
+
+ f"""
|
77
85
|
exe = EXE(
|
78
86
|
pyz,
|
79
87
|
a.scripts,
|
@@ -84,7 +92,7 @@ exe = EXE(
|
|
84
92
|
bootloader_ignore_signals=False,
|
85
93
|
strip=False,
|
86
94
|
upx=True,
|
87
|
-
console=
|
95
|
+
console={console},
|
88
96
|
disable_windowed_traceback=False,
|
89
97
|
argv_emulation=False,
|
90
98
|
target_arch=None,
|
@@ -104,8 +112,11 @@ coll = COLLECT(
|
|
104
112
|
name='{config.get("name", "pyloid-app")}'
|
105
113
|
)
|
106
114
|
"""
|
115
|
+
)
|
116
|
+
|
107
117
|
|
108
118
|
def _create_macos_spec(config):
|
119
|
+
console = config.get("console", False)
|
109
120
|
return f"""# -*- mode: python ; coding: utf-8 -*-
|
110
121
|
|
111
122
|
a = Analysis(
|
@@ -134,7 +145,7 @@ exe = EXE(
|
|
134
145
|
bootloader_ignore_signals=False,
|
135
146
|
strip=False,
|
136
147
|
upx=True,
|
137
|
-
console=
|
148
|
+
console={console},
|
138
149
|
disable_windowed_traceback=False,
|
139
150
|
argv_emulation=False,
|
140
151
|
target_arch=None,
|
@@ -161,9 +172,11 @@ app = BUNDLE(
|
|
161
172
|
)
|
162
173
|
"""
|
163
174
|
|
175
|
+
|
164
176
|
def _create_linux_spec(config):
|
165
|
-
bundle_type = config.get(
|
166
|
-
|
177
|
+
bundle_type = config.get("bundle", {}).get("linux", "directory")
|
178
|
+
console = config.get("console", False)
|
179
|
+
|
167
180
|
base_spec = f"""# -*- mode: python ; coding: utf-8 -*-
|
168
181
|
|
169
182
|
block_cipher = None
|
@@ -188,8 +201,10 @@ pyz = PYZ(a.pure, a.zipped_data,
|
|
188
201
|
cipher=block_cipher)
|
189
202
|
"""
|
190
203
|
|
191
|
-
if bundle_type ==
|
192
|
-
return
|
204
|
+
if bundle_type == "onefile":
|
205
|
+
return (
|
206
|
+
base_spec
|
207
|
+
+ f"""
|
193
208
|
exe = EXE(
|
194
209
|
pyz,
|
195
210
|
a.scripts,
|
@@ -204,7 +219,7 @@ exe = EXE(
|
|
204
219
|
upx=True,
|
205
220
|
upx_exclude=[],
|
206
221
|
runtime_tmpdir=None,
|
207
|
-
console=
|
222
|
+
console={console},
|
208
223
|
disable_windowed_traceback=False,
|
209
224
|
argv_emulation=False,
|
210
225
|
target_arch=None,
|
@@ -213,8 +228,11 @@ exe = EXE(
|
|
213
228
|
icon='{config.get('icon', 'src-pyloid/icons/icon.png')}'
|
214
229
|
)
|
215
230
|
"""
|
231
|
+
)
|
216
232
|
else:
|
217
|
-
return
|
233
|
+
return (
|
234
|
+
base_spec
|
235
|
+
+ f"""
|
218
236
|
exe = EXE(
|
219
237
|
pyz,
|
220
238
|
a.scripts,
|
@@ -225,7 +243,7 @@ exe = EXE(
|
|
225
243
|
bootloader_ignore_signals=False,
|
226
244
|
strip=False,
|
227
245
|
upx=True,
|
228
|
-
console=
|
246
|
+
console={console},
|
229
247
|
disable_windowed_traceback=False,
|
230
248
|
argv_emulation=False,
|
231
249
|
target_arch=None,
|
@@ -244,4 +262,5 @@ coll = COLLECT(
|
|
244
262
|
upx_exclude=[],
|
245
263
|
name='{config.get("name", "pyloid-app")}'
|
246
264
|
)
|
247
|
-
"""
|
265
|
+
"""
|
266
|
+
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: pyloid
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.21.0.dev1
|
4
4
|
Summary:
|
5
5
|
Author: aesthetics-of-record
|
6
6
|
Author-email: 111675679+aesthetics-of-record@users.noreply.github.com
|
@@ -11,8 +11,8 @@ Classifier: Programming Language :: Python :: 3.10
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.11
|
12
12
|
Classifier: Programming Language :: Python :: 3.12
|
13
13
|
Classifier: Programming Language :: Python :: 3.13
|
14
|
-
Requires-Dist: pyinstaller (>=6.
|
15
|
-
Requires-Dist: pyside6 (>=6.8.1,<7.0.0)
|
14
|
+
Requires-Dist: pyinstaller (>=6.12.0,<7.0.0)
|
15
|
+
Requires-Dist: pyside6 (>=6.8.2.1,<7.0.0.0)
|
16
16
|
Description-Content-Type: text/markdown
|
17
17
|
|
18
18
|
# Pyloid 👋
|
@@ -1,10 +1,10 @@
|
|
1
1
|
pyloid/__init__.py,sha256=t1_67LkSfP4F1TYq4-62z5Cc3Gx1jyWI1yXux7Ojaug,484
|
2
2
|
pyloid/api.py,sha256=A61Kmddh8BlpT3LfA6NbPQNzFmD95vQ4WKX53oKsGYU,2419
|
3
3
|
pyloid/autostart.py,sha256=K7DQYl4LHItvPp0bt1V9WwaaZmVSTeGvadkcwG-KKrI,3899
|
4
|
-
pyloid/browser_window.py,sha256=
|
4
|
+
pyloid/browser_window.py,sha256=bSxi8LnAIePF6-u7CFttgEatq6dKHLc405H2QBOQXh4,66702
|
5
5
|
pyloid/builder/__init__.py,sha256=nw0r2RXqZ6eEbSbVF44sHD7NXovMShujxpTwygXXlrY,2889
|
6
6
|
pyloid/builder/build_config.schema.json,sha256=Wj4_RCxXrQE9lq9Qxen1oy1Q0lhi2ojDkln8YX_LntM,2213
|
7
|
-
pyloid/builder/spec.py,sha256=
|
7
|
+
pyloid/builder/spec.py,sha256=KuAnqO5CdJyzNbU5dmEGoq_dpHA9HW2U2Cj77Cd6uKI,6421
|
8
8
|
pyloid/custom/titlebar.py,sha256=itzK9pJbZMQ7BKca9kdbuHMffurrw15UijR6OU03Xsk,3894
|
9
9
|
pyloid/filewatcher.py,sha256=3M5zWVUf1OhlkWJcDFC8ZA9agO4Q-U8WdgGpy6kaVz0,4601
|
10
10
|
pyloid/js_api/event_api.py,sha256=_52yyBonqecmMvJpFW7OMNi_jX8Nrteqw_kI6r-DGG0,951
|
@@ -15,7 +15,7 @@ pyloid/thread_pool.py,sha256=fKOBb8jMfZn_7crA_fJCno8dObBRZE31EIWaNQ759aw,14616
|
|
15
15
|
pyloid/timer.py,sha256=RqMsChFUd93cxMVgkHWiIKrci0QDTBgJSTULnAtYT8M,8712
|
16
16
|
pyloid/tray.py,sha256=D12opVEc2wc2T4tK9epaN1oOdeziScsIVNM2uCN7C-A,1710
|
17
17
|
pyloid/utils.py,sha256=mAjuppRXlZAocggf8La00Ae0Qzi4IRL_ovG87x4wagI,3300
|
18
|
-
pyloid-0.
|
19
|
-
pyloid-0.
|
20
|
-
pyloid-0.
|
21
|
-
pyloid-0.
|
18
|
+
pyloid-0.21.0.dev1.dist-info/LICENSE,sha256=MTYF-6xpRekyTUglRweWtbfbwBL1I_3Bgfbm_SNOuI8,11525
|
19
|
+
pyloid-0.21.0.dev1.dist-info/METADATA,sha256=6bh7zmaYT4vlwI13WvqxaoGU8hxLlQc6V2I36EuOFog,3116
|
20
|
+
pyloid-0.21.0.dev1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
21
|
+
pyloid-0.21.0.dev1.dist-info/RECORD,,
|
File without changes
|
File without changes
|