package com.pinapelz; import com.google.gson.Gson; import com.pinapelz.datatypes.*; import com.pinapelz.query.*; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import retrofit2.Call; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.lang.reflect.Field; import java.util.concurrent.TimeUnit; /** * The class for interacting with the Holodex API */ public class Holodex { private HolodexService service; private int readTimeout = 35; private int writeTimeout = 35; /** * Instantiates a new Holodex with the default base url * * @param apiKey the api key */ public Holodex(String apiKey) { initializeHolodexService(apiKey, "https://holodex.net"); } /** * Instantiates a new Holodex with a custom base url * * @param apiKey the api key * @param baseUrl the base url */ public Holodex(String apiKey, String baseUrl) { initializeHolodexService(apiKey, baseUrl); } private void initializeHolodexService(String apiKey, String baseUrl){ OkHttpClient.Builder httpClient = new OkHttpClient.Builder() .writeTimeout(writeTimeout, TimeUnit.SECONDS) .readTimeout(readTimeout, TimeUnit.SECONDS); httpClient.addInterceptor(chain -> { Request original = chain.request(); Request request = original.newBuilder() .header("X-APIKEY", apiKey) .method(original.method(), original.body()) .build(); return chain.proceed(request); }); Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(JacksonConverterFactory.create()) .client(httpClient.build()) .build(); service = retrofit.create(HolodexService.class); } private Holodex setReadTimeout(int readTimeout) { this.readTimeout = readTimeout; return this; } private Holodex setWriteTimeout(int writeTimeout) { this.writeTimeout = writeTimeout; return this; } /** * Gets a list of upcoming and/or live SimpleVideos matching the VideoQueryBuilder attributes * * @param queryBuilder the query builder * @return A list of upcoming and/or live SimpleVideos * @throws HolodexException the holodex exception */ public List getLiveAndUpcomingVideos(VideoQueryBuilder queryBuilder) throws HolodexException { Call> call = service.getLiveVideos(queryBuilder.getChannelId(), queryBuilder.getId(), queryBuilder.getInclude(), queryBuilder.getLang(), queryBuilder.getLimit(), queryBuilder.getMaxUpcomingHours(), queryBuilder.getMentionedChannelId(), queryBuilder.getOffset(), queryBuilder.getOrder(), queryBuilder.getOrg(), queryBuilder.getPaginated(), queryBuilder.getSort(), queryBuilder.getStatus(), queryBuilder.getTopic(), queryBuilder.getType()); return executeCall(call); } /** * Gets a list of videos matching the VideoQueryBuilder attributes * * @param queryBuilder the query builder * @return list of videos * @throws HolodexException the holodex exception */ public List