/** * Copyright 2011 Unicon (R) Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ package net.unicon.kaltura; import java.io.Serializable; import java.util.Comparator; import java.util.Date; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.kaltura.client.enums.KalturaMediaType; import com.kaltura.client.types.KalturaBaseEntry; import com.kaltura.client.types.KalturaMediaEntry; import com.kaltura.client.types.KalturaMixEntry; /** * This is a kaltura media item, it represents a kaltura item * * @author Aaron Zeckoski (azeckoski @ gmail.com) */ public class MediaItem implements Serializable { private static final long serialVersionUID = 2L; private static Log log = LogFactory.getLog(MediaItem.class); public static final String TYPE_IMAGE = "image"; public static final String TYPE_AUDIO = "audio"; public static final String TYPE_VIDEO = "video"; private static final int defaultWidgetWidth = 480; private static final int defaultWidgetHeight = 360; private static int kalturaPlayerImageWidth = MediaItem.defaultWidgetWidth; private static int kalturaPlayerImageHeight = MediaItem.defaultWidgetHeight; private static int kalturaPlayerAudioWidth = MediaItem.defaultWidgetWidth; private static int kalturaPlayerAudioHeight = 30; private static int kalturaPlayerVideoWidth = MediaItem.defaultWidgetWidth; private static int kalturaPlayerVideoHeight = MediaItem.defaultWidgetHeight; public static void setDefaultSizes( int kalturaPlayerImageWidth, int kalturaPlayerImageHeight, int kalturaPlayerAudioWidth, int kalturaPlayerAudioHeight, int kalturaPlayerVideoWidth, int kalturaPlayerVideoHeight ) { MediaItem.kalturaPlayerImageWidth = kalturaPlayerImageWidth; MediaItem.kalturaPlayerImageHeight = kalturaPlayerImageHeight; MediaItem.kalturaPlayerAudioWidth = kalturaPlayerAudioWidth; MediaItem.kalturaPlayerAudioHeight = kalturaPlayerAudioHeight; MediaItem.kalturaPlayerVideoWidth = kalturaPlayerVideoWidth; MediaItem.kalturaPlayerVideoHeight = kalturaPlayerVideoHeight; } private Long id; // internal id private String locationId; // Sakai site or group reference private String kalturaId; // kaltura identifier private String ownerId; // Sakai userId private String creatorId; // Sakai userId (assumed to be ownerId if not set) private Date dateCreated; private Date dateModified; private String type = TYPE_VIDEO; // non-persistent transient int kalturaPartnerId = 1111111; transient boolean media = false; transient boolean mix = false; // truncation settings transient int shortMaxName = 16; transient int shortMaxDesc = 50; transient int shortSpace = 3; // PERM - done public void setKalturaPartnerId(int kalturaPartnerId) { this.kalturaPartnerId = kalturaPartnerId; } transient String kalturaCDN = "http://cdn.kaltura.com"; public void setKalturaCDN(String kalturaCDN) { this.kalturaCDN = kalturaCDN; } transient KalturaBaseEntry kalturaItem; public KalturaBaseEntry getKalturaItem() { return kalturaItem; } public void setKalturaItem(KalturaBaseEntry kalturaItem) { this.kalturaItem = kalturaItem; if (this.type == null) { this.type = findType(); } if (kalturaItem != null) { this.kalturaId = kalturaItem.id; this.kalturaPartnerId = kalturaItem.partnerId; if (kalturaItem instanceof KalturaMixEntry) { media = false; mix = true; } else if (kalturaItem instanceof KalturaMediaEntry) { // assume KalturaMediaEntry media = true; mix = false; } else { // assume KalturaBaseEntry media = true; mix = false; log.warn("kaltura item (" + kalturaItem.id + "," + kalturaItem.name + ") is not mix or media: " + kalturaItem.getClass().getName()); } } } public boolean isPopulated() { return kalturaItem != null; } public boolean isMedia() { return media; } public boolean isMix() { // if (kalturaItem != null && kalturaItem.type != null) { // mix = KalturaEntryType.MIX.equals(kalturaItem.type); // } return mix; } public String getLocation() { // if (this.locationId == null && this.collection != null) { // return this.collection.getLocationId(); // lazy load most likely // } return this.locationId; } public String getIdStr() { if (this.id != null) { return this.id.toString(); } return null; } public String getName() { String name = this.kalturaId; if (kalturaItem != null && kalturaItem.name != null) { name = kalturaItem.name; } return name; } public String getShortName() { return MediaItem.truncateText(getName(), shortMaxName, shortSpace); } public String getDesc() { String desc = ""; if (kalturaItem != null && kalturaItem.description != null) { desc = kalturaItem.description; } return desc; } public String getShortDesc() { return MediaItem.truncateText(getDesc(), shortMaxDesc, shortSpace); } public int getDuration() { int duration = 0; if (kalturaItem != null) { if (kalturaItem instanceof KalturaMediaEntry) { duration = ((KalturaMediaEntry) kalturaItem).duration; } else if (kalturaItem instanceof KalturaMixEntry) { duration = ((KalturaMixEntry) kalturaItem).duration; } if (duration < 0) { duration = 0; } } return duration; } public Date getDate() { Date d = new Date(); if (kalturaItem != null && kalturaItem.createdAt > 0) { long time = (long) kalturaItem.createdAt * 1000l; d = new Date(time); } return d; } public int getWidth() { int width = MediaItem.defaultWidgetWidth; if (kalturaItem != null) { if (kalturaItem instanceof KalturaMediaEntry) { width = ((KalturaMediaEntry) kalturaItem).width; } else if (kalturaItem instanceof KalturaMixEntry) { width = ((KalturaMixEntry) kalturaItem).width; } if (width <= 0) { String type = findType(); if (TYPE_AUDIO.equals(type)) { width = MediaItem.kalturaPlayerAudioWidth; } else if (TYPE_IMAGE.equals(type)) { width = MediaItem.kalturaPlayerImageWidth; } else { width = MediaItem.kalturaPlayerVideoWidth; } } } return width; } public int getHeight() { int height = MediaItem.defaultWidgetHeight; if (kalturaItem != null) { if (kalturaItem instanceof KalturaMediaEntry) { height = ((KalturaMediaEntry) kalturaItem).height; } else if (kalturaItem instanceof KalturaMixEntry) { height = ((KalturaMixEntry) kalturaItem).height; } if (height <= 0) { String type = findType(); if (TYPE_AUDIO.equals(type)) { height = MediaItem.kalturaPlayerAudioHeight; } else if (TYPE_IMAGE.equals(type)) { height = MediaItem.kalturaPlayerImageHeight; } else { height = MediaItem.kalturaPlayerVideoHeight; } } } return height; } public String findType() { String type = TYPE_VIDEO; if (kalturaItem != null) { if (kalturaItem instanceof KalturaMediaEntry) { KalturaMediaEntry kme = (KalturaMediaEntry) kalturaItem; if (KalturaMediaType.AUDIO.equals(kme.mediaType)) { type = TYPE_AUDIO; } else if (KalturaMediaType.IMAGE.equals(kme.mediaType)) { type = TYPE_IMAGE; } } } else { if (this.type != null) { type = this.type; } } return type; } public String getMediaType() { return findType(); } public String getThumbnail() { String url = this.kalturaCDN + "/p/" + this.kalturaPartnerId + "/thumbnail/width/120/height/90/entry_id/" + this.kalturaId; if (kalturaItem != null && kalturaItem.thumbnailUrl != null) { url = kalturaItem.thumbnailUrl; } return url; } /** * @return the URL which can be used to download the media content */ public String getDownloadURL() { /* * Instructions from Kaltura Download Button: currently the URL (which I guess you take from * the 'get' response) is something like: ���� * http://cdnbakmi.kaltura.com/p/166762/sp/16676200/raw/entry_id/1_nkkzp8z4/version/0 * concatenating '/file_name/1_nkkzp8z4' so the URL is actually adding the 'file_name' * parameter to the request which simply adds 'content-disposition' header to the response. * the 'content-disposition' is what forces the browser to open the 'open/save as' dialog. * after the concatenation the URL would look like: ���� * http://cdnbakmi.kaltura.com/p/166762 * /sp/16676200/raw/entry_id/1_nkkzp8z4/version/0/file_name/1_nkkzp8z4 */ String suffix = "/file_name/" + this.kalturaId; // this forces the mime-type from kaltura // server to be correct for download String url = this.kalturaCDN + "/p/" + this.kalturaPartnerId + "/raw/entry_id/" + this.kalturaId + suffix; if (kalturaItem != null && kalturaItem.thumbnailUrl != null) { url = kalturaItem.downloadUrl + suffix; } return url; } public String[] getTags() { String[] tags = new String[0]; if (kalturaItem != null && kalturaItem.tags != null) { tags = StringUtils.split(kalturaItem.tags, ", "); } return tags; } /** * @return the creator user id for this media item */ public String getCreatorUserId() { String creator = this.creatorId; if (creator == null) { creator = this.ownerId; } return creator; } /** * Default constructor */ public MediaItem() { this.dateCreated = new Date(); this.dateModified = this.dateCreated; } public MediaItem(KalturaBaseEntry kbe, String ownerId) { this(); this.ownerId = ownerId; this.creatorId = ownerId; this.setKalturaItem(kbe); } public MediaItem(String locationId, String kalturaId, String ownerId) { this(); this.locationId = locationId; this.kalturaId = kalturaId; this.ownerId = ownerId; this.creatorId = ownerId; } public static class MediaItemNameComparator implements Comparator<MediaItem>, Serializable { static private final long serialVersionUID = 31L; public int compare(MediaItem o1, MediaItem o2) { int comparison = 0; if (o1.getName() != null && o2.getName() != null) { comparison = o1.getName().compareTo(o2.getName()); } if (comparison == 0 && o1.getId() != null && o2.getId() != null) { comparison = o1.getId().compareTo(o2.getId()); } return comparison; } } private static String truncateSuffix = "..."; public static String truncateText(String text, int maxChars, int reverseSpaceChars) { String truncated = text; if (maxChars <= 0) { maxChars = 50; } if (text != null && text.length() > maxChars) { boolean reverseFind = false; if (reverseSpaceChars > 0) { int pos = text.lastIndexOf(' ', maxChars); if (pos > (maxChars - reverseSpaceChars)) { truncated = text.substring(0, pos); reverseFind = true; } } if (!reverseFind) { truncated = text.substring(0, maxChars - 3); } truncated = truncated + truncateSuffix; } return truncated; } @Override public String toString() { return "{MI:" + id + ":t=" + type + ":o=" + ownerId + ":c=" + creatorId + "}"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MediaItem other = (MediaItem) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } /** * Getters and Setters */ public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getKalturaId() { return kalturaId; } public void setKalturaId(String kalturaId) { this.kalturaId = kalturaId; } public String getOwnerId() { return ownerId; } public void setOwnerId(String ownerId) { this.ownerId = ownerId; } public Date getDateCreated() { return dateCreated; } public void setDateCreated(Date dateCreated) { this.dateCreated = dateCreated; } public Date getDateModified() { return dateModified; } public void setDateModified(Date dateModified) { this.dateModified = dateModified; } public String getLocationId() { return locationId; } public void setLocationId(String locationId) { this.locationId = locationId; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getCreatorId() { return creatorId; } public void setCreatorId(String creatorId) { this.creatorId = creatorId; } }