package org.lodder.subtools.sublibrary.privateRepo; import java.io.ByteArrayInputStream; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.commons.io.FilenameUtils; import org.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.privateRepo.model.IndexSubtitle; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class PrivateRepoIndex { private static final Logger LOGGER = LoggerFactory.getLogger(PrivateRepoIndex.class); public static List<IndexSubtitle> getIndex(String index) { List<IndexSubtitle> repoList = null; IndexSubtitle currIndexSubtitle = null; String tagContent = null; byte[] byteArray; try { byteArray = index.getBytes("UTF-8"); ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray); XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream); int prevEvent = 0; while (reader.hasNext()) { int event = reader.next(); switch (event) { case XMLStreamConstants.START_ELEMENT: tagContent = ""; if ("PrivateRepoItem".equals(reader.getLocalName())) { currIndexSubtitle = new IndexSubtitle(); // currIndexSubtitle.id = reader.getAttributeValue(0); } if ("PrivateRepoIndex".equals(reader.getLocalName())) { repoList = new ArrayList<>(); } break; case XMLStreamConstants.CHARACTERS: if (prevEvent == event) { tagContent = tagContent + reader.getText(); } else { tagContent = reader.getText(); } break; case XMLStreamConstants.END_ELEMENT: switch (reader.getLocalName()) { case "PrivateRepoItem": if (repoList != null) repoList.add(currIndexSubtitle); break; case "name": if (currIndexSubtitle != null) currIndexSubtitle.setName(tagContent); break; case "season": if (currIndexSubtitle != null) currIndexSubtitle.setSeason(Integer.parseInt(tagContent)); break; case "episode": if (currIndexSubtitle != null) currIndexSubtitle.setEpisode(Integer.parseInt(tagContent)); break; case "language": if (currIndexSubtitle != null) currIndexSubtitle.setLanguage(tagContent); break; case "filename": if (currIndexSubtitle != null) currIndexSubtitle.setFilename(tagContent); break; case "tvdbid": if (currIndexSubtitle != null) currIndexSubtitle.setTvdbid(Integer.parseInt(tagContent)); break; case "uploader": if (currIndexSubtitle != null) currIndexSubtitle.setUploader(tagContent); break; case "originalSource": if (currIndexSubtitle != null) currIndexSubtitle.setOriginalSource(tagContent); break; case "videotype": if (currIndexSubtitle != null) currIndexSubtitle.setVideoType(VideoType.valueOf(tagContent)); break; case "imdbid": if (currIndexSubtitle != null) currIndexSubtitle.setImdbid(Integer.parseInt(tagContent)); break; case "year": if (currIndexSubtitle != null) currIndexSubtitle.setYear(Integer.parseInt(tagContent)); break; default: break; } break; case XMLStreamConstants.START_DOCUMENT: repoList = new ArrayList<>(); break; default: break; } prevEvent = event; } } catch (UnsupportedEncodingException e) { LOGGER.error("getIndex()", e); } catch (XMLStreamException e) { LOGGER.error("getIndex()", e); } return repoList; } public static String getStringAtributeValue(String sTag, String sAtribute, Element eElement) { NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); return ((Element) nlList).getAttribute(sAtribute); } public static int getIntTagValue(String sTag, Element eElement) { NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); Node nValue = nlList.item(0); if (nValue == null) { return 0; } else { return Integer.parseInt(nValue.getNodeValue()); } } public static String setIndex(List<IndexSubtitle> index) { Document newDoc; try { newDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); Element rootElement = newDoc.createElement("PrivateRepoIndex"); newDoc.appendChild(rootElement); for (IndexSubtitle item : index) { Element privateRepoItem = newDoc.createElement("PrivateRepoItem"); Element name = newDoc.createElement("name"); name.appendChild(newDoc.createTextNode(item.getName())); privateRepoItem.appendChild(name); Element season = newDoc.createElement("season"); season.appendChild(newDoc.createTextNode(Integer.toString(item.getSeason()))); privateRepoItem.appendChild(season); Element episode = newDoc.createElement("episode"); episode.appendChild(newDoc.createTextNode(Integer.toString(item.getEpisode()))); privateRepoItem.appendChild(episode); Element language = newDoc.createElement("language"); language.appendChild(newDoc.createTextNode(item.getLanguage())); privateRepoItem.appendChild(language); Element filename = newDoc.createElement("filename"); filename.appendChild(newDoc.createTextNode(item.getFilename())); privateRepoItem.appendChild(filename); Element tvdbid = newDoc.createElement("tvdbid"); tvdbid.appendChild(newDoc.createTextNode(Integer.toString(item.getTvdbid()))); privateRepoItem.appendChild(tvdbid); Element uploader = newDoc.createElement("uploader"); uploader.appendChild(newDoc.createTextNode(item.getUploader())); privateRepoItem.appendChild(uploader); Element originalsource = newDoc.createElement("originalSource"); originalsource.appendChild(newDoc.createTextNode(item.getOriginalSource())); privateRepoItem.appendChild(originalsource); Element videotype = newDoc.createElement("videotype"); videotype.appendChild(newDoc.createTextNode(item.getVideoType().toString())); privateRepoItem.appendChild(videotype); Element imdbid = newDoc.createElement("imdbid"); imdbid.appendChild(newDoc.createTextNode(Integer.toString(item.getImdbid()))); privateRepoItem.appendChild(imdbid); Element year = newDoc.createElement("year"); year.appendChild(newDoc.createTextNode(Integer.toString(item.getYear()))); privateRepoItem.appendChild(year); rootElement.appendChild(privateRepoItem); } Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StreamResult result = new StreamResult(new StringWriter()); DOMSource source = new DOMSource(newDoc); transformer.transform(source, result); return result.getWriter().toString(); } catch (ParserConfigurationException | TransformerFactoryConfigurationError | TransformerException e) { LOGGER.error("setIndex()", e); } return ""; } public static String extractUploader(String filename) { return extract(filename, "uploader-"); } public static String extractOriginalSource(String filename) { return extract(filename, "originalSource-"); } public static String extract(String filename, String extractWord) { String splitter = "--"; int intExtractWordLength = extractWord.length(); if (filename.contains(extractWord)) { int startPos = filename.indexOf(extractWord); String temp = filename.substring(startPos + intExtractWordLength); return temp.split(splitter)[0]; } return ""; } public static String getFullFilename(String filename, String uploader, String originalSource) { if (uploader.isEmpty() && originalSource.isEmpty()) { return filename; } else { return FilenameUtils.removeExtension(filename) + "--" + "uploader-" + uploader + "--" + "originalSource-" + originalSource + "--" + "." + FilenameUtils.getExtension(filename); } } /** * @param filename * @return */ public static String extractOriginalFilename(String name) { if (name.contains("--")) return name.split("--")[0] + "." + FilenameUtils.getExtension(name); return name; } /** * @param indexSubtitle * @return */ public static String getFullFilename(IndexSubtitle indexSubtitle) { return getFullFilename(indexSubtitle.getFilename(), indexSubtitle.getUploader(), indexSubtitle.getOriginalSource()); } }