GameSentenceMiner 2.11.7__py3-none-any.whl → 2.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,241 @@
1
+ import asyncio
2
+ import io
3
+ import base64
4
+ from PIL import Image
5
+
6
+ from GameSentenceMiner.owocr.owocr.ocr import GoogleLens, OneOCR
7
+ from GameSentenceMiner.obs import *
8
+
9
+ # OBS WebSocket settings
10
+ OBS_HOST = 'localhost'
11
+ OBS_PORT = 7274
12
+ OBS_PASSWORD = 'your_obs_websocket_password' # Set your OBS WebSocket password here, if any
13
+
14
+ WINDOW_NAME = "Nier:Automata"
15
+ WIDTH = 2560
16
+ HEIGHT = 1440
17
+ oneocr = OneOCR()
18
+ lens = GoogleLens()
19
+
20
+ def correct_ocr_text(detected_text: str, reference_text: str) -> str:
21
+ """
22
+ Correct OCR text by comparing character-by-character with reference text.
23
+ When mismatches are found, look for subsequent matches and correct previous mismatches.
24
+ """
25
+ if not detected_text or not reference_text:
26
+ return detected_text
27
+
28
+ detected_chars = list(detected_text)
29
+ reference_chars = list(reference_text)
30
+
31
+ # Track positions where mismatches occurred
32
+ mismatched_positions = []
33
+
34
+ min_length = min(len(detected_chars), len(reference_chars))
35
+
36
+ for i in range(min_length):
37
+ if detected_chars[i] != reference_chars[i]:
38
+ mismatched_positions.append(i)
39
+ logger.info(f"Mismatch at position {i}: detected '{detected_chars[i]}' vs reference '{reference_chars[i]}'")
40
+ else:
41
+ # We found a match - if we have previous mismatches, correct the most recent one
42
+ if mismatched_positions:
43
+ # Correct the most recent mismatch (simple 1-for-1 strategy)
44
+ last_mismatch_pos = mismatched_positions.pop()
45
+ old_char = detected_chars[last_mismatch_pos]
46
+ detected_chars[last_mismatch_pos] = reference_chars[last_mismatch_pos]
47
+ logger.info(f"Corrected position {last_mismatch_pos}: '{old_char}' -> '{reference_chars[last_mismatch_pos]}'")
48
+
49
+ corrected_text = ''.join(detected_chars)
50
+ return corrected_text
51
+
52
+ def redistribute_corrected_text(original_boxes: list, original_text: str, corrected_text: str) -> list:
53
+ """
54
+ Redistribute corrected text back to the original text boxes while maintaining their positions.
55
+ """
56
+ if original_text == corrected_text:
57
+ return original_boxes
58
+
59
+ corrected_boxes = []
60
+ text_position = 0
61
+
62
+ for box in original_boxes:
63
+ original_word = box['text']
64
+ word_length = len(original_word)
65
+
66
+ # Extract the corrected portion for this box
67
+ if text_position + word_length <= len(corrected_text):
68
+ corrected_word = corrected_text[text_position:text_position + word_length]
69
+ else:
70
+ # Handle case where corrected text is shorter
71
+ corrected_word = corrected_text[text_position:] if text_position < len(corrected_text) else ""
72
+
73
+ # Create a new box with corrected text but same coordinates
74
+ corrected_box = box.copy()
75
+ corrected_box['text'] = corrected_word
76
+ corrected_boxes.append(corrected_box)
77
+
78
+ text_position += word_length
79
+
80
+ logger.info(f"Redistributed: '{original_word}' -> '{corrected_word}'")
81
+
82
+ return corrected_boxes
83
+
84
+ async def get_full_screenshot() -> Image.Image | None:
85
+ # logger.info(f"Attempting to connect to OBS WebSocket at ws://{OBS_HOST}:{OBS_PORT}")
86
+ # try:
87
+ # client = obs.ReqClient(host=OBS_HOST, port=OBS_PORT, password=OBS_PASSWORD, timeout=30)
88
+ # logger.info("Connected to OBS WebSocket.")
89
+ # except Exception as e:
90
+ # logger.info(f"Failed to connect to OBS: {e}")
91
+ # return None
92
+ #
93
+ # try:
94
+ # response = client.get_source_screenshot(
95
+ # name=WINDOW_NAME,
96
+ # img_format='png',
97
+ # quality=75,
98
+ # width=WIDTH,
99
+ # height=HEIGHT,
100
+ # )
101
+ #
102
+ # if not response.image_data:
103
+ # logger.info("Failed to get screenshot data from OBS.")
104
+ # return None
105
+
106
+ logger.info("Getting Screenshot from OBS")
107
+ try:
108
+ update_current_game()
109
+ start_time = time.time()
110
+ image_data = get_screenshot_base64(compression=75, width=1280, height=720)
111
+ image_data = base64.b64decode(image_data)
112
+ img = Image.open(io.BytesIO(image_data)).convert("RGBA").resize((WIDTH, HEIGHT), Image.Resampling.LANCZOS)
113
+ # img.show()
114
+ logger.info(f"Screenshot captured in {time.time() - start_time:.2f} seconds.")
115
+
116
+ return img
117
+
118
+ except Exception as e:
119
+ logger.info(f"An unexpected error occurred during screenshot capture: {e}")
120
+ return None
121
+
122
+ async def do_work(sentence_to_check=None):
123
+ # connect_to_obs_sync(5)
124
+ logger.info("in find_box")
125
+ # await asyncio.sleep(.5)
126
+ logger.info("after_initial_sleep")
127
+ full_screenshot_image = await get_full_screenshot()
128
+ if os.path.exists("C:\\Users\\Beangate\\GSM\\temp"):
129
+ full_screenshot_image.save("C:\\Users\\Beangate\\GSM\\temp\\full_screenshot.png")
130
+ # full_screenshot_image.show()
131
+ if full_screenshot_image:
132
+ logger.info("Full screenshot captured successfully. Now performing local OCR...")
133
+ ocr_results = oneocr(full_screenshot_image, return_coords=True)
134
+
135
+ boxes_of_text = ocr_results[2]
136
+ # logger.info(f"Boxes of text found: {boxes_of_text}")
137
+
138
+ words = []
139
+
140
+ # If we have a reference sentence, perform character-by-character correction
141
+ if sentence_to_check:
142
+ # Concatenate all OCR text to form the detected sentence
143
+ detected_sentence = ''.join([box['text'] for box in boxes_of_text])
144
+ logger.info(f"Original detected sentence: '{detected_sentence}'")
145
+ logger.info(f"Reference sentence: '{sentence_to_check}'")
146
+
147
+ # Perform character-by-character comparison and correction
148
+ corrected_sentence = correct_ocr_text(detected_sentence, sentence_to_check)
149
+ logger.info(f"Corrected sentence: '{corrected_sentence}'")
150
+
151
+ # Redistribute corrected text back to boxes while maintaining positions
152
+ corrected_boxes = redistribute_corrected_text(boxes_of_text, detected_sentence, corrected_sentence)
153
+ else:
154
+ corrected_boxes = boxes_of_text
155
+
156
+ sentence_position = 0
157
+ for box in corrected_boxes:
158
+ word = box['text']
159
+ # logger.info(f"Box: {box}")
160
+ x1, y1 = box['bounding_rect']['x1'], box['bounding_rect']['y1']
161
+ x2, y2 = box['bounding_rect']['x3'], box['bounding_rect']['y3']
162
+ words.append({
163
+ "x1": x1,
164
+ "y1": y1,
165
+ "x2": x2,
166
+ "y2": y2,
167
+ "word": box['text']
168
+ })
169
+
170
+ # logger.info(f"Returning words: {words}")
171
+
172
+ ret = [
173
+ {
174
+ "words": words,
175
+ }
176
+ ]
177
+ # cropped_sections = []
178
+ # for box in boxes_of_text:
179
+ # # Ensure crop coordinates are within image bounds
180
+ # left = max(0, box['bounding_rect']['x1'])
181
+ # top = max(0, box['bounding_rect']['y1'])
182
+ # right = min(full_screenshot_image.width, box['bounding_rect']['x3'])
183
+ # bottom = min(full_screenshot_image.height, box['bounding_rect']['y3'])
184
+ # cropped_sections.append(full_screenshot_image.crop((left, top, right, bottom)))
185
+
186
+ # if len(cropped_sections) > 1:
187
+ # # Create a transparent image with the same size as the full screenshot
188
+ # combined_img = Image.new("RGBA", (full_screenshot_image.width, full_screenshot_image.height), (0, 0, 0, 0))
189
+
190
+ # combined_img.show()
191
+
192
+ # # Paste each cropped section at its original coordinates
193
+ # for box, section in zip(boxes_of_text, cropped_sections):
194
+ # left = max(0, box['bounding_rect']['x1'])
195
+ # top = max(0, box['bounding_rect']['y1'])
196
+ # combined_img.paste(section, (left, top))
197
+
198
+ # new_image = combined_img
199
+ # elif cropped_sections:
200
+ # new_image = cropped_sections[0]
201
+ # else:
202
+ # new_image = Image.new("RGBA", full_screenshot_image.size)
203
+
204
+ # new_image.show()
205
+ # ocr_results = lens(new_image, return_coords=True)
206
+ # ocr_results = oneocr(full_screenshot_image, sentence_to_check=sentence_to_check)
207
+ # logger.info("\n--- OCR Results ---")
208
+ # logger.info(ocr_results)
209
+
210
+ return ret, 48
211
+ # from PIL import ImageDraw
212
+ # draw = ImageDraw.Draw(full_screenshot_image)
213
+ # draw.rectangle([x1, y1, x2, y2], outline="red", width=3)
214
+ # full_screenshot_image.save("full_screenshot_with_ocr.png")
215
+ # full_screenshot_image.show()
216
+ #
217
+ # logger.info(ocr_results)
218
+ # if ocr_results:
219
+ # for i, result in enumerate(ocr_results):
220
+ # logger.info(f"Result {i + 1}:\n{result}\n")
221
+ # else:
222
+ # logger.info("No OCR results found.")
223
+ else:
224
+ logger.info("Failed to get full screenshot for OCR.")
225
+
226
+ async def find_box_for_sentence(sentence_to_check):
227
+ try:
228
+ return await do_work(sentence_to_check=sentence_to_check)
229
+ except Exception as e:
230
+ logger.info(f"Error in find_box_for_sentence: {e}", exc_info=True)
231
+ return [], 48
232
+
233
+ async def main():
234
+ connect_to_obs_sync(5)
235
+ await find_box_for_sentence("はじめから")
236
+
237
+ if __name__ == '__main__':
238
+ try:
239
+ asyncio.run(main())
240
+ except KeyboardInterrupt:
241
+ logger.info("Script terminated by user.")
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GameSentenceMiner
3
- Version: 2.11.7
4
- Summary: A tool for mining sentences from games. Update: Full UI Re-design
3
+ Version: 2.12.0
4
+ Summary: A tool for mining sentences from games. Update: Overlay?
5
5
  Author-email: Beangate <bpwhelan95@gmail.com>
6
6
  License: MIT License
7
7
  Project-URL: Homepage, https://github.com/bpwhelan/GameSentenceMiner
@@ -69,18 +69,15 @@ GSM significantly enhances your Anki cards with rich contextual information:
69
69
  * **AI Translation**: Integrates AI to provide quick translations of the captured sentence. Custom Prompts also supported. (Optional, Bring your own Key)
70
70
 
71
71
 
72
- #### Game Example
73
- ![anki_RozcrisS8B](https://github.com/user-attachments/assets/b1f08150-6b46-4d7d-ad90-e6c468076b05)
72
+ #### Game Example (Has Audio)
74
73
 
75
- Audio: https://github.com/user-attachments/assets/94360986-8dbf-42c9-b3c3-d054893eac3d
74
+ https://github.com/user-attachments/assets/df6bc38e-d74d-423e-b270-8a82eec2394c
76
75
 
77
76
  ---
78
77
 
79
- #### VN Example
80
- ![anki_Lk3Ds2T1Bz](https://github.com/user-attachments/assets/e8ae4d66-f138-4ae1-9df7-46e16249be41)
81
-
82
- Audio: https://github.com/user-attachments/assets/2d7b3967-cd5c-4132-b489-75058ea20921
78
+ #### VN Example (Has Audio)
83
79
 
80
+ https://github.com/user-attachments/assets/ee670fda-1a8b-4dec-b9e6-072264155c6e
84
81
 
85
82
  ### OCR
86
83
 
@@ -97,10 +94,8 @@ GSM runs a fork of [OwOCR](https://github.com/AuroraWright/owocr/) to provide ac
97
94
  * **More Language Support**: Stock OwOCR is hard-coded to Japanese, while in GSM you can use a variety of languages.
98
95
 
99
96
 
100
- ![GameSentenceMiner_efBTEpbZ2A](https://github.com/user-attachments/assets/4b873f9e-c049-428c-9bfd-20907e095054)
101
- ![anki_f3PdqYLN2n](https://github.com/user-attachments/assets/a901221c-6f7c-471b-a1f3-f29e8ced102c)
97
+ https://github.com/user-attachments/assets/07240472-831a-40e6-be22-c64b880b0d66
102
98
 
103
- Audio: https://github.com/user-attachments/assets/8c44780a-9b74-41af-bf16-28a742f4de12
104
99
 
105
100
 
106
101
  ### Game Launcher Capabilities (WIP)
@@ -113,7 +108,7 @@ This is probably the feature I care least about, but if you are lazy like me, yo
113
108
 
114
109
  This feature simplifies the process of launching games and (potentially) hooking them, making the entire workflow more efficient.
115
110
 
116
- ![image](https://github.com/user-attachments/assets/eb630535-d291-4386-a5af-9f54b718896a)
111
+ <img width="2560" height="1392" alt="GameSentenceMiner_1zuov0R9xK" src="https://github.com/user-attachments/assets/205769bb-3dd2-493b-9383-2d6e2ca05c2d" />
117
112
 
118
113
  ## Basic Requirements
119
114
 
@@ -1,12 +1,12 @@
1
1
  GameSentenceMiner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- GameSentenceMiner/anki.py,sha256=3BVFXAM7tpJAxHMbsMpnMHUoDfyqHQ1JSYJThW18QWA,16846
3
- GameSentenceMiner/config_gui.py,sha256=QTK1yBDcfHaIUR_JyekkRQY9CVI_rh3Cae0bi7lviIo,99198
4
- GameSentenceMiner/gametext.py,sha256=6VkjmBeiuZfPk8T6PHFdIAElBH2Y_oLVYvmcafqN7RM,6747
5
- GameSentenceMiner/gsm.py,sha256=qVHxnvly-yJ85v9RAxsGN2MqZxU-C1JA5wSRxVxMPMg,24950
6
- GameSentenceMiner/obs.py,sha256=450jRo2jeOMtlDJN3doNT2wJ5z5YQ0entamxdaLE8mo,15472
7
- GameSentenceMiner/vad.py,sha256=Xj_9TM0fiaz9K8JcmW0QqGYASFnPEmYepsTHQrxP38c,18711
2
+ GameSentenceMiner/anki.py,sha256=FUwcWO0-arzfQjejQmDKP7pNNakhboo8InQ4s_jv6AY,19099
3
+ GameSentenceMiner/config_gui.py,sha256=bK7mHLxDIXhghOJqL0VphgUOsEAPyI3mjl0uWtR4mPk,103249
4
+ GameSentenceMiner/gametext.py,sha256=fNkz1dvvJCLQ1AD6NuAJhSiGUjG-OSNGzwQOGv8anGo,7776
5
+ GameSentenceMiner/gsm.py,sha256=GGF0owRrrYJgdfXx-INwfuKbaoY-G5gLllE-sNrwYnI,25341
6
+ GameSentenceMiner/obs.py,sha256=-5j4k1_sYYR1Lnbn9C-_yN9prqgGLICgx5l3uguv4xk,15917
7
+ GameSentenceMiner/vad.py,sha256=zo9JpuEOCXczPXM-dq8lbr-zM-MPpfJ8aajggR3mKk4,18710
8
8
  GameSentenceMiner/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- GameSentenceMiner/ai/ai_prompting.py,sha256=ojp7i_xg2YB1zALgFbivwtXPMVkThnSbPoUiAs-nz_g,25892
9
+ GameSentenceMiner/ai/ai_prompting.py,sha256=vRYSmEKD_OB3znEwRy8S1Amw_BTaylYBmVqVK9hxT54,26018
10
10
  GameSentenceMiner/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  GameSentenceMiner/assets/icon.png,sha256=9GRL8uXUAgkUSlvbm9Pv9o2poFVRGdW6s2ub_DeUD9M,937624
12
12
  GameSentenceMiner/assets/icon128.png,sha256=l90j7biwdz5ahwOd5wZ-406ryEV9Pan93dquJQ3e1CI,18395
@@ -19,27 +19,27 @@ GameSentenceMiner/ocr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
19
19
  GameSentenceMiner/ocr/gsm_ocr_config.py,sha256=Ezj-0k6Wo-una91FvYhMp6KGkRhWYihXzLAoh_Wu2xY,5329
20
20
  GameSentenceMiner/ocr/ocrconfig.py,sha256=_tY8mjnzHMJrLS8E5pHqYXZjMuLoGKYgJwdhYgN-ny4,6466
21
21
  GameSentenceMiner/ocr/owocr_area_selector.py,sha256=O8qKOTDglk-D4N-2_ORLeZacXT-OVOCNxUI8sQHAlx4,25538
22
- GameSentenceMiner/ocr/owocr_helper.py,sha256=3sJW3SmXghUKwCFIHtweEq0t42jcBOyBhFbIHTvxYwc,25301
22
+ GameSentenceMiner/ocr/owocr_helper.py,sha256=hP9j7bP9G_jwhRaWgbyVkzoPiNTmxuOTn0e1VQY9XMQ,25306
23
23
  GameSentenceMiner/ocr/ss_picker.py,sha256=0IhxUdaKruFpZyBL-8SpxWg7bPrlGpy3lhTcMMZ5rwo,5224
24
24
  GameSentenceMiner/owocr/owocr/__init__.py,sha256=87hfN5u_PbL_onLfMACbc0F5j4KyIK9lKnRCj6oZgR0,49
25
25
  GameSentenceMiner/owocr/owocr/__main__.py,sha256=XQaqZY99EKoCpU-gWQjNbTs7Kg17HvBVE7JY8LqIE0o,157
26
26
  GameSentenceMiner/owocr/owocr/config.py,sha256=qM7kISHdUhuygGXOxmgU6Ef2nwBShrZtdqu4InDCViE,8103
27
27
  GameSentenceMiner/owocr/owocr/lens_betterproto.py,sha256=oNoISsPilVVRBBPVDtb4-roJtAhp8ZAuFTci3TGXtMc,39141
28
- GameSentenceMiner/owocr/owocr/ocr.py,sha256=z0w7kcPjXvFabMQTWaQyiBehxmjeIVaS2p53yvFyPbg,59707
29
- GameSentenceMiner/owocr/owocr/run.py,sha256=p7DBHTbhey1DeW1SRqNQ5-y3H4Cq2zoMPCMED5C0Rws,65945
28
+ GameSentenceMiner/owocr/owocr/ocr.py,sha256=6ArGr0xd-Fhkw9uPn4MH3urxbLBwZ-UmxfwoKUUgxio,63459
29
+ GameSentenceMiner/owocr/owocr/run.py,sha256=nkDpXICJCTKgJTS4MYRnaz-GYqAS-GskcSg1ZkGIRuE,67285
30
30
  GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py,sha256=Na6XStbQBtpQUSdbN3QhEswtKuU1JjReFk_K8t5ezQE,3395
31
31
  GameSentenceMiner/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  GameSentenceMiner/util/audio_offset_selector.py,sha256=8Stk3BP-XVIuzRv9nl9Eqd2D-1yD3JrgU-CamBywJmY,8542
33
- GameSentenceMiner/util/configuration.py,sha256=vwBehuEP2QVvbsyJx5x1EPXZEOtGsqeIQjlEES0vVdQ,28999
33
+ GameSentenceMiner/util/configuration.py,sha256=XUKA4-XFCk4tEjqj9GtB-Yq9OgBRrILXlcthRkLQpP8,35959
34
34
  GameSentenceMiner/util/electron_config.py,sha256=8LZwl-T_uF5z_ig-IZcm9QI-VKaD7zaHX9u6MaLYuo4,8648
35
35
  GameSentenceMiner/util/ffmpeg.py,sha256=t0tflxq170n8PZKkdw8fTZIUQfXD0p_qARa9JTdhBTc,21530
36
36
  GameSentenceMiner/util/gsm_utils.py,sha256=iRyLVcodMptRhkCzLf3hyqc6_RCktXnwApi6mLju6oQ,11565
37
- GameSentenceMiner/util/model.py,sha256=AaOzgqSbaN7yks_rr1dQpLQR45FpBYdoLebMbrIYm34,6638
37
+ GameSentenceMiner/util/model.py,sha256=hmA_seopP2bK40v9T4ulua9TrAeWtbkdCv-sTBPBQDk,6660
38
38
  GameSentenceMiner/util/notification.py,sha256=0OnEYjn3DUEZ6c6OtPjdVZe-DG-QSoMAl9fetjjCvNU,3874
39
39
  GameSentenceMiner/util/package.py,sha256=u1ym5z869lw5EHvIviC9h9uH97bzUXSXXA8KIn8rUvk,1157
40
40
  GameSentenceMiner/util/ss_selector.py,sha256=cbjMxiKOCuOfbRvLR_PCRlykBrGtm1LXd6u5czPqkmc,4793
41
- GameSentenceMiner/util/text_log.py,sha256=jhG7ny8-DAilMAAPauN5HLoBNSIJ-cXAm68NLBxGNT8,5997
42
- GameSentenceMiner/util/window_transparency.py,sha256=eQZausQ8A7-2Vd5cbBEJrJMKhaEPkLjJEa16kcnK6Ec,6592
41
+ GameSentenceMiner/util/text_log.py,sha256=Gbm8H2DHUX4u0QBnbjs3jOfzkS6_5WBczgD3mwant7Q,6031
42
+ GameSentenceMiner/util/window_transparency.py,sha256=hmeQYqK3mUEh47hZ8pODldUbxCC5eluMddanXfC_epQ,7325
43
43
  GameSentenceMiner/util/communication/__init__.py,sha256=xh__yn2MhzXi9eLi89PeZWlJPn-cbBSjskhi1BRraXg,643
44
44
  GameSentenceMiner/util/communication/send.py,sha256=Wki9qIY2CgYnuHbmnyKVIYkcKAN_oYS4up93XMikBaI,222
45
45
  GameSentenceMiner/util/communication/websocket.py,sha256=TbphRGmxVrgEupS7tNdifsmQfWDfIp0Hio2cSiUKgsk,3317
@@ -49,7 +49,7 @@ GameSentenceMiner/util/downloader/download_tools.py,sha256=zR-aEHiFVkyo-9oPoSx6n
49
49
  GameSentenceMiner/util/downloader/oneocr_dl.py,sha256=EJbKISaZ9p2x9P4x0rpMM5nAInTTc9b7arraGBcd-SA,10381
50
50
  GameSentenceMiner/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  GameSentenceMiner/web/service.py,sha256=S7bYf2kSk08u-8R9Qpv7piM-pxfFjYZUvU825xupmuI,5279
52
- GameSentenceMiner/web/texthooking_page.py,sha256=zB2kOtT6bj5XEKjuBzgVfPU5juI8WuMuG_IHUO4D3YU,16835
52
+ GameSentenceMiner/web/texthooking_page.py,sha256=2ZS89CAI17xVkx64rGmHHbF96eKR8gPWiR_WAoDJ0Mw,17399
53
53
  GameSentenceMiner/web/static/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
54
  GameSentenceMiner/web/static/apple-touch-icon.png,sha256=OcMI8af_68DA_tweOsQ5LytTyMwm7-hPW07IfrOVgEs,46132
55
55
  GameSentenceMiner/web/static/favicon-96x96.png,sha256=lOePzjiKl1JY2J1kT_PMdyEnrlJmi5GWbmXJunM12B4,16502
@@ -63,9 +63,10 @@ GameSentenceMiner/web/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
63
63
  GameSentenceMiner/web/templates/index.html,sha256=Gv3CJvNnhAzIVV_QxhNq4OD-pXDt1vKCu9k6WdHSXuA,215343
64
64
  GameSentenceMiner/web/templates/text_replacements.html,sha256=tV5c8mCaWSt_vKuUpbdbLAzXZ3ATZeDvQ9PnnAfqY0M,8598
65
65
  GameSentenceMiner/web/templates/utility.html,sha256=3flZinKNqUJ7pvrZk6xu__v67z44rXnaK7UTZ303R-8,16946
66
- gamesentenceminer-2.11.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
67
- gamesentenceminer-2.11.7.dist-info/METADATA,sha256=bJTODm-zidIxVgTh8e7jE1IPLn1NFv39ReZpda0JQ68,7353
68
- gamesentenceminer-2.11.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
69
- gamesentenceminer-2.11.7.dist-info/entry_points.txt,sha256=2APEP25DbfjSxGeHtwBstMH8mulVhLkqF_b9bqzU6vQ,65
70
- gamesentenceminer-2.11.7.dist-info/top_level.txt,sha256=V1hUY6xVSyUEohb0uDoN4UIE6rUZ_JYx8yMyPGX4PgQ,18
71
- gamesentenceminer-2.11.7.dist-info/RECORD,,
66
+ GameSentenceMiner/wip/get_overlay_coords.py,sha256=dzP8EbexXuRnSEP4lWUzyMn24B9UQkAGA6zbxGS_W2M,9506
67
+ gamesentenceminer-2.12.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
68
+ gamesentenceminer-2.12.0.dist-info/METADATA,sha256=UXiHhmh2ivqVf0ND35VgE0En41z2ekVMP5EM_lRnd9Y,6999
69
+ gamesentenceminer-2.12.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
+ gamesentenceminer-2.12.0.dist-info/entry_points.txt,sha256=2APEP25DbfjSxGeHtwBstMH8mulVhLkqF_b9bqzU6vQ,65
71
+ gamesentenceminer-2.12.0.dist-info/top_level.txt,sha256=V1hUY6xVSyUEohb0uDoN4UIE6rUZ_JYx8yMyPGX4PgQ,18
72
+ gamesentenceminer-2.12.0.dist-info/RECORD,,