GameSentenceMiner 2.17.1__py3-none-any.whl → 2.17.3__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.
Files changed (28) hide show
  1. GameSentenceMiner/anki.py +25 -1
  2. GameSentenceMiner/config_gui.py +19 -1
  3. GameSentenceMiner/gsm.py +13 -18
  4. GameSentenceMiner/obs.py +4 -2
  5. GameSentenceMiner/ocr/owocr_helper.py +1 -1
  6. GameSentenceMiner/owocr/owocr/run.py +2 -2
  7. GameSentenceMiner/util/configuration.py +7 -5
  8. GameSentenceMiner/util/db.py +176 -8
  9. GameSentenceMiner/util/downloader/download_tools.py +57 -24
  10. GameSentenceMiner/util/get_overlay_coords.py +3 -0
  11. GameSentenceMiner/util/gsm_utils.py +0 -54
  12. GameSentenceMiner/web/database_api.py +12 -1
  13. GameSentenceMiner/web/gsm_websocket.py +1 -1
  14. GameSentenceMiner/web/static/css/shared.css +20 -0
  15. GameSentenceMiner/web/static/css/stats.css +496 -1
  16. GameSentenceMiner/web/static/js/anki_stats.js +87 -3
  17. GameSentenceMiner/web/static/js/shared.js +2 -49
  18. GameSentenceMiner/web/static/js/stats.js +274 -39
  19. GameSentenceMiner/web/templates/anki_stats.html +36 -0
  20. GameSentenceMiner/web/templates/index.html +11 -12
  21. GameSentenceMiner/web/templates/stats.html +35 -15
  22. GameSentenceMiner/web/texthooking_page.py +31 -8
  23. {gamesentenceminer-2.17.1.dist-info → gamesentenceminer-2.17.3.dist-info}/METADATA +1 -1
  24. {gamesentenceminer-2.17.1.dist-info → gamesentenceminer-2.17.3.dist-info}/RECORD +28 -28
  25. {gamesentenceminer-2.17.1.dist-info → gamesentenceminer-2.17.3.dist-info}/WHEEL +0 -0
  26. {gamesentenceminer-2.17.1.dist-info → gamesentenceminer-2.17.3.dist-info}/entry_points.txt +0 -0
  27. {gamesentenceminer-2.17.1.dist-info → gamesentenceminer-2.17.3.dist-info}/licenses/LICENSE +0 -0
  28. {gamesentenceminer-2.17.1.dist-info → gamesentenceminer-2.17.3.dist-info}/top_level.txt +0 -0
@@ -32,6 +32,41 @@
32
32
  <!-- Include shared navigation -->
33
33
  {% include 'components/navigation.html' %}
34
34
 
35
+ <div class="dashboard-card date-range">
36
+ <div class="dashboard-card-header">
37
+ <h3 class="dashboard-card-title">
38
+ <span class="dashboard-card-icon">📅</span>
39
+ Date Range
40
+ </h3>
41
+ </div>
42
+
43
+ <div class="dashboard-date-range">
44
+ <div class="dashboard-date-item tooltip" data-tooltip="Select the start date for your stats">
45
+ <label for="fromDate">From</label>
46
+ <input type="date" id="fromDate" class="dashboard-date-input">
47
+ </div>
48
+ <div class="dashboard-date-item tooltip" data-tooltip="Select the end date for your stats">
49
+ <label for="toDate">To</label>
50
+ <input type="date" id="toDate" class="dashboard-date-input">
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <div id="dateErrorPopup" class="dashboard-popup hidden">
56
+ <div class="dashboard-popup-content">
57
+ <div class="dashboard-popup-icon">⚠️</div>
58
+ <div class="dashboard-popup-message">"From" date cannot be later than "To" date.</div>
59
+ <button id="closePopupBtn" class="dashboard-popup-btn">OK</button>
60
+ </div>
61
+ </div>
62
+
63
+ <div id="noDataPopup" class="no-data-popup hidden">
64
+ <div class="no-data-content">
65
+ <p>No data found for the selected range.</p>
66
+ <button id="closeNoDataPopup">OK</button>
67
+ </div>
68
+ </div>
69
+
35
70
  <!-- Dashboard Statistics Sections -->
36
71
  <div class="dashboard-container">
37
72
  <!-- Current Game Statistics Panel -->
@@ -383,21 +418,6 @@
383
418
  </small>
384
419
  </div>
385
420
 
386
- <div style="margin-bottom: 20px;">
387
- <label for="heatmapYear"
388
- style="display: block; font-weight: 600; margin-bottom: 8px; color: var(--text-primary);">
389
- Heatmap Display Year
390
- </label>
391
- <select id="heatmapYear" name="heatmap_year"
392
- style="width: 100%; padding: 10px; border: 1px solid var(--border-color); border-radius: 5px; background: var(--bg-tertiary); color: var(--text-primary); font-size: 14px;">
393
- <option value="all">All Years</option>
394
- </select>
395
- <small
396
- style="color: var(--text-tertiary); font-size: 12px; margin-top: 4px; display: block;">
397
- Select which year to display in the reading activity heatmap
398
- </small>
399
- </div>
400
-
401
421
  <div style="margin-bottom: 20px;">
402
422
  <label for="streakRequirement"
403
423
  style="display: block; font-weight: 600; margin-bottom: 8px; color: var(--text-primary);">
@@ -208,12 +208,14 @@ def play_audio():
208
208
  def translate_line():
209
209
  data = request.get_json()
210
210
  event_id = data.get('id')
211
+ text = data.get('text', '').strip()
211
212
  if event_id is None:
212
213
  return jsonify({'error': 'Missing id'}), 400
213
- line_to_translate = get_line_by_id(event_id)
214
- translation = get_ai_prompt_result(get_all_lines(), line_to_translate.text,
215
- line_to_translate, get_current_game())
216
- line_to_translate.set_TL(translation)
214
+ line = get_line_by_id(event_id)
215
+ line_to_translate = text if text else line.text
216
+ translation = get_ai_prompt_result(get_all_lines(), line_to_translate,
217
+ line, get_current_game())
218
+ line.set_TL(translation)
217
219
  return jsonify({'TL': translation}), 200
218
220
 
219
221
  @app.route('/translate-multiple', methods=['POST'])
@@ -267,6 +269,15 @@ def stats():
267
269
  master_config=get_master_config(),
268
270
  stats_config=get_stats_config())
269
271
 
272
+ @app.route('/api/anki_earliest_date')
273
+ def anki_earliest_date():
274
+ """Returns the timestamp of earliest available card in anki collection."""
275
+ from GameSentenceMiner.anki import get_anki_earliest_date
276
+ earliest_card = get_anki_earliest_date()
277
+ return jsonify({
278
+ "earliest_card": earliest_card
279
+ })
280
+
270
281
  @app.route('/api/anki_stats')
271
282
  def api_anki_stats():
272
283
  """
@@ -283,14 +294,26 @@ def api_anki_stats():
283
294
  from GameSentenceMiner.web.stats import calculate_kanji_frequency, is_kanji
284
295
  from GameSentenceMiner.util.db import GameLinesTable
285
296
 
286
- # Get all GSM lines and calculate kanji frequency
287
- all_lines = GameLinesTable.all()
297
+ start_timestamp = int(request.args.get('start_timestamp')) if request.args.get('start_timestamp') else None
298
+ end_timestamp = int(request.args.get('end_timestamp')) if request.args.get('end_timestamp') else None
299
+
300
+ # Get GSM lines and calculate kanji frequency
301
+ try:
302
+ all_lines = (
303
+ GameLinesTable.get_lines_filtered_by_timestamp(start_timestamp / 1000, end_timestamp / 1000)
304
+ if start_timestamp is not None and end_timestamp is not None
305
+ else GameLinesTable.all()
306
+ )
307
+ except Exception as e:
308
+ logger.warning(f"Failed to filter lines by timestamp: {e}, fetching all lines instead")
309
+ all_lines = GameLinesTable.all()
310
+
288
311
  gsm_kanji_stats = calculate_kanji_frequency(all_lines)
289
312
  gsm_kanji_list = gsm_kanji_stats.get("kanji_data", [])
290
313
  gsm_kanji_set = set([k["kanji"] for k in gsm_kanji_list])
291
314
 
292
315
  # Get all kanji in Anki (first field only)
293
- anki_kanji_set = get_all_anki_first_field_kanji()
316
+ anki_kanji_set = get_all_anki_first_field_kanji(start_timestamp, end_timestamp)
294
317
 
295
318
  # Find missing kanji (in GSM but not in Anki)
296
319
  missing_kanji = [
@@ -362,7 +385,7 @@ def start_web_server():
362
385
  # FOR TEXTHOOKER DEVELOPMENT, UNCOMMENT THE FOLLOWING LINE WITH Flask-CORS INSTALLED:
363
386
  # from flask_cors import CORS
364
387
  # CORS(app, resources={r"/*": {"origins": "http://localhost:5174"}})
365
- app.run(host='0.0.0.0', port=port, debug=False)
388
+ app.run(host=get_config().advanced.localhost_bind_address, port=port, debug=False)
366
389
 
367
390
 
368
391
  async def texthooker_page_coro():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GameSentenceMiner
3
- Version: 2.17.1
3
+ Version: 2.17.3
4
4
  Summary: A tool for mining sentences from games. Update: Overlay?
5
5
  Author-email: Beangate <bpwhelan95@gmail.com>
6
6
  License: MIT License
@@ -1,9 +1,9 @@
1
1
  GameSentenceMiner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- GameSentenceMiner/anki.py,sha256=VKll8MttLzZa64rVSJ60E_ocLyfQodWRiP1QmvICXMM,26608
3
- GameSentenceMiner/config_gui.py,sha256=apG-heJvWPj754Zmb6iNDyK9uGi5_C0S1lth29IA05Y,146660
2
+ GameSentenceMiner/anki.py,sha256=o1mq9y-PZh4Sjo1qWfdONZEc7_7PJlx_nymaxqtgVSk,27433
3
+ GameSentenceMiner/config_gui.py,sha256=Ko5vjzpnbDPMevoLrLFoucL-uh-LyUGTO6W5VOvh-Hg,148170
4
4
  GameSentenceMiner/gametext.py,sha256=fQYVsXO9VirzKwca_ktek0oTnerhStIDVsxHiyG3_AM,10533
5
- GameSentenceMiner/gsm.py,sha256=VyNOJtEK6vH4DGTCFfWKdW-x2ZPM1XAAhasFph21tUg,34022
6
- GameSentenceMiner/obs.py,sha256=4O5KE6rx6xhHo08nJCgCpyLbUdz-c2H3VqTiVyzhh7k,29236
5
+ GameSentenceMiner/gsm.py,sha256=JZUj8PkwHW6RPzJ-rvpOYMY7F-TO7EsHRWSzlZqPE8w,34069
6
+ GameSentenceMiner/obs.py,sha256=Xa4-SFm2Ftlnk6KX_XaDWjhSEPW_7rSDRe9WDNW8JLY,29377
7
7
  GameSentenceMiner/vad.py,sha256=cujto_lzAuljldBBnve4JuK54tInWVGSp7NGg-xkaCY,19830
8
8
  GameSentenceMiner/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  GameSentenceMiner/ai/ai_prompting.py,sha256=41xdBzE88Jlt12A0D-T_cMfLO5j6MSxfniOptpwNZm0,24068
@@ -22,14 +22,14 @@ GameSentenceMiner/ocr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
22
22
  GameSentenceMiner/ocr/gsm_ocr_config.py,sha256=Ov04c-nKzh3sADxO-5JyZWVe4DlrHM9edM9tc7-97Jo,5970
23
23
  GameSentenceMiner/ocr/ocrconfig.py,sha256=_tY8mjnzHMJrLS8E5pHqYXZjMuLoGKYgJwdhYgN-ny4,6466
24
24
  GameSentenceMiner/ocr/owocr_area_selector.py,sha256=4MjItlaZ78Smxa3uxMxbjU0n2z_IBTG-iBpDB9COSL8,29270
25
- GameSentenceMiner/ocr/owocr_helper.py,sha256=jmB8IxU2PqC1aaVoXKCPFbnirsiyOYjf0eZaUs5AwyY,32001
25
+ GameSentenceMiner/ocr/owocr_helper.py,sha256=kuwEiOOyOMHDdsDboyDqB_MI8WL9bsN9XubACfgw1KQ,32036
26
26
  GameSentenceMiner/ocr/ss_picker.py,sha256=0IhxUdaKruFpZyBL-8SpxWg7bPrlGpy3lhTcMMZ5rwo,5224
27
27
  GameSentenceMiner/owocr/owocr/__init__.py,sha256=87hfN5u_PbL_onLfMACbc0F5j4KyIK9lKnRCj6oZgR0,49
28
28
  GameSentenceMiner/owocr/owocr/__main__.py,sha256=XQaqZY99EKoCpU-gWQjNbTs7Kg17HvBVE7JY8LqIE0o,157
29
29
  GameSentenceMiner/owocr/owocr/config.py,sha256=qM7kISHdUhuygGXOxmgU6Ef2nwBShrZtdqu4InDCViE,8103
30
30
  GameSentenceMiner/owocr/owocr/lens_betterproto.py,sha256=oNoISsPilVVRBBPVDtb4-roJtAhp8ZAuFTci3TGXtMc,39141
31
31
  GameSentenceMiner/owocr/owocr/ocr.py,sha256=vRTMKLzi6GDBFZWCyf0tYi6es3cP1cvQOBjZqaZmnBg,70482
32
- GameSentenceMiner/owocr/owocr/run.py,sha256=nlHlJ0-NAvYJxmwLs6X-jQZWiyFpa2AUiB2cWRDGzdY,81498
32
+ GameSentenceMiner/owocr/owocr/run.py,sha256=bIXC_7PltyVvlA8beCVqdLcKVai8LvVHBRqEueq2GkQ,81545
33
33
  GameSentenceMiner/owocr/owocr/screen_coordinate_picker.py,sha256=Na6XStbQBtpQUSdbN3QhEswtKuU1JjReFk_K8t5ezQE,3395
34
34
  GameSentenceMiner/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  GameSentenceMiner/tools/audio_offset_selector.py,sha256=8Stk3BP-XVIuzRv9nl9Eqd2D-1yD3JrgU-CamBywJmY,8542
@@ -37,12 +37,12 @@ GameSentenceMiner/tools/furigana_filter_preview.py,sha256=BXv7FChPEJW_VeG5XYt6su
37
37
  GameSentenceMiner/tools/ss_selector.py,sha256=cbjMxiKOCuOfbRvLR_PCRlykBrGtm1LXd6u5czPqkmc,4793
38
38
  GameSentenceMiner/tools/window_transparency.py,sha256=GtbxbmZg0-UYPXhfHff-7IKZyY2DKe4B9GdyovfmpeM,8166
39
39
  GameSentenceMiner/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- GameSentenceMiner/util/configuration.py,sha256=qATOwZahVQNP8-ZnWiAKuR7UJLW25QNDmFKYNBYzkmE,42443
41
- GameSentenceMiner/util/db.py,sha256=B2Qwg7i0Qn_yxov-NhcT9QdFkF218Cqea_V7ZPzYBzM,21365
40
+ GameSentenceMiner/util/configuration.py,sha256=B-vXvOt5OfdJZ6WbAPLbvXfT4hMAjqd3pT3gGSxenKg,42623
41
+ GameSentenceMiner/util/db.py,sha256=nUVKUBk0wtRocxVXhiFRXfaiVD77DGCsMp4uj1Rrvd8,28088
42
42
  GameSentenceMiner/util/electron_config.py,sha256=KfeJToeFFVw0IR5MKa-gBzpzaGrU-lyJbR9z-sDEHYU,8767
43
43
  GameSentenceMiner/util/ffmpeg.py,sha256=Wf7I4Ko0rykvm5fAuhedP1Gu5550mMHm_qtlK3arJTM,29080
44
- GameSentenceMiner/util/get_overlay_coords.py,sha256=lUD2YU4iVoXRHvQzkCN0Re3IQkYKemU2NV81MtQ94Uk,22028
45
- GameSentenceMiner/util/gsm_utils.py,sha256=Piwv88Q9av2LBeN7M6QDi0Mp0_R2lNbkcI6ekK5hd2o,11851
44
+ GameSentenceMiner/util/get_overlay_coords.py,sha256=RE0aZHTPORe2TI2vJI1GkqEmgP-ljudMz4PYkeslFcw,22150
45
+ GameSentenceMiner/util/gsm_utils.py,sha256=OUCBmYwEFSmAb0E0s9mtcE2VSyCWbbjG-5bLk6p1ngw,9340
46
46
  GameSentenceMiner/util/model.py,sha256=R-_RYTYLSDNgBoVTPuPBcIHeOznIqi_vBzQ7VQ20WYk,6727
47
47
  GameSentenceMiner/util/notification.py,sha256=YBhf_mSo_i3cjBz-pmeTPx3wchKiG9BK2VBdZSa2prQ,4597
48
48
  GameSentenceMiner/util/text_log.py,sha256=eqLchRrRsWeuex13f5IoxENLWMhjfZtJgUnh9N5jnJQ,6782
@@ -51,17 +51,17 @@ GameSentenceMiner/util/communication/send.py,sha256=Wki9qIY2CgYnuHbmnyKVIYkcKAN_
51
51
  GameSentenceMiner/util/communication/websocket.py,sha256=Zpnqsy8RUeYxMFNGVUaPrWrlbAHjuNxCsn908iWL_kU,3344
52
52
  GameSentenceMiner/util/downloader/Untitled_json.py,sha256=RUUl2bbbCpUDUUS0fP0tdvf5FngZ7ILdA_J5TFYAXUQ,15272
53
53
  GameSentenceMiner/util/downloader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- GameSentenceMiner/util/downloader/download_tools.py,sha256=po2tdglVz6lw0UoWAmKpCgTw-5LfWA7XJTP_u9WtxLA,10068
54
+ GameSentenceMiner/util/downloader/download_tools.py,sha256=axKhUplGx3ATZv83n-EajSK8iCXm41AprbixQt6yJKA,11522
55
55
  GameSentenceMiner/util/downloader/oneocr_dl.py,sha256=l3s9Z-x1b57GX048o5h-MVv0UTZo4H-Q-zb-JREkMLI,10439
56
56
  GameSentenceMiner/util/win10toast/__init__.py,sha256=6TL2w6rzNmpJEp6_v2cAJP_7ExA3UsKzwdM08pNcVfE,5341
57
57
  GameSentenceMiner/util/win10toast/__main__.py,sha256=5MYnBcFj8y_6Dyc1kiPd0_FsUuh4yl1cv5wsleU6V4w,668
58
58
  GameSentenceMiner/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- GameSentenceMiner/web/database_api.py,sha256=Wz0haPJjCfrMDmN5OSl4fTeLjeAk49PER2PBgElf7Dg,52105
59
+ GameSentenceMiner/web/database_api.py,sha256=bFtU427dQEVqtp4y7nqQzhmuaL0FHS3drWc3KIlRJr8,52643
60
60
  GameSentenceMiner/web/events.py,sha256=6Vyz5c9MdpMIa7Zqljqhap2XFQnAVYJ0CdQV64TSZsA,5119
61
- GameSentenceMiner/web/gsm_websocket.py,sha256=IwwQo6VtgPqeOuc-datgfJyLpX3LwB2MISDqA6EkiSA,4131
61
+ GameSentenceMiner/web/gsm_websocket.py,sha256=B0VKpxmsRu0WRh5nFWlpDPBQ6-K2ed7TEIa0O6YWeoo,4166
62
62
  GameSentenceMiner/web/service.py,sha256=YZchmScTn7AX_GkwV1ULEK6qjdOnJcpc3qfMwDf7cUE,5363
63
63
  GameSentenceMiner/web/stats.py,sha256=h4tRA_00OdQ9uVYrQuAE5SmeSGHMLfTUHPOy6re_h5s,22366
64
- GameSentenceMiner/web/texthooking_page.py,sha256=zQx9c8AQ4pWN8JgxvW0MKWkvtoIyrhXBlGdT-acBupU,13484
64
+ GameSentenceMiner/web/texthooking_page.py,sha256=IgHsm7l-5pPaYBD8moJnFxRpcvPo_AHNYRi77cPhyRM,14515
65
65
  GameSentenceMiner/web/static/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  GameSentenceMiner/web/static/apple-touch-icon.png,sha256=OcMI8af_68DA_tweOsQ5LytTyMwm7-hPW07IfrOVgEs,46132
67
67
  GameSentenceMiner/web/static/favicon-96x96.png,sha256=lOePzjiKl1JY2J1kT_PMdyEnrlJmi5GWbmXJunM12B4,16502
@@ -73,26 +73,26 @@ GameSentenceMiner/web/static/web-app-manifest-192x192.png,sha256=EfSNnBmsSaLfESb
73
73
  GameSentenceMiner/web/static/web-app-manifest-512x512.png,sha256=wyqgCWCrLEUxSRXmaA3iJEESd-vM-ZmlTtZFBY4V8Pk,230819
74
74
  GameSentenceMiner/web/static/css/kanji-grid.css,sha256=FjgoZW77Uy8mTM6lHGO85tjzoNhkAS6cdXzLDcLLMh8,2449
75
75
  GameSentenceMiner/web/static/css/search.css,sha256=x06xsErfThUpE1NAG4CA2sCPSZ-ofNWEI_ekV2Ok5hY,253
76
- GameSentenceMiner/web/static/css/shared.css,sha256=66kQvgoyBhw3AFNUpGhTJDRvb7T3b7hO63lMealCqnk,17198
77
- GameSentenceMiner/web/static/css/stats.css,sha256=Ybjm_XzEqo0A0tnQtdPvGgdfz9o8Gy2ghJSKzQ2a0TQ,14418
78
- GameSentenceMiner/web/static/js/anki_stats.js,sha256=wZfr9vXGF--OTXOszjB3XX1pI2RrMBxGHoGwGvJ20xg,3171
76
+ GameSentenceMiner/web/static/css/shared.css,sha256=NjnWdZwlmMn-OoN_4q7CG2rwcS4zRuP9rwnYQogo5Wc,17835
77
+ GameSentenceMiner/web/static/css/stats.css,sha256=4-rKsi6DuCxd4EoBxKRxZVXAmqkdkuXBQe7oswXAC7w,24284
78
+ GameSentenceMiner/web/static/js/anki_stats.js,sha256=1NWGAD2qJnfQpPWzENZdRjxz3xO2iN8ApegsDz9Mb9w,6843
79
79
  GameSentenceMiner/web/static/js/database.js,sha256=-SjMmhXzU8a3QNGrwGtJCu55ZXXfkBxlYSkySEBdclU,22097
80
80
  GameSentenceMiner/web/static/js/kanji-grid.js,sha256=rUa8_TGFm4Z8CtURoAlZjCN032PLe0YmHvN52S4_sE0,7181
81
81
  GameSentenceMiner/web/static/js/search.js,sha256=QrjsVXf90c1LzD09TPaK93RbIN9yEiXF8IKAKrDY4hw,10482
82
- GameSentenceMiner/web/static/js/shared.js,sha256=gFGDMDsuwH3j8bobJhVUtu5ddejzqeyEsCZWwIlcjzU,21010
83
- GameSentenceMiner/web/static/js/stats.js,sha256=uAh_J0JngC1QjB_Y9YxRKfWrxfPsdyy6Ypk5WFerZKU,86149
84
- GameSentenceMiner/web/templates/anki_stats.html,sha256=FdIMl-kY0-3as9Wn0i-wKIIkl1xXn4nWMbWPypN_1T0,10955
82
+ GameSentenceMiner/web/static/js/shared.js,sha256=LM4NN3YhAMqyyFAcgwKyKs3cLm5beL9VidGK-k5uFnU,19134
83
+ GameSentenceMiner/web/static/js/stats.js,sha256=3mSUn77PwaxqB7CXAlkUYKUHSkdUTQG0gw7YfEmjvN0,95373
84
+ GameSentenceMiner/web/templates/anki_stats.html,sha256=FMRtl0voshXhAUCxCZaM4PQJEGgbwvK7KV-UMCDGLII,12388
85
85
  GameSentenceMiner/web/templates/database.html,sha256=Gd54rgZmfcV7ufoJ69COeMncs5Q5u-rSJcsIvROVCEo,13732
86
- GameSentenceMiner/web/templates/index.html,sha256=7ChQ1j602MOiYU95wXAKP_Ezsh_JgdlGz2uXIzS2j0g,227894
86
+ GameSentenceMiner/web/templates/index.html,sha256=-_qnXY6YR2S6mJ4aRz98fM_3gI4ke4QOjv3CtiBbr1k,229563
87
87
  GameSentenceMiner/web/templates/search.html,sha256=nao3M_hAbm5ftzThi91NtQ3ZiINMPUNx4ngFmqLnLQ4,4060
88
- GameSentenceMiner/web/templates/stats.html,sha256=G3S2YBZ2sQ-D4wTQQBe8411cVTE9QPQq-wr4kyDPi_w,32508
88
+ GameSentenceMiner/web/templates/stats.html,sha256=i6kVMx6Up2Ilc0nf-Uh70GbloUcYRqxOYrA7XwLZxd4,33035
89
89
  GameSentenceMiner/web/templates/utility.html,sha256=KtqnZUMAYs5XsEdC9Tlsd40NKAVic0mu6sh-ReMDJpU,16940
90
90
  GameSentenceMiner/web/templates/components/navigation.html,sha256=6y9PvM3nh8LY6JWrZb6zVOm0vqkBLDc6d3gB9X5lT_w,1055
91
91
  GameSentenceMiner/web/templates/components/theme-styles.html,sha256=hiq3zdJljpRjQO1iUA7gfFKwXebltG-IWW-gnKS4GHA,3439
92
92
  GameSentenceMiner/wip/__init___.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- gamesentenceminer-2.17.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
94
- gamesentenceminer-2.17.1.dist-info/METADATA,sha256=Vazu7A1hko6UXZpaRk1B3ZetDiDMcJBQb4Kzt8XgBag,7348
95
- gamesentenceminer-2.17.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
96
- gamesentenceminer-2.17.1.dist-info/entry_points.txt,sha256=2APEP25DbfjSxGeHtwBstMH8mulVhLkqF_b9bqzU6vQ,65
97
- gamesentenceminer-2.17.1.dist-info/top_level.txt,sha256=V1hUY6xVSyUEohb0uDoN4UIE6rUZ_JYx8yMyPGX4PgQ,18
98
- gamesentenceminer-2.17.1.dist-info/RECORD,,
93
+ gamesentenceminer-2.17.3.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
94
+ gamesentenceminer-2.17.3.dist-info/METADATA,sha256=Yr9TwKuUOUhU5QWe2dqwq9DPkfpvGZl7OE9D1NLZZe8,7348
95
+ gamesentenceminer-2.17.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
96
+ gamesentenceminer-2.17.3.dist-info/entry_points.txt,sha256=2APEP25DbfjSxGeHtwBstMH8mulVhLkqF_b9bqzU6vQ,65
97
+ gamesentenceminer-2.17.3.dist-info/top_level.txt,sha256=V1hUY6xVSyUEohb0uDoN4UIE6rUZ_JYx8yMyPGX4PgQ,18
98
+ gamesentenceminer-2.17.3.dist-info/RECORD,,