package org.lodder.subtools.multisubdownloader.subtitleproviders; import java.io.File; import java.util.ArrayList; import java.util.List; import org.lodder.subtools.multisubdownloader.lib.control.MovieReleaseControl; import org.lodder.subtools.multisubdownloader.lib.control.TvReleaseControl; import org.lodder.subtools.multisubdownloader.settings.model.Settings; import org.lodder.subtools.sublibrary.DetectLanguage; import org.lodder.subtools.sublibrary.Manager; 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.lodder.subtools.sublibrary.model.VideoType; import org.lodder.subtools.sublibrary.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Local implements SubtitleProvider { private static final Logger LOGGER = LoggerFactory.getLogger(Local.class); private Settings settings; private Manager manager; public Local(Settings settings, Manager manager) { this.settings = settings; this.manager = manager; } @Override public String getName() { return "Local"; } @Override public List<Subtitle> search(Release release, String languageCode) { if (release instanceof MovieRelease) { return this.search((MovieRelease) release, languageCode); } else if (release instanceof TvRelease) { return this.search((TvRelease) release, languageCode); } return new ArrayList<Subtitle>(); } private List<File> getPossibleSubtitles(String filter) { List<File> possibleSubtitles = new ArrayList<File>(); for (File local : settings.getLocalSourcesFolders()) { possibleSubtitles.addAll(getAllSubtitlesFiles(local, filter)); } return possibleSubtitles; } public List<Subtitle> search(TvRelease tvRelease, String languagecode) { List<Subtitle> listFoundSubtitles = new ArrayList<Subtitle>(); ReleaseParser vfp = new ReleaseParser(); String filter = ""; if (tvRelease.getOriginalShowName().length() > 0) { filter = tvRelease.getOriginalShowName().replaceAll("[^A-Za-z]", "").trim(); } else { filter = tvRelease.getShow().replaceAll("[^A-Za-z]", "").trim(); } for (File fileSub : getPossibleSubtitles(filter)) { try { Release release = vfp.parse(fileSub); if (release.getVideoType() == VideoType.EPISODE) { if (((TvRelease) release).getSeason() == tvRelease.getSeason() && Utils.containsAll( ((TvRelease) release).getEpisodeNumbers(), tvRelease.getEpisodeNumbers())) { TvReleaseControl epCtrl = new TvReleaseControl((TvRelease) release, settings, manager); epCtrl.process(settings.getMappingSettings().getMappingList()); if (((TvRelease) release).getTvdbid() == tvRelease.getTvdbid()) { String detectedLang = DetectLanguage.execute(fileSub); if (detectedLang.equals(languagecode)) { LOGGER.debug("Local Sub found, adding [{}]", fileSub.toString()); listFoundSubtitles.add(new Subtitle(Subtitle.SubtitleSource.LOCAL, fileSub.getName(), fileSub.toString(), languagecode, ReleaseParser.getQualityKeyword(fileSub.getName()), SubtitleMatchType.EVERYTHING, ReleaseParser.extractReleasegroup(fileSub.getName(), true), fileSub.getAbsolutePath(), false)); } } } } } catch (Exception e) { if (LOGGER.isDebugEnabled() || LOGGER.isTraceEnabled()) { LOGGER.error(e.getMessage(), e); } else { LOGGER.error(e.getMessage()); } } } return listFoundSubtitles; } public List<Subtitle> search(MovieRelease movieRelease, String languagecode) { List<Subtitle> listFoundSubtitles = new ArrayList<Subtitle>(); ReleaseParser releaseParser = new ReleaseParser(); String filter = movieRelease.getTitle(); for (File fileSub : getPossibleSubtitles(filter)) { try { Release release = releaseParser.parse(fileSub); if (release.getVideoType() == VideoType.MOVIE) { MovieReleaseControl movieCtrl = new MovieReleaseControl((MovieRelease) release, settings, manager); movieCtrl.process(settings.getMappingSettings().getMappingList()); if (((MovieRelease) release).getImdbid() == movieRelease.getImdbid()) { String detectedLang = DetectLanguage.execute(fileSub); if (detectedLang.equals(languagecode)) { LOGGER.debug("Local Sub found, adding {}", fileSub.toString()); listFoundSubtitles.add(new Subtitle(Subtitle.SubtitleSource.LOCAL, fileSub.getName(), fileSub.toString(), "", ReleaseParser.getQualityKeyword(fileSub.getName()), SubtitleMatchType.EVERYTHING, ReleaseParser.extractReleasegroup(fileSub.getName(), true), fileSub.getAbsolutePath(), false)); } } } } catch (Exception e) { if (LOGGER.isDebugEnabled() || LOGGER.isTraceEnabled()) { LOGGER.error(e.getMessage(), e); } else { LOGGER.error(e.getMessage()); } } } return listFoundSubtitles; } private List<File> getAllSubtitlesFiles(File dir, String filter) { final List<File> filelist = new ArrayList<File>(); final File[] contents = dir.listFiles(); if (contents != null) { for (final File file : contents) { if (file.isFile()) { if (file.getName().replaceAll("[^A-Za-z]", "").toLowerCase() .contains(filter.toLowerCase()) && ReleaseParser.extractFileNameExtension(file.getName()).equals("srt")) { filelist.add(file); } } else { filelist.addAll(getAllSubtitlesFiles(file, filter)); } } } return filelist; } }