package org.lodder.subtools.multisubdownloader.subtitleproviders.adapters; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.io.FilenameUtils; import org.lodder.subtools.multisubdownloader.subtitleproviders.SubtitleProvider; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.JOpenSubtitlesApi; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.OpenSubtitlesHasher; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.model.OpenSubtitlesMovieDescriptor; import org.lodder.subtools.multisubdownloader.subtitleproviders.opensubtitles.model.OpenSubtitlesSubtitleDescriptor; import org.lodder.subtools.sublibrary.JSubAdapter; import org.lodder.subtools.sublibrary.control.ReleaseParser; import org.lodder.subtools.sublibrary.model.MovieRelease; import org.lodder.subtools.sublibrary.model.Release; import org.lodder.subtools.sublibrary.model.Subtitle; import org.lodder.subtools.sublibrary.model.SubtitleMatchType; import org.lodder.subtools.sublibrary.model.TvRelease; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JOpenSubAdapter implements JSubAdapter, SubtitleProvider { private static JOpenSubtitlesApi joapi; private static final Logger LOGGER = LoggerFactory.getLogger(JOpenSubAdapter.class); public JOpenSubAdapter() { try { if (joapi == null) // joapi = new JOpenSubtitlesApi("OS Test User Agent"); joapi = new JOpenSubtitlesApi("JBierSubDownloader"); if (!joapi.isLoggedOn()) { joapi.loginAnonymous(); } } catch (Exception e) { LOGGER.error("API OPENSUBTITLES INIT", e); } } @Override public String getName() { return "OpenSubtitles"; } @Override public List<Subtitle> search(Release release, String languageCode) { if (release instanceof MovieRelease) { return this.searchSubtitles((MovieRelease) release, languageCode); } else if (release instanceof TvRelease) { return this.searchSubtitles((TvRelease) release, languageCode); } return new ArrayList<Subtitle>(); } protected void finalize() throws Throwable { // do finalization here if (joapi.isLoggedOn()) joapi.logout(); super.finalize(); // not necessar if extending Object. } public boolean isLoginOk() { if (!joapi.isLoggedOn()) { try { joapi.loginAnonymous(); return true; } catch (Exception e) { return false; } } else { return true; } } @Override public List<Subtitle> searchSubtitles(MovieRelease movieRelease, String... sublanguageids) { List<OpenSubtitlesSubtitleDescriptor> lSubtitles = new ArrayList<OpenSubtitlesSubtitleDescriptor>(); List<Subtitle> listFoundSubtitles = new ArrayList<Subtitle>(); try { if (isLoginOk()) { if (!movieRelease.getFilename().equals("")) { File file = new File(movieRelease.getPath(), movieRelease.getFilename()); if (file.exists()) try { lSubtitles = joapi.searchSubtitles(OpenSubtitlesHasher.computeHash(file), String.valueOf(file.length()), sublanguageids); } catch (Exception e) { LOGGER.error("API OPENSUBTITLES searchSubtitles using file hash", e); } } if (movieRelease.getImdbid() != 0) { try { lSubtitles.addAll(joapi.searchSubtitles(movieRelease.getImdbid(), sublanguageids)); } catch (Exception e) { LOGGER.error("API OPENSUBTITLES searchSubtitles using imdbid", e); } } if (lSubtitles.size() == 0) { try { lSubtitles.addAll(joapi.searchSubtitles(movieRelease.getTitle(), sublanguageids)); } catch (Exception e) { LOGGER.error("API OPENSUBTITLES searchSubtitles using title", e); } } } } catch (Exception e) { LOGGER.error("API OPENSUBTITLES searchSubtitles", e); } for (OpenSubtitlesSubtitleDescriptor ossd : lSubtitles) { if (movieRelease.getYear() == ossd.getMovieYear()) { listFoundSubtitles.add(new Subtitle(Subtitle.SubtitleSource.OPENSUBTITLES, ossd .getSubFileName(), ossd.getSubDownloadLink(), ossd.getISO639(), ReleaseParser .getQualityKeyword(ossd.getSubFileName()), SubtitleMatchType.EVERYTHING, ReleaseParser .extractReleasegroup(ossd.getSubFileName(), FilenameUtils.isExtension(ossd.getSubFileName(), "srt")), ossd.getUserNickName(), Boolean.valueOf(ossd.getSubHearingImpaired()))); } } return listFoundSubtitles; } public int searchMovieOnIMDB(MovieRelease movieRelease) { List<OpenSubtitlesMovieDescriptor> losm = new ArrayList<OpenSubtitlesMovieDescriptor>(); try { if (isLoginOk()) losm = joapi.searchMoviesOnIMDB(movieRelease.getTitle()); } catch (Exception e) { LOGGER.error("API OPENSUBTITLES searchMovieOnIMDB", e); } Pattern p = Pattern.compile(movieRelease.getTitle(), Pattern.CASE_INSENSITIVE); Matcher m; for (OpenSubtitlesMovieDescriptor osm : losm) { m = p.matcher(osm.getName()); if (m.find()) { if (movieRelease.getYear() > 0) { if (osm.getYear() == movieRelease.getYear()) return osm.getImdbId(); } else { return osm.getImdbId(); } } } return 0; } public OpenSubtitlesMovieDescriptor getIMDBMovieDetails(MovieRelease movieRelease) { OpenSubtitlesMovieDescriptor osm = null; try { if (isLoginOk()) osm = joapi.getIMDBMovieDetails(movieRelease.getImdbid()); } catch (Exception e) { LOGGER.error("API OPENSUBTITLES getIMDBMovieDetails", e); } return osm; } @Override public List<Subtitle> searchSubtitles(TvRelease tvRelease, String... sublanguageids) { List<OpenSubtitlesSubtitleDescriptor> lSubtitles = new ArrayList<OpenSubtitlesSubtitleDescriptor>(); List<Subtitle> listFoundSubtitles = new ArrayList<Subtitle>(); try { if (isLoginOk()) { try { if (tvRelease.getOriginalShowName().length() > 0) { lSubtitles.addAll(joapi.searchSubtitles(tvRelease.getOriginalShowName(), tvRelease.getSeason(), tvRelease.getEpisodeNumbers(), sublanguageids)); lSubtitles.addAll(joapi.searchSubtitles(tvRelease.getShow(), tvRelease.getSeason(), tvRelease.getEpisodeNumbers(), sublanguageids)); }else{ lSubtitles.addAll(joapi.searchSubtitles(tvRelease.getShow(), tvRelease.getSeason(), tvRelease.getEpisodeNumbers(), sublanguageids)); } } catch (Exception e) { LOGGER.error("API OPENSUBTITLES searchSubtitles using title", e); } } } catch (Exception e) { LOGGER.error("API OPENSUBTITLES searchSubtitles", e); } String name = tvRelease.getShow().replaceAll("[^A-Za-z]", "").toLowerCase(); String originalName = tvRelease.getOriginalShowName().replaceAll("[^A-Za-z]", "").toLowerCase(); for (OpenSubtitlesSubtitleDescriptor ossd : lSubtitles) { String subFileName = ossd.getSubFileName().replaceAll("[^A-Za-z]", "").toLowerCase(); if (subFileName.contains(name) || (originalName.length() > 0 && subFileName.contains(originalName))) { listFoundSubtitles.add(new Subtitle(Subtitle.SubtitleSource.OPENSUBTITLES, ossd .getSubFileName(), ossd.getSubDownloadLink(), ossd.getISO639(), ReleaseParser .getQualityKeyword(ossd.getSubFileName()), SubtitleMatchType.EVERYTHING, ReleaseParser .extractReleasegroup(ossd.getSubFileName(), FilenameUtils.isExtension(ossd.getSubFileName(), "srt")), ossd.getUserNickName(), Boolean.valueOf(ossd.getSubHearingImpaired()))); } } return listFoundSubtitles; } }