VideoConvert.java

package sk.iway.iwcm.gallery;

import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import sk.iway.iwcm.Constants;
import sk.iway.iwcm.DBPool;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.CloudToolsForCore;
import sk.iway.iwcm.editor.UploadFileForm;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.io.IwcmFsDB;

/**
 * VideoConvert.java - trieda pre konverziu video suborov
 *
 *@Title webjet4
 *@Company Interway s.r.o. (www.interway.sk)
 *@Copyright Interway s.r.o. (c) 2001-2007
 *@author $Author: jeeff $
 *@version $Revision: 1.18 $
 *@created Date: 7.9.2007 21:24:21
 *@modified $Date: 2009/01/15 10:08:45 $
 */
public class VideoConvert
{

	public static boolean convertToMp4(String sourceUrl, String destinationUrl, int width, int height, int bitRate, boolean keepOrig,
				HttpServletRequest request){
		return  convert("mp4", sourceUrl, destinationUrl, width, height, bitRate, keepOrig, request);
	}

	public static boolean convertToFlv(String sourceUrl, String destinationUrl, int width, int height, int bitRate, boolean keepOrig,
				HttpServletRequest request)
	{
		return convert("flv", sourceUrl, destinationUrl, width, height, bitRate, keepOrig, request);
	}

	public static boolean convert(String format, String sourceUrl, String destinationUrl, int width, int height, int bitRate, boolean keepOrig,
				HttpServletRequest request)
	{
		Dimension[] dims = null;
		String flvFilename = null;
		if (GalleryDB.isGalleryFolder(destinationUrl))
		{
			dims = GalleryDB.getDimension(destinationUrl);
			if ("small".equals(Constants.getString("galleryVideoMode")))
			{
				Dimension[] dimsNew = new Dimension[1];
				dimsNew[0] = new Dimension(dims[0].width, dims[0].height);
				dims = dimsNew;
			}
			else if ("big".equals(Constants.getString("galleryVideoMode")))
			{
				Dimension[] dimsNew = new Dimension[1];
				dimsNew[0] = new Dimension(dims[1].width, dims[1].height);
				dims = dimsNew;
			}
		}
		else
		{
			dims = new Dimension[1];
			dims[0] = new Dimension(width, height);
		}
		try
		{
			String videoPath = Tools.getRealPath(sourceUrl);
			int originalBitRate = bitRate;
			for (int y = 0; y < dims.length; y++)
			{
				Dimension d = dims[y];
				// pre velky rozmer musime mat vacsi bitrate
				if (y > 0)
				{
					double pomer = (double) (dims[y].width * dims[y].height) / (double) (dims[0].width * dims[0].height);
					bitRate = (int) Math.round(originalBitRate * pomer);
				}
				Prop prop = Prop.getInstance(request);
				request.getSession().setAttribute("uploadProgressMessage", prop.getText("gallery.videoconvert.converting"));
				String ffmpegPath = Constants.getString("ffmpegPath").trim();
				File f = new File(ffmpegPath);
				if (f.exists() == false || f.isFile() == false || f.canRead() == false)
					return false;
				flvFilename = Tools.getRealPath(
							destinationUrl.substring(0, destinationUrl.lastIndexOf('.')) + "." + d.width + "x" + d.height
										+ destinationUrl.substring(destinationUrl.lastIndexOf('.'), destinationUrl.length()));
				Runtime rt = Runtime.getRuntime();
				if (IwcmFsDB.useDBStorage(sourceUrl))
				{
					videoPath = IwcmFsDB.getTempFilePath(videoPath);
					flvFilename = IwcmFsDB.getTempFilePath(flvFilename);
				}
				//MBO: #15203 pre konverziu pouzijeme upravene rozmery, ak je niektory neparny, zvacsi sa o 1
				Dimension dimsToConvert = new Dimension(
						(int)( ((int)Math.round(d.getWidth()))%2==1 ? d.getWidth()+1 : d.getWidth() ),
						(int)( ((int)Math.round(d.getHeight()))%2==1 ? d.getHeight()+1 : d.getHeight() ) );

				String args[] = ffmpegCommandLine(videoPath,flvFilename,format,bitRate,dimsToConvert);

				File flvFile=new File(flvFilename);
				if (flvFile.exists()){flvFile.delete();}
				int c = 0;
				String params = "";
				StringBuilder buf = new StringBuilder();
				if (args != null)
				{
					for (int i = 0; i < args.length; i++)
					{
						buf.append(' ').append(args[i]);
					}
					params = buf.toString();
				}
				Logger.println(VideoConvert.class, "LONGCMD:\n" + params);
				long startTime = System.currentTimeMillis();
				long elapsedTime = 0;
				int perc = 1;
				Process proc = rt.exec(args);
				Logger.println(VideoConvert.class, "executed");
				InputStream stderr = proc.getErrorStream();
				BufferedReader br = new BufferedReader(new InputStreamReader(stderr, Constants.FILE_ENCODING));
				String line = null;
				float lengthInSeconds = 0;
				float time = 0;
				long fileSize = new File(videoPath).length();
				SimpleDateFormat formatter = new SimpleDateFormat("mm:ss");
				SimpleDateFormat sd = new SimpleDateFormat("ss");
				while ((line = br.readLine()) != null)
				{
					try
					{
						elapsedTime = System.currentTimeMillis() - startTime;
						request.getSession().setAttribute("elapsedTime", formatter.format(sd.parse(Long.toString(elapsedTime / 1000))));
						Logger.println(VideoConvert.class, line);
						// TODO: ffmpeg na zaciatku vypise dlzhu videa / pocet snimkov,
						// parsovat a dedukovat % hodnotu kompletnosti
						// pripadne vypocitavat zostavajuci cas do konca
						if (line.contains("Duration:"))
						{
							int start = line.indexOf("Duration:");
							String dur = line.substring(start + 8 + 2, start + 1 + 8 + 8 + 1);
							dur = dur.trim();
							String durArray[] = dur.split(":");
							if (durArray!=null && durArray.length==3)
							{
								lengthInSeconds = Tools.getIntValue(durArray[2],0);
								lengthInSeconds += Tools.getIntValue(durArray[1],0)*60;
								lengthInSeconds += Tools.getIntValue(durArray[0],0)*60*60;
							}
							System.out.println("dur="+dur+" lengthInSeconds"+lengthInSeconds);
						}
						if (line.contains("time="))
						{
							int start = line.indexOf("time=") + "time=".length();
							int end = start + 1;
							for (int i = start + 1; i < line.length(); i++)
							{
								if (Character.isWhitespace(line.charAt(i)))
								{
									end = i;
									break;
								}
							}
							try
							{
								time = Math.round(Float.parseFloat(line.substring(start, end)));
							}
							catch (Exception  ex)
							{
								try
								{
									//TODO: skus to sparsovat
									//[20.11 13:16:36 {balat}{4}] frame=   21 fps=  0 q=2.0 size=      83kB time=00:00:00.46 bitrate=1463.1kbits/s
									String timeStr[] = Tools.getTokens(line.substring(start, end), ":");
									if (timeStr.length==3)
									{
										time = Tools.getIntValue(timeStr[0], 0)*3600;
										time += Tools.getIntValue(timeStr[1], 0)*60;
										if (timeStr[2].indexOf('.')==-1) time += Tools.getIntValue(timeStr[2], 0);
										else time += Tools.getIntValue(timeStr[2].substring(0, timeStr[2].indexOf('.')), 0);
									}
								}
								catch (Exception ex2)
								{
									sk.iway.iwcm.Logger.error(ex);
								}
							}
							System.out.println("time="+time);
						}
						if (lengthInSeconds > 0)
						{
							float roundTmp = (float)Math.round((lengthInSeconds - (lengthInSeconds - time)) / (lengthInSeconds / 100.0));
							perc = Math.round(roundTmp);
							request.getSession().setAttribute(
										"remainingTime",
										formatter.format(sd.parseObject(Long.toString(Math.round((0.7 * (fileSize / 10000000.0))
													* ((100 - perc) / 100f))))));
							request.getSession().setAttribute("percentage", perc);
							System.out.println("percentage="+perc);
						}
						request.getSession().setAttribute("uploadProgressMessage", prop.getText("gallery.videoconvert.converting"));
					}
					catch (Exception ex)
					{
						sk.iway.iwcm.Logger.error(ex);
					}
				}
				br.close();
				int exitValue = proc.waitFor();
				Logger.println(VideoConvert.class, "ExitValue: " + exitValue);
				if (format.toLowerCase().equals("flv") || format.toLowerCase().equals("mp4"))
				{
					if (format.toLowerCase().equals("flv"))
					{
						request.getSession().setAttribute("uploadProgressMessage", prop.getText("gallery.videoconvert.indexing"));
						String yamdiPath = Constants.getString("yamdiPath").trim();
						File yamdi = new File(yamdiPath);
						if (f.exists() == false || f.isFile() == false || f.canRead() == false)
							return false;
						String yArgs[] = new String[5];
						int index = 0;
						yArgs[index++] = yamdi.getAbsolutePath();
						yArgs[index++] = "-i";
						yArgs[index++] = flvFilename;
						yArgs[index++] = "-o";
						yArgs[index++] = flvFilename + ".tmp";
						params = "";
						StringBuilder paramsBuf = new StringBuilder(params);
						if (args != null)
						{
							for (int i = 0; i < yArgs.length; i++)
							{
								paramsBuf.append(' ').append(yArgs[i]);
							}
						}
						params = paramsBuf.toString();
						Logger.println(VideoConvert.class, "LONGCMD:\n" + params);
						proc = rt.exec(yArgs);
						Logger.println(VideoConvert.class, "executed");
						stderr = proc.getErrorStream();
						br = new BufferedReader(new InputStreamReader(stderr, Constants.FILE_ENCODING));
						line = null;
						while ((line = br.readLine()) != null)
						{
							Logger.println(VideoConvert.class, line);
							request.getSession().setAttribute("uploadProgressMessage", prop.getText("gallery.videoconvert.indexing"));
						}
						br.close();
						exitValue = proc.waitFor();
						Logger.println(VideoConvert.class, "ExitValue: " + exitValue);

					}
					c = 0;
					String previewArgs[] = new String[14];
					previewArgs[c++] = f.getAbsolutePath();
					previewArgs[c++] = "-i";
					previewArgs[c++] = videoPath;
					previewArgs[c++] = "-an";
					previewArgs[c++] = "-ss";
					previewArgs[c++] = "00:00:03";
					previewArgs[c++] = "-t";
					previewArgs[c++] = "00:00:01";
					previewArgs[c++] = "-r";
					previewArgs[c++] = "1";
					previewArgs[c++] = "-y";
					previewArgs[c++] = "-s";
					previewArgs[c++] = d.width + "x" + d.height;
					previewArgs[c++] = flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "%d.jpg";
					params = "";

					StringBuilder paramsBuf = new StringBuilder(params);

					if (args != null)
					{
						for (int i = 0; i < previewArgs.length; i++)
						{
							paramsBuf.append(' ').append(previewArgs[i]);
						}
					}
					params = paramsBuf.toString();

					Logger.println(VideoConvert.class, "LONGCMD:\n" + params);
					request.getSession()
								.setAttribute("uploadProgressMessage", prop.getText("gallery.videoconvert.creating_thumbnail"));
					// proc=rt.exec(previewArgs);
					proc = rt.exec(previewArgs);
					Logger.println(VideoConvert.class, "executed");
					stderr = proc.getErrorStream();
					br = new BufferedReader(new InputStreamReader(stderr, Constants.FILE_ENCODING));
					line = null;
					while ((line = br.readLine()) != null)
					{
						Logger.println(VideoConvert.class, line);
						request.getSession().setAttribute("uploadProgressMessage",
									prop.getText("gallery.videoconvert.creating_thumbnail"));
					}
					br.close();
					exitValue = proc.waitFor();
					Logger.println(VideoConvert.class, "ExitValue: " + exitValue);
					// ffmpeg -i video.flv -an -ss 00:00:03 -t 00:00:01 -r 1 -y -s
					// 320x240 video%d.jpg

					//zmen .flv.tmp subor na .flv
					File video = new File(flvFilename);

					if (format.toLowerCase().equals("flv"))
					video.delete();
					renameFile(flvFilename + ".tmp", flvFilename);

					video = new File(flvFilename);

					// vytvori to viac obrazkov, chceme len jeden
					renameFile(flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "3.jpg", flvFilename.substring(0, flvFilename
								.lastIndexOf('.'))
								+ ".jpg");
					renameFile(flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "2.jpg", flvFilename.substring(0, flvFilename
								.lastIndexOf('.'))
								+ ".jpg");
					renameFile(flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "1.jpg", flvFilename.substring(0, flvFilename
								.lastIndexOf('.'))
								+ ".jpg");
					String imageName=flvFilename.substring(0, flvFilename.lastIndexOf('.'))+ ".jpg";
					flvFilename = Tools.getRealPath(
								destinationUrl.substring(0, destinationUrl.lastIndexOf('.')) + "." + d.width + "x" + d.height
											+ destinationUrl.substring(destinationUrl.lastIndexOf('.'), destinationUrl.length()));
					// sme galeria?
					String imageUrl = destinationUrl.substring(0, destinationUrl.lastIndexOf('.')) + "." + d.width + "x" + d.height
								+ ".jpg";
					if (IwcmFsDB.useDBStorage(sourceUrl))
					{
						IwcmFsDB.writeFiletoDest(new FileInputStream(video), new File(flvFilename), (int) video.length());// zapiseme
						video.delete();

						//zapiseme do db obrazky
						File image = new File(imageName);
						IwcmFsDB.writeFiletoDest(new FileInputStream(image), new File(Tools.getRealPath(imageUrl)),(int)image.length());
						if(image.delete() == false) return false;
					}
					if (GalleryDB.isGalleryFolder(imageUrl))
					{
						GalleryDB.resizePicture(Tools.getRealPath(imageUrl), imageUrl.substring(0, imageUrl
									.lastIndexOf('/')));
					}
				}
			}

			if(keepOrig==false)
			{
				if(new File(videoPath).delete() == false) return false; // vymazanie orig. video suboru
			}
		}
		catch (Exception ex)
		{
			sk.iway.iwcm.Logger.error(ex);
		}
		request.getSession().removeAttribute("uploadProgressMessage");
		return true;
	}

	public static boolean convertAudio(String format, String sourceUrl, String destinationUrl, int bitRate, boolean keepOrig, HttpServletRequest request)
	{
		try
		{
			String videoPath = Tools.getRealPath(sourceUrl);

			Prop prop = Prop.getInstance(request);
			request.getSession().setAttribute("uploadProgressMessage", prop.getText("gallery.audioconvert.converting"));
			String ffmpegPath = Constants.getString("ffmpegPath").trim();
			File f = new File(ffmpegPath);
			if (f.exists() == false || f.isFile() == false || f.canRead() == false)
				return false;
			String flvFilename = Tools.getRealPath(destinationUrl);
			Runtime rt = Runtime.getRuntime();
			String args[] = new String[8];
			if (IwcmFsDB.useDBStorage(sourceUrl))
			{
				videoPath = IwcmFsDB.getTempFilePath(videoPath);
				flvFilename = IwcmFsDB.getTempFilePath(flvFilename);
			}
			File flvFile=new File(flvFilename);
			if (flvFile.exists()){
				if(flvFile.delete() == false) return false;
			}
			int c = 0;
			args[c++] = f.getAbsolutePath();
			args[c++] = "-i";
			args[c++] = videoPath;
			args[c++] = "-f";
			args[c++] = format;
			args[c++] = "-ab";
			args[c++] = bitRate + "k";
			args[c++] = flvFilename;
			String params = "";
			StringBuilder buf = new StringBuilder();
			if (args != null)
			{
				for (int i = 0; i < args.length; i++)
				{
					buf.append(' ').append(args[i]);
				}
				params = buf.toString();
			}
			Logger.println(VideoConvert.class, "LONGCMD:\n" + params);
			long startTime = System.currentTimeMillis();
			long elapsedTime = 0;
			int perc = 1;
			Process proc = rt.exec(args);
			Logger.println(VideoConvert.class, "executed");
			InputStream stderr = proc.getErrorStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(stderr, Constants.FILE_ENCODING));
			String line = null;
			float lengthInSeconds = 0;
			float time = 0;
			long fileSize = new File(videoPath).length();
			SimpleDateFormat formatter = new SimpleDateFormat("mm:ss");
			SimpleDateFormat sd = new SimpleDateFormat("ss");
			while ((line = br.readLine()) != null)
			{
				elapsedTime = System.currentTimeMillis() - startTime;
				request.getSession().setAttribute("elapsedTime", formatter.format(sd.parse(Long.toString(elapsedTime / 1000))));
				Logger.println(VideoConvert.class, line);
				// TODO: ffmpeg na zaciatku vypise dlzhu videa / pocet snimkov,
				// parsovat a dedukovat % hodnotu kompletnosti
				// pripadne vypocitavat zostavajuci cas do konca
				if (line.contains("Duration:"))
				{
					int start = line.indexOf("Duration:");
					String dur = line.substring(start + 8 + 2, start + 1 + 8 + 8 + 1);
					dur = dur.trim();
					String durArray[] = dur.split(":");
					if (durArray!=null && durArray.length==3)
					{
						lengthInSeconds = Tools.getIntValue(durArray[2],0);
						lengthInSeconds += Tools.getIntValue(durArray[1],0)*60;
						lengthInSeconds += Tools.getIntValue(durArray[0],0)*60*60;
					}
					System.out.println("dur="+dur+" lengthInSeconds"+lengthInSeconds);
				}
				if (line.contains("time="))
				{
					int start = line.indexOf("time=") + "time=".length();
					int end = start + 1;
					for (int i = start + 1; i < line.length(); i++)
					{
						if (Character.isWhitespace(line.charAt(i)))
						{
							end = i;
							break;
						}
					}
					time = Math.round(Float.parseFloat(line.substring(start, end)));
					System.out.println("time="+time);
				}
				if (lengthInSeconds > 0)
				{
					float roundTmp = (float)Math.round((lengthInSeconds - (lengthInSeconds - time)) / (lengthInSeconds / 100.0));
					perc = Math.round(roundTmp);
					request.getSession().setAttribute(
								"remainingTime",
								formatter.format(sd.parseObject(Long.toString(Math.round((0.7 * (fileSize / 1000000.0))
											* ((100 - perc) / 100f))))));
					request.getSession().setAttribute("percentage", perc);
					System.out.println("percentage="+perc);
				}
				request.getSession().setAttribute("uploadProgressMessage", prop.getText("gallery.audioconvert.converting"));
			}
			br.close();
			int exitValue = proc.waitFor();
			Logger.println(VideoConvert.class, "ExitValue: " + exitValue);

			if (IwcmFsDB.useDBStorage(sourceUrl))
			{
				IwcmFsDB.writeFiletoDest(new FileInputStream(flvFile), new File(Tools.getRealPath(destinationUrl)) , (int) flvFile.length());// zapiseme
				if(flvFile.delete() == false) return false;
			}

			if(keepOrig==false)
			{
				if(new File(videoPath).delete() == false) return false; // vymazanie orig. video suboru
			}
		}
		catch (Exception ex)
		{
			sk.iway.iwcm.Logger.error(ex);
		}
		request.getSession().removeAttribute("uploadProgressMessage");
		return true;
	}

	public static boolean renameFile(String oldFilePath, String newFilePath)
	{
		boolean renamed = false;
		try
		{
			File renameFile = new File(oldFilePath);
			if (renameFile.exists() == false)
				return false;
			renamed = renameFile.renameTo(new File(newFilePath));
			if (renamed == false)
			{
				File newFile = new File(newFilePath);
				File oldFile = new File(oldFilePath);
				if(newFile.createNewFile() == false) return false;
				FileInputStream inStream = new FileInputStream(oldFile);
				FileOutputStream out = new FileOutputStream(newFile);
				int c;
				byte[] buff = new byte[150000];
				while ((c = inStream.read(buff)) != -1)
				{
					out.write(buff, 0, c);
				}
				out.close();
				inStream.close();
				renamed = true;
				try
				{
					// skus ho zmazat
					oldFile.delete();
				}
				catch (Exception ex)
				{
					sk.iway.iwcm.Logger.error(ex);
				}
			}
		}
		catch (Exception ex)
		{
			sk.iway.iwcm.Logger.error(ex);
		}
		return renamed;
	}

	private static String[] ffmpegCommandLine(String from,String to,String format,int bitRate,java.awt.Dimension d){
		String params = Constants.getString("ffmpegParams");
		String[] command = params.split(" ");
		command = (String[]) ArrayUtils.removeElement(command, " ");
		command = (String[]) ArrayUtils.removeElement(command, "");

		command[ArrayUtils.indexOf(command, "ffmpeg")]  = Constants.getString("ffmpegPath").trim();
		command[ArrayUtils.indexOf(command, "dimension")] =  d.width + "x" + d.height;
		command[ArrayUtils.indexOf(command, "from")] = from;
		command[ArrayUtils.indexOf(command, "to")] = to;
		command[ArrayUtils.indexOf(command, "format")] = format;
		command[ArrayUtils.indexOf(command,"bitrate")]=bitRate+"k";

		return command;
	}

	/**
	 * Skonveruje uploadnuty subor na video, pouziva sa v Editore v uploade a v galerii v uploade
	 * @param my_form
	 * @param fileURL
	 * @param request
	 * @return
	 */
	public static String convert(UploadFileForm my_form, String fileURL, HttpServletRequest request)
	{
		if (my_form.getBitRate()<32) my_form.setBitRate(360);
		if (my_form.getVideoWidth()<32) my_form.setVideoWidth(320);
		if (my_form.getVideoHeight()<32) my_form.setVideoHeight(240);

		if (my_form.getVideoWidth()%8!=0 || my_form.getVideoHeight()%8!=0)
		{
			my_form.setVideoWidth((my_form.getVideoWidth()/8)*8);
			my_form.setVideoHeight((my_form.getVideoHeight()/8)*8);
		}

		String flvUrl = fileURL.substring(0, fileURL.lastIndexOf('.'))+"."+Constants.getString("defaultVideoFormat");

		if (GalleryDB.isGalleryFolder(flvUrl))
		{
			String flvDir = flvUrl.substring(0, flvUrl.lastIndexOf("/"));
			Dimension[] dm=GalleryDB.getDimension(flvDir);
			Dimension dSmall = dm[0];
			Dimension dNormal = dm[1];

			if (dSmall.width%8!=0 || dSmall.height%8!=0 || dNormal.width%8!=0 || dNormal.height%8!=0)
			{
				changeDimension((dSmall.width/8)*8, (dSmall.height/8)*8, (dNormal.width/8)*8, (dNormal.height/8)*8, flvDir);
			}
		}

		VideoConvert.convert( Constants.getString("defaultVideoFormat"),fileURL, flvUrl, my_form.getVideoWidth(), my_form.getVideoHeight(),my_form.getBitRate(),my_form.isKeepOriginalVideo(), request);

		if (GalleryDB.isGalleryFolder(flvUrl))
		{
			Dimension[] dm=GalleryDB.getDimension(flvUrl.substring(0,flvUrl.lastIndexOf('/')));
			if (dm.length>0)
			{
				Dimension min=dm[0];
				for (Dimension d:dm)
				{
					if (d.width<min.width && d.height<min.height)
					{
						min=d;
					}
				}
				flvUrl=fileURL.substring(0, fileURL.lastIndexOf('.'))+"."+min.width+"x"+min.height+"."+Constants.getString("defaultVideoFormat");
				request.setAttribute("imageWidth", Integer.toString(min.width));
				request.setAttribute("imageHeight",Integer.toString(min.height));
			}
		}
		else
		{
			flvUrl=fileURL.substring(0, fileURL.lastIndexOf('.'))+"."+my_form.getVideoWidth()+"x"+my_form.getVideoHeight()+"."+Constants.getString("defaultVideoFormat");
			request.setAttribute("imageWidth", Integer.toString(my_form.getVideoWidth()));
			request.setAttribute("imageHeight",Integer.toString(my_form.getVideoHeight()));
		}

		return flvUrl;
	}

	private static void changeDimension(int smallWidth, int smallHeight, int normalWidth, int normalHeight, String imagePath)
	{
		Connection db_conn = null;
		PreparedStatement ps = null;

		try
		{
			db_conn = DBPool.getConnection();
			ps = db_conn.prepareStatement("update gallery_dimension set image_width = ?,image_height=?, " +
					"normal_width = ? , normal_height = ? " +
					"where image_path = ? and domain_id = ?");
			int index=1;
			ps.setInt(index++, smallWidth);
			ps.setInt(index++, smallHeight);
			ps.setInt(index++, normalWidth);
			ps.setInt(index++, normalHeight);
			ps.setString(index++, imagePath);
			ps.setInt(index++, CloudToolsForCore.getDomainId());
			ps.execute();


			ps.close();
			db_conn.close();

			ps = null;
			db_conn = null;
		}
		catch (Exception ex)
		{
			sk.iway.iwcm.Logger.error(ex);
		}
		finally
		{
			try
			{
				if (ps != null)
					ps.close();
				if (db_conn != null)
					db_conn.close();
			}
			catch (Exception ex2)
			{
			}
		}

	}


	/**
	 * Vrati true ak sa dany subor je mozne povazovat za video subor
	 * @param fileName
	 * @return
	 */
	public static boolean isVideoFile(String fileName)
	{
		if (Tools.isEmpty(fileName)) return false;

		fileName = fileName.toLowerCase();

		if (fileName.indexOf(".mpg")!=-1 || fileName.indexOf(".mpeg")!=-1 ||
		   	    fileName.indexOf(".avi")!=-1 || fileName.indexOf(".qt")!=-1 ||
		   	    fileName.indexOf(".mp4")!=-1 || fileName.indexOf(".wmv")!=-1 ||
		   	    fileName.indexOf(".vob")!=-1 || fileName.indexOf(".mov")!=-1 ||
		   	    fileName.indexOf(".flv")!=-1 || fileName.indexOf(".m4v")!=-1)
		{
			return true;
		}

		return false;
	}

	public static String makeScreenshot(String videoPath, Dimension d) throws IOException, InterruptedException
	{
	    String imageName = null;
	    try
        {
            String flvFilename = videoPath;

            List<String> arguments = new ArrayList<String>();
            String ffMpegPath = Constants.getString("ffmpegPath").trim();

            arguments.add(ffMpegPath);
            arguments.add("-i");
            arguments.add(videoPath);
            arguments.add("-an");
            arguments.add("-ss");
            arguments.add("00:00:03");
            arguments.add("-t");
            arguments.add("00:00:01");
            arguments.add("-r");
            arguments.add("1");
            arguments.add("-y");


            if (d != null)
            {
                arguments.add("-s");
                arguments.add(d.width + "x" + d.height);
            }

            arguments.add(flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "%d.jpg");

            String params = StringUtils.join(arguments, " ");
            String[] args = new String[arguments.size()];

            Logger.println(VideoConvert.class, "LONGCMD:\n" + params);
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec(arguments.toArray(args));
            Logger.println(VideoConvert.class, "executed");
            InputStream stderr = proc.getErrorStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(stderr, Constants.FILE_ENCODING));
            String line = null;
            while ((line = br.readLine()) != null)
            {
                Logger.println(VideoConvert.class, line);
            }
            br.close();
            int exitValue = proc.waitFor();
            Logger.println(VideoConvert.class, "ExitValue: " + exitValue);
            // ffmpeg -i video.flv -an -ss 00:00:03 -t 00:00:01 -r 1 -y -s
            // 320x240 video%d.jpg


            // vytvori to viac obrazkov, chceme len jeden
            renameFile(flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "3.jpg", flvFilename.substring(0, flvFilename
                    .lastIndexOf('.'))
                    + ".jpg");
            renameFile(flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "2.jpg", flvFilename.substring(0, flvFilename
                    .lastIndexOf('.'))
                    + ".jpg");
            renameFile(flvFilename.substring(0, flvFilename.lastIndexOf('.')) + "1.jpg", flvFilename.substring(0, flvFilename
                    .lastIndexOf('.'))
                    + ".jpg");
            imageName = flvFilename.substring(0, flvFilename.lastIndexOf('.')) + ".jpg";
        }
        catch (Exception ex)
        {
            sk.iway.iwcm.Logger.error(ex);
        }
		return imageName;
	}
}