novelai-python 0.1.9__tar.gz → 0.2.1__tar.gz

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 (36) hide show
  1. {novelai_python-0.1.9 → novelai_python-0.2.1}/PKG-INFO +2 -2
  2. {novelai_python-0.1.9 → novelai_python-0.2.1}/README.md +1 -1
  3. {novelai_python-0.1.9 → novelai_python-0.2.1}/pyproject.toml +1 -1
  4. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/utils/random_prompt/__init__.py +97 -34
  5. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/utils/random_prompt/tag.py +23 -4
  6. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/utils/random_prompt/tag_artist.py +20 -2
  7. novelai_python-0.2.1/src/novelai_python/utils/random_prompt/tag_character.py +270 -0
  8. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/utils/random_prompt/tag_nsfw.py +16 -0
  9. {novelai_python-0.1.9 → novelai_python-0.2.1}/NOTICE.MD +0 -0
  10. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/__init__.py +0 -0
  11. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/_exceptions.py +0 -0
  12. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/_response/__init__.py +0 -0
  13. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/_response/ai/__init__.py +0 -0
  14. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/_response/ai/generate_image.py +0 -0
  15. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/_response/user/__init__.py +0 -0
  16. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/_response/user/login.py +0 -0
  17. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/_response/user/subscription.py +0 -0
  18. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/credential/JwtToken.py +0 -0
  19. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/credential/UserAuth.py +0 -0
  20. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/credential/__init__.py +0 -0
  21. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/credential/_base.py +0 -0
  22. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/sdk/__init__.py +0 -0
  23. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/sdk/ai/LICENSE +0 -0
  24. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/sdk/ai/__init__.py +0 -0
  25. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/sdk/ai/generate_image.py +0 -0
  26. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/sdk/user/__init__.py +0 -0
  27. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/sdk/user/login.py +0 -0
  28. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/sdk/user/subscription.py +0 -0
  29. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/server.py +0 -0
  30. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/utils/__init__.py +0 -0
  31. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/utils/encode.py +0 -0
  32. {novelai_python-0.1.9 → novelai_python-0.2.1}/src/novelai_python/utils/hash.py +0 -0
  33. {novelai_python-0.1.9 → novelai_python-0.2.1}/tests/__init__.py +0 -0
  34. {novelai_python-0.1.9 → novelai_python-0.2.1}/tests/test_random_prompt.py +0 -0
  35. {novelai_python-0.1.9 → novelai_python-0.2.1}/tests/test_server.py +0 -0
  36. {novelai_python-0.1.9 → novelai_python-0.2.1}/tests/test_server_run.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: novelai-python
3
- Version: 0.1.9
3
+ Version: 0.2.1
4
4
  Summary: Novelai Python Binding With Pydantic
5
5
  Author-Email: sudoskys <coldlando@hotmail.com>
6
6
  License: Apache 2.0
@@ -89,7 +89,7 @@ loop.run_until_complete(main())
89
89
  ```python
90
90
  from novelai_python.utils.random_prompt import RandomPromptGenerator
91
91
 
92
- s = RandomPromptGenerator(nsfw_enabled=False).generate()
92
+ s = RandomPromptGenerator(nsfw_enabled=False).random_prompt()
93
93
  print(s)
94
94
  ```
95
95
 
@@ -64,7 +64,7 @@ loop.run_until_complete(main())
64
64
  ```python
65
65
  from novelai_python.utils.random_prompt import RandomPromptGenerator
66
66
 
67
- s = RandomPromptGenerator(nsfw_enabled=False).generate()
67
+ s = RandomPromptGenerator(nsfw_enabled=False).random_prompt()
68
68
  print(s)
69
69
  ```
70
70
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "novelai-python"
3
- version = "0.1.9"
3
+ version = "0.2.1"
4
4
  description = "Novelai Python Binding With Pydantic"
5
5
  authors = [
6
6
  { name = "sudoskys", email = "coldlando@hotmail.com" },
@@ -14,6 +14,7 @@ from .tag import (
14
14
  action, expression, footwears, bottoms, color as colors
15
15
  )
16
16
  from .tag_artist import rankArtist
17
+ from .tag_character import rankMoods, rankCharacter, rankIdentity
17
18
  from .tag_nsfw import nsfw
18
19
 
19
20
 
@@ -29,22 +30,32 @@ class RandomPromptGenerator(object):
29
30
  :param existing_tags: a list of existing tags
30
31
  :return: a tag
31
32
  """
32
- valid_tags = [tag for tag in tags if
33
- len(tag) < 3 or not tag[2] or any(sub_tag in existing_tags for sub_tag in tag[2])]
33
+ valid_tags = [tag
34
+ for tag in tags
35
+ if len(tag) < 3 or not tag[2] or any(sub_tag in existing_tags for sub_tag in tag[2])]
34
36
  total_weight = sum(tagr[1] for tagr in valid_tags if len(tagr) > 1)
35
37
  if total_weight == 0:
36
- return ''
38
+ if isinstance(tags, list):
39
+ rd = random.choice(tags)
40
+ elif isinstance(tags, str):
41
+ rd = tags
42
+ else:
43
+ raise ValueError('get_weighted_choice: should not reach here')
44
+ return rd
37
45
  random_number = random.randint(1, total_weight)
38
46
  cumulative_weight = 0
39
47
  for tag in valid_tags:
40
48
  cumulative_weight += tag[1]
41
49
  if random_number <= cumulative_weight:
50
+ if isinstance(tag, str):
51
+ raise Exception("tag is string")
42
52
  return tag[0]
43
53
  raise ValueError('get_weighted_choice: should not reach here')
44
54
 
45
- def character_features(self, gender, camera_angle, nsfw_enabled, num_characters):
55
+ def character_features(self, gender, camera_angle, nsfw_enabled, num_characters, enable_skin_color=True):
46
56
  """
47
57
  Add character features to the prompt
58
+ :param enable_skin_color: enable skin
48
59
  :param gender: 'm', 'f', 'o'
49
60
  :param camera_angle: the camera angle of the prompt
50
61
  :param nsfw_enabled: True or False
@@ -57,26 +68,26 @@ class RandomPromptGenerator(object):
57
68
  features.append(self.get_weighted_choice(animalFeatures, features))
58
69
  unique_features = {'mermaid', 'centaur', 'lamia'}
59
70
  has_unique_feature = any(feature in features for feature in unique_features)
60
- if random.random() < 0.1:
71
+ if random.random() < 0.1 and enable_skin_color:
61
72
  features.append(self.get_weighted_choice(sinkColor, features))
62
73
  if random.random() < 0.8:
63
74
  features.append(self.get_weighted_choice(eyeColors, features))
64
75
  if random.random() < 0.1:
65
76
  features.append(self.get_weighted_choice(eyeCharacteristics, features))
66
- if random.random() < 0.7:
77
+ if random.random() < 0.6:
67
78
  features.append(self.get_weighted_choice(eyesExpression, features))
68
- if random.random() < 0.8:
79
+ if random.random() < 0.2:
69
80
  features.append(self.get_weighted_choice(hairLength, features))
70
- if random.random() < 0.5:
81
+ if random.random() < 0.2:
71
82
  features.append(self.get_weighted_choice(backHairStyle, features))
72
- if random.random() < 0.5:
83
+ if random.random() < 0.1:
73
84
  features.append(self.get_weighted_choice(hairColors, features))
74
85
  if random.random() < 0.1:
75
86
  features.append(self.get_weighted_choice(hairColorExtra, features))
76
87
  features.append(self.get_weighted_choice(hairColors, features))
77
- if random.random() < 0.1:
88
+ if random.random() < 0.12:
78
89
  features.append(self.get_weighted_choice(hairFeatures, features))
79
- if gender.startswith('f') and random.random() < 0.6:
90
+ if gender.startswith('f') and random.random() < 0.8:
80
91
  features.append(self.get_weighted_choice(breastsSize, features))
81
92
  num_body_features = 0
82
93
  if num_characters == 1:
@@ -87,9 +98,9 @@ class RandomPromptGenerator(object):
87
98
  num_body_features = self.get_weighted_choice([[0, 30], [1, 30]], features)
88
99
  for _ in range(num_body_features):
89
100
  features.append(self.get_weighted_choice(bodyFeatures, features))
90
- if random.random() < 0.5:
101
+ if random.random() < 0.3:
91
102
  features.append(self.get_weighted_choice(headWears, features))
92
- if random.random() < 0.4:
103
+ if random.random() < 0.5:
93
104
  features.append(self.get_weighted_choice(hatOrnaments, features))
94
105
  clothing_type = self.get_weighted_choice(['uniform', 'swimsuit', 'bodysuit', 'normal clothes'], features)
95
106
  if nsfw_enabled and random.random() < 0.9:
@@ -101,7 +112,7 @@ class RandomPromptGenerator(object):
101
112
  features.append(underwear_choice)
102
113
  if random.random() < 0.5:
103
114
  clothing_type = None
104
- if random.random() < 0.4:
115
+ if random.random() < 0.5:
105
116
  features.append(self.get_weighted_choice(nsfw["naked"], features))
106
117
  clothing_type = None
107
118
  if clothing_type == 'uniform':
@@ -130,17 +141,24 @@ class RandomPromptGenerator(object):
130
141
  features.append(f'{color} {footwear}')
131
142
  if random.random() < 0.7:
132
143
  features.append(self.get_weighted_choice(expression, features))
133
- if random.random() < (1 if nsfw_enabled and num_characters == 1 else 0.5):
144
+ if random.random() < (1 if nsfw_enabled and num_characters >= 1 else 0.5):
145
+ # 单角色 + nsfw 为 1
134
146
  possible_actions = action
135
147
  if nsfw_enabled:
148
+ if random.random() < 0.5:
149
+ features.append(self.get_weighted_choice(nsfw["action"], features))
150
+ if random.random() < 0.5:
151
+ features.append(self.get_weighted_choice(nsfw["pussyForeplay"], features))
136
152
  possible_actions += nsfw["action"] + nsfw["analForeplay"] + nsfw["pussyForeplay"]
137
153
  if random.random() < 0.5:
138
154
  possible_actions += nsfw["footForeplay"]
139
155
  features.append(self.get_weighted_choice(possible_actions, features))
156
+ # 睡眠
140
157
  if any('sleeping' in feature for feature in features) \
141
158
  or any('zzz' in feature for feature in features) \
142
159
  or any('closed eyes' in feature for feature in features):
143
160
  features = [feature for feature in features if not any(color[0] == feature for color in eyeColors)]
161
+ # 衣物
144
162
  num_clothing_accessories = 0
145
163
  if num_characters == 1:
146
164
  num_clothing_accessories = self.get_weighted_choice([[0, 10], [1, 30], [2, 15], [3, 5]], features)
@@ -155,11 +173,39 @@ class RandomPromptGenerator(object):
155
173
  features = [feature for feature in features if 'legwear' not in feature]
156
174
  return features
157
175
 
158
- def generate(self):
159
- return self.random_prompt()
176
+ def generate(self,
177
+ *,
178
+ enable_moods: bool = True,
179
+ enable_character: bool = False,
180
+ enable_identity: bool = True,
181
+ ):
182
+ """
183
+ Generate a random prompt
184
+ :param enable_moods: enable moods
185
+ :param enable_character: enable character
186
+ :param enable_identity: enable identity
187
+ :return:
188
+ """
189
+ return self.random_prompt(
190
+ enable_moods=enable_moods,
191
+ enable_character=enable_character,
192
+ enable_identity=enable_identity
193
+ )
160
194
 
161
- def random_prompt(self):
195
+ def random_prompt(self, *,
196
+ man_w: int = 30,
197
+ woman_w: int = 60,
198
+ other_w: int = 10,
199
+ enable_moods: bool = True,
200
+ enable_character: bool = True,
201
+ enable_identity: bool = False,
202
+ must_appear=None,
203
+ ):
204
+ if must_appear is None:
205
+ must_appear = []
162
206
  tags = []
207
+ # 必须出现的标签
208
+ tags.extend(must_appear)
163
209
  if self.nsfw_enabled:
164
210
  tags.append('nsfw')
165
211
  if random.random() < 0.1:
@@ -167,7 +213,7 @@ class RandomPromptGenerator(object):
167
213
  tags.append('lewd')
168
214
  irs = self.get_weighted_choice([[1, 70], [2, 20], [3, 7], [0, 5]], tags)
169
215
  if self.nsfw_enabled:
170
- irs = self.get_weighted_choice([[1, 35], [2, 20], [3, 7]], tags)
216
+ irs = self.get_weighted_choice([[1, 40], [2, 20], [3, 7]], tags)
171
217
  if irs == 0:
172
218
  tags.append('no humans')
173
219
  if random.random() < 0.3:
@@ -184,15 +230,17 @@ class RandomPromptGenerator(object):
184
230
  return ', '.join(tags)
185
231
  if random.random() < 0.3:
186
232
  tags.append(self.get_weighted_choice(artStyle, tags))
187
- if random.random() < 0.55:
233
+ if random.random() < 0.6:
188
234
  tags.append("{" + self.get_weighted_choice(rankArtist, tags) + "}")
189
- if random.random() < 0.3:
190
- tags.append(self.get_weighted_choice(rankArtist, tags))
235
+ if random.random() < 0.5:
236
+ tags.append("[" + self.get_weighted_choice(rankArtist, tags) + "]")
237
+ if random.random() < 0.4:
238
+ tags.append("{{" + self.get_weighted_choice(rankArtist, tags) + "}}")
191
239
  c_count = 0
192
240
  d_count = 0
193
241
  u_count = 0
194
242
  for _ in range(irs):
195
- random_gender = self.get_weighted_choice([['m', 30], ['f', 50], ['o', 10]], tags)
243
+ random_gender = self.get_weighted_choice([['m', man_w], ['f', woman_w], ['o', other_w]], tags)
196
244
  if random_gender == 'm':
197
245
  d_count += 1
198
246
  elif random_gender == 'f':
@@ -218,33 +266,48 @@ class RandomPromptGenerator(object):
218
266
  elif u_count == 3:
219
267
  tags.insert(0, '3others')
220
268
  if self.nsfw_enabled:
221
- g_count = c_count + u_count if c_count >= 2 and d_count == 0 and random.random() < 0.7 else 0
269
+ g_count = c_count + u_count
270
+ if (c_count >= 2 and d_count == 0) and random.random() < 0.7:
271
+ # 2girls
272
+ tags.append(self.get_weighted_choice(nsfw["yu"], tags))
222
273
  if g_count == 0 and d_count >= 2 and c_count == 0:
223
274
  tags.append(nsfw["ya"])
224
275
  if d_count > 0:
225
- if random.random() < 0.4:
226
- tags.append(self.get_weighted_choice(nsfw["penis"], tags))
276
+ if c_count > 0:
277
+ if random.random() < 0.3:
278
+ tags.append(self.get_weighted_choice(nsfw["penis"], tags))
279
+ else:
280
+ if random.random() < 0.3:
281
+ tags.append(self.get_weighted_choice(nsfw["penis"], tags))
227
282
  if d_count > 0 and g_count > 0:
228
- if random.random() < 0.5:
283
+ if random.random() < 0.7:
229
284
  tags.append(self.get_weighted_choice(nsfw["analSex"], tags))
230
285
  if g_count > 0:
231
- if random.random() < 0.6:
232
- features = self.character_features(nsfw['fu'], None, True, irs)
233
- else:
234
- features = self.character_features(nsfw['yu'], None, True, irs)
286
+ features = []
235
287
  if random.random() < 0.2:
288
+ features = self.character_features(nsfw['fu'], None, True, irs)
289
+ if random.random() < 0.6:
236
290
  tags.append(self.get_weighted_choice(nsfw["sex"], tags))
237
- if random.random() < 0.2:
291
+ if random.random() < 0.6:
238
292
  tags.append(self.get_weighted_choice(nsfw["pussy"], tags))
239
293
  if random.random() < 0.6:
240
294
  tags.append(self.get_weighted_choice(nsfw["sexMod"], tags))
241
295
  if random.random() < 0.6:
242
296
  tags.append(self.get_weighted_choice(nsfw["sexActionMode"], tags))
243
- if random.random() < 0.1:
297
+ if random.random() < 0.2:
244
298
  tags.append(self.get_weighted_choice(nsfw["bdsm"], tags))
245
- if random.random() < 0.1:
299
+ if random.random() < 0.3:
246
300
  tags.append(self.get_weighted_choice(nsfw["sexAccessories"], tags))
247
301
  tags.extend(features)
302
+ if random.random() < 0.65 and enable_moods:
303
+ # 心情
304
+ tags.append("[" + self.get_weighted_choice(rankMoods, tags) + "]")
305
+ if random.random() < 0.5 and enable_identity:
306
+ # 身份
307
+ tags.append("[" + self.get_weighted_choice(rankIdentity, tags) + "]")
308
+ if random.random() < 0.2 and enable_character:
309
+ # 角色
310
+ tags.append("[" + self.get_weighted_choice(rankCharacter, tags) + "]")
248
311
  if random.random() < 0.1:
249
312
  bg_color = self.get_weighted_choice(backgroundColor, tags)
250
313
  tags.append(bg_color)
@@ -1334,7 +1334,7 @@ headWears = [
1334
1334
  ],
1335
1335
  [
1336
1336
  'jester cap',
1337
- 5
1337
+ 1
1338
1338
  ],
1339
1339
  [
1340
1340
  'frilled hat',
@@ -7425,15 +7425,16 @@ hairColors = [
7425
7425
  ]
7426
7426
 
7427
7427
  hairColorExtra = [
7428
- ['multicolored hair',
7429
- 5],
7428
+ [
7429
+ 'multicolored hair',
7430
+ 5],
7430
7431
  [
7431
7432
  'colored inner hair',
7432
7433
  5
7433
7434
  ],
7434
7435
  [
7435
7436
  'gradient hair',
7436
- 5
7437
+ 10
7437
7438
  ],
7438
7439
  [
7439
7440
  'rainbow hair',
@@ -7521,3 +7522,21 @@ color = [
7521
7522
  1
7522
7523
  ]
7523
7524
  ]
7525
+
7526
+ if __name__ == "__main__":
7527
+ var = vars().copy()
7528
+
7529
+ # 获取tags列表
7530
+ tags = []
7531
+ for key, value in var.items():
7532
+ if not key.startswith('_') and key != 'var':
7533
+ tags.extend(value)
7534
+ print(tags)
7535
+
7536
+ # 展开二级列表
7537
+ tags = [tag[0] for tag in tags]
7538
+ print(tags)
7539
+ import json
7540
+
7541
+ with open('../../../../playground/cos/tags.json', 'w') as f:
7542
+ json.dump(tags, f)
@@ -376,5 +376,23 @@ rankArtist = [
376
376
  [
377
377
  "mamimi_(mamamimi)",
378
378
  100
379
- ]
380
- ]
379
+ ],
380
+ ]
381
+
382
+ if __name__ == "__main__":
383
+ var = vars().copy()
384
+
385
+ # 获取tags列表
386
+ tags = []
387
+ for key, value in var.items():
388
+ if not key.startswith('_') and key != 'var':
389
+ tags.extend(value)
390
+ print(tags)
391
+
392
+ # 展开二级列表
393
+ tags = [tag[0] for tag in tags]
394
+ print(tags)
395
+ import json
396
+
397
+ with open('../../../../playground/cos/tag_artist.json', 'w') as f:
398
+ json.dump(tags, f)
@@ -0,0 +1,270 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @Time : 2024/2/7 下午5:56
3
+ # @Author : sudoskys
4
+ # @File : tag_character.py
5
+ # @Software: PyCharm
6
+
7
+ rankCharacter = [
8
+ ['futanari-sama_(mdf_an)', 10],
9
+ ['kouhai-chan_(mignon)', 10],
10
+ ['kaleina_(ricegnat)', 10],
11
+ ['sarah-san_(mignon)', 10],
12
+ ['shiro-chan_(mignon)', 10],
13
+ ['ichigo-chan_(mignon)', 10],
14
+ ['hiyake-chan', 10],
15
+ ['pandora_acherona_(nat_the_lich)', 10],
16
+ ['nil_sunna', 10],
17
+ ['brown_twintails_girl_(mdf_an)', 10],
18
+ ['blonde_ponytail_girl_(mdf_an)', 10],
19
+ ['tsona_(nyantcha)', 10],
20
+ ['meruccubus_(merunyaa)', 10], ['saki_(the_atko)', 10], ['ophelia_(bigrbear)', 10],
21
+ ['chariot_(black_rock_shooter)', 10], ['hoshizuki_suzu', 10], ['hoshizuki_kaede', 10],
22
+ ['chloe_(sciamano240)', 10], ['asutora-chan', 10], ['sunomiya_sana', 10],
23
+ ['aibo_(gorgeous_mushroom)', 10], ['hachiouji_naoto', 10], ['gojou_wakana', 10],
24
+ ['tokisaki_asaba', 10], ['guild_girl_(goblin_slayer!)', 10], ['chobi_(akchu)', 10],
25
+ ['kurohanya_(niliu_chahui)', 10], ['yoshi_(nagatoro)', 10], ['oosuki_mamako', 10],
26
+ ['riley_fairfeather', 10], ['olga_discordia', 10], ['lillia_greyrat', 10], ['thai_girl_(okpriko)', 10],
27
+ ['uzaki_tsuki', 10], ['inui_sajuna', 10], ['okuzumi_yuiko', 10], ['tokisaki_mio', 10],
28
+ ['shione_(niliu_chahui)', 10], ['sapphira_nyx', 10], ['cerestia_of_life', 10],
29
+ ['celestine_lucullus', 10], ['angelise_reiter', 10], ['south_dakota_(solo_concert)_(azur_lane)', 10],
30
+ ['anubis_(houtengeki)', 10], ['nanami_mizuki', 10],
31
+ ['regensburg_(dark_dragon_brilliant_beach)_(azur_lane)', 10], ['ursula_(takunomi)', 10],
32
+ ['blonde_girl_(okpriko)', 10], ['paldea_mother', 10], ['gamou_maki', 10], ['aegis_(takunomi)', 10],
33
+ ['uketsuke_succubus_(konosuba)', 10], ['ursula_(23)', 10],
34
+ ['aegir_(golden_dragon_among_auspicious_clouds)_(azur_lane)', 10], ['tiona_hyryute', 10],
35
+ ['priana', 10], ['shinano_(moonlit_chrome)_(azur_lane)', 10], ['volume_(nikke)', 10],
36
+ ['tione_hyryute', 10], ['hinano_(sky-freedom)', 10], ['noumu_(boku_no_hero_academia)', 10],
37
+ ['st._louis_(luxurious_wheels)_(azur_lane)', 10], ['iwami_sayaka', 10],
38
+ ['hilichurl_(genshin_impact)', 10], ['kali_belladonna', 10], ['nagatoro_hayase', 10],
39
+ ['yui_(sky-freedom)', 10], ['new_jersey_(midsummer_leisure)_(azur_lane)', 10],
40
+ ['yorktown_ii_(bright-sky_mermaid)_(azur_lane)', 10],
41
+ ['new_jersey_(snow-white_ceremony)_(azur_lane)', 10], ['nonaka_kurumi', 10],
42
+ ['carmilla_(swimsuit_rider)_(third_ascension)_(fate)', 10], ['mal_(malberrybush)', 10],
43
+ ['rakugaki-chan', 10], ['azuma_(soft_voice_of_spring)_(azur_lane)', 10], ['reiko_(tofuubear)', 10],
44
+ ['sekhmet_of_death', 10], ['ty_lee', 10], ["iris_(en'en_no_shouboutai)", 10],
45
+ ['bremerton_(relaxation_consultation)_(azur_lane)', 10],
46
+ ['owari_(shimmering_forsythia)_(azur_lane)', 10],
47
+ ["drake_(the_golden_hind's_respite)_(azur_lane)", 10], ['komi_shuuko', 10],
48
+ ["yuigahama_yui's_mother", 10], ['amasawa_chigusa', 10], ['alex_(aestheticc-meme)', 10],
49
+ ['uzaki_yanagi', 10], ['nakabeni_yua', 10], ['strength_(black_rock_shooter)', 10],
50
+ ['unzen_(sojourn_through_clear_seas)_(azur_lane)', 10], ['bastet_(houtengeki)', 10],
51
+ ['yorra_villeneuve', 10], ['aikawa_ren', 10], ['io_(code_vein)', 10],
52
+ ['shinano_(dreamy_white_sands)_(azur_lane)', 10], ['elder_cousin_(igarashi_kyouhei)', 10],
53
+ ['tokage_setsuna', 10], ['chie_(ishikei)', 10], ['brown_haired_glasses_elf_(houtengeki)', 10],
54
+ ['elinalise_dragonroad', 10], ['sword_maiden', 10], ['regensburg_(azur_lane)', 10],
55
+ ['shinjin_succubus_(konosuba)', 10], ['marikawa_shizuka', 10], ['long-haired_girl_(motto_notto)', 10],
56
+ ['luna_(konosuba)', 10], ['hongryeon_(last_origin)', 10], ['micchan_(ohisashiburi)', 10],
57
+ ['sovetskaya_belorussiya_(relaxation_stratagem)_(azur_lane)', 10], ['musashi_(azur_lane)', 10],
58
+ ['tsubasa_(kureha)', 10], ['carol_olston', 10], ['hyuuga_hanabi', 10], ['sela_(23)', 10],
59
+ ['maki_oze', 10], ['sunao_(wokada)', 10], ['harukawa_syuria_(jack_dempa)', 10],
60
+ ['owari_(azur_lane)', 10], ['leonardo_da_vinci_(active_sailor)_(fate)', 10],
61
+ ['miyamae_shiho_(jack_dempa)', 10], ['tsuyuhara_miu', 10], ['nina_(wokada)', 10],
62
+ ['ariduka_formica', 10], ['implacable_(shepherd_of_the_"lost")_(azur_lane)', 10], ['rocoroco', 10],
63
+ ['ryuukyuu', 10], ['fia_the_deathbed_companion', 10], ['toujou_basara', 10], ['sera_(judgemint)', 10],
64
+ ['female_commander_(azur_lane)', 10], ['inui_shinju', 10], ['mass_production_eva', 10],
65
+ ['aloe_(ishuzoku_reviewers)', 10], ["aegir_(iron_blood's_dragon_maid)_(azur_lane)", 10], ['hinoa', 10],
66
+ ['hasegawa_chisato', 10], ['bakugou_mitsuki', 10], ['rapi_(nikke)', 10], ['tamaki_kotatsu', 10],
67
+ ['sakyumama_(kedama_milk)', 10], ['tomboy_childhood_friend_(cccpo)', 10],
68
+ ['alicia_renato_(yashiro_sousaku)', 10], ['moegi_homi', 10], ['south_dakota_(azur_lane)', 10],
69
+ ['sasaki_kanna_(kaedeko)', 10], ['vermeil_(kinsou_no_vermeil)', 10], ['goat-chan_(enarane)', 10],
70
+ ['saruei_(vtuber)', 10], ['carmilla_(swimsuit_rider)_(fate)', 10]
71
+ ]
72
+
73
+ rankIdentity = [
74
+ ['vtuber', 20], ['accountant', 20], ['worker', 10], ['manager', 10], ['traffic_controller', 10],
75
+ ['airline_cabin_crew', 10],
76
+ ['art_therapist', 10],
77
+ ['arts_administrator', 10], ['auditor', 10], ['automotive_engineer', 10], ['barrister', 10],
78
+ ['band member', 10], ['maid', 15], ['teacher', 10],
79
+ ['student', 20], ['child_psychotherapist', 10],
80
+ ["nurse", 20], ['chiropractor', 10],
81
+ ['lawyer', 10], ['crystallographer', 10], ['curator', 10],
82
+ ['officer', 10], ['dancer', 10],
83
+ ['doctor_(general_practitioner,_gp)', 10], ['doctor_(hospital)', 10], ['dramatherapist', 10],
84
+ ['army', 15], ['firefighter', 10], ['chef', 15],
85
+ ['actress', 10], ['baker', 10], ['bellhop', 10],
86
+ ['blacksmith', 10], ['boxer', 10], ['butcher', 10],
87
+ ['carpenter', 10], ['cartoonist', 10], ['cashier', 10],
88
+ ['chemist', 10], ['clerk', 10], ['detective', 10],
89
+ ['engineer', 10], ['fisherman', 10], ['florist', 10],
90
+ ['flyer', 10], ['gardener', 10], ['guard', 10],
91
+ ['guide', 10], ['hiredresseer', 10], ['housekeeper', 10],
92
+ ['housewife', 10], ['janitor', 10], ['journalist', 10], ['hydrologist', 10],
93
+ ['illustrator', 10], ['masseuse', 10], ['model', 10],
94
+
95
+ ['monk', 10], ['movie star', 10], ['musician', 10],
96
+ ['nun', 10], ['insurance_broker', 10],
97
+
98
+ ['parachutist', 10], ['personnel', 10], ['photographer', 10],
99
+ ['interpreter', 10], ['postman', 10], ['processfor', 10],
100
+ ['tailor', 10], ['technician', 10], ['waiter', 20],
101
+ ['waitress', 50], ['journalist', 10], ['fisherman', 10],
102
+ ['vtuber', 90], ['landscape_architect', 10], ['learning_disability_nurse', 10],
103
+ ['midwife', 10], ['photographer', 10], ['police_officer', 10],
104
+ ['writer', 10], ['youth_worker', 10]
105
+ ]
106
+
107
+ rankMoods = [
108
+ ['abandoned', 10], ['absent_minded', 10], ['abused', 10], ['accepted', 10], ['accomplished', 10],
109
+ ['accusatory', 10], ['accused', 10], ['admired', 10], ['adored', 10], ['adrift', 10], ['affectionate', 10],
110
+ ['afraid', 10], ['aggravated', 10], ['aggressive', 10], ['agitated', 10], ['alarmed', 10], ['alert', 10],
111
+ ['alienated', 10], ['alive', 10], ['alluring', 10], ['alone', 10], ['aloof', 10], ['amazed', 10],
112
+ ['ambushed', 10], ['amused', 10], ['angry', 10], ['annoyed', 10], ['antagonistic', 10], ['anxious', 10],
113
+ ['apathetic', 10], ['apologetic', 10], ['appalled', 10], ['appreciated', 10], ['appreciative', 10],
114
+ ['apprehensive', 10], ['aroused', 10], ['ashamed', 10], ['astonished', 10], ['attacked', 10],
115
+ ['attractive', 10], ['awake', 10], ['aware', 10], ['awe', 10], ['awed', 10], ['awestruck', 10],
116
+ ['awkward', 10], ['bad', 10], ['baffled', 10], ['barren', 10], ['bashful', 10], ['beaten', 10],
117
+ ['belittled', 10], ['benevolent', 10], ['berated', 10], ['betrayed', 10], ['bewildered', 10],
118
+ ['bitchy', 10],
119
+ ['bitter', 10], ['bittersweet', 10], ['blah', 10], ['blamed', 10], ['blank', 10], ['blissful', 10],
120
+ ['blue', 10], ['bold', 10], ['bored', 10], ['bothered', 10], ['bouncy', 10], ['brave', 10], ['broken', 10],
121
+ ['brooding', 10], ['bummed', 10], ['burdened', 10], ['burned-out', 10], ['callous', 10], ['calm', 10],
122
+ ['capable', 10], ['carefree', 10], ['careless', 10], ['caring', 10], ['caustic', 10], ['cautious', 10],
123
+ ['censored', 10], ['centered', 10], ['certain', 10], ['challenged', 10], ['charmed', 10], ['cheated', 10],
124
+ ['cheerful', 10], ['cherished', 10], ['childish', 10], ['chipper', 10], ['choleric', 10], ['clean', 10],
125
+ ['clear', 10], ['clever', 10], ['close', 10], ['closed', 10], ['clueless', 10], ['clumsy', 10],
126
+ ['cold', 10],
127
+ ['comfortable', 10], ['committed', 10], ['compassionate', 10], ['competent', 10], ['competitive', 10],
128
+ ['complacent', 10], ['complete', 10], ['concerned', 10], ['condemned', 10], ['condescension', 10],
129
+ ['confident', 10], ['confining', 10], ['confused', 10], ['considerate', 10], ['contemplative', 10],
130
+ ['contempt', 10], ['contemptuous', 10], ['content', 10], ['controlled', 10], ['conventional', 10],
131
+ ['convicted', 10], ['cornered', 10], ['courageous', 10], ['cowardly', 10], ['cranky', 10], ['crappy', 10],
132
+ ['crazy', 10], ['critical', 10], ['cross', 10], ['crushed', 10], ['curious', 10], ['cynical', 10],
133
+ ['daring', 10], ['dark', 10], ['dashed', 10], ['dazed', 10], ['dead', 10], ['deceived', 10],
134
+ ['dedicated', 10],
135
+ ['defeated', 10], ['defenseless', 10], ['defensive', 10], ['defiant', 10], ['degraded', 10],
136
+ ['dejected', 10],
137
+ ['delicate', 10], ['delighted', 10], ['demoralized', 10], ['dependent', 10], ['depressed', 10],
138
+ ['deprived', 10], ['derisive', 10], ['deserted', 10], ['desired', 10], ['desolate', 10], ['despair', 10],
139
+ ['desperate', 10], ['destroyed', 10], ['detached', 10], ['determined', 10], ['devastated', 10],
140
+ ['devious', 10], ['devoted', 10], ['didactic', 10], ['different', 10], ['difficult', 10],
141
+ ['dignified', 10],
142
+ ['dirty', 10], ['disappointed', 10], ['disbelieving', 10], ['discarded', 10], ['disconnected', 10],
143
+ ['discontent', 10], ['discontented', 10], ['discouraged', 10], ['disdainful', 10], ['disgraced', 10],
144
+ ['disgusted', 10], ['disheartened', 10], ['dishonest', 10], ['disillusioned', 10], ['dismal', 10],
145
+ ['dismayed', 10], ['disobedient', 10], ['disorganized', 10], ['disposable', 10], ['distant', 10],
146
+ ['distracted', 10], ['distressed', 10], ['disturbed', 10], ['ditzy', 10], ['dorky', 10], ['doubtful', 10],
147
+ ['down', 10], ['drained', 10], ['dreamy', 10], ['dreary', 10], ['dropped', 10], ['drunk', 10],
148
+ ['dull', 10],
149
+ ['dumb', 10], ['eager', 10], ['earnest', 10], ['ecstatic', 10], ['edgy', 10], ['effective', 10],
150
+ ['elated', 10], ['embarassed', 10], ['embarrassed', 10], ['empathetic', 10], ['empowered', 10],
151
+ ['empty', 10],
152
+ ['enchanted', 10], ['encouraged', 10], ['energetic', 10], ['energized', 10], ['enlightened', 10],
153
+ ['enraged', 10], ['enriched', 10], ['entertained', 10], ['enthralled', 10], ['enthusiastic', 10],
154
+ ['envious', 10], ['erudite', 10], ['evasive', 10], ['evil', 10], ['exasperated', 10], ['excited', 10],
155
+ ['excluded', 10], ['exhausted', 10], ['exhilarated', 10], ['expectant', 10], ['exploited', 10],
156
+ ['exposed', 10], ['exuberant', 10], ['faithful', 10], ['fake', 10], ['fanciful', 10], ['fantastic', 10],
157
+ ['fatalistic', 10], ['fatigued', 10], ['fearful', 10], ['fearless', 10], ['feisty', 10], ['fine', 10],
158
+ ['flirty', 10], ['flustered', 10], ['foolish', 10], ['foreboding', 10], ['forgiven', 10],
159
+ ['forgiving', 10],
160
+ ['forgotten', 10], ['forthright', 10], ['fortunate', 10], ['framed', 10], ['frantic', 10], ['free', 10],
161
+ ['friendly', 10], ['frightened', 10], ['frisky', 10], ['frustrated', 10], ['fulfilled', 10], ['full', 10],
162
+ ['funny', 10], ['furious', 10], ['futile', 10], ['geeky', 10], ['generous', 10], ['gentle', 10],
163
+ ['giddy', 10],
164
+ ['giggly', 10], ['giving', 10], ['glad', 10], ['gloomy', 10], ['glorious', 10], ['good', 10],
165
+ ['grateful', 10],
166
+ ['great', 10], ['grieving', 10], ['groggy', 10], ['grouchy', 10], ['grumpy', 10], ['guarded', 10],
167
+ ['guilty', 10], ['gullible', 10], ['handicapped', 10], ['happy', 10], ['harmonious', 10], ['hateful', 10],
168
+ ['haughty', 10], ['haunted', 10], ['haunting', 10], ['healthy', 10], ['heard', 10], ['heartbroken', 10],
169
+ ['heavy-hearted', 10], ['helpful', 10], ['helpless', 10], ['hesitant', 10], ['high', 10], ['honored', 10],
170
+ ['hopeful', 10], ['hopeless', 10], ['horrible', 10], ['horrified', 10], ['hospitable', 10],
171
+ ['hostile', 10],
172
+ ['hot', 10], ['humble', 10], ['humiliated', 10], ['hungry', 10], ['hurt', 10], ['hyper', 10],
173
+ ['hysterical', 10], ['idealistic', 10], ['idiotic', 10], ['idyllic', 10], ['ignorant', 10],
174
+ ['ignored', 10],
175
+ ['imaginative', 10], ['immune', 10], ['impatient', 10], ['impelled', 10], ['imperfect', 10],
176
+ ['impertinent', 10], ['important', 10], ['impressed', 10], ['impulsive', 10], ['inadequate', 10],
177
+ ['inattentive', 10], ['incensed', 10], ['inclusive', 10], ['incompetent', 10], ['incomplete', 10],
178
+ ['incredulous', 10], ['indebted', 10], ['indecisive', 10], ['independent', 10], ['indescribable', 10],
179
+ ['indifferent', 10], ['indignant', 10], ['industrious', 10], ['inept', 10], ['inferior', 10],
180
+ ['inflated', 10],
181
+ ['informed', 10], ['infuriated', 10], ['inhibited', 10], ['innocent', 10], ['innovative', 10],
182
+ ['inquisitive', 10], ['insane', 10], ['insecure', 10], ['insensitive', 10], ['insidious', 10],
183
+ ['insignificant', 10], ['insulted', 10], ['intense', 10], ['interested', 10], ['interrogated', 10],
184
+ ['interrupted', 10], ['intimate', 10], ['intimidated', 10], ['intrigued', 10], ['invigorated', 10],
185
+ ['invisible', 10], ['involved', 10], ['irate', 10], ['irked', 10], ['irrational', 10],
186
+ ['irresponsible', 10],
187
+ ['irritated', 10], ['isolated', 10], ['jaded', 10], ['jealous', 10], ['jinxed', 10], ['jolly', 10],
188
+ ['jovial', 10], ['joyful', 10], ['joyous', 10], ['jubilant', 10], ['judged', 10], ['judgmental', 10],
189
+ ['jumpy', 10], ['just', 10], ['justified', 10], ['kidded', 10], ['kind', 10], ['knowledgeable', 10],
190
+ ['late', 10], ['lazy', 10], ['leery', 10], ['left', 10], ['let', 10], ['lethargic', 10], ['liable', 10],
191
+ ['liberated', 10], ['liberating', 10], ['lifeless', 10], ['light-hearted', 10], ['liked', 10],
192
+ ['listened', 10], ['listless', 10], ['logical', 10], ['lonely', 10], ['loose', 10], ['lost', 10],
193
+ ['lousy', 10], ['lovable', 10], ['loved', 10], ['loving', 10], ['lucky', 10], ['lyrical', 10], ['mad', 10],
194
+ ['malicious', 10], ['manipulated', 10], ['matter', 10], ['fact', 10], ['mean', 10], ['meditative', 10],
195
+ ['melancholic', 10], ['melancholy', 10], ['mellow', 10], ['merciless', 10], ['merry', 10],
196
+ ['mischievous', 10],
197
+ ['miserable', 10], ['misinterpreted', 10], ['mistreated', 10], ['misunderstood', 10], ['mixed', 10],
198
+ ['mocked', 10], ['mocking', 10], ['modest', 10], ['molested', 10], ['moody', 10], ['morose', 10],
199
+ ['motivated', 10], ['mournful', 10], ['moved', 10], ['mystified', 10], ['naive', 10], ['nasty', 10],
200
+ ['naughty', 10], ['nauseated', 10], ['needed', 10], ['needy', 10], ['negative', 10], ['neglected', 10],
201
+ ['nerdy', 10], ['nervous', 10], ['neurotic', 10], ['nightmarish', 10], ['nonchalant', 10],
202
+ ['nostalgic', 10],
203
+ ['not', 10], ['specified', 10], ['noticed', 10], ['numb', 10], ['obeyed', 10], ['objective', 10],
204
+ ['obligated', 10], ['obvious', 10], ['odd', 10], ['offended', 10], ['okay', 10], ['old', 10], ['open', 10],
205
+ ['oppressed', 10], ['optimistic', 10], ['ornery', 10], ['control', 10], ['outraged', 10], ['overcome', 10],
206
+ ['overjoyed', 10], ['overloaded', 10], ['overwhelmed', 10], ['overworked', 10], ['owned', 10],
207
+ ['painful', 10],
208
+ ['pampered', 10], ['panicky', 10], ['paralyzed', 10], ['passionate', 10], ['passive', 10], ['patient', 10],
209
+ ['patronizing', 10], ['peaceful', 10], ['peeved', 10], ['pensive', 10], ['perky', 10], ['perplexed', 10],
210
+ ['persecuted', 10], ['pessimistic', 10], ['pestered', 10], ['petrified', 10], ['petty', 10], ['phony', 10],
211
+ ['pious', 10], ['pissed', 10], ['off', 10], ['playful', 10], ['pleased', 10], ['poor', 10],
212
+ ['positive', 10],
213
+ ['possessive', 10], ['powerful', 10], ['powerless', 10], ['practical', 10], ['predatory', 10],
214
+ ['pressured', 10], ['private', 10], ['productive', 10], ['protected', 10], ['protective', 10],
215
+ ['proud', 10],
216
+ ['provoked', 10], ['prudish', 10], ['punished', 10], ['pushy', 10], ['puzzled', 10], ['questioned', 10],
217
+ ['quiet', 10], ['quixotic', 10], ['quizzical', 10], ['rambunctious', 10], ['realistic', 10],
218
+ ['reassured', 10],
219
+ ['rebellious', 10], ['reborn', 10], ['receptive', 10], ['reckless', 10], ['recognized', 10],
220
+ ['reconciled', 10], ['recumbent', 10], ['reflective', 10], ['refreshed', 10], ['regretful', 10],
221
+ ['rejected', 10], ['rejuvenated', 10], ['relaxed', 10], ['released', 10], ['relieved', 10],
222
+ ['reluctant', 10],
223
+ ['reminiscent', 10], ['remorse', 10], ['renewed', 10], ['replaced', 10], ['replenished', 10],
224
+ ['repressed', 10], ['rescued', 10], ['resentful', 10], ['reserved', 10], ['resistant', 10],
225
+ ['resourceful', 10], ['respected', 10], ['responsible', 10], ['restless', 10], ['restricted', 10],
226
+ ['revengeful', 10], ['reverent', 10], ['revitalized', 10], ['ribald', 10], ['rich', 10], ['ridicule', 10],
227
+ ['ridiculous', 10], ['right', 10], ['rigid', 10], ['robbed', 10], ['romantic', 10], ['rotten', 10],
228
+ ['rushed', 10], ['sabotaged', 10], ['sad', 10], ['safe', 10], ['sarcastic', 10], ['sardonic', 10],
229
+ ['sassy', 10], ['satiated', 10], ['satiric', 10], ['satisfied', 10], ['saved', 10], ['scared', 10],
230
+ ['scolded', 10], ['scorned', 10], ['secure', 10], ['seductive', 10], ['selfish', 10], ['self-assured', 10],
231
+ ['self-centered', 10], ['self-confident', 10], ['self-conscious', 10], ['self-destructive', 10],
232
+ ['self-reliant', 10], ['sensitive', 10], ['sentimental', 10], ['serene', 10], ['serious', 10],
233
+ ['sexy', 10],
234
+ ['shaken', 10], ['shamed', 10], ['sheepish', 10], ['shocked', 10], ['shunned', 10], ['shy', 10],
235
+ ['sick', 10],
236
+ ['silenced', 10], ['silly', 10], ['sincere', 10], ['sinful', 10], ['skeptical', 10], ['skillful', 10],
237
+ ['slandered', 10], ['sleepy', 10], ['sluggish', 10], ['small', 10], ['smart', 10], ['smothered', 10],
238
+ ['solemn', 10], ['somber', 10], ['soothed', 10], ['sorry', 10], ['special', 10], ['spiteful', 10],
239
+ ['splendid', 10], ['spunky', 10], ['squashed', 10], ['stifled', 10], ['stimulated', 10], ['stingy', 10],
240
+ ['strained', 10], ['stressed', 10], ['stretched', 10], ['strong', 10], ['stubborn', 10], ['stumped', 10],
241
+ ['stunned', 10], ['stupid', 10], ['submissive', 10], ['successful', 10], ['suffocated', 10],
242
+ ['suicidal', 10],
243
+ ['sullen', 10], ['sunk', 10], ['super', 10], ['superior', 10], ['supported', 10], ['sure', 10],
244
+ ['surly', 10],
245
+ ['surprised', 10], ['suspenseful', 10], ['suspicious', 10], ['sympathetic', 10], ['tacky', 10],
246
+ ['tactful', 10], ['talented', 10], ['talkative', 10], ['tame', 10], ['tarnished', 10], ['tasteful', 10],
247
+ ['tearful', 10], ['teased', 10], ['tenacious', 10], ['tender', 10], ['tense', 10], ['tepid', 10],
248
+ ['terrible', 10], ['terrific', 10], ['terrified', 10], ['terrifying', 10], ['tested', 10], ['testy', 10],
249
+ ['thankful', 10], ['thoughtful', 10], ['threatened', 10], ['threatening', 10], ['thrifty', 10],
250
+ ['thrilled', 10], ['tired', 10], ['tormented', 10], ['torn', 10], ['tortured', 10], ['touched', 10],
251
+ ['tough', 10], ['tragic', 10], ['tranquil', 10], ['transformed', 10], ['trapped', 10], ['treasured', 10],
252
+ ['trembly', 10], ['tremendous', 10], ['tricked', 10], ['troubled', 10], ['trusted', 10], ['trustful', 10],
253
+ ['ugly', 10], ['unaccepted', 10], ['unappreciated', 10], ['unbalanced', 10], ['unburdened', 10],
254
+ ['uncanny', 10], ['uncomfortable', 10], ['unconcerned', 10], ['uneven', 10], ['unfit', 10],
255
+ ['unfriendly', 10],
256
+ ['united', 10], ['unjust', 10], ['unknown', 10], ['unneeded', 10], ['unpleasant', 10], ['unreal', 10],
257
+ ['unruly', 10], ['unwise', 10], ['up', 10], ['uplifted', 10], ['used', 10], ['useless', 10],
258
+ ['vacant', 10],
259
+ ['vague', 10], ['vain', 10], ['valid', 10], ['valued', 10], ['vengeful', 10], ['vexed', 10],
260
+ ['vicious', 10],
261
+ ['victimized', 10], ['victorious', 10], ['violated', 10], ['violent', 10], ['vivacious', 10],
262
+ ['vivid', 10],
263
+ ['void', 10], ['wacky', 10], ['warlike', 10], ['warm', 10], ['warmhearted', 10], ['warned', 10],
264
+ ['wary', 10],
265
+ ['wasted', 10], ['weak', 10], ['wealthy', 10], ['weary', 10], ['weird', 10], ['welcoming', 10],
266
+ ['whimsical', 10], ['whole', 10], ['wild', 10], ['willful', 10], ['wishful', 10], ['witty', 10],
267
+ ['worldly', 10], ['worried', 10], ['worse', 10], ['worthy', 10], ['wounded', 10], ['wrong', 10],
268
+ ['yearning', 10], ['yellow', 10], ['yielding', 10], ['young', 10], ['youthful', 10], ['zany', 10],
269
+ ['zealous', 10]
270
+ ]
@@ -966,3 +966,19 @@ nsfw = {
966
966
  "nw": "nsfw"
967
967
  }
968
968
 
969
+ if __name__ == "__main__":
970
+
971
+ # 获取tags列表
972
+ tags = []
973
+ for key, value in nsfw.items():
974
+ if not key.startswith('_') and key != 'var':
975
+ tags.extend(value)
976
+ print(tags)
977
+
978
+ # 展开二级列表
979
+ tags = [tag[0] for tag in tags]
980
+ print(tags)
981
+ import json
982
+
983
+ with open('../../../../playground/cos/tag_nsfw.json', 'w') as f:
984
+ json.dump(tags, f)
File without changes