mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-28 06:47:15 +00:00
Using new media model
This commit is contained in:
1 parent
9ed8dc8395
commit
dc87e7bbf3
3 files changed
+70
-105
No files matched your search
+26
-44
@@ -14,9 +14,6 @@ import java.util.Map.Entry;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.osgi.framework.BundleContext;
|
||||
import org.osgi.util.tracker.ServiceTracker;
|
||||
@@ -43,7 +40,6 @@ import com.sap.sailing.gwt.ui.shared.general.EventMetadataDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.general.EventReferenceDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.general.EventState;
|
||||
import com.sap.sailing.gwt.ui.shared.media.MediaDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.media.MediaUtils;
|
||||
import com.sap.sailing.gwt.ui.shared.media.SailingImageDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.media.SailingVideoDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.start.EventStageDTO;
|
||||
@@ -57,9 +53,10 @@ import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sse.common.impl.TimeRangeImpl;
|
||||
import com.sap.sse.common.media.ImageSize;
|
||||
import com.sap.sse.common.media.ImageDescriptor;
|
||||
import com.sap.sse.common.media.MediaType;
|
||||
import com.sap.sse.common.media.MimeType;
|
||||
import com.sap.sse.common.media.VideoDescriptor;
|
||||
import com.sap.sse.util.ServiceTrackerFactory;
|
||||
|
||||
/**
|
||||
@@ -93,7 +90,6 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = 3947782997746039939L;
|
||||
private static final Logger logger = Logger.getLogger(HomeServiceImpl.class.getName());
|
||||
|
||||
private static final int MAX_STAGE_EVENTS = 5;
|
||||
private static final int MAX_RECENT_EVENTS = 3;
|
||||
@@ -183,14 +179,14 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
|
||||
|
||||
EventReferenceDTO eventRef = new EventReferenceDTO(holder.event);
|
||||
|
||||
Iterable<URL> videosOfEvent = holder.event.getVideoURLs();
|
||||
Iterable<VideoDescriptor> videosOfEvent = holder.event.getVideos();
|
||||
if (!Util.isEmpty(videosOfEvent) && result.getVideos().size() < MAX_VIDEO_COUNT) {
|
||||
URL youTubeRandomUrl = HomeServiceUtil.getRandomURL(videosOfEvent);
|
||||
VideoDescriptor youTubeRandomUrl = HomeServiceUtil.getRandomVideo(videosOfEvent);
|
||||
|
||||
MimeType type = MediaUtils.detectMimeTypeFromUrl(youTubeRandomUrl.toString());
|
||||
MimeType type = youTubeRandomUrl.getMimeType();
|
||||
if (type.mediaType == MediaType.video) {
|
||||
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, youTubeRandomUrl.toString(), type, //
|
||||
holder.event.getEndDate().asDate() // FIXME: using event enddate for now
|
||||
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, youTubeRandomUrl.getURL().toString(), type, //
|
||||
youTubeRandomUrl.getCreatedAtDate().asDate()
|
||||
);
|
||||
candidate.setTitle(holder.event.getName());
|
||||
result.addVideo(candidate);
|
||||
@@ -217,25 +213,18 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
|
||||
EventBase event = holder.event;
|
||||
EventReferenceDTO eventRef = new EventReferenceDTO(holder.event);
|
||||
|
||||
for (URL url : HomeServiceUtil.getSailingLovesPhotographyImages(event)) {
|
||||
try {
|
||||
ImageSize imageSize = event.getImageSize(url);
|
||||
if(imageSize != null) {
|
||||
SailingImageDTO sailingImageDTO = new SailingImageDTO(eventRef, url.toString(), null);
|
||||
if (imageSize != null) {
|
||||
sailingImageDTO.setSizeInPx(imageSize.getWidth(), imageSize.getHeight());
|
||||
photoGalleryUrls.add(sailingImageDTO);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
for (ImageDescriptor url : HomeServiceUtil.getSailingLovesPhotographyImages(event)) {
|
||||
if(url.getWidthInPx() != null && url.getHeightInPx() != null) {
|
||||
SailingImageDTO sailingImageDTO = new SailingImageDTO(eventRef, url.getURL().toString(), null);
|
||||
sailingImageDTO.setSizeInPx(url.getWidthInPx(), url.getHeightInPx());
|
||||
photoGalleryUrls.add(sailingImageDTO);
|
||||
}
|
||||
}
|
||||
for (URL videoUrl : event.getVideoURLs()) {
|
||||
|
||||
MimeType type = MediaUtils.detectMimeTypeFromUrl(videoUrl.toString());
|
||||
for (VideoDescriptor videoUrl : event.getVideos()) {
|
||||
MimeType type =videoUrl.getMimeType();
|
||||
if (type.mediaType == MediaType.video) {
|
||||
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, videoUrl.toString(), type, //
|
||||
holder.event.getEndDate().asDate() // FIXME: using event enddate for now
|
||||
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, videoUrl.getURL().toString(), type, //
|
||||
videoUrl.getCreatedAtDate().asDate()
|
||||
);
|
||||
candidate.setTitle(holder.event.getName());
|
||||
videoCandidates.add(candidate);
|
||||
@@ -428,27 +417,20 @@ public class HomeServiceImpl extends ProxiedRemoteServiceServlet implements Home
|
||||
EventReferenceDTO eventRef = new EventReferenceDTO(event);
|
||||
|
||||
String eventName = event.getName();
|
||||
// TODO implement correctly and fill metadata
|
||||
MediaDTO media = new MediaDTO();
|
||||
for(URL url : HomeServiceUtil.getPhotoGalleryImageURLs(event)) {
|
||||
ImageSize imageSize = null;
|
||||
try {
|
||||
imageSize = event.getImageSize(url);
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
logger.log(Level.FINE, "Was unable to obtain image size for "+url+" earlier.", e);
|
||||
}
|
||||
// FIXME: using the event end date for 'createdAtDate' for now, we need a better solution for migration
|
||||
SailingImageDTO entry = new SailingImageDTO(eventRef, url.toString(), event.getEndDate().asDate());
|
||||
if (imageSize != null) {
|
||||
entry.setSizeInPx(imageSize.getWidth(), imageSize.getHeight());
|
||||
}
|
||||
entry.setTitle(eventName);
|
||||
for(ImageDescriptor image : HomeServiceUtil.getPhotoGalleryImages(event)) {
|
||||
SailingImageDTO entry = new SailingImageDTO(eventRef, image.getURL().toString(), image.getCreatedAtDate().asDate());
|
||||
entry.setSizeInPx(image.getWidthInPx(), image.getHeightInPx());
|
||||
entry.setTitle(image.getTitle() != null ? image.getTitle(): eventName);
|
||||
entry.setSubtitle(image.getSubtitle());
|
||||
entry.setTags(image.getTags());
|
||||
entry.setCopyright(image.getCopyright());
|
||||
media.addPhoto(entry);
|
||||
}
|
||||
for(URL url : event.getVideoURLs()) {
|
||||
MimeType type = MediaUtils.detectMimeTypeFromUrl(url.toString());
|
||||
for(VideoDescriptor url : event.getVideos()) {
|
||||
MimeType type = url.getMimeType();
|
||||
if (type.mediaType == MediaType.video) {
|
||||
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, url.toString(), type, null);
|
||||
SailingVideoDTO candidate = new SailingVideoDTO(eventRef, url.getURL().toString(), type, null);
|
||||
media.addVideo(candidate);
|
||||
}
|
||||
}
|
||||
|
||||
+40
-59
@@ -1,6 +1,5 @@
|
||||
package com.sap.sailing.gwt.server;
|
||||
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
@@ -27,7 +26,6 @@ import com.sap.sailing.gwt.ui.shared.general.EventState;
|
||||
import com.sap.sailing.gwt.ui.shared.media.MediaConstants;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.media.ImageDescriptor;
|
||||
import com.sap.sse.common.media.ImageSize;
|
||||
import com.sap.sse.common.media.MediaDescriptor;
|
||||
import com.sap.sse.common.media.MimeType;
|
||||
import com.sap.sse.common.media.VideoDescriptor;
|
||||
@@ -37,12 +35,10 @@ public final class HomeServiceUtil {
|
||||
}
|
||||
|
||||
private static final int MINIMUM_IMAGE_HEIGHT_FOR_SAILING_PHOTOGRAPHY_IN_PIXELS = 500;
|
||||
private static final String STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE = "stage";
|
||||
private static final String THUMBNAIL_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE = "eventteaser";
|
||||
|
||||
public static String findEventThumbnailImageUrlAsString(EventBase event) {
|
||||
URL url = findEventThumbnailImageUrl(event);
|
||||
return url == null ? null : url.toString();
|
||||
ImageDescriptor url = findEventThumbnailImage(event);
|
||||
return url == null ? null : url.getURL().toString();
|
||||
}
|
||||
|
||||
public static boolean isFakeSeries(EventBase event) {
|
||||
@@ -104,47 +100,43 @@ public final class HomeServiceUtil {
|
||||
return EventState.RUNNING;
|
||||
}
|
||||
|
||||
private static URL findEventThumbnailImageUrl(EventBase event) {
|
||||
private static ImageDescriptor findEventThumbnailImage(EventBase event) {
|
||||
|
||||
final class ImageHolder {
|
||||
|
||||
final int PERFECT_HEIGHT = 240;
|
||||
final int PERFECT_WIDTH = 370;
|
||||
final double PERFECT_RATIO = PERFECT_HEIGHT / (double) PERFECT_WIDTH;
|
||||
final URL url;
|
||||
final int height;
|
||||
final int width;
|
||||
final int size;
|
||||
final double ratio;
|
||||
final ImageDescriptor image;
|
||||
final boolean stage;
|
||||
|
||||
ImageHolder() {
|
||||
this(null, null);
|
||||
this(null);
|
||||
}
|
||||
|
||||
ImageHolder(URL url, ImageSize imageSize) {
|
||||
this(url, imageSize == null ? -1 : imageSize.getWidth(), imageSize == null ? -1 : imageSize.getHeight());
|
||||
}
|
||||
|
||||
ImageHolder(URL url, int width, int height) {
|
||||
this.url = url;
|
||||
this.height = height;
|
||||
this.width = width;
|
||||
if(width == -1 || height == -1) {
|
||||
this.size = -1;
|
||||
ImageHolder(ImageDescriptor image) {
|
||||
this.image = image;
|
||||
this.stage = image == null ? false : hasTag(image, MediaConstants.STAGE);
|
||||
this.height = image == null || image.getHeightInPx() == null ? 0 : image.getHeightInPx();
|
||||
this.width = image == null || image.getWidthInPx() == null ? 0 : image.getWidthInPx();
|
||||
this.size = height * width;
|
||||
if(width == 0) {
|
||||
this.ratio = -1;
|
||||
} else {
|
||||
this.size = height * width;
|
||||
this.ratio = height / (double) width;
|
||||
}
|
||||
}
|
||||
|
||||
boolean isBetterWorstcaseThan(ImageHolder otherImageHolder) {
|
||||
|
||||
if (isNull()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.url != null && url.toString().contains(STAGE_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) {
|
||||
if (stage) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -179,13 +171,13 @@ public final class HomeServiceUtil {
|
||||
}
|
||||
|
||||
boolean isNull() {
|
||||
return size == -1;
|
||||
return image == null;
|
||||
}
|
||||
}
|
||||
|
||||
// search for name pattern
|
||||
for (URL imageUrl : event.getImageURLs()) {
|
||||
if (imageUrl.toString().toLowerCase().contains(THUMBNAIL_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) {
|
||||
for (ImageDescriptor imageUrl : event.getImages()) {
|
||||
if (hasTag(imageUrl, MediaConstants.TEASER)) {
|
||||
return imageUrl;
|
||||
}
|
||||
}
|
||||
@@ -193,16 +185,11 @@ public final class HomeServiceUtil {
|
||||
ImageHolder actualWorstcase = new ImageHolder();
|
||||
ImageHolder bestFit = new ImageHolder();
|
||||
|
||||
for (URL candidateImageUrl : getPhotoGalleryImageURLs(event)) {
|
||||
ImageHolder candidate;
|
||||
try {
|
||||
candidate = new ImageHolder(candidateImageUrl, event.getImageSize(candidateImageUrl));
|
||||
} catch (Exception e) {
|
||||
candidate = new ImageHolder(candidateImageUrl, -1, -1);
|
||||
}
|
||||
for (ImageDescriptor candidateImage : getPhotoGalleryImages(event)) {
|
||||
ImageHolder candidate = new ImageHolder(candidateImage);
|
||||
|
||||
if (candidate.isPerfectFit()) {
|
||||
return candidate.url;
|
||||
return candidate.image;
|
||||
}
|
||||
|
||||
if (candidate.fitsRatio() && candidate.isBigEnough()) {
|
||||
@@ -218,10 +205,10 @@ public final class HomeServiceUtil {
|
||||
}
|
||||
|
||||
if (!bestFit.isNull()) {
|
||||
return bestFit.url;
|
||||
return bestFit.image;
|
||||
}
|
||||
if (!actualWorstcase.isNull()) {
|
||||
return actualWorstcase.url;
|
||||
return actualWorstcase.image;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -296,44 +283,38 @@ public final class HomeServiceUtil {
|
||||
}
|
||||
|
||||
public static List<String> getPhotoGalleryImageURLsAsString(EventBase event) {
|
||||
List<URL> urls = getPhotoGalleryImageURLs(event);
|
||||
List<ImageDescriptor> urls = getPhotoGalleryImages(event);
|
||||
List<String> result = new ArrayList<String>(urls.size());
|
||||
for (URL url : urls) {
|
||||
result.add(url.toString());
|
||||
for (ImageDescriptor url : urls) {
|
||||
result.add(url.getURL().toString());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static List<URL> getPhotoGalleryImageURLs(EventBase event) {
|
||||
public static List<ImageDescriptor> getPhotoGalleryImages(EventBase event) {
|
||||
ImageDescriptor stageImage = getStageImage(event); // if set, exclude stage image from photo gallery
|
||||
URL stageImageURL = stageImage == null ? null : stageImage.getURL();
|
||||
List<URL> result = new ArrayList<>();
|
||||
Iterable<URL> imageURLs = event.getImageURLs();
|
||||
List<ImageDescriptor> result = new ArrayList<>();
|
||||
Iterable<ImageDescriptor> imageURLs = event.getImages();
|
||||
|
||||
boolean first = true;
|
||||
for (Iterator<URL> iter = imageURLs.iterator(); iter.hasNext(); ) {
|
||||
URL imageUrl = iter.next();
|
||||
if(imageUrl.toString().toLowerCase().contains(THUMBNAIL_IMAGE_URL_SUBSTRING_INDICATOR_CASE_INSENSITIVE)) {
|
||||
for (Iterator<ImageDescriptor> iter = imageURLs.iterator(); iter.hasNext(); ) {
|
||||
ImageDescriptor image = iter.next();
|
||||
if(hasTag(image, MediaConstants.TEASER)) {
|
||||
continue;
|
||||
}
|
||||
if ((first && !iter.hasNext()) || !Util.equalsWithNull(imageUrl, stageImageURL)) {
|
||||
result.add(imageUrl);
|
||||
if ((first && !iter.hasNext()) || !Util.equalsWithNull(image, stageImage)) {
|
||||
result.add(image);
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static List<URL> getSailingLovesPhotographyImages(EventBase event) {
|
||||
final List<URL> acceptedImages = new LinkedList<>();
|
||||
for (URL candidateImageUrl : event.getImageURLs()) {
|
||||
try {
|
||||
ImageSize imageSize = event.getImageSize(candidateImageUrl);
|
||||
if (imageSize != null && imageSize.getHeight() > MINIMUM_IMAGE_HEIGHT_FOR_SAILING_PHOTOGRAPHY_IN_PIXELS) {
|
||||
acceptedImages.add(candidateImageUrl);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// TODO what should we do here?
|
||||
public static List<ImageDescriptor> getSailingLovesPhotographyImages(EventBase event) {
|
||||
final List<ImageDescriptor> acceptedImages = new LinkedList<>();
|
||||
for (ImageDescriptor candidateImageUrl : event.getImages()) {
|
||||
if (candidateImageUrl.getWidthInPx() != null && candidateImageUrl.getHeightInPx() != null && candidateImageUrl.getHeightInPx() > MINIMUM_IMAGE_HEIGHT_FOR_SAILING_PHOTOGRAPHY_IN_PIXELS) {
|
||||
acceptedImages.add(candidateImageUrl);
|
||||
}
|
||||
}
|
||||
return acceptedImages;
|
||||
@@ -396,7 +377,7 @@ public final class HomeServiceUtil {
|
||||
}
|
||||
|
||||
public static boolean hasVideos(Event event) {
|
||||
return !Util.isEmpty(event.getVideoURLs());
|
||||
return !Util.isEmpty(event.getVideos());
|
||||
}
|
||||
|
||||
public static boolean isPartOfEvent(Event event, Regatta regattaEntity) {
|
||||
@@ -408,7 +389,7 @@ public final class HomeServiceUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static URL getRandomURL(Iterable<URL> urls) {
|
||||
public static VideoDescriptor getRandomVideo(Iterable<VideoDescriptor> urls) {
|
||||
if(Util.isEmpty(urls)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -76,8 +76,10 @@ public abstract class AbstractMediaDTO implements IsSerializable {
|
||||
return tags;
|
||||
}
|
||||
|
||||
public void setTags(List<String> tags) {
|
||||
this.tags = tags;
|
||||
public void setTags(Iterable<String> tags) {
|
||||
for(String tag: tags) {
|
||||
this.tags.add(tag);
|
||||
}
|
||||
}
|
||||
|
||||
public String getSourceRef() {
|
||||
|
||||
Reference in new issue
Block a user