diff --git a/src/main/java/mServer/crawler/sender/orfon/json/OrfOnEpisodeDeserializer.java b/src/main/java/mServer/crawler/sender/orfon/json/OrfOnEpisodeDeserializer.java index d33ee320..8d7af82e 100644 --- a/src/main/java/mServer/crawler/sender/orfon/json/OrfOnEpisodeDeserializer.java +++ b/src/main/java/mServer/crawler/sender/orfon/json/OrfOnEpisodeDeserializer.java @@ -103,13 +103,17 @@ public OrfOnVideoInfoDTO deserialize( private Optional> optimizeUrls(Optional> urls) { if (urls.isPresent() && urls.get().size() == 1) { final Map urlMap = urls.get(); - final String urlToOptimize = urlMap.get(Qualities.NORMAL); - urlMap.put(Qualities.SMALL, urlToOptimize.replace("QXA", "Q4A")); - urlMap.put(Qualities.NORMAL, urlToOptimize.replace("QXA", "Q6A")); - urlMap.put(Qualities.HD, urlToOptimize.replace("QXA", "Q8C")); + String urlToOptimize = urlMap.get(Qualities.NORMAL); + for (String s : List.of("QXA","QXB")) { + urlToOptimize = urlToOptimize.replace(s, "#Q#"); + } + urlMap.put(Qualities.SMALL, urlToOptimize.replace("#Q#", "Q4A")); + urlMap.put(Qualities.NORMAL, urlToOptimize.replace("#Q#", "Q6A")); + urlMap.put(Qualities.HD, urlToOptimize.replace("#Q#", "Q8C")); } return urls; } + private Optional buildOrResolveSubs(JsonElement jsonElement) { Optional subtitleSource = JsonUtils.getElementValueAsString(jsonElement, TAG_SUBTITLE); @@ -185,7 +189,15 @@ private Optional> parseVideoFromSources(JsonElement root) } } } - return parseVideoFromThumbnail(root); + Optional> fallbackThumbnail = parseVideoFromThumbnail(root); + if (fallbackThumbnail.isPresent()) { + return fallbackThumbnail; + } + Optional> fallbackGapless = parseVideoFromGapless(root); + if (fallbackGapless.isPresent()) { + return fallbackGapless; + } + return Optional.empty(); } private Optional> parseVideoFromThumbnail(JsonElement root) { @@ -212,6 +224,28 @@ private Optional> parseVideoFromThumbnail(JsonElement roo return Optional.of(urls); } + private Optional> parseVideoFromGapless(JsonElement root) { + Map urls = new EnumMap<>(Qualities.class); + try { + Optional gaplessSourceAT = JsonUtils.getElement(root, "gapless_sources_austria", "hls"); + if (gaplessSourceAT.isPresent()) { + gaplessSourceAT.get().getAsJsonArray().forEach( e -> { + Optional url = JsonUtils.getElementValueAsString(e, "src"); + Optional drm = JsonUtils.getElementValueAsString(e, "is_drm_protected"); + if (url.isPresent() && drm.orElse("").equalsIgnoreCase("false")) { + urls.put(Qualities.NORMAL, url.get()); + } + }); + } + } catch (Exception e) { + LOG.error("generateFallbackVideo {}", e); + } + if (urls.size() == 0) { + return Optional.empty(); + } + return Optional.of(urls); + } + private Optional> readVideoForTargetCodec(JsonElement urlArray, String targetCodec) { Map urls = new EnumMap<>(Qualities.class); for (JsonElement videoElement : urlArray.getAsJsonArray()) {