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;
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(""),
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(""),
}
}
+ 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);
+ }
+ }
}
=== 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]
"title": "<STICKER_PACK_TITLE>",
"author": "<STICKER_PACK_AUTHOR>",
"cover": { // Optional cover, by default the first sticker is used as cover
- "file": "<name of webp file, mandatory>",
+ "file": "<name of image file, mandatory>",
+ "contentType": "<optional>",
"emoji": "<optional>"
},
"stickers": [
{
- "file": "<name of webp file, mandatory>",
+ "file": "<name of image file, mandatory>",
+ "contentType": "<optional>",
"emoji": "<optional>"
}
...