package net.pms.dlna; import java.io.IOException; import java.util.*; import net.pms.configuration.RendererConfiguration; import net.pms.dlna.virtual.VirtualFolder; import net.pms.formats.v2.SubtitleType; import net.pms.util.OpenSubtitle; import net.pms.util.UMSUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SubSelFile extends VirtualFolder { private static final Logger LOGGER = LoggerFactory.getLogger(SubSelFile.class); private DLNAResource orig; public SubSelFile(DLNAResource r) { super(r.getDisplayName(), r.getThumbnailURL(DLNAImageProfile.JPEG_TN)); orig = r; } @Override public DLNAThumbnailInputStream getThumbnailInputStream() throws IOException { try { return orig.getThumbnailInputStream(); } catch (Exception e) { return super.getThumbnailInputStream(); } } @Override public void discoverChildren() { Map<String, Object> data; RealFile rf = null; try { if (orig instanceof RealFile) { rf = (RealFile) orig; data = OpenSubtitle.findSubs(rf.getFile(), getDefaultRenderer()); } else { data = OpenSubtitle.querySubs(orig.getDisplayName(), getDefaultRenderer()); } } catch (IOException e) { return; } if (data == null || data.isEmpty()) { return; } List<String> sortedKeys = new ArrayList<>(data.keySet()); Collections.sort(sortedKeys, new SubSort(getDefaultRenderer())); for (String key : sortedKeys) { LOGGER.debug("Add play subtitle child " + key + " rf " + orig); DLNAMediaSubtitle sub = orig.getMediaSubtitle(); if (sub == null) { sub = new DLNAMediaSubtitle(); } String lang = OpenSubtitle.getLang(key); String name = OpenSubtitle.getName(key); sub.setType(SubtitleType.SUBRIP); sub.setId(101); sub.setLang(lang); sub.setLiveSub((String) data.get(key), OpenSubtitle.subFile(name + "_" + lang)); DLNAResource nrf = orig.clone(); nrf.setMediaSubtitle(sub); nrf.setHasExternalSubtitles(true); addChild(nrf); if (rf != null) { ((RealFile) nrf).ignoreThumbHandling(); } } } private static class SubSort implements Comparator<String> { private List<String> langs; SubSort(RendererConfiguration r) { langs = Arrays.asList(UMSUtils.getLangList(r, true).split(",")); } @Override public int compare(String key1, String key2) { if (langs == null) { return 0; } Integer index1 = langs.indexOf(OpenSubtitle.getLang(key1)); Integer index2 = langs.indexOf(OpenSubtitle.getLang(key2)); if (index1 == -1) { index1 = 999; } if (index2 == -1) { index2 = 999; } return index1.compareTo(index2); } } }