Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/modules/maimai/libraries/maimaidx_music.py

169 lines
5.3 KiB
Python
Raw Normal View History

2021-10-12 15:02:36 +00:00
import random
from copy import deepcopy
2021-11-12 14:25:53 +00:00
from typing import Dict, List, Optional, Union, Tuple, Any
2021-10-12 15:02:36 +00:00
2023-02-05 14:33:33 +00:00
from core.utils.http import get_url
2021-10-12 15:02:36 +00:00
2023-06-09 04:36:40 +00:00
def get_cover_len5_id(mid) -> str:
2022-07-12 17:27:34 +00:00
mid = int(mid)
2023-06-09 04:36:40 +00:00
if mid > 10000 and mid <= 11000:
2022-07-12 17:27:34 +00:00
mid -= 10000
2023-06-09 04:36:40 +00:00
return f'{mid:05d}'
2022-07-12 17:27:34 +00:00
2021-10-12 15:02:36 +00:00
def cross(checker: List[Any], elem: Optional[Union[Any, List[Any]]], diff):
ret = False
diff_ret = []
if not elem or elem is Ellipsis:
return True, diff
if isinstance(elem, List):
for _j in (range(len(checker)) if diff is Ellipsis else diff):
if _j >= len(checker):
continue
__e = checker[_j]
if __e in elem:
diff_ret.append(_j)
ret = True
elif isinstance(elem, Tuple):
for _j in (range(len(checker)) if diff is Ellipsis else diff):
if _j >= len(checker):
continue
__e = checker[_j]
if elem[0] <= __e <= elem[1]:
diff_ret.append(_j)
ret = True
else:
for _j in (range(len(checker)) if diff is Ellipsis else diff):
if _j >= len(checker):
continue
__e = checker[_j]
if elem == __e:
return True, [_j]
return ret, diff_ret
def in_or_equal(checker: Any, elem: Optional[Union[Any, List[Any]]]):
if elem is Ellipsis:
return True
if isinstance(elem, List):
return checker in elem
elif isinstance(elem, Tuple):
return elem[0] <= checker <= elem[1]
else:
return checker == elem
class Chart(Dict):
tap: Optional[int] = None
slide: Optional[int] = None
hold: Optional[int] = None
touch: Optional[int] = None
brk: Optional[int] = None
charter: Optional[int] = None
def __getattribute__(self, item):
if item == 'tap':
return self['notes'][0]
elif item == 'hold':
return self['notes'][1]
elif item == 'slide':
return self['notes'][2]
elif item == 'touch':
return self['notes'][3] if len(self['notes']) == 5 else 0
elif item == 'brk':
return self['notes'][-1]
elif item == 'charter':
return self['charter']
return super().__getattribute__(item)
class Music(Dict):
id: Optional[str] = None
title: Optional[str] = None
ds: Optional[List[float]] = None
level: Optional[List[str]] = None
genre: Optional[str] = None
type: Optional[str] = None
bpm: Optional[float] = None
version: Optional[str] = None
charts: Optional[Chart] = None
release_date: Optional[str] = None
artist: Optional[str] = None
diff: List[int] = []
def __getattribute__(self, item):
if item in {'genre', 'artist', 'release_date', 'bpm', 'version'}:
if item == 'version':
return self['basic_info']['from']
return self['basic_info'][item]
elif item in self:
return self[item]
return super().__getattribute__(item)
class MusicList(List[Music]):
def by_id(self, music_id: str) -> Optional[Music]:
for music in self:
if music.id == music_id:
return music
return None
def by_title(self, music_title: str) -> Optional[Music]:
for music in self:
if music.title == music_title:
return music
return None
def random(self):
return random.choice(self)
def filter(self,
*,
2023-05-28 04:51:41 +00:00
level: Optional[Union[str, List[str]]] = ...,
ds: Optional[Union[float, List[float], Tuple[float, float]]] = ...,
title_search: Optional[str] = ...,
genre: Optional[Union[str, List[str]]] = ...,
bpm: Optional[Union[float, List[float], Tuple[float, float]]] = ...,
type: Optional[Union[str, List[str]]] = ...,
diff: List[int] = ...,
2021-10-12 15:02:36 +00:00
):
new_list = MusicList()
for music in self:
diff2 = diff
music = deepcopy(music)
ret, diff2 = cross(music.level, level, diff2)
if not ret:
continue
ret, diff2 = cross(music.ds, ds, diff2)
if not ret:
continue
if not in_or_equal(music.genre, genre):
continue
if not in_or_equal(music.type, type):
continue
if not in_or_equal(music.bpm, bpm):
continue
if title_search is not Ellipsis and title_search.lower() not in music.title.lower():
continue
music.diff = diff2
new_list.append(music)
return new_list
2022-05-13 13:54:12 +00:00
class TotalList:
def __init__(self):
self.total_list = None
async def get(self):
if self.total_list is None:
2022-08-01 15:33:35 +00:00
obj = await get_url('https://www.diving-fish.com/api/maimaidxprober/music_data', 200, fmt='json')
2022-05-13 13:54:12 +00:00
total_list: MusicList = MusicList(obj)
for __i in range(len(total_list)):
total_list[__i] = Music(total_list[__i])
for __j in range(len(total_list[__i].charts)):
total_list[__i].charts[__j] = Chart(total_list[__i].charts[__j])
self.total_list = total_list
return self.total_list