001
014
015 package com.liferay.portal.metadata;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.repository.model.FileEntry;
020 import com.liferay.portal.kernel.util.FileUtil;
021 import com.liferay.portal.kernel.util.StringBundler;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.kernel.util.Time;
024 import com.liferay.portal.kernel.xml.Element;
025 import com.liferay.portal.kernel.xuggler.XugglerUtil;
026 import com.liferay.portlet.documentlibrary.util.AudioProcessorUtil;
027 import com.liferay.portlet.documentlibrary.util.VideoProcessorUtil;
028 import com.liferay.portlet.exportimport.lar.PortletDataContext;
029
030 import com.xuggle.xuggler.IContainer;
031
032 import java.io.File;
033 import java.io.InputStream;
034
035 import java.text.DecimalFormat;
036
037 import org.apache.tika.metadata.Metadata;
038 import org.apache.tika.metadata.XMPDM;
039
040
044 public class XugglerRawMetadataProcessor extends BaseRawMetadataProcessor {
045
046 @Override
047 public void exportGeneratedFiles(
048 PortletDataContext portletDataContext, FileEntry fileEntry,
049 Element fileEntryElement) {
050 }
051
052 @Override
053 public void importGeneratedFiles(
054 PortletDataContext portletDataContext, FileEntry fileEntry,
055 FileEntry importedFileEntry, Element fileEntryElement) {
056 }
057
058 protected String convertTime(long microseconds) {
059 long milliseconds = microseconds / 1000L;
060
061 StringBundler sb = new StringBundler(7);
062
063 sb.append(_decimalFormatter.format(milliseconds / Time.HOUR));
064 sb.append(StringPool.COLON);
065 sb.append(
066 _decimalFormatter.format(milliseconds % Time.HOUR / Time.MINUTE));
067 sb.append(StringPool.COLON);
068 sb.append(
069 _decimalFormatter.format(milliseconds % Time.MINUTE / Time.SECOND));
070 sb.append(StringPool.PERIOD);
071 sb.append(_decimalFormatter.format(milliseconds % Time.SECOND / 10));
072
073 return sb.toString();
074 }
075
076 protected Metadata extractMetadata(File file) throws Exception {
077 IContainer container = IContainer.make();
078
079 try {
080 Metadata metadata = new Metadata();
081
082 if (container.open(
083 file.getCanonicalPath(), IContainer.Type.READ, null) < 0) {
084
085 throw new IllegalArgumentException("Could not open stream");
086 }
087
088 if (container.queryStreamMetaData() < 0) {
089 throw new IllegalStateException(
090 "Could not query stream metadata");
091 }
092
093 long microseconds = container.getDuration();
094
095 metadata.set(XMPDM.DURATION, convertTime(microseconds));
096
097 return metadata;
098 }
099 finally {
100 if (container.isOpened()) {
101 container.close();
102 }
103 }
104 }
105
106 @Override
107 protected Metadata extractMetadata(
108 String extension, String mimeType, File file) {
109
110 Metadata metadata = null;
111
112 if (!isSupported(mimeType)) {
113 return metadata;
114 }
115
116 try {
117 metadata = extractMetadata(file);
118 }
119 catch (Exception e) {
120 _log.error(e, e);
121 }
122
123 return metadata;
124 }
125
126 @Override
127 protected Metadata extractMetadata(
128 String extension, String mimeType, InputStream inputStream) {
129
130 Metadata metadata = null;
131
132 File file = null;
133
134 if (!isSupported(mimeType)) {
135 return metadata;
136 }
137
138 try {
139 file = FileUtil.createTempFile(extension);
140
141 FileUtil.write(file, inputStream);
142
143 metadata = extractMetadata(file);
144 }
145 catch (Exception e) {
146 _log.error(e, e);
147 }
148 finally {
149 FileUtil.delete(file);
150 }
151
152 return metadata;
153 }
154
155 protected boolean isSupported(String mimeType) {
156 if (XugglerUtil.isEnabled()) {
157 if (AudioProcessorUtil.isAudioSupported(mimeType)) {
158 return true;
159 }
160
161 if (VideoProcessorUtil.isVideoSupported(mimeType)) {
162 return true;
163 }
164 }
165
166 return false;
167 }
168
169 private static final Log _log = LogFactoryUtil.getLog(
170 XugglerRawMetadataProcessor.class);
171
172 private static final DecimalFormat _decimalFormatter = new DecimalFormat(
173 "00");
174
175 }