ok-script 0.0.183__tar.gz → 0.0.185__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.
- {ok-script-0.0.183/ok_script.egg-info → ok-script-0.0.185}/PKG-INFO +1 -1
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/BaseCaptureMethod.py +1 -1
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/adb/DeviceManager.py +18 -9
- ok-script-0.0.185/ok/capture/adb/NemuIpcCaptureMethod.py +121 -0
- ok-script-0.0.185/ok/capture/adb/nemu_ipc.py +595 -0
- ok-script-0.0.185/ok/capture/adb/nemu_utils.py +295 -0
- ok-script-0.0.185/ok/gui/StartController.py +152 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/debug/DebugTab.py +15 -12
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/start/SelectCaptureListView.py +13 -4
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/start/StartTab.py +9 -7
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/interaction/PyDirectInteraction.py +1 -1
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/task/TaskExecutor.py +3 -3
- {ok-script-0.0.183 → ok-script-0.0.185/ok_script.egg-info}/PKG-INFO +1 -1
- {ok-script-0.0.183 → ok-script-0.0.185}/ok_script.egg-info/SOURCES.txt +3 -1
- {ok-script-0.0.183 → ok-script-0.0.185}/setup.py +1 -1
- ok-script-0.0.183/ok/gui/StartController.py +0 -142
- ok-script-0.0.183/ok/util/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/LICENSE.txt +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/MANIFEST.in +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/README.md +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/OK.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/alas/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/alas/emulator_base.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/alas/emulator_windows.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/alas/platform_base.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/alas/platform_windows.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/alas/utils.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/analytics/Analytics.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/analytics/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/binaries/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/binaries/__pycache__/__init__.cpython-311.pyc +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/binaries/updater.exe +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/HwndWindow.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/adb/ADBCaptureMethod.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/adb/WindowsCaptureFactory.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/adb/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/image/ImageCaptureMethod.py +0 -0
- {ok-script-0.0.183/ok/capture/adb/bin → ok-script-0.0.185/ok/capture/image}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/BaseWindowsCaptureMethod.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/BitBltCaptureMethod.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/DesktopDuplicationCaptureMethod.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/WindowsGraphicsCaptureMethod.py +0 -0
- {ok-script-0.0.183/ok/capture/image → ok-script-0.0.185/ok/capture/windows}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/d3d11.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/dump.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/utils.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/capture/windows/window.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/color/Color.py +0 -0
- {ok-script-0.0.183/ok/capture/windows → ok-script-0.0.185/ok/color}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/config/Config.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/config/ConfigOption.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/config/GlobalConfig.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/config/InfoDict.py +0 -0
- {ok-script-0.0.183/ok/color → ok-script-0.0.185/ok/config}/__init__.py +0 -0
- {ok-script-0.0.183/ok/config → ok-script-0.0.185/ok/display}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/display/custom_types.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/display/display.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/display/display_adapters.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/display/display_monitors.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/display/windows_types.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/feature/Box.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/feature/CompressCoco.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/feature/Feature.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/feature/FeatureSet.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/feature/FindFeature.py +0 -0
- {ok-script-0.0.183/ok/display → ok-script-0.0.185/ok/feature}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/App.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/Communicate.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/MainWindow.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/MessageWindow.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/TabTitles.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/about/AboutTab.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/about/HttpTextEdit.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/about/VersionCard.py +0 -0
- {ok-script-0.0.183/ok/feature → ok-script-0.0.185/ok/gui/about}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/common/OKIcon.py +0 -0
- {ok-script-0.0.183/ok/gui/about → ok-script-0.0.185/ok/gui/common}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/common/config.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/common/style_sheet.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/debug/FrameWidget.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/debug/LogWindow.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/debug/Screenshot.py +0 -0
- {ok-script-0.0.183/ok/gui/common → ok-script-0.0.185/ok/gui/debug}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/i18n/GettextTranslator.py +0 -0
- {ok-script-0.0.183/ok/gui/debug → ok-script-0.0.185/ok/gui/i18n}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/i18n/path.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/i18n/update.py +0 -0
- {ok-script-0.0.183/ok/gui/i18n → ok-script-0.0.185/ok/gui/icon}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/icon/icon.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/overlay/OverlayWindow.py +0 -0
- {ok-script-0.0.183/ok/gui/icon → ok-script-0.0.185/ok/gui/overlay}/__init__.py +0 -0
- {ok-script-0.0.183/ok/gui/overlay → ok-script-0.0.185/ok/gui/qss}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/resources.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/settings/GlobalConfigCard.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/settings/SettingTab.py +0 -0
- {ok-script-0.0.183/ok/gui/qss → ok-script-0.0.185/ok/gui/settings}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/start/StartCard.py +0 -0
- {ok-script-0.0.183/ok/gui/settings → ok-script-0.0.185/ok/gui/start}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/ConfigCard.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/ConfigItemFactory.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/ConfigLabelAndWidget.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndDoubleSpinBox.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndDropDown.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndLineEdit.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndList.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndMultiSelection.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndSpinBox.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndSwitchButton.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/LabelAndWidget.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/ModifyListDialog.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/ModifyListItem.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/OneTimeTaskTab.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/StartButton.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/TaskCard.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/TaskOpButton.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/TaskTab.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/TooltipTableWidget.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/tasks/TriggerTaskTab.py +0 -0
- {ok-script-0.0.183/ok/gui/start → ok-script-0.0.185/ok/gui/tasks}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/util/Alert.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/util/InitWorker.py +0 -0
- {ok-script-0.0.183/ok/gui/tasks → ok-script-0.0.185/ok/gui/util}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/Card.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/EmptyCard.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/FlowLayout.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/FramelessDialog.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/ListTableWidgetItem.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/NumericTableWidgetItem.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/StartLoadingDialog.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/StatusBar.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/Tab.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/TabWidget.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/UpdateConfigWidgetItem.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/gui/widget/YesNonWidgetItem.py +0 -0
- {ok-script-0.0.183/ok/gui/util → ok-script-0.0.185/ok/gui/widget}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/interaction/ADBInteraction.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/interaction/BaseInteraction.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/interaction/DoNothingInteraction.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/interaction/PostMessageInteraction.py +0 -0
- {ok-script-0.0.183/ok/gui/widget → ok-script-0.0.185/ok/interaction}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/logging/Logger.py +0 -0
- {ok-script-0.0.183/ok/interaction → ok-script-0.0.185/ok/logging}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/ocr/OCR.py +0 -0
- {ok-script-0.0.183/ok/logging → ok-script-0.0.185/ok/ocr}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Foundation/Collections.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Foundation/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Globalization/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Graphics/Capture/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Graphics/DirectX/Direct3D11/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Graphics/DirectX/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Graphics/Imaging/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Graphics/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Media/Ocr/__init__.py +0 -0
- {ok-script-0.0.183/ok/ocr → ok-script-0.0.185/ok/rotypes/Windows/Media}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Security/Cryptography/__init__.py +0 -0
- {ok-script-0.0.183/ok/rotypes/Windows/Media → ok-script-0.0.185/ok/rotypes/Windows/Security}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/Windows/Storage/Streams/__init__.py +0 -0
- {ok-script-0.0.183/ok/rotypes/Windows/Security → ok-script-0.0.185/ok/rotypes/Windows/Storage}/__init__.py +0 -0
- {ok-script-0.0.183/ok/rotypes/Windows/Storage → ok-script-0.0.185/ok/rotypes/Windows}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/delegate.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/export.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/idldsl.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/inspectable.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/roapi.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/types.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/rotypes/winstring.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/save/BlackBarProcessor.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/save/PostProcessor.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/save/SaveByInterval.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/save/SaveByKeyPress.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/save/SaveMethodBase.py +0 -0
- {ok-script-0.0.183/ok/rotypes/Windows → ok-script-0.0.185/ok/save}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/scene/FeatureScene.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/scene/Scene.py +0 -0
- {ok-script-0.0.183/ok/save → ok-script-0.0.185/ok/scene}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/stats/StreamStats.py +0 -0
- {ok-script-0.0.183/ok/scene → ok-script-0.0.185/ok/stats}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/task/BaseTask.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/task/ExecutorOperation.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/task/TriggerTask.py +0 -0
- {ok-script-0.0.183/ok/stats → ok-script-0.0.185/ok/task}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/update/GithubMultiDownloader.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/update/Updater.py +0 -0
- {ok-script-0.0.183/ok/task → ok-script-0.0.185/ok/update}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/update/gen_md5.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/Handler.py +0 -0
- {ok-script-0.0.183/ok/update → ok-script-0.0.185/ok/util}/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/exit_event.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/json.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/list.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/path.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/thread.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/win32_process.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok/util/yaml.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok_script.egg-info/dependency_links.txt +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok_script.egg-info/requires.txt +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/ok_script.egg-info/top_level.txt +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/setup.cfg +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/tests/__init__.py +0 -0
- {ok-script-0.0.183 → ok-script-0.0.185}/tests/test_updater.py +0 -0
|
@@ -39,7 +39,7 @@ class BaseCaptureMethod:
|
|
|
39
39
|
frame = frame[:, :, :3]
|
|
40
40
|
return frame
|
|
41
41
|
except Exception as e:
|
|
42
|
-
raise CaptureException() from e
|
|
42
|
+
raise CaptureException(str(e)) from e
|
|
43
43
|
|
|
44
44
|
def __str__(self):
|
|
45
45
|
return f'{self.__class__.__name__}_{self.width}x{self.height}'
|
|
@@ -93,21 +93,23 @@ class DeviceManager:
|
|
|
93
93
|
def adb_connect(self, addr, try_connect=True):
|
|
94
94
|
from adbutils import AdbError
|
|
95
95
|
try:
|
|
96
|
-
for device in self.adb.
|
|
96
|
+
for device in self.adb.list():
|
|
97
97
|
if self.exit_event.is_set():
|
|
98
98
|
logger.error(f"adb_connect exit_event is set")
|
|
99
99
|
return None
|
|
100
100
|
if device.serial == addr:
|
|
101
|
-
if device.
|
|
101
|
+
if device.state == 'offline':
|
|
102
102
|
logger.debug(f'adb_connect offline disconnect first {addr}')
|
|
103
103
|
self.adb.disconnect(addr)
|
|
104
104
|
else:
|
|
105
105
|
logger.debug(f'adb_connect already connected {addr}')
|
|
106
|
-
return device
|
|
106
|
+
return self.adb.device(addr)
|
|
107
107
|
if try_connect:
|
|
108
|
-
self.adb.connect(addr, timeout=5)
|
|
109
|
-
logger.debug(f'adb_connect {addr}')
|
|
108
|
+
ret = self.adb.connect(addr, timeout=5)
|
|
109
|
+
logger.debug(f'adb_connect try_connect {addr} {ret}')
|
|
110
110
|
return self.adb_connect(addr, try_connect=False)
|
|
111
|
+
else:
|
|
112
|
+
logger.debug(f'adb_connect {addr} not in device list {self.adb.list()}')
|
|
111
113
|
except AdbError as e:
|
|
112
114
|
logger.error(f"adb connect error {addr}", e)
|
|
113
115
|
self.try_kill_adb(e)
|
|
@@ -185,19 +187,19 @@ class DeviceManager:
|
|
|
185
187
|
logger.debug(f"refresh current only skip others {preferred['imei']} != {emulator.name}")
|
|
186
188
|
continue
|
|
187
189
|
adb_device = self.adb_connect(emulator.serial)
|
|
190
|
+
logger.info(f'adb_connect emulator result {emulator.type} {adb_device}')
|
|
188
191
|
width, height = self.get_resolution(adb_device) if adb_device is not None else 0, 0
|
|
189
192
|
name, hwnd, full_path, x, y, width, height = find_hwnd(None,
|
|
190
193
|
emulator.path, width, height, emulator.player_id)
|
|
191
194
|
connected = adb_device is not None and name is not None
|
|
192
|
-
emulator_device = {"address": emulator.serial, "device": "adb",
|
|
193
|
-
"
|
|
194
|
-
"imei": emulator.name, "player_id": emulator.player_id,
|
|
195
|
+
emulator_device = {"address": emulator.serial, "device": "adb", "full_path": emulator.path,
|
|
196
|
+
"connected": connected, "imei": emulator.name, "player_id": emulator.player_id,
|
|
195
197
|
"nick": name or emulator.name, "emulator": emulator}
|
|
196
198
|
if adb_device is not None:
|
|
197
199
|
emulator_device["resolution"] = f"{width}x{height}"
|
|
198
200
|
emulator_device["adb_imei"] = self.adb_get_imei(adb_device)
|
|
199
201
|
self.device_dict[emulator.name] = emulator_device
|
|
200
|
-
logger.
|
|
202
|
+
logger.info(f'refresh emulators {self.device_dict}')
|
|
201
203
|
|
|
202
204
|
def get_resolution(self, device=None):
|
|
203
205
|
if device is None:
|
|
@@ -334,6 +336,13 @@ class DeviceManager:
|
|
|
334
336
|
self.ensure_hwnd(None, preferred.get('full_path'), width, height, preferred['player_id'])
|
|
335
337
|
self.use_windows_capture({'can_bit_blt': True}, require_bg=True, use_bit_blt_only=False,
|
|
336
338
|
bit_blt_render_full=False)
|
|
339
|
+
elif self.config.get('capture') == 'ipc':
|
|
340
|
+
from ok.capture.adb.NemuIpcCaptureMethod import NemuIpcCaptureMethod
|
|
341
|
+
if not isinstance(self.capture_method, NemuIpcCaptureMethod):
|
|
342
|
+
if self.capture_method is not None:
|
|
343
|
+
self.capture_method.close()
|
|
344
|
+
self.capture_method = NemuIpcCaptureMethod(self, self.exit_event)
|
|
345
|
+
self.capture_method.update_emulator(self.get_preferred_device()['emulator'])
|
|
337
346
|
else:
|
|
338
347
|
if not isinstance(self.capture_method, ADBCaptureMethod):
|
|
339
348
|
logger.debug(f'use adb capture')
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# original https://github.com/Toufool/AutoSplit/blob/master/src/capture_method/WindowsGraphicsCaptureMethod.py
|
|
2
|
+
import json
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
from typing_extensions import override
|
|
7
|
+
|
|
8
|
+
from ok.alas.emulator_windows import EmulatorInstance
|
|
9
|
+
from ok.capture.BaseCaptureMethod import BaseCaptureMethod
|
|
10
|
+
from ok.capture.adb.nemu_ipc import NemuIpcImpl
|
|
11
|
+
from ok.logging.Logger import get_logger
|
|
12
|
+
|
|
13
|
+
logger = get_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class NemuIpcCaptureMethod(BaseCaptureMethod):
|
|
17
|
+
name = "Nemu Ipc Capture"
|
|
18
|
+
description = "mumu player 12 only"
|
|
19
|
+
|
|
20
|
+
def __init__(self, device_manager, exit_event, width=0, height=0):
|
|
21
|
+
super().__init__()
|
|
22
|
+
self.device_manager = device_manager
|
|
23
|
+
self.exit_event = exit_event
|
|
24
|
+
self._connected = (width != 0 and height != 0)
|
|
25
|
+
self.nemu_impl: NemuIpcImpl | None = None
|
|
26
|
+
self.emulator: EmulatorInstance | None = None
|
|
27
|
+
|
|
28
|
+
def update_emulator(self, emulator: EmulatorInstance):
|
|
29
|
+
self.emulator = emulator
|
|
30
|
+
logger.info(f'update_path_and_id {emulator}')
|
|
31
|
+
if self.nemu_impl:
|
|
32
|
+
self.nemu_impl.disconnect()
|
|
33
|
+
self.nemu_impl = None
|
|
34
|
+
|
|
35
|
+
def init_nemu(self):
|
|
36
|
+
self.check_mumu_app_keep_alive_400()
|
|
37
|
+
if not self.nemu_impl:
|
|
38
|
+
self.nemu_impl = NemuIpcImpl(
|
|
39
|
+
nemu_folder=self.base_folder(),
|
|
40
|
+
instance_id=self.emulator.player_id,
|
|
41
|
+
display_id=0
|
|
42
|
+
).__enter__()
|
|
43
|
+
|
|
44
|
+
def base_folder(self):
|
|
45
|
+
return os.path.dirname(os.path.dirname(self.emulator.path))
|
|
46
|
+
|
|
47
|
+
def check_mumu_app_keep_alive_400(self):
|
|
48
|
+
"""
|
|
49
|
+
Check app_keep_alive from emulator config if version >= 4.0
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
file: E:/ProgramFiles/MuMuPlayer-12.0/vms/MuMuPlayer-12.0-1/config/customer_config.json
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
bool: If success to read file
|
|
56
|
+
"""
|
|
57
|
+
file = os.path.abspath(os.path.join(
|
|
58
|
+
self.base_folder(),
|
|
59
|
+
f'vms/MuMuPlayer-12.0-{self.emulator.player_id}/configs/customer_config.json'))
|
|
60
|
+
|
|
61
|
+
# with E:\ProgramFiles\MuMuPlayer-12.0\shell\MuMuPlayer.exe
|
|
62
|
+
# config is E:\ProgramFiles\MuMuPlayer-12.0\vms\MuMuPlayer-12.0-1\config\customer_config.json
|
|
63
|
+
try:
|
|
64
|
+
with open(file, mode='r', encoding='utf-8') as f:
|
|
65
|
+
s = f.read()
|
|
66
|
+
data = json.loads(s)
|
|
67
|
+
except FileNotFoundError:
|
|
68
|
+
logger.warning(f'Failed to check check_mumu_app_keep_alive, file {file} not exists')
|
|
69
|
+
return False
|
|
70
|
+
value = deep_get(data, keys='customer.app_keptlive', default=None)
|
|
71
|
+
logger.info(f'customer.app_keptlive {value}')
|
|
72
|
+
if str(value).lower() == 'true':
|
|
73
|
+
# https://mumu.163.com/help/20230802/35047_1102450.html
|
|
74
|
+
logger.error('Please turn off enable background keep alive in MuMuPlayer settings')
|
|
75
|
+
raise Exception('Please turn off enable background keep alive in MuMuPlayer settings')
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
@override
|
|
79
|
+
def close(self):
|
|
80
|
+
super().close()
|
|
81
|
+
if self.nemu_impl:
|
|
82
|
+
self.nemu_impl.disconnect()
|
|
83
|
+
self.nemu_impl = None
|
|
84
|
+
|
|
85
|
+
@override
|
|
86
|
+
def do_get_frame(self) -> np.ndarray | None:
|
|
87
|
+
self.init_nemu()
|
|
88
|
+
return self.screencap()
|
|
89
|
+
|
|
90
|
+
def screencap(self):
|
|
91
|
+
if self.exit_event.is_set():
|
|
92
|
+
return None
|
|
93
|
+
if self.nemu_impl:
|
|
94
|
+
frame = self.nemu_impl.screenshot(timeout=0.5)
|
|
95
|
+
return frame
|
|
96
|
+
|
|
97
|
+
def connected(self):
|
|
98
|
+
return True
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def deep_get(d, keys, default=None):
|
|
102
|
+
"""
|
|
103
|
+
Get values in dictionary safely.
|
|
104
|
+
https://stackoverflow.com/questions/25833613/safe-method-to-get-value-of-nested-dictionary
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
d (dict):
|
|
108
|
+
keys (str, list): Such as `Scheduler.NextRun.value`
|
|
109
|
+
default: Default return if key not found.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
|
|
113
|
+
"""
|
|
114
|
+
if isinstance(keys, str):
|
|
115
|
+
keys = keys.split('.')
|
|
116
|
+
assert type(keys) is list
|
|
117
|
+
if d is None:
|
|
118
|
+
return default
|
|
119
|
+
if not keys:
|
|
120
|
+
return d
|
|
121
|
+
return deep_get(d.get(keys[0]), keys[1:], default)
|