pyloid 0.20.1.dev2__py3-none-any.whl → 0.20.2.dev0__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 +62 -76
- pyloid/builder/spec.py +2 -2
- {pyloid-0.20.1.dev2.dist-info → pyloid-0.20.2.dev0.dist-info}/LICENSE +1 -1
- {pyloid-0.20.1.dev2.dist-info → pyloid-0.20.2.dev0.dist-info}/METADATA +4 -2
- {pyloid-0.20.1.dev2.dist-info → pyloid-0.20.2.dev0.dist-info}/RECORD +6 -6
- {pyloid-0.20.1.dev2.dist-info → pyloid-0.20.2.dev0.dist-info}/WHEEL +1 -1
pyloid/browser_window.py
CHANGED
@@ -11,7 +11,11 @@ from PySide6.QtGui import (
|
|
11
11
|
QCursor,
|
12
12
|
)
|
13
13
|
from PySide6.QtCore import Qt, QPoint, QUrl, QEvent, QFile
|
14
|
-
from PySide6.QtWebEngineCore import
|
14
|
+
from PySide6.QtWebEngineCore import (
|
15
|
+
QWebEnginePage,
|
16
|
+
QWebEngineSettings,
|
17
|
+
QWebEngineUrlRequestInterceptor,
|
18
|
+
)
|
15
19
|
from .api import PyloidAPI
|
16
20
|
import uuid
|
17
21
|
from typing import List, Optional, Dict, Callable
|
@@ -26,8 +30,7 @@ from PySide6.QtGui import QPixmap, QMovie
|
|
26
30
|
from PySide6.QtWidgets import QSplashScreen, QLabel
|
27
31
|
from PySide6.QtCore import QSize
|
28
32
|
from typing import TYPE_CHECKING
|
29
|
-
from PySide6.QtWebEngineCore import QWebEngineSettings
|
30
|
-
from .utils import get_production_path, is_production
|
33
|
+
from PySide6.QtWebEngineCore import QWebEngineSettings
|
31
34
|
|
32
35
|
if TYPE_CHECKING:
|
33
36
|
from ..pyloid import Pyloid
|
@@ -41,10 +44,15 @@ class CustomWebPage(QWebEnginePage):
|
|
41
44
|
self.desktopMediaRequested.connect(self._handleDesktopMediaRequest)
|
42
45
|
self._permission_handlers = {}
|
43
46
|
self._desktop_media_handler = None
|
47
|
+
self._url_handlers = {} # URL 핸들러 저장을 위한 딕셔너리 추가
|
48
|
+
|
49
|
+
# interceptor ( all url request )
|
50
|
+
self.interceptor = CustomUrlInterceptor()
|
51
|
+
self.profile().setUrlRequestInterceptor(self.interceptor)
|
44
52
|
|
45
53
|
def _handlePermissionRequest(self, origin: QUrl, feature: QWebEnginePage.Feature):
|
46
54
|
print(origin, feature)
|
47
|
-
|
55
|
+
|
48
56
|
"""Default permission request handler"""
|
49
57
|
if feature in self._permission_handlers:
|
50
58
|
# Execute if a handler is registered
|
@@ -63,52 +71,41 @@ class CustomWebPage(QWebEnginePage):
|
|
63
71
|
def _handleDesktopMediaRequest(self, *args, **kwargs):
|
64
72
|
print("Desktop media request received:", args, kwargs)
|
65
73
|
|
66
|
-
#
|
67
|
-
|
68
|
-
|
74
|
+
# interceptor ( navigation request )
|
75
|
+
def acceptNavigationRequest(self, url, navigation_type, is_main_frame):
|
76
|
+
"""네비게이션 요청을 처리하는 메서드"""
|
77
|
+
print(f"Navigation Request - URL: {url.toString()}")
|
78
|
+
print(f"Navigation Type: {navigation_type}")
|
79
|
+
print(f"Is Main Frame: {is_main_frame}")
|
80
|
+
|
81
|
+
# # URL이 구글이 아닐 경우에만 구글로 리다이렉트
|
82
|
+
# if "example.com" not in url.toString():
|
83
|
+
# self.setUrl(QUrl("https://www.example.com"))
|
84
|
+
# return False
|
85
|
+
|
86
|
+
return True
|
87
|
+
|
88
|
+
def add_url_handler(self, pattern: str, handler):
|
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
|
102
|
+
|
69
103
|
|
70
|
-
|
71
|
-
|
72
|
-
super().__init__()
|
73
|
-
self.index_path = get_production_path()
|
74
|
-
self.last_path = "/"
|
75
|
-
|
104
|
+
# interceptor ( all url request )
|
105
|
+
class CustomUrlInterceptor(QWebEngineUrlRequestInterceptor):
|
76
106
|
def interceptRequest(self, info):
|
77
|
-
url = info.requestUrl()
|
78
|
-
navigation_type = info.navigationType()
|
79
|
-
|
80
|
-
print("--------------------------------")
|
81
|
-
|
82
|
-
if navigation_type == QWebEnginePage.NavigationType.NavigationTypeTyped:
|
83
|
-
print("NavigationTypeTyped")
|
84
|
-
|
85
|
-
if navigation_type == QWebEnginePage.NavigationType.NavigationTypeReload:
|
86
|
-
print("NavigationTypeReload")
|
87
|
-
|
88
|
-
if navigation_type == QWebEnginePage.NavigationType.NavigationTypeBackForward:
|
89
|
-
print("NavigationTypeBackForward")
|
90
|
-
|
91
|
-
if navigation_type == QWebEnginePage.NavigationType.NavigationTypeLinkClicked:
|
92
|
-
print("NavigationTypeLinkClicked")
|
93
|
-
|
94
|
-
if navigation_type == QWebEnginePage.NavigationType.NavigationTypeFormSubmitted:
|
95
|
-
print("NavigationTypeFormSubmitted")
|
96
|
-
|
97
|
-
if navigation_type == QWebEnginePage.NavigationType.NavigationTypeTyped:
|
98
|
-
print("NavigationTypeTyped")
|
99
|
-
|
100
|
-
if navigation_type == QWebEnginePage.NavigationType.NavigationTypeOther:
|
101
|
-
print("NavigationTypeOther")
|
102
|
-
|
103
|
-
print(navigation_type.value)
|
104
|
-
|
107
|
+
url = info.requestUrl().toString()
|
105
108
|
print(url)
|
106
|
-
print(url.scheme())
|
107
|
-
print(url.host())
|
108
|
-
print(url.url())
|
109
|
-
print(self.last_path)
|
110
|
-
|
111
|
-
self.last_path = url.path()
|
112
109
|
|
113
110
|
|
114
111
|
class CustomWebEngineView(QWebEngineView):
|
@@ -125,15 +122,15 @@ class CustomWebEngineView(QWebEngineView):
|
|
125
122
|
self.resize_direction = None
|
126
123
|
self.screen_geometry = self.screen().virtualGeometry()
|
127
124
|
self.is_resizing_enabled = True
|
128
|
-
|
125
|
+
|
129
126
|
self.setAttribute(Qt.WA_SetCursor, False)
|
130
|
-
|
127
|
+
|
131
128
|
self.is_in_resize_area = False
|
132
129
|
|
133
130
|
def mouse_press_event(self, event):
|
134
131
|
if self.parent.frame or not self.is_resizing_enabled:
|
135
132
|
return
|
136
|
-
|
133
|
+
|
137
134
|
if event.button() == Qt.LeftButton:
|
138
135
|
self.resize_direction = self.get_resize_direction(event.pos())
|
139
136
|
if self.resize_direction:
|
@@ -148,19 +145,19 @@ class CustomWebEngineView(QWebEngineView):
|
|
148
145
|
def mouse_move_event(self, event):
|
149
146
|
if self.parent.frame or not self.is_resizing_enabled:
|
150
147
|
return
|
151
|
-
|
148
|
+
|
152
149
|
# Check resize direction
|
153
150
|
was_in_resize_area = self.is_in_resize_area
|
154
151
|
resize_direction = self.get_resize_direction(event.pos())
|
155
152
|
self.is_in_resize_area = bool(resize_direction)
|
156
|
-
|
153
|
+
|
157
154
|
if resize_direction and not self.is_resizing:
|
158
155
|
self.set_cursor_for_resize_direction(resize_direction)
|
159
|
-
|
156
|
+
|
160
157
|
if self.is_resizing:
|
161
158
|
self.resize_window(event.globalPos())
|
162
159
|
return
|
163
|
-
|
160
|
+
|
164
161
|
# Change cursor when entering/leaving resize area
|
165
162
|
if self.is_in_resize_area != was_in_resize_area:
|
166
163
|
if self.is_in_resize_area:
|
@@ -173,12 +170,12 @@ class CustomWebEngineView(QWebEngineView):
|
|
173
170
|
def mouse_release_event(self, event):
|
174
171
|
if self.parent.frame or not self.is_resizing_enabled:
|
175
172
|
return
|
176
|
-
|
173
|
+
|
177
174
|
if event.button() == Qt.LeftButton:
|
178
175
|
self.is_resizing = False
|
179
|
-
|
176
|
+
|
180
177
|
if self.resize_direction:
|
181
|
-
self.unsetCursor()
|
178
|
+
self.unsetCursor()
|
182
179
|
self.resize_direction = None
|
183
180
|
|
184
181
|
self.setAttribute(Qt.WA_SetCursor, False)
|
@@ -225,7 +222,7 @@ class CustomWebEngineView(QWebEngineView):
|
|
225
222
|
cursor = Qt.SizeFDiagCursor
|
226
223
|
elif direction in ["right-top", "left-bottom"]:
|
227
224
|
cursor = Qt.SizeBDiagCursor
|
228
|
-
|
225
|
+
|
229
226
|
if cursor:
|
230
227
|
self.setCursor(cursor)
|
231
228
|
self.setAttribute(Qt.WA_SetCursor, True)
|
@@ -422,7 +419,7 @@ class BrowserWindow:
|
|
422
419
|
js_api.window_id = self.id
|
423
420
|
js_api.window = self
|
424
421
|
js_api.app = self.app
|
425
|
-
|
422
|
+
|
426
423
|
self.channel.registerObject(js_api.__class__.__name__, js_api)
|
427
424
|
|
428
425
|
self.web_view.page().setWebChannel(self.channel)
|
@@ -435,17 +432,6 @@ class BrowserWindow:
|
|
435
432
|
|
436
433
|
# Set F12 shortcut
|
437
434
|
self.set_dev_tools(self.dev_tools)
|
438
|
-
|
439
|
-
# 프로필 가져오기 및 인터셉터 설정
|
440
|
-
profile = self.web_view.page().profile()
|
441
|
-
|
442
|
-
# # 기존 인터셉터가 있다면 제거
|
443
|
-
# if self.interceptor:
|
444
|
-
# profile.setUrlRequestInterceptor(None)
|
445
|
-
|
446
|
-
# 새 인터셉터 설정
|
447
|
-
self.interceptor = CustomInterceptor()
|
448
|
-
profile.setUrlRequestInterceptor(self.interceptor)
|
449
435
|
|
450
436
|
def _on_load_finished(self, ok):
|
451
437
|
"""Handles the event when the web page finishes loading."""
|
@@ -1942,12 +1928,12 @@ class BrowserWindow:
|
|
1942
1928
|
def set_desktop_media_handler(self, handler):
|
1943
1929
|
"""
|
1944
1930
|
데스크톱 미디어(화면/윈도우) 선택 핸들러를 설정합니다.
|
1945
|
-
|
1931
|
+
|
1946
1932
|
Parameters
|
1947
1933
|
----------
|
1948
1934
|
handler : callable
|
1949
|
-
요청을 처리할 핸들러 함수. QWebEngineDesktopMediaRequest
|
1950
|
-
|
1935
|
+
요청을 처리할 핸들러 함수. QWebEngineDesktopMediaRequest 인자로 받습니다.
|
1936
|
+
|
1951
1937
|
Examples
|
1952
1938
|
--------
|
1953
1939
|
```python
|
@@ -1955,15 +1941,15 @@ class BrowserWindow:
|
|
1955
1941
|
# 사용 가능한 화면 목록 출력
|
1956
1942
|
for screen in request.screenList():
|
1957
1943
|
print(f"Screen: {screen.name}")
|
1958
|
-
|
1944
|
+
|
1959
1945
|
# 사용 가능한 윈도우 목록 출력
|
1960
1946
|
for window in request.windowList():
|
1961
1947
|
print(f"Window: {window.name}")
|
1962
|
-
|
1948
|
+
|
1963
1949
|
# 첫 번째 화면 선택
|
1964
1950
|
if request.screenList():
|
1965
1951
|
request.selectScreen(request.screenList()[0])
|
1966
|
-
|
1952
|
+
|
1967
1953
|
window.set_desktop_media_handler(custom_media_handler)
|
1968
1954
|
```
|
1969
1955
|
"""
|
pyloid/builder/spec.py
CHANGED
@@ -210,7 +210,7 @@ exe = EXE(
|
|
210
210
|
target_arch=None,
|
211
211
|
codesign_identity=None,
|
212
212
|
entitlements_file=None,
|
213
|
-
icon={config.get('icon', 'src-pyloid/icons/icon.png')}
|
213
|
+
icon='{config.get('icon', 'src-pyloid/icons/icon.png')}'
|
214
214
|
)
|
215
215
|
"""
|
216
216
|
else:
|
@@ -231,7 +231,7 @@ exe = EXE(
|
|
231
231
|
target_arch=None,
|
232
232
|
codesign_identity=None,
|
233
233
|
entitlements_file=None,
|
234
|
-
icon={config.get('icon', 'src-pyloid/icons/icon.png')}
|
234
|
+
icon='{config.get('icon', 'src-pyloid/icons/icon.png')}'
|
235
235
|
)
|
236
236
|
|
237
237
|
coll = COLLECT(
|
@@ -198,4 +198,4 @@ Apache License
|
|
198
198
|
distributed under the License is distributed on an "AS IS" BASIS,
|
199
199
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
200
200
|
See the License for the specific language governing permissions and
|
201
|
-
limitations under the License.
|
201
|
+
limitations under the License.
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.3
|
2
2
|
Name: pyloid
|
3
|
-
Version: 0.20.
|
3
|
+
Version: 0.20.2.dev0
|
4
4
|
Summary:
|
5
5
|
Author: aesthetics-of-record
|
6
6
|
Author-email: 111675679+aesthetics-of-record@users.noreply.github.com
|
@@ -10,6 +10,8 @@ Classifier: Programming Language :: Python :: 3.9
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.10
|
11
11
|
Classifier: Programming Language :: Python :: 3.11
|
12
12
|
Classifier: Programming Language :: Python :: 3.12
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
14
|
+
Requires-Dist: pyinstaller (>=6.11.1,<7.0.0)
|
13
15
|
Requires-Dist: pyside6 (>=6.8.1,<7.0.0)
|
14
16
|
Description-Content-Type: text/markdown
|
15
17
|
|
@@ -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=d9_h7URbECbNgRxqEjFAkbiZfso0oQ0v3RZXnzYTqN4,64228
|
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=2nkVNH-gu91U1oPxljQc-_1nYtZtsMNgKkt1OFztK7g,6123
|
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.20.
|
19
|
-
pyloid-0.20.
|
20
|
-
pyloid-0.20.
|
21
|
-
pyloid-0.20.
|
18
|
+
pyloid-0.20.2.dev0.dist-info/LICENSE,sha256=MTYF-6xpRekyTUglRweWtbfbwBL1I_3Bgfbm_SNOuI8,11525
|
19
|
+
pyloid-0.20.2.dev0.dist-info/METADATA,sha256=3V1NT6igjaUCGKUt7ArRoE7IRYZSrZzuJICzqLbjw30,3112
|
20
|
+
pyloid-0.20.2.dev0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
21
|
+
pyloid-0.20.2.dev0.dist-info/RECORD,,
|