GameSentenceMiner 2.17.7__py3-none-any.whl → 2.18.1__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.

Potentially problematic release.


This version of GameSentenceMiner might be problematic. Click here for more details.

Files changed (76) 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/kanji_grid/basic_kanji_book_bkb_v1_v2.json +17 -0
  40. GameSentenceMiner/web/templates/components/kanji_grid/duolingo_kanji.json +29 -0
  41. GameSentenceMiner/web/templates/components/kanji_grid/grade.json +17 -0
  42. GameSentenceMiner/web/templates/components/kanji_grid/hk_primary_learning.json +17 -0
  43. GameSentenceMiner/web/templates/components/kanji_grid/hkscs2016.json +13 -0
  44. GameSentenceMiner/web/templates/components/kanji_grid/hsk_levels.json +33 -0
  45. GameSentenceMiner/web/templates/components/kanji_grid/humanum_frequency_list.json +41 -0
  46. GameSentenceMiner/web/templates/components/kanji_grid/jis_levels.json +25 -0
  47. GameSentenceMiner/web/templates/components/kanji_grid/jlpt_level.json +29 -0
  48. GameSentenceMiner/web/templates/components/kanji_grid/jpdb_kanji_frequency_list.json +37 -0
  49. GameSentenceMiner/web/templates/components/kanji_grid/jpdbv2_kanji_frequency_list.json +161 -0
  50. GameSentenceMiner/web/templates/components/kanji_grid/jun_das_modern_chinese_character_frequency_list.json +13 -0
  51. GameSentenceMiner/web/templates/components/kanji_grid/kanji_in_context_revised_edition.json +37 -0
  52. GameSentenceMiner/web/templates/components/kanji_grid/kanji_kentei_level.json +61 -0
  53. GameSentenceMiner/web/templates/components/kanji_grid/mainland_china_elementary_textbook_characters.json +33 -0
  54. GameSentenceMiner/web/templates/components/kanji_grid/moe_way_quiz.json +47 -0
  55. GameSentenceMiner/web/templates/components/kanji_grid/official_kanji.json +25 -0
  56. GameSentenceMiner/web/templates/components/kanji_grid/remembering_the_kanji.json +25 -0
  57. GameSentenceMiner/web/templates/components/kanji_grid/standard_form_of_national_characters.json +25 -0
  58. GameSentenceMiner/web/templates/components/kanji_grid/table_of_general_standard_chinese_characters.json +21 -0
  59. GameSentenceMiner/web/templates/components/kanji_grid/the_kodansha_kanji_learners_course_klc.json +45 -0
  60. GameSentenceMiner/web/templates/components/kanji_grid/thousand_character_classic.json +13 -0
  61. GameSentenceMiner/web/templates/components/kanji_grid/wanikani_levels.json +249 -0
  62. GameSentenceMiner/web/templates/components/kanji_grid/words_hk_frequency_list.json +33 -0
  63. GameSentenceMiner/web/templates/components/navigation.html +3 -1
  64. GameSentenceMiner/web/templates/database.html +73 -1
  65. GameSentenceMiner/web/templates/goals.html +376 -0
  66. GameSentenceMiner/web/templates/index.html +13 -11
  67. GameSentenceMiner/web/templates/overview.html +416 -0
  68. GameSentenceMiner/web/templates/stats.html +46 -251
  69. GameSentenceMiner/web/texthooking_page.py +18 -0
  70. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.1.dist-info}/METADATA +5 -1
  71. gamesentenceminer-2.18.1.dist-info/RECORD +132 -0
  72. gamesentenceminer-2.17.7.dist-info/RECORD +0 -98
  73. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.1.dist-info}/WHEEL +0 -0
  74. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.1.dist-info}/entry_points.txt +0 -0
  75. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.1.dist-info}/licenses/LICENSE +0 -0
  76. {gamesentenceminer-2.17.7.dist-info → gamesentenceminer-2.18.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,241 @@
1
+ /* Dashboard Shared Styles for GSM (extracted from stats.css and overview.css) */
2
+
3
+ /* Dashboard Container */
4
+ .dashboard-container {
5
+ display: grid;
6
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
7
+ gap: 30px;
8
+ margin-bottom: 40px;
9
+ }
10
+
11
+ /* Dashboard Card */
12
+ .dashboard-card {
13
+ background: var(--bg-secondary);
14
+ border-radius: 12px;
15
+ box-shadow: 0 4px 16px var(--shadow-color);
16
+ border: 1px solid var(--border-color);
17
+ padding: 24px;
18
+ transition: all 0.3s ease;
19
+ position: relative;
20
+ overflow: hidden;
21
+ }
22
+ .dashboard-card:hover {
23
+ transform: translateY(-2px);
24
+ box-shadow: 0 8px 24px var(--shadow-color);
25
+ }
26
+ .dashboard-card::before {
27
+ content: '';
28
+ position: absolute;
29
+ top: 0;
30
+ left: 0;
31
+ right: 0;
32
+ height: 4px;
33
+ background: linear-gradient(90deg, var(--accent-color), var(--success-color));
34
+ border-radius: 12px 12px 0 0;
35
+ }
36
+ .dashboard-card.current-game::before {
37
+ background: linear-gradient(90deg, var(--accent-color), var(--info-color));
38
+ }
39
+ .dashboard-card.all-games::before {
40
+ background: linear-gradient(90deg, var(--success-color), var(--warning-color));
41
+ }
42
+ .dashboard-card.date-range::before {
43
+ background: linear-gradient(90deg, var(--info-color), var(--accent-color));
44
+ }
45
+ .dashboard-card.date-range {
46
+ margin-bottom: 30px;
47
+ }
48
+ .dashboard-card-header {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: space-between;
52
+ margin-bottom: 20px;
53
+ }
54
+ .dashboard-card-title {
55
+ font-size: 20px;
56
+ font-weight: 600;
57
+ color: var(--text-primary);
58
+ margin: 0;
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 10px;
62
+ }
63
+ .dashboard-card-icon {
64
+ font-size: 24px;
65
+ opacity: 0.8;
66
+ }
67
+ .dashboard-card-subtitle {
68
+ font-size: 14px;
69
+ color: var(--text-tertiary);
70
+ margin: 4px 0 0 0;
71
+ }
72
+
73
+ /* Stats Grid */
74
+ .dashboard-stats-grid {
75
+ display: grid;
76
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
77
+ gap: 16px;
78
+ margin-bottom: 20px;
79
+ }
80
+ .dashboard-stat-item {
81
+ text-align: center;
82
+ padding: 12px;
83
+ background: var(--bg-tertiary);
84
+ border-radius: 8px;
85
+ transition: all 0.2s ease;
86
+ position: relative;
87
+ cursor: pointer;
88
+ }
89
+ .dashboard-stat-item:hover {
90
+ background: var(--border-color);
91
+ transform: scale(1.02);
92
+ }
93
+ .dashboard-stat-value {
94
+ font-size: 24px;
95
+ font-weight: bold;
96
+ color: var(--text-primary);
97
+ margin-bottom: 4px;
98
+ display: block;
99
+ }
100
+ .dashboard-stat-label {
101
+ font-size: 12px;
102
+ color: var(--text-tertiary);
103
+ text-transform: uppercase;
104
+ letter-spacing: 0.5px;
105
+ font-weight: 500;
106
+ }
107
+
108
+ /* Progress Section */
109
+ .dashboard-progress-section {
110
+ margin-top: 20px;
111
+ padding-top: 20px;
112
+ border-top: 1px solid var(--border-color);
113
+ }
114
+ .dashboard-progress-title {
115
+ font-size: 14px;
116
+ font-weight: 600;
117
+ color: var(--text-secondary);
118
+ margin-bottom: 12px;
119
+ }
120
+ .dashboard-progress-items {
121
+ display: flex;
122
+ justify-content: space-between;
123
+ gap: 16px;
124
+ }
125
+ .dashboard-progress-item {
126
+ text-align: center;
127
+ flex: 1;
128
+ }
129
+ .dashboard-progress-value {
130
+ font-size: 18px;
131
+ font-weight: bold;
132
+ margin-bottom: 4px;
133
+ }
134
+ .dashboard-progress-value.positive {
135
+ color: var(--success-color);
136
+ }
137
+ .dashboard-progress-value.neutral {
138
+ color: var(--text-secondary);
139
+ }
140
+ .dashboard-progress-label {
141
+ font-size: 11px;
142
+ color: var(--text-tertiary);
143
+ text-transform: uppercase;
144
+ letter-spacing: 0.5px;
145
+ }
146
+
147
+ /* Streak Indicator */
148
+ .dashboard-streak-indicator {
149
+ display: inline-flex;
150
+ align-items: center;
151
+ gap: 4px;
152
+ font-size: 12px;
153
+ color: var(--success-color);
154
+ background: rgba(40, 167, 69, 0.1);
155
+ padding: 4px 8px;
156
+ border-radius: 12px;
157
+ font-weight: 500;
158
+ }
159
+ .dashboard-streak-indicator::before {
160
+ content: '🔥';
161
+ font-size: 14px;
162
+ }
163
+
164
+ /* Date Range Card */
165
+ .dashboard-date-range {
166
+ display: flex;
167
+ gap: 20px;
168
+ }
169
+ .dashboard-date-item {
170
+ flex: 1;
171
+ display: flex;
172
+ flex-direction: column;
173
+ gap: 6px;
174
+ }
175
+ .dashboard-date-item label {
176
+ font-size: 13px;
177
+ color: var(--text-secondary);
178
+ font-weight: 500;
179
+ }
180
+ .dashboard-date-input {
181
+ padding: 8px 12px;
182
+ border: 1px solid var(--border-color);
183
+ border-radius: 8px;
184
+ background: var(--bg-tertiary);
185
+ color: var(--text-primary);
186
+ font-size: 14px;
187
+ transition: all 0.2s ease;
188
+ }
189
+ .dashboard-date-input:focus {
190
+ outline: none;
191
+ border-color: var(--accent-color);
192
+ box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.15);
193
+ }
194
+
195
+ /* Responsive Design */
196
+ @media (max-width: 768px) {
197
+ .dashboard-container {
198
+ grid-template-columns: 1fr;
199
+ gap: 20px;
200
+ margin-bottom: 30px;
201
+ }
202
+ .dashboard-card {
203
+ padding: 20px;
204
+ }
205
+ .dashboard-stats-grid {
206
+ grid-template-columns: repeat(2, 1fr);
207
+ gap: 12px;
208
+ }
209
+ .dashboard-stat-value {
210
+ font-size: 20px;
211
+ }
212
+ .dashboard-progress-items {
213
+ flex-direction: column;
214
+ gap: 12px;
215
+ }
216
+ .dashboard-card-title {
217
+ font-size: 18px;
218
+ }
219
+ .dashboard-date-range {
220
+ flex-direction: column;
221
+ gap: 12px;
222
+ padding: 12px 16px;
223
+ }
224
+ .dashboard-date-item {
225
+ width: 100%;
226
+ }
227
+ }
228
+ @media (max-width: 480px) {
229
+ .dashboard-stats-grid {
230
+ grid-template-columns: 1fr;
231
+ }
232
+ .dashboard-card {
233
+ padding: 16px;
234
+ }
235
+ .dashboard-stat-item {
236
+ padding: 16px;
237
+ }
238
+ .dashboard-stat-value {
239
+ font-size: 22px;
240
+ }
241
+ }
@@ -1,5 +1,41 @@
1
1
  /* Shared Kanji Grid Component Styles */
2
2
 
3
+ /* Sort Dropdown */
4
+ .kanji-sort-dropdown-container {
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: flex-end;
8
+ margin-bottom: 15px;
9
+ gap: 8px;
10
+ }
11
+
12
+ .kanji-sort-label {
13
+ font-size: 14px;
14
+ font-weight: 500;
15
+ color: var(--text-primary, #333);
16
+ }
17
+
18
+ .kanji-sort-dropdown {
19
+ padding: 6px 12px;
20
+ border: 1px solid var(--border-color, #ddd);
21
+ border-radius: 4px;
22
+ background: var(--bg-secondary, #fff);
23
+ color: var(--text-primary, #333);
24
+ font-size: 14px;
25
+ cursor: pointer;
26
+ transition: border-color 0.2s ease;
27
+ }
28
+
29
+ .kanji-sort-dropdown:hover {
30
+ border-color: var(--primary-color, #007bff);
31
+ }
32
+
33
+ .kanji-sort-dropdown:focus {
34
+ outline: none;
35
+ border-color: var(--primary-color, #007bff);
36
+ box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.1);
37
+ }
38
+
3
39
  /* Kanji Grid Container */
4
40
  .kanji-counter {
5
41
  text-align: center;
@@ -10,11 +46,16 @@
10
46
  }
11
47
 
12
48
  .kanji-grid {
49
+ display: block;
50
+ margin-bottom: 20px;
51
+ max-width: 100%;
52
+ }
53
+
54
+ /* Flat/frequency mode - use grid for kanji cells only */
55
+ .kanji-grid.flat-mode {
13
56
  display: grid;
14
57
  grid-template-columns: repeat(auto-fill, minmax(30px, 1fr));
15
58
  gap: 3px;
16
- margin-bottom: 20px;
17
- max-width: 100%;
18
59
  }
19
60
 
20
61
  /* Individual Kanji Cell */
@@ -50,6 +91,57 @@
50
91
  .kanji-cell.level-3 { background-color: #239a3b; color: white; }
51
92
  .kanji-cell.level-4 { background-color: #196127; color: white; }
52
93
 
94
+ /* Group Sections - Stacked Layout */
95
+ .kanji-group-section {
96
+ margin-bottom: 60px;
97
+ width: 100%;
98
+ clear: both;
99
+ padding: 15px 0;
100
+ overflow: hidden;
101
+ }
102
+
103
+ .kanji-group-section:last-child {
104
+ margin-bottom: 30px;
105
+ }
106
+
107
+ .kanji-group-header {
108
+ font-size: 20px;
109
+ font-weight: 600;
110
+ color: var(--text-primary, #d0d0d0);
111
+ margin: 0 auto 15px auto;
112
+ padding: 0;
113
+ text-align: center;
114
+ width: 100%;
115
+ display: block;
116
+ word-wrap: break-word;
117
+ overflow-wrap: break-word;
118
+ max-width: 100%;
119
+ }
120
+
121
+ .kanji-group-stats {
122
+ font-size: 14px;
123
+ color: var(--text-secondary, #888);
124
+ margin: 0 auto 25px auto;
125
+ text-align: center;
126
+ width: 100%;
127
+ display: block;
128
+ word-wrap: break-word;
129
+ overflow-wrap: break-word;
130
+ line-height: 1.5;
131
+ }
132
+
133
+ .kanji-group-grid {
134
+ display: flex;
135
+ flex-wrap: wrap;
136
+ gap: 8px;
137
+ padding: 0;
138
+ margin: 0;
139
+ width: 100%;
140
+ justify-content: flex-start;
141
+ align-items: flex-start;
142
+ min-width: 0;
143
+ }
144
+
53
145
  /* Legend */
54
146
  .kanji-legend {
55
147
  display: flex;