Projects >> UniversalMediaServer >>70e39db88e20e968d7bda62da928adbd01f8883b

Chunk
Conflicting content
	private static final String KEY_PROXY_SERVER_PORT = "proxy";
	private static final String KEY_RENDERER_DEFAULT = "renderer_default";
	private static final String KEY_RENDERER_FORCE_DEFAULT = "renderer_force_default";
<<<<<<< HEAD
	private static final String KEY_RESUMABLE = "resume";
	private static final String KEY_MIN_PLAY_TIME = "min_playtime";
	private static final String KEY_MIN_PLAY_TIME_WEB = "min_playtime_web";
	private static final String KEY_MIN_PLAY_TIME_FILE = "min_playtime_file";
=======
	private static final String KEY_RUN_WIZARD = "run_wizard";
>>>>>>> 151e8780025de7aac682428a44883565f067fdad
	private static final String KEY_SEARCH_FOLDER = "search_folder";
	private static final String KEY_SEARCH_RECURSE = "search_recurse";
	private static final String KEY_SERVER_HOSTNAME = "hostname";
Solution content
	private static final String KEY_PROXY_SERVER_PORT = "proxy";
	private static final String KEY_RENDERER_DEFAULT = "renderer_default";
	private static final String KEY_RENDERER_FORCE_DEFAULT = "renderer_force_default";
	private static final String KEY_RESUMABLE = "resume";
	private static final String KEY_MIN_PLAY_TIME = "min_playtime";
	private static final String KEY_MIN_PLAY_TIME_WEB = "min_playtime_web";
	private static final String KEY_MIN_PLAY_TIME_FILE = "min_playtime_file";
	private static final String KEY_RUN_WIZARD = "run_wizard";
	private static final String KEY_SEARCH_FOLDER = "search_folder";
	private static final String KEY_SEARCH_RECURSE = "search_recurse";
	private static final String KEY_SERVER_HOSTNAME = "hostname";
File
PmsConfiguration.java
Developer's decision
Concatenation
Kind of conflict
Attribute
Chunk
Conflicting content
import net.pms.dlna.DLNAResource;
import net.pms.dlna.InputFile;
import net.pms.formats.Format;
<<<<<<< HEAD
import net.pms.formats.v2.SubtitleType;
=======
>>>>>>> 151e8780025de7aac682428a44883565f067fdad
import net.pms.formats.v2.SubtitleUtils;
import net.pms.io.OutputParams;
import net.pms.io.PipeIPCProcess;
Solution content
import net.pms.dlna.DLNAResource;
import net.pms.dlna.InputFile;
import net.pms.formats.Format;
import net.pms.formats.v2.SubtitleUtils;
import net.pms.io.OutputParams;
import net.pms.io.PipeIPCProcess;
File
FFMpegVideo.java
Developer's decision
Version 2
Kind of conflict
Import
Chunk
Conflicting content
		if (extSubs != null) {
			StringBuilder s = new StringBuilder();
<<<<<<< HEAD
			if (params.sid.getType() == SubtitleType.SUBRIP && params.timeseek > 0) {
				// dirty stuff here
				try {
					externalSubtitlesFileName = SubtitleUtils.dumpSrtTc(externalSubtitlesFileName, params.timeseek);
				} catch (Exception e) {
					LOGGER.debug("Couldn't trim subs file " + externalSubtitlesFileName + " error " + e);
				}

			}
			CharacterIterator it = new StringCharacterIterator(externalSubtitlesFileName);
=======
			CharacterIterator it = new StringCharacterIterator(extSubs);
>>>>>>> 151e8780025de7aac682428a44883565f067fdad

			for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
				switch (ch) {
Solution content
		if (extSubs != null) {
			StringBuilder s = new StringBuilder();
			if (params.sid.getType() == SubtitleType.SUBRIP && params.timeseek > 0) {
				// dirty stuff here
				try {
					extSubs = SubtitleUtils.dumpSrtTc(extSubs, params.timeseek);
				} catch (Exception e) {
					LOGGER.debug("Couldn't trim subs file " + extSubs + " error " + e);
				}
			}
			CharacterIterator it = new StringCharacterIterator(extSubs);

			for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
				switch (ch) {
File
FFMpegVideo.java
Developer's decision
Manual
Kind of conflict
Comment
Chunk
Conflicting content
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
<<<<<<< HEAD
=======
import java.io.IOException;
>>>>>>> 151e8780025de7aac682428a44883565f067fdad
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
Solution content
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
File
SubtitleUtils.java
Developer's decision
Version 2
Kind of conflict
Import
Chunk
Conflicting content
import java.util.HashMap;
import java.util.Map;
import net.pms.PMS;
<<<<<<< HEAD
import net.pms.dlna.DLNAMediaInfo;
=======
import net.pms.configuration.PmsConfiguration;
>>>>>>> 151e8780025de7aac682428a44883565f067fdad
import net.pms.dlna.DLNAMediaSubtitle;
import net.pms.util.StringUtil;
import org.apache.commons.lang.StringUtils;
Solution content
import java.util.HashMap;
import java.util.Map;
import net.pms.PMS;
import net.pms.configuration.PmsConfiguration;
import net.pms.dlna.DLNAMediaInfo;
import net.pms.dlna.DLNAMediaSubtitle;
import net.pms.util.StringUtil;
import org.apache.commons.lang.StringUtils;
File
SubtitleUtils.java
Developer's decision
Concatenation
Kind of conflict
Import
Chunk
Conflicting content
import net.pms.util.StringUtil;
import org.apache.commons.lang.StringUtils;
import static org.apache.commons.lang.StringUtils.isBlank;
<<<<<<< HEAD
import org.codehaus.plexus.util.StringUtils;
=======
import static org.apache.commons.lang.StringUtils.isNotBlank;
>>>>>>> 151e8780025de7aac682428a44883565f067fdad
import static org.mozilla.universalchardet.Constants.*;

public class SubtitleUtils {
Solution content
import net.pms.util.StringUtil;
import org.apache.commons.lang.StringUtils;
import static org.apache.commons.lang.StringUtils.isBlank;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import static org.mozilla.universalchardet.Constants.*;

public class SubtitleUtils {
File
SubtitleUtils.java
Developer's decision
Version 2
Kind of conflict
Import
Chunk
Conflicting content
					skip = false;
		}
		return fileCharsetToMencoderSubcpOptionMap.get(dlnaMediaSubtitle.getExternalFileCharacterSet());
	}
<<<<<<< HEAD
	
						continue;
	public static String dumpSrtTc(String in0, double timeseek) throws Exception {
		File in = new File(in0);
		File out = new File(PMS.getConfiguration().getDataFile(in.getName() + 
							"_" + System.currentTimeMillis() + "_tc.srt"));
		out.delete();
		String cp = PMS.getConfiguration().getMencoderSubCp();
		BufferedWriter w;
		try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(in), cp))) {
			w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out)));
			String line;
			boolean skip = false;
			int n = 1;
			while ((line = reader.readLine()) != null) {
				try {
					Integer.parseInt(line);
					continue;
				} catch (NumberFormatException e1) {
				}
				if (StringUtils.isEmpty(line) ) {
					if (!skip) {
						w.write("\n");
					}
					continue;
				}
				if (skip) {
					continue;
				}
				if (line .contains("-->")) {
					String startTime = line.substring(0, line.indexOf("-->") - 1).replaceAll(",", ".");
					String endTime = line.substring(line.indexOf("-->") + 4).replaceAll(",", ".");
					Double start = DLNAMediaInfo.parseDurationString(startTime);
					Double stop = DLNAMediaInfo.parseDurationString(endTime);
					if (timeseek > start) {
						skip  = true;
						continue;
					}
					w.write(String.valueOf(n++));
					w.write("\n");
					w.write(DLNAMediaInfo.getDurationString(start - timeseek));
					w.write(" --> ");				
					w.write(DLNAMediaInfo.getDurationString(stop - timeseek));
					w.write("\n");
					continue;
				}
				
				w.write(line);
				w.write("\n");
			}
		}
		w.flush();
		w.close();
		PMS.get().addTempFile(out, 2 * 24 * 3600 * 1000); /* 2 days only */
		return out.getAbsolutePath();
=======

	/**
	 * Converts external subtitles file in SRT format to SSA/ASS format
	 * @param SrtFile Subtitles file in SRT format
	 * @param configuration UMS settings
	 * @return Converted subtitles file in SSA/ASS format
	 * @throws IOException
	 */
	public static File ConvertSrtToAss(String SrtFile, PmsConfiguration configuration) throws IOException {
		String dir = configuration.getDataFile(SUB_DIR);
		File path = new File(dir);
		if (!path.exists()) {
			path.mkdirs();
		}
		File outputSubs = new File(path.getAbsolutePath() + File.separator + new File(SrtFile).getName() + "_EXT.ass");
		BufferedWriter output;
		BufferedReader input;
		try {
			if (isBlank(configuration.getSubtitlesCodepage())) {
				input = new BufferedReader(new InputStreamReader(new FileInputStream(SrtFile)));
			} else {
				input = new BufferedReader(new InputStreamReader(new FileInputStream(SrtFile), configuration.getSubtitlesCodepage()));
			}

			output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputSubs)));
			String line;
			output.write("[Script Info]\n");
			output.write("ScriptType: v4.00+\n");
			output.write("\n");
			output.write("[V4+ Styles]\n");
			output.write("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding\n");
			StringBuilder s = new StringBuilder();
			s.append("Style: Default,");

			if (!configuration.getFont().isEmpty()) {
				s.append(configuration.getFont()).append(",");
			} else {
				s.append("Arial,");
			}

			s.append(Integer.toString((int) (14 * Double.parseDouble(configuration.getAssScale())))).append(",");
			String primaryColour = Integer.toHexString(configuration.getSubsColor());
			primaryColour = primaryColour.substring(6, 8) + primaryColour.substring(4, 6) + primaryColour.substring(2, 4);
			s.append("&H").append(primaryColour).append(",");
			s.append("&Hffffff,");
			s.append("&H0,");
			s.append("&H0,");
			s.append("0,");
			s.append("0,");
			s.append("0,");
			s.append("1,");
			s.append(configuration.getAssOutline()).append(",");
			s.append(configuration.getAssShadow()).append(",");
			s.append("2,");
			s.append("10,");
			s.append("10,");
			s.append("20,");
			s.append("0,");
			s.append("0");
			output.write(s.toString() + "\n");
			output.write("\n");
			output.write("[Events]\n");
			output.write("Format: Layer, Start, End, Style, Text\n");
			String startTime;
			String endTime;

			while ((line = input.readLine()) != null) {
				if (line.contains("-->")) {
					startTime = line.substring(0, line.indexOf("-->") - 1).replaceAll(",", ".");
					endTime = line.substring(line.indexOf("-->") + 4).replaceAll(",", ".");
					startTime = StringUtil.convertTimeToString(StringUtil.convertStringToTime(startTime), StringUtil.ASS_FORMAT);
					endTime = StringUtil.convertTimeToString(StringUtil.convertStringToTime(endTime), StringUtil.ASS_FORMAT);
					s = new StringBuilder();
					s.append("Dialogue: 0,");
					s.append(startTime).append(",");
					s.append(endTime).append(",");
					s.append("Default").append(",");
					s.append(convertTags(input.readLine()));

					if (isNotBlank(line = input.readLine())) {
						s.append("\\N");
						s.append(convertTags(line));
					}

					output.write(s.toString() + "\n");
				}
			}
		} finally { }

		input.close();
		output.flush();
		output.close();
		PMS.get().addTempFile(outputSubs, 2 * 24 * 3600 * 1000);
		return outputSubs;
	}

	private static String convertTags(String text) {
		 String tag;
		 StringBuilder sb = new StringBuilder();
		 String[] tmp = text.split("<");

		 for (String s : tmp) {
			 if (s.startsWith("/") && s.indexOf(">") == 2) {
				 tag = s.substring(1, 2);
				 sb.append("{\\").append(tag).append("0}").append(s.substring(3));
			 } else if (s.indexOf(">") == 1) {
				 tag = s.substring(0, 1);
				 sb.append("{\\").append(tag).append("1}").append(s.substring(2));
			 } else {
				 sb.append(s);
			 }
		 }

		return sb.toString();
	}

	/**
	 * Applies timeseeking to subtitles file in SSA/ASS format
	 * @param SrtFile Subtitles file in SSA/ASS format
	 * @param timeseek  Time stamp value
	 * @return Converted subtitles file
	 * @throws IOException
	 */
	public static File applyTimeSeeking(File SrtFile, double timeseek) throws IOException {
		Double startTime;
		Double endTime;
		String line;
		File outputSubs = new File(tempFile(SrtFile.getName() + System.currentTimeMillis()));
		BufferedWriter output;
		try (BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(SrtFile)))) {
			output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputSubs)));
			while ((line = input.readLine()) != null) {
				if (line.startsWith("Dialogue:")) {
					String[] tempStr = line.split(",");
					startTime = StringUtil.convertStringToTime(tempStr[1]);
					endTime = StringUtil.convertStringToTime(tempStr[2]);;

					if (startTime >= timeseek) {
						tempStr[1] = StringUtil.convertTimeToString(startTime - timeseek, StringUtil.ASS_FORMAT);
						tempStr[2] = StringUtil.convertTimeToString(endTime - timeseek, StringUtil.ASS_FORMAT);
					} else {
					}

					output.write(StringUtils.join(tempStr, ",") + "\n");
				} else {
					output.write(line + "\n");
				}
			}
		}
		output.flush();
		output.close();
		PMS.get().addTempFile(outputSubs, 2 * 24 * 3600 * 1000);
		return outputSubs;
	}

	public static String tempFile(String name) {
		String dir = PMS.getConfiguration().getDataFile(TEMP_DIR); 
		File path = new File(dir);
		if (!path.exists()) {
			path.mkdirs();
		}
		return path.getAbsolutePath() + File.separator + name + ".tmp";
>>>>>>> 151e8780025de7aac682428a44883565f067fdad
	}
}
Solution content
							"_" + System.currentTimeMillis() + "_tc.srt"));
		}
		return fileCharsetToMencoderSubcpOptionMap.get(dlnaMediaSubtitle.getExternalFileCharacterSet());
	}

	/**
	 * Converts external subtitles file in SRT format to SSA/ASS format
	 * @param SrtFile Subtitles file in SRT format
	 * @param configuration UMS settings
	 * @return Converted subtitles file in SSA/ASS format
	 * @throws IOException
	 */
	public static File ConvertSrtToAss(String SrtFile, PmsConfiguration configuration) throws IOException {
		String dir = configuration.getDataFile(SUB_DIR);
		File path = new File(dir);
		if (!path.exists()) {
			path.mkdirs();
		}
		File outputSubs = new File(path.getAbsolutePath() + File.separator + new File(SrtFile).getName() + "_EXT.ass");
		BufferedWriter output;
		BufferedReader input;
		try {
			if (isBlank(configuration.getSubtitlesCodepage())) {
				input = new BufferedReader(new InputStreamReader(new FileInputStream(SrtFile)));
			} else {
				input = new BufferedReader(new InputStreamReader(new FileInputStream(SrtFile), configuration.getSubtitlesCodepage()));
			}

			output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputSubs)));
			String line;
			output.write("[Script Info]\n");
			output.write("ScriptType: v4.00+\n");
			output.write("\n");
			output.write("[V4+ Styles]\n");
			output.write("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding\n");
			StringBuilder s = new StringBuilder();
			s.append("Style: Default,");

			if (!configuration.getFont().isEmpty()) {
				s.append(configuration.getFont()).append(",");
			} else {
				s.append("Arial,");
			}

			s.append(Integer.toString((int) (14 * Double.parseDouble(configuration.getAssScale())))).append(",");
			String primaryColour = Integer.toHexString(configuration.getSubsColor());
			primaryColour = primaryColour.substring(6, 8) + primaryColour.substring(4, 6) + primaryColour.substring(2, 4);
			s.append("&H").append(primaryColour).append(",");
			s.append("&Hffffff,");
			s.append("&H0,");
			s.append("&H0,");
			s.append("0,");
			s.append("0,");
			s.append("0,");
			s.append("1,");
			s.append(configuration.getAssOutline()).append(",");
			s.append(configuration.getAssShadow()).append(",");
			s.append("2,");
			s.append("10,");
			s.append("10,");
			s.append("20,");
			s.append("0,");
			s.append("0");
			output.write(s.toString() + "\n");
			output.write("\n");
			output.write("[Events]\n");
			output.write("Format: Layer, Start, End, Style, Text\n");
			String startTime;
			String endTime;

			while ((line = input.readLine()) != null) {
				if (line.contains("-->")) {
		out.delete();
					startTime = line.substring(0, line.indexOf("-->") - 1).replaceAll(",", ".");
					endTime = line.substring(line.indexOf("-->") + 4).replaceAll(",", ".");
					startTime = StringUtil.convertTimeToString(StringUtil.convertStringToTime(startTime), StringUtil.ASS_FORMAT);
					endTime = StringUtil.convertTimeToString(StringUtil.convertStringToTime(endTime), StringUtil.ASS_FORMAT);
					s = new StringBuilder();
					s.append("Dialogue: 0,");
					s.append(startTime).append(",");
					s.append(endTime).append(",");
					s.append("Default").append(",");
					s.append(convertTags(input.readLine()));

					if (isNotBlank(line = input.readLine())) {
						s.append("\\N");
						s.append(convertTags(line));
					}

					output.write(s.toString() + "\n");
				}
			}
		} finally { }

		input.close();
		output.flush();
		output.close();
		PMS.get().addTempFile(outputSubs, 2 * 24 * 3600 * 1000);
		return outputSubs;
	}

	private static String convertTags(String text) {
		 String tag;
		 StringBuilder sb = new StringBuilder();
		 String[] tmp = text.split("<");

		 for (String s : tmp) {
			 if (s.startsWith("/") && s.indexOf(">") == 2) {
				 tag = s.substring(1, 2);
				 sb.append("{\\").append(tag).append("0}").append(s.substring(3));
			 } else if (s.indexOf(">") == 1) {
				 tag = s.substring(0, 1);
				 sb.append("{\\").append(tag).append("1}").append(s.substring(2));
			 } else {
				 sb.append(s);
			 }
		 }

		return sb.toString();
	}

	/**
	 * Applies timeseeking to subtitles file in SSA/ASS format
	 * @param SrtFile Subtitles file in SSA/ASS format
	 * @param timeseek  Time stamp value
	 * @return Converted subtitles file
	 * @throws IOException
	 */
	public static File applyTimeSeeking(File SrtFile, double timeseek) throws IOException {
		Double startTime;
		Double endTime;
		String line;
		File outputSubs = new File(tempFile(SrtFile.getName() + System.currentTimeMillis()));
		BufferedWriter output;
		try (BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(SrtFile)))) {
			output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputSubs)));
			while ((line = input.readLine()) != null) {
				if (line.startsWith("Dialogue:")) {
					String[] tempStr = line.split(",");
					startTime = StringUtil.convertStringToTime(tempStr[1]);
					endTime = StringUtil.convertStringToTime(tempStr[2]);;

					if (startTime >= timeseek) {
						tempStr[1] = StringUtil.convertTimeToString(startTime - timeseek, StringUtil.ASS_FORMAT);
						tempStr[2] = StringUtil.convertTimeToString(endTime - timeseek, StringUtil.ASS_FORMAT);
					} else {
						continue;
					}

					output.write(StringUtils.join(tempStr, ",") + "\n");
				} else {
					output.write(line + "\n");
				}
			}
		}
		output.flush();
		output.close();
		PMS.get().addTempFile(outputSubs, 2 * 24 * 3600 * 1000);
		return outputSubs;
	}

	public static String tempFile(String name) {
		String dir = PMS.getConfiguration().getDataFile(TEMP_DIR); 
		File path = new File(dir);
		if (!path.exists()) {
			path.mkdirs();
		}
		return path.getAbsolutePath() + File.separator + name + ".tmp";
	}
	
	public static String dumpSrtTc(String in0, double timeseek) throws Exception {
		File in = new File(in0);
		File out = new File(PMS.getConfiguration().getDataFile(in.getName() + 
		String cp = PMS.getConfiguration().getMencoderSubCp();
		BufferedWriter w;
		try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(in), cp))) {
			w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(out)));
			String line;
			boolean skip = false;
			int n = 1;
			while ((line = reader.readLine()) != null) {
				try {
					Integer.parseInt(line);
					continue;
				} catch (NumberFormatException e1) {
				}
				if (StringUtils.isEmpty(line) ) {
					if (!skip) {
						w.write("\n");
					}
					skip = false;
					continue;
				}
				if (skip) {
					continue;
				}
				if (line .contains("-->")) {
					String startTime = line.substring(0, line.indexOf("-->") - 1).replaceAll(",", ".");
					String endTime = line.substring(line.indexOf("-->") + 4).replaceAll(",", ".");
					Double start = DLNAMediaInfo.parseDurationString(startTime);
					Double stop = DLNAMediaInfo.parseDurationString(endTime);
					if (timeseek > start) {
						skip  = true;
						continue;
					}
					w.write(String.valueOf(n++));
					w.write("\n");
					w.write(DLNAMediaInfo.getDurationString(start - timeseek));
					w.write(" --> ");				
					w.write(DLNAMediaInfo.getDurationString(stop - timeseek));
					w.write("\n");
					continue;
				}
				
				w.write(line);
				w.write("\n");
			}
		}
		w.flush();
		w.close();
		PMS.get().addTempFile(out, 2 * 24 * 3600 * 1000); /* 2 days only */
		return out.getAbsolutePath();
	}
}
File
SubtitleUtils.java
Developer's decision
Concatenation
Kind of conflict
Comment
If statement
Method declaration
Method invocation
Method signature
Return statement
Variable