GameSentenceMiner 2.3.4__py3-none-any.whl → 2.3.6__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/anki.py +12 -3
- GameSentenceMiner/config_gui.py +4 -0
- GameSentenceMiner/ffmpeg.py +1 -0
- GameSentenceMiner/gametext.py +6 -2
- GameSentenceMiner/gsm.py +4 -2
- {GameSentenceMiner-2.3.4.dist-info → GameSentenceMiner-2.3.6.dist-info}/METADATA +3 -3
- {GameSentenceMiner-2.3.4.dist-info → GameSentenceMiner-2.3.6.dist-info}/RECORD +10 -10
- {GameSentenceMiner-2.3.4.dist-info → GameSentenceMiner-2.3.6.dist-info}/WHEEL +0 -0
- {GameSentenceMiner-2.3.4.dist-info → GameSentenceMiner-2.3.6.dist-info}/entry_points.txt +0 -0
- {GameSentenceMiner-2.3.4.dist-info → GameSentenceMiner-2.3.6.dist-info}/top_level.txt +0 -0
GameSentenceMiner/anki.py
CHANGED
@@ -17,6 +17,7 @@ from GameSentenceMiner.util import remove_html_tags
|
|
17
17
|
|
18
18
|
audio_in_anki = None
|
19
19
|
screenshot_in_anki = None
|
20
|
+
prev_screenshot_in_anki = None
|
20
21
|
|
21
22
|
# Global variables to track state
|
22
23
|
previous_note_ids = set()
|
@@ -26,7 +27,7 @@ card_queue = []
|
|
26
27
|
|
27
28
|
def update_anki_card(last_note, note=None, audio_path='', video_path='', tango='', reuse_audio=False,
|
28
29
|
should_update_audio=True, ss_time=0):
|
29
|
-
global audio_in_anki, screenshot_in_anki
|
30
|
+
global audio_in_anki, screenshot_in_anki, prev_screenshot_in_anki
|
30
31
|
update_audio = should_update_audio and (get_config().anki.sentence_audio_field and not
|
31
32
|
last_note['fields'][get_config().anki.sentence_audio_field][
|
32
33
|
'value'] or get_config().anki.overwrite_audio)
|
@@ -42,9 +43,16 @@ def update_anki_card(last_note, note=None, audio_path='', video_path='', tango='
|
|
42
43
|
screenshot_in_anki = store_media_file(screenshot)
|
43
44
|
if get_config().paths.remove_screenshot:
|
44
45
|
os.remove(screenshot)
|
46
|
+
if get_config().anki.previous_image_field:
|
47
|
+
_, previous_sentence = get_last_two_sentences(last_note)
|
48
|
+
prev_screenshot = ffmpeg.get_screenshot(video_path, ffmpeg.get_screenshot_time(video_path, gametext.get_time_of_line(previous_sentence)))
|
49
|
+
prev_screenshot_in_anki = store_media_file(prev_screenshot)
|
50
|
+
if get_config().paths.remove_screenshot:
|
51
|
+
os.remove(prev_screenshot)
|
45
52
|
util.set_last_mined_line(get_sentence(last_note))
|
46
53
|
audio_html = f"[sound:{audio_in_anki}]"
|
47
54
|
image_html = f"<img src=\"{screenshot_in_anki}\">"
|
55
|
+
prev_screenshot_html = f"<img src=\"{prev_screenshot_in_anki}\">"
|
48
56
|
|
49
57
|
# note = {'id': last_note['noteId'], 'fields': {}}
|
50
58
|
|
@@ -54,6 +62,9 @@ def update_anki_card(last_note, note=None, audio_path='', video_path='', tango='
|
|
54
62
|
if update_picture:
|
55
63
|
note['fields'][get_config().anki.picture_field] = image_html
|
56
64
|
|
65
|
+
if prev_screenshot_in_anki:
|
66
|
+
note['fields'][get_config().anki.previous_image_field] = prev_screenshot_html
|
67
|
+
|
57
68
|
if get_config().anki.anki_custom_fields:
|
58
69
|
for key, value in get_config().anki.anki_custom_fields.items():
|
59
70
|
note['fields'][key] = str(value)
|
@@ -112,8 +123,6 @@ def get_initial_card_info(last_note, selected_lines):
|
|
112
123
|
if not last_note:
|
113
124
|
return note
|
114
125
|
current_line, previous_line = get_last_two_sentences(last_note)
|
115
|
-
logger.debug(f"Previous Sentence {previous_line}")
|
116
|
-
logger.debug(f"Current Sentence {current_line}")
|
117
126
|
|
118
127
|
if get_config().audio.mining_from_history_grab_all_audio and get_config().anki.multi_overwrites_sentence:
|
119
128
|
lines = gametext.get_line_and_future_lines(last_note)
|
GameSentenceMiner/config_gui.py
CHANGED
GameSentenceMiner/ffmpeg.py
CHANGED
@@ -163,6 +163,7 @@ def get_video_duration(file_path):
|
|
163
163
|
logger.debug(" ".join(ffprobe_command))
|
164
164
|
result = subprocess.run(ffprobe_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
165
165
|
duration_info = json.loads(result.stdout)
|
166
|
+
logger.debug(f"Video duration: {duration_info}")
|
166
167
|
return float(duration_info["format"]["duration"]) # Return the duration in seconds
|
167
168
|
|
168
169
|
|
GameSentenceMiner/gametext.py
CHANGED
@@ -9,7 +9,7 @@ from typing import Callable
|
|
9
9
|
import pyperclip
|
10
10
|
import websockets
|
11
11
|
|
12
|
-
import util
|
12
|
+
from GameSentenceMiner import util
|
13
13
|
from GameSentenceMiner.configuration import *
|
14
14
|
from GameSentenceMiner.configuration import get_config, logger
|
15
15
|
from GameSentenceMiner.util import remove_html_tags
|
@@ -187,4 +187,8 @@ def get_line_and_future_lines(last_note):
|
|
187
187
|
if similarity >= 0.60 or line in remove_html_tags(sentence): # 80% similarity threshold
|
188
188
|
found = True
|
189
189
|
found_lines.append(line)
|
190
|
-
return found_lines
|
190
|
+
return found_lines
|
191
|
+
|
192
|
+
|
193
|
+
def get_time_of_line(line):
|
194
|
+
return line_history[line]
|
GameSentenceMiner/gsm.py
CHANGED
@@ -53,9 +53,10 @@ class VideoToAudioHandler(FileSystemEventHandler):
|
|
53
53
|
@staticmethod
|
54
54
|
def convert_to_audio(video_path):
|
55
55
|
try:
|
56
|
+
last_note = None
|
57
|
+
if anki.card_queue and len(anki.card_queue) > 0:
|
58
|
+
last_note = anki.card_queue.pop(0)
|
56
59
|
with util.lock:
|
57
|
-
if anki.card_queue and len(anki.card_queue) > 0:
|
58
|
-
last_note = anki.card_queue.pop(0)
|
59
60
|
if os.path.exists(video_path) and os.access(video_path, os.R_OK):
|
60
61
|
logger.debug(f"Video found and is readable: {video_path}")
|
61
62
|
|
@@ -109,6 +110,7 @@ class VideoToAudioHandler(FileSystemEventHandler):
|
|
109
110
|
logger.exception(f"Card failed to update! Maybe it was removed? {e}")
|
110
111
|
except Exception as e:
|
111
112
|
logger.exception(f"Some error was hit catching to allow further work to be done: {e}")
|
113
|
+
# settings_window.show_error_box("Error", f"Some error was hit, check logs for more info: {e}")
|
112
114
|
if get_config().paths.remove_video and os.path.exists(video_path):
|
113
115
|
os.remove(video_path) # Optionally remove the video after conversion
|
114
116
|
if get_config().paths.remove_audio and os.path.exists(vad_trimmed_audio):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: GameSentenceMiner
|
3
|
-
Version: 2.3.
|
3
|
+
Version: 2.3.6
|
4
4
|
Summary: A tool for mining sentences from games. Update: Multi-Line Mining! Fixed!
|
5
5
|
Author-email: Beangate <bpwhelan95@gmail.com>
|
6
6
|
License: MIT License
|
@@ -39,9 +39,9 @@ This project automates the recording of game sentence audio to help with Anki Ca
|
|
39
39
|
This allows us to create cards from texthooker/yomitan, and automatically get screenshot and sentence audio from the
|
40
40
|
game we are playing.
|
41
41
|
|
42
|
-
Short Demo (Watch this first): https://www.youtube.com/watch?v=
|
42
|
+
Short Demo (Watch this first): https://www.youtube.com/watch?v=FeFBL7py6HY
|
43
43
|
|
44
|
-
Installation: https://www.youtube.com/watch?v=
|
44
|
+
Installation: https://www.youtube.com/watch?v=ybRRB1eIYhk
|
45
45
|
|
46
46
|
## How Does it Work?
|
47
47
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
GameSentenceMiner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
GameSentenceMiner/anki.py,sha256=
|
3
|
-
GameSentenceMiner/config_gui.py,sha256=
|
2
|
+
GameSentenceMiner/anki.py,sha256=bg_RKaY8bT19hfQQ6BJoPp5G634-xDqTryONLUoK6Z8,10691
|
3
|
+
GameSentenceMiner/config_gui.py,sha256=ImG3Q6Jt5NfCjNBjli8qU83vF3rNs3mKLPptRMqLqdk,54264
|
4
4
|
GameSentenceMiner/configuration.py,sha256=_nS-9sWNn97Zdv2V4Ypt_hf4PL6oLa5oK2Z7rWrqEmc,14405
|
5
|
-
GameSentenceMiner/ffmpeg.py,sha256=
|
6
|
-
GameSentenceMiner/gametext.py,sha256=
|
7
|
-
GameSentenceMiner/gsm.py,sha256=
|
5
|
+
GameSentenceMiner/ffmpeg.py,sha256=RN3XlO5uPmD-76wvMZi1CIom0aTq8aNZSZUjLacfJbo,10977
|
6
|
+
GameSentenceMiner/gametext.py,sha256=KOLtc0KjM3RlAoi_OdxSnA8kG9X07dpY905OSTSro4M,6562
|
7
|
+
GameSentenceMiner/gsm.py,sha256=pUKOiJxxSHBqBR3v3U8YiHdwqMxAwvz5keDAGUKGQQA,18388
|
8
8
|
GameSentenceMiner/model.py,sha256=oh8VVT8T1UKekbmP6MGNgQ8jIuQ_7Rg4GPzDCn2kJo8,1999
|
9
9
|
GameSentenceMiner/notification.py,sha256=WBaQWoPNhW4XqdPBUmxPBgjk0ngzH_4v9zMQ-XQAKC8,2010
|
10
10
|
GameSentenceMiner/obs.py,sha256=8ImXAVUWa4JdzwcBOEFShlZRZzh1dCvdpD1aEGhQfbU,6566
|
@@ -18,8 +18,8 @@ GameSentenceMiner/vad/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
18
18
|
GameSentenceMiner/vad/silero_trim.py,sha256=syDJX_KbFmdyFFtnQqYTD0tICsUCJizYhs-atPgXtxA,1549
|
19
19
|
GameSentenceMiner/vad/vosk_helper.py,sha256=-AAwK0cgOC5rK3_gL0sQgrPJ75E49g_PxZR4d5ckwc4,5826
|
20
20
|
GameSentenceMiner/vad/whisper_helper.py,sha256=bpR1HVnJRn9H5u8XaHBqBJ6JwIjzqn-Fajps8QmQ4zc,3411
|
21
|
-
GameSentenceMiner-2.3.
|
22
|
-
GameSentenceMiner-2.3.
|
23
|
-
GameSentenceMiner-2.3.
|
24
|
-
GameSentenceMiner-2.3.
|
25
|
-
GameSentenceMiner-2.3.
|
21
|
+
GameSentenceMiner-2.3.6.dist-info/METADATA,sha256=wadC72L9Ow_tRXhwcBi1eBvaReSxn5oUAO9NIAEr0tQ,10120
|
22
|
+
GameSentenceMiner-2.3.6.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
23
|
+
GameSentenceMiner-2.3.6.dist-info/entry_points.txt,sha256=2APEP25DbfjSxGeHtwBstMH8mulVhLkqF_b9bqzU6vQ,65
|
24
|
+
GameSentenceMiner-2.3.6.dist-info/top_level.txt,sha256=V1hUY6xVSyUEohb0uDoN4UIE6rUZ_JYx8yMyPGX4PgQ,18
|
25
|
+
GameSentenceMiner-2.3.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|