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

Add anime-lists parser

* https://github.com/ScudLee/anime-lists
This commit is contained in:
Reinhard Pointner 2019-06-08 02:02:58 +07:00
parent 2a44dcc1d6
commit 2fb9c4cfd9

View File

@ -1,10 +1,15 @@
package net.filebot.web; package net.filebot.web;
import static java.util.Arrays.*;
import static java.util.stream.Collectors.*;
import static net.filebot.CachedResource.*; import static net.filebot.CachedResource.*;
import static net.filebot.util.StringUtilities.*; import static net.filebot.util.StringUtilities.*;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.net.URL; import java.net.URL;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBContext;
import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute;
@ -18,17 +23,55 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import net.filebot.Cache; import net.filebot.Cache;
import net.filebot.CacheType; import net.filebot.CacheType;
import net.filebot.Resource; import net.filebot.Resource;
import net.filebot.WebServices;
public enum AnimeLists { public enum AnimeLists {
AniDB, TheTVDB; AniDB, TheTVDB;
public static final Resource<Model> MODEL = Resource.lazy(AnimeLists::fetchModel); public Optional<Episode> map(Episode episode, AnimeLists destination) throws Exception {
return find(episode.getSeriesInfo().getId()).map(a -> {
Integer s = destination.getSeason(a);
Integer e = destination.getEpisodeNumber(a, episode.getEpisode());
return episode.derive(s, e);
});
}
protected Integer getSeason(Entry a) {
return this == AniDB ? null : a.defaulttvdbseason;
}
protected Integer getEpisodeNumber(Entry a, Integer e) {
if (a.episodeoffset != null) {
return this == AniDB ? e - a.episodeoffset : e + a.episodeoffset;
}
return e;
}
public Optional<Integer> map(int id, AnimeLists destination) throws Exception {
return find(id).map(destination::getId);
}
public Optional<Entry> find(int id) throws Exception {
return stream(MODEL.get().anime).filter(this::isValid).filter(a -> id == getId(a)).findFirst();
}
protected int getId(Entry a) {
return this == AniDB ? a.anidbid : a.tvdbid;
}
protected boolean isValid(Entry a) {
return a.anidbid != null && a.tvdbid != null;
}
protected static Cache getCache() { protected static Cache getCache() {
return Cache.getCache("animelists", CacheType.Monthly); return Cache.getCache("animelists", CacheType.Monthly);
} }
protected static final Resource<Model> MODEL = Resource.lazy(AnimeLists::fetchModel);
protected static Model fetchModel() throws Exception { protected static Model fetchModel() throws Exception {
Cache cache = getCache(); Cache cache = getCache();
@ -102,8 +145,28 @@ public enum AnimeLists {
} }
} }
public static List<String> names() {
return stream(values()).map(Enum::name).collect(toList());
}
public static AnimeLists forName(String name) {
for (AnimeLists db : values()) {
if (db.name().equalsIgnoreCase(name)) {
return db;
}
}
throw new IllegalArgumentException(String.format("%s not in %s", name, asList(values())));
}
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
System.out.println(AnimeLists.MODEL.get()); System.out.println(AnimeLists.AniDB.map(14444, AnimeLists.TheTVDB));
List<Episode> episodes = WebServices.AniDB.getEpisodeList(14444, SortOrder.Absolute, Locale.ENGLISH);
for (Episode episode : episodes) {
System.out.println(AnimeLists.AniDB.map(episode, AnimeLists.TheTVDB));
}
System.exit(0); System.exit(0);
} }