GameSentenceMiner 2.19.2.dev0__tar.gz → 2.19.4__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 (149) hide show
  1. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/anki.py +3 -3
  2. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/gsm.py +4 -4
  3. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/obs.py +2 -1
  4. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ocr/owocr_helper.py +63 -3
  5. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/owocr/owocr/ocr.py +573 -0
  6. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/owocr/owocr/run.py +7 -0
  7. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ui/config_gui.py +8 -0
  8. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/text_log.py +6 -4
  9. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/texthooking_page.py +17 -2
  10. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner.egg-info/PKG-INFO +35 -34
  11. gamesentenceminer-2.19.4/GameSentenceMiner.egg-info/requires.txt +39 -0
  12. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/PKG-INFO +35 -34
  13. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/pyproject.toml +36 -35
  14. gamesentenceminer-2.19.2.dev0/GameSentenceMiner.egg-info/requires.txt +0 -38
  15. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/__init__.py +0 -0
  16. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ai/__init__.py +0 -0
  17. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ai/ai_prompting.py +0 -0
  18. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/__init__.py +0 -0
  19. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/icon.png +0 -0
  20. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/icon128.png +0 -0
  21. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/icon256.png +0 -0
  22. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/icon32.png +0 -0
  23. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/icon512.png +0 -0
  24. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/icon64.png +0 -0
  25. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/assets/pickaxe.png +0 -0
  26. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/gametext.py +0 -0
  27. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/locales/en_us.json +0 -0
  28. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/locales/ja_jp.json +0 -0
  29. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/locales/zh_cn.json +0 -0
  30. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ocr/__init__.py +0 -0
  31. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ocr/gsm_ocr_config.py +0 -0
  32. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ocr/ocrconfig.py +0 -0
  33. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ocr/owocr_area_selector.py +0 -0
  34. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ocr/ss_picker.py +0 -0
  35. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/owocr/owocr/__init__.py +0 -0
  36. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/owocr/owocr/__main__.py +0 -0
  37. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/owocr/owocr/config.py +0 -0
  38. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/owocr/owocr/lens_betterproto.py +0 -0
  39. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py +0 -0
  40. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/tools/__init__.py +0 -0
  41. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/tools/audio_offset_selector.py +0 -0
  42. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/tools/furigana_filter_preview.py +0 -0
  43. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/tools/ss_selector.py +0 -0
  44. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/tools/window_transparency.py +0 -0
  45. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ui/__init__.py +0 -0
  46. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ui/anki_confirmation.py +0 -0
  47. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ui/furigana_filter_preview.py +0 -0
  48. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/ui/screenshot_selector.py +0 -0
  49. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/__init__.py +0 -0
  50. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/audio_player.py +0 -0
  51. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/communication/__init__.py +0 -0
  52. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/communication/send.py +0 -0
  53. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/communication/websocket.py +0 -0
  54. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/configuration.py +0 -0
  55. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/db.py +0 -0
  56. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/downloader/Untitled_json.py +0 -0
  57. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/downloader/__init__.py +0 -0
  58. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/downloader/download_tools.py +0 -0
  59. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/downloader/oneocr_dl.py +0 -0
  60. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/electron_config.py +0 -0
  61. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/ffmpeg.py +0 -0
  62. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/games_table.py +0 -0
  63. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/get_overlay_coords.py +0 -0
  64. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/gsm_utils.py +0 -0
  65. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/model.py +0 -0
  66. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/notification.py +0 -0
  67. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/win10toast/__init__.py +0 -0
  68. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/util/win10toast/__main__.py +0 -0
  69. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/vad.py +0 -0
  70. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/__init__.py +0 -0
  71. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/anki_api_endpoints.py +0 -0
  72. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/database_api.py +0 -0
  73. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/events.py +0 -0
  74. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/gsm_websocket.py +0 -0
  75. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/service.py +0 -0
  76. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/__init__.py +0 -0
  77. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/apple-touch-icon.png +0 -0
  78. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/dashboard-shared.css +0 -0
  79. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/kanji-grid.css +0 -0
  80. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/loading-skeleton.css +0 -0
  81. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/overview.css +0 -0
  82. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/popups-shared.css +0 -0
  83. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/search.css +0 -0
  84. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/shared.css +0 -0
  85. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/css/stats.css +0 -0
  86. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/favicon-96x96.png +0 -0
  87. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/favicon.ico +0 -0
  88. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/favicon.svg +0 -0
  89. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/anki_stats.js +0 -0
  90. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/database.js +0 -0
  91. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/goals.js +0 -0
  92. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/heatmap.js +0 -0
  93. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/kanji-grid.js +0 -0
  94. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/overview.js +0 -0
  95. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/search.js +0 -0
  96. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/shared.js +0 -0
  97. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/js/stats.js +0 -0
  98. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/site.webmanifest +0 -0
  99. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/style.css +0 -0
  100. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/web-app-manifest-192x192.png +0 -0
  101. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/static/web-app-manifest-512x512.png +0 -0
  102. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/stats.py +0 -0
  103. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/anki_stats.html +0 -0
  104. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/date-range.html +0 -0
  105. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/html-head.html +0 -0
  106. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/js-config.html +0 -0
  107. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/basic_kanji_book_bkb_v1_v2.json +0 -0
  108. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/duolingo_kanji.json +0 -0
  109. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/grade.json +0 -0
  110. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/hk_primary_learning.json +0 -0
  111. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/hkscs2016.json +0 -0
  112. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/hsk_levels.json +0 -0
  113. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/humanum_frequency_list.json +0 -0
  114. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/jis_levels.json +0 -0
  115. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/jlpt_level.json +0 -0
  116. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/jpdb_kanji_frequency_list.json +0 -0
  117. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/jpdbv2_kanji_frequency_list.json +0 -0
  118. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/jun_das_modern_chinese_character_frequency_list.json +0 -0
  119. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/kanji_in_context_revised_edition.json +0 -0
  120. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/kanji_kentei_level.json +0 -0
  121. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/mainland_china_elementary_textbook_characters.json +0 -0
  122. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/moe_way_quiz.json +0 -0
  123. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/official_kanji.json +0 -0
  124. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/remembering_the_kanji.json +0 -0
  125. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/standard_form_of_national_characters.json +0 -0
  126. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/table_of_general_standard_chinese_characters.json +0 -0
  127. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/the_kodansha_kanji_learners_course_klc.json +0 -0
  128. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/thousand_character_classic.json +0 -0
  129. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/wanikani_levels.json +0 -0
  130. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/kanji_grid/words_hk_frequency_list.json +0 -0
  131. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/navigation.html +0 -0
  132. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/popups.html +0 -0
  133. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/settings-modal.html +0 -0
  134. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/components/theme-styles.html +0 -0
  135. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/database.html +0 -0
  136. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/goals.html +0 -0
  137. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/index.html +0 -0
  138. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/overview.html +0 -0
  139. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/search.html +0 -0
  140. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/stats.html +0 -0
  141. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/web/templates/utility.html +0 -0
  142. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner/wip/__init___.py +0 -0
  143. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner.egg-info/SOURCES.txt +0 -0
  144. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner.egg-info/dependency_links.txt +0 -0
  145. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner.egg-info/entry_points.txt +0 -0
  146. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/GameSentenceMiner.egg-info/top_level.txt +0 -0
  147. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/LICENSE +0 -0
  148. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/README.md +0 -0
  149. {gamesentenceminer-2.19.2.dev0 → gamesentenceminer-2.19.4}/setup.cfg +0 -0
@@ -559,10 +559,10 @@ def update_new_card():
559
559
  else:
560
560
  logger.info("New card(s) detected! Added to Processing Queue!")
561
561
  gsm_state.last_mined_line = game_line
562
- queue_card_for_processing(last_card, lines)
562
+ queue_card_for_processing(last_card, lines, game_line)
563
563
 
564
- def queue_card_for_processing(last_card, lines):
565
- card_queue.append((last_card, datetime.now(), lines))
564
+ def queue_card_for_processing(last_card, lines, last_mined_line):
565
+ card_queue.append((last_card, datetime.now(), lines, last_mined_line))
566
566
  texthooking_page.reset_checked_lines()
567
567
  try:
568
568
  obs.save_replay_buffer()
@@ -32,7 +32,7 @@ try:
32
32
 
33
33
  import keyboard
34
34
  import ttkbootstrap as ttk
35
- from PIL import Image, ImageDraw
35
+ from PIL import Image
36
36
  from pystray import Icon, Menu, MenuItem
37
37
  from watchdog.events import FileSystemEventHandler
38
38
  from watchdog.observers import Observer
@@ -187,7 +187,7 @@ class VideoToAudioHandler(FileSystemEventHandler):
187
187
  return
188
188
  try:
189
189
  if anki.card_queue and len(anki.card_queue) > 0:
190
- last_note, anki_card_creation_time, selected_lines = anki.card_queue.pop(
190
+ last_note, anki_card_creation_time, selected_lines, mined_line = anki.card_queue.pop(
191
191
  0)
192
192
  else:
193
193
  logger.info(
@@ -211,11 +211,11 @@ class VideoToAudioHandler(FileSystemEventHandler):
211
211
  full_text = ''
212
212
  if selected_lines:
213
213
  start_line = selected_lines[0]
214
- mined_line = get_mined_line(last_note, selected_lines)
214
+ # mined_line = get_mined_line(last_note, selected_lines)
215
215
  line_cutoff = selected_lines[-1].get_next_time()
216
216
  full_text = remove_html_and_cloze_tags(note['fields'][get_config().anki.sentence_field])
217
217
  else:
218
- mined_line = get_text_event(last_note)
218
+ # mined_line = get_text_event(last_note)
219
219
  if mined_line:
220
220
  start_line = mined_line
221
221
  if mined_line.next:
@@ -64,7 +64,8 @@ class OBSConnectionPool:
64
64
  except Exception as e:
65
65
  if str(e) == self.last_error_shown[i]:
66
66
  continue
67
- logger.error(f"Failed to create client {i} in pool: {e}")
67
+ if self.connected_once:
68
+ logger.error(f"Failed to create client {i} in pool during initial connection: {e}")
68
69
  self.last_error_shown[i] = str(e)
69
70
  return True
70
71
 
@@ -344,15 +344,75 @@ def reset_callback_vars():
344
344
 
345
345
  # def get_ocr_ocr2(self):
346
346
  # return self.ocr2
347
+ last_meiki_crop_coords = None
348
+ last_meiki_crop_time = None
349
+ last_meiki_success = None
347
350
 
348
- def text_callback(text, orig_text, time, img=None, came_from_ss=False, filtering=None, crop_coords=None):
349
- global twopassocr, ocr2, previous_text, last_oneocr_time, text_stable_start_time, previous_orig_text, previous_img, force_stable, previous_ocr1_result, previous_text_list, last_sent_result
351
+
352
+ def text_callback(text, orig_text, time, img=None, came_from_ss=False, filtering=None, crop_coords=None, meiki_boxes=None):
353
+ global twopassocr, ocr2, previous_text, last_oneocr_time, text_stable_start_time, previous_orig_text, previous_img, force_stable, previous_ocr1_result, previous_text_list, last_sent_result, last_meiki_crop_coords, last_meiki_success, last_meiki_crop_time
350
354
  orig_text_string = ''.join([item for item in orig_text if item is not None]) if orig_text else ""
351
355
  if came_from_ss:
352
356
  save_result_image(img)
353
357
  asyncio.run(send_result(text, time))
354
358
  return
355
-
359
+
360
+ if meiki_boxes:
361
+ # If we don't have a previous meiki crop coords, store this one and wait for the next run
362
+ try:
363
+ if last_meiki_crop_coords is None:
364
+ last_meiki_crop_coords = crop_coords
365
+ last_meiki_crop_time = time
366
+ previous_img = img
367
+ return
368
+
369
+ # Ensure both coords exist
370
+ if not crop_coords or not last_meiki_crop_coords:
371
+ last_meiki_crop_coords = crop_coords
372
+ last_meiki_crop_time = time
373
+ return
374
+
375
+ # Compare coordinates within tolerance (pixels)
376
+ tol = 5
377
+ try:
378
+ close = all(abs(int(crop_coords[i]) - int(last_meiki_crop_coords[i])) <= tol for i in range(4))
379
+ except Exception:
380
+ # Fallback: if values not int-convertible, set not close
381
+ close = False
382
+
383
+ if close:
384
+ if all(last_meiki_success and abs(int(crop_coords[i]) - int(last_meiki_success[i])) <= tol for i in range(4)):
385
+ # Reset last_meiki_crop_coords and time so we require another matching pair for a future queue
386
+ last_meiki_crop_coords = None
387
+ last_meiki_crop_time = None
388
+ return
389
+ # Stable crop: queue second OCR immediately
390
+ try:
391
+ stable_time = last_meiki_crop_time
392
+ previous_img_local = previous_img
393
+ pre_crop_image = previous_img_local
394
+ ocr2_image = get_ocr2_image(crop_coords, og_image=previous_img_local, ocr2_engine=get_ocr_ocr2())
395
+ # Use the earlier timestamp for when the stable crop started if available
396
+ # ocr2_image.show()
397
+ second_ocr_queue.put((text, stable_time, ocr2_image, filtering, pre_crop_image))
398
+ run.set_last_image(img)
399
+ last_meiki_success = crop_coords
400
+ except Exception as e:
401
+ logger.info(f"Failed to queue second OCR task: {e}", exc_info=True)
402
+ # Reset last_meiki_crop_coords and time so we require another matching pair for a future queue
403
+ last_meiki_crop_coords = None
404
+ last_meiki_crop_time = None
405
+ return
406
+ else:
407
+ # Not stable: replace last and wait for the next run
408
+ last_meiki_crop_coords = crop_coords
409
+ last_meiki_success = None
410
+ previous_img = img
411
+ return
412
+ except Exception as e:
413
+ logger.debug(f"Error handling meiki crop coords stability check: {e}")
414
+ last_meiki_crop_coords = crop_coords
415
+
356
416
  if not text:
357
417
  run.set_last_image(img)
358
418