From: <fg...@us...> - 2010-02-14 19:35:56
|
Revision: 1927 http://openutils.svn.sourceforge.net/openutils/?rev=1927&view=rev Author: fgiust Date: 2010-02-14 19:35:48 +0000 (Sun, 14 Feb 2010) Log Message: ----------- MEDIA-98 Parsing of flv metadata for external videos only works for youtube Modified Paths: -------------- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseVideoTypeHandler.java trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/ExternalVideoTypeHandler.java trunk/openutils-mgnlmedia/src/main/resources/mgnl-bootstrap-samples/media/media.samples.xml trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties Added Paths: ----------- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/ trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/ExternalVideoSupport.java trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/YoutubeSupport.java Added: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/ExternalVideoSupport.java =================================================================== --- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/ExternalVideoSupport.java (rev 0) +++ trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/ExternalVideoSupport.java 2010-02-14 19:35:48 UTC (rev 1927) @@ -0,0 +1,36 @@ +/** + * + * Magnolia SimpleMedia Module (http://www.openmindlab.com/lab/products/media.html) + * Copyright (C)2008 - 2010, Openmind S.r.l. http://www.openmindonline.it + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package net.sourceforge.openutils.mgnlmedia.media.types.externals; + +/** + * @author fgiust + * @version $Id$ + */ +public interface ExternalVideoSupport +{ + + boolean canHandle(String url); + + String getFlvUrl(String shareUrl); + + String getPreviewUrl(String shareUrl); + + String getMediaName(String shareUrl); +} Property changes on: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/ExternalVideoSupport.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/YoutubeSupport.java =================================================================== --- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/YoutubeSupport.java (rev 0) +++ trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/YoutubeSupport.java 2010-02-14 19:35:48 UTC (rev 1927) @@ -0,0 +1,119 @@ +/** + * + * Magnolia SimpleMedia Module (http://www.openmindlab.com/lab/products/media.html) + * Copyright (C)2008 - 2010, Openmind S.r.l. http://www.openmindonline.it + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package net.sourceforge.openutils.mgnlmedia.media.types.externals; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * @author fgiust + * @version $Id$ + */ +public class YoutubeSupport implements ExternalVideoSupport +{ + + /** + * Logger. + */ + private Logger log = LoggerFactory.getLogger(YoutubeSupport.class); + + public boolean canHandle(String url) + { + return StringUtils.startsWith(url, "http://www.youtube"); + } + + public String getFlvUrl(String shareUrl) + { + String flvUrl = null; + BufferedReader in = null; + try + { + String videoId = getVideoId(StringUtils.substringAfter(shareUrl, "?")); + String videoInfoUrl = "http://www.youtube.com/get_video_info?video_id=" + videoId; + URL url = new URL(videoInfoUrl); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + if (httpConn.getResponseCode() == 200) + { + in = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); + String line; + String search = "&token="; + while ((line = in.readLine()) != null) + { + int p = line.indexOf(search); + if (p != -1) + { + String token = StringUtils.substringBefore(line.substring(p + search.length()), "&"); + flvUrl = "http://www.youtube.com/get_video?fmt=5&video_id=" + videoId + "&t=" + token; + break; + } + } + } + } + catch (MalformedURLException e) + { + log.error(e.getMessage(), e); + } + catch (IOException e) + { + log.error(e.getMessage(), e); + } + finally + { + IOUtils.closeQuietly(in); + } + return flvUrl; + } + + public String getPreviewUrl(String shareUrl) + { + return "http://img.youtube.com/vi/" + getVideoId(shareUrl) + "/0.jpg"; + } + + private String getVideoId(String shareUrl) + { + for (String att : StringUtils.split(StringUtils.substringAfter(shareUrl, "?"), "&")) + { + if (att.startsWith("v=")) + { + return StringUtils.substringAfter(att, "v="); + } + } + return null; + } + + /** + * {@inheritDoc} + */ + public String getMediaName(String shareUrl) + { + return getVideoId(shareUrl); + } + +} Property changes on: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/externals/YoutubeSupport.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseVideoTypeHandler.java =================================================================== --- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseVideoTypeHandler.java 2010-02-14 18:49:18 UTC (rev 1926) +++ trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/BaseVideoTypeHandler.java 2010-02-14 19:35:48 UTC (rev 1927) @@ -98,6 +98,12 @@ info.put(METADATA_DURATION, MediaMetadataFormatUtils.formatDuration(duration)); } + long framerate = media.getNodeData(METADATA_FRAMERATE).getLong(); + if (framerate > 0) + { + info.put(METADATA_FRAMERATE, Long.toString(framerate)); + } + return info; } Modified: trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/ExternalVideoTypeHandler.java =================================================================== --- trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/ExternalVideoTypeHandler.java 2010-02-14 18:49:18 UTC (rev 1926) +++ trunk/openutils-mgnlmedia/src/main/java/net/sourceforge/openutils/mgnlmedia/media/types/impl/ExternalVideoTypeHandler.java 2010-02-14 19:35:48 UTC (rev 1927) @@ -22,12 +22,7 @@ import info.magnolia.cms.beans.runtime.MultipartForm; import info.magnolia.cms.core.Content; -import java.io.BufferedReader; import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; import java.net.URL; import java.util.Map; import java.util.UUID; @@ -36,10 +31,12 @@ import javax.jcr.RepositoryException; import javax.servlet.http.HttpServletRequest; +import net.sourceforge.openutils.mgnlmedia.media.types.externals.ExternalVideoSupport; +import net.sourceforge.openutils.mgnlmedia.media.types.externals.YoutubeSupport; import net.sourceforge.openutils.mgnlmedia.media.utils.FLVMedataUtils; import net.sourceforge.openutils.mgnlmedia.media.utils.FLVMedataUtils.FLVMetaData; -import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,6 +56,11 @@ private final Logger log = LoggerFactory.getLogger(ExternalVideoTypeHandler.class); /** + * External video support, will be made configurable in future versions. + */ + private ExternalVideoSupport[] videoSupportHandlers = new ExternalVideoSupport[]{new YoutubeSupport() }; + + /** * {@inheritDoc} */ @Override @@ -98,108 +100,75 @@ @Override public String getNewNodeName(MultipartForm form, HttpServletRequest request) { - String videoUrl = request.getParameter("videoUrl"); - String id = UUID.randomUUID().toString(); - URL url; + String videoUrl = StringUtils.lowerCase(request.getParameter("videoUrl")); + String nodeName = null; - // todo: this is specific for youtube, check vimeo or blip.tv - try + for (ExternalVideoSupport external : videoSupportHandlers) { - url = new URL(videoUrl); - String query = url.getQuery(); - if (query != null) + if (external.canHandle(videoUrl)) { - String videoId = getVideoId(url.getQuery()); - if (videoId != null) + nodeName = external.getMediaName(videoUrl); + break; + } + } + + if (StringUtils.isEmpty(nodeName)) + { + if (StringUtils.contains(videoUrl, ".flv")) + { + nodeName = StringUtils.substringBefore(videoUrl, ".flv"); + if (StringUtils.contains(nodeName, "/")) { - id = videoId; + nodeName = StringUtils.substringBeforeLast(nodeName, "/"); } + if (StringUtils.contains(nodeName, "=")) + { + nodeName = StringUtils.substringBeforeLast(nodeName, "="); + } } else { - id = StringUtils.substringAfterLast(videoUrl, "/"); + nodeName = StringUtils.substringBefore(StringUtils.substringAfterLast(videoUrl, "/"), "?"); + } } - catch (MalformedURLException e) + + if (StringUtils.isEmpty(nodeName)) { - log.error("Error parsing external video url", e); + nodeName = UUID.randomUUID().toString(); } - return id; + return nodeName; } - private String getVideoId(String queryString) + @Override + protected FLVMetaData parseFLVMetaData(Content media) throws Exception { - for (String att : StringUtils.split(queryString, "&")) + String downloadUrl = getUrl(media); + for (ExternalVideoSupport external : videoSupportHandlers) { - if (att.startsWith("v=")) + if (external.canHandle(downloadUrl)) { - return StringUtils.substringAfter(att, "v="); + downloadUrl = external.getFlvUrl(downloadUrl); + break; } } - return null; - } - @Override - protected FLVMetaData parseFLVMetaData(Content media) throws Exception - { - String downloadUrl = determineFLVurl(media); - if (downloadUrl == null) - { - return null; - } - return FLVMedataUtils.parseFLVfromUrl(new URL(downloadUrl)); - } - - private String determineFLVurl(Content media) - { - // todo: this is specific for youtube, check vimeo or blip.tv - return determineFLVurlForYoutube(media); - } - - private String determineFLVurlForYoutube(Content media) - { - String flvUrl = null; - BufferedReader in = null; try { - String videoUrl = getUrl(media); - String videoId = getVideoId(StringUtils.substringAfter(videoUrl, "?")); - String videoInfoUrl = "http://www.youtube.com/get_video_info?video_id=" + videoId; - URL url = new URL(videoInfoUrl); - HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); - if (httpConn.getResponseCode() == 200) - { - in = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); - String line; - String search = "&token="; - while ((line = in.readLine()) != null) - { - int p = line.indexOf(search); - if (p != -1) - { - String token = StringUtils.substringBefore(line.substring(p + search.length()), "&"); - flvUrl = "http://www.youtube.com/get_video?fmt=5&video_id=" - + videoId - + "&t=" - + token; - break; - } - } - } + URL url = new URL(downloadUrl); + return FLVMedataUtils.parseFLVfromUrl(url); } - catch (MalformedURLException e) + catch (Throwable e) { - log.error(e.getMessage(), e); + log.warn("Got a " + + ClassUtils.getShortClassName(e.getClass()) + + " (" + + e.getMessage() + + ") while parsing URL " + + downloadUrl); + return null; } - catch (IOException e) - { - log.error(e.getMessage(), e); - } - finally - { - IOUtils.closeQuietly(in); - } - return flvUrl; } + } Modified: trunk/openutils-mgnlmedia/src/main/resources/mgnl-bootstrap-samples/media/media.samples.xml =================================================================== --- trunk/openutils-mgnlmedia/src/main/resources/mgnl-bootstrap-samples/media/media.samples.xml 2010-02-14 18:49:18 UTC (rev 1926) +++ trunk/openutils-mgnlmedia/src/main/resources/mgnl-bootstrap-samples/media/media.samples.xml 2010-02-14 19:35:48 UTC (rev 1927) @@ -17,19 +17,19 @@ <sv:value>true</sv:value> </sv:property> <sv:property sv:name="mgnl:activatorid" sv:type="String"> - <sv:value>admin</sv:value> + <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:authorid" sv:type="String"> <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:creationdate" sv:type="Date"> - <sv:value>2008-07-02T12:46:12.918Z</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> <sv:property sv:name="mgnl:lastaction" sv:type="Date"> - <sv:value>2009-12-30T16:29:28.741+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> <sv:property sv:name="mgnl:lastmodified" sv:type="Date"> - <sv:value>2009-12-30T16:29:28.741+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> </sv:node> <sv:node sv:name="bliptv"> @@ -48,6 +48,21 @@ <sv:property sv:name="description" sv:type="String"> <sv:value>External video sample, loaded from blip.tv</sv:value> </sv:property> + <sv:property sv:name="media_duration" sv:type="Long"> + <sv:value>71</sv:value> + </sv:property> + <sv:property sv:name="media_extension" sv:type="String"> + <sv:value>flv</sv:value> + </sv:property> + <sv:property sv:name="media_framerate" sv:type="Double"> + <sv:value>15.0</sv:value> + </sv:property> + <sv:property sv:name="media_height" sv:type="Long"> + <sv:value>480</sv:value> + </sv:property> + <sv:property sv:name="media_width" sv:type="Double"> + <sv:value>640.0</sv:value> + </sv:property> <sv:property sv:name="tags" sv:type="String"> <sv:value>simple media, youtube</sv:value> </sv:property> @@ -64,18 +79,24 @@ <sv:property sv:name="jcr:primaryType" sv:type="Name"> <sv:value>mgnl:metaData</sv:value> </sv:property> + <sv:property sv:name="mgnl:activated" sv:type="Boolean"> + <sv:value>true</sv:value> + </sv:property> + <sv:property sv:name="mgnl:activatorid" sv:type="String"> + <sv:value>superuser</sv:value> + </sv:property> <sv:property sv:name="mgnl:authorid" sv:type="String"> <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:creationdate" sv:type="Date"> - <sv:value>2009-09-09T12:31:44.752+02:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> + <sv:property sv:name="mgnl:lastaction" sv:type="Date"> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> + </sv:property> <sv:property sv:name="mgnl:lastmodified" sv:type="Date"> - <sv:value>2010-02-13T15:02:44.263+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> - <sv:property sv:name="mgnl:template" sv:type="String"> - <sv:value/> - </sv:property> </sv:node> <sv:node sv:name="image"> <sv:property sv:name="jcr:primaryType" sv:type="Name"> @@ -152,23 +173,20 @@ <sv:value>true</sv:value> </sv:property> <sv:property sv:name="mgnl:activatorid" sv:type="String"> - <sv:value>admin</sv:value> + <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:authorid" sv:type="String"> <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:creationdate" sv:type="Date"> - <sv:value>2008-07-21T13:43:14.610+02:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> <sv:property sv:name="mgnl:lastaction" sv:type="Date"> - <sv:value>2008-08-13T11:06:12.478+02:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> <sv:property sv:name="mgnl:lastmodified" sv:type="Date"> - <sv:value>2010-02-13T15:02:25.579+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> - <sv:property sv:name="mgnl:template" sv:type="String"> - <sv:value/> - </sv:property> </sv:node> <sv:node sv:name="original"> <sv:property sv:name="jcr:primaryType" sv:type="Name"> @@ -236,23 +254,20 @@ <sv:value>true</sv:value> </sv:property> <sv:property sv:name="mgnl:activatorid" sv:type="String"> - <sv:value>admin</sv:value> + <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:authorid" sv:type="String"> <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:creationdate" sv:type="Date"> - <sv:value>2008-07-02T17:20:58.260Z</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> <sv:property sv:name="mgnl:lastaction" sv:type="Date"> - <sv:value>2008-08-13T11:04:49.939+02:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> <sv:property sv:name="mgnl:lastmodified" sv:type="Date"> - <sv:value>2010-02-13T15:02:52.017+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> - <sv:property sv:name="mgnl:template" sv:type="String"> - <sv:value/> - </sv:property> </sv:node> <sv:node sv:name="original"> <sv:property sv:name="jcr:primaryType" sv:type="Name"> @@ -328,18 +343,24 @@ <sv:property sv:name="jcr:primaryType" sv:type="Name"> <sv:value>mgnl:metaData</sv:value> </sv:property> + <sv:property sv:name="mgnl:activated" sv:type="Boolean"> + <sv:value>true</sv:value> + </sv:property> + <sv:property sv:name="mgnl:activatorid" sv:type="String"> + <sv:value>superuser</sv:value> + </sv:property> <sv:property sv:name="mgnl:authorid" sv:type="String"> <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:creationdate" sv:type="Date"> - <sv:value>2009-12-30T17:19:47.747+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> + <sv:property sv:name="mgnl:lastaction" sv:type="Date"> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> + </sv:property> <sv:property sv:name="mgnl:lastmodified" sv:type="Date"> - <sv:value>2010-02-13T15:02:35.034+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> - <sv:property sv:name="mgnl:template" sv:type="String"> - <sv:value/> - </sv:property> </sv:node> <sv:node sv:name="original"> <sv:property sv:name="jcr:primaryType" sv:type="Name"> @@ -429,18 +450,24 @@ <sv:property sv:name="jcr:primaryType" sv:type="Name"> <sv:value>mgnl:metaData</sv:value> </sv:property> + <sv:property sv:name="mgnl:activated" sv:type="Boolean"> + <sv:value>true</sv:value> + </sv:property> + <sv:property sv:name="mgnl:activatorid" sv:type="String"> + <sv:value>superuser</sv:value> + </sv:property> <sv:property sv:name="mgnl:authorid" sv:type="String"> <sv:value>superuser</sv:value> </sv:property> <sv:property sv:name="mgnl:creationdate" sv:type="Date"> - <sv:value>2010-02-13T15:03:24.073+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> + <sv:property sv:name="mgnl:lastaction" sv:type="Date"> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> + </sv:property> <sv:property sv:name="mgnl:lastmodified" sv:type="Date"> - <sv:value>2010-02-13T15:03:24.078+01:00</sv:value> + <sv:value>2010-01-01T12:46:12.918Z</sv:value> </sv:property> - <sv:property sv:name="mgnl:template" sv:type="String"> - <sv:value/> - </sv:property> </sv:node> <sv:node sv:name="original"> <sv:property sv:name="jcr:primaryType" sv:type="Name"> Modified: trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties =================================================================== --- trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties 2010-02-14 18:49:18 UTC (rev 1926) +++ trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_en.properties 2010-02-14 19:35:48 UTC (rev 1927) @@ -93,7 +93,7 @@ media.info.media_height=Height: {0}px media.info.media_bitdepth=Bit depth: {0} media.info.media_duration=Duration: {0} -media.info.media_framerate=Frame rate: {0} +media.info.media_framerate=Frame rate: {0} fps media.bgselector.white=White media.bgselector.transparent=Transparent Modified: trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties =================================================================== --- trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties 2010-02-14 18:49:18 UTC (rev 1926) +++ trunk/openutils-mgnlmedia/src/main/resources/net/sourceforge/openutils/mgnlmedia/media/lang/messages_it.properties 2010-02-14 19:35:48 UTC (rev 1927) @@ -95,7 +95,7 @@ media.info.media_height=Altezza: {0}px media.info.media_bitdepth=Profondit\u00E0 di colore: {0} media.info.media_duration=Durata: {0} -media.info.media_framerate=Frame rate: {0} +media.info.media_framerate=Frame rate: {0} fps media.bgselector.white=Bianco This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |