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.
- GameSentenceMiner/ai/ai_prompting.py +3 -3
- GameSentenceMiner/anki.py +30 -0
- GameSentenceMiner/config_gui.py +79 -2
- GameSentenceMiner/gametext.py +20 -1
- GameSentenceMiner/gsm.py +9 -0
- GameSentenceMiner/obs.py +11 -3
- GameSentenceMiner/ocr/owocr_helper.py +1 -1
- GameSentenceMiner/owocr/owocr/ocr.py +122 -52
- GameSentenceMiner/owocr/owocr/run.py +37 -4
- GameSentenceMiner/util/configuration.py +261 -2
- GameSentenceMiner/util/model.py +1 -0
- GameSentenceMiner/util/text_log.py +2 -2
- GameSentenceMiner/util/window_transparency.py +28 -0
- GameSentenceMiner/vad.py +1 -1
- GameSentenceMiner/web/texthooking_page.py +23 -13
- GameSentenceMiner/wip/get_overlay_coords.py +241 -0
- {gamesentenceminer-2.11.7.dist-info → gamesentenceminer-2.12.0.dist-info}/METADATA +8 -13
- {gamesentenceminer-2.11.7.dist-info → gamesentenceminer-2.12.0.dist-info}/RECORD +22 -21
- {gamesentenceminer-2.11.7.dist-info → gamesentenceminer-2.12.0.dist-info}/WHEEL +0 -0
- {gamesentenceminer-2.11.7.dist-info → gamesentenceminer-2.12.0.dist-info}/entry_points.txt +0 -0
- {gamesentenceminer-2.11.7.dist-info → gamesentenceminer-2.12.0.dist-info}/licenses/LICENSE +0 -0
- {gamesentenceminer-2.11.7.dist-info → gamesentenceminer-2.12.0.dist-info}/top_level.txt +0 -0
@@ -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.
|
4
|
-
Summary: A tool for mining sentences from games. Update:
|
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
|
-

|
72
|
+
#### Game Example (Has Audio)
|
74
73
|
|
75
|
-
|
74
|
+
https://github.com/user-attachments/assets/df6bc38e-d74d-423e-b270-8a82eec2394c
|
76
75
|
|
77
76
|
---
|
78
77
|
|
79
|
-
#### VN Example
|
80
|
-

|
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
|
-
|
101
|
-

|
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
|
-
|
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=
|
3
|
-
GameSentenceMiner/config_gui.py,sha256=
|
4
|
-
GameSentenceMiner/gametext.py,sha256=
|
5
|
-
GameSentenceMiner/gsm.py,sha256=
|
6
|
-
GameSentenceMiner/obs.py,sha256
|
7
|
-
GameSentenceMiner/vad.py,sha256=
|
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=
|
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=
|
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=
|
29
|
-
GameSentenceMiner/owocr/owocr/run.py,sha256=
|
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=
|
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=
|
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=
|
42
|
-
GameSentenceMiner/util/window_transparency.py,sha256=
|
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=
|
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
|
-
|
67
|
-
gamesentenceminer-2.
|
68
|
-
gamesentenceminer-2.
|
69
|
-
gamesentenceminer-2.
|
70
|
-
gamesentenceminer-2.
|
71
|
-
gamesentenceminer-2.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|