[Enhance] Link Play log & video download

- Add support for downloading `video_720.mp4` & `video_1080.mp4`
- More detailed log for Link Play #135
This commit is contained in:
Lost-MSth
2023-10-23 22:21:49 +08:00
parent 1f389e4073
commit 04010d9c33
5 changed files with 43 additions and 9 deletions

View File

@@ -25,7 +25,7 @@ class SonglistParser:
'''songlist文件解析器''' '''songlist文件解析器'''
FILE_NAMES = ['0.aff', '1.aff', '2.aff', '3.aff', FILE_NAMES = ['0.aff', '1.aff', '2.aff', '3.aff',
'base.ogg', '3.ogg', 'video.mp4', 'video_audio.ogg'] 'base.ogg', '3.ogg', 'video.mp4', 'video_audio.ogg', 'video_720.mp4', 'video_1080.mp4']
has_songlist = False has_songlist = False
songs: dict = {} # {song_id: value, ...} songs: dict = {} # {song_id: value, ...}
@@ -55,7 +55,7 @@ class SonglistParser:
# songlist没有则只限制文件名 # songlist没有则只限制文件名
return file_name in SonglistParser.FILE_NAMES return file_name in SonglistParser.FILE_NAMES
rule = SonglistParser.songs[song_id] rule = SonglistParser.songs[song_id]
for i in range(8): for i in range(10):
if file_name == SonglistParser.FILE_NAMES[i] and rule & (1 << i) != 0: if file_name == SonglistParser.FILE_NAMES[i] and rule & (1 << i) != 0:
return True return True
return False return False
@@ -98,10 +98,15 @@ class SonglistParser:
r |= 8 r |= 8
for extra_file in song.get('additional_files', []): for extra_file in song.get('additional_files', []):
if extra_file['file_name'] == SonglistParser.FILE_NAMES[6]: x = extra_file['file_name']
if x == SonglistParser.FILE_NAMES[6]:
r |= 64 r |= 64
elif extra_file['file_name'] == SonglistParser.FILE_NAMES[7]: elif x == SonglistParser.FILE_NAMES[7]:
r |= 128 r |= 128
elif x == SonglistParser.FILE_NAMES[8]:
r |= 256
elif x == SonglistParser.FILE_NAMES[9]:
r |= 512
return {song['id']: r} return {song['id']: r}
@@ -297,7 +302,7 @@ class DownloadList(UserDownload):
re['audio']['3'] = {"checksum": x.hash, "url": x.url} re['audio']['3'] = {"checksum": x.hash, "url": x.url}
else: else:
re['audio']['3'] = {"checksum": x.hash} re['audio']['3'] = {"checksum": x.hash}
elif i in ('video.mp4', 'video_audio.ogg'): elif i in ('video.mp4', 'video_audio.ogg', 'video_720.mp4', 'video_1080.mp4'):
if 'additional_files' not in re: if 'additional_files' not in re:
re['additional_files'] = [] re['additional_files'] = []
@@ -307,6 +312,7 @@ class DownloadList(UserDownload):
else: else:
re['additional_files'].append( re['additional_files'].append(
{"checksum": x.hash, 'file_name': i}) {"checksum": x.hash, 'file_name': i})
# 有参数 requirement 作用未知
else: else:
if 'chart' not in re: if 'chart' not in re:
re['chart'] = {} re['chart'] = {}

View File

@@ -16,6 +16,7 @@ logging.basicConfig(format='[%(asctime)s] %(levelname)s in %(module)s: %(message
class UDP_handler(socketserver.BaseRequestHandler): class UDP_handler(socketserver.BaseRequestHandler):
def handle(self): def handle(self):
client_msg, server = self.request client_msg, server = self.request
# print(client_msg)
try: try:
token = client_msg[:8] token = client_msg[:8]
iv = client_msg[8:20] iv = client_msg[8:20]

View File

@@ -43,7 +43,9 @@ def unique_random(dataset, length=8, random_func=None):
def clear_player(token): def clear_player(token):
# 清除玩家信息和token # 清除玩家信息和token
del Store.player_dict[Store.link_play_data[token]['player_id']] player_id = Store.link_play_data[token]['player_id']
logging.info(f'Clean player `{Store.player_dict[player_id].name}`')
del Store.player_dict[player_id]
del Store.link_play_data[token] del Store.link_play_data[token]
@@ -51,6 +53,7 @@ def clear_room(room):
# 清除房间信息 # 清除房间信息
room_id = room.room_id room_id = room.room_id
room_code = room.room_code room_code = room.room_code
logging.info(f'Clean room `{room_code}`')
del Store.room_id_dict[room_id] del Store.room_id_dict[room_id]
del Store.room_code_dict[room_code] del Store.room_code_dict[room_code]
del room del room

View File

@@ -1,3 +1,4 @@
import logging
from time import time from time import time
from .config import Config from .config import Config
@@ -44,6 +45,10 @@ class Player:
self.start_command_num = 0 self.start_command_num = 0
@property
def name(self) -> str:
return self.player_name.decode('ascii').rstrip('\x00')
def set_player_name(self, player_name: str): def set_player_name(self, player_name: str):
self.player_name = player_name.encode('ascii') self.player_name = player_name.encode('ascii')
if len(self.player_name) > 16: if len(self.player_name) > 16:
@@ -133,16 +138,23 @@ class Room:
for i in range(4): for i in range(4):
if self.players[i].player_id == self.host_id: if self.players[i].player_id == self.host_id:
for j in range(1, 4): for j in range(1, 4):
if self.players[(i + j) % 4].player_id != 0: player = self.players[(i + j) % 4]
self.host_id = self.players[(i + j) % 4].player_id if player.player_id != 0:
self.host_id = player.player_id
logging.info(
f'Player `{player.name}` becomes the host of room `{self.room_code}`')
break break
break break
def delete_player(self, player_index: int): def delete_player(self, player_index: int):
# 删除某个玩家 # 删除某个玩家
if self.players[player_index].player_id == self.host_id: player = self.players[player_index]
if player.player_id == self.host_id:
self.make_round() self.make_round()
logging.info(
f'Player `{player.name}` leaves room `{self.room_code}`')
self.players[player_index].online = 0 self.players[player_index].online = 0
self.players[player_index] = Player() self.players[player_index] = Player()
self.update_song_unlock() self.update_song_unlock()
@@ -203,3 +215,10 @@ class Room:
for i in max_score_i: for i in max_score_i:
self.players[i].best_player_flag = 1 self.players[i].best_player_flag = 1
logging.info(
f'Room `{self.room_code}` finishes song `{self.song_idx}`')
for i in self.players:
if i.player_id != 0:
logging.info(
f'- Player `{i.name}` - Score: {i.last_score} Cleartype: {i.last_cleartype} Difficulty: {i.last_difficulty}')

View File

@@ -1,3 +1,4 @@
import logging
import time import time
from .udp_class import Room, bi from .udp_class import Room, bi
@@ -44,6 +45,8 @@ class CommandParser:
for i in self.room.players: for i in self.room.players:
if i.player_id == player_id and i.online == 1: if i.player_id == player_id and i.online == 1:
self.room.host_id = player_id self.room.host_id = player_id
logging.info(
f'Player `{i.name}` becomes the host of room `{self.room.room_code}`')
self.s.random_code = self.command[16:24] self.s.random_code = self.command[16:24]
self.room.command_queue.append(self.s.command_10()) self.room.command_queue.append(self.s.command_10())
@@ -189,6 +192,8 @@ class CommandParser:
# 将换房主时间提前到此刻 # 将换房主时间提前到此刻
self.room.make_round() self.room.make_round()
logging.info(f'Room `{self.room.room_code}` starts playing')
if self.room.state in (4, 5, 6): if self.room.state in (4, 5, 6):
timestamp = round(time.time() * 1000) timestamp = round(time.time() * 1000)
self.room.countdown -= timestamp - self.room.timestamp self.room.countdown -= timestamp - self.room.timestamp