Enable TheTVDBv2 by default and implement the necessary workarounds to make it behave the same was as the old XML API (i.e. default to English)
This commit is contained in:
parent
15ab77d00f
commit
37de6c9a15
|
@ -40,7 +40,6 @@ import net.filebot.web.TMDbClient;
|
||||||
import net.filebot.web.TMDbTVClient;
|
import net.filebot.web.TMDbTVClient;
|
||||||
import net.filebot.web.TVMazeClient;
|
import net.filebot.web.TVMazeClient;
|
||||||
import net.filebot.web.TheTVDBClient;
|
import net.filebot.web.TheTVDBClient;
|
||||||
import net.filebot.web.TheTVDBClientV1;
|
|
||||||
import net.filebot.web.VideoHashSubtitleService;
|
import net.filebot.web.VideoHashSubtitleService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,9 +59,6 @@ public final class WebServices {
|
||||||
public static final TheTVDBClientWithLocalSearch TheTVDB = new TheTVDBClientWithLocalSearch(getApiKey("thetvdb"));
|
public static final TheTVDBClientWithLocalSearch TheTVDB = new TheTVDBClientWithLocalSearch(getApiKey("thetvdb"));
|
||||||
public static final TMDbTVClient TheMovieDB_TV = new TMDbTVClient(TheMovieDB);
|
public static final TMDbTVClient TheMovieDB_TV = new TMDbTVClient(TheMovieDB);
|
||||||
|
|
||||||
// TheTVDB v2 implementation used for internal purposes and testing
|
|
||||||
public static final TheTVDBClient TheTVDBv2 = new TheTVDBClient(getApiKey("thetvdb"));
|
|
||||||
|
|
||||||
// subtitle sources
|
// subtitle sources
|
||||||
public static final OpenSubtitlesClient OpenSubtitles = new OpenSubtitlesClientWithLocalSearch(getApiKey("opensubtitles"), getApplicationVersion());
|
public static final OpenSubtitlesClient OpenSubtitles = new OpenSubtitlesClientWithLocalSearch(getApiKey("opensubtitles"), getApplicationVersion());
|
||||||
public static final ShooterSubtitles Shooter = new ShooterSubtitles();
|
public static final ShooterSubtitles Shooter = new ShooterSubtitles();
|
||||||
|
@ -74,7 +70,7 @@ public final class WebServices {
|
||||||
public static final ID3Lookup MediaInfoID3 = new ID3Lookup();
|
public static final ID3Lookup MediaInfoID3 = new ID3Lookup();
|
||||||
|
|
||||||
public static Datasource[] getServices() {
|
public static Datasource[] getServices() {
|
||||||
return new Datasource[] { TheMovieDB, OMDb, TheTVDB, AniDB, TheMovieDB_TV, TVmaze, AcoustID, MediaInfoID3, XattrMetaData, OpenSubtitles, Shooter, TheTVDBv2, FanartTV };
|
return new Datasource[] { TheMovieDB, OMDb, TheTVDB, AniDB, TheMovieDB_TV, TVmaze, AcoustID, MediaInfoID3, XattrMetaData, OpenSubtitles, Shooter, FanartTV };
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MovieIdentificationService[] getMovieIdentificationServices() {
|
public static MovieIdentificationService[] getMovieIdentificationServices() {
|
||||||
|
@ -126,7 +122,7 @@ public final class WebServices {
|
||||||
|
|
||||||
public static final ExecutorService requestThreadPool = Executors.newCachedThreadPool();
|
public static final ExecutorService requestThreadPool = Executors.newCachedThreadPool();
|
||||||
|
|
||||||
public static class TheTVDBClientWithLocalSearch extends TheTVDBClientV1 {
|
public static class TheTVDBClientWithLocalSearch extends TheTVDBClient {
|
||||||
|
|
||||||
public TheTVDBClientWithLocalSearch(String apikey) {
|
public TheTVDBClientWithLocalSearch(String apikey) {
|
||||||
super(apikey);
|
super(apikey);
|
||||||
|
|
|
@ -32,6 +32,8 @@ import net.filebot.ResourceManager;
|
||||||
|
|
||||||
public class TheTVDBClient extends AbstractEpisodeListProvider implements ArtworkProvider {
|
public class TheTVDBClient extends AbstractEpisodeListProvider implements ArtworkProvider {
|
||||||
|
|
||||||
|
private static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
|
||||||
|
|
||||||
private String apikey;
|
private String apikey;
|
||||||
|
|
||||||
public TheTVDBClient(String apikey) {
|
public TheTVDBClient(String apikey) {
|
||||||
|
@ -40,7 +42,7 @@ public class TheTVDBClient extends AbstractEpisodeListProvider implements Artwor
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIdentifier() {
|
public String getIdentifier() {
|
||||||
return "TheTVDBv2";
|
return "TheTVDB";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -71,9 +73,9 @@ public class TheTVDBClient extends AbstractEpisodeListProvider implements Artwor
|
||||||
private Map<String, String> getRequestHeader(Locale locale) {
|
private Map<String, String> getRequestHeader(Locale locale) {
|
||||||
Map<String, String> header = new LinkedHashMap<String, String>(3);
|
Map<String, String> header = new LinkedHashMap<String, String>(3);
|
||||||
|
|
||||||
// TODO support for default language => https://trello.com/c/dyEhtfky/16-handle-multiple-languages-in-the-accept-language-header
|
// TODO support for default language has not been implemented yet => https://trello.com/c/dyEhtfky/16-handle-multiple-languages-in-the-accept-language-header
|
||||||
if (locale != null && locale != Locale.ROOT) {
|
if (locale != null && locale != Locale.ROOT) {
|
||||||
header.put("Accept-Language", Stream.of(locale, Locale.ENGLISH).map(Locale::getLanguage).distinct().collect(joining(", ")));
|
header.put("Accept-Language", locale.getLanguage());
|
||||||
}
|
}
|
||||||
header.put("Accept", "application/json");
|
header.put("Accept", "application/json");
|
||||||
header.put("Authorization", "Bearer " + getAuthorizationToken());
|
header.put("Authorization", "Bearer " + getAuthorizationToken());
|
||||||
|
@ -165,6 +167,11 @@ public class TheTVDBClient extends AbstractEpisodeListProvider implements Artwor
|
||||||
SeriesInfo info = getSeriesInfo(series, locale);
|
SeriesInfo info = getSeriesInfo(series, locale);
|
||||||
info.setOrder(sortOrder.name());
|
info.setOrder(sortOrder.name());
|
||||||
|
|
||||||
|
// ignore preferred language if basic series information isn't even available
|
||||||
|
if (info.getName() == null && !locale.equals(DEFAULT_LOCALE)) {
|
||||||
|
return fetchSeriesData(series, sortOrder, DEFAULT_LOCALE);
|
||||||
|
}
|
||||||
|
|
||||||
// fetch episode data
|
// fetch episode data
|
||||||
List<Episode> episodes = new ArrayList<Episode>();
|
List<Episode> episodes = new ArrayList<Episode>();
|
||||||
List<Episode> specials = new ArrayList<Episode>();
|
List<Episode> specials = new ArrayList<Episode>();
|
||||||
|
@ -178,10 +185,20 @@ public class TheTVDBClient extends AbstractEpisodeListProvider implements Artwor
|
||||||
}
|
}
|
||||||
|
|
||||||
streamJsonObjects(json, "data").forEach(it -> {
|
streamJsonObjects(json, "data").forEach(it -> {
|
||||||
|
Integer id = getInteger(it, "id");
|
||||||
String episodeName = getString(it, "episodeName");
|
String episodeName = getString(it, "episodeName");
|
||||||
|
|
||||||
|
// default to English episode title if the preferred language is not available
|
||||||
|
if (episodeName == null && !locale.equals(DEFAULT_LOCALE)) {
|
||||||
|
try {
|
||||||
|
episodeName = getEpisodeList(series, sortOrder, DEFAULT_LOCALE).stream().filter(e -> id.equals(e.getId())).findFirst().map(Episode::getTitle).orElse(null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
debug.warning(cause("Failed to retrieve default episode title", e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Integer absoluteNumber = getInteger(it, "absoluteNumber");
|
Integer absoluteNumber = getInteger(it, "absoluteNumber");
|
||||||
SimpleDate airdate = getStringValue(it, "firstAired", SimpleDate::parse);
|
SimpleDate airdate = getStringValue(it, "firstAired", SimpleDate::parse);
|
||||||
Integer id = getInteger(it, "id");
|
|
||||||
|
|
||||||
// default numbering
|
// default numbering
|
||||||
Integer episodeNumber = getInteger(it, "airedEpisodeNumber");
|
Integer episodeNumber = getInteger(it, "airedEpisodeNumber");
|
||||||
|
|
|
@ -80,6 +80,16 @@ public class TheTVDBClientTest {
|
||||||
assertEquals("296337", first.getId().toString());
|
assertEquals("296337", first.getId().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getEpisodeListMissingInformation() throws Exception {
|
||||||
|
List<Episode> list = db.getEpisodeList(wonderfalls, SortOrder.Airdate, Locale.JAPANESE);
|
||||||
|
|
||||||
|
Episode first = list.get(0);
|
||||||
|
|
||||||
|
assertEquals("Wonderfalls", first.getSeriesName());
|
||||||
|
assertEquals("Wax Lion", first.getTitle());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getEpisodeListIllegalSeries() throws Exception {
|
public void getEpisodeListIllegalSeries() throws Exception {
|
||||||
List<Episode> list = db.getEpisodeList(new SearchResult(313193, "*** DOES NOT EXIST ***"), SortOrder.Airdate, Locale.ENGLISH);
|
List<Episode> list = db.getEpisodeList(new SearchResult(313193, "*** DOES NOT EXIST ***"), SortOrder.Airdate, Locale.ENGLISH);
|
||||||
|
|
Loading…
Reference in New Issue