From: AsamK Date: Sun, 13 Jun 2021 09:23:18 +0000 (+0200) Subject: Add optional content type to json sticker pack manifest X-Git-Tag: v0.8.4~2 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/f40c351662e55e26dc3fa78bf39f2573a4681524?ds=sidebyside Add optional content type to json sticker pack manifest --- diff --git a/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java b/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java index e5e0e445..3ff40585 100644 --- a/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java +++ b/lib/src/main/java/org/asamk/signal/manager/JsonStickerPack.java @@ -25,5 +25,8 @@ public class JsonStickerPack { @JsonProperty public String file; + + @JsonProperty + public String contentType; } } diff --git a/lib/src/main/java/org/asamk/signal/manager/util/StickerUtils.java b/lib/src/main/java/org/asamk/signal/manager/util/StickerUtils.java index 2fa8bc97..4c7fd58e 100644 --- a/lib/src/main/java/org/asamk/signal/manager/util/StickerUtils.java +++ b/lib/src/main/java/org/asamk/signal/manager/util/StickerUtils.java @@ -8,10 +8,12 @@ import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.messages.SignalServiceStickerManifestUpload; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URLConnection; import java.util.ArrayList; import java.util.zip.ZipFile; @@ -54,7 +56,9 @@ public class StickerUtils { throw new StickerPackInvalidException("Could not find find " + sticker.file); } - var contentType = Utils.getFileMimeType(new File(sticker.file), null); + var contentType = sticker.contentType != null && !sticker.contentType.isEmpty() + ? sticker.contentType + : getContentType(rootPath, zip, sticker.file); var stickerInfo = new SignalServiceStickerManifestUpload.StickerInfo(data.first(), data.second(), Optional.fromNullable(sticker.emoji).or(""), @@ -75,7 +79,9 @@ public class StickerUtils { throw new StickerPackInvalidException("Could not find find " + pack.cover.file); } - var contentType = Utils.getFileMimeType(new File(pack.cover.file), null); + var contentType = pack.cover.contentType != null && !pack.cover.contentType.isEmpty() + ? pack.cover.contentType + : getContentType(rootPath, zip, pack.cover.file); cover = new SignalServiceStickerManifestUpload.StickerInfo(data.first(), data.second(), Optional.fromNullable(pack.cover.emoji).or(""), @@ -107,4 +113,17 @@ public class StickerUtils { } } + private static String getContentType( + final String rootPath, final ZipFile zip, final String subfile + ) throws IOException { + if (zip != null) { + final var entry = zip.getEntry(subfile); + try (InputStream bufferedStream = new BufferedInputStream(zip.getInputStream(entry))) { + return URLConnection.guessContentTypeFromStream(bufferedStream); + } + } else { + final var file = new File(rootPath, subfile); + return Utils.getFileMimeType(file, null); + } + } } diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index e30a1965..a821d2a8 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -412,7 +412,13 @@ group lists. === uploadStickerPack -Upload a new sticker pack, consisting of a manifest file and the stickers in WebP format (maximum size for a sticker file is 100KiB). +Upload a new sticker pack, consisting of a manifest file and the sticker images. +Images must conform to the following specification: (see https://support.signal.org/hc/en-us/articles/360031836512-Stickers#sticker_reqs ) +- Static stickers in PNG or WebP format +- Animated stickers in APNG format, +- Maximum file size for a sticker file is 300KiB +- Image resolution of 512 x 512 px + The required manifest.json has the following format: [source,json] @@ -421,12 +427,14 @@ The required manifest.json has the following format: "title": "", "author": "", "cover": { // Optional cover, by default the first sticker is used as cover - "file": "", + "file": "", + "contentType": "", "emoji": "" }, "stickers": [ { - "file": "", + "file": "", + "contentType": "", "emoji": "" } ...