diff --git a/application/src/main/java/run/halo/app/content/HtmlThumbnailSrcsetInjector.java b/application/src/main/java/run/halo/app/content/HtmlThumbnailSrcsetInjector.java index 39f6cedab8..1cffc0756c 100644 --- a/application/src/main/java/run/halo/app/content/HtmlThumbnailSrcsetInjector.java +++ b/application/src/main/java/run/halo/app/content/HtmlThumbnailSrcsetInjector.java @@ -65,7 +65,7 @@ static String buildSizesAttr() { */ public static Mono generateSrcset(URI src, ThumbnailService thumbnailService) { return Flux.fromArray(ThumbnailSize.values()) - .flatMap(size -> thumbnailService.generate(src, size) + .flatMap(size -> thumbnailService.get(src, size) .map(thumbnail -> thumbnail.toString() + " " + size.getWidth() + "w") ) .collect(StringBuilder::new, (builder, srcsetValue) -> { diff --git a/application/src/main/java/run/halo/app/core/attachment/ThumbnailService.java b/application/src/main/java/run/halo/app/core/attachment/ThumbnailService.java index dfa1680008..e6e5d8500e 100644 --- a/application/src/main/java/run/halo/app/core/attachment/ThumbnailService.java +++ b/application/src/main/java/run/halo/app/core/attachment/ThumbnailService.java @@ -18,5 +18,16 @@ public interface ThumbnailService { */ Mono generate(URI imageUri, ThumbnailSize size); + /** + *

Get thumbnail by the given image uri and size.

+ *

It depends on the {@link #generate(URI, ThumbnailSize)} method, currently the thumbnail + * generation is limited to the attachment service, that is, the thumbnail is strongly + * associated with the attachment.

+ * + * @return if thumbnail exists, return the thumbnail uri, otherwise return the original image + * uri + */ + Mono get(URI imageUri, ThumbnailSize size); + Mono delete(URI imageUri); } diff --git a/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java b/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java index a499ebc006..f6a427a173 100644 --- a/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java @@ -55,6 +55,13 @@ public Mono generate(URI imageUri, ThumbnailSize size) { }); } + @Override + public Mono get(URI imageUri, ThumbnailSize size) { + return fetchThumbnail(imageUri, size) + .map(thumbnail -> URI.create(thumbnail.getSpec().getThumbnailUri())) + .defaultIfEmpty(imageUri); + } + @Override public Mono delete(URI imageUri) { Assert.notNull(imageUri, "Image uri must not be null"); diff --git a/application/src/main/java/run/halo/app/core/endpoint/theme/ThumbnailEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/ThumbnailEndpoint.java index 012bdd249c..0edc18e7fb 100644 --- a/application/src/main/java/run/halo/app/core/endpoint/theme/ThumbnailEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/ThumbnailEndpoint.java @@ -66,7 +66,7 @@ public RouterFunction endpoint() { private Mono getThumbnailByUri(ServerRequest request) { var query = new ThumbnailQuery(request.queryParams()); - return thumbnailService.generate(query.getUri(), query.getSize()) + return thumbnailService.get(query.getUri(), query.getSize()) .filterWhen(uri -> isAccessible(request, uri)) .defaultIfEmpty(query.getUri()) .flatMap(uri -> ServerResponse.temporaryRedirect(uri).build()); diff --git a/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java b/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java index e8eac936b8..9ea14868ad 100644 --- a/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java +++ b/application/src/main/java/run/halo/app/theme/finders/impl/ThumbnailFinderImpl.java @@ -18,7 +18,7 @@ public class ThumbnailFinderImpl implements ThumbnailFinder { @Override public Mono gen(String uriStr, String size) { return Mono.fromSupplier(() -> URI.create(uriStr)) - .flatMap(uri -> thumbnailService.generate(uri, ThumbnailSize.fromName(size))) + .flatMap(uri -> thumbnailService.get(uri, ThumbnailSize.fromName(size))) .map(URI::toString) .onErrorResume(Throwable.class, e -> { log.debug("Failed to generate thumbnail for [{}], error: [{}]", uriStr,