frontengine 1.0.40__tar.gz → 1.0.41__tar.gz

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.
Files changed (252) hide show
  1. {frontengine-1.0.40 → frontengine-1.0.41}/PKG-INFO +1 -1
  2. frontengine-1.0.41/frontengine/utils/screen_text/screen_text_service.py +208 -0
  3. frontengine-1.0.41/frontengine/worker/__init__.py +0 -0
  4. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine.egg-info/PKG-INFO +1 -1
  5. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine.egg-info/SOURCES.txt +2 -0
  6. {frontengine-1.0.40 → frontengine-1.0.41}/pyproject.toml +1 -1
  7. {frontengine-1.0.40 → frontengine-1.0.41}/LICENSE +0 -0
  8. {frontengine-1.0.40 → frontengine-1.0.41}/README.md +0 -0
  9. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/__init__.py +0 -0
  10. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/__main__.py +0 -0
  11. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/__init__.py +0 -0
  12. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/base_widget.py +0 -0
  13. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/camera/__init__.py +0 -0
  14. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/camera/camera_widget.py +0 -0
  15. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/capture/__init__.py +0 -0
  16. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/capture/region_capture.py +0 -0
  17. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/focus_shield/__init__.py +0 -0
  18. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
  19. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/gaming/__init__.py +0 -0
  20. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/gaming/crosshair_widget.py +0 -0
  21. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/gif/__init__.py +0 -0
  22. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/gif/paint_gif.py +0 -0
  23. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/image/__init__.py +0 -0
  24. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/image/paint_image.py +0 -0
  25. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/load/__init__.py +0 -0
  26. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/load/load_someone_make_ui.py +0 -0
  27. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/measure/__init__.py +0 -0
  28. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/measure/measure_widget.py +0 -0
  29. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/monitor/__init__.py +0 -0
  30. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/monitor/monitor_widget.py +0 -0
  31. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/notes/__init__.py +0 -0
  32. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/notes/sticky_note_widget.py +0 -0
  33. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/overlay_factory.py +0 -0
  34. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/particle/__init__.py +0 -0
  35. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/particle/particle_ui.py +0 -0
  36. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/pet/__init__.py +0 -0
  37. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/pet/desktop_pet.py +0 -0
  38. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/presentation/__init__.py +0 -0
  39. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/presentation/annotation_overlay.py +0 -0
  40. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/presentation/cursor_effects.py +0 -0
  41. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/presentation/keystroke_display.py +0 -0
  42. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/presentation/magnifier.py +0 -0
  43. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/scene/__init__.py +0 -0
  44. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/scene/extend_graphic_scene.py +0 -0
  45. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/scene/extend_graphic_view.py +0 -0
  46. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/scene/scene.py +0 -0
  47. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/screen_care/__init__.py +0 -0
  48. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/screen_care/color_vision_widget.py +0 -0
  49. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/screen_care/screen_filter.py +0 -0
  50. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/sound_player/__init__.py +0 -0
  51. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/sound_player/sound_effect.py +0 -0
  52. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/sound_player/sound_player.py +0 -0
  53. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/spectrum/__init__.py +0 -0
  54. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/spectrum/spectrum_widget.py +0 -0
  55. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/teleprompter/__init__.py +0 -0
  56. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/teleprompter/teleprompter_widget.py +0 -0
  57. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/text/__init__.py +0 -0
  58. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/text/draw_text.py +0 -0
  59. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/toast/__init__.py +0 -0
  60. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/toast/toast_widget.py +0 -0
  61. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/video/__init__.py +0 -0
  62. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/video/video_player.py +0 -0
  63. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/wallpaper/__init__.py +0 -0
  64. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
  65. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/web/__init__.py +0 -0
  66. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/web/webview.py +0 -0
  67. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/show/window_helpers.py +0 -0
  68. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/system_tray/__init__.py +0 -0
  69. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/system_tray/extend_system_tray.py +0 -0
  70. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/__init__.py +0 -0
  71. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/color/__init__.py +0 -0
  72. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/color/global_color.py +0 -0
  73. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/__init__.py +0 -0
  74. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
  75. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
  76. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
  77. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/hotkey_settings_dialog.py +0 -0
  78. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/reminder_dialog.py +0 -0
  79. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/save_file_dialog.py +0 -0
  80. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
  81. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
  82. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
  83. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
  84. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/main_ui.py +0 -0
  85. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/menu/__init__.py +0 -0
  86. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/menu/help_menu.py +0 -0
  87. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/menu/how_to_menu.py +0 -0
  88. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/menu/language_menu.py +0 -0
  89. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/menu/preset_menu.py +0 -0
  90. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/menu/settings_menu.py +0 -0
  91. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/__init__.py +0 -0
  92. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/control_center/__init__.py +0 -0
  93. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
  94. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/focus/__init__.py +0 -0
  95. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
  96. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/gif/__init__.py +0 -0
  97. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
  98. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/image/__init__.py +0 -0
  99. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/image/image_setting_ui.py +0 -0
  100. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/particle/__init__.py +0 -0
  101. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
  102. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/pet/__init__.py +0 -0
  103. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
  104. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/presentation/__init__.py +0 -0
  105. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/presentation/presentation_setting_ui.py +0 -0
  106. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/__init__.py +0 -0
  107. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
  108. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
  109. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
  110. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
  111. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
  112. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
  113. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
  114. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
  115. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
  116. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
  117. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
  118. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/screen_care/__init__.py +0 -0
  119. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
  120. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/sound_player/__init__.py +0 -0
  121. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
  122. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/stream/__init__.py +0 -0
  123. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/stream/stream_setting_ui.py +0 -0
  124. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/text/__init__.py +0 -0
  125. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/text/text_setting_ui.py +0 -0
  126. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/tools/__init__.py +0 -0
  127. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/tools/tools_setting_ui.py +0 -0
  128. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/utils.py +0 -0
  129. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/video/__init__.py +0 -0
  130. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/video/video_setting_ui.py +0 -0
  131. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/wallpaper/__init__.py +0 -0
  132. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
  133. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/web/__init__.py +0 -0
  134. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/web/web_setting_ui.py +0 -0
  135. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/widgets/__init__.py +0 -0
  136. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/ui/page/widgets/widgets_setting_ui.py +0 -0
  137. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/user_setting/__init__.py +0 -0
  138. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/user_setting/preset_repository.py +0 -0
  139. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/user_setting/scene_setting.py +0 -0
  140. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/user_setting/user_setting_file.py +0 -0
  141. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/__init__.py +0 -0
  142. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/app_profile/__init__.py +0 -0
  143. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/app_profile/app_profile_service.py +0 -0
  144. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/audio_meter/__init__.py +0 -0
  145. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
  146. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
  147. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/audio_meter/screen_audio.py +0 -0
  148. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
  149. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
  150. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/autostart/__init__.py +0 -0
  151. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/autostart/autostart_service.py +0 -0
  152. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/break_reminder/__init__.py +0 -0
  153. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/break_reminder/break_reminder.py +0 -0
  154. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/browser/__init__.py +0 -0
  155. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/browser/browser.py +0 -0
  156. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/clipboard/__init__.py +0 -0
  157. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/clipboard/clipboard_history.py +0 -0
  158. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
  159. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/color_vision/__init__.py +0 -0
  160. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/color_vision/color_vision.py +0 -0
  161. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/critical_exit/__init__.py +0 -0
  162. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
  163. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/critical_exit/critical_exit.py +0 -0
  164. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/critical_exit/win32_vk.py +0 -0
  165. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/exception/__init__.py +0 -0
  166. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/exception/exception_tags.py +0 -0
  167. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/exception/exceptions.py +0 -0
  168. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/file/__init__.py +0 -0
  169. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/file/open/__init__.py +0 -0
  170. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/file/open/open_file.py +0 -0
  171. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/file/save/__init__.py +0 -0
  172. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/file/save/save_file.py +0 -0
  173. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/focus_shield/__init__.py +0 -0
  174. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/focus_shield/focus_shield.py +0 -0
  175. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/focus_timer/__init__.py +0 -0
  176. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/focus_timer/focus_timer.py +0 -0
  177. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/hotkey/__init__.py +0 -0
  178. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/hotkey/hotkey_service.py +0 -0
  179. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/input_watch/__init__.py +0 -0
  180. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/input_watch/input_watch_service.py +0 -0
  181. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/json/__init__.py +0 -0
  182. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/json/json_file.py +0 -0
  183. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/json/json_repository.py +0 -0
  184. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/json_format/__init__.py +0 -0
  185. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/json_format/json_process.py +0 -0
  186. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/logging/__init__.py +0 -0
  187. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/logging/loggin_instance.py +0 -0
  188. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/measure/__init__.py +0 -0
  189. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/measure/measure.py +0 -0
  190. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/__init__.py +0 -0
  191. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/english.py +0 -0
  192. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/france.py +0 -0
  193. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/germany.py +0 -0
  194. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/italy.py +0 -0
  195. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/language_wrapper.py +0 -0
  196. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/russian.py +0 -0
  197. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/simplified_chinese.py +0 -0
  198. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/multi_language/traditional_chinese.py +0 -0
  199. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/now_playing/__init__.py +0 -0
  200. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/now_playing/now_playing.py +0 -0
  201. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/obs/__init__.py +0 -0
  202. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/obs/obs_client.py +0 -0
  203. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/obs/obs_protocol.py +0 -0
  204. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/obs/websocket_frames.py +0 -0
  205. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/pet_chat/__init__.py +0 -0
  206. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
  207. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/platform_info/__init__.py +0 -0
  208. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/platform_info/platform_info.py +0 -0
  209. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/playlist/__init__.py +0 -0
  210. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/playlist/playlist.py +0 -0
  211. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/plugins/__init__.py +0 -0
  212. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/plugins/plugin_loader.py +0 -0
  213. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/power_mode/__init__.py +0 -0
  214. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/power_mode/power_mode.py +0 -0
  215. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/preset_schedule/__init__.py +0 -0
  216. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
  217. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/recording/__init__.py +0 -0
  218. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/recording/frame_recorder.py +0 -0
  219. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/recording/gif_writer.py +0 -0
  220. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/redirect_manager/__init__.py +0 -0
  221. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
  222. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/reminder/__init__.py +0 -0
  223. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/reminder/reminder_service.py +0 -0
  224. {frontengine-1.0.40/frontengine/utils/smart_pause → frontengine-1.0.41/frontengine/utils/screen_text}/__init__.py +0 -0
  225. {frontengine-1.0.40/frontengine/utils/soundboard → frontengine-1.0.41/frontengine/utils/smart_pause}/__init__.py +0 -0
  226. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/smart_pause/pause_rules.py +0 -0
  227. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
  228. {frontengine-1.0.40/frontengine/utils/system_stats → frontengine-1.0.41/frontengine/utils/soundboard}/__init__.py +0 -0
  229. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/soundboard/soundboard.py +0 -0
  230. {frontengine-1.0.40/frontengine/utils/text_source → frontengine-1.0.41/frontengine/utils/system_stats}/__init__.py +0 -0
  231. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/system_stats/system_stats.py +0 -0
  232. {frontengine-1.0.40/frontengine/utils/theme_schedule → frontengine-1.0.41/frontengine/utils/text_source}/__init__.py +0 -0
  233. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/text_source/text_source.py +0 -0
  234. {frontengine-1.0.40/frontengine/utils/usage_tracking → frontengine-1.0.41/frontengine/utils/theme_schedule}/__init__.py +0 -0
  235. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
  236. {frontengine-1.0.40/frontengine/utils/weather → frontengine-1.0.41/frontengine/utils/usage_tracking}/__init__.py +0 -0
  237. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/usage_tracking/usage_service.py +0 -0
  238. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
  239. {frontengine-1.0.40/frontengine/utils/window_pin → frontengine-1.0.41/frontengine/utils/weather}/__init__.py +0 -0
  240. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/weather/weather_service.py +0 -0
  241. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/web_url.py +0 -0
  242. {frontengine-1.0.40/frontengine/utils/workshop → frontengine-1.0.41/frontengine/utils/window_pin}/__init__.py +0 -0
  243. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/window_pin/window_layout.py +0 -0
  244. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/window_pin/window_pin.py +0 -0
  245. {frontengine-1.0.40/frontengine/worker → frontengine-1.0.41/frontengine/utils/workshop}/__init__.py +0 -0
  246. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/utils/workshop/workshop_content.py +0 -0
  247. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine/worker/qthread_worker.py +0 -0
  248. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine.egg-info/dependency_links.txt +0 -0
  249. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine.egg-info/entry_points.txt +0 -0
  250. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine.egg-info/requires.txt +0 -0
  251. {frontengine-1.0.40 → frontengine-1.0.41}/frontengine.egg-info/top_level.txt +0 -0
  252. {frontengine-1.0.40 → frontengine-1.0.41}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine
3
- Version: 1.0.40
3
+ Version: 1.0.41
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
@@ -0,0 +1,208 @@
1
+ """
2
+ 讀畫面上的文字:把框選到的一塊畫面交給 Claude,取出文字、翻譯它,或就它問問題。
3
+
4
+ **這個功能會把螢幕截圖送到 Anthropic 的 API**,是本專案唯一會把畫面內容送出
5
+ 機器的地方。因此:必須先明確同意(UI 會先問一次並記住)、必須自己提供
6
+ ANTHROPIC_API_KEY、而且沒有同意或沒有金鑰時整個功能都是關的。
7
+
8
+ Read the text on screen: hand a captured region to Claude to pull the text out,
9
+ translate it, or answer a question about it.
10
+
11
+ **This sends a screenshot to Anthropic's API** - the only place in this project
12
+ where screen content leaves the machine. So: it needs explicit consent (asked
13
+ once and remembered), it needs your own ANTHROPIC_API_KEY, and without either
14
+ the whole feature stays off.
15
+ """
16
+ from __future__ import annotations
17
+
18
+ import base64
19
+ import os
20
+ import threading
21
+ from typing import Any, Callable, Dict, List, Optional
22
+
23
+ from frontengine.utils.logging.loggin_instance import front_engine_logger
24
+
25
+ API_KEY_ENV = "ANTHROPIC_API_KEY"
26
+ MODEL = "claude-opus-5"
27
+ MAX_TOKENS = 1500
28
+
29
+ ACTION_EXTRACT = "extract"
30
+ ACTION_TRANSLATE = "translate"
31
+ ACTION_ASK = "ask"
32
+ ACTIONS = (ACTION_EXTRACT, ACTION_TRANSLATE, ACTION_ASK)
33
+
34
+ DEFAULT_LANGUAGE = "English"
35
+ SYSTEM_PROMPT = (
36
+ "You read a screenshot the user captured and answer about its contents. "
37
+ "Reply with the answer itself and nothing else - no preamble, no commentary "
38
+ "on the image quality, no markdown fences."
39
+ )
40
+ _PROMPTS = {
41
+ ACTION_EXTRACT: ("Transcribe every piece of text in this image, preserving the reading "
42
+ "order and line breaks. If there is no text, reply exactly: (no text)"),
43
+ ACTION_TRANSLATE: ("Translate all text in this image into {language}. Keep the layout's "
44
+ "line breaks. If there is no text, reply exactly: (no text)"),
45
+ }
46
+
47
+
48
+ def normalize_action(action: Any) -> str:
49
+ """把動作正規化;不認得的一律當「取出文字」。"""
50
+ name = str(action or "").strip().lower()
51
+ return name if name in ACTIONS else ACTION_EXTRACT
52
+
53
+
54
+ def api_key(env: Optional[dict] = None) -> Optional[str]:
55
+ """從環境變數讀 API 金鑰;沒設定回傳 None(金鑰永遠不寫進設定檔)。"""
56
+ source = env if env is not None else os.environ
57
+ key = str(source.get(API_KEY_ENV, "") or "").strip()
58
+ return key or None
59
+
60
+
61
+ def prompt_for(action: Any, language: str = DEFAULT_LANGUAGE,
62
+ question: str = "") -> str:
63
+ """
64
+ 依動作組出要問的話。問問題模式沒填問題時,退回成「取出文字」,
65
+ 因為送一張圖卻不問任何事沒有意義。
66
+ The instruction for this action. An "ask" with no question falls back to
67
+ extracting text: sending an image and asking nothing is not useful.
68
+ """
69
+ name = normalize_action(action)
70
+ if name == ACTION_ASK:
71
+ text = str(question or "").strip()
72
+ if text:
73
+ return text
74
+ name = ACTION_EXTRACT
75
+ template = _PROMPTS[name]
76
+ return template.format(language=str(language or DEFAULT_LANGUAGE).strip() or DEFAULT_LANGUAGE)
77
+
78
+
79
+ def image_block(png_bytes: bytes) -> Optional[Dict[str, Any]]:
80
+ """
81
+ 把 PNG 位元組包成 API 要的影像內容區塊;沒有資料時回傳 None。
82
+ Wrap PNG bytes as the API's image content block; None when there is nothing.
83
+ """
84
+ if not png_bytes:
85
+ return None
86
+ return {
87
+ "type": "image",
88
+ "source": {
89
+ "type": "base64",
90
+ "media_type": "image/png",
91
+ "data": base64.standard_b64encode(png_bytes).decode("ascii"),
92
+ },
93
+ }
94
+
95
+
96
+ def build_message(png_bytes: bytes, action: Any, language: str = DEFAULT_LANGUAGE,
97
+ question: str = "") -> Optional[List[Dict[str, Any]]]:
98
+ """組出送出去的 messages;沒有影像就回傳 None。"""
99
+ block = image_block(png_bytes)
100
+ if block is None:
101
+ return None
102
+ return [{"role": "user", "content": [block, {"type": "text",
103
+ "text": prompt_for(action, language, question)}]}]
104
+
105
+
106
+ def reply_text(response: Any) -> Optional[str]:
107
+ """
108
+ 從回應取出文字。被婉拒(stop_reason 為 refusal)時回傳 None,讓呼叫端
109
+ 知道這次沒有答案,而不是把空字串當成結果。
110
+ Pull the text out of a response. A refusal gives None so the caller can tell
111
+ "no answer" from an empty one.
112
+ """
113
+ if response is None:
114
+ return None
115
+ if getattr(response, "stop_reason", None) == "refusal":
116
+ front_engine_logger.info("[ScreenText] request was declined")
117
+ return None
118
+ pieces = []
119
+ for block in getattr(response, "content", None) or []:
120
+ text = getattr(block, "text", None)
121
+ if text:
122
+ pieces.append(str(text))
123
+ joined = "\n".join(pieces).strip()
124
+ return joined or None
125
+
126
+
127
+ class ScreenTextService:
128
+ """
129
+ 把截圖交給 Claude 的服務。沒有金鑰、沒有同意或沒有安裝 SDK 時 available()
130
+ 為 False,read() 一律回傳 None——不會偷偷送出任何東西。
131
+ The service that hands a screenshot to Claude. Without a key, without
132
+ consent, or without the SDK, available() is False and read() returns None:
133
+ nothing is ever sent quietly.
134
+ """
135
+
136
+ def __init__(self, model: str = MODEL,
137
+ consent_provider: Optional[Callable[[], bool]] = None,
138
+ key_provider: Optional[Callable[[], Optional[str]]] = None) -> None:
139
+ self.model = model
140
+ self._consent_provider = consent_provider or (lambda: False)
141
+ self._key_provider = key_provider or api_key
142
+ self._client = None
143
+
144
+ def consented(self) -> bool:
145
+ """使用者是否已經同意把畫面送出去。"""
146
+ try:
147
+ return bool(self._consent_provider())
148
+ except Exception: # pragma: no cover - defensive around providers
149
+ return False
150
+
151
+ def available(self) -> bool:
152
+ """同意過、有金鑰、也裝得起 SDK 才算可用。"""
153
+ return self.consented() and self._key_provider() is not None
154
+
155
+ def _build_client(self):
156
+ if self._client is not None:
157
+ return self._client
158
+ key = self._key_provider()
159
+ if key is None:
160
+ return None
161
+ try:
162
+ from anthropic import Anthropic
163
+
164
+ self._client = Anthropic(api_key=key)
165
+ except Exception as error:
166
+ front_engine_logger.warning(f"[ScreenText] client unavailable: {error!r}")
167
+ self._client = None
168
+ return self._client
169
+
170
+ def read(self, png_bytes: bytes, action: Any = ACTION_EXTRACT,
171
+ language: str = DEFAULT_LANGUAGE, question: str = "") -> Optional[str]:
172
+ """
173
+ 同步送出一次並回傳答案;沒同意、沒金鑰、被婉拒或失敗都回傳 None。
174
+ Ask once, synchronously. None when consent or key is missing, when the
175
+ request is declined, or when it fails.
176
+ """
177
+ if not self.consented():
178
+ front_engine_logger.info("[ScreenText] refused to send: no consent recorded")
179
+ return None
180
+ messages = build_message(png_bytes, action, language, question)
181
+ if messages is None:
182
+ return None
183
+ client = self._build_client()
184
+ if client is None:
185
+ return None
186
+ try:
187
+ response = client.messages.create(
188
+ model=self.model,
189
+ max_tokens=MAX_TOKENS,
190
+ system=SYSTEM_PROMPT,
191
+ thinking={"type": "disabled"},
192
+ messages=messages,
193
+ )
194
+ except Exception as error:
195
+ front_engine_logger.warning(f"[ScreenText] request failed: {error!r}")
196
+ return None
197
+ return reply_text(response)
198
+
199
+ def read_async(self, png_bytes: bytes, on_reply: Callable[[Optional[str]], None],
200
+ action: Any = ACTION_EXTRACT, language: str = DEFAULT_LANGUAGE,
201
+ question: str = "") -> None:
202
+ """在背景執行緒送出,完成後以答案呼叫 on_reply(UI 不會被卡住)。"""
203
+
204
+ def worker() -> None:
205
+ answer = self.read(png_bytes, action, language, question)
206
+ on_reply(answer)
207
+
208
+ threading.Thread(target=worker, name="frontengine-screen-text", daemon=True).start()
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine
3
- Version: 1.0.40
3
+ Version: 1.0.41
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
5
  Author-email: JE-Chen <jechenmailman@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
@@ -223,6 +223,8 @@ frontengine/utils/redirect_manager/__init__.py
223
223
  frontengine/utils/redirect_manager/redirect_manager_class.py
224
224
  frontengine/utils/reminder/__init__.py
225
225
  frontengine/utils/reminder/reminder_service.py
226
+ frontengine/utils/screen_text/__init__.py
227
+ frontengine/utils/screen_text/screen_text_service.py
226
228
  frontengine/utils/smart_pause/__init__.py
227
229
  frontengine/utils/smart_pause/pause_rules.py
228
230
  frontengine/utils/smart_pause/smart_pause_service.py
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "frontengine"
9
- version = "1.0.40"
9
+ version = "1.0.41"
10
10
  authors = [
11
11
  { name = "JE-Chen", email = "jechenmailman@gmail.com" },
12
12
  ]
File without changes
File without changes