GameSentenceMiner 2.17.7__py3-none-any.whl → 2.18.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.
Files changed (51) hide show
  1. GameSentenceMiner/ai/ai_prompting.py +6 -6
  2. GameSentenceMiner/anki.py +236 -152
  3. GameSentenceMiner/gametext.py +7 -4
  4. GameSentenceMiner/gsm.py +49 -10
  5. GameSentenceMiner/locales/en_us.json +7 -3
  6. GameSentenceMiner/locales/ja_jp.json +8 -4
  7. GameSentenceMiner/locales/zh_cn.json +8 -4
  8. GameSentenceMiner/obs.py +238 -59
  9. GameSentenceMiner/ocr/owocr_helper.py +1 -1
  10. GameSentenceMiner/tools/ss_selector.py +7 -8
  11. GameSentenceMiner/ui/__init__.py +0 -0
  12. GameSentenceMiner/ui/anki_confirmation.py +187 -0
  13. GameSentenceMiner/{config_gui.py → ui/config_gui.py} +100 -35
  14. GameSentenceMiner/ui/screenshot_selector.py +215 -0
  15. GameSentenceMiner/util/configuration.py +124 -22
  16. GameSentenceMiner/util/db.py +22 -13
  17. GameSentenceMiner/util/downloader/download_tools.py +2 -2
  18. GameSentenceMiner/util/ffmpeg.py +24 -30
  19. GameSentenceMiner/util/get_overlay_coords.py +34 -34
  20. GameSentenceMiner/util/gsm_utils.py +31 -1
  21. GameSentenceMiner/util/text_log.py +11 -9
  22. GameSentenceMiner/vad.py +31 -12
  23. GameSentenceMiner/web/database_api.py +742 -123
  24. GameSentenceMiner/web/static/css/dashboard-shared.css +241 -0
  25. GameSentenceMiner/web/static/css/kanji-grid.css +94 -2
  26. GameSentenceMiner/web/static/css/overview.css +850 -0
  27. GameSentenceMiner/web/static/css/popups-shared.css +126 -0
  28. GameSentenceMiner/web/static/css/shared.css +97 -0
  29. GameSentenceMiner/web/static/css/stats.css +192 -597
  30. GameSentenceMiner/web/static/js/anki_stats.js +6 -4
  31. GameSentenceMiner/web/static/js/database.js +209 -5
  32. GameSentenceMiner/web/static/js/goals.js +610 -0
  33. GameSentenceMiner/web/static/js/kanji-grid.js +267 -4
  34. GameSentenceMiner/web/static/js/overview.js +1176 -0
  35. GameSentenceMiner/web/static/js/shared.js +25 -0
  36. GameSentenceMiner/web/static/js/stats.js +154 -1459
  37. GameSentenceMiner/web/stats.py +2 -2
  38. GameSentenceMiner/web/templates/anki_stats.html +5 -0
  39. GameSentenceMiner/web/templates/components/navigation.html +3 -1
  40. GameSentenceMiner/web/templates/database.html +73 -1
  41. GameSentenceMiner/web/templates/goals.html +376 -0
  42. GameSentenceMiner/web/templates/index.html +13 -11
  43. GameSentenceMiner/web/templates/overview.html +416 -0
  44. GameSentenceMiner/web/templates/stats.html +46 -251
  45. GameSentenceMiner/web/texthooking_page.py +18 -0
  46. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.0.dist-info}/METADATA +5 -1
  47. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.0.dist-info}/RECORD +51 -41
  48. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.0.dist-info}/WHEEL +0 -0
  49. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.0.dist-info}/entry_points.txt +0 -0
  50. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.0.dist-info}/licenses/LICENSE +0 -0
  51. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,126 @@
1
+ /* Shared Popup Styles for GSM (extracted from stats.css and overview.css) */
2
+
3
+ /* Base Popup Overlay */
4
+ .dashboard-popup,
5
+ .no-data-popup {
6
+ position: fixed;
7
+ top: 0;
8
+ left: 0;
9
+ right: 0;
10
+ bottom: 0;
11
+ display: flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ background: rgba(0, 0, 0, 0.4);
15
+ z-index: 2000;
16
+ }
17
+
18
+ .hidden {
19
+ display: none;
20
+ }
21
+
22
+ /* Popup Content */
23
+ .dashboard-popup-content,
24
+ .no-data-content {
25
+ background: var(--bg-secondary);
26
+ border: 1px solid var(--border-color);
27
+ border-radius: 12px;
28
+ padding: 24px;
29
+ box-shadow: 0 8px 24px var(--shadow-color);
30
+ text-align: center;
31
+ max-width: 400px;
32
+ width: 90%;
33
+ animation: popupFadeIn 0.3s ease;
34
+ }
35
+
36
+ .dashboard-popup-icon {
37
+ font-size: 36px;
38
+ margin-bottom: 12px;
39
+ }
40
+
41
+ .dashboard-popup-message,
42
+ .no-data-content p {
43
+ font-size: 14px;
44
+ color: var(--text-primary);
45
+ margin-bottom: 20px;
46
+ }
47
+
48
+ .dashboard-popup-message {
49
+ color: var(--danger-color);
50
+ font-weight: 500;
51
+ }
52
+
53
+ .dashboard-popup-btn,
54
+ #closeNoDataPopup {
55
+ background: var(--accent-color);
56
+ color: white;
57
+ border: none;
58
+ padding: 10px 18px;
59
+ border-radius: 8px;
60
+ font-size: 14px;
61
+ cursor: pointer;
62
+ transition: all 0.2s ease;
63
+ font-weight: 600;
64
+ }
65
+
66
+ .dashboard-popup-btn:hover,
67
+ #closeNoDataPopup:hover {
68
+ background: #0056b3;
69
+ transform: translateY(-1px);
70
+ }
71
+
72
+ /* Popup Animation */
73
+ @keyframes popupFadeIn {
74
+ from {
75
+ transform: scale(0.95);
76
+ opacity: 0;
77
+ }
78
+ to {
79
+ transform: scale(1);
80
+ opacity: 1;
81
+ }
82
+ }
83
+
84
+ /* No Data Popup Specific Styles */
85
+ .no-data-popup {
86
+ position: fixed;
87
+ inset: 0;
88
+ background: rgba(0, 0, 0, 0.6);
89
+ display: flex;
90
+ justify-content: center;
91
+ align-items: center;
92
+ z-index: 2000;
93
+ }
94
+
95
+ .no-data-popup.hidden {
96
+ display: none;
97
+ }
98
+
99
+ .no-data-content {
100
+ background: var(--bg-secondary);
101
+ padding: 20px 30px;
102
+ border-radius: 10px;
103
+ text-align: center;
104
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
105
+ }
106
+
107
+ .no-data-content p {
108
+ margin-bottom: 16px;
109
+ color: var(--text-primary);
110
+ font-size: 15px;
111
+ }
112
+
113
+ .no-data-content button {
114
+ padding: 8px 16px;
115
+ background: var(--accent-color);
116
+ border: none;
117
+ border-radius: 6px;
118
+ color: #fff;
119
+ font-weight: 600;
120
+ cursor: pointer;
121
+ transition: all 0.2s ease;
122
+ }
123
+
124
+ .no-data-content button:hover {
125
+ background: #0056b3;
126
+ }
@@ -835,6 +835,68 @@ h1 {
835
835
  color: var(--bg-secondary);
836
836
  }
837
837
 
838
+ /* Game Merge Modal Styles */
839
+ .merge-summary {
840
+ margin: 20px 0;
841
+ }
842
+
843
+ .primary-game-info,
844
+ .secondary-games-info {
845
+ margin-bottom: 15px;
846
+ }
847
+
848
+ .primary-game-info h5,
849
+ .secondary-games-info h5 {
850
+ display: flex;
851
+ align-items: center;
852
+ gap: 8px;
853
+ font-size: 14px;
854
+ font-weight: 600;
855
+ margin: 0 0 10px 0;
856
+ }
857
+
858
+ .merge-stats {
859
+ margin-top: 20px;
860
+ }
861
+
862
+ .merge-stats .stats-row {
863
+ padding: 8px 0;
864
+ border-bottom: 1px solid var(--border-color);
865
+ }
866
+
867
+ .merge-stats .stats-row:last-child {
868
+ border-bottom: none;
869
+ }
870
+
871
+ .secondary-games-info .game-item {
872
+ padding: 8px 0;
873
+ border-bottom: 1px solid var(--border-color);
874
+ }
875
+
876
+ .secondary-games-info .game-item:last-child {
877
+ border-bottom: none;
878
+ }
879
+
880
+ .secondary-games-info .game-name {
881
+ font-weight: 600;
882
+ color: var(--text-primary);
883
+ margin-bottom: 4px;
884
+ }
885
+
886
+ .secondary-games-info .game-stats {
887
+ color: var(--text-tertiary);
888
+ font-size: 12px;
889
+ }
890
+
891
+ /* Merge button spacing */
892
+ .modal-footer .action-btn {
893
+ margin-left: 10px;
894
+ }
895
+
896
+ .modal-footer .action-btn:first-child {
897
+ margin-left: 0;
898
+ }
899
+
838
900
  /* Responsive Design */
839
901
  @media (max-width: 768px) {
840
902
  body {
@@ -867,6 +929,7 @@ h1 {
867
929
  .modal-footer button {
868
930
  width: 100%;
869
931
  margin-bottom: 10px;
932
+ margin-left: 0;
870
933
  }
871
934
 
872
935
  .games-table th, .games-table td {
@@ -949,4 +1012,38 @@ input[type="date"].dashboard-date-input:hover {
949
1012
  border-color: var(--accent-color);
950
1013
  box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.15);
951
1014
  outline: none;
1015
+ }
1016
+
1017
+ /* Merge Target Styling */
1018
+ .checkbox-container {
1019
+ display: flex;
1020
+ align-items: center;
1021
+ padding: 8px;
1022
+ border-radius: 6px;
1023
+ transition: all 0.3s ease;
1024
+ }
1025
+
1026
+ .checkbox-container.merge-target {
1027
+ background-color: var(--accent-color);
1028
+ border: 2px solid var(--accent-color);
1029
+ box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.15);
1030
+ }
1031
+
1032
+ .checkbox-container.merge-target .checkbox-label {
1033
+ color: white;
1034
+ font-weight: 600;
1035
+ }
1036
+
1037
+ .checkbox-container.merge-target .checkbox-label::before {
1038
+ content: "🎯 TARGET: ";
1039
+ font-weight: 700;
1040
+ }
1041
+
1042
+ .checkbox-input {
1043
+ margin-right: 8px;
1044
+ }
1045
+
1046
+ .checkbox-label {
1047
+ cursor: pointer;
1048
+ transition: color 0.3s ease;
952
1049
  }