1
0
mirror of https://github.com/mitb-archive/filebot synced 2024-08-13 17:03:45 -04:00

Auto-Validate all path components of the {plex} path

This commit is contained in:
Reinhard Pointner 2016-05-23 15:06:25 +08:00
parent 8bed1ba2df
commit 0300064ea1
2 changed files with 34 additions and 17 deletions

View File

@ -924,7 +924,7 @@ public class MediaBindingBean {
public File getPlexStandardPath() throws Exception { public File getPlexStandardPath() throws Exception {
String path = NamingStandard.Plex.getPath(infoObject); String path = NamingStandard.Plex.getPath(infoObject);
try { try {
path = path.concat(getSubtitleTags()); path = path.concat(getSubtitleTags()); // NPE if {subt} is undefined
} catch (Exception e) { } catch (Exception e) {
// ignore => no language tags // ignore => no language tags
} }

View File

@ -1,12 +1,10 @@
package net.filebot.media; package net.filebot.media;
import static java.util.Arrays.*; import static java.util.Arrays.*;
import static java.util.Collections.*;
import static java.util.stream.Collectors.*; import static java.util.stream.Collectors.*;
import static net.filebot.WebServices.*;
import static net.filebot.similarity.Normalization.*; import static net.filebot.similarity.Normalization.*;
import static net.filebot.util.FileUtilities.*; import static net.filebot.util.FileUtilities.*;
import static net.filebot.web.EpisodeFormat.*; import static net.filebot.web.EpisodeUtilities.*;
import java.util.Objects; import java.util.Objects;
@ -15,14 +13,11 @@ import net.filebot.web.Episode;
import net.filebot.web.EpisodeFormat; import net.filebot.web.EpisodeFormat;
import net.filebot.web.Movie; import net.filebot.web.Movie;
import net.filebot.web.MoviePart; import net.filebot.web.MoviePart;
import net.filebot.web.MultiEpisode;
public enum NamingStandard { public enum NamingStandard {
Plex; Plex;
public static final int TITLE_MAX_LENGTH = 150;
public String getPath(Object o) { public String getPath(Object o) {
if (o instanceof Episode) if (o instanceof Episode)
return getPath((Episode) o); return getPath((Episode) o);
@ -36,19 +31,19 @@ public enum NamingStandard {
public String getPath(Episode e) { public String getPath(Episode e) {
// enforce title length limit by default // enforce title length limit by default
String episodeTitle = truncateText(SeasonEpisode.formatMultiTitle(e instanceof MultiEpisode ? ((MultiEpisode) e).getEpisodes() : singletonList(e)), TITLE_MAX_LENGTH); String episodeTitle = truncateText(EpisodeFormat.SeasonEpisode.formatMultiTitle(getMultiEpisodeList(e)), TITLE_MAX_LENGTH);
// Anime // Anime
if (isAnime(e)) { if (isAnime(e)) {
String primaryTitle = e.getSeriesInfo().getName(); String primaryTitle = e.getSeriesInfo().getName();
String episode = String.join(" - ", primaryTitle, EpisodeFormat.SeasonEpisode.formatSxE(e), episodeTitle); String episode = String.join(" - ", primaryTitle, EpisodeFormat.SeasonEpisode.formatSxE(e), episodeTitle);
return path("Anime", primaryTitle, episode); return path(getAnimeFolder(), primaryTitle, episode);
} }
// TV Series // TV Series
String episode = String.join(" - ", e.getSeriesName(), EpisodeFormat.SeasonEpisode.formatS00E00(e), episodeTitle); String episode = String.join(" - ", e.getSeriesName(), EpisodeFormat.SeasonEpisode.formatS00E00(e), episodeTitle);
String season = e.getSeason() == null ? e.getSpecial() == null ? null : "Specials" : String.format("Season %02d", e.getSeason()); String season = e.getSeason() == null ? e.getSpecial() == null ? null : getSpecialFolder(e.getSeason()) : getSeasonFolder(e.getSeason());
return path("TV Shows", e.getSeriesName(), season, episode); return path(getSeriesFolder(), e.getSeriesName(), season, episode);
} }
public String getPath(Movie m) { public String getPath(Movie m) {
@ -60,7 +55,7 @@ public enum NamingStandard {
name = String.format("%s CD%d", name, ((MoviePart) m).getPartIndex()); name = String.format("%s CD%d", name, ((MoviePart) m).getPartIndex());
} }
return path("Movies", m.getNameWithYear(), name); return path(getMovieFolder(), m.getNameWithYear(), name);
} }
public String getPath(AudioTrack a) { public String getPath(AudioTrack a) {
@ -72,25 +67,47 @@ public enum NamingStandard {
name = String.format("%02d. %s", a.getTrack(), name); name = String.format("%02d. %s", a.getTrack(), name);
} }
return path("Music", first(a.getAlbumArtist(), a.getArtist()), a.getAlbum(), name); return path(getMusicFolder(), first(a.getAlbumArtist(), a.getArtist()), a.getAlbum(), name);
} }
private static String path(String... name) { private static String path(String... name) {
return stream(name).filter(Objects::nonNull).map(s -> { return stream(name).filter(Objects::nonNull).map(s -> {
s = replacePathSeparators(s, " "); s = replacePathSeparators(s, " ");
s = replaceSpace(s, " ");
s = normalizeQuotationMarks(s); s = normalizeQuotationMarks(s);
s = trimTrailingPunctuation(s); s = trimTrailingPunctuation(s);
s = validateFileName(s);
return s; return s;
}).collect(joining("/")); }).filter(s -> s.length() > 0).collect(joining("/"));
} }
private static String first(String... options) { private static String first(String... options) {
return stream(options).filter(Objects::nonNull).findFirst().get(); return stream(options).filter(Objects::nonNull).findFirst().get();
} }
private static boolean isAnime(Episode e) { public String getMovieFolder() {
return AniDB.getIdentifier().equals(e.getSeriesInfo().getDatabase()); return "Movies";
} }
public String getSeriesFolder() {
return "TV Shows";
}
public String getAnimeFolder() {
return "Anime";
}
public String getMusicFolder() {
return "Music";
}
public String getSpecialFolder(Integer season) {
return "Specials";
}
public String getSeasonFolder(Integer season) {
return String.format("Season %02d", season == null ? 0 : season);
}
public static final int TITLE_MAX_LENGTH = 150;
} }