bvandeusen
a6e8d4b52e
CI / lint (push) Successful in 2s
CI / backend-lint-and-test (push) Failing after 24s
CI / frontend-build (push) Successful in 28s
CI / intimp (push) Successful in 3m57s
CI / intapi (push) Successful in 7m40s
CI / intcore (push) Successful in 8m22s
feat(ml): normalize Camie suggestion names to human-readable
...
Camie's booru-style vocab strings (`uchiha_sasuke_(naruto)`,
`#unicus_(idolmaster)`, `1000-nen_ikiteru_(vocaloid)`, `:/`) were
surfacing raw in SuggestionsPanel — and worse, the SAME raw string was
written to tag.name on Accept, polluting the DB with `underscored_lowercase`
names that don't match the operator's "Title Case" tag convention.
Add backend/app/services/ml/tag_name.py with a single normalize()
applying nine rules (strip leading junk #/./+/;/~/_/ws, drop trailing
_(disambiguator) blocks iteratively, strip wrapping quotes, underscores
to spaces, space after colon, title-case each word's first char,
preserve hyphens/apostrophes/digits, drop entries with no letters).
Wire into SuggestionService.for_image:
- raw Camie key kept for alias_map lookup (alias rows are hand-curated
against raw keys; don't disturb)
- display_name = normalize(raw); None means drop the candidate
- existing-tag lookup widened to case-insensitive match against BOTH
raw and normalized forms so legacy underscore-named Tag rows accepted
before this change still surface as "existing" not "+ new"
2026-06-03 13:00:08 -04:00
..
2026-05-14 07:32:17 -04:00
2026-06-02 17:55:25 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 11:33:05 -04:00
2026-06-01 14:17:52 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 11:33:05 -04:00
2026-05-30 00:59:05 -04:00
2026-05-28 11:33:05 -04:00
2026-06-01 00:41:17 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 11:33:05 -04:00
2026-06-02 18:49:24 -04:00
2026-05-28 12:43:08 -04:00
2026-06-01 14:17:52 -04:00
2026-06-01 14:17:52 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 11:33:05 -04:00
2026-05-30 23:15:07 -04:00
2026-06-01 18:23:28 -04:00
2026-05-28 11:33:05 -04:00
2026-05-30 11:25:36 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 12:43:08 -04:00
2026-05-28 11:33:05 -04:00
2026-05-28 12:43:08 -04:00
2026-06-01 21:57:29 -04:00
2026-05-19 11:11:37 -04:00
2026-05-21 22:14:15 -04:00
2026-05-20 12:54:47 -04:00
2026-06-01 14:17:52 -04:00
2026-05-19 11:11:07 -04:00
2026-05-26 01:18:38 -04:00
2026-05-26 01:18:07 -04:00
2026-05-19 14:59:04 -04:00
2026-06-01 22:09:02 -04:00
2026-05-24 23:37:06 -04:00
2026-05-16 18:02:01 -04:00
2026-05-14 07:34:47 -04:00
2026-05-21 16:02:36 -04:00
2026-05-26 08:13:53 -04:00
2026-05-25 01:28:54 -04:00
2026-06-02 17:04:27 -04:00
2026-06-02 17:04:27 -04:00
2026-05-25 11:12:55 -04:00
2026-06-02 17:04:27 -04:00
2026-05-20 21:20:30 -04:00
2026-05-28 12:43:08 -04:00
2026-05-15 13:53:42 -04:00
2026-05-29 15:34:20 -04:00
2026-05-20 20:39:17 -04:00
2026-05-28 11:33:05 -04:00
2026-06-01 19:00:50 -04:00
2026-06-01 14:17:52 -04:00
2026-06-01 14:17:52 -04:00
2026-05-28 11:33:05 -04:00
2026-05-18 18:05:45 -04:00
2026-05-19 11:14:49 -04:00
2026-05-19 11:22:17 -04:00
2026-05-18 21:33:55 -04:00
2026-06-02 08:16:13 -04:00
2026-05-25 20:33:44 -04:00
2026-05-25 22:16:26 -04:00
2026-06-01 14:40:28 -04:00
2026-06-01 14:17:52 -04:00
2026-05-25 02:34:36 -04:00
2026-05-29 21:40:52 -04:00
2026-05-26 21:23:12 -04:00
2026-05-15 07:35:22 -04:00
2026-05-15 15:48:29 -04:00
2026-06-01 14:17:52 -04:00
2026-06-01 14:17:52 -04:00
2026-05-19 11:10:53 -04:00
2026-05-20 12:53:34 -04:00
2026-05-20 18:32:52 -04:00
2026-05-20 18:33:14 -04:00
2026-05-20 20:36:19 -04:00
2026-05-15 07:37:13 -04:00
2026-05-15 07:39:33 -04:00
2026-06-01 02:08:10 -04:00
2026-05-15 07:37:53 -04:00
2026-05-15 07:36:17 -04:00
2026-06-03 13:00:08 -04:00
2026-06-03 13:00:08 -04:00
2026-06-01 02:08:10 -04:00
2026-05-14 07:34:29 -04:00
2026-05-14 14:24:25 -04:00
2026-05-20 20:39:50 -04:00
2026-06-01 14:40:28 -04:00
2026-05-17 22:18:07 -04:00
2026-05-20 18:34:02 -04:00
2026-06-01 14:17:52 -04:00
2026-06-01 14:17:52 -04:00
2026-05-30 21:48:51 -04:00
2026-05-25 22:16:26 -04:00
2026-05-19 11:14:49 -04:00
2026-05-30 12:08:43 -04:00
2026-05-16 23:33:12 -04:00
2026-05-17 16:28:20 -04:00
2026-05-15 15:49:25 -04:00
2026-06-01 14:40:28 -04:00
2026-05-27 15:35:25 -04:00
2026-05-14 12:04:05 -04:00
2026-06-01 20:12:55 -04:00
2026-05-28 12:43:08 -04:00
2026-05-15 15:50:41 -04:00
2026-05-16 23:36:04 -04:00
2026-05-26 21:00:12 -04:00
2026-05-15 07:39:33 -04:00
2026-05-14 15:23:07 -04:00
2026-05-24 21:22:42 -04:00
2026-05-25 01:28:54 -04:00
2026-05-24 23:37:06 -04:00
2026-05-26 01:32:50 -04:00
2026-05-15 07:43:39 -04:00
2026-05-27 22:45:11 -04:00
2026-05-21 18:53:35 -04:00
2026-05-14 12:05:19 -04:00
2026-05-21 16:01:59 -04:00
2026-05-19 18:15:59 -04:00