GameSentenceMiner 2.18.1__tar.gz → 2.21.25__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 (218) hide show
  1. gamesentenceminer-2.21.25/GameSentenceMiner/__init__.py +39 -0
  2. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/ai/ai_prompting.py +35 -34
  3. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/anki.py +254 -136
  4. gamesentenceminer-2.21.25/GameSentenceMiner/discord_rpc.py +133 -0
  5. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/gametext.py +157 -59
  6. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/gsm.py +361 -189
  7. gamesentenceminer-2.21.25/GameSentenceMiner/live_stats.py +58 -0
  8. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/locales/en_us.json +27 -8
  9. gamesentenceminer-2.21.25/GameSentenceMiner/locales/es_es.json +704 -0
  10. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/locales/ja_jp.json +28 -9
  11. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/locales/zh_cn.json +27 -8
  12. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/obs.py +310 -57
  13. gamesentenceminer-2.21.25/GameSentenceMiner/ocr/owocr_area_selector.py +633 -0
  14. gamesentenceminer-2.21.25/GameSentenceMiner/ocr/owocr_area_selector_qt.py +853 -0
  15. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/ocr/owocr_helper.py +174 -40
  16. gamesentenceminer-2.21.25/GameSentenceMiner/ocr/ss_picker.py +140 -0
  17. gamesentenceminer-2.21.25/GameSentenceMiner/ocr/ss_picker_qt.py +327 -0
  18. gamesentenceminer-2.21.25/GameSentenceMiner/owocr/owocr/__init__.py +1 -0
  19. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/owocr/owocr/config.py +2 -2
  20. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/owocr/owocr/ocr.py +797 -17
  21. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/owocr/owocr/run.py +58 -18
  22. gamesentenceminer-2.21.25/GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py +112 -0
  23. gamesentenceminer-2.21.25/GameSentenceMiner/tools/audio_offset_selector.py +215 -0
  24. gamesentenceminer-2.21.25/GameSentenceMiner/tools/furigana_filter_preview.py +410 -0
  25. gamesentenceminer-2.21.25/GameSentenceMiner/tools/ss_selector.py +134 -0
  26. gamesentenceminer-2.21.25/GameSentenceMiner/ui/__init__.py +87 -0
  27. gamesentenceminer-2.21.25/GameSentenceMiner/ui/anki_confirmation.py +337 -0
  28. gamesentenceminer-2.21.25/GameSentenceMiner/ui/anki_confirmation_qt.py +559 -0
  29. gamesentenceminer-2.21.25/GameSentenceMiner/ui/config_gui.py +2704 -0
  30. gamesentenceminer-2.21.25/GameSentenceMiner/ui/config_gui_qt.py +1675 -0
  31. gamesentenceminer-2.21.25/GameSentenceMiner/ui/furigana_filter_preview.py +410 -0
  32. gamesentenceminer-2.21.25/GameSentenceMiner/ui/furigana_filter_preview_qt.py +591 -0
  33. gamesentenceminer-2.21.25/GameSentenceMiner/ui/qt_main.py +444 -0
  34. gamesentenceminer-2.21.25/GameSentenceMiner/ui/screenshot_selector.py +224 -0
  35. gamesentenceminer-2.21.25/GameSentenceMiner/ui/screenshot_selector_qt.py +383 -0
  36. gamesentenceminer-2.21.25/GameSentenceMiner/util/audio_player.py +220 -0
  37. gamesentenceminer-2.21.25/GameSentenceMiner/util/communication/electron_ipc.py +114 -0
  38. gamesentenceminer-2.21.25/GameSentenceMiner/util/communication/send.py +19 -0
  39. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/configuration.py +168 -52
  40. gamesentenceminer-2.21.25/GameSentenceMiner/util/cron/__init__.py +12 -0
  41. gamesentenceminer-2.21.25/GameSentenceMiner/util/cron/daily_rollup.py +619 -0
  42. gamesentenceminer-2.21.25/GameSentenceMiner/util/cron/jiten_update.py +397 -0
  43. gamesentenceminer-2.21.25/GameSentenceMiner/util/cron/populate_games.py +154 -0
  44. gamesentenceminer-2.21.25/GameSentenceMiner/util/cron/run_crons.py +272 -0
  45. gamesentenceminer-2.21.25/GameSentenceMiner/util/cron/setup_populate_games_cron.py +118 -0
  46. gamesentenceminer-2.21.25/GameSentenceMiner/util/cron_table.py +334 -0
  47. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/db.py +483 -85
  48. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/downloader/download_tools.py +63 -37
  49. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/ffmpeg.py +314 -30
  50. gamesentenceminer-2.21.25/GameSentenceMiner/util/games_table.py +567 -0
  51. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/get_overlay_coords.py +199 -71
  52. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/gsm_utils.py +8 -4
  53. gamesentenceminer-2.21.25/GameSentenceMiner/util/hotkey.py +138 -0
  54. gamesentenceminer-2.21.25/GameSentenceMiner/util/jiten_api_client.py +188 -0
  55. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/model.py +4 -2
  56. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/notification.py +58 -3
  57. gamesentenceminer-2.21.25/GameSentenceMiner/util/stats_rollup_table.py +216 -0
  58. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/text_log.py +48 -46
  59. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/vad.py +39 -26
  60. gamesentenceminer-2.21.25/GameSentenceMiner/web/__init__.py +17 -0
  61. gamesentenceminer-2.21.25/GameSentenceMiner/web/anki_api_endpoints.py +724 -0
  62. gamesentenceminer-2.21.25/GameSentenceMiner/web/database_api.py +1679 -0
  63. gamesentenceminer-2.21.25/GameSentenceMiner/web/events.py +102 -0
  64. gamesentenceminer-2.21.25/GameSentenceMiner/web/goals_api.py +1718 -0
  65. gamesentenceminer-2.21.25/GameSentenceMiner/web/gsm_websocket.py +254 -0
  66. gamesentenceminer-2.21.25/GameSentenceMiner/web/jiten_database_api.py +1023 -0
  67. gamesentenceminer-2.21.25/GameSentenceMiner/web/rollup_stats.py +672 -0
  68. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/service.py +79 -35
  69. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/css/dashboard-shared.css +75 -13
  70. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/css/goals.css +309 -0
  71. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/css/loading-skeleton.css +41 -0
  72. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/css/overview.css +604 -47
  73. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/css/search.css +294 -0
  74. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/css/shared.css +801 -0
  75. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/css/stats.css +509 -0
  76. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/anki_stats.js +424 -0
  77. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/components/bar-chart.js +339 -0
  78. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-bulk-operations.js +320 -0
  79. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-game-data.js +390 -0
  80. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-game-operations.js +213 -0
  81. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-helpers.js +44 -0
  82. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-jiten-integration.js +750 -0
  83. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-popups.js +89 -0
  84. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-tabs.js +64 -0
  85. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database-text-management.js +371 -0
  86. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/database.js +150 -0
  87. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/goals.js +2124 -0
  88. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/heatmap.js +350 -0
  89. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/overview.js +2170 -0
  90. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/regex-patterns.js +100 -0
  91. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/search.js +661 -0
  92. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/js/shared.js +212 -41
  93. gamesentenceminer-2.21.25/GameSentenceMiner/web/static/js/stats.js +2635 -0
  94. gamesentenceminer-2.21.25/GameSentenceMiner/web/stats.py +1648 -0
  95. gamesentenceminer-2.21.25/GameSentenceMiner/web/stats_api.py +2107 -0
  96. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/anki_stats.html +134 -60
  97. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/components/date-range.html +134 -0
  98. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/components/html-head.html +79 -0
  99. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/components/js-config.html +37 -0
  100. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/components/popups.html +15 -0
  101. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/components/regex-input.html +160 -0
  102. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/components/settings-modal.html +251 -0
  103. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/database.html +809 -0
  104. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/goals.html +433 -0
  105. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/index.html +51 -0
  106. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/overview.html +278 -0
  107. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/search.html +226 -0
  108. gamesentenceminer-2.21.25/GameSentenceMiner/web/templates/stats.html +291 -0
  109. gamesentenceminer-2.21.25/GameSentenceMiner/web/texthooking_page.py +553 -0
  110. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25/GameSentenceMiner.egg-info}/PKG-INFO +109 -32
  111. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner.egg-info/SOURCES.txt +48 -1
  112. gamesentenceminer-2.21.25/GameSentenceMiner.egg-info/requires.txt +51 -0
  113. gamesentenceminer-2.18.1/README.md → gamesentenceminer-2.21.25/PKG-INFO +132 -3
  114. gamesentenceminer-2.18.1/GameSentenceMiner.egg-info/PKG-INFO → gamesentenceminer-2.21.25/README.md +68 -54
  115. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/pyproject.toml +42 -31
  116. gamesentenceminer-2.18.1/GameSentenceMiner/ocr/owocr_area_selector.py +0 -630
  117. gamesentenceminer-2.18.1/GameSentenceMiner/ocr/ss_picker.py +0 -140
  118. gamesentenceminer-2.18.1/GameSentenceMiner/owocr/owocr/__init__.py +0 -1
  119. gamesentenceminer-2.18.1/GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py +0 -109
  120. gamesentenceminer-2.18.1/GameSentenceMiner/tools/audio_offset_selector.py +0 -215
  121. gamesentenceminer-2.18.1/GameSentenceMiner/tools/furigana_filter_preview.py +0 -330
  122. gamesentenceminer-2.18.1/GameSentenceMiner/tools/ss_selector.py +0 -134
  123. gamesentenceminer-2.18.1/GameSentenceMiner/ui/anki_confirmation.py +0 -187
  124. gamesentenceminer-2.18.1/GameSentenceMiner/ui/config_gui.py +0 -2548
  125. gamesentenceminer-2.18.1/GameSentenceMiner/ui/screenshot_selector.py +0 -215
  126. gamesentenceminer-2.18.1/GameSentenceMiner/util/communication/send.py +0 -7
  127. gamesentenceminer-2.18.1/GameSentenceMiner/util/communication/websocket.py +0 -95
  128. gamesentenceminer-2.18.1/GameSentenceMiner/util/downloader/__init__.py +0 -0
  129. gamesentenceminer-2.18.1/GameSentenceMiner/web/__init__.py +0 -0
  130. gamesentenceminer-2.18.1/GameSentenceMiner/web/database_api.py +0 -1733
  131. gamesentenceminer-2.18.1/GameSentenceMiner/web/events.py +0 -178
  132. gamesentenceminer-2.18.1/GameSentenceMiner/web/gsm_websocket.py +0 -120
  133. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/__init__.py +0 -0
  134. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/css/search.css +0 -14
  135. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/js/anki_stats.js +0 -170
  136. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/js/database.js +0 -745
  137. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/js/goals.js +0 -610
  138. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/js/overview.js +0 -1176
  139. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/js/search.js +0 -297
  140. gamesentenceminer-2.18.1/GameSentenceMiner/web/static/js/stats.js +0 -902
  141. gamesentenceminer-2.18.1/GameSentenceMiner/web/stats.py +0 -587
  142. gamesentenceminer-2.18.1/GameSentenceMiner/web/templates/database.html +0 -352
  143. gamesentenceminer-2.18.1/GameSentenceMiner/web/templates/goals.html +0 -376
  144. gamesentenceminer-2.18.1/GameSentenceMiner/web/templates/index.html +0 -51
  145. gamesentenceminer-2.18.1/GameSentenceMiner/web/templates/overview.html +0 -416
  146. gamesentenceminer-2.18.1/GameSentenceMiner/web/templates/search.html +0 -111
  147. gamesentenceminer-2.18.1/GameSentenceMiner/web/templates/stats.html +0 -399
  148. gamesentenceminer-2.18.1/GameSentenceMiner/web/texthooking_page.py +0 -427
  149. gamesentenceminer-2.18.1/GameSentenceMiner.egg-info/requires.txt +0 -40
  150. {gamesentenceminer-2.18.1/GameSentenceMiner → gamesentenceminer-2.21.25/GameSentenceMiner/ai}/__init__.py +0 -0
  151. {gamesentenceminer-2.18.1/GameSentenceMiner/ai → gamesentenceminer-2.21.25/GameSentenceMiner/assets}/__init__.py +0 -0
  152. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/assets/icon.png +0 -0
  153. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/assets/icon128.png +0 -0
  154. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/assets/icon256.png +0 -0
  155. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/assets/icon32.png +0 -0
  156. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/assets/icon512.png +0 -0
  157. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/assets/icon64.png +0 -0
  158. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/assets/pickaxe.png +0 -0
  159. {gamesentenceminer-2.18.1/GameSentenceMiner/assets → gamesentenceminer-2.21.25/GameSentenceMiner/ocr}/__init__.py +0 -0
  160. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/ocr/gsm_ocr_config.py +0 -0
  161. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/ocr/ocrconfig.py +0 -0
  162. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/owocr/owocr/__main__.py +0 -0
  163. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/owocr/owocr/lens_betterproto.py +0 -0
  164. {gamesentenceminer-2.18.1/GameSentenceMiner/ocr → gamesentenceminer-2.21.25/GameSentenceMiner/tools}/__init__.py +0 -0
  165. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/tools/window_transparency.py +0 -0
  166. {gamesentenceminer-2.18.1/GameSentenceMiner/tools → gamesentenceminer-2.21.25/GameSentenceMiner/util}/__init__.py +0 -0
  167. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/communication/__init__.py +0 -0
  168. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/downloader/Untitled_json.py +0 -0
  169. {gamesentenceminer-2.18.1/GameSentenceMiner/ui → gamesentenceminer-2.21.25/GameSentenceMiner/util/downloader}/__init__.py +0 -0
  170. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/downloader/oneocr_dl.py +0 -0
  171. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/electron_config.py +0 -0
  172. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/win10toast/__init__.py +0 -0
  173. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/util/win10toast/__main__.py +0 -0
  174. {gamesentenceminer-2.18.1/GameSentenceMiner/util → gamesentenceminer-2.21.25/GameSentenceMiner/web/static}/__init__.py +0 -0
  175. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/apple-touch-icon.png +0 -0
  176. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/css/kanji-grid.css +0 -0
  177. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/css/popups-shared.css +0 -0
  178. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/favicon-96x96.png +0 -0
  179. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/favicon.ico +0 -0
  180. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/favicon.svg +0 -0
  181. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/js/kanji-grid.js +0 -0
  182. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/site.webmanifest +0 -0
  183. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/style.css +0 -0
  184. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/web-app-manifest-192x192.png +0 -0
  185. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/static/web-app-manifest-512x512.png +0 -0
  186. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/basic_kanji_book_bkb_v1_v2.json +0 -0
  187. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/duolingo_kanji.json +0 -0
  188. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/grade.json +0 -0
  189. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/hk_primary_learning.json +0 -0
  190. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/hkscs2016.json +0 -0
  191. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/hsk_levels.json +0 -0
  192. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/humanum_frequency_list.json +0 -0
  193. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/jis_levels.json +0 -0
  194. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/jlpt_level.json +0 -0
  195. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/jpdb_kanji_frequency_list.json +0 -0
  196. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/jpdbv2_kanji_frequency_list.json +0 -0
  197. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/jun_das_modern_chinese_character_frequency_list.json +0 -0
  198. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/kanji_in_context_revised_edition.json +0 -0
  199. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/kanji_kentei_level.json +0 -0
  200. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/mainland_china_elementary_textbook_characters.json +0 -0
  201. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/moe_way_quiz.json +0 -0
  202. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/official_kanji.json +0 -0
  203. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/remembering_the_kanji.json +0 -0
  204. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/standard_form_of_national_characters.json +0 -0
  205. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/table_of_general_standard_chinese_characters.json +0 -0
  206. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/the_kodansha_kanji_learners_course_klc.json +0 -0
  207. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/thousand_character_classic.json +0 -0
  208. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/wanikani_levels.json +0 -0
  209. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/kanji_grid/words_hk_frequency_list.json +0 -0
  210. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/navigation.html +0 -0
  211. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/components/theme-styles.html +0 -0
  212. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/web/templates/utility.html +0 -0
  213. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner/wip/__init___.py +0 -0
  214. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner.egg-info/dependency_links.txt +0 -0
  215. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner.egg-info/entry_points.txt +0 -0
  216. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/GameSentenceMiner.egg-info/top_level.txt +0 -0
  217. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/LICENSE +0 -0
  218. {gamesentenceminer-2.18.1 → gamesentenceminer-2.21.25}/setup.cfg +0 -0
@@ -0,0 +1,39 @@
1
+ import os
2
+
3
+ # Remove environment variables that could interfere with managed Python instance
4
+ # This prevents conflicts with user's system Python installations and configurations
5
+
6
+ # Tk/Tcl libraries
7
+ os.environ.pop('TCL_LIBRARY', None)
8
+ os.environ.pop('TK_LIBRARY', None)
9
+
10
+ # Python-specific paths that could cause module conflicts
11
+ os.environ.pop('PYTHONPATH', None)
12
+ os.environ.pop('PYTHONHOME', None)
13
+ os.environ.pop('PYTHONSTARTUP', None)
14
+ os.environ.pop('PYTHONUSERBASE', None)
15
+
16
+ # Virtual environment variables
17
+ os.environ.pop('VIRTUAL_ENV', None)
18
+ os.environ.pop('CONDA_PREFIX', None)
19
+ os.environ.pop('CONDA_DEFAULT_ENV', None)
20
+ os.environ.pop('CONDA_PYTHON_EXE', None)
21
+
22
+ # Python version managers
23
+ os.environ.pop('PYENV_ROOT', None)
24
+ os.environ.pop('PYENV_VERSION', None)
25
+ os.environ.pop('PYENV_SHELL', None)
26
+
27
+ # Poetry package manager
28
+ os.environ.pop('POETRY_ACTIVE', None)
29
+ os.environ.pop('POETRY_HOME', None)
30
+
31
+ # Pip configuration that could override behavior
32
+ os.environ.pop('PIP_CONFIG_FILE', None)
33
+ os.environ.pop('PIP_REQUIRE_VIRTUALENV', None)
34
+
35
+ # Prevent user site-packages from being loaded
36
+ # os.environ['PYTHONNOUSERSITE'] = '1'
37
+
38
+ # Isolate from system installations
39
+ os.environ['PYTHONIOENCODING'] = 'utf-8'
@@ -213,13 +213,17 @@ class OpenAIManager(AIManager):
213
213
  text_output = response.choices[0].message.content.strip()
214
214
  # get the json at the end of the message
215
215
  if "{" in text_output and "}" in text_output:
216
- json_output = text_output[text_output.find(
217
- "{"):text_output.rfind("}")+1]
218
- text_output = json.loads(json_output)['output']
216
+ try:
217
+ json_output = text_output[text_output.find(
218
+ "{"):text_output.rfind("}")+1]
219
+ json_output = json_output.replace("{output:", '{"output":')
220
+ text_output = json.loads(json_output)['output']
221
+ except Exception as e:
222
+ self.logger.debug(f"Failed to parse JSON from response returning response raw: {e}", exc_info=True)
219
223
  # self.logger.debug(f"Received response:\n{text_output}")
220
224
  return text_output
221
225
  except Exception as e:
222
- self.logger.error(f"OpenAI processing failed: {e}")
226
+ self.logger.error(f"OpenAI processing failed: {e}", exc_info=True)
223
227
  return f"Processing failed: {e}"
224
228
 
225
229
 
@@ -361,37 +365,34 @@ def get_ai_prompt_result(lines: List[GameLine], sentence: str, current_line: Gam
361
365
  "No internet connection. Unable to proceed with AI prompt.")
362
366
  return ""
363
367
 
364
- if not ai_manager or ai_config_changed(get_config().ai, current_ai_config) or force_refresh:
365
- provider = get_config().ai.provider
366
- if provider == AIType.GEMINI.value:
367
- if get_config().ai.gemini_model in ai_managers:
368
- ai_manager = ai_managers[get_config().ai.gemini_model]
369
- logger.info(
370
- f"Reusing existing Gemini AI Manager for model: {get_config().ai.gemini_model}")
371
- else:
372
- ai_manager = GeminiAI(model=get_config(
373
- ).ai.gemini_model, api_key=get_config().ai.gemini_api_key, logger=logger)
374
- elif provider == AIType.GROQ.value:
375
- if get_config().ai.groq_model in ai_managers:
376
- ai_manager = ai_managers[get_config().ai.groq_model]
377
- logger.info(
378
- f"Reusing existing Groq AI Manager for model: {get_config().ai.groq_model}")
379
- else:
380
- ai_manager = GroqAI(model=get_config(
381
- ).ai.groq_model, api_key=get_config().ai.groq_api_key, logger=logger)
382
- elif provider == AIType.OPENAI.value:
383
- if f"{get_config().ai.open_ai_url}:{get_config().ai.open_ai_model}:{get_config().ai.open_ai_api_key}" in ai_managers:
384
- ai_manager = ai_managers[f"{get_config().ai.open_ai_url}:{get_config().ai.open_ai_model}:{get_config().ai.open_ai_api_key}"]
385
- logger.info(
386
- f"Reusing existing OpenAI AI Manager for model: {get_config().ai.open_ai_model}")
387
- else:
388
- ai_manager = OpenAIManager(model=get_config().ai.open_ai_model, api_key=get_config(
389
- ).ai.open_ai_api_key, api_url=get_config().ai.open_ai_url, logger=logger)
368
+ provider = get_config().ai.provider
369
+ if provider == AIType.GEMINI.value:
370
+ if get_config().ai.gemini_model in ai_managers:
371
+ ai_manager = ai_managers[get_config().ai.gemini_model]
372
+ logger.info(
373
+ f"Reusing existing Gemini AI Manager for model: {get_config().ai.gemini_model}")
390
374
  else:
391
- ai_manager = None
392
- if ai_manager:
393
- ai_managers[ai_manager.model_name] = ai_manager
394
- current_ai_config = get_config().ai
375
+ ai_manager = GeminiAI(model=get_config(
376
+ ).ai.gemini_model, api_key=get_config().ai.gemini_api_key, logger=logger)
377
+ elif provider == AIType.GROQ.value:
378
+ if get_config().ai.groq_model in ai_managers:
379
+ ai_manager = ai_managers[get_config().ai.groq_model]
380
+ logger.info(
381
+ f"Reusing existing Groq AI Manager for model: {get_config().ai.groq_model}")
382
+ else:
383
+ ai_manager = GroqAI(model=get_config(
384
+ ).ai.groq_model, api_key=get_config().ai.groq_api_key, logger=logger)
385
+ elif provider == AIType.OPENAI.value:
386
+ if f"{get_config().ai.open_ai_url}:{get_config().ai.open_ai_model}:{get_config().ai.open_ai_api_key}" in ai_managers:
387
+ ai_manager = ai_managers[f"{get_config().ai.open_ai_url}:{get_config().ai.open_ai_model}:{get_config().ai.open_ai_api_key}"]
388
+ logger.info(
389
+ f"Reusing existing OpenAI AI Manager for model: {get_config().ai.open_ai_model}")
390
+ else:
391
+ ai_manager = OpenAIManager(model=get_config().ai.open_ai_model, api_key=get_config(
392
+ ).ai.open_ai_api_key, api_url=get_config().ai.open_ai_url, logger=logger)
393
+ if ai_manager:
394
+ ai_managers[ai_manager.model_name] = ai_manager
395
+ current_ai_config = get_config().ai
395
396
 
396
397
  if not ai_manager:
397
398
  logger.error(