package net.pms.dlna;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import net.pms.configuration.RendererConfiguration;
import net.pms.formats.v2.SubtitleType;
import net.pms.util.OpenSubtitle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaySub extends DLNAResource {
private static final Logger LOGGER = LoggerFactory.getLogger(PlaySub.class);
private String lang;
private String url;
private RealFile real;
private String name;
private File subFile;
public PlaySub(String name, String lang, RealFile real, String url) {
this.name = name;
this.real = real;
this.url = url;
this.lang = lang;
this.subFile = new File(OpenSubtitle.subFile(name + "_" + lang));
}
private void getSubFile() throws FileNotFoundException, IOException {
if (subFile.exists()) {
return;
}
OpenSubtitle.fetchSubs(url, subFile.getAbsolutePath());
}
public void setSub() {
try {
getSubFile();
} catch (FileNotFoundException e) {
LOGGER.info("Failed to get subtitles for " + real.getDisplayName());
return;
} catch (IOException e) {
LOGGER.info("Failed to get subtitles for " + real.getDisplayName());
return;
}
DLNAMediaSubtitle sub = new DLNAMediaSubtitle();
try {
sub.setExternalFile(subFile, null);
} catch (FileNotFoundException e) {
LOGGER.info("Failed to download subtitle file: " + subFile.getName());
return;
}
sub.setType(SubtitleType.SUBRIP);
sub.setId(1);
sub.setLang(lang);
real.setMediaSubtitle(sub);
}
@Override
public InputStream getInputStream() throws IOException {
setSub();
return real.getInputStream();
}
@Override
public synchronized InputStream getInputStream(Range range, RendererConfiguration mediarenderer) throws IOException {
setSub();
return real.getInputStream(range, mediarenderer);
}
@Override
public DLNAThumbnailInputStream getThumbnailInputStream() throws IOException {
try {
return DLNAThumbnailInputStream.toThumbnailInputStream(getResourceInputStream("images/codes/" + lang + ".png"));
} catch (Exception e) {
}
return super.getThumbnailInputStream();
}
@Override
public String getName() {
return name;
}
@Override
public String getDisplayName() {
return name;
}
@Override
public String getSystemName() {
return real.getSystemName();
}
@Override
public boolean isFolder() {
return false;
}
@Override
public boolean isValid() {
return true;
}
@Override
public long length() {
return real.length();
}
@Override
public boolean hasExternalSubtitles() {
return true;
}
}