diff --git a/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java b/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java index 9f33e0851..00e4639c0 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java +++ b/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java @@ -18,7 +18,6 @@ import de.mediathekview.mserver.crawler.basic.AbstractCrawler; import de.mediathekview.mserver.crawler.basic.IgnoreFilmFilter; import de.mediathekview.mserver.crawler.basic.TimeoutTask; -import de.mediathekview.mserver.crawler.br.BrCrawler; import de.mediathekview.mserver.crawler.dreisat.DreiSatCrawler; import de.mediathekview.mserver.crawler.dw.DwCrawler; import de.mediathekview.mserver.crawler.funk.FunkCrawler; @@ -467,8 +466,6 @@ private void initializeCrawler(final MServerConfigManager rootConfig) { crawlerMap.put( Sender.ARTE_ES, new ArteCrawler_ES(forkJoinPool, messageListeners, progressListeners, rootConfig)); - crawlerMap.put( - Sender.BR, new BrCrawler(forkJoinPool, messageListeners, progressListeners, rootConfig)); crawlerMap.put( Sender.DREISAT, new DreiSatCrawler(forkJoinPool, messageListeners, progressListeners, rootConfig)); diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/BrClipQueryDto.java b/src/main/java/de/mediathekview/mserver/crawler/br/BrClipQueryDto.java deleted file mode 100644 index ebb3f08a0..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/BrClipQueryDto.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.mediathekview.mserver.crawler.br; - -import de.mediathekview.mserver.crawler.basic.GraphQlUrlDto; -import de.mediathekview.mserver.crawler.br.data.BrID; - -import java.util.Objects; - -public class BrClipQueryDto extends GraphQlUrlDto { - private final BrID id; - - public BrClipQueryDto(String aUrl, BrID id) { - super(aUrl, BrGraphQLQueries.getQuery2GetClipDetails(id)); - this.id = id; - } - - public BrID getId() { - return id; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - BrClipQueryDto that = (BrClipQueryDto) o; - return Objects.equals(id, that.id); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), id); - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/BrConstants.java b/src/main/java/de/mediathekview/mserver/crawler/br/BrConstants.java deleted file mode 100644 index 0f35c0fe0..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/BrConstants.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.mediathekview.mserver.crawler.br; - -public final class BrConstants { - private BrConstants() {} - - public static final String GRAPHQL_API = "https://api.mediathek.br.de/graphql"; - public static final int PAGE_SIZE = 100; - - public static final String BROADCAST_SERVICE_BR = "BR_Fernsehen"; - public static final String BROADCAST_SERVICE_ALPHA = "ARD_alpha"; -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/BrCrawler.java b/src/main/java/de/mediathekview/mserver/crawler/br/BrCrawler.java deleted file mode 100644 index f615c5d29..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/BrCrawler.java +++ /dev/null @@ -1,111 +0,0 @@ -package de.mediathekview.mserver.crawler.br; - -import de.mediathekview.mlib.daten.Film; -import de.mediathekview.mlib.daten.Sender; -import de.mediathekview.mlib.messages.listener.MessageListener; -import de.mediathekview.mserver.base.config.MServerConfigManager; -import de.mediathekview.mserver.base.messages.ServerMessages; -import de.mediathekview.mserver.crawler.basic.AbstractCrawler; -import de.mediathekview.mserver.crawler.br.tasks.BrBroadcastsTask; -import de.mediathekview.mserver.crawler.br.tasks.BrGetClipDetailsTask; -import de.mediathekview.mserver.progress.listeners.SenderProgressListener; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.time.LocalDate; -import java.util.Collection; -import java.util.Optional; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.RecursiveTask; - -public class BrCrawler extends AbstractCrawler { - private static final Logger LOG = LogManager.getLogger(BrCrawler.class); - public static final String BASE_URL = "https://www.br.de/mediathek/"; - - public BrCrawler( - final ForkJoinPool aForkJoinPool, - final Collection aMessageListeners, - final Collection aProgressListeners, - final MServerConfigManager rootConfig) { - super(aForkJoinPool, aMessageListeners, aProgressListeners, rootConfig); - } - - @Override - public Sender getSender() { - return Sender.BR; - } - - @Override - protected RecursiveTask> createCrawlerTask() { - - final RecursiveTask> createCompleteClipListTask = - createGetClipListCrawler(); - ConcurrentLinkedQueue idList = null; - - try { - final Set completeClipList = - forkJoinPool.submit(createCompleteClipListTask).get(); - - idList = new ConcurrentLinkedQueue<>(completeClipList); - incrementMaxCountBySizeAndGetNewSize(idList.size()); - printMessage( - ServerMessages.DEBUG_MSSING_SENDUNGFOLGEN_COUNT, getSender().getName(), idList.size()); - } catch (final InterruptedException ex) { - LOG.debug("{} crawler interrupted.", getSender().getName(), ex); - Thread.currentThread().interrupt(); - } catch (final ExecutionException ex) { - LOG.fatal("Exception in {} crawler.", getSender().getName(), ex); - } - - return new BrGetClipDetailsTask(this, idList); - } - - private RecursiveTask> createGetClipListCrawler() { - final LocalDate now = LocalDate.now(); - final Queue input = new ConcurrentLinkedQueue<>(); - - for (int i = 0; i <= crawlerConfig.getMaximumDaysForSendungVerpasstSection(); i++) { - final LocalDate day = now.minusDays(i); - input.add( - new BrQueryDto( - BrConstants.GRAPHQL_API, - BrConstants.BROADCAST_SERVICE_BR, - day, - day, - BrConstants.PAGE_SIZE, - Optional.empty())); - input.add( - new BrQueryDto( - BrConstants.GRAPHQL_API, - BrConstants.BROADCAST_SERVICE_ALPHA, - day, - day, - BrConstants.PAGE_SIZE, - Optional.empty())); - } - for (int i = 1; i <= crawlerConfig.getMaximumDaysForSendungVerpasstSectionFuture(); i++) { - final LocalDate day = now.plusDays(i); - input.add( - new BrQueryDto( - BrConstants.GRAPHQL_API, - BrConstants.BROADCAST_SERVICE_BR, - day, - day, - BrConstants.PAGE_SIZE, - Optional.empty())); - input.add( - new BrQueryDto( - BrConstants.GRAPHQL_API, - BrConstants.BROADCAST_SERVICE_ALPHA, - day, - day, - BrConstants.PAGE_SIZE, - Optional.empty())); - } - return new BrBroadcastsTask(this, input); - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/BrGraphQLQueries.java b/src/main/java/de/mediathekview/mserver/crawler/br/BrGraphQLQueries.java deleted file mode 100644 index 6d016f683..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/BrGraphQLQueries.java +++ /dev/null @@ -1,250 +0,0 @@ -package de.mediathekview.mserver.crawler.br; - -import de.mediathekview.mserver.crawler.br.data.BrGraphQLElementNames; -import de.mediathekview.mserver.crawler.br.data.BrGraphQLNodeNames; -import de.mediathekview.mserver.crawler.br.data.BrID; -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; -import de.mediathekview.mserver.crawler.br.graphql.variables.*; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; - -public class BrGraphQLQueries { - - public static final String OBJECT_TITLE_EDGES = "edges"; - public static final String OBJECT_TITLE_CATEGORIZATIONS = "categorizations"; - private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - - private static final String JSON_GRAPHQL_HEADER = "{\"query\":\""; - public static final String SUB_VARIABLE_COUNT = "count"; - public static final String OBJECT_TITLE_AUTHORS = "authors"; - public static final String OBJECT_TITLE_NODE = "node"; - public static final String SUB_VARIABLE_ID = "id"; - public static final String SUB_VARIABLE_NAME = "name"; - public static final String OBJECT_TITLE_SUBJECTS = "subjects"; - public static final String OBJECT_TITLE_TAGS = "tags"; - public static final String SUB_VARIABLE_LABEL = "label"; - public static final String OBJECT_TITLE_EXECUTIVE_PRODUCERS = "executiveProducers"; - public static final String OBJECT_TITLE_CREDITS = "credits"; - public static final String OBJECT_TITLE_GENRES = "genres"; - - private BrGraphQLQueries() {} - - public static String getQuery2GetClipDetails(BrID clipId) { - - IDVariable clipID = new IDVariable("clipID", clipId.getId()); - clipID.setAsNotNullableType(); - List variablesList = new LinkedList<>(); - variablesList.add(clipID); - - VariableList rootVariable = new VariableList(variablesList); - - String searchTitle = "MediathekViewGetClipDetails"; - - StringBuilder queryBuilder = new StringBuilder(); - queryBuilder.append(JSON_GRAPHQL_HEADER); - queryBuilder.append(getGraphQLHeaderWithVariable(searchTitle, rootVariable)); - queryBuilder.append( - addObjectConstruct( - BrGraphQLNodeNames.RESULT_ROOT_BR_NODE.getName(), - addObjectConstruct( - "clipDetails: clip(id: $clipID)", - BrGraphQLElementNames.GRAPHQL_TYPE_ELEMENT.getName(), - BrGraphQLElementNames.ID_ELEMENT.getName(), - BrGraphQLElementNames.STRING_CLIP_TITLE.getName(), - BrGraphQLElementNames.STRING_CLIP_KICKER.getName(), - BrGraphQLElementNames.INT_CLIP_DURATION.getName(), - "ageRestriction", - BrGraphQLElementNames.STRING_CLIP_DESCRIPTION.getName(), - BrGraphQLElementNames.STRING_CLIP_SHORT_DESCRIPTION.getName(), - BrGraphQLElementNames.STRING_CLIP_SLUG.getName(), - BrGraphQLElementNames.STRING_CLIP_AVAILABLE_UNTIL.getName(), - addAuthors(), - addSubjects(), - addTags(), - addExecutiveProducers(), - addCredits(), - addCategorizations(), - addGenres(), - addVideoFiles(), - addCaptionFiles(), - addOnItemInterface(), - addOnProgrammeInterface()), - SUB_VARIABLE_ID)); - - queryBuilder.append("}"); - - queryBuilder.append(getGraphQLFooterWithVariable(rootVariable)); - - return queryBuilder.toString(); - } - - public static String getQueryGetIds( - String broadcastServiceName, - LocalDate start, - LocalDate end, - int pageSize, - Optional cursor) { - String afterPart = ""; - if (cursor.isPresent()) { - afterPart = String.format(", after: \\\"%s\\\"", cursor.get()); - } - - return String.format( - "{\"query\":\"query MediathekViewCountFilms( $programmeFilter: ProgrammeFilter!) { viewer { ...on Viewer { broadcastService(id: \\\"av:http://ard.de/ontologies/ard#%s\\\") { __typename ...on BroadcastServiceInterface { id programmes(first: %d, orderBy: INITIALSCREENING_START_DESC, filter: $programmeFilter%s) { count pageInfo {hasNextPage} edges { node { videoFiles { count } } } edges { cursor node { id __typename description broadcasts { edges {node {start}}} initialScreening { start }}} } } } } }}\",\"variables\":{\"programmeFilter\":{\"status\":{\"id\":{\"eq\":\"av:http://ard.de/ontologies/lifeCycle#published\"}},\"broadcasts\":{\"start\":{\"gte\":\"%sT00:00:00.000Z\",\"lte\":\"%sT23:59:59.000Z\"}}}}}", - broadcastServiceName, - pageSize, - afterPart, - start.format(DATE_FORMATTER), - end.format(DATE_FORMATTER)); - } - - static String getGraphQLHeaderWithVariable(String queryName, VariableList rootElement) - throws IllegalArgumentException { - - if (!rootElement.isRootElement()) - throw new IllegalArgumentException( - "Header basieren auf einer echten rootElement Liste. Bitte diese übergeben!"); - - StringBuilder sb = new StringBuilder(); - - sb.append("query "); - sb.append(queryName); - sb.append("("); - - List elements = rootElement.getValue(); - - elements.forEach( - (AbstractVariable v) -> { - sb.append(getVariableNameAsJSON(v.getName())); - if (v instanceof BooleanVariable) { - sb.append("Boolean"); - } else if (v instanceof FloatVariable) { - sb.append("Float"); - } else if (v instanceof IDVariable) { - sb.append("ID"); - } else if (v instanceof IntegerVariable) { - sb.append("Int"); - } else if (v instanceof StringVariable) { - sb.append("String"); - } else { - sb.append(v.getName().substring(0, 1).toUpperCase()); - sb.append(v.getName().substring(1)); - } - if (v.isNotNullableType()) { - sb.append("!"); - } - }); - - sb.append(") {"); - - return sb.toString(); - } - - static String getGraphQLFooterWithVariable(VariableList rootElement) { - return "\"," + rootElement.getJSONFromVariableOrDefaulNull() + "}"; - } - - private static String getVariableNameAsJSON(String variable) { - return " $" - + variable.substring(0, 1).toLowerCase() - + variable.substring(1) - + ": "; - } - - private static String addAuthors() { - return addObjectConstruct(OBJECT_TITLE_AUTHORS, SUB_VARIABLE_COUNT, addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, SUB_VARIABLE_NAME))); - } - - private static String addSubjects() { - return addObjectConstruct( - OBJECT_TITLE_SUBJECTS, SUB_VARIABLE_COUNT, addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID))); - } - - private static String addTags() { - return addObjectConstruct( - OBJECT_TITLE_TAGS, SUB_VARIABLE_COUNT, addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, SUB_VARIABLE_LABEL))); - } - - private static String addExecutiveProducers() { - return addObjectConstruct( - OBJECT_TITLE_EXECUTIVE_PRODUCERS, - SUB_VARIABLE_COUNT, - addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, SUB_VARIABLE_NAME))); - } - - private static String addCredits() { - return addObjectConstruct( - OBJECT_TITLE_CREDITS, SUB_VARIABLE_COUNT, addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, SUB_VARIABLE_NAME))); - } - - private static String addCategorizations() { - return addObjectConstruct( - OBJECT_TITLE_CATEGORIZATIONS, SUB_VARIABLE_COUNT, addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID))); - } - - private static String addGenres() { - return addObjectConstruct( - OBJECT_TITLE_GENRES, SUB_VARIABLE_COUNT, addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, SUB_VARIABLE_LABEL))); - } - - private static String addVideoFiles() { - return addObjectConstruct( - "videoFiles(first: 50, orderBy: FILESIZE_DESC)", - SUB_VARIABLE_COUNT, - addObjectConstruct( - OBJECT_TITLE_EDGES, - addObjectConstruct( - OBJECT_TITLE_NODE, - SUB_VARIABLE_ID, - "fileSize", - "publicLocation", - addObjectConstruct( - "accessibleIn(first: 50)", - SUB_VARIABLE_COUNT, - addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, "baseIdPrefix"))), - addObjectConstruct("videoProfile", SUB_VARIABLE_ID, "height", "width")))); - } - - private static String addCaptionFiles() { - return addObjectConstruct( - "captionFiles(first: 50, orderBy: FILESIZE_DESC)", - SUB_VARIABLE_COUNT, - addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, "publicLocation"))); - } - - private static String addOnItemInterface() { - return addObjectConstruct( - "... on ItemInterface", - "availableUntil", - addObjectConstruct( - "itemOf", - SUB_VARIABLE_COUNT, - addObjectConstruct(OBJECT_TITLE_EDGES, addObjectConstruct(OBJECT_TITLE_NODE, SUB_VARIABLE_ID, "title")))); - } - - private static String addOnProgrammeInterface() { - return addObjectConstruct( - "... on ProgrammeInterface", - "episodeNumber", - addObjectConstruct( - "episodeOf", SUB_VARIABLE_ID, "title", "kicker", "scheduleInfo", "shortDescription"), - addObjectConstruct("initialScreening", "start", SUB_VARIABLE_ID)); - } - - private static String addObjectConstruct(String title, String... subVariables) { - - StringBuilder sb = new StringBuilder(); - sb.append(" "); - sb.append(title); - sb.append(" { "); - Arrays.asList(subVariables).forEach((String name) -> sb.append(name).append(" ")); - sb.append(" } "); - - return sb.toString(); - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/BrQueryDto.java b/src/main/java/de/mediathekview/mserver/crawler/br/BrQueryDto.java deleted file mode 100644 index d7a7d7ba6..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/BrQueryDto.java +++ /dev/null @@ -1,65 +0,0 @@ -package de.mediathekview.mserver.crawler.br; - -import de.mediathekview.mserver.crawler.basic.GraphQlUrlDto; -import java.time.LocalDate; -import java.util.Objects; -import java.util.Optional; - -public class BrQueryDto extends GraphQlUrlDto { - - private final String broadcastServiceName; - private final LocalDate start; - private final LocalDate end; - private final int pageSize; - private final Optional cursor; - - public BrQueryDto( - String url, String broadcastServiceName, LocalDate start, LocalDate end, int pageSize, Optional cursor) { - super(url, BrGraphQLQueries.getQueryGetIds(broadcastServiceName, start, end, pageSize, cursor)); - this.broadcastServiceName = broadcastServiceName; - this.start = start; - this.end = end; - this.pageSize = pageSize; - this.cursor = cursor; - } - - public String getBroadcastServiceName() { - return broadcastServiceName; - } - public LocalDate getStart() { return start; } - - public LocalDate getEnd() { - return end; - } - - public int getPageSize() { - return pageSize; - } - - public Optional getCursor() { - return cursor; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof BrQueryDto)) { - return false; - } - if (!super.equals(o)) { - return false; - } - BrQueryDto that = (BrQueryDto) o; - return pageSize == that.pageSize - && Objects.equals(broadcastServiceName, that.broadcastServiceName) - && Objects.equals(start, that.start) - && Objects.equals(end, that.end); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), start, end, pageSize); - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrClipCollectIDResult.java b/src/main/java/de/mediathekview/mserver/crawler/br/data/BrClipCollectIDResult.java deleted file mode 100644 index 5021df9d6..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrClipCollectIDResult.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * BrClipCollectResult.java - * - * Projekt : MServer - * erstellt am: 12.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.data; - -import de.mediathekview.mserver.crawler.br.json.BrIdsDTO; - -public class BrClipCollectIDResult { - - private BrIdsDTO clipList; - private boolean hasNextPage; - private String cursor = null; - private int resultSize; - - public BrClipCollectIDResult() { - clipList=new BrIdsDTO(); -} - - public synchronized BrIdsDTO getClipList() { - return clipList; - } - public synchronized boolean hasNextPage() { - return hasNextPage; - } - public synchronized String getCursor() { - return cursor; - } - public synchronized void setClipList(BrIdsDTO clipList) { - this.clipList = clipList; - } - - public synchronized void setHasNextPage() { - this.hasNextPage = true; - } - - public synchronized void setHasNonNextPage() { - this.hasNextPage = false; - } - - public synchronized void setCursor(String cursor) { - this.cursor = cursor; - } - public synchronized int getResultSize() { - return resultSize; - } - public synchronized void setResultSize(int resultSize) { - this.resultSize = resultSize; - } - - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrClipType.java b/src/main/java/de/mediathekview/mserver/crawler/br/data/BrClipType.java deleted file mode 100644 index c7829bf20..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrClipType.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * BrClipType.java - * - * Projekt : MServer - * erstellt am: 12.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.data; - -import java.util.Arrays; -import java.util.Optional; - -public enum BrClipType { - - PROGRAMME("Programme"), - ITEM("Item"); - - private final String graphQLName; - - BrClipType(String graphQLName) { - this.graphQLName = graphQLName; - } - - public static BrClipType getInstanceByName(String name) { - Optional value = Arrays.stream(BrClipType.values()).filter(v -> v.getGraphQLName().equals(name)).findFirst(); - return value.orElse(null); - - } - - public String getGraphQLName() { - return this.graphQLName; - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrGraphQLElementNames.java b/src/main/java/de/mediathekview/mserver/crawler/br/data/BrGraphQLElementNames.java deleted file mode 100644 index 189141295..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrGraphQLElementNames.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * BrGraphQLElementNames.java - * - * Projekt : MServer - * erstellt am: 14.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.data; - -public enum BrGraphQLElementNames { - - BOOLEAN_HAS_NEXT_PAGE("hasNextPage"), - GRAPHQL_TYPE_ELEMENT("__typename"), - ID_ELEMENT("id"), - INT_CLIP_DURATION("duration"), - INT_COUNTER_ELEMENT("count"), - STRING_CURSOR_ELEMENT("cursor"), - STRING_CLIP_AVAILABLE_UNTIL("availableUntil"), - STRING_CLIP_DESCRIPTION("description"), - STRING_CLIP_KICKER("kicker"), - STRING_CLIP_SHORT_DESCRIPTION("shortDescription"), - STRING_CLIP_SLUG("slug"), - STRING_CLIP_START("start"), - STRING_CLIP_TITLE("title"), - STRING_CLIP_URL("publicLocation"), - STRING_CLIP_FILE_SIZE("fileSize") - ; - - private final String elementName; - - BrGraphQLElementNames(String elementName) { - this.elementName = elementName; - } - - public String getName() { - return this.elementName; - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrGraphQLNodeNames.java b/src/main/java/de/mediathekview/mserver/crawler/br/data/BrGraphQLNodeNames.java deleted file mode 100644 index 75b5978ac..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrGraphQLNodeNames.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * BrGraphQLNodeNames.java - * - * Projekt : MServer - * erstellt am: 14.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.data; - -public enum BrGraphQLNodeNames { - - RESULT_ERRORS_NODE("errors"), - RESULT_ROOT_NODE("data"), - RESULT_ROOT_BR_NODE("viewer"), - RESULT_CLIP_BROADCAST_ROOT("broadcasts"), - RESULT_CLIP_BROADCASTSERVICE_ROOT("broadcastService"), - RESULT_CLIP_PROGRAMMES_ROOT("programmes"), - RESULT_CLIP_CAPTION_FILES("captionFiles"), - RESULT_CLIP_ID_ROOT("searchAllClips"), - RESULT_CLIP_DETAILS_ROOT("clipDetails"), - RESULT_CLIP_EPISONEOF("episodeOf"), - RESULT_CLIP_ITEMOF("itemOf"), - RESULT_CLIP_VIDEO_FILES("videoFiles"), - RESULT_CLIP_VIDEO_PROFILE("videoProfile"), - RESULT_PAGE_INFO("pageInfo"), - RESULT_NODE_EDGES("edges"), - RESULT_NODE("node") - ; - - private final String nodeName; - - BrGraphQLNodeNames(String nodeName) { - this.nodeName = nodeName; - } - - public String getName() { - return this.nodeName; - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrID.java b/src/main/java/de/mediathekview/mserver/crawler/br/data/BrID.java deleted file mode 100644 index 350f27504..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/data/BrID.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * BrID.java - * - * Projekt : MServer - * erstellt am: 12.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.data; - -public class BrID implements Comparable{ - - private BrClipType type; - private String id; - - private BrID() { - - } - - public BrID(BrClipType type, String id) { - this(); - this.type = type; - this.id = id; - } - - public synchronized BrClipType getType() { - return type; - } - - public synchronized void setType(BrClipType aType) { - this.type = aType; - } - - public synchronized String getId() { - return id; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - BrID other = (BrID) obj; - if (id == null) { - return other.id == null; - } else { - return id.equals(other.id); - } - } - - @Override - public int compareTo(BrID o) { - return this.id.compareTo(o.getId()); - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/AbstractVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/AbstractVariable.java deleted file mode 100644 index cc578113f..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/AbstractVariable.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * AbstraceVariable.java - * - * Projekt : MServer - * erstellt am: 03.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql; - -public abstract class AbstractVariable { - - protected String name; - protected T value; - protected boolean notNullType = false; // Default = false: http://facebook.github.io/graphql/October2016/#sec-Types.Non-Null - - protected AbstractVariable(String name, T value) { - this.name = name; - this.value = value; - } - - protected abstract String getVariable(); - - protected String getVariableWithDoubleQuoteSurrounding(String content) { - return "\"" + content + "\""; - } - - protected String getVariableWithCurlyBracketsSurrounding(String content) { - return "{" + content + "}"; - } - - protected String getAsJSONWithoutValue() { - return getVariableWithDoubleQuoteSurrounding(this.name) + ":"; - } - - public String getJSONFromVariableOrDefaulNull() { - return null == this.value ? getAsJSONWithoutValue() + "null" : getVariable(); - } - - public synchronized String getName() { - return name; - } - - public synchronized T getValue() { - return value; - } - - public void setAsNotNullableType() { - this.notNullType = true; - } - - public boolean isNullableType() { - return !this.notNullType; - } - - public boolean isNotNullableType() { - return this.notNullType; - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/GraphQLVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/GraphQLVariable.java deleted file mode 100644 index 10895e09d..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/GraphQLVariable.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * GraphQLVariable.java - * - * Projekt : MServer - * erstellt am: 11.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql; - -public interface GraphQLVariable { - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/GsonGraphQLHelper.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/GsonGraphQLHelper.java deleted file mode 100644 index abb04d1d3..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/GsonGraphQLHelper.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * GsonGraphQLHelper.java - * - * Projekt : MServer - * erstellt am: 02.01.2018 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql; - -import java.util.Optional; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; -import de.mediathekview.mserver.crawler.br.data.BrGraphQLNodeNames; - -public class GsonGraphQLHelper { - - private GsonGraphQLHelper() { - - } - - public static Optional getChildObjectIfExists(JsonObject parentNode, String childNodeName) { - return Optional.of(getElementIfExists(parentNode, childNodeName).filter(JsonElement::isJsonObject).map(JsonElement::getAsJsonObject)).orElse(Optional.empty()); - } - - public static Optional getChildArrayIfExists(JsonObject parentNode, String childNodeName) { - return Optional.of(getElementIfExists(parentNode, childNodeName).filter(JsonElement::isJsonArray).map(JsonElement::getAsJsonArray)).orElse(Optional.empty()); - } - - public static Optional getChildPrimitiveIfExists(JsonObject parentNode, String childNodeName) { - return Optional.of(getElementIfExists(parentNode, childNodeName).filter(JsonElement::isJsonPrimitive).map(JsonElement::getAsJsonPrimitive)).orElse(Optional.empty()); - } - - public static boolean checkForErrors(JsonObject rootObject) { - return getChildObjectIfExists(rootObject, BrGraphQLNodeNames.RESULT_ERRORS_NODE.getName()).isPresent(); - } - - private static Optional getElementIfExists(JsonObject parentNode, String childNodeName) { - if(!parentNode.has(childNodeName)) - return Optional.empty(); - - return Optional.of(parentNode.get(childNodeName)); - } - - - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/BooleanVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/BooleanVariable.java deleted file mode 100644 index 71e583632..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/BooleanVariable.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * BooleanVariable.java - * - * Projekt : MServer - * erstellt am: 03.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; - -public class BooleanVariable extends AbstractVariable { - - public BooleanVariable(String name, Boolean value) { - super(name, value); - } - - - @Override - protected String getVariable() { - return getAsJSONWithoutValue() + this.value.toString(); - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/FloatVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/FloatVariable.java deleted file mode 100644 index a7cb4d029..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/FloatVariable.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * FloatVariable.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; - -public class FloatVariable extends AbstractVariable { - - public FloatVariable(String name, Double value) { - super(name, value); - } - - @Override - protected String getVariable() { - return getAsJSONWithoutValue() + this.value.toString(); - } - - - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/IDVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/IDVariable.java deleted file mode 100644 index 685c8ff9a..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/IDVariable.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * IDVariable.java - * - * Projekt : MServer - * erstellt am: 10.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -/** - * A Special Type of StringVariable, where at GraphQL Headers the Type will be "ID" - * @author Sascha - * - */ -public class IDVariable extends StringVariable { - - public IDVariable(String name, String value) { - super(name, value); - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/IntegerVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/IntegerVariable.java deleted file mode 100644 index 427208e1b..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/IntegerVariable.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * IntegerVariable.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; - -public class IntegerVariable extends AbstractVariable { - - public IntegerVariable(String name, Integer value) { - super(name, value); - } - - @Override - protected String getVariable() { - return getAsJSONWithoutValue() + this.value.toString(); - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/RecursiveAbstractVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/RecursiveAbstractVariable.java deleted file mode 100644 index 9c17fe6c4..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/RecursiveAbstractVariable.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * RecursiveAbstractVariable.java - * - * Projekt : MServer - * erstellt am: 08.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; - -public class RecursiveAbstractVariable extends AbstractVariable { - - public RecursiveAbstractVariable(String name, AbstractVariable object) { - super(name, object); - if(object instanceof VariableList) - ((VariableList)object).setNodeType2NotRoot(); - } - - @Override - protected String getVariable() { - return getAsJSONWithoutValue() + getVariableWithCurlyBracketsSurrounding(this.value.getJSONFromVariableOrDefaulNull()); - } - - - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/StringVariable.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/StringVariable.java deleted file mode 100644 index 450e1eaa0..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/StringVariable.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * StringVariable.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; - -public class StringVariable extends AbstractVariable { - - public StringVariable(String name, String variable) { - super(name, variable); - } - - @Override - protected String getVariable() { - return getAsJSONWithoutValue() + getVariableWithDoubleQuoteSurrounding(this.value.replace("\"", "\\\"")); - } - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/VariableList.java b/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/VariableList.java deleted file mode 100644 index f18f1ffa7..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/graphql/variables/VariableList.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * VariableList.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import java.util.List; -import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; - -public class VariableList extends AbstractVariable> { - - private boolean isRootNode; - - public VariableList(String name, List values) { - super(name, values); - if(StringUtils.isBlank(name)) { - this.name = "variables"; - } - this.isRootNode = true; - changeAllChildElementsToBeNoRootElement(); - } - - public VariableList(List values) { - this(null, values); - } - - @Override - protected String getVariable() { - return getAsJSONWithoutValue() + getVariableWithCurlyBracketsSurrounding(this.value.stream().map(AbstractVariable::getJSONFromVariableOrDefaulNull).collect(Collectors.joining(","))); - } - - private void changeAllChildElementsToBeNoRootElement() { - if(null != this.value) { - this.value.stream() - .filter(VariableList.class::isInstance) - .map(VariableList.class::cast) - .forEach(VariableList::setNodeType2NotRoot); - } - } - - protected void setNodeType2NotRoot() { - this.isRootNode = false; - } - - - public boolean isRootElement() { - return this.isRootNode; - } - -} \ No newline at end of file diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrClipDetailsDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/br/json/BrClipDetailsDeserializer.java deleted file mode 100644 index 552d79bf4..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrClipDetailsDeserializer.java +++ /dev/null @@ -1,491 +0,0 @@ -package de.mediathekview.mserver.crawler.br.json; - -import com.google.gson.*; -import de.mediathekview.mlib.daten.*; -import de.mediathekview.mserver.crawler.br.data.BrClipType; -import de.mediathekview.mserver.crawler.br.data.BrGraphQLElementNames; -import de.mediathekview.mserver.crawler.br.data.BrGraphQLNodeNames; -import de.mediathekview.mserver.crawler.br.data.BrID; -import de.mediathekview.mserver.crawler.br.graphql.GsonGraphQLHelper; -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Type; -import java.net.MalformedURLException; -import java.net.URL; -import java.time.Duration; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -public class BrClipDetailsDeserializer implements JsonDeserializer> { - - private static final String DEFAULT_BR_VIDEO_URL_PRAEFIX = "https://www.br.de/mediathek/video/"; - private static final Logger LOG = LogManager.getLogger(BrClipDetailsDeserializer.class); - private static final String JSON_ELEMENT_INITIAL_SCREENING = "initialScreening"; - - private final BrID id; - private final Sender sender; - - public BrClipDetailsDeserializer(final Sender sender, final BrID id) { - super(); - this.sender = sender; - this.id = id; - } - - /** - * Decides which FilmUrl to use by comparing the file sizes. If equals take the first. - * - * @param filmUrl One film url to compare. This one is used if both have the same file size. - * @param anotherFilmUrl Another film url to compare. - * @return The film url with the bigger file size or if equal the first one. - */ - @NotNull - private static FilmUrl chooseFilmUrlWithBiggerSize(FilmUrl filmUrl, FilmUrl anotherFilmUrl) { - if (filmUrl == null || filmUrl.getUrl() == null || filmUrl.getFileSize() == null) { - return anotherFilmUrl; - } - - if (anotherFilmUrl == null || anotherFilmUrl.getUrl() == null || anotherFilmUrl.getFileSize() == null) { - return filmUrl; - } - return filmUrl.getFileSize() > anotherFilmUrl.getFileSize() ? filmUrl : anotherFilmUrl; - } - - @NotNull - private static Optional getVideoFileUrlFromVideoFileEdgeResultNode(JsonObject videoFilesEdgeResultNode) { - return GsonGraphQLHelper.getChildPrimitiveIfExists(videoFilesEdgeResultNode, BrGraphQLElementNames.STRING_CLIP_URL.getName()) - .filter(JsonPrimitive::isString) - .map(JsonPrimitive::getAsString); - } - - @NotNull - private static Integer getGeoInformationCountFromVideoFileEdgeResultNode(JsonObject videoFilesEdgeResultNode) { - return GsonGraphQLHelper.getChildObjectIfExists(videoFilesEdgeResultNode, "accessibleIn") - .flatMap(accessibleInNode -> GsonGraphQLHelper.getChildPrimitiveIfExists( - accessibleInNode, "count")) - .filter(JsonPrimitive::isNumber) - .map(JsonPrimitive::getAsInt).orElse(0); - } - - @NotNull - private static Optional getResolutionFromVideoFileEdgeResultNode(JsonObject videoFilesEdgeNodeOptional) { - return GsonGraphQLHelper.getChildObjectIfExists( - videoFilesEdgeNodeOptional, BrGraphQLNodeNames.RESULT_CLIP_VIDEO_PROFILE.getName()) - .flatMap(videoFileProfileNode -> - GsonGraphQLHelper.getChildPrimitiveIfExists( - videoFileProfileNode, BrGraphQLElementNames.ID_ELEMENT.getName())) - .filter(JsonPrimitive::isString) - .map(JsonPrimitive::getAsString) - .map(Resolution::getResolutionFromArdAudioVideoOrdinalsByProfileName); - } - - @NotNull - private static Optional findSubtitleUrlFromCaptionFilesEdge(JsonObject captionFilesEdge) { - return GsonGraphQLHelper.getChildObjectIfExists( - captionFilesEdge, BrGraphQLNodeNames.RESULT_NODE.getName()) - .flatMap(captionFilesResultNode -> GsonGraphQLHelper.getChildPrimitiveIfExists( - captionFilesResultNode, BrGraphQLElementNames.STRING_CLIP_URL.getName())) - .filter(JsonPrimitive::isString) - .map(JsonPrimitive::getAsString); - } - - @Override - public Optional deserialize( - final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) { - - final JsonObject rootObject = json.getAsJsonObject(); - - if (GsonGraphQLHelper.checkForErrors(rootObject)) { - throw new IllegalStateException( - "Fehler beim auflösen des aktuellen Films mit ID: " + id.getId()); - } - - final Optional clipDetails = getClipDetailsNode(rootObject); - if (clipDetails.isPresent()) { - final JsonObject clipDetailRoot = clipDetails.get(); - - if (id.getType() == null) { - String type = - clipDetailRoot - .getAsJsonPrimitive(BrGraphQLElementNames.GRAPHQL_TYPE_ELEMENT.getName()) - .getAsString(); - this.id.setType(BrClipType.getInstanceByName(type)); - } - // Done - final Optional titel = getTitel(clipDetailRoot); - final Optional thema = getThema(clipDetailRoot); - final Optional sendeZeitpunkt = getSendeZeitpunkt(clipDetailRoot); - final Optional clipLaenge = getClipLaenge(clipDetailRoot); - - final Set subtitles = getSubtitles(clipDetailRoot); - final Optional> videoUrls = getVideos(clipDetailRoot); - final Optional beschreibung = getBeschreibung(clipDetailRoot); - final Optional webSite = getWebSite(clipDetailRoot); - - if (videoUrls.isPresent() - && titel.isPresent() - && thema.isPresent() - && clipLaenge.isPresent()) { - final Film currentFilm = - new Film( - UUID.randomUUID(), - sender, - titel.get(), - thema.get(), - sendeZeitpunkt.orElse(null), - clipLaenge.get()); - - videoUrls.ifPresent(currentFilm::addAllUrls); - - currentFilm.setGeoLocations(getGeoLocations(currentFilm.getUrl(Resolution.NORMAL))); - beschreibung.ifPresent(currentFilm::setBeschreibung); - - currentFilm.setWebsite(webSite.orElse(null)); - - currentFilm.addAllSubtitleUrls(subtitles); - return Optional.of(currentFilm); - } else { - LOG.error( - "Kein komplett gültiger Film: {} Titel da? {} Thema da? {} Länge da? {} Video da? {}", - id.getId(), - titel.isPresent(), - thema.isPresent(), - clipLaenge.isPresent(), - videoUrls.isPresent()); - } - } - return Optional.empty(); - } - - private Collection getGeoLocations(final FilmUrl videoUrls) { - Set geoLocations = new HashSet<>(); - - if (videoUrls.getUrl().toString().contains("/geo/")) { - geoLocations.add(GeoLocations.GEO_DE); - } else { - geoLocations.add(GeoLocations.GEO_NONE); - } - - return geoLocations; - } - - private Optional getClipDetailsNode(final JsonObject rootObject) { - final Optional dataNodeOptional = - GsonGraphQLHelper.getChildObjectIfExists( - rootObject, BrGraphQLNodeNames.RESULT_ROOT_NODE.getName()); - if (dataNodeOptional.isEmpty()) { - return Optional.empty(); - } - - return GsonGraphQLHelper.getChildObjectIfExists( - dataNodeOptional.get(), BrGraphQLNodeNames.RESULT_ROOT_BR_NODE.getName()) - .flatMap( - viewerNode -> - GsonGraphQLHelper.getChildObjectIfExists( - viewerNode, BrGraphQLNodeNames.RESULT_CLIP_DETAILS_ROOT.getName())); - } - - private Optional getTitel(final JsonObject clipDetailRoot) { - return getJsonPrimitiveTextFromChildPrimitiveIfExists( - clipDetailRoot, BrGraphQLElementNames.STRING_CLIP_TITLE); - } - - private Optional getJsonPrimitiveTextFromChildPrimitiveIfExists( - final JsonObject clipDetailRoot, BrGraphQLElementNames brGraphQLElementName) { - final Optional element = - GsonGraphQLHelper.getChildPrimitiveIfExists(clipDetailRoot, brGraphQLElementName.getName()); - return element.map(JsonPrimitive::getAsString); - } - - private Optional buildThemaFromKicker(JsonObject clipDetailRoot) { - return getJsonPrimitiveTextFromChildPrimitiveIfExists( - clipDetailRoot, BrGraphQLElementNames.STRING_CLIP_KICKER); - } - - private Optional getTitleFromElement(final JsonObject node) { - final Optional itemOfTitleElementOptional = - GsonGraphQLHelper.getChildPrimitiveIfExists( - node, BrGraphQLElementNames.STRING_CLIP_TITLE.getName()); - if (itemOfTitleElementOptional.isPresent()) { - - final JsonPrimitive itemOfTitleElement = itemOfTitleElementOptional.get(); - - return Optional.of(itemOfTitleElement.getAsString()); - } - return Optional.empty(); - } - - private Optional getThema(final JsonObject clipDetailRoot) { - - /* - * Ist der aktuelle Titel ein Programm wird versucht zu prüfen, ob der aktuelle Titel - * Teil einer Serie ist und wenn das so ist, den entsprechenden Titel als Thema zurück - * zu geben. - */ - final Optional node; - switch (id.getType()) { - case PROGRAMME: - node = getEpisodeOfNode(clipDetailRoot); - break; - case ITEM: - node = getItemOfNode(clipDetailRoot); - break; - default: - node = Optional.empty(); - break; - } - - if (node.isPresent()) { - return getTitleFromElement(node.get()); - } - - /* - * Wenn wir hier ankommen ist weder episodeOf noch itemOf gefüllt. Dann nehmen wir halt den kicker auch wenn der nicht - * so gut ist ein Thema zu bilden. Aber besser wie gar nichts. - */ - return buildThemaFromKicker(clipDetailRoot); - } - - private Optional getEpisodeOfNode(final JsonObject clipDetailRoot) { - final Optional episodeOfNodeOptional = - GsonGraphQLHelper.getChildObjectIfExists( - clipDetailRoot, BrGraphQLNodeNames.RESULT_CLIP_EPISONEOF.getName()); - if (episodeOfNodeOptional.isEmpty()) { - return Optional.empty(); - } - final JsonObject episodeOfNode = episodeOfNodeOptional.get(); - - if (episodeOfNode.entrySet().isEmpty()) { - return Optional.empty(); - } - return Optional.of(episodeOfNode); - } - - private Optional getItemOfNode(final JsonObject clipDetailRoot) { - - final Optional itemOfRootNodeOptional = - GsonGraphQLHelper.getChildObjectIfExists( - clipDetailRoot, BrGraphQLNodeNames.RESULT_CLIP_ITEMOF.getName()); - return getFirstNode(itemOfRootNodeOptional.orElse(null)); - } - - private Optional getFirstNode(@Nullable final JsonObject itemOfRootNodeOptional) { - var edgeNodes = this.getEdgeNodes(itemOfRootNodeOptional); - - if (!edgeNodes.isEmpty()) { - if (edgeNodes.size() > 1) { - LOG.debug("Der Node hat mehr als ein itemOf-Node: {}", id.getId()); - } - final JsonObject firstItemOfEdge = edgeNodes.get(0).getAsJsonObject(); - - return GsonGraphQLHelper.getChildObjectIfExists( - firstItemOfEdge, BrGraphQLNodeNames.RESULT_NODE.getName()); - } - - return Optional.empty(); - } - - private JsonArray getEdgeNodes(@Nullable final JsonObject itemOfRootNode) { - return Optional.ofNullable(itemOfRootNode) - .flatMap(item -> GsonGraphQLHelper.getChildArrayIfExists( - item, BrGraphQLNodeNames.RESULT_NODE_EDGES.getName())) - .orElse(new JsonArray()); - } - - private Optional getClipLaenge(final JsonObject clipDetailRoot) { - - final Optional durationElementOptional = - GsonGraphQLHelper.getChildPrimitiveIfExists( - clipDetailRoot, BrGraphQLElementNames.INT_CLIP_DURATION.getName()); - if (durationElementOptional.isEmpty()) { - return Optional.empty(); - } - final JsonPrimitive durationElement = durationElementOptional.get(); - - return Optional.of(Duration.ofSeconds(durationElement.getAsInt())); - } - - private Optional getSendeZeitpunkt(final JsonObject clipDetailRoot) { - - /* - * Normale ITEMS besitzen keinen Ausstrahlungszeitpunkt, Programme normalerweise schon. - */ - if (!id.getType().equals(BrClipType.PROGRAMME)) { - return Optional.empty(); - } - - if (!clipDetailRoot.has(JSON_ELEMENT_INITIAL_SCREENING)) { - return Optional.empty(); - } - - final JsonElement initialScreeningElement = clipDetailRoot.get(JSON_ELEMENT_INITIAL_SCREENING); - if (initialScreeningElement.isJsonNull()) { - return Optional.empty(); - } - final JsonObject initialScreening = initialScreeningElement.getAsJsonObject(); - if (!initialScreening.has(BrGraphQLElementNames.STRING_CLIP_START.getName())) { - return Optional.empty(); - } - - final String startDateTimeString = - initialScreening.get(BrGraphQLElementNames.STRING_CLIP_START.getName()).getAsString(); - - return Optional.of(brDateTimeString2LocalDateTime(startDateTimeString)); - } - - private Optional> getVideos(final JsonObject clipDetailRoot) { - - final Optional videoFilesOptional = - GsonGraphQLHelper.getChildObjectIfExists( - clipDetailRoot, BrGraphQLNodeNames.RESULT_CLIP_VIDEO_FILES.getName()); - final JsonArray videoFilesEdges = getEdgeNodes(videoFilesOptional.orElse(null)); - - final Map videoListe = - new ConcurrentHashMap<>(StreamSupport.stream(videoFilesEdges.spliterator(), false) - .filter(JsonElement::isJsonObject) - .map(JsonElement::getAsJsonObject) - .map(this::videoFilesEdgeToBrVideo) - .filter(Optional::isPresent) - .map(Optional::get) - .collect(Collectors.toMap(BrVideo::resolution, BrVideo::url, - ///Resolves duplicates by picking the one with the bigger file size and if the sizes are the same take the first one - BrClipDetailsDeserializer::chooseFilmUrlWithBiggerSize))); - - if (videoListe.isEmpty()) { - LOG.error("Erzeugung der VideoURLs fehlgeschlagen für ID: {}", id.getId()); - return Optional.empty(); - } - return Optional.of(videoListe); - } - - private Optional videoFilesEdgeToBrVideo(JsonObject videoFileEdge) { - final Optional videoFilesEdgeResultNode = - GsonGraphQLHelper.getChildObjectIfExists( - videoFileEdge, BrGraphQLNodeNames.RESULT_NODE.getName()); - if(videoFilesEdgeResultNode.isPresent()) { - var geoInformationCount = getGeoInformationCountFromVideoFileEdgeResultNode(videoFilesEdgeResultNode.get()); - if (geoInformationCount > 0) { - LOG.debug("{} hat Geoinformationen?!", id.getId()); - } - - var resolution = getResolutionFromVideoFileEdgeResultNode(videoFilesEdgeResultNode.get()); - var videoFileUrl = getVideoFileUrlFromVideoFileEdgeResultNode(videoFilesEdgeResultNode.get()); - - if (videoFileUrl.isPresent() && resolution.isPresent()) { - try { - final Long fileSize = videoFilesEdgeResultNode.flatMap(videoFilesEdgeNode -> - GsonGraphQLHelper.getChildPrimitiveIfExists( - videoFilesEdgeNode, BrGraphQLElementNames.STRING_CLIP_FILE_SIZE.getName())) - .filter(fileSizePrimitive -> !fileSizePrimitive.isJsonNull() && fileSizePrimitive.isNumber()) - .map(JsonPrimitive::getAsLong).orElse(0L); - - return Optional.of(new BrVideo(resolution.get(), new FilmUrl(videoFileUrl.get(), getFileSizeInKB(fileSize)))); - } catch (final MalformedURLException e) { - // Nothing to be done here - LOG.error( - "Fehlerhafte URL in den VideoURLs vorhanden! Clip-ID: {}", id.getId()); - } - } - } - return Optional.empty(); - } - - private long getFileSizeInKB(Long fileSize) { - // fileSize is in bytes - return fileSize == 0 ? 0 : fileSize / 1024; - } - - private Optional getBeschreibung(final JsonObject clipDetailRoot) { - - final Optional descriptionOptional = - GsonGraphQLHelper.getChildPrimitiveIfExists( - clipDetailRoot, BrGraphQLElementNames.STRING_CLIP_DESCRIPTION.getName()); - if (descriptionOptional.isPresent()) { - - final JsonPrimitive description = descriptionOptional.get(); - if (description.isString() && StringUtils.isNotEmpty(description.getAsString())) { - return Optional.of(description.getAsString()); - } - } - - final Optional shortDescriptionOptional = - GsonGraphQLHelper.getChildPrimitiveIfExists( - clipDetailRoot, BrGraphQLElementNames.STRING_CLIP_SHORT_DESCRIPTION.getName()); - if (shortDescriptionOptional.isPresent()) { - - final JsonPrimitive shortDescription = shortDescriptionOptional.get(); - if (shortDescription.isString() && StringUtils.isNotEmpty(shortDescription.getAsString())) { - return Optional.of(shortDescription.getAsString()); - } - } - - return Optional.empty(); - } - - private Optional getWebSite(final JsonObject clipDetailRoot) { - - final Optional slugOptional = - GsonGraphQLHelper.getChildPrimitiveIfExists( - clipDetailRoot, BrGraphQLElementNames.STRING_CLIP_SLUG.getName()); - if (slugOptional.isPresent()) { - - final JsonPrimitive slug = slugOptional.get(); - - if (slug.isString() && StringUtils.isNotEmpty(slug.getAsString())) { - try { - return Optional.of( - new URL(DEFAULT_BR_VIDEO_URL_PRAEFIX + slug.getAsString() + "-" + id.getId())); - } catch (final MalformedURLException e) { - // Wird ein Empty! - } - } - } - - return Optional.empty(); - } - - private Set getSubtitles(final JsonObject clipDetailRoot) { - - var captionFilesEdges = GsonGraphQLHelper.getChildObjectIfExists( - clipDetailRoot, BrGraphQLNodeNames.RESULT_CLIP_CAPTION_FILES.getName()) - .flatMap(captionFiles -> - GsonGraphQLHelper.getChildArrayIfExists(captionFiles, BrGraphQLNodeNames.RESULT_NODE_EDGES.getName()) - ).orElse(new JsonArray()); - - return StreamSupport.stream(captionFilesEdges.spliterator(), false) - .filter(JsonElement::isJsonObject) - .map(JsonElement::getAsJsonObject) - .map(BrClipDetailsDeserializer::findSubtitleUrlFromCaptionFilesEdge) - .filter(Optional::isPresent) - .map(Optional::get) - .map(this::tryToCreateUrl) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - } - - private @Nullable URL tryToCreateUrl(String text) { - try { - return new URL(text); - } catch (final MalformedURLException e) { - // Keine gültige URL - } - return null; - } - - private LocalDateTime brDateTimeString2LocalDateTime(final String dateTimeString) { - - final ZonedDateTime inputDateTime = - ZonedDateTime.parse(dateTimeString, DateTimeFormatter.ISO_DATE_TIME); - - return inputDateTime.withZoneSameInstant(ZoneId.of("Europe/Berlin")).toLocalDateTime(); - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrIdsDTO.java b/src/main/java/de/mediathekview/mserver/crawler/br/json/BrIdsDTO.java deleted file mode 100644 index f003fc641..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrIdsDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.mediathekview.mserver.crawler.br.json; - -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentSkipListSet; -import de.mediathekview.mserver.crawler.br.data.BrID; - -public class BrIdsDTO { - private final Set ids; - - public BrIdsDTO() { - super(); - ids = ConcurrentHashMap.newKeySet(); - } - - public boolean add(final BrID id) { - return ids.add(id); - } - - public Set getIds() { - return new ConcurrentSkipListSet<>(ids); - } - - -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrProgramIdsDeserializer.java b/src/main/java/de/mediathekview/mserver/crawler/br/json/BrProgramIdsDeserializer.java deleted file mode 100644 index cd655d687..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrProgramIdsDeserializer.java +++ /dev/null @@ -1,187 +0,0 @@ -package de.mediathekview.mserver.crawler.br.json; - -import com.google.gson.*; -import de.mediathekview.mserver.base.utils.JsonUtils; -import de.mediathekview.mserver.crawler.br.data.*; -import de.mediathekview.mserver.crawler.br.graphql.GsonGraphQLHelper; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.lang.reflect.Type; -import java.util.Optional; - -public class BrProgramIdsDeserializer implements JsonDeserializer { - - private static final Logger LOG = LogManager.getLogger(BrProgramIdsDeserializer.class); - - @Override - public BrClipCollectIDResult deserialize( - final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) - throws JsonParseException { - - final BrClipCollectIDResult idCollectResult = new BrClipCollectIDResult(); - - final Optional searchAllClips = getClipIDsBaseNode(json); - if (searchAllClips.isPresent()) { - - final boolean hasNextClipPage = clipIdResultsHasNextPage(searchAllClips.get()); - if (hasNextClipPage) { - idCollectResult.setHasNextPage(); - } else { - idCollectResult.setHasNonNextPage(); - } - - final Optional resultSize = getResultSize(searchAllClips.get()); - resultSize.ifPresent(idCollectResult::setResultSize); - - final Optional edges = getClipIdEdges(searchAllClips.get()); - edges.ifPresent( - jsonElements -> - jsonElements.forEach( - (JsonElement element) -> { - if (element.isJsonObject()) { - final JsonObject singleEdge = element.getAsJsonObject(); - - if (getVideoCount(singleEdge) > 0) { - final Optional cursor = getCursor(singleEdge); - cursor.ifPresent(idCollectResult::setCursor); - - final Optional brId = getBrId(singleEdge); - brId.ifPresent(brID -> idCollectResult.getClipList().add(brID)); - } - } - })); - } - - return idCollectResult; - } - - private int getVideoCount(final JsonElement json) { - if (!JsonUtils.checkTreePath( - json, - null, - BrGraphQLNodeNames.RESULT_NODE.getName(), - BrGraphQLNodeNames.RESULT_CLIP_VIDEO_FILES.getName())) { - return 0; - } - - final JsonObject videoFiles = - json.getAsJsonObject() - .get(BrGraphQLNodeNames.RESULT_NODE.getName()) - .getAsJsonObject() - .get(BrGraphQLNodeNames.RESULT_CLIP_VIDEO_FILES.getName()) - .getAsJsonObject(); - if (videoFiles.has(BrGraphQLElementNames.INT_COUNTER_ELEMENT.getName())) { - return videoFiles.get(BrGraphQLElementNames.INT_COUNTER_ELEMENT.getName()).getAsInt(); - } - return 0; - } - - private Optional getClipIDsBaseNode(final JsonElement json) { - - if (!JsonUtils.checkTreePath( - json, - null, - BrGraphQLNodeNames.RESULT_ROOT_NODE.getName(), - BrGraphQLNodeNames.RESULT_ROOT_BR_NODE.getName(), - BrGraphQLNodeNames.RESULT_CLIP_BROADCASTSERVICE_ROOT.getName(), - BrGraphQLNodeNames.RESULT_CLIP_PROGRAMMES_ROOT.getName())) { - LOG.error( - "one of the following elements is missing {}, {}, {}, {}", - BrGraphQLNodeNames.RESULT_ROOT_NODE.getName(), - BrGraphQLNodeNames.RESULT_ROOT_BR_NODE.getName(), - BrGraphQLNodeNames.RESULT_CLIP_BROADCASTSERVICE_ROOT.getName(), - BrGraphQLNodeNames.RESULT_CLIP_PROGRAMMES_ROOT.getName()); - return Optional.empty(); - } - - final JsonObject programmesObject = - json.getAsJsonObject() - .get(BrGraphQLNodeNames.RESULT_ROOT_NODE.getName()) - .getAsJsonObject() - .get(BrGraphQLNodeNames.RESULT_ROOT_BR_NODE.getName()) - .getAsJsonObject() - .get(BrGraphQLNodeNames.RESULT_CLIP_BROADCASTSERVICE_ROOT.getName()) - .getAsJsonObject() - .get(BrGraphQLNodeNames.RESULT_CLIP_PROGRAMMES_ROOT.getName()) - .getAsJsonObject(); - - if (programmesObject.isJsonNull()) { - return Optional.empty(); - } - return Optional.of(programmesObject); - } - - private Optional getResultSize(final JsonObject searchAllClipsNode) { - final Optional searchAllClipsNodeOptional = - GsonGraphQLHelper.getChildPrimitiveIfExists( - searchAllClipsNode, BrGraphQLElementNames.INT_COUNTER_ELEMENT.getName()); - if (searchAllClipsNodeOptional.isEmpty()) { - return Optional.empty(); - } - final JsonPrimitive elementCount = searchAllClipsNodeOptional.get(); - - if (!elementCount.isNumber()) { - return Optional.empty(); - } - - return Optional.of(elementCount.getAsInt()); - } - - private boolean clipIdResultsHasNextPage(final JsonObject searchAllClipsNode) { - final Optional searchAllClipsNodeOptional = - GsonGraphQLHelper.getChildObjectIfExists( - searchAllClipsNode, BrGraphQLNodeNames.RESULT_PAGE_INFO.getName()); - if (searchAllClipsNodeOptional.isEmpty()) { - return false; - } - final JsonObject resultPageInfo = searchAllClipsNodeOptional.get(); - - final Optional hasNextPageOptional = - GsonGraphQLHelper.getChildPrimitiveIfExists( - resultPageInfo, BrGraphQLElementNames.BOOLEAN_HAS_NEXT_PAGE.getName()); - if (hasNextPageOptional.isEmpty()) { - return false; - } - - final JsonPrimitive hasNextPage = hasNextPageOptional.get(); - if (!hasNextPage.isBoolean()) { - return false; - } - - return hasNextPage.getAsBoolean(); - } - - private Optional getClipIdEdges(final JsonObject searchAllClipsNode) { - return GsonGraphQLHelper.getChildArrayIfExists( - searchAllClipsNode, BrGraphQLNodeNames.RESULT_NODE_EDGES.getName()); - } - - private Optional getBrId(final JsonObject singleEdge) { - if (!singleEdge.has(BrGraphQLNodeNames.RESULT_NODE.getName())) { - return Optional.empty(); - } - final JsonObject node = singleEdge.getAsJsonObject(BrGraphQLNodeNames.RESULT_NODE.getName()); - - if (!node.has(BrGraphQLElementNames.GRAPHQL_TYPE_ELEMENT.getName()) - && !node.has(BrGraphQLElementNames.ID_ELEMENT.getName())) { - return Optional.empty(); - } - final String type = - node.getAsJsonPrimitive(BrGraphQLElementNames.GRAPHQL_TYPE_ELEMENT.getName()).getAsString(); - final String id = - node.getAsJsonPrimitive(BrGraphQLElementNames.ID_ELEMENT.getName()).getAsString(); - - return Optional.of(new BrID(BrClipType.getInstanceByName(type), id)); - } - - private Optional getCursor(final JsonObject singleEdge) { - if (!singleEdge.has(BrGraphQLElementNames.STRING_CURSOR_ELEMENT.getName())) { - return Optional.empty(); - } - final JsonElement cursor = - singleEdge.get(BrGraphQLElementNames.STRING_CURSOR_ELEMENT.getName()); - - return Optional.of(cursor.getAsString()); - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrVideo.java b/src/main/java/de/mediathekview/mserver/crawler/br/json/BrVideo.java deleted file mode 100644 index 2c67e222a..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/json/BrVideo.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.mediathekview.mserver.crawler.br.json; - -import de.mediathekview.mlib.daten.FilmUrl; -import de.mediathekview.mlib.daten.Resolution; - -public record BrVideo(Resolution resolution, FilmUrl url) { -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/tasks/BrBroadcastsTask.java b/src/main/java/de/mediathekview/mserver/crawler/br/tasks/BrBroadcastsTask.java deleted file mode 100644 index 4fd8ac697..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/tasks/BrBroadcastsTask.java +++ /dev/null @@ -1,80 +0,0 @@ -package de.mediathekview.mserver.crawler.br.tasks; - -import de.mediathekview.mserver.crawler.basic.AbstractCrawler; -import de.mediathekview.mserver.crawler.basic.AbstractGraphQlTask; -import de.mediathekview.mserver.crawler.basic.AbstractRecursiveConverterTask; -import de.mediathekview.mserver.crawler.br.BrClipQueryDto; -import de.mediathekview.mserver.crawler.br.BrConstants; -import de.mediathekview.mserver.crawler.br.BrQueryDto; -import de.mediathekview.mserver.crawler.br.data.BrClipCollectIDResult; -import de.mediathekview.mserver.crawler.br.json.BrProgramIdsDeserializer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import jakarta.ws.rs.core.Response; -import java.lang.reflect.Type; -import java.net.URI; -import java.util.Optional; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - -public class BrBroadcastsTask - extends AbstractGraphQlTask { - - private static final Logger LOG = LogManager.getLogger(BrBroadcastsTask.class); - - public BrBroadcastsTask(AbstractCrawler crawler, Queue urlToCrawlDtos) { - super(crawler, urlToCrawlDtos, null); - } - - @Override - protected Object getParser(BrQueryDto dto) { - return new BrProgramIdsDeserializer(); - } - - @Override - protected Type getType() { - return BrClipCollectIDResult.class; - } - - @Override - protected void handleHttpError(BrQueryDto dto, URI url, Response response) { - crawler.printErrorMessage(); - LOG.error( - "HTTP error {}: start: {}, end: {}, page: {}.", - response.getStatus(), - dto.getStart(), - dto.getEnd(), - dto.getPageSize()); - crawler.incrementAndGetErrorCount(); - } - - @Override - protected void postProcessing(BrClipCollectIDResult responseObj, BrQueryDto dto) { - - responseObj - .getClipList() - .getIds() - .forEach(id -> taskResults.add(new BrClipQueryDto(BrConstants.GRAPHQL_API, id))); - - if (responseObj.hasNextPage()) { - final ConcurrentLinkedQueue crawlerUrls = new ConcurrentLinkedQueue<>(); - BrQueryDto nextPage = - new BrQueryDto( - dto.getUrl(), - dto.getBroadcastServiceName(), - dto.getStart(), - dto.getEnd(), - dto.getPageSize(), - Optional.of(responseObj.getCursor())); - crawlerUrls.add(nextPage); - taskResults.addAll(createNewOwnInstance(crawlerUrls).invoke()); - } - } - - @Override - protected AbstractRecursiveConverterTask createNewOwnInstance( - Queue elementsToProcess) { - return new BrBroadcastsTask(crawler, elementsToProcess); - } -} diff --git a/src/main/java/de/mediathekview/mserver/crawler/br/tasks/BrGetClipDetailsTask.java b/src/main/java/de/mediathekview/mserver/crawler/br/tasks/BrGetClipDetailsTask.java deleted file mode 100644 index 347da3eb2..000000000 --- a/src/main/java/de/mediathekview/mserver/crawler/br/tasks/BrGetClipDetailsTask.java +++ /dev/null @@ -1,63 +0,0 @@ -package de.mediathekview.mserver.crawler.br.tasks; - -import com.google.gson.reflect.TypeToken; -import de.mediathekview.mlib.daten.Film; -import de.mediathekview.mserver.crawler.basic.AbstractCrawler; -import de.mediathekview.mserver.crawler.basic.AbstractGraphQlTask; -import de.mediathekview.mserver.crawler.basic.AbstractRecursiveConverterTask; -import de.mediathekview.mserver.crawler.br.BrClipQueryDto; -import de.mediathekview.mserver.crawler.br.json.BrClipDetailsDeserializer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import jakarta.ws.rs.core.Response; -import java.lang.reflect.Type; -import java.net.URI; -import java.util.Optional; -import java.util.Queue; - -public class BrGetClipDetailsTask - extends AbstractGraphQlTask, BrClipQueryDto> { - - private static final Logger LOG = LogManager.getLogger(BrGetClipDetailsTask.class); - private static final Type OPTIONAL_FILM_TYPE = new TypeToken>() {}.getType(); - - public BrGetClipDetailsTask( - final AbstractCrawler crawler, final Queue clipQueue) { - super(crawler, clipQueue, null); - } - - @Override - protected Object getParser(BrClipQueryDto aDTO) { - return new BrClipDetailsDeserializer(crawler.getSender(), aDTO.getId()); - } - - @Override - protected Type getType() { - return OPTIONAL_FILM_TYPE; - } - - @Override - protected void handleHttpError(final BrClipQueryDto dto, final URI url, final Response response) { - crawler.printErrorMessage(); - LOG.error("HTTP error {}: id: {}", response.getStatus(), dto.getId().getId()); - crawler.incrementAndGetErrorCount(); - } - - @Override - protected void postProcessing(Optional aResponseObj, BrClipQueryDto aDTO) { - if (aResponseObj.isPresent()) { - taskResults.add(aResponseObj.get()); - crawler.incrementAndGetActualCount(); - } else { - LOG.error("no film object received: {}", aDTO.getId().getId()); - crawler.incrementAndGetErrorCount(); - } - } - - @Override - protected AbstractRecursiveConverterTask createNewOwnInstance( - Queue aElementsToProcess) { - return new BrGetClipDetailsTask(crawler, aElementsToProcess); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/BrGraphQLQueriesTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/BrGraphQLQueriesTest.java deleted file mode 100644 index 8eec9748b..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/BrGraphQLQueriesTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package de.mediathekview.mserver.crawler.br; - -import de.mediathekview.mserver.crawler.br.data.BrClipType; -import de.mediathekview.mserver.crawler.br.data.BrID; -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; -import de.mediathekview.mserver.crawler.br.graphql.variables.BooleanVariable; -import de.mediathekview.mserver.crawler.br.graphql.variables.StringVariable; -import de.mediathekview.mserver.crawler.br.graphql.variables.VariableList; -import org.junit.jupiter.api.Test; - -import java.time.LocalDate; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; - -class BrGraphQLQueriesTest { - - @Test - void getQueryGetIdsFirstPage() { - final LocalDate start = LocalDate.of(2021, 3, 20); - final LocalDate end = LocalDate.of(2021, 3, 25); - final String query = - BrGraphQLQueries.getQueryGetIds( - BrConstants.BROADCAST_SERVICE_BR, start, end, 10, Optional.empty()); - - assertThat(query) - .isEqualTo( - "{\"query\":\"query MediathekViewCountFilms( $programmeFilter: ProgrammeFilter!) { viewer { ...on Viewer { broadcastService(id: \\\"av:http://ard.de/ontologies/ard#BR_Fernsehen\\\") { __typename ...on BroadcastServiceInterface { id programmes(first: 10, orderBy: INITIALSCREENING_START_DESC, filter: $programmeFilter) { count pageInfo {hasNextPage} edges { node { videoFiles { count } } } edges { cursor node { id __typename description broadcasts { edges {node {start}}} initialScreening { start }}} } } } } }}\",\"variables\":{\"programmeFilter\":{\"status\":{\"id\":{\"eq\":\"av:http://ard.de/ontologies/lifeCycle#published\"}},\"broadcasts\":{\"start\":{\"gte\":\"2021-03-20T00:00:00.000Z\",\"lte\":\"2021-03-25T23:59:59.000Z\"}}}}}"); - } - - @Test - void getQueryGetIdsNextPage() { - final LocalDate start = LocalDate.of(2021, 3, 20); - final LocalDate end = LocalDate.of(2021, 3, 25); - final String cursor = "eyJfaWQiOiI2MDU2MzhhZjczYjViNzAwMTMwM2U4OGMiLCJfa2V5IjpudWxsfQ=="; - - final String query = - BrGraphQLQueries.getQueryGetIds( - BrConstants.BROADCAST_SERVICE_BR, start, end, 10, Optional.of(cursor)); - - assertThat(query) - .isEqualTo( - "{\"query\":\"query MediathekViewCountFilms( $programmeFilter: ProgrammeFilter!) { viewer { ...on Viewer { broadcastService(id: \\\"av:http://ard.de/ontologies/ard#BR_Fernsehen\\\") { __typename ...on BroadcastServiceInterface { id programmes(first: 10, orderBy: INITIALSCREENING_START_DESC, filter: $programmeFilter, after: \\\"eyJfaWQiOiI2MDU2MzhhZjczYjViNzAwMTMwM2U4OGMiLCJfa2V5IjpudWxsfQ==\\\") { count pageInfo {hasNextPage} edges { node { videoFiles { count } } } edges { cursor node { id __typename description broadcasts { edges {node {start}}} initialScreening { start }}} } } } } }}\",\"variables\":{\"programmeFilter\":{\"status\":{\"id\":{\"eq\":\"av:http://ard.de/ontologies/lifeCycle#published\"}},\"broadcasts\":{\"start\":{\"gte\":\"2021-03-20T00:00:00.000Z\",\"lte\":\"2021-03-25T23:59:59.000Z\"}}}}}"); - } - - @Test - void testCreateHeaderWithOneStringVariable() { - String queryTitle = "MediathekViewCountFilms"; - - StringVariable sv = new StringVariable("programmeFilter", "text"); - List rootList = new LinkedList<>(); - rootList.add(sv); - VariableList vl = new VariableList(rootList); - - assertThat(BrGraphQLQueries.getGraphQLHeaderWithVariable(queryTitle, vl)) - .isEqualTo("query MediathekViewCountFilms( $programmeFilter: String) {"); - } - - @Test - void testQuery2GetClipDetails() { - BrID id = new BrID(BrClipType.PROGRAMME, "av:5a0603ce8c16b90012f4bc49"); - assertThat(BrGraphQLQueries.getQuery2GetClipDetails(id)) - .isEqualTo( - "{\"query\":\"query MediathekViewGetClipDetails( $clipID: ID!) { viewer { clipDetails: clip(id: $clipID) { __typename id title kicker duration ageRestriction description shortDescription slug availableUntil authors { count edges { node { id name } } } subjects { count edges { node { id } } } tags { count edges { node { id label } } } executiveProducers { count edges { node { id name } } } credits { count edges { node { id name } } } categorizations { count edges { node { id } } } genres { count edges { node { id label } } } videoFiles(first: 50, orderBy: FILESIZE_DESC) { count edges { node { id fileSize publicLocation accessibleIn(first: 50) { count edges { node { id baseIdPrefix } } } videoProfile { id height width } } } } captionFiles(first: 50, orderBy: FILESIZE_DESC) { count edges { node { id publicLocation } } } ... on ItemInterface { availableUntil itemOf { count edges { node { id title } } } } ... on ProgrammeInterface { episodeNumber episodeOf { id title kicker scheduleInfo shortDescription } initialScreening { start id } } } id } }\",\"variables\":{\"clipID\":\"av:5a0603ce8c16b90012f4bc49\"}}"); - } - - @Test - void testFooterGenerator() { - - BooleanVariable bv = new BooleanVariable("isClip", true); - List rootList = new LinkedList<>(); - rootList.add(bv); - VariableList rootElement = new VariableList(rootList); - - assertThat(BrGraphQLQueries.getGraphQLFooterWithVariable(rootElement)) - .isEqualTo("\",\"variables\":{\"isClip\":true}}"); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/BrTestHelper.java b/src/test/java/de/mediathekview/mserver/crawler/br/BrTestHelper.java deleted file mode 100644 index b7d126ee5..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/BrTestHelper.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * BrCrawlerHelper.java - * - * Projekt : MServer - * erstellt am: 13.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br; - -import de.mediathekview.mlib.daten.Sender; -import de.mediathekview.mlib.messages.Message; -import de.mediathekview.mlib.messages.listener.MessageListener; -import de.mediathekview.mlib.progress.Progress; -import de.mediathekview.mserver.base.config.MServerConfigManager; -import de.mediathekview.mserver.progress.listeners.SenderProgressListener; -import org.apache.commons.lang3.StringUtils; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.concurrent.ForkJoinPool; - -public class BrTestHelper { - - public static final String DEFAULT_TEST_CONFIG_FILENAME = "MServer-JUnit-Config.yaml"; - - public static BrCrawler getTestCrawler(final String configFilename) { - final ForkJoinPool forkJoinPool = new ForkJoinPool(); - return getTestCrawler(configFilename, forkJoinPool); - } - - public static BrCrawler getTestCrawler(String configFilename, final ForkJoinPool forkJoinPool) { - final Collection nachrichten = new ArrayList<>(); - final MessageListener nachricht = - new MessageListener() { - - @Override - public void consumeMessage(final Message arg0, final Object... arg1) { - // TODO Auto-generated method stub - - } - }; - nachrichten.add(nachricht); - - final Collection fortschritte = new ArrayList<>(); - final SenderProgressListener fortschritt = - new SenderProgressListener() { - - @Override - public void updateProgess(final Sender aSender, final Progress aCrawlerProgress) { - // TODO Auto-generated method stub - - } - }; - fortschritte.add(fortschritt); - - if (StringUtils.isBlank(configFilename)) { - configFilename = DEFAULT_TEST_CONFIG_FILENAME; - } - - final MServerConfigManager rootConfig = new MServerConfigManager(configFilename); - - return new BrCrawler(forkJoinPool, nachrichten, fortschritte, rootConfig); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/data/BrClipTypeTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/data/BrClipTypeTest.java deleted file mode 100644 index b003b0182..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/data/BrClipTypeTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * BrClipTypeTest.java - * - * Projekt : MServer - * erstellt am: 12.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.data; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class BrClipTypeTest { - - @Test - void testGetInstanceByNameWithValidItem() { - assertThat(BrClipType.getInstanceByName("Item")).isEqualTo(BrClipType.ITEM); - } - - @Test - void testGetInstanceByeNameWithProgramme() { - assertThat(BrClipType.getInstanceByName("Programme")).isEqualTo(BrClipType.PROGRAMME); - } - - @Test - void testGetInstanceByeNameWithWringName() { - assertThat(BrClipType.getInstanceByName("brzlfitz")).isNull(); - } - - @Test - void testGetNameItem() { - assertThat(BrClipType.ITEM.getGraphQLName()).isEqualTo("Item"); - } - - @Test - void testGetNameProgramm() { - assertThat(BrClipType.PROGRAMME.getGraphQLName()).isEqualTo("Programme"); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/data/BrIDTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/data/BrIDTest.java deleted file mode 100644 index 4afe216d3..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/data/BrIDTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * BrIDTest.java - * - * Projekt : MServer - * erstellt am: 12.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.data; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class BrIDTest { - - @Test - void testConstructorAndGetters() { - final BrID id = new BrID(BrClipType.ITEM, "av:584f7f303b4679001197f6b2"); - - assertThat(id.getType()).isEqualTo(BrClipType.ITEM); - assertThat(id.getId()).isEqualTo("av:584f7f303b4679001197f6b2"); - } - - @Test - void testComparableTwoGreaterOne() { - final BrID id1 = new BrID(BrClipType.ITEM, "av:584f7f303b4679001197f6b2"); - final BrID id2 = new BrID(BrClipType.ITEM, "av:584f7f313b4679001197f7da"); - - assertThat(id1.compareTo(id2)).isEqualTo(-1); - } - - @Test - void testComparableOneGreaterTwo() { - final BrID id1 = new BrID(BrClipType.ITEM, "av:584f7f313b4679001197f7da"); - final BrID id2 = new BrID(BrClipType.ITEM, "av:584f7f303b4679001197f6b2"); - - assertThat(id1.compareTo(id2)).isEqualTo(1); - } - - @Test - void testComparableEquals() { - final BrID id1 = new BrID(BrClipType.ITEM, "av:584f7f313b4679001197f7da"); - final BrID id2 = new BrID(BrClipType.ITEM, "av:584f7f313b4679001197f7da"); - - assertThat(id1).isEqualTo(id2); - assertThat(id1).isEqualByComparingTo(id2); - } - - @Test - void testEqulsIgnoreType() { - final BrID id1 = new BrID(BrClipType.ITEM, "av:584f7f313b4679001197f7da"); - final BrID id2 = new BrID(BrClipType.PROGRAMME, "av:584f7f313b4679001197f7da"); - - assertThat(id1).isEqualTo(id2); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/GsonGraphQLHelperTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/graphql/GsonGraphQLHelperTest.java deleted file mode 100644 index 6c6cb4769..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/GsonGraphQLHelperTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * GsonGraphQLHelperTest.java - * - * Projekt : MServer - * erstellt am: 03.01.2018 - * Autor : Sascha - * - * (c) 2018 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.graphql; - -import com.google.gson.JsonArray; -import com.google.gson.JsonNull; -import com.google.gson.JsonObject; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class GsonGraphQLHelperTest { - - @Test - void testChildIsRegularJsonArray() { - - JsonObject jo = new JsonObject(); - - JsonArray ja = new JsonArray(); - - ja.add("one"); - ja.add("two"); - - jo.add("childArray", ja); - - assertThat(GsonGraphQLHelper.getChildArrayIfExists(jo, "childArray").get().getClass()) - .hasSameClassAs(JsonArray.class); - } - - @Test - void testChildWithWrongArrayName() { - - JsonObject jo = new JsonObject(); - - JsonArray ja = new JsonArray(); - - ja.add("one"); - ja.add("two"); - - jo.add("wrongName", ja); - - assertThat(GsonGraphQLHelper.getChildArrayIfExists(jo, "childArray")).isEmpty(); - } - - @Test - void testChildIsJsonNull() { - - JsonObject jo = new JsonObject(); - - JsonNull jn = JsonNull.INSTANCE; - - jo.add("childArray", jn); - - assertThat(GsonGraphQLHelper.getChildArrayIfExists(jo, "childArray")).isEmpty(); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/BooleanVariableTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/BooleanVariableTest.java deleted file mode 100644 index e9b9f5747..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/BooleanVariableTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * BooleanVariableTest.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class BooleanVariableTest { - - @Test - void testBooleanVariableIsTrue() { - final BooleanVariable graphQLVariable = new BooleanVariable("triggerSearch", true); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()) - .isEqualTo("\"triggerSearch\":true"); - } - - @Test - void testBooleanVariableIsFalse() { - final BooleanVariable graphQLVariable = new BooleanVariable("eq", false); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"eq\":false"); - } - - @Test - void testBooleanVariableIsNull() { - final BooleanVariable graphQLVariable = new BooleanVariable("eq", null); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"eq\":null"); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/FloatVariableTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/FloatVariableTest.java deleted file mode 100644 index 79680ee8f..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/FloatVariableTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * FloatVariableTest.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class FloatVariableTest { - - @Test - void testMaxFloatValue() { - final FloatVariable graphQLVariable = new FloatVariable("degress", Double.MAX_VALUE); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()) - .isEqualTo("\"degress\":1.7976931348623157E308"); - } - - @Test - void testMinFloatValue() { - final FloatVariable graphQLVariable = new FloatVariable("negativeDegress", Double.MIN_VALUE); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()) - .isEqualTo("\"negativeDegress\":4.9E-324"); - } - - @Test - void testNullFloatValue() { - final FloatVariable graphQLVariable = new FloatVariable("lenght", null); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"lenght\":null"); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/IntegerVariableTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/IntegerVariableTest.java deleted file mode 100644 index 4bd27490a..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/IntegerVariableTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * IntegerVariableTest.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class IntegerVariableTest { - - @Test - void testIntegerVariableWithoutSign() { - final IntegerVariable graphQLVariable = new IntegerVariable("clipCount", 24); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"clipCount\":24"); - } - - @Test - void testIntegerVariableWithNegativeSign() { - final IntegerVariable graphQLVariable = new IntegerVariable("seriesCount", -12); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"seriesCount\":-12"); - } - - @Test - void testIntegerVariableWithPostiveSign() { - final IntegerVariable graphQLVariable = new IntegerVariable("height", +180); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"height\":180"); - } - - @Test - void testIntegerVariableWithNull() { - final IntegerVariable graphQLVariable = new IntegerVariable("height", null); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"height\":null"); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/RecursiveAbstractVariableTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/RecursiveAbstractVariableTest.java deleted file mode 100644 index 2d3ed5a33..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/RecursiveAbstractVariableTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * RecursiveAbstractVariableTest.java - * - * Projekt : MServer - * erstellt am: 08.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; -import org.junit.jupiter.api.Test; - -import java.util.LinkedList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -class RecursiveAbstractVariableTest { - - - @Test - void testOneRecursion() { - final BooleanVariable eqFalseVariable = new BooleanVariable("eq", false); - final RecursiveAbstractVariable emptyEqFalseVariable = new RecursiveAbstractVariable("empty", eqFalseVariable); - assertThat(emptyEqFalseVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"empty\":{\"eq\":false}"); - } - - @Test - void testDoubleRecursion() { - final BooleanVariable eqFalseVariable = new BooleanVariable("eq", false); - final RecursiveAbstractVariable emptyEqFalseVariable = new RecursiveAbstractVariable("empty", eqFalseVariable); - final RecursiveAbstractVariable essencesEmptyEqFalseVariable = new RecursiveAbstractVariable("essences", emptyEqFalseVariable); - assertThat(essencesEmptyEqFalseVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"essences\":{\"empty\":{\"eq\":false}}"); - } - - @Test - void testNullObject() { - final RecursiveAbstractVariable variableWithBooleanNull = - new RecursiveAbstractVariable("eq", null); - assertThat(variableWithBooleanNull.getJSONFromVariableOrDefaulNull()).isEqualTo("\"eq\":null"); - } - - @Test - void testSubListSetsStatusRootNodeToFalse() { - final BooleanVariable bv = new BooleanVariable("bv", false); - final StringVariable sv = new StringVariable("sv", "text"); - final List subList = new LinkedList<>(); - subList.add(bv); - subList.add(sv); - - final VariableList vl = new VariableList("SubList", subList); - - assertThat(vl.isRootElement()).isTrue(); - - final RecursiveAbstractVariable rv = new RecursiveAbstractVariable("father", vl); - - if (rv.getValue() instanceof final VariableList sub) { - sub.getValue().stream() - .filter(VariableList.class::isInstance) - .map(VariableList.class::cast) - .forEach(v -> assertThat(v.isRootElement()).isFalse()); - } - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/StringVariableTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/StringVariableTest.java deleted file mode 100644 index c2353503c..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/StringVariableTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * StringVariableTest.java - * - * Projekt : MServer - * erstellt am: 07.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class StringVariableTest { - - @Test - void testNormalString() { - final StringVariable graphQLVariable = - new StringVariable("broadcasterId", "av:http://ard.de/ontologies/ard#BR_Fernsehen"); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()) - .isEqualTo("\"broadcasterId\":\"av:http://ard.de/ontologies/ard#BR_Fernsehen\""); - } - - @Test - void testStringWithQuotes() { - final StringVariable graphQLVariable = - new StringVariable("term", "\"Fit - auch ohne Sport!\". Wie das geht"); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()) - .isEqualTo("\"term\":\"\\\"Fit - auch ohne Sport!\\\". Wie das geht\""); - } - - @Test - void testNullString() { - final StringVariable graphQLVariable = new StringVariable("term", null); - assertThat(graphQLVariable.getJSONFromVariableOrDefaulNull()).isEqualTo("\"term\":null"); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/VariableListTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/VariableListTest.java deleted file mode 100644 index dd74a52a0..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/graphql/variables/VariableListTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * VariableListTest.java - * - * Projekt : MServer - * erstellt am: 08.12.2017 - * Autor : Sascha - * - * (c) 2017 by Sascha Wiegandt - */ -package de.mediathekview.mserver.crawler.br.graphql.variables; - -import de.mediathekview.mserver.crawler.br.graphql.AbstractVariable; -import org.junit.jupiter.api.Test; - -import java.util.LinkedList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -class VariableListTest { - - @Test - void testListWithOneSimpleElementConstructorWithOneParam() { - final BooleanVariable triggerSearchTrue = new BooleanVariable("triggerSearch", true); - final List simpleList = new LinkedList<>(); - simpleList.add(triggerSearchTrue); - final VariableList simpleListContainer = new VariableList(simpleList); - - assertThat(simpleListContainer.getJSONFromVariableOrDefaulNull()) - .isEqualTo("\"variables\":{\"triggerSearch\":true}"); - } - - @Test - void testNullList() { - final VariableList nullList = new VariableList("nullVariable", null); - assertThat(nullList.getJSONFromVariableOrDefaulNull()).isEqualTo("\"nullVariable\":null"); - } - - @Test - void testThatSublistsNotMarkedAsRootList() { - final BooleanVariable bv = new BooleanVariable("bv", false); - final IntegerVariable iv = new IntegerVariable("iv", 50); - final List subList = new LinkedList<>(); - subList.add(bv); - subList.add(iv); - final VariableList subVl = new VariableList("SubList", subList); - - assertThat(subVl.isRootElement()).isTrue(); // Till now the Sublist is a RootList - - final StringVariable sv = new StringVariable("sv", "text"); - final FloatVariable fv = new FloatVariable("fv", 0.001); - final List rootList = new LinkedList<>(); - rootList.add(sv); - rootList.add(subVl); - rootList.add(fv); - - final VariableList rootVl = new VariableList(rootList); - assertThat(rootVl.isRootElement()).isTrue(); - rootVl.getValue().stream() - .filter(VariableList.class::isInstance) - .map(VariableList.class::cast) - .forEach(v -> assertThat(v.isRootElement()).isFalse()); - } - - @Test - void testRealBRExample() { - - final BooleanVariable eqFalse = new BooleanVariable("eq", false); - final RecursiveAbstractVariable emptyEqFalse = new RecursiveAbstractVariable("empty", eqFalse); - final RecursiveAbstractVariable essencesEmptyEqFalse = - new RecursiveAbstractVariable("essences", emptyEqFalse); - - final RecursiveAbstractVariable audioOnlyEqFalse = - new RecursiveAbstractVariable("audioOnly", eqFalse); - - final List clipFilterList = new LinkedList<>(); - clipFilterList.add(audioOnlyEqFalse); - clipFilterList.add(essencesEmptyEqFalse); - final VariableList clipFilter = new VariableList("clipFilter", clipFilterList); - - final IntegerVariable clipCount = new IntegerVariable("clipCount", 5000); - final BooleanVariable triggerSearch = new BooleanVariable("triggerSearch", true); - - final List variablesList = new LinkedList<>(); - variablesList.add(triggerSearch); - variablesList.add(clipCount); - variablesList.add(clipFilter); - - final VariableList variables = new VariableList(variablesList); - - assertThat(variables.getJSONFromVariableOrDefaulNull()) - .isEqualTo( - "\"variables\":{\"triggerSearch\":true,\"clipCount\":5000,\"clipFilter\":{\"audioOnly\":{\"eq\":false},\"essences\":{\"empty\":{\"eq\":false}}}}"); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrBroadcastsTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrBroadcastsTaskTest.java deleted file mode 100644 index e817ba97d..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrBroadcastsTaskTest.java +++ /dev/null @@ -1,110 +0,0 @@ -package de.mediathekview.mserver.crawler.br.tasks; - -import de.mediathekview.mserver.crawler.br.BrClipQueryDto; -import de.mediathekview.mserver.crawler.br.BrConstants; -import de.mediathekview.mserver.crawler.br.BrQueryDto; -import de.mediathekview.mserver.crawler.br.data.BrClipType; -import de.mediathekview.mserver.crawler.br.data.BrID; -import org.junit.jupiter.api.Test; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; - -import static org.assertj.core.api.Assertions.assertThat; - -class BrBroadcastsTaskTest extends BrTaskTestBase { - - protected Queue createQueryDto(final String requestUrl) { - final Queue input = new ConcurrentLinkedQueue<>(); - final LocalDate day = LocalDate.of(2021, 3, 15); - input.add( - new BrQueryDto( - wireMockServer.baseUrl() + requestUrl, - BrConstants.BROADCAST_SERVICE_BR, - day, - day, - 10, - Optional.empty())); - return input; - } - - public Set executeTask(String request) { - return new BrBroadcastsTask(createCrawler(), createQueryDto(request)).invoke(); - } - - @Test - void noBroadcasts() { - final String request = "/br/empty"; - setupSuccessfulJsonPostResponse(request, "/br/br_broadcast_empty.json"); - - final Set actual = executeTask(request); - - assertThat(actual).isNotNull().isEmpty(); - } - - @Test - void singlePage() { - final String request = "/br/single"; - setupSuccessfulJsonPostResponse(request, "/br/br_broadcast_single_page.json"); - - List expected = - List.of( - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:60813b5f0b25e4000731b248")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:604b4c5f3ba50f001a1e64e0")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:604b4c2973b5b70013facd0f"))); - - final Set actual = executeTask(request); - - assertThat(actual).isNotNull().hasSize(3).containsAll(expected); - } - - @Test - void multiplePages() { - final String request = "/br/single"; - setupSuccessfulJsonPostResponse( - request, "/br/br_broadcast_multiple_pages_1.json", "$programmeFilter)", null); - setupSuccessfulJsonPostResponse( - request, "/br/br_broadcast_multiple_pages_2.json", "$programmeFilter, after", null); - - List expected = - List.of( - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:6053887946ee90001a872665")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:6021371101483100133f889d")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:6019326ea636b2001a16d491")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:601932287b541b001316ce4b")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:5e3aa3378583a30013890d58")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:5d3875f52035ed001a6f3bb5")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:5d3831932bd8f200136c9242")), - new BrClipQueryDto( - BrConstants.GRAPHQL_API, - new BrID(BrClipType.PROGRAMME, "av:5d24b2f44b36a5001a8e093e"))); - - final Set actual = executeTask(request); - - assertThat(actual).isNotNull().hasSize(8).containsAll(expected); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrGetClipDetailsTaskTest.java b/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrGetClipDetailsTaskTest.java deleted file mode 100644 index 1ec1e3e6a..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrGetClipDetailsTaskTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * BrGetClipDetailsTaskTest.java - * - * Projekt : MServer - * erstellt am: 25.12.2017 - * Autor : Sascha - * - */ -package de.mediathekview.mserver.crawler.br.tasks; - -import de.mediathekview.mlib.daten.Film; -import de.mediathekview.mlib.daten.GeoLocations; -import de.mediathekview.mlib.daten.Sender; -import de.mediathekview.mserver.crawler.br.BrClipQueryDto; -import de.mediathekview.mserver.crawler.br.data.BrClipType; -import de.mediathekview.mserver.crawler.br.data.BrID; -import de.mediathekview.mserver.testhelper.AssertFilm; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.stream.Stream; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.params.provider.Arguments.arguments; - -class BrGetClipDetailsTaskTest extends BrTaskTestBase { - - static Stream data() { - return Stream.of( - arguments( - "av:6040d1a28997e2001339b3be", - "/br/br_film_with_subtitle.json", - "Planet Wissen", - "Wikipedia – Was bringt die freie Enzyklopädie?", - LocalDateTime.of(2021, 4, 13, 18, 15, 0), - Duration.ofMinutes(58).plusSeconds(11), - "Am 15. Januar 2001 wurde Wikipedia gegründet. Als „gemeinnütziges Projekt zur Erstellung einer freien Internet-Enzyklopädie in zahlreichen Sprachen“ - so beschreibt sich Wikipedia selbst. Was klein anfing, ist heute ein Massenmedium: Wikipedia zählt zu den weltweit meistbesuchten Internetseiten, mehr als 55 Millionen Artikel sind online, übersetzt in mehrere hundert Sprachen. Frei zugängliches Wis\n.....", - "https://www.br.de/mediathek/video/planet-wissen-wissensmagazin-wikipedia-was-bringt-die-freie-enzyklopaedie-av:6040d1a28997e2001339b3be", - "https://cdn-storage.br.de/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_E.mp4", - "https://cdn-storage.br.de/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_C.mp4", - "https://cdn-storage.br.de/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_X.mp4", - "https://www.br.de/untertitel/a3e8c27f-f15b-4cc7-881a-bf021b8aac5c.ttml", - GeoLocations.GEO_DE), - arguments( - "av:5be427420d112e0018031587", - "/br/br_film_with_geo.json", - "Gernstl unterwegs", - "Gernstl in Oberfranken (1/2)", - LocalDateTime.of(2021, 5, 9, 15, 0, 0), - Duration.ofMinutes(13).plusSeconds(37), - "Das filmische Pfadfinderteam ist wieder unterwegs: Franz X. Gernstl, HP Fischer (Kamera) und Stefan Ravasz (Ton) haben sich die sieben Regierungsbezirke vorgenommen. Sie wollen herauszufinden, wie die Bayern sind. Was sie ausmacht, die Franken, die Schwaben und die Altbayern. Was sie gemeinsam haben, und was sie unterscheidet.", - "https://www.br.de/mediathek/video/gernstl-sieben-mal-bayern-reportage-gernstl-in-oberfranken-1-2-av:5be427420d112e0018031587", - "https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_E.mp4", - "https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_C.mp4", - "https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_X.mp4", - "", - GeoLocations.GEO_DE)); - } - - @ParameterizedTest - @MethodSource("data") - void test( - final String id, - final String filmJsonFile, - final String expectedTopic, - final String expectedTitle, - final LocalDateTime expectedTime, - final Duration expectedDuration, - final String expectedDescription, - final String expectedWebsite, - final String expectedUrlSmall, - final String expectedUrlNormal, - final String expectedUrlHd, - final String expectedSubtitle, - final GeoLocations expectedGeo) { - final Queue queue = new ConcurrentLinkedQueue<>(); - queue.add( - new BrClipQueryDto( - wireMockServer.baseUrl() + "/graphql", new BrID(BrClipType.PROGRAMME, id))); - - setupSuccessfulJsonPostResponse("/graphql", filmJsonFile); - - final BrGetClipDetailsTask task = new BrGetClipDetailsTask(createCrawler(), queue); - final Set actual = task.invoke(); - assertThat(actual.size(), equalTo(1)); - - final Film film = actual.iterator().next(); - AssertFilm.assertEquals( - film, - Sender.BR, - expectedTopic, - expectedTitle, - expectedTime, - expectedDuration, - expectedDescription, - expectedWebsite, - new GeoLocations[] {expectedGeo}, - expectedUrlSmall, - expectedUrlNormal, - expectedUrlHd, - expectedSubtitle); - } -} diff --git a/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrTaskTestBase.java b/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrTaskTestBase.java deleted file mode 100644 index 46d1ab93d..000000000 --- a/src/test/java/de/mediathekview/mserver/crawler/br/tasks/BrTaskTestBase.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.mediathekview.mserver.crawler.br.tasks; - -import de.mediathekview.mlib.messages.listener.MessageListener; -import de.mediathekview.mserver.base.config.MServerConfigManager; -import de.mediathekview.mserver.crawler.br.BrCrawler; -import de.mediathekview.mserver.progress.listeners.SenderProgressListener; -import de.mediathekview.mserver.testhelper.WireMockTestBaseJUnit5; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.concurrent.ForkJoinPool; - -public class BrTaskTestBase extends WireMockTestBaseJUnit5 { - protected MServerConfigManager rootConfig = new MServerConfigManager("MServer-JUnit-Config.yaml"); - - protected BrCrawler createCrawler() { - final ForkJoinPool forkJoinPool = new ForkJoinPool(); - final Collection nachrichten = new ArrayList<>(); - final Collection fortschritte = new ArrayList<>(); - - return new BrCrawler(forkJoinPool, nachrichten, fortschritte, rootConfig); - } -} diff --git a/src/test/resources/br/br_broadcast_empty.json b/src/test/resources/br/br_broadcast_empty.json deleted file mode 100644 index 40f1b1f2e..000000000 --- a/src/test/resources/br/br_broadcast_empty.json +++ /dev/null @@ -1 +0,0 @@ -{"data":{"viewer":{"broadcastService":{"__typename":"BroadcastService","id":"av:http://ard.de/ontologies/ard#BR_Fernsehen","programmes":{"count":0,"pageInfo":{"hasNextPage":false},"edges":[]}}}}} \ No newline at end of file diff --git a/src/test/resources/br/br_broadcast_multiple_pages_1.json b/src/test/resources/br/br_broadcast_multiple_pages_1.json deleted file mode 100644 index b31d7e0c0..000000000 --- a/src/test/resources/br/br_broadcast_multiple_pages_1.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "data":{ - "viewer":{ - "broadcastService":{ - "__typename":"BroadcastService", - "id":"av:http://ard.de/ontologies/ard#BR_Fernsehen", - "programmes":{ - "count":8, - "pageInfo":{ - "hasNextPage":true - }, - "edges":[ - { - "cursor":"eyJfaWQiOiI2MDUzODg3OTQ2ZWU5MDAwMWE4NzI2NjUiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:6053887946ee90001a872665", - "__typename":"Programme", - "description":"Die Themen der Sendung:\n\nImpfen gegen COVID-19: die Hürden für Gehörlose\nWährend in anderen Ländern wie zum Beispiel Großbritannien schon jede dritte Person mit der ersten Impfung versorgt wurde, sind es in Deutschland gerade einmal fünf Prozent. Die Ursachen sind verschieden: zu wenig Impfstoff, zu späte Lieferungen, Vorbehalte gegen einzelne Impfstoffe, wenig digitalisierte Abläufe und Probleme bei der Verwaltung der Termine. Wer über 80 Jahre ist, gehört zur 1. Gruppe der zu impfenden Personen, hat also oberste Priorität. Doch wer glaubt, dass dies sich so leicht umsetzen lässt, hat sich getäuscht. Vor allem, wenn es um Gehörlose geht.\n\nErnährungsberatung: gesund ernähren \nGesunde Ernährung ist gerade in Pandemie-Zeiten, wo viele sich wegen des Lockdowns weniger bewegen, besonders wichtig. Tipps und Hintergründe dazu gibt es von Christoph Prietze und seiner Frau Lilli, die aus eigener Erfahrung wissen, wie wichtig körperliche Bewegung und richtige Ernährung sind.\nIndustriemechaniker Christoph Prietze war bis vor einigen Jahren durchaus stattlich. Das wollte er ändern und abnehmen. Aber er musste feststellen, dass Sport allein nicht ausreicht. Unter ärztlicher Anleitung schaffte Christoph Prietze es dann, durch gesunde Ernährung abzunehmen. Das war für ihn eine so interessante Erfahrung, dass er selbst ein Fernstudium zum Ernährungsberater begann. Jetzt sind seine Frau und er fit und schlank. Auf Infoveranstaltungen hält er Vorträge in Gebärdensprache über gesunde Ernährung für Eltern und Kinder, Schwangere oder Sportler, und bietet hierzu auch Einzelberatungen an. Moderator Thomas Zander begleitet Christoph beim Einkaufen und Kochen sowie zu Gesprächen mit Klienten und lässt sich für diesen Beitrag auch gleich auf ein mögliches Übergewicht testen.", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-03-20T08:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-27T09:00:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-20T08:00:00.000Z" - } - } - }, - { - "cursor":"eyJfaWQiOiI2MDIxMzcxMTAxNDgzMTAwMTMzZjg4OWQiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:6021371101483100133f889d", - "__typename":"Programme", - "description":null, - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-03-20T06:45:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-20T06:45:00.000Z" - } - } - }, - { - "cursor":"eyJfaWQiOiI2MDE5MzI2ZWE2MzZiMjAwMWExNmQ0OTEiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:6019326ea636b2001a16d491", - "__typename":"Programme", - "description":"Monika macht Vera klar, dass die Hellebarde für sie ein Hirngespinst ist. Soll die Legende nun eine Legende bleiben?", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-03-17T05:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-16T18:30:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-16T23:50:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-20T06:00:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-16T18:30:00.000Z" - } - } - }, - { - "cursor":"eyJfaWQiOiI2MDE5MzIyODdiNTQxYjAwMTMxNmNlNGIiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:601932287b541b001316ce4b", - "__typename":"Programme", - "description":"Hubert kann Winkler überzeugen, die Brauerei zu besichtigen. Kann er ihn als Investor gewinnen und das Festzelt damit auf stabile Beine stellen?", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-03-16T05:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-20T05:30:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-16T00:05:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-15T18:30:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-15T18:30:00.000Z" - } - } - }, - { - "cursor":"eyJfaWQiOiI1ZTNhYTMzNzg1ODNhMzAwMTM4OTBkNTgiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:5e3aa3378583a30013890d58", - "__typename":"Programme", - "description":"Immer mehr Menschen verzichten auf Kuhmilch – aus Rücksicht auf Tiere und Umwelt oder weil sie unter Laktoseintoleranz leiden. Eine Alternative sind Pflanzendrinks aus Soja, Reis, Hafer oder Mandeln. Aber können sie die Kuhmilch ersetzen? Die \"Xenius\"-Moderatoren Gunnar Mergner und Pierre Girard prüfen die Drinks auf Geschmack, Inhaltsstoffe, ihren ökologischen Fußabdruck – und darauf, wie sie sich verarbeiten lassen.", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2020-03-18T10:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-03-17T13:30:00.000Z" - } - }, - { - "node":{ - "start":"2020-11-09T20:45:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-28T15:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-11-10T14:45:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-20T05:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-03-22T16:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-23T15:15:00.000Z" - } - }, - { - "node":{ - "start":"2020-03-14T05:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-24T10:00:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-20T05:00:00.000Z" - } - } - } - ] - } - } - } - } -} \ No newline at end of file diff --git a/src/test/resources/br/br_broadcast_multiple_pages_2.json b/src/test/resources/br/br_broadcast_multiple_pages_2.json deleted file mode 100644 index 5f4d61f1c..000000000 --- a/src/test/resources/br/br_broadcast_multiple_pages_2.json +++ /dev/null @@ -1,237 +0,0 @@ -{ - "data":{ - "viewer":{ - "broadcastService":{ - "__typename":"BroadcastService", - "id":"av:http://ard.de/ontologies/ard#BR_Fernsehen", - "programmes":{ - "count":8, - "pageInfo":{ - "hasNextPage":false - }, - "edges":[ - { - "cursor":"eyJfaWQiOiI1ZDM4NzVmNTIwMzVlZDAwMWE2ZjNiYjUiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:5d3875f52035ed001a6f3bb5", - "__typename":"Programme", - "description":"Überall auf Straßen, Wiesen und Feldern sieht man sie im schnellen Schritt: die Nordic Walker. Jetzt zeigt TELE-GYM, wie man diese Sportart abwechslungsreich gestalten und sich damit optimal auf den Wintersport vorbereiten kann. Nordic Walking wurde ursprünglich als Sommertraining für Skilangläufer entwickelt. Es ist das perfekte Ganzkörpertraining für jedermann, da 90% aller Muskeln im Einsatz sind. Das Übungsprogramm ist in Zusammenarbeit mit dem Deutschen Skiverband aus dem Nordic-Walking-Sport heraus entwickelt worden. Gekräftigt werden Beine, Po, Bauch, Arme und Rücken, spezielle Übungen schulen die Balance- und Koordinationsfähigkeit. Die Übungen sind so aufgebaut, dass sie sowohl als eigenständiges Training durchgeführt, aber auch bestens zur Abwechslung ins Nordic-Walking-Training eingebaut werden können. Der Nordic Walker kann auf diese Weise die positive Wirkung auf den Organismus noch wesentlich erhöhen. Für Nicht-Nordic-Walker ist das Training ein perfektes Fitnessprogramm, das auch zur Vorbereitung auf den Wintersport dient. Alle Übungen werden mit und ohne Stöcke demonstriert. Effektive Mitmach-Gymnastik die Spaß macht, Profi-Tipps zum richtigen Walken und die Präsentation von tollen DSV E.ON-Bayern-Nordic-Walking-Zentren in Bayern - das alles gibt es in jeder Folge \"Nordic Walking mit Peter Schlickenrieder\"!", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-03-20T07:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-10-03T06:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-06-09T06:25:00.000Z" - } - }, - { - "node":{ - "start":"2020-11-28T07:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-06-06T06:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-16T06:20:00.000Z" - } - }, - { - "node":{ - "start":"2020-08-01T06:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-01-23T07:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-10-02T05:20:00.000Z" - } - }, - { - "node":{ - "start":"2020-08-03T05:20:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-20T07:00:00.000Z" - } - } - }, - { - "cursor":"eyJfaWQiOiI1ZDM4MzE5MzJiZDhmMjAwMTM2YzkyNDIiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:5d3831932bd8f200136c9242", - "__typename":"Programme", - "description":"Zwanzig Jahre 50 bleiben - mit diesem Training schaffen Sie das! Bewegung ist die beste Möglichkeit, ein gesundes und selbständiges Leben bis ins hohe Alter zu führen. Ohne Bewegung lassen wichtige Funktionen nach, die Muskeln werden schwächer, die Gelenke unbeweglicher, das Gleichgewicht schwindet. Unser Körper erhält nur die Funktionen, die er auch nutzt und im Alltag braucht! Schuld ist also nicht allein der Alterungsprozess, sondern auch wie die körperlichen Fähigkeiten trainiert werden.\n\nMit den täglichen kurzen Trainingseinheiten bleiben Sie sowohl körperlich als auch geistig mobil und fit. Sie gewinnen an Sicherheit im Alltag und werden gesund älter. Durch das Schulen der Sinne verbessern Sie Ihre Reaktionsgeschwindigkeit und vermeiden Verletzungen und Stürze. Das sanfte, dynamische Figur- und Gesundheitstraining sorgt für ein jugendlich frisches und sicheres Auftreten. Trainieren und stabilisieren Sie Ihre Körpermitte und formen Sie so nicht nur Ihre Taille und einen schlanken Bauch, sondern halten Sie dadurch Ihre inneren Organe an der richtigen Stelle!\n\nEin intelligentes Training, das Sie fordert, aber nicht überfordert.\n\n", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-01-21T07:40:00.000Z" - } - }, - { - "node":{ - "start":"2021-01-12T12:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-11-17T12:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-10-03T06:45:00.000Z" - } - }, - { - "node":{ - "start":"2020-09-22T11:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-20T06:30:00.000Z" - } - }, - { - "node":{ - "start":"2020-11-23T06:20:00.000Z" - } - }, - { - "node":{ - "start":"2020-07-28T11:00:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-09T12:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-06-09T05:20:00.000Z" - } - }, - { - "node":{ - "start":"2020-06-02T11:00:00.000Z" - } - }, - { - "node":{ - "start":"2020-08-09T05:30:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-20T06:30:00.000Z" - } - } - }, - { - "cursor":"eyJfaWQiOiI1ZDI0YjJmNDRiMzZhNTAwMWE4ZTA5M2UiLCJfa2V5IjpudWxsfQ==", - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:5d24b2f44b36a5001a8e093e", - "__typename":"Programme", - "description":null, - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2020-08-07T05:20:00.000Z" - } - }, - { - "node":{ - "start":"2020-10-29T12:15:00.000Z" - } - }, - { - "node":{ - "start":"2020-06-10T06:25:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-04T12:15:00.000Z" - } - }, - { - "node":{ - "start":"2020-08-20T11:15:00.000Z" - } - }, - { - "node":{ - "start":"2021-01-14T12:15:00.000Z" - } - }, - { - "node":{ - "start":"2020-11-23T07:30:00.000Z" - } - }, - { - "node":{ - "start":"2021-01-24T06:30:00.000Z" - } - }, - { - "node":{ - "start":"2020-06-11T11:15:00.000Z" - } - }, - { - "node":{ - "start":"2021-03-20T07:45:00.000Z" - } - }, - { - "node":{ - "start":"2020-10-03T05:30:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-03-20T07:45:00.000Z" - } - } - } - ] - } - } - } - } -} \ No newline at end of file diff --git a/src/test/resources/br/br_broadcast_single_page.json b/src/test/resources/br/br_broadcast_single_page.json deleted file mode 100644 index c15258e5a..000000000 --- a/src/test/resources/br/br_broadcast_single_page.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "data":{ - "viewer":{ - "broadcastService":{ - "__typename":"BroadcastService", - "id":"av:http://ard.de/ontologies/ard#BR_Fernsehen", - "programmes":{ - "count":35, - "pageInfo":{ - "hasNextPage":false - }, - "edges":[ - { - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:60813b5f0b25e4000731b248", - "__typename":"Programme", - "description":"München - ein Ort zum Glücklichsein. Ein Fest für die Augen, auch dank mancher einzigartiger Straßen. Etwa der Ludwigstraße, Prachtstraße aus einem Guss, von König Ludwig I. vorangetrieben. Ganz anders die Rosenheimer Straße - vom zeitlos schönen Müllerschen Volksbad bis zur ältesten Marienwallfahrt im Münchner Raum in Maria Ramersdorf - eine Straße der Vielfalt. Und auch interessante und zugleich liebenswerte Geschichten entlang der Theatinerstraße sowie der Dachauer Straße erzählt der Film von Michael Zehetmair und Wolfgang Binder über Münchens große Straßen.", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-04-25T11:15:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-04-25T11:15:00.000Z" - } - }, - "cursor":"eyJfaWQiOiI2MDgxM2I1ZjBiMjVlNDAwMDczMWIyNDgiLCJfa2V5IjpudWxsfQ==" - }, - { - "node":{ - "videoFiles":{ - "count":0 - }, - "id":"av:604b4c5f8997e200133efbac", - "__typename":"Programme", - "description":"Studiogast: Rainer Koch (DFB-Vizepräsident und BfV-Präsident)\nFußball / DFB: Entlassungen, Abmahnungen, Ermittlungsverfahren – die Krise beim DFB\nInternationaler Fußball: Nach dem Aus der Super League – die Doppelmoral von UEFA und FIFA\nFußball Nationalmannschaft: Wer wird Nachfolger von Jogi Löw?\nFußball Bundesliga: Story FC Bayern – wie geht es weiter mit Trainer Hansi Flick?\nAmateur-Fußball: Der Amateurfußball in der Corona-Falle\nFußball Bundesliga aktuell: RB Leipzig – VfB Stuttgart, Borussia Mönchengladbach – Arminia Bielefeld \nFußball 2. Bundesliga aktuell: FC St. Pauli – SpVgg Greuther Fürth\nFrauenfußball Champions League: FC Bayern München – FC Chelsea\nBasketball Bundesliga: FC Bayern München – Alba Berlin\nAlso sprach Cissé …", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-04-25T19:45:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-04-25T19:45:00.000Z" - } - }, - "cursor":"eyJfaWQiOiI2MDRiNGM1Zjg5OTdlMjAwMTMzZWZiYWMiLCJfa2V5IjpudWxsfQ==" - }, - { - "node":{ - "videoFiles":{ - "count":0 - }, - "id":"av:604b4c5f8894b30013395ddc", - "__typename":"Programme", - "description":null, - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-04-25T18:00:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-04-25T18:00:00.000Z" - } - }, - "cursor":"eyJfaWQiOiI2MDRiNGM1Zjg4OTRiMzAwMTMzOTVkZGMiLCJfa2V5IjpudWxsfQ==" - }, - { - "node":{ - "videoFiles":{ - "count":0 - }, - "id":"av:604b4c5f3e0f24001ae3f198", - "__typename":"Programme", - "description":null, - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-04-25T21:00:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-04-25T21:00:00.000Z" - } - }, - "cursor":"eyJfaWQiOiI2MDRiNGM1ZjNlMGYyNDAwMWFlM2YxOTgiLCJfa2V5IjpudWxsfQ==" - }, - { - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:604b4c5f3ba50f001a1e64e0", - "__typename":"Programme", - "description":"Engagierte Musikerinnen und Musiker betreten wieder die Söllhubener Bühne, darunter Hix Tradimix aus Oberfranken, ein Vater mit drei Söhnen, die zusammen so richtig Stimmung machen. Beim Draufgänger-Dreher muss man sich schon warm anziehen, dass man da noch mitkommt! Obendrein verraten die vier Männer auch noch ein schmackhaftes Familiengeheimnis, das nach Zimt duftet und von der Mama stammt.\n\nDie Gruppe „KlangZeit & Kiko“ mit den Musikern Finni Melchior, Hans Zeller und Kiko Pedrozo verspricht „weltmusikalische Frischluft“. In ihrer virtuosen Musik vereint sich Professionalität, Hingabe und Tiefe, die keinen Zuhörer unberührt lässt.\n\nWeltläufigkeit versprechen auch die „Wiesn Buam“: Sie spielen auf Oktoberfesten rund um die Welt und bringen musikalische Einflüsse von Japan bis Südamerika mit nach Söllhuben. Dabei bleiben sie mit ihren oberbayerischen Wurzeln musikalisch bodenständig und bringen ganz viel Spaß an der Musik mit auf die Bühne.\n\nWeil’s so schön ist bei den Wirtshausmusikanten, singt der Zeitlang Gsang „Aber heit gehen wir morgen erst hoam“ - selbst geschrieben von Franziska Kolb, die die Harfe spielt und singt.\n\nMit der Tölzer Geigenmusi wird’s rasant, sie bittet zur Apfelkistl-Polka und zum Wessobrunner Hochzeitswalzer. Da darf geschunkelt und gehupft werden, was das Zeug hält!\n\nDie Geschwister Pongratz aus Garmisch-Partenkirchen zeigen mit ihrem Lied „Wannst a Oachkatzl wuist fanga“, wie schön es ist, wenn Kinder singen. Begleitet werden sie dabei von einer Harfe.\n\nDie musikalische Vielfalt der Sendung schließt mit einem ganz besonderen Höhepunkt: Drei der besten Gstanzl-Sängerinnen und -Sänger aus Bayern, Renate Maier, Hubert Mittermeier und Josef Piendl, stellen sich einem spontanen „Aussingen\".\n\nEin ganzer Korb voll musikalischer Überraschungen, präsentiert von Traudi Siferlinger und Dominik Glöbl.", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-04-25T18:15:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-04-25T18:15:00.000Z" - } - }, - "cursor":"eyJfaWQiOiI2MDRiNGM1ZjNiYTUwZjAwMWExZTY0ZTAiLCJfa2V5IjpudWxsfQ==" - }, - { - "node":{ - "videoFiles":{ - "count":5 - }, - "id":"av:604b4c2973b5b70013facd0f", - "__typename":"Programme", - "description":"Katastrophe: Brand auf Corona-Station in Bagdad +++ Indonesien: gesunkenes U-Boot gefunden +++ 35 Jahre nach Tschernobyl: noch immer verstrahltes Wild? +++ Fußball - Sonntagsspiele", - "broadcasts":{ - "edges":[ - { - "node":{ - "start":"2021-04-25T14:00:00.000Z" - } - } - ] - }, - "initialScreening":{ - "start":"2021-04-25T14:00:00.000Z" - } - }, - "cursor":"eyJfaWQiOiI2MDRiNGMyOTczYjViNzAwMTNmYWNkMGYiLCJfa2V5IjpudWxsfQ==" - } - ] - } - } - } - } -} \ No newline at end of file diff --git a/src/test/resources/br/br_film_with_geo.json b/src/test/resources/br/br_film_with_geo.json deleted file mode 100644 index 8c881c3ff..000000000 --- a/src/test/resources/br/br_film_with_geo.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "data":{ - "viewer":{ - "clipDetails":{ - "__typename":"Programme", - "id":"av:5be427420d112e0018031587", - "title":"Gernstl in Oberfranken (1/2)", - "kicker":"Gernstl - Sieben mal Bayern | Reportage", - "duration":817, - "ageRestriction":null, - "description":"Das filmische Pfadfinderteam ist wieder unterwegs: Franz X. Gernstl, HP Fischer (Kamera) und Stefan Ravasz (Ton) haben sich die sieben Regierungsbezirke vorgenommen. Sie wollen herauszufinden, wie die Bayern sind. Was sie ausmacht, die Franken, die Schwaben und die Altbayern. Was sie gemeinsam haben, und was sie unterscheidet.", - "shortDescription":"Das filmische Pfadfinderteam ist wieder unterwegs: Franz X. Gernstl, HP Fischer (Kamera) und Stefan Ravasz (Ton) haben sich die sieben Regierungsbezirke vorgenommen. Sie wollen herausfinden, wie die Bayern sind. Was sie ausmacht, die Franken, die Schwaben und die Altbayern. Was sie gemeinsam haben, und was sie unterscheidet.", - "slug":"gernstl-sieben-mal-bayern-reportage-gernstl-in-oberfranken-1-2", - "availableUntil":null, - "authors":{ - "count":1, - "edges":[ - { - "node":{ - "id":"av:5a36f774a3e96100189bf466", - "name":"Franz X. Gernstl" - } - } - ] - }, - "subjects":{ - "count":0, - "edges":[ - - ] - }, - "tags":{ - "count":0, - "edges":[ - - ] - }, - "executiveProducers":{ - "count":0, - "edges":[ - - ] - }, - "credits":{ - "count":1, - "edges":[ - { - "node":{ - "id":"av:5a36f774a3e96100189bf466", - "name":"Franz X. Gernstl" - } - } - ] - }, - "categorizations":{ - "count":6, - "edges":[ - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#bayern" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#heimat" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#reise" - } - }, - { - "node":{ - "id":"av:http://br.de/ontologies/viam/categories#gesellschaft-und-soziales" - } - }, - { - "node":{ - "id":"av:http://br.de/ontologies/viam/formats#dokumentarbericht" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/genres#reportage" - } - } - ] - }, - "genres":{ - "count":1, - "edges":[ - { - "node":{ - "id":"av:http://ard.de/ontologies/genres#reportage", - "label":"Reportage" - } - } - ] - }, - "videoFiles":{ - "count":6, - "edges":[ - { - "node":{ - "id":"av:5beaf78e6073210018d2f177", - "fileSize":385411812, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_X.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_HD", - "height":720, - "width":1280 - } - } - }, - { - "node":{ - "id":"av:5beaf78e6073210018d2f175", - "fileSize":203231582, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_C.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_Premium", - "height":540, - "width":969 - } - } - }, - { - "node":{ - "id":"av:5beaf78e6073210018d2f176", - "fileSize":124003789, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_E.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_Large", - "height":360, - "width":640 - } - } - }, - { - "node":{ - "id":"av:5beaf78e6073210018d2f174", - "fileSize":61923465, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_B.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_Standard", - "height":288, - "width":512 - } - } - }, - { - "node":{ - "id":"av:5beaf78e6073210018d2f173", - "fileSize":32507304, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_A.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_Mobile", - "height":270, - "width":480 - } - } - }, - { - "node":{ - "id":"av:5beaf78e6073210018d2f178", - "fileSize":null, - "publicLocation":"https://br-i.akamaihd.net/i/geo/b7/2018-11/13/5fed645ae75e11e8bca2984be109059a_,A,E,C,X,.mp4.csmil/master.m3u8?__b__=200", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_HLS", - "height":null, - "width":null - } - } - } - ] - }, - "captionFiles":{ - "count":0, - "edges":[ - - ] - }, - "episodeNumber":null, - "episodeOf":{ - "id":"av:584f4c7a3b467900117c2417", - "title":"Gernstl unterwegs", - "kicker":"Gernstl unterwegs", - "scheduleInfo":"Reisereportagen mit Franz Xaver Gernstl", - "shortDescription":"Franz Xaver Gernstl und sein Team, Kameramann Hans Peter Fischer und Tonmann Stefan Ravasz, muss man nicht mehr vorstellen – sie sind über die Grenzen Bayerns hinaus bekannt, für ihre feinen und eigenwilligen Reisereportagen." - }, - "initialScreening":{ - "start":"2021-05-09T13:00:00.000Z", - "id":"av:5be427420d112e0018031587|606f385a76dfa7001a51d0d6" - } - }, - "id":"Viewer:__VIEWER" - } - } -} \ No newline at end of file diff --git a/src/test/resources/br/br_film_with_subtitle.json b/src/test/resources/br/br_film_with_subtitle.json deleted file mode 100644 index 84baf8664..000000000 --- a/src/test/resources/br/br_film_with_subtitle.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "data":{ - "viewer":{ - "clipDetails":{ - "__typename":"Programme", - "id":"av:6040d1a28997e2001339b3be", - "title":"Wikipedia – Was bringt die freie Enzyklopädie?", - "kicker":"Planet Wissen | Wissensmagazin", - "duration":3491, - "ageRestriction":null, - "description":"Am 15. Januar 2001 wurde Wikipedia gegründet. Als „gemeinnütziges Projekt zur Erstellung einer freien Internet-Enzyklopädie in zahlreichen Sprachen“ - so beschreibt sich Wikipedia selbst. Was klein anfing, ist heute ein Massenmedium: Wikipedia zählt zu den weltweit meistbesuchten Internetseiten, mehr als 55 Millionen Artikel sind online, übersetzt in mehrere hundert Sprachen. Frei zugängliches Wissen, jedoch mit einer Einschränkung: Ohne Gewähr für die Richtigkeit. Die Artikel werden von Privatpersonen, keinen Wissenschaftler*innen, geschrieben. Unentgeltlich. Wikipedia-Deutschland hat etwas mehr als 900 Mitglieder – vor allem Männer. Das zweite Problem der freien Ezyklopädie: Nur etwa 10% der Beteiligten sind Frauen. Die Grundidee ist bestechend: Freies Wissen für alle, geschrieben von allen, kontrolliert durch alle. Die Realität sieht jedoch mitunter anders aus. Auch in Wahlkämpfen spielen tendenziöse Wikipedia-Artikel eine zunehmende Rolle. Wie steht es um Wikipedia – 20 Jahre nach der Gründung?", - "shortDescription":"Dipl.-Des. Sandra Becker, Steinbeis-Hochschule und Prof. Dr. Rudolf Stöber, Otto-Friedrich-Universität Bamberg sprechen über das Thema \"Wikipedia - Was bringt die freie Enzyklopädie?\"", - "slug":"planet-wissen-wissensmagazin-wikipedia-was-bringt-die-freie-enzyklopaedie", - "availableUntil":"2026-04-13T17:18:21.000Z", - "authors":{ - "count":0, - "edges":[ - - ] - }, - "subjects":{ - "count":0, - "edges":[ - - ] - }, - "tags":{ - "count":0, - "edges":[ - - ] - }, - "executiveProducers":{ - "count":0, - "edges":[ - - ] - }, - "credits":{ - "count":0, - "edges":[ - - ] - }, - "categorizations":{ - "count":9, - "edges":[ - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#kultur" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#gesellschaft" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#technik" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#gesundheit" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#umwelt" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#wissenschaft" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#natur" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/categories#wissen" - } - }, - { - "node":{ - "id":"av:http://ard.de/ontologies/genres#magazin" - } - } - ] - }, - "genres":{ - "count":1, - "edges":[ - { - "node":{ - "id":"av:http://ard.de/ontologies/genres#magazin", - "label":"Magazin" - } - } - ] - }, - "videoFiles":{ - "count":5, - "edges":[ - { - "node":{ - "id":"av:6075d2c096c294000765380c", - "fileSize":1234515112, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_X.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_HD", - "height":720, - "width":1280 - } - } - }, - { - "node":{ - "id":"av:6075d288ccfe3400075be101", - "fileSize":651015107, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_C.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_Premium", - "height":540, - "width":969 - } - } - }, - { - "node":{ - "id":"av:6075d288ccfe3400075be0f7", - "fileSize":356273594, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_E.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_Large", - "height":360, - "width":640 - } - } - }, - { - "node":{ - "id":"av:6075d288ccfe3400075be0fe", - "fileSize":140990303, - "publicLocation":"https://cdn-storage.br.de/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_A.mp4", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_Mobile", - "height":270, - "width":480 - } - } - }, - { - "node":{ - "id":"av:6075d288ccfe3400075be105", - "fileSize":null, - "publicLocation":"https://br-i.akamaihd.net/i/geo/b7/2021-04/13/fa4cb02e9c7b11eb869202420a000515_,A,E,C,X,.mp4.csmil/master.m3u8?__b__=200", - "accessibleIn":{ - "count":0, - "edges":[ - - ] - }, - "videoProfile":{ - "id":"av:http://ard.de/ontologies/audioVideo#VideoProfile_HLS", - "height":null, - "width":null - } - } - } - ] - }, - "captionFiles":{ - "count":2, - "edges":[ - { - "node":{ - "id":"av:6075d288ccfe3400075be0f2", - "publicLocation":"https://www.br.de/untertitel/a3e8c27f-f15b-4cc7-881a-bf021b8aac5c.ttml" - } - }, - { - "node":{ - "id":"av:6075d288ccfe3400075be0f1", - "publicLocation":"https://www.br.de/untertitel/a3e8c27f-f15b-4cc7-881a-bf021b8aac5c.vtt" - } - } - ] - }, - "episodeNumber":null, - "episodeOf":{ - "id":"av:584f4c573b467900117c11cb", - "title":"Planet Wissen", - "kicker":"ARD-alpha", - "scheduleInfo":null, - "shortDescription":"Ein Thema, zwei Moderatoren und die unbegrenzte Welt der Wissenschaft: \"Planet Wissen\" liefert spannende Geschichten, hintergründige Reportagen und aktuelle News aus Natur und Technik, Forschung und Medizin, Gesellschaft und Geschichte." - }, - "initialScreening":{ - "start":"2021-04-13T16:15:00.000Z", - "id":"av:6040d1a28997e2001339b3be|6075d4dc41d2eb00070bc774" - } - }, - "id":"Viewer:__VIEWER" - } - } -} \ No newline at end of file