GameSentenceMiner 2.10.16__py3-none-any.whl → 2.10.17__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 +128 -34
- GameSentenceMiner/config_gui.py +1 -1
- GameSentenceMiner/owocr/owocr/ocr.py +44 -22
- {gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/METADATA +2 -2
- {gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/RECORD +9 -9
- {gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/WHEEL +0 -0
- {gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/entry_points.txt +0 -0
- {gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/licenses/LICENSE +0 -0
- {gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/top_level.txt +0 -0
@@ -1,12 +1,13 @@
|
|
1
1
|
import logging
|
2
2
|
import textwrap
|
3
|
+
import time
|
3
4
|
from abc import ABC, abstractmethod
|
4
5
|
from dataclasses import dataclass
|
5
6
|
from enum import Enum
|
6
7
|
from typing import List, Optional
|
7
8
|
|
8
|
-
|
9
|
-
from google.
|
9
|
+
from google import genai
|
10
|
+
from google.genai import types
|
10
11
|
from groq import Groq
|
11
12
|
|
12
13
|
from GameSentenceMiner.util.configuration import get_config, Ai, logger
|
@@ -17,17 +18,29 @@ from GameSentenceMiner.util.text_log import GameLine
|
|
17
18
|
logging.getLogger("httpcore").setLevel(logging.WARNING)
|
18
19
|
logging.getLogger("httpx").setLevel(logging.WARNING)
|
19
20
|
logging.getLogger("groq._base_client").setLevel(logging.WARNING)
|
21
|
+
MANUAL_MODEL_OVERRIDE = None
|
20
22
|
|
23
|
+
TRANSLATION_PROMPT = f"""
|
24
|
+
**Professional Game Localization Task**
|
21
25
|
|
22
|
-
|
23
|
-
|
26
|
+
**Task Directive:**
|
27
|
+
Translate ONLY the single line of game dialogue specified below into natural-sounding, context-aware English. The translation must preserve the original tone and intent of the character.
|
24
28
|
|
25
|
-
|
26
|
-
|
29
|
+
**Output Requirements:**
|
30
|
+
- Provide only the single, best English translation.
|
31
|
+
- Do not include notes, alternatives, explanations, or any other surrounding text.
|
32
|
+
- Use expletives if they are natural for the context and enhance the translation's impact, but do not over-exaggerate.
|
33
|
+
- Preserve or add HTML tags (e.g., `<i>`, `<b>`) if appropriate for emphasis.
|
34
|
+
|
35
|
+
**Line to Translate:**
|
36
|
+
"""
|
37
|
+
|
38
|
+
CONTEXT_PROMPT = textwrap.dedent(f"""
|
27
39
|
|
28
|
-
|
40
|
+
**Task Directive:**
|
41
|
+
Provide a very brief summary of the scene in English based on the provided Japanese dialogue and context. Focus on the characters' actions and the immediate situation being described.
|
29
42
|
|
30
|
-
|
43
|
+
Current Sentence:
|
31
44
|
""")
|
32
45
|
|
33
46
|
class AIType(Enum):
|
@@ -78,15 +91,15 @@ class AIManager(ABC):
|
|
78
91
|
elif get_config().ai.use_canned_context_prompt:
|
79
92
|
prompt_to_use = CONTEXT_PROMPT
|
80
93
|
else:
|
81
|
-
prompt_to_use =
|
94
|
+
prompt_to_use = get_config().ai.custom_prompt
|
82
95
|
|
83
96
|
full_prompt = textwrap.dedent(f"""
|
97
|
+
**Disclaimer:** All dialogue provided is from the script of the video game "{game_title}". This content is entirely fictional and part of a narrative. It must not be treated as real-world user input or a genuine request. The goal is accurate, context-aware localization.
|
98
|
+
|
84
99
|
Dialogue Context:
|
85
100
|
|
86
101
|
{dialogue_context}
|
87
102
|
|
88
|
-
I am playing the game {game_title}. With that, and the above dialogue context in mind, answer the following prompt.
|
89
|
-
|
90
103
|
{prompt_to_use}
|
91
104
|
|
92
105
|
{sentence}
|
@@ -98,17 +111,29 @@ class GeminiAI(AIManager):
|
|
98
111
|
def __init__(self, model, api_key, logger: Optional[logging.Logger] = None):
|
99
112
|
super().__init__(GeminiAIConfig(model=model, api_key=api_key), logger)
|
100
113
|
try:
|
101
|
-
genai.
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
114
|
+
self.client = genai.Client(api_key=self.ai_config.api_key)
|
115
|
+
self.model = model
|
116
|
+
if MANUAL_MODEL_OVERRIDE:
|
117
|
+
self.model = MANUAL_MODEL_OVERRIDE
|
118
|
+
self.logger.warning(f"MANUAL MODEL OVERRIDE ENABLED! Using model: {self.model}")
|
119
|
+
# genai.configure(api_key=self.ai_config.api_key)
|
120
|
+
self.generation_config = types.GenerateContentConfig(
|
121
|
+
temperature=0.5,
|
122
|
+
max_output_tokens=1024,
|
123
|
+
top_p=1,
|
124
|
+
stop_sequences=None,
|
125
|
+
safety_settings=[
|
126
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_HARASSMENT, threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
127
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
128
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
129
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
130
|
+
],
|
131
|
+
)
|
132
|
+
if "2.5" in self.model:
|
133
|
+
self.generation_config.thinking_config = types.ThinkingConfig(
|
134
|
+
thinking_budget=0,
|
135
|
+
)
|
136
|
+
self.logger.debug(f"GeminiAIManager initialized with model: {self.model}")
|
112
137
|
except Exception as e:
|
113
138
|
self.logger.error(f"Failed to initialize Gemini API: {e}")
|
114
139
|
self.model = None
|
@@ -127,8 +152,21 @@ class GeminiAI(AIManager):
|
|
127
152
|
|
128
153
|
try:
|
129
154
|
prompt = self._build_prompt(lines, sentence, current_line, game_title)
|
155
|
+
contents = [
|
156
|
+
types.Content(
|
157
|
+
role="user",
|
158
|
+
parts=[
|
159
|
+
types.Part.from_text(text=prompt),
|
160
|
+
],
|
161
|
+
),
|
162
|
+
]
|
130
163
|
self.logger.debug(f"Generated prompt:\n{prompt}")
|
131
|
-
response = self.
|
164
|
+
response = self.client.models.generate_content(
|
165
|
+
model=self.model,
|
166
|
+
contents=contents,
|
167
|
+
config=self.generation_config
|
168
|
+
)
|
169
|
+
self.logger.debug(f"Full response: {response}")
|
132
170
|
result = response.text.strip()
|
133
171
|
self.logger.debug(f"Received response:\n{result}")
|
134
172
|
return result
|
@@ -182,13 +220,13 @@ class GroqAI(AIManager):
|
|
182
220
|
ai_manager: AIManager | None = None
|
183
221
|
current_ai_config: Ai | None = None
|
184
222
|
|
185
|
-
def get_ai_prompt_result(lines: List[GameLine], sentence: str, current_line: GameLine, game_title: str = ""):
|
223
|
+
def get_ai_prompt_result(lines: List[GameLine], sentence: str, current_line: GameLine, game_title: str = "", force_refresh: bool = False) -> str:
|
186
224
|
global ai_manager, current_ai_config
|
187
225
|
try:
|
188
226
|
if not is_connected():
|
189
227
|
logger.error("No internet connection. Unable to proceed with AI prompt.")
|
190
228
|
return ""
|
191
|
-
if not ai_manager or get_config().ai
|
229
|
+
if not ai_manager or ai_config_changed(get_config().ai, current_ai_config) or force_refresh:
|
192
230
|
if get_config().ai.provider == AIType.GEMINI.value:
|
193
231
|
ai_manager = GeminiAI(model=get_config().ai.gemini_model, api_key=get_config().ai.gemini_api_key, logger=logger)
|
194
232
|
elif get_config().ai.provider == AIType.GROQ.value:
|
@@ -203,19 +241,75 @@ def get_ai_prompt_result(lines: List[GameLine], sentence: str, current_line: Gam
|
|
203
241
|
logger.debug(e)
|
204
242
|
return ""
|
205
243
|
|
244
|
+
def ai_config_changed(config, current):
|
245
|
+
if not current:
|
246
|
+
return True
|
247
|
+
if config.provider != current.provider:
|
248
|
+
return True
|
249
|
+
if config.provider == AIType.GEMINI.value and (config.gemini_api_key != current.gemini_api_key or config.gemini_model != current.gemini_model):
|
250
|
+
return True
|
251
|
+
if config.provider == AIType.GROQ.value and (config.groq_api_key != current.groq_api_key or config.groq_model != current.groq_model):
|
252
|
+
return True
|
253
|
+
if config.custom_prompt != current.custom_prompt:
|
254
|
+
return True
|
255
|
+
if config.use_canned_translation_prompt != current.use_canned_translation_prompt:
|
256
|
+
return True
|
257
|
+
if config.use_canned_context_prompt != current.use_canned_context_prompt:
|
258
|
+
return True
|
259
|
+
return False
|
260
|
+
|
261
|
+
|
206
262
|
if __name__ == '__main__':
|
263
|
+
logging.basicConfig(level=logging.DEBUG)
|
207
264
|
lines = [
|
208
|
-
|
209
|
-
GameLine(index=
|
210
|
-
|
265
|
+
# Sexual/Explicit Japanese words and phrases
|
266
|
+
GameLine(index=0, text="ねぇ、あたしのおっぱい、揉んでみない?", id=None, time=None, prev=None, next=None),
|
267
|
+
# Hey, wanna try feeling my breasts?
|
268
|
+
GameLine(index=1, text="お前、本当に痴女だな。股が開いてるぜ。", id=None, time=None, prev=None, next=None),
|
269
|
+
# You're really a pervert, your legs are open. (Vulgar insult)
|
270
|
+
GameLine(index=2, text="今夜は熱い夜にしましょうね…ふふ。", id=None, time=None, prev=None, next=None),
|
271
|
+
# Let's make tonight a hot night... hehe. (Suggestive)
|
272
|
+
GameLine(index=3, text="あぁ…もっと奥まで…ダメ…イッちゃう…!", id=None, time=None, prev=None, next=None),
|
273
|
+
# Ah... deeper... no... I'm coming...! (Explicit sexual context)
|
274
|
+
GameLine(index=4, text="あんたみたいなクズ、生きてる価値ないわ。さっさと自害しろ。", id=None, time=None, prev=None,
|
275
|
+
next=None), # Trash like you has no right to live. Go kill yourself quickly. (Inciting self-harm)
|
276
|
+
GameLine(index=5, text="このブス!誰がお前なんかを相手にするかよ。", id=None, time=None, prev=None, next=None),
|
277
|
+
# You ugly hag! Who would even bother with you? (Insult)
|
278
|
+
GameLine(index=6, text="こんにちは、元気ですか?", id=None, time=None, prev=None, next=None),
|
279
|
+
# Normal line, for contrast
|
280
|
+
GameLine(index=7, text="次会ったら、ぶっ殺してやるからな。", id=None, time=None, prev=None, next=None),
|
281
|
+
# Next time we meet, I'll kill you. (Violent threat)
|
282
|
+
GameLine(index=8, text="今日はいい天気ですね。", id=None, time=None, prev=None, next=None),
|
283
|
+
# Normal line, for contrast
|
284
|
+
GameLine(index=9, text="お前の体、隅々まで味わい尽くしてやる。", id=None, time=None, prev=None, next=None),
|
285
|
+
# I'll savor every inch of your body. (Predatory/sexual threat)
|
286
|
+
GameLine(index=10, text="自害しろ", id=None, time=None, prev=None, next=None),
|
287
|
+
# Target line for `sentence` and `current_line`
|
288
|
+
GameLine(index=11, text="この売女!金のために魂まで売るのか?!", id=None, time=None, prev=None, next=None),
|
289
|
+
# You whore! Will you sell your soul for money?! (Vulgar insult/slur)
|
290
|
+
GameLine(index=12, text="俺の股間のモノで黙らせてやるよ。", id=None, time=None, prev=None, next=None),
|
291
|
+
# I'll shut you up with what's between my legs. (Explicit sexual threat/harassment)
|
292
|
+
GameLine(index=13, text="くっ…イク…頭が…おかしくなりそう…!", id=None, time=None, prev=None, next=None),
|
293
|
+
# Ngh... I'm coming... my head... I'm going crazy...! (More explicit sexual context)
|
211
294
|
]
|
212
|
-
sentence = "ゲームを始めましょう!"
|
213
|
-
current_line = lines[2]
|
214
|
-
game_title = "Test Game"
|
215
295
|
|
296
|
+
sentence = "あぁ…もっと奥まで…ダメ…イッちゃう…"
|
297
|
+
# Adjust current_line index to point to the normal line amidst the bad context
|
298
|
+
current_line = lines[3]
|
299
|
+
game_title = "Corrupted Reality"
|
300
|
+
|
301
|
+
models = ['gemini-2.5-flash','gemini-2.0-flash', 'gemini-2.0-flash-lite',
|
302
|
+
'gemini-2.5-flash-lite-preview-06-17']
|
303
|
+
results = {}
|
304
|
+
for model in models:
|
305
|
+
MANUAL_MODEL_OVERRIDE = model
|
306
|
+
start_time = time.time()
|
307
|
+
result = get_ai_prompt_result(lines, sentence, current_line, game_title, True)
|
308
|
+
results[model] = {"response": result, "time": time.time() - start_time}
|
309
|
+
|
310
|
+
print("Summary of results:")
|
311
|
+
for model, result in results.items():
|
312
|
+
print(f"Model: {model}\nResult: {result['response']}\nTime: {result['time']:.2f} seconds\n{'-'*80}\n")
|
216
313
|
# Set up logging
|
217
|
-
logging.basicConfig(level=logging.DEBUG)
|
218
314
|
|
219
315
|
# Test the function
|
220
|
-
result = get_ai_prompt_result(lines, sentence, current_line, game_title)
|
221
|
-
print("AI Prompt Result:", result)
|
GameSentenceMiner/config_gui.py
CHANGED
@@ -1575,7 +1575,7 @@ class ConfigApp:
|
|
1575
1575
|
|
1576
1576
|
HoverInfoLabelWidget(ai_frame, text="Gemini AI Model:", tooltip="Select the AI model to use.",
|
1577
1577
|
row=self.current_row, column=0)
|
1578
|
-
self.gemini_model = ttk.Combobox(ai_frame, values=['gemini-2.5-flash',
|
1578
|
+
self.gemini_model = ttk.Combobox(ai_frame, values=['gemini-2.5-flash','gemini-2.0-flash', 'gemini-2.0-flash-lite',
|
1579
1579
|
'gemini-2.5-flash-lite-preview-06-17'], state="readonly")
|
1580
1580
|
try:
|
1581
1581
|
self.gemini_model.set(self.settings.ai.gemini_model)
|
@@ -14,7 +14,6 @@ from urllib.parse import urlparse, parse_qs
|
|
14
14
|
import jaconv
|
15
15
|
import numpy as np
|
16
16
|
from PIL import Image
|
17
|
-
from google.generativeai import GenerationConfig
|
18
17
|
from loguru import logger
|
19
18
|
import requests
|
20
19
|
|
@@ -1128,17 +1127,33 @@ class GeminiOCR:
|
|
1128
1127
|
# if "google-generativeai" not in sys.modules:
|
1129
1128
|
# logger.warning('google-generativeai not available, GeminiOCR will not work!')
|
1130
1129
|
# else:
|
1131
|
-
|
1130
|
+
from google import genai
|
1131
|
+
from google.genai import types
|
1132
1132
|
try:
|
1133
1133
|
self.api_key = config['api_key']
|
1134
1134
|
if not self.api_key:
|
1135
1135
|
logger.warning('Gemini API key not provided, GeminiOCR will not work!')
|
1136
1136
|
else:
|
1137
|
-
genai.
|
1138
|
-
self.model =
|
1137
|
+
self.client = genai.Client(api_key=self.api_key)
|
1138
|
+
self.model = config['model']
|
1139
|
+
self.generation_config = types.GenerateContentConfig(
|
1139
1140
|
temperature=0.0,
|
1140
|
-
max_output_tokens=300
|
1141
|
-
|
1141
|
+
max_output_tokens=300,
|
1142
|
+
safety_settings=[
|
1143
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_HARASSMENT,
|
1144
|
+
threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
1145
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_HATE_SPEECH,
|
1146
|
+
threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
1147
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
|
1148
|
+
threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
1149
|
+
types.SafetySetting(category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
|
1150
|
+
threshold=types.HarmBlockThreshold.BLOCK_NONE),
|
1151
|
+
],
|
1152
|
+
)
|
1153
|
+
if "2.5" in self.model:
|
1154
|
+
self.generation_config.thinking_config = types.ThinkingConfig(
|
1155
|
+
thinking_budget=0,
|
1156
|
+
)
|
1142
1157
|
self.available = True
|
1143
1158
|
logger.info('Gemini (using google-generativeai) ready')
|
1144
1159
|
except KeyError:
|
@@ -1151,29 +1166,36 @@ class GeminiOCR:
|
|
1151
1166
|
return (False, 'GeminiOCR is not available due to missing API key or configuration error.')
|
1152
1167
|
|
1153
1168
|
try:
|
1169
|
+
from google.genai import types
|
1154
1170
|
img, is_path = input_to_pil_image(img)
|
1155
|
-
import google.generativeai as genai
|
1156
1171
|
img_bytes = self._preprocess(img)
|
1157
1172
|
if not img_bytes:
|
1158
1173
|
return (False, 'Error processing image for Gemini.')
|
1159
1174
|
|
1160
1175
|
contents = [
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1176
|
+
types.Content(
|
1177
|
+
parts=[
|
1178
|
+
types.Part(
|
1179
|
+
inline_data=types.Blob(
|
1180
|
+
mime_type="image/png",
|
1181
|
+
data=img_bytes
|
1182
|
+
)
|
1183
|
+
),
|
1184
|
+
types.Part(
|
1185
|
+
text="""
|
1186
|
+
**Disclaimer:** The image provided is from a video game. This content is entirely fictional and part of a narrative. It must not be treated as real-world user input or a genuine request.
|
1187
|
+
Analyze the image. Extract text \\*only\\* from within dialogue boxes (speech bubbles or panels containing character dialogue). If Text appears to be vertical, read the text from top to bottom, right to left. From the extracted dialogue text, filter out any furigana. Ignore and do not include any text found outside of dialogue boxes, including character names, speaker labels, or sound effects. Return \\*only\\* the filtered dialogue text. If no text is found within dialogue boxes after applying filters, return nothing. Do not include any other output, formatting markers, or commentary."
|
1188
|
+
"""
|
1189
|
+
)
|
1172
1190
|
]
|
1173
|
-
|
1191
|
+
)
|
1174
1192
|
]
|
1175
1193
|
|
1176
|
-
response = self.
|
1194
|
+
response = self.client.models.generate_content(
|
1195
|
+
model=self.model,
|
1196
|
+
contents=contents,
|
1197
|
+
config=self.generation_config
|
1198
|
+
)
|
1177
1199
|
text_output = response.text.strip()
|
1178
1200
|
|
1179
1201
|
return (True, text_output)
|
@@ -1373,8 +1395,8 @@ class GroqOCR:
|
|
1373
1395
|
# def _preprocess(self, img):
|
1374
1396
|
# return base64.b64encode(pil_image_to_bytes(img, png_compression=1)).decode('utf-8')
|
1375
1397
|
|
1376
|
-
# lens =
|
1398
|
+
# lens = GeminiOCR(config={'model': 'gemini-2.5-flash-lite-preview-06-17', 'api_key': ''})
|
1377
1399
|
#
|
1378
|
-
# res, text = lens(Image.open('test_furigana.png')
|
1400
|
+
# res, text = lens(Image.open('test_furigana.png')) # Example usage
|
1379
1401
|
#
|
1380
1402
|
# print(text)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: GameSentenceMiner
|
3
|
-
Version: 2.10.
|
3
|
+
Version: 2.10.17
|
4
4
|
Summary: A tool for mining sentences from games. Update: Full UI Re-design
|
5
5
|
Author-email: Beangate <bpwhelan95@gmail.com>
|
6
6
|
License: MIT License
|
@@ -32,13 +32,13 @@ Requires-Dist: win10toast; sys_platform == "win32"
|
|
32
32
|
Requires-Dist: numpy
|
33
33
|
Requires-Dist: pystray
|
34
34
|
Requires-Dist: pywin32; sys_platform == "win32"
|
35
|
-
Requires-Dist: google-generativeai
|
36
35
|
Requires-Dist: pygetwindow; sys_platform == "win32"
|
37
36
|
Requires-Dist: flask
|
38
37
|
Requires-Dist: groq
|
39
38
|
Requires-Dist: obsws-python~=1.7.2
|
40
39
|
Requires-Dist: matplotlib
|
41
40
|
Requires-Dist: sounddevice
|
41
|
+
Requires-Dist: google-genai
|
42
42
|
Dynamic: license-file
|
43
43
|
|
44
44
|
# GameSentenceMiner (GSM)
|
@@ -1,12 +1,12 @@
|
|
1
1
|
GameSentenceMiner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
2
|
GameSentenceMiner/anki.py,sha256=qi7yr9MI-sdgHPh9ZOnbCviwO2yl4gPB_z7hqxecSzI,16656
|
3
|
-
GameSentenceMiner/config_gui.py,sha256=
|
3
|
+
GameSentenceMiner/config_gui.py,sha256=atwRAkcyAEXm9kSft28qjqseX7SO_YRMt0JY1A4F4vg,97820
|
4
4
|
GameSentenceMiner/gametext.py,sha256=6VkjmBeiuZfPk8T6PHFdIAElBH2Y_oLVYvmcafqN7RM,6747
|
5
5
|
GameSentenceMiner/gsm.py,sha256=SGB60IC5VPCnvr_cMh4krkR4khW1x7xZhEYVNl8TiHc,24879
|
6
6
|
GameSentenceMiner/obs.py,sha256=o_I6213VZvXqYkZDdUBgUg2KWi9SbnNZZjjUnKnQkK4,15190
|
7
7
|
GameSentenceMiner/vad.py,sha256=G0NkaWFJaIfKQAV7LOFxyKoih7pPNYHDuy4SzeFVCkI,16389
|
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=hDpTRbH_pbKcvBCVhlHi5J3NGpwmGtfFww-f2lur870,15039
|
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
|
@@ -25,7 +25,7 @@ GameSentenceMiner/owocr/owocr/__init__.py,sha256=87hfN5u_PbL_onLfMACbc0F5j4KyIK9
|
|
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=
|
28
|
+
GameSentenceMiner/owocr/owocr/ocr.py,sha256=39Azn9fEqRyijCE_ZuoxnSk3PiwkCP9MvYHuQa9WIrw,58083
|
29
29
|
GameSentenceMiner/owocr/owocr/run.py,sha256=goOZSO3a7z8GxjYAcWjHsPxdzM60Nt3vxjcUzy1fnZg,56242
|
30
30
|
GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py,sha256=Na6XStbQBtpQUSdbN3QhEswtKuU1JjReFk_K8t5ezQE,3395
|
31
31
|
GameSentenceMiner/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -62,9 +62,9 @@ GameSentenceMiner/web/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
62
62
|
GameSentenceMiner/web/templates/index.html,sha256=n0J-dV8eksj8JXUuaCTIh0fIxIjfgm2EvxGBdQ6gWoM,214113
|
63
63
|
GameSentenceMiner/web/templates/text_replacements.html,sha256=tV5c8mCaWSt_vKuUpbdbLAzXZ3ATZeDvQ9PnnAfqY0M,8598
|
64
64
|
GameSentenceMiner/web/templates/utility.html,sha256=3flZinKNqUJ7pvrZk6xu__v67z44rXnaK7UTZ303R-8,16946
|
65
|
-
gamesentenceminer-2.10.
|
66
|
-
gamesentenceminer-2.10.
|
67
|
-
gamesentenceminer-2.10.
|
68
|
-
gamesentenceminer-2.10.
|
69
|
-
gamesentenceminer-2.10.
|
70
|
-
gamesentenceminer-2.10.
|
65
|
+
gamesentenceminer-2.10.17.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
66
|
+
gamesentenceminer-2.10.17.dist-info/METADATA,sha256=A5tKGwJe-FGJsGLckn0PvUlKIrjFOrnuGXNejzPpaJA,7348
|
67
|
+
gamesentenceminer-2.10.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
68
|
+
gamesentenceminer-2.10.17.dist-info/entry_points.txt,sha256=2APEP25DbfjSxGeHtwBstMH8mulVhLkqF_b9bqzU6vQ,65
|
69
|
+
gamesentenceminer-2.10.17.dist-info/top_level.txt,sha256=V1hUY6xVSyUEohb0uDoN4UIE6rUZ_JYx8yMyPGX4PgQ,18
|
70
|
+
gamesentenceminer-2.10.17.dist-info/RECORD,,
|
File without changes
|
{gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/entry_points.txt
RENAMED
File without changes
|
{gamesentenceminer-2.10.16.dist-info → gamesentenceminer-2.10.17.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
File without changes
|