From 5972cacdc901eddc84905acf9fa950a1c30c34b1 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Thu, 25 Apr 2024 08:21:36 +0200 Subject: [PATCH 1/4] add episode to title --- .../crawler/sender/base/JsonUtils.java | 2 +- .../zdf/json/ZdfFilmDetailDeserializer.java | 75 ++++++++++++------- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/src/main/java/mServer/crawler/sender/base/JsonUtils.java b/src/main/java/mServer/crawler/sender/base/JsonUtils.java index b21495e37..296b87f59 100644 --- a/src/main/java/mServer/crawler/sender/base/JsonUtils.java +++ b/src/main/java/mServer/crawler/sender/base/JsonUtils.java @@ -142,7 +142,7 @@ public static Optional getElementValueAsString(final JsonElement aJsonEl public static Optional getElement(final JsonElement aJsonElement, final String... aElementIds) { Optional rs = Optional.empty(); - if (aElementIds == null || aElementIds.length == 0) { + if (aElementIds == null || aElementIds.length == 0 || aJsonElement == null || !aJsonElement.isJsonObject()) { return rs; } JsonObject aJsonObject = aJsonElement.getAsJsonObject(); diff --git a/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java b/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java index c0e173561..0a2eb1abf 100644 --- a/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java +++ b/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java @@ -39,7 +39,9 @@ public class ZdfFilmDetailDeserializer implements JsonDeserializer parseDescription(JsonObject aRootNode) { return Optional.empty(); } - private Optional parseTitle(JsonObject aRootNode, JsonObject aTarget) { - Optional title = parseTitleValue(aRootNode, aTarget); - return title.map(s -> s.replaceAll("\\(CC.*\\) - .* Creative Commons.*", "")); + private Optional parseTitle(final JsonObject aRootNode, final JsonObject aTarget) { + final Optional programmTitle = JsonUtils.getElementValueAsString(aRootNode, JSON_ELEMENT_TITLE); + final Optional programmSubtitle = JsonUtils.getElementValueAsString(aRootNode, JSON_ELEMENT_SUBTITLE); + Optional resultingTitle = formatTitle(programmTitle, programmSubtitle); + if (resultingTitle.isEmpty()) { + final Optional targetTitle = JsonUtils.getElementValueAsString(aTarget, JSON_ELEMENT_TITLE); + final Optional targetSubtitle = JsonUtils.getElementValueAsString(aTarget, JSON_ELEMENT_SUBTITLE); + resultingTitle = formatTitle(targetTitle, targetSubtitle); + } + if (resultingTitle.isPresent()) { + final Optional season = JsonUtils.getElementValueAsString(aTarget, SEASONNUMBER); + final Optional episode = JsonUtils.getElementValueAsString(aTarget, EPISODENUMBER); + final Optional seasonEpisodeTitle = formatEpisodeTitle(season, episode); + final Optional title = cleanupTitle((resultingTitle.get() + " " + seasonEpisodeTitle.orElse("")).trim()); + return title; + } + return Optional.empty(); } - - private Optional parseTitleValue(JsonObject aRootNode, JsonObject aTarget) { - // use property "title" if found - JsonElement titleElement = aRootNode.get(JSON_ELEMENT_TITLE); - if (titleElement != null) { - JsonElement subTitleElement = aRootNode.get(JSON_ELEMENT_SUBTITLE); - if (subTitleElement != null) { - return Optional.of(titleElement.getAsString().trim() + " - " + subTitleElement.getAsString()); - } else { - return Optional.of(titleElement.getAsString()); - } + + private Optional cleanupTitle(String title) { + return Optional.of(title.replaceAll("\\(CC.*\\) - .* Creative Commons.*", "")); + } + + private Optional formatTitle(Optional title, Optional sub) { + if (title.isEmpty()) { + return Optional.empty(); + } + if (sub.isPresent()) { + return Optional.of(title.get().trim() + " - " + sub.get().trim()); } else { - // programmItem target required to determine title - if (aTarget != null && aTarget.has(JSON_ELEMENT_TITLE)) { - String title = aTarget.get(JSON_ELEMENT_TITLE).getAsString(); - String subTitle = aTarget.get(JSON_ELEMENT_SUBTITLE).getAsString(); - - if (subTitle.isEmpty()) { - return Optional.of(title); - } else { - return Optional.of(title.trim() + " - " + subTitle); - } - } + return Optional.of(title.get().trim()); } - - return Optional.empty(); } - + + private Optional formatEpisodeTitle(Optional season, Optional episode) { + if (season.isEmpty() && episode.isEmpty()) { + return Optional.empty(); + } + String result = ""; + if (season.isPresent()) { + result += "S"+season.get(); + } + if (episode.isPresent()) { + result += "E"+episode.get(); + } + return Optional.of("("+result+")"); + } private Optional parseTopic(JsonObject aRootNode) { JsonObject brand = aRootNode.getAsJsonObject(JSON_ELEMENT_BRAND); JsonObject category = aRootNode.getAsJsonObject(JSON_ELEMENT_CATEGORY); From 1075afc21283fc86b0cf31553a2e783354176094 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Wed, 8 May 2024 20:15:29 +0200 Subject: [PATCH 2/4] add parsevideofromthumbnail --- .../orfon/json/OrfOnEpisodeDeserializer.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) 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 16ce043d9..b4358b1ca 100644 --- a/src/main/java/mServer/crawler/sender/orfon/json/OrfOnEpisodeDeserializer.java +++ b/src/main/java/mServer/crawler/sender/orfon/json/OrfOnEpisodeDeserializer.java @@ -45,6 +45,7 @@ public class OrfOnEpisodeDeserializer implements JsonDeserializer parseSubtitleUrls(JsonElement element) { return JsonUtils.getElementValueAsString(element, TAG_SUBTITLE_TTML); } - private Optional> parseUrl(JsonElement jsonElement) { + private Optional> parseVideoFromSegmentPlaylist(JsonElement jsonElement) { Optional videoPath1 = JsonUtils.getElement(jsonElement, TAG_VIDEO_PATH_1); if (videoPath1.isEmpty() || !videoPath1.get().isJsonArray() || videoPath1.get().getAsJsonArray().size() == 0) { return Optional.empty(); @@ -157,10 +158,10 @@ private Optional> parseUrl(JsonElement jsonElement) { } } } - return parseFallbackVideo(jsonElement); + return parseVideoFromSources(jsonElement); } - private Optional> parseFallbackVideo(JsonElement root) { + private Optional> parseVideoFromSources(JsonElement root) { Optional videoSources = JsonUtils.getElement(root, TAG_VIDEO_FALLBACK); if (videoSources.isPresent()) { Map urls = new EnumMap<>(Qualities.class); @@ -177,7 +178,31 @@ private Optional> parseFallbackVideo(JsonElement root) { } } } - return Optional.empty(); + return parseVideoFromThumbnail(root); + } + + private Optional> parseVideoFromThumbnail(JsonElement root) { + Map urls = new EnumMap<>(Qualities.class); + try { + Optional id = JsonUtils.getElement(root, TAG_ID); + Optional thumbnailSources = JsonUtils.getElement(root, VIDEO_THUMBNAIL); + if (id.isPresent() && thumbnailSources.isPresent() && thumbnailSources.get().isJsonArray() && thumbnailSources.get().getAsJsonArray().size() > 0 ) { + Optional thumbnailSrc = JsonUtils.getElement(thumbnailSources.get().getAsJsonArray().get(0), "src"); + if (thumbnailSrc.isPresent()) { + int indexId = thumbnailSrc.get().getAsString().indexOf(id.get().getAsString()); + String fromSecondIdOnwards = thumbnailSrc.get().getAsString().substring(indexId + id.get().getAsString().length() + 1); + String secondId = fromSecondIdOnwards.substring(0, fromSecondIdOnwards.indexOf("_")); + String url = String.format("https://apasfiis.sf.apa.at/ipad/cms-worldwide_episodes/%s_%s_QXA.mp4/playlist.m3u8", id.get().getAsString(), secondId); + urls.put(Qualities.NORMAL, url); + } + } + } 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) { From a0e81cb7e914611814c75829ae0d681573050bf0 Mon Sep 17 00:00:00 2001 From: CodingPF Date: Wed, 8 May 2024 20:57:19 +0200 Subject: [PATCH 3/4] two digit season and episode --- .../java/mServer/crawler/sender/base/JsonUtils.java | 7 +++++++ .../sender/zdf/json/ZdfFilmDetailDeserializer.java | 12 ++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/mServer/crawler/sender/base/JsonUtils.java b/src/main/java/mServer/crawler/sender/base/JsonUtils.java index 296b87f59..3b0566f7e 100644 --- a/src/main/java/mServer/crawler/sender/base/JsonUtils.java +++ b/src/main/java/mServer/crawler/sender/base/JsonUtils.java @@ -113,6 +113,13 @@ public static boolean hasElements( return true; } + public static Optional getElementValueAsInteger(final JsonElement aJsonElement, final String... aElementIds) { + Optional rs = JsonUtils.getElement(aJsonElement, aElementIds); + if (rs.isPresent()) { + return Optional.of(rs.get().getAsInt()); + } + return Optional.empty(); + } /** * Checks if the {@link JsonObject} has all given elements and if no element * is null or empty. diff --git a/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java b/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java index 0a2eb1abf..3c63ec63e 100644 --- a/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java +++ b/src/main/java/mServer/crawler/sender/zdf/json/ZdfFilmDetailDeserializer.java @@ -227,8 +227,8 @@ private Optional parseTitle(final JsonObject aRootNode, final JsonObject resultingTitle = formatTitle(targetTitle, targetSubtitle); } if (resultingTitle.isPresent()) { - final Optional season = JsonUtils.getElementValueAsString(aTarget, SEASONNUMBER); - final Optional episode = JsonUtils.getElementValueAsString(aTarget, EPISODENUMBER); + final Optional season = JsonUtils.getElementValueAsInteger(aTarget, SEASONNUMBER); + final Optional episode = JsonUtils.getElementValueAsInteger(aTarget, EPISODENUMBER); final Optional seasonEpisodeTitle = formatEpisodeTitle(season, episode); final Optional title = cleanupTitle((resultingTitle.get() + " " + seasonEpisodeTitle.orElse("")).trim()); return title; @@ -244,23 +244,23 @@ private Optional formatTitle(Optional title, Optional su if (title.isEmpty()) { return Optional.empty(); } - if (sub.isPresent()) { + if (sub.isPresent() && !sub.get().isBlank()) { return Optional.of(title.get().trim() + " - " + sub.get().trim()); } else { return Optional.of(title.get().trim()); } } - private Optional formatEpisodeTitle(Optional season, Optional episode) { + private Optional formatEpisodeTitle(Optional season, Optional episode) { if (season.isEmpty() && episode.isEmpty()) { return Optional.empty(); } String result = ""; if (season.isPresent()) { - result += "S"+season.get(); + result += String.format("S%02d", season.get()); } if (episode.isPresent()) { - result += "E"+episode.get(); + result += String.format("E%02d", episode.get()); } return Optional.of("("+result+")"); } From 8c626955906eb96d0beb64fe83d6352b8886ce48 Mon Sep 17 00:00:00 2001 From: Alexander F Date: Fri, 10 May 2024 21:14:17 +0200 Subject: [PATCH 4/4] Version auf 3.1.232 angehoben --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d0beaaa07..94f260d27 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 group = 'de.mediathekview' archivesBaseName = "MServer" -version = '3.1.231' +version = '3.1.232' def jarName = 'MServer.jar' def mainClass = 'mServer.Main'