Allow defining the media volume via JSON

- Also verify JSON hosting website is safe to avoid IP-Grabbers on multiplayer servers
This commit is contained in:
Martin Prokoph
2024-06-27 11:07:45 +02:00
parent 2b3b25d8f3
commit 41deb1be8c
4 changed files with 26 additions and 6 deletions

View File

@@ -26,6 +26,7 @@ public class PictureSignConfig extends MidnightConfig {
@Entry(category = advanced) public static List<String> safeProviders = Lists.newArrayList("https://i.imgur.com/", "https://i.ibb.co/", "https://pictshare.net/", "https://iili.io/", "https://media1.tenor.com/");
@Entry(category = advanced) public static List<String> safeGifProviders = Lists.newArrayList("https://i.imgur.com/", "https://media1.tenor.com/");
@Entry(category = advanced) public static List<String> safeMultimediaProviders = Lists.newArrayList("https://youtube.com/", "https://www.youtube.com/", "https://youtu.be/","https://vimeo.com/");
@Entry(category = advanced) public static List<String> safeJsonProviders = Lists.newArrayList("https://github.com/", "https://gist.github.com/", "https://www.jsonkeeper.com/", "https://api.npoint.io/", "https://api.jsonsilo.com/");
@Comment(category = general) public static Comment ebeWarning;
@Entry(category = advanced) public static MissingImageMode missingImageMode = MissingImageMode.BLACK;
@Entry(category = advanced) public static PictureShader pictureShader = PictureShader.PosColTexLight;

View File

@@ -21,6 +21,7 @@ import static eu.midnightdust.picturesign.PictureSignClient.id;
public class PictureSignRenderer {
private boolean isSafeUrl;
private boolean isSafeJsonUrl;
public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay, boolean front) {
PictureSignType type = PictureSignType.getType(signBlockEntity, front);
@@ -29,11 +30,21 @@ public class PictureSignRenderer {
if (!url.contains("://")) {
url = "https://" + url;
}
if (url.endsWith(".json")) {
isSafeJsonUrl = false;
String jsonUrl = url;
PictureSignConfig.safeJsonProviders.forEach(safe -> {
if (!isSafeUrl) isSafeJsonUrl = jsonUrl.startsWith(safe);
});
if (url.endsWith(".json") || isSafeJsonUrl) {
if (PictureSignConfig.safeMode) {
if (!isSafeJsonUrl) return;
}
info = PictureURLUtils.infoFromJson(url);
if (info == null) return;
url = info.url();
}
if (!url.contains("://")) {
url = "https://" + url;
}
@@ -62,8 +73,6 @@ public class PictureSignRenderer {
if ((!PictureSignConfig.enableVideoSigns || !PictureSignClient.hasWaterMedia) && type != PictureSignType.PICTURE) return;
if (url.startsWith("https://youtube.com/") || url.startsWith("https://www.youtube.com/watch?v=") || url.startsWith("https://youtu.be/")) {
url = url.replace("https://www.", "https://");
//url = url.replace("youtube.com/watch?v=", PictureSignConfig.invidiousInstance.replace("https://", "").replace("/", "")+"/latest_version?id=");
//url = url.replace("youtu.be/", PictureSignConfig.invidiousInstance.replace("https://", "").replace("/", "")+"/latest_version?id=");
}
World world = signBlockEntity.getWorld();
BlockPos pos = signBlockEntity.getPos();
@@ -74,7 +83,11 @@ public class PictureSignRenderer {
GIFHandler gifHandler = null;
if (PictureSignClient.hasWaterMedia) {
if (type.isVideo || type.isAudio) mediaHandler = MediaHandler.getOrCreate(videoId, pos);
if (type == PictureSignType.GIF) gifHandler = GIFHandler.getOrCreate(videoId);
else if (type == PictureSignType.GIF) gifHandler = GIFHandler.getOrCreate(videoId);
else {
MediaHandler.closePlayer(videoId);
GIFHandler.closePlayer(videoId);
}
}
if (world != null && ((world.getBlockState(pos.down()).getBlock().equals(Blocks.REDSTONE_TORCH) || world.getBlockState(pos.down()).getBlock().equals(Blocks.REDSTONE_WALL_TORCH))
@@ -147,11 +160,12 @@ public class PictureSignRenderer {
PictureSignClient.LOGGER.error(e);
return;
}
if (info != null && info.volume() != -1) mediaHandler.setMaxVolume(info.volume());
mediaHandler.setVolumeBasedOnDistance();
if (info != null && info.start() > 0 && mediaHandler.getTime() < info.start()) mediaHandler.setTime(info.start());
if (info != null && info.end() > 0 && mediaHandler.getTime() >= info.end() && !mediaHandler.playbackStarted) mediaHandler.stop();
}
else if (type == PictureSignType.GIF) {
else if (type == PictureSignType.GIF && gifHandler != null) {
try {
if (!gifHandler.hasMedia() && !gifHandler.playbackStarted) {
gifHandler.play(url);

View File

@@ -25,6 +25,7 @@ public class MediaHandler {
public boolean playbackStarted = false;
public boolean isDeactivated;
private SyncBasePlayer player;
private int maxVolume = 100;
private MediaHandler(Identifier id, BlockPos pos) {
this.id = id;
@@ -44,11 +45,14 @@ public class MediaHandler {
return;
}
double distance = this.pos.getSquaredDistance(playerPos) / PictureSignConfig.audioDistanceMultiplier;
setVolume((int) Math.clamp(100-distance, 0, 100));
setVolume((int) Math.clamp(maxVolume-distance, 0, 100));
}
private void setVolume(int volume) {
player.setVolume(volume);
}
public void setMaxVolume(int volume) {
maxVolume = volume;
}
public void closePlayer() {
if (player != null) {

View File

@@ -21,6 +21,7 @@
"picturesign.midnightconfig.safeProviders":"Safe Image Providers",
"picturesign.midnightconfig.safeGifProviders":"Safe GIF Providers",
"picturesign.midnightconfig.safeMultimediaProviders":"Safe Multimedia Providers",
"picturesign.midnightconfig.safeJsonProviders":"Safe JSON Providers",
"picturesign.midnightconfig.invidiousInstance":"Invidious Instance",
"picturesign.midnightconfig.invidiousInstance.tooltip":"Select the Invidious instance that is being used to play YouTube videos. \nYou can find a list of them at\ndocs.invidious.io/instances/",
"picturesign.midnightconfig.missingImageMode":"Missing image mode",