-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathget_infinitas_db.py
executable file
·283 lines (256 loc) · 12.7 KB
/
get_infinitas_db.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
#!/usr/bin/python3
import pandas as pd
import pickle
from bs4 import BeautifulSoup
import requests
import json
from collections import defaultdict
url = 'https://bemaniwiki.com/index.php?beatmania+IIDX+INFINITAS/%C1%ED%A5%CE%A1%BC%A5%C4%BF%F4%A5%EA%A5%B9%A5%C8'
### TODO 当初のノーツ数リスト用のsongsの曲目をそのまま引用するために、かなり歪な作りになってしまっている。整理したい。
req = requests.get(url)
soup = BeautifulSoup(req.text, 'html.parser')
df = pd.read_html(url)
session = requests.session()
# bemaniwikiの表の曲名をsongsに登録
songs = defaultdict(list)
for tr in soup.find_all('tr'):
numtd = len(tr.find_all('td'))
if numtd in (13,11):
tmp = tr.find_all('td')
title = tmp[0].text
for sc in tmp[1:10]:
try:
songs[title].append(int(sc.text))
except:
songs[title].append(0)
# 整合性確認
# AETHERやMacho Monkyなどが表記ゆれの関係になっている。
with open('resources/informations3.1.res', 'rb') as f:
js = pickle.load(f)
ocr_title = js['music']['musics']
conv ={
"†渚の小悪魔ラヴリィ〜レイディオ†(II":"†渚の小悪魔ラヴリィ~レイディオ†(II",
"かげぬい 〜 Ver.BENIBOTAN":"かげぬい ~ Ver.BENIBOTAN",
"カゴノトリ〜弐式〜":"カゴノトリ~弐式~",
"キャトられ♥恋はモ〜モク":"キャトられ恋はモ~モク",
"ギョギョっと人魚♨爆婚ブライダル":"ギョギョっと人魚 爆婚ブライダル",
"クルクル☆ラブ〜Opioid Pepti":"クルクル☆ラブ~Opioid Pepti",
'ピアノ協奏曲第1番"蠍火"':"ピアノ協奏曲第1番”蠍火”",
"フェティッシュペイパー〜脇の汗回転ガール":"フェティッシュペイパー ~脇の汗回転ガール~",
'ワルツ第17番 ト短調"大犬のワルツ"':"ワルツ第17番 ト短調”大犬のワルツ”",
"全力 SPECIAL VACATION!":"全力 SPECIAL VACATION!",
"共犯ヘヴンズコード":"共犯へヴンズコード",
"夕焼け 〜Fading Day〜":"夕焼け ~Fading Day~",
"太陽〜T・A・I・Y・O〜":"太陽~T・A・I・Y・O~",
"恋する☆宇宙戦争っ!!":"恋する☆宇宙戦争っ!!",
"旋律のドグマ〜Misérables〜":"旋律のドグマ~Miserables~",
"焱影":"火影",
"花吹雪 〜 IIDX LIMITED 〜":"花吹雪 ~ IIDX LIMITED ~",
"草原の王女-奇跡を辿って-":"草原の王女-軌跡を辿って-",
"表裏一体!?怪盗いいんちょの悩み♥":"表裏一体!?怪盗いいんちょの悩み",
"超!!遠距離らぶ♡メ〜ル":"超!!遠距離らぶメ~ル",
"野球の遊び方 そしてその歴史 〜決定版〜":"野球の遊び方 そしてその歴史 ~決定版~",
"麗 〜うらら〜":"麗 ~うらら~",
'100% minimoo-G':'100% minimoo-G',
'19,November':'19,November',
'50th Memorial Songs -二人の時 〜under the cherry blossoms〜-':'50th Memorial Songs -二人の時 ~under the cherry blossoms~-',
'A MINSTREL 〜 ver. short-scape 〜':'A MINSTREL ~ ver. short-scape ~',
'Amor De Verão':'Amor De Verao',
'Apocalypse 〜dirge of swans〜':'Apocalypse ~dirge of swans~',
'BALLAD FOR YOU〜想いの雨〜':'BALLAD FOR YOU~想いの雨~',
'Be Rock U(1998 burst style)':'Be Rock U (1998 burst style)',
'Best Of Me':'Best of Me',
'Blind Justice 〜Torn souls, Hurt Faiths〜':'Blind Justice ~Torn souls, Hurt Faiths ~',
'BLO§OM':'BLOSSOM',
'CaptivAte2〜覚醒〜':'CaptivAte2~覚醒~',
'CaptivAte〜浄化〜':'CaptivAte~浄化~',
'CaptivAte〜裁き〜':'CaptivAte~裁き~',
'CaptivAte〜裁き〜(SUBLIME TECHNO MIX)':'CaptivAte~裁き~(SUBLIME TECHNO MIX)',
'CaptivAte〜誓い〜':'CaptivAte~誓い~',
'CaptivAte2 〜覚醒〜':'CaptivAte2~覚醒~',
'CaptivAte 〜浄化〜':'CaptivAte~浄化~',
'CaptivAte 〜裁き〜':'CaptivAte~裁き~',
'CaptivAte 〜裁き〜(SUBLIME TECHNO MIX)':'CaptivAte~裁き~(SUBLIME TECHNO MIX)',
'CaptivAte 〜誓い〜':'CaptivAte~誓い~',
'City Never Sleeps (IIDX EDITION)':'City Never Sleeps (IIDX Edition)',
'CODE:Ø':'CODE:0',
'CROSSROAD 〜Left Story〜':'CROSSROAD ~Left Story~',
'DEATH†ZIGOQ〜怒りの高速爆走野郎〜':'DEATH†ZIGOQ ~怒りの高速爆走野郎~',
'DENJIN AKATSUKINITAORERU-SF PureAnalogSynth Mix-':'DENJIN AKATSUKINI TAORERU -SF PureAnalogSynth Mix-',
'DM STAR〜関西 energy style〜':'DM STAR~関西 energy style~',
'DORNWALD 〜Junge〜':'DORNWALD ~Junge~',
'Double♥♥Loving Heart':'Double Loving Heart',
'e-motion 2003 -romantic extra-':'e-motion 2003 -romantic extra-',
'Eine Haube 〜聖地の果てにあるもの〜':'Eine Haube ~聖地の果てにあるもの~',
'Geirskögul':'Geirskogul',
'i feel...':'i feel ...',
'LETHEBOLG 〜双神威に斬り咲けり〜':'LETHEBOLG ~双神威に斬り咲けり~',
'Light and Cyber・・・':'Light and Cyber…',
'London Affairs Beckoned WithMoney Loved By Yellow Papers.':'London Affairs Beckoned With Money Loved By Yellow Papers.',
'LOVE AGAIN TONIGHT〜for Mellisa mix〜':'LOVE AGAIN TONIGHT~for Mellisa mix~',
'Love♡km':'Love km',
'LOVE♡SHINE':'LOVE SHINE',
'Mächö Mönky':'Macho Monky',
'never...':'never…',
'PARANOIA MAX〜DIRTY MIX〜':'PARANOIA MAX~DIRTY MIX~',
'PARANOiA 〜HADES〜':'PARANOiA ~HADES~',
'Programmed Sun (xac Antarctic Ocean mix)':'Programmed Sun(xac Antarctic Ocean mix)',
'Präludium':'Praludium',
'quell〜the seventh slave〜':'quell~the seventh slave~',
"Raison d'être〜交差する宿命〜":"Raison d'etre~交差する宿命~",
'Raspberry♥Heart(English version)':'Raspberry Heart(English version)',
'spiral galaxy -L.E.D. STYLESPREADING PARTICLE BEAM MIX-':'spiral galaxy -L.E.D. STYLE SPREADING PARTICLE BEAM MIX-',
'Sweet Sweet♥Magic':'Sweet Sweet Magic',
'The Sealer 〜ア・ミリアとミリアの民〜':'The Sealer ~ア・ミリアとミリアの民~',
'Time to Empress':'Time To Empress',
'Turii 〜Panta rhei〜':'Turii ~Panta rhei~',
'ULTiM∧TE':'ULTiMΛTE',
'Winning Eleven9 Theme (IIDX EDITION)':'Winning Eleven9 Theme(IIDX EDITION)',
'XENON II 〜TOMOYUKIの野望〜':'XENON II ~TOMOYUKIの野望~',
'ZETA〜素数の世界と超越者〜':'ZETA~素数の世界と超越者~',
'¡Viva!':'!Viva!',
'ÆTHER':'ATHER',
'Übertreffen':'Ubertreffen',
'Ōu Legends':'Ou Legends',
'全力 SPECIAL VACATION!! 〜限りある休日〜': '全力 SPECIAL VACATION!! ~限りある休日~',
'†渚の小悪魔ラヴリィ〜レイディオ†(IIDX EDIT)':'†渚の小悪魔ラヴリィ~レイディオ†(IIDX EDIT)',
'かげぬい 〜 Ver.BENIBOTAN 〜':'かげぬい ~ Ver.BENIBOTAN ~',
'クルクル☆ラブ〜Opioid Peptide MIX〜':'クルクル☆ラブ~Opioid Peptide MIX~',
'フェティッシュペイパー〜脇の汗回転ガール〜':'フェティッシュペイパー ~脇の汗回転ガール~',
'L.F.O.':'L.F.O',
"Raison d'être~交差する宿命~":"Raison d'etre~交差する宿命~",
'カゴノトリ ~弐式~':'カゴノトリ~弐式~',
'ZETA ~素数の世界と超越者~':'ZETA~素数の世界と超越者~',
'era (nostal mix)':'era (nostalmix)',
'DISAPPEAR feat. Koyomin':'DISAPPEAR feat. koyomin',
'Χ-DEN':'X-DEN',
'Anisakis -somatic mutation type "Forza"-':'Anisakis -somatic mutation type"Forza"-'
}
# DPの難易度リストを変換(左:b内の登録名)
vers = ['RA', 'ROOT', 'SINO', 'CB', 'DJT', 'sub', 'HERO', 'HSKY', 'CH', '4th'
, 'PEN', 'SIR', '1st', '2nd', '5th', '6th', '7th', '8th', '9th', '10th'
, 'GOLD', 'RED', 'COP', 'EMP', 'BIS', 'TRI', 'LC', 'DD', 'RDT', 'SPD']
x = ''
def parse_lv_table(res):
ret = {}
soup = BeautifulSoup(res, features='html.parser')
div = soup.find_all('div')[8:-1]
for i,d in enumerate(div):
dat = d.text.split('\n')
if dat[0] == '曲情報なし':
continue
unofficial_lv = dat[1].strip()
for l in dat[2:-1]:
if l[:-4] in conv.keys():
tmp = conv[l[:-4]]
# (DD)とかを消す処理
for v in vers:
if tmp[-len(v)-3:] == f" ({v})":
tmp = tmp[:-len(v)-3]
title = tmp + '___DP' + l[-2]
else:
tmp = l[:-4]
# (DD)とかを消す処理
for v in vers:
if tmp[-len(v)-3:] == f" ({v})":
tmp = tmp[:-len(v)-3]
title = tmp + '___DP' + l[-2]
ret[title] = unofficial_lv
return ret
def update_songlist():
url = 'https://zasa.sakura.ne.jp/dp/rank.php'
songdb = {}
# 古い順に実行すればOK。同じkeyが即上書きとすれば最新の難易度だけ残る。
for ver in list(range(1,31)):
print(f"ver = {ver}")
data={'env':f'a{ver:02d}0', 'submit':'表示', 'cat':'0', 'mode':'m1', 'offi':'0'}
r = session.post(url, data=data)
dic = parse_lv_table(r.text)
songdb.update(dic)
return songdb
def convert_unofficial_songs(songs):
ret = {}
for s in songs.keys():
title = s[:-6]
diff = s[-1]
if not title in ret.keys():
ret[title] = ['','','','','','','', '', '']
if diff == 'N':
ret[title][4] = songs[s]
elif diff == 'H':
ret[title][5] = songs[s]
elif diff == 'A':
ret[title][6] = songs[s]
elif diff == 'L':
ret[title][8] = songs[s]
return ret
#"""BPI Managerのデータを取得して埋め込む
def get_bpim_data(songs):
"""BPI Managerの定義データを取得して整理する
Args:
songs (dict): 曲リストの辞書。keyが曲名。
Returns:
ret (dict): BPIM定義情報。key: 曲名___SPAのような形式, value:
"""
not_found = [] # songsになかった曲名を出力
res = requests.get('https://bpim.msqkn310.workers.dev/release') # 定義ファイルのURL
ret_json = json.loads(res.text)
# {'title': '& Intelligence', 'difficulty': '4', 'wr': 3234, 'avg': 2812, 'notes': 1623
# , 'bpm': '160', 'textage': '26/_and_int.html?1AB00', 'difficultyLevel': '11', 'dpLevel': '0', 'coef': -1}
ret = {}
for s in ret_json['body']:
title = s['title']
lvidx = int(s['difficulty'])
diff = '???'
if lvidx == 10: # spl
diff = 'SPL'
elif lvidx == 11: # dpl
diff = 'DPL'
elif lvidx == 3: # sph
diff = 'SPH'
elif lvidx == 4: # spa
diff = 'SPA'
elif lvidx == 8: # dph
diff = 'DPH'
elif lvidx == 9: # dpa
diff = 'DPA'
if title in songs.keys():
ret[f"{title}___{diff}"] = {}
for k in ['wr', 'avg', 'notes']:
ret[f"{title}___{diff}"][k] = int(s[k])
if 'coef' in s.keys():
ret[f"{title}___{diff}"]['coef'] = s['coef']
else:
ret[f"{title}___{diff}"]['coef'] = -1
else:
not_found.append(title)
return ret, not_found
a = update_songlist()
b = convert_unofficial_songs(a)
with open('dp_unofficial.pkl', 'wb') as f:
pickle.dump(b, f)
# 一度置換候補を抽出
to_change = []
for s in songs.keys():
if s in conv.keys():
to_change.append(s)
# songs(現在:bemaniwikiの曲名リスト)のうち、inf-notebookと違う曲名のものを置換
# 表記ゆれを置換
for c in to_change:
conv_k = conv[c]
songs[conv_k] = songs[c]
del songs[c]
not_found = sorted(sorted([k for k in songs.keys() if not k in ocr_title]), key=str.lower)
not_found_from_ocr = sorted(sorted([k for k in ocr_title if not k in songs.keys()]), key=str.lower)
print('見つからなかった曲')
for s in not_found_from_ocr:
print(s)
songs['never let you down'] = [0, 408,575,581, 465,577,0] # bemaniwikiのノーツ数が空欄なので直接書く
# bemaniwiki側のノーツ数のミスを修正
songs['cinder'][-2]=1764
bpim, not_found = get_bpim_data(songs)
outdata = {}
outdata['bpim'] = bpim
with open('songinfo.pkl', 'wb') as f:
pickle.dump(outdata, f)
print('\n->songinfo.pkl updated!')