GameSentenceMiner 2.19.16__py3-none-any.whl → 2.20.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.

Potentially problematic release.


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

Files changed (70) hide show
  1. GameSentenceMiner/__init__.py +39 -0
  2. GameSentenceMiner/anki.py +6 -3
  3. GameSentenceMiner/gametext.py +13 -2
  4. GameSentenceMiner/gsm.py +40 -3
  5. GameSentenceMiner/locales/en_us.json +4 -0
  6. GameSentenceMiner/locales/ja_jp.json +4 -0
  7. GameSentenceMiner/locales/zh_cn.json +4 -0
  8. GameSentenceMiner/obs.py +4 -1
  9. GameSentenceMiner/owocr/owocr/ocr.py +304 -134
  10. GameSentenceMiner/owocr/owocr/run.py +1 -1
  11. GameSentenceMiner/ui/anki_confirmation.py +4 -2
  12. GameSentenceMiner/ui/config_gui.py +12 -0
  13. GameSentenceMiner/util/configuration.py +6 -2
  14. GameSentenceMiner/util/cron/__init__.py +12 -0
  15. GameSentenceMiner/util/cron/daily_rollup.py +613 -0
  16. GameSentenceMiner/util/cron/jiten_update.py +397 -0
  17. GameSentenceMiner/util/cron/populate_games.py +154 -0
  18. GameSentenceMiner/util/cron/run_crons.py +148 -0
  19. GameSentenceMiner/util/cron/setup_populate_games_cron.py +118 -0
  20. GameSentenceMiner/util/cron_table.py +334 -0
  21. GameSentenceMiner/util/db.py +236 -49
  22. GameSentenceMiner/util/ffmpeg.py +23 -4
  23. GameSentenceMiner/util/games_table.py +340 -93
  24. GameSentenceMiner/util/jiten_api_client.py +188 -0
  25. GameSentenceMiner/util/stats_rollup_table.py +216 -0
  26. GameSentenceMiner/web/anki_api_endpoints.py +438 -220
  27. GameSentenceMiner/web/database_api.py +955 -1259
  28. GameSentenceMiner/web/jiten_database_api.py +1015 -0
  29. GameSentenceMiner/web/rollup_stats.py +672 -0
  30. GameSentenceMiner/web/static/css/dashboard-shared.css +75 -13
  31. GameSentenceMiner/web/static/css/overview.css +604 -47
  32. GameSentenceMiner/web/static/css/search.css +226 -0
  33. GameSentenceMiner/web/static/css/shared.css +762 -0
  34. GameSentenceMiner/web/static/css/stats.css +221 -0
  35. GameSentenceMiner/web/static/js/components/bar-chart.js +339 -0
  36. GameSentenceMiner/web/static/js/database-bulk-operations.js +320 -0
  37. GameSentenceMiner/web/static/js/database-game-data.js +390 -0
  38. GameSentenceMiner/web/static/js/database-game-operations.js +213 -0
  39. GameSentenceMiner/web/static/js/database-helpers.js +44 -0
  40. GameSentenceMiner/web/static/js/database-jiten-integration.js +750 -0
  41. GameSentenceMiner/web/static/js/database-popups.js +89 -0
  42. GameSentenceMiner/web/static/js/database-tabs.js +64 -0
  43. GameSentenceMiner/web/static/js/database-text-management.js +371 -0
  44. GameSentenceMiner/web/static/js/database.js +86 -718
  45. GameSentenceMiner/web/static/js/goals.js +79 -18
  46. GameSentenceMiner/web/static/js/heatmap.js +29 -23
  47. GameSentenceMiner/web/static/js/overview.js +1205 -339
  48. GameSentenceMiner/web/static/js/regex-patterns.js +100 -0
  49. GameSentenceMiner/web/static/js/search.js +215 -18
  50. GameSentenceMiner/web/static/js/shared.js +193 -39
  51. GameSentenceMiner/web/static/js/stats.js +1536 -179
  52. GameSentenceMiner/web/stats.py +1142 -269
  53. GameSentenceMiner/web/stats_api.py +2104 -0
  54. GameSentenceMiner/web/templates/anki_stats.html +4 -18
  55. GameSentenceMiner/web/templates/components/date-range.html +118 -3
  56. GameSentenceMiner/web/templates/components/html-head.html +40 -6
  57. GameSentenceMiner/web/templates/components/js-config.html +8 -8
  58. GameSentenceMiner/web/templates/components/regex-input.html +160 -0
  59. GameSentenceMiner/web/templates/database.html +564 -117
  60. GameSentenceMiner/web/templates/goals.html +41 -5
  61. GameSentenceMiner/web/templates/overview.html +159 -129
  62. GameSentenceMiner/web/templates/search.html +78 -9
  63. GameSentenceMiner/web/templates/stats.html +159 -5
  64. GameSentenceMiner/web/texthooking_page.py +280 -111
  65. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/METADATA +43 -2
  66. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/RECORD +70 -47
  67. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/WHEEL +0 -0
  68. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/entry_points.txt +0 -0
  69. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/licenses/LICENSE +0 -0
  70. {gamesentenceminer-2.19.16.dist-info → gamesentenceminer-2.20.0.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,168 @@
1
1
  /* Search Page Specific Styles */
2
2
 
3
+ /* Toggle Advanced Search Button */
4
+ .toggle-advanced-btn {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ gap: 6px;
8
+ padding: 8px 16px;
9
+ background: var(--bg-secondary);
10
+ color: var(--text-primary);
11
+ border: 1px solid var(--border-color);
12
+ border-radius: 6px;
13
+ cursor: pointer;
14
+ font-size: 14px;
15
+ font-weight: 500;
16
+ transition: all 0.2s ease;
17
+ }
18
+
19
+ .toggle-advanced-btn:hover {
20
+ background: var(--bg-tertiary);
21
+ border-color: var(--accent-color);
22
+ }
23
+
24
+ .toggle-advanced-btn:active {
25
+ transform: translateY(1px);
26
+ }
27
+
28
+ .toggle-advanced-btn #toggleIcon {
29
+ font-size: 12px;
30
+ transition: transform 0.2s ease;
31
+ }
32
+
33
+ /* Date Range Component Styling for Search Page */
34
+ .search-container .date-range {
35
+ margin-top: 20px;
36
+ margin-bottom: 20px;
37
+ }
38
+
39
+ .search-container .dashboard-card {
40
+ background: var(--bg-secondary);
41
+ border: 1px solid var(--border-color);
42
+ border-radius: 8px;
43
+ padding: 16px;
44
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
45
+ }
46
+
47
+ .search-container .dashboard-card-header {
48
+ margin-bottom: 12px;
49
+ padding-bottom: 8px;
50
+ border-bottom: 1px solid var(--border-color);
51
+ }
52
+
53
+ .search-container .dashboard-card-title {
54
+ font-size: 16px;
55
+ font-weight: 600;
56
+ color: var(--text-primary);
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 8px;
60
+ margin: 0;
61
+ }
62
+
63
+ .search-container .dashboard-card-icon {
64
+ font-size: 18px;
65
+ }
66
+
67
+ .search-container .dashboard-date-range {
68
+ display: flex;
69
+ flex-wrap: wrap;
70
+ gap: 16px;
71
+ align-items: flex-end;
72
+ }
73
+
74
+ .search-container .dashboard-date-item {
75
+ flex: 1;
76
+ min-width: 150px;
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: 6px;
80
+ }
81
+
82
+ .search-container .dashboard-date-item label {
83
+ font-size: 14px;
84
+ font-weight: 500;
85
+ color: var(--text-secondary);
86
+ }
87
+
88
+ .search-container .dashboard-date-input {
89
+ padding: 8px 12px;
90
+ border: 1px solid var(--border-color);
91
+ border-radius: 6px;
92
+ background: var(--bg-primary);
93
+ color: var(--text-primary);
94
+ font-size: 14px;
95
+ transition: all 0.2s ease;
96
+ }
97
+
98
+ .search-container .dashboard-date-input:hover {
99
+ border-color: var(--accent-color);
100
+ }
101
+
102
+ .search-container .dashboard-date-input:focus {
103
+ outline: none;
104
+ border-color: var(--accent-color);
105
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
106
+ }
107
+
108
+ .search-container .dashboard-date-presets {
109
+ flex: 1;
110
+ min-width: 200px;
111
+ display: flex;
112
+ flex-direction: column;
113
+ gap: 6px;
114
+ }
115
+
116
+ .search-container .dashboard-presets-label {
117
+ font-size: 14px;
118
+ font-weight: 500;
119
+ color: var(--text-secondary);
120
+ }
121
+
122
+ .search-container .dashboard-presets-select {
123
+ padding: 8px 12px;
124
+ border: 1px solid var(--border-color);
125
+ border-radius: 6px;
126
+ background: var(--bg-primary);
127
+ color: var(--text-primary);
128
+ font-size: 14px;
129
+ cursor: pointer;
130
+ transition: all 0.2s ease;
131
+ }
132
+
133
+ .search-container .dashboard-presets-select:hover {
134
+ border-color: var(--accent-color);
135
+ }
136
+
137
+ .search-container .dashboard-presets-select:focus {
138
+ outline: none;
139
+ border-color: var(--accent-color);
140
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
141
+ }
142
+
143
+ /* Tooltip styling for date inputs */
144
+ .search-container .tooltip {
145
+ position: relative;
146
+ }
147
+
148
+ .search-container .tooltip:hover::after {
149
+ content: attr(data-tooltip);
150
+ position: absolute;
151
+ bottom: 100%;
152
+ left: 50%;
153
+ transform: translateX(-50%);
154
+ padding: 6px 10px;
155
+ background: var(--bg-tertiary);
156
+ color: var(--text-primary);
157
+ border: 1px solid var(--border-color);
158
+ border-radius: 4px;
159
+ font-size: 12px;
160
+ white-space: nowrap;
161
+ z-index: 1000;
162
+ margin-bottom: 5px;
163
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
164
+ }
165
+
3
166
  /* Checkbox styling for search results */
4
167
  .line-checkbox {
5
168
  margin-top: 4px;
@@ -54,6 +217,61 @@
54
217
  }
55
218
  }
56
219
 
220
+ /* Duplicate Detection Section Styles */
221
+ #duplicateDetectionSection {
222
+ transition: all 0.3s ease;
223
+ }
224
+
225
+ #duplicateDetectionSection .form-group {
226
+ margin-bottom: 0;
227
+ }
228
+
229
+ #duplicateDetectionSection .form-input {
230
+ font-size: 14px;
231
+ transition: border-color 0.2s ease;
232
+ }
233
+
234
+ #duplicateDetectionSection .form-input:hover {
235
+ border-color: var(--accent-color);
236
+ }
237
+
238
+ #duplicateDetectionSection .form-input:focus {
239
+ outline: none;
240
+ border-color: var(--accent-color);
241
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
242
+ }
243
+
244
+ #duplicateDetectionSection .checkbox-input:hover {
245
+ opacity: 0.8;
246
+ }
247
+
248
+ #duplicateDetectionSection .checkbox-label:hover {
249
+ color: var(--accent-color);
250
+ }
251
+
252
+ #toggleDuplicateDetection {
253
+ background: var(--bg-primary);
254
+ transition: all 0.2s ease;
255
+ }
256
+
257
+ #toggleDuplicateDetection:hover {
258
+ background: var(--bg-tertiary);
259
+ transform: translateY(-1px);
260
+ }
261
+
262
+ #searchDuplicatesBtn {
263
+ transition: all 0.2s ease;
264
+ }
265
+
266
+ #searchDuplicatesBtn:hover {
267
+ transform: translateY(-1px);
268
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
269
+ }
270
+
271
+ #searchDuplicatesBtn:active {
272
+ transform: translateY(0);
273
+ }
274
+
57
275
  /* Search-specific responsive styles */
58
276
  @media (max-width: 768px) {
59
277
  .navigation {
@@ -65,4 +283,12 @@
65
283
  margin: 5px 0;
66
284
  text-align: center;
67
285
  }
286
+
287
+ #duplicateDetectionSection {
288
+ padding: 12px;
289
+ }
290
+
291
+ #duplicateDetectionSection .form-input {
292
+ font-size: 16px; /* Prevent zoom on mobile */
293
+ }
68
294
  }