Skip to content

Commit 1ccff0c

Browse files
committed
feat. 进一步完善服务器点歌功能,完善语言文件
1 parent 451697b commit 1ccff0c

File tree

12 files changed

+100
-26
lines changed

12 files changed

+100
-26
lines changed

src/main/java/top/gregtao/concerto/music/NeteaseCloudMusic.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public String getLastRawPath() {
6666

6767
@Override
6868
public String getLastLyrics() {
69+
if (this.rawLyrics == null) this.getLyrics();
6970
return this.rawLyrics;
7071
}
7172

src/main/java/top/gregtao/concerto/music/QQMusic.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ public String getLastRawPath() {
109109

110110
@Override
111111
public String getLastLyrics() {
112+
if (this.rawLyrics == null) this.getLyrics();
112113
return this.rawLyrics;
113114
}
114115

@@ -119,7 +120,7 @@ public String getLastSubLyrics() {
119120

120121
@Override
121122
public String getSuffix() {
122-
return "mp3";
123+
return "ogg";
123124
}
124125

125126
@Override

src/main/java/top/gregtao/concerto/music/SharedMusic.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
public class SharedMusic extends PathFileMusic {
1616
private final String rawLyrics, rawSubLyrics;
17+
public long startTime = 0, startByte = 0;
1718

1819
public SharedMusic(String rawPath, MusicMetaData metaData, String lyrics, String subLyrics) {
1920
super(rawPath);
@@ -22,10 +23,12 @@ public SharedMusic(String rawPath, MusicMetaData metaData, String lyrics, String
2223
this.setMusicMeta(metaData);
2324
}
2425

25-
public SharedMusic(String rawPath, String lyrics, String subLyrics) {
26+
public SharedMusic(String rawPath, String lyrics, String subLyrics, long startTime, long startByte) {
2627
super(rawPath);
2728
this.rawLyrics = lyrics;
2829
this.rawSubLyrics = subLyrics;
30+
this.startTime = startTime;
31+
this.startByte = startByte;
2932
}
3033

3134
public String getRawLyrics() {
@@ -36,10 +39,19 @@ public String getRawSubLyrics() {
3639
return this.rawSubLyrics == null ? "" : this.rawSubLyrics;
3740
}
3841

42+
public long getStartTime() {
43+
return this.startTime;
44+
}
45+
46+
public long getStartByte() {
47+
return this.startByte;
48+
}
49+
3950
@Override
4051
public InputStream getMusicSource() throws MusicSourceNotFoundException {
4152
try {
42-
return FileUtil.createBuffered(new HttpURLInputStream(URI.create(this.getRawPath()).toURL()));
53+
return FileUtil.createBuffered(new HttpURLInputStream(URI.create(this.getRawPath()).toURL(),
54+
(int) this.startByte, null));
4355
} catch (Exception e) {
4456
throw new MusicSourceNotFoundException(e);
4557
}

src/main/java/top/gregtao/concerto/music/parser/SharedMusicJsonParser.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ public class SharedMusicJsonParser implements JsonParser<SharedMusic> {
1111
@Override
1212
public SharedMusic fromJson(JsonObject object) {
1313
return new SharedMusic(object.get("path").getAsString(), TextUtil.fromBase64(object.get("lyrics").getAsString()),
14-
TextUtil.fromBase64(object.get("sub_lyrics").getAsString()));
14+
TextUtil.fromBase64(object.get("sub_lyrics").getAsString()), object.get("start_time").getAsLong(),
15+
object.get("start_byte").getAsLong());
1516
}
1617

1718
@Override
1819
public JsonObject toJson(JsonObject object, SharedMusic music) {
1920
object.addProperty("lyrics", TextUtil.toBase64(music.getRawLyrics()));
2021
object.addProperty("sub_lyrics", TextUtil.toBase64(music.getRawSubLyrics()));
2122
object.addProperty("path", music.getRawPath());
23+
object.addProperty("start_time", music.getStartTime());
24+
object.addProperty("start_byte", music.getStartByte());
2225
return object;
2326
}
2427

src/main/java/top/gregtao/concerto/network/ClientMusicNetworkHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import net.minecraft.client.network.ClientPlayerEntity;
77
import net.minecraft.entity.player.PlayerEntity;
88
import net.minecraft.server.MinecraftServer;
9-
import net.minecraft.text.Style;
109
import net.minecraft.text.Text;
1110
import net.minecraft.util.Formatting;
1211
import top.gregtao.concerto.ConcertoClient;
@@ -243,11 +242,12 @@ public static boolean musicAgentAddMusic(Music music) {
243242
}
244243

245244
public static void musicAgentMusicReceiver(ConcertoPayload payload, ClientPlayNetworking.Context context) {
246-
String[] args = payload.string.split(":");
247-
if (args.length < 2 || ConcertoClient.clientState != ConcertoClient.ClientState.MUSIC_AGENT) return;
245+
if (ConcertoClient.clientState != ConcertoClient.ClientState.MUSIC_AGENT) return;
248246
MusicPlayer.run(() -> {
249-
Music music = MusicJsonParsers.from(TextUtil.fromBase64(args[0]));
250-
if (music != null) MusicPlayer.INSTANCE.playTempMusic(music);
247+
Music music = MusicJsonParsers.from(TextUtil.fromBase64(payload.string));
248+
if (music != null) {
249+
MusicPlayer.INSTANCE.playTempMusic(music);
250+
}
251251
});
252252
}
253253
}

src/main/java/top/gregtao/concerto/network/ServerMusicAgent.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void receiveVote(ServerPlayerEntity player, boolean vote) {
7474
this.endVoting();
7575
}
7676
this.voteLock.unlock();
77-
player.sendMessage(Text.translatable("concerto.agent.vote", vote ?
77+
player.sendMessage(Text.translatable("concerto.agent.vote_for", vote ?
7878
Text.translatable("concerto.accept") : Text.translatable("concerto.reject")));
7979
ConcertoServer.LOGGER.info("Player {} voted {}", player.getName().getString(), vote);
8080
}
@@ -90,7 +90,8 @@ private synchronized void endVoting() {
9090
} else {
9191
ConcertoServer.LOGGER.info("Vote: Keep current music");
9292
}
93-
Text text = success ? Text.translatable("concerto.agent.vote.success") : Text.translatable("concerto.agent.vote.failed");
93+
Text text = Text.translatable(success ? "concerto.agent.vote.success" : "concerto.agent.vote.failed",
94+
this.yesVoters.size(), this.noVoters.size());
9495
this.broadcast(text);
9596

9697
this.isVoting = false;
@@ -122,7 +123,7 @@ private synchronized void playNextMusic() {
122123
}
123124
this.isPlaying.set(true);
124125
this.playTime = System.currentTimeMillis();
125-
ServerMusicNetworkHandler.musicAgentSendMusic(this.members, this.currentSharedMusic, 0);
126+
ServerMusicNetworkHandler.musicAgentSendMusic(this.members, this.currentSharedMusic);
126127
this.playNextFuture = this.musicScheduler.schedule(this::playNextMusic,
127128
this.currentMusic.getMeta().getDuration().asSeconds(), TimeUnit.SECONDS);
128129
}
@@ -136,10 +137,13 @@ public synchronized boolean isMember(ServerPlayerEntity player) {
136137
return this.members.contains(player);
137138
}
138139

139-
public synchronized void addMusic(Music music) {
140+
public synchronized void addMusic(ServerPlayerEntity player, Music music) {
140141
MusicPlayer.run(() -> {
141142
ConcertoServer.LOGGER.info("Added music {}", music.getMeta().title());
142143
this.musicQueue.offer(music);
144+
this.broadcast(Text.translatable("concerto.agent.add",
145+
player == null ? Text.translatable("concerto.unknown") : player.getName().getString(),
146+
music.getMeta().title(), music.getMeta().author()));
143147
if (!this.isPlaying.get()) {
144148
this.playNextFuture = this.musicScheduler.schedule(this::playNextMusic, 1, TimeUnit.SECONDS);
145149
}
@@ -150,9 +154,12 @@ public synchronized void playerJoin(ServerPlayerEntity player) {
150154
ConcertoServer.LOGGER.info("Player {} joined music agent", player.getName().getString());
151155
this.members.add(player);
152156
if (this.isPlaying.get() && this.currentSharedMusic != null) {
153-
ServerMusicNetworkHandler.musicAgentSendMusic(player, this.currentSharedMusic,
154-
this.totalBytes * (System.currentTimeMillis() - this.playTime) /
155-
this.currentMusic.getMeta().getDuration().asMilliseconds());
157+
if (this.currentSharedMusic instanceof SharedMusic shared) {
158+
shared.startTime = System.currentTimeMillis() - this.playTime;
159+
shared.startByte = this.totalBytes * (System.currentTimeMillis() - this.playTime) /
160+
this.currentMusic.getMeta().getDuration().asMilliseconds();
161+
}
162+
ServerMusicNetworkHandler.musicAgentSendMusic(player, this.currentSharedMusic);
156163
}
157164
}
158165

src/main/java/top/gregtao/concerto/network/ServerMusicNetworkHandler.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -215,22 +215,22 @@ public static boolean playerExist(PlayerManager manager, String name) {
215215
return name.equals("@a") || (manager.getPlayer(name) != null);
216216
}
217217

218-
public static void musicAgentSendMusic(ServerPlayerEntity player, Music music, long time) {
218+
public static void musicAgentSendMusic(ServerPlayerEntity player, Music music) {
219219
JsonObject object = MusicJsonParsers.to(music, true);
220220
if (object == null) return;
221-
musicAgentSendMusic(player, object.toString(), time);
221+
musicAgentSendMusic(player, object.toString());
222222
}
223223

224-
public static void musicAgentSendMusic(ServerPlayerEntity player, String music, long time) {
224+
public static void musicAgentSendMusic(ServerPlayerEntity player, String music) {
225225
ConcertoPayload payload = new ConcertoPayload(ConcertoPayload.Channel.MUSIC_AGENT,
226-
TextUtil.toBase64(music) + ":" + time);
226+
TextUtil.toBase64(music));
227227
ServerPlayNetworking.send(player, payload);
228228
}
229229

230-
public static void musicAgentSendMusic(List<ServerPlayerEntity> players, Music music, long time) {
230+
public static void musicAgentSendMusic(List<ServerPlayerEntity> players, Music music) {
231231
JsonObject object = MusicJsonParsers.to(music, true);
232232
if (object == null) return;
233-
players.forEach(player -> musicAgentSendMusic(player, object.toString(), time));
233+
players.forEach(player -> musicAgentSendMusic(player, object.toString()));
234234
}
235235

236236
public static void musicAgentReceiver(ConcertoPayload payload, ServerPlayNetworking.Context context) {
@@ -268,7 +268,7 @@ public static void musicAgentReceiver(ConcertoPayload payload, ServerPlayNetwork
268268
} else if (args[0].equals("Add")) {
269269
Music music = MusicJsonParsers.from(TextUtil.fromBase64(args[1]), false);
270270
if (music != null) {
271-
ServerMusicAgent.INSTANCE.addMusic(music);
271+
ServerMusicAgent.INSTANCE.addMusic(context.player(), music);
272272
} else {
273273
context.player().sendMessage(Text.translatable("concerto.agent.error"));
274274
}

src/main/java/top/gregtao/concerto/player/MusicPlayer.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package top.gregtao.concerto.player;
22

3+
import top.gregtao.concerto.music.SharedMusic;
34
import top.gregtao.concerto.player.streamplayer.enums.Status;
45
import top.gregtao.concerto.player.streamplayer.stream.StreamPlayer;
56
import top.gregtao.concerto.player.streamplayer.stream.StreamPlayerEvent;
@@ -223,7 +224,11 @@ public void playTempMusic(Music music, Runnable callback) {
223224
status.resetInfo();
224225
status.currentMusic = music;
225226
status.currentSource = source;
226-
status.initMusicStatus();
227+
long startTime = 0;
228+
if (music instanceof SharedMusic shared) {
229+
startTime = shared.getStartTime();
230+
}
231+
status.initMusicStatus(startTime);
227232
status.updateDisplayTexts();
228233
try {
229234
this.open(source);

src/main/java/top/gregtao/concerto/player/MusicPlayerHandler.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public class MusicPlayerHandler {
5252

5353
public float progressPercentage = 0;
5454

55+
private long startTime = 0;
56+
5557
private final Random random = new Random();
5658

5759
public MusicPlayerHandler() {}
@@ -94,6 +96,7 @@ public void resetInfo() {
9496
this.displayTexts = new String[]{ "", "", "", ""};
9597
this.timeFormat = "%s" + " ".repeat(30) + "%s";
9698
this.progressPercentage = 0;
99+
this.startTime = 0;
97100
}
98101

99102
public void clear() {
@@ -162,6 +165,7 @@ public void updateDisplayTexts() {
162165
}
163166

164167
public void updateDisplayTexts(long millisecond) {
168+
millisecond += this.startTime;
165169
MusicTimestamp duration = this.currentMeta.getDuration();
166170
this.progressPercentage = duration == null ? 0 : ((float) millisecond / duration.asMilliseconds());
167171
this.currentTime = MusicTimestamp.ofMilliseconds(millisecond);
@@ -195,6 +199,11 @@ public Music playNext(int forward) {
195199
return this.currentMusic;
196200
}
197201

202+
public void initMusicStatus(long startTime) {
203+
this.initMusicStatus();
204+
this.startTime = startTime;
205+
}
206+
198207
public void initMusicStatus() {
199208
this.currentMeta = this.currentMusic.getMeta();
200209
try {

src/main/java/top/gregtao/concerto/screen/InGameHudRenderer.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@ public static void render(DrawContext context) {
3535
}
3636
if (options.displayMusicDetails) {
3737
Vector2i pos = ClientConfig.INSTANCE.musicDetailsPosSupplier.getPos(scaledWidth, scaledHeight);
38-
String state = ConcertoClient.clientState == ConcertoClient.ClientState.MUSIC_AGENT ? " | AGENT" :
39-
(ConcertoClient.clientState == ConcertoClient.ClientState.MUSIC_ROOM ? " | ROOM" : "");
38+
39+
String state = ConcertoClient.clientState == ConcertoClient.ClientState.MUSIC_AGENT ?
40+
" | " + Text.translatable("concerto.agent").getString() :
41+
(ConcertoClient.clientState == ConcertoClient.ClientState.MUSIC_ROOM ?
42+
" | " + Text.translatable("concerto.room").getString() : "");
43+
4044
TextUtil.renderText(Text.literal(texts[2] + state), options.musicDetailsAlignment,
4145
pos.x, pos.y, context, client.textRenderer, 0xffffffff);
4246
}

0 commit comments

Comments
 (0)