[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文件解析器'''
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
songs: dict = {} # {song_id: value, ...}
@@ -55,7 +55,7 @@ class SonglistParser:
# songlist没有则只限制文件名
return file_name in SonglistParser.FILE_NAMES
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:
return True
return False
@@ -98,10 +98,15 @@ class SonglistParser:
r |= 8
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
elif extra_file['file_name'] == SonglistParser.FILE_NAMES[7]:
elif x == SonglistParser.FILE_NAMES[7]:
r |= 128
elif x == SonglistParser.FILE_NAMES[8]:
r |= 256
elif x == SonglistParser.FILE_NAMES[9]:
r |= 512
return {song['id']: r}
@@ -297,7 +302,7 @@ class DownloadList(UserDownload):
re['audio']['3'] = {"checksum": x.hash, "url": x.url}
else:
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:
re['additional_files'] = []
@@ -307,6 +312,7 @@ class DownloadList(UserDownload):
else:
re['additional_files'].append(
{"checksum": x.hash, 'file_name': i})
# 有参数 requirement 作用未知
else:
if 'chart' not in re:
re['chart'] = {}

View File

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

View File

@@ -43,7 +43,9 @@ def unique_random(dataset, length=8, random_func=None):
def clear_player(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]
@@ -51,6 +53,7 @@ def clear_room(room):
# 清除房间信息
room_id = room.room_id
room_code = room.room_code
logging.info(f'Clean room `{room_code}`')
del Store.room_id_dict[room_id]
del Store.room_code_dict[room_code]
del room

View File

@@ -1,3 +1,4 @@
import logging
from time import time
from .config import Config
@@ -44,6 +45,10 @@ class Player:
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):
self.player_name = player_name.encode('ascii')
if len(self.player_name) > 16:
@@ -133,16 +138,23 @@ class Room:
for i in range(4):
if self.players[i].player_id == self.host_id:
for j in range(1, 4):
if self.players[(i + j) % 4].player_id != 0:
self.host_id = self.players[(i + j) % 4].player_id
player = self.players[(i + j) % 4]
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
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()
logging.info(
f'Player `{player.name}` leaves room `{self.room_code}`')
self.players[player_index].online = 0
self.players[player_index] = Player()
self.update_song_unlock()
@@ -203,3 +215,10 @@ class Room:
for i in max_score_i:
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
from .udp_class import Room, bi
@@ -44,6 +45,8 @@ class CommandParser:
for i in self.room.players:
if i.player_id == player_id and i.online == 1:
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.room.command_queue.append(self.s.command_10())
@@ -189,6 +192,8 @@ class CommandParser:
# 将换房主时间提前到此刻
self.room.make_round()
logging.info(f'Room `{self.room.room_code}` starts playing')
if self.room.state in (4, 5, 6):
timestamp = round(time.time() * 1000)
self.room.countdown -= timestamp - self.room.timestamp