From 7598b40957966416a9ba608909c9f7d717dada78 Mon Sep 17 00:00:00 2001
From: litetex <40789489+litetex@users.noreply.github.com>
Date: Thu, 17 Mar 2022 14:50:12 +0100
Subject: [PATCH] Workaround for incorrect duration for "YT shorts" videos in
channels
As a workaround 0 is returned as duration for such videos.
See also https://github.com/TeamNewPipe/NewPipe/issues/8034
---
.../youtube/YoutubeParsingHelper.java | 32 ++++++++++++++++---
.../YoutubeStreamInfoItemExtractor.java | 5 +++
2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java
index bbf6168ad..7deb2a0ae 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java
@@ -219,10 +219,34 @@ public final class YoutubeParsingHelper {
throw new ParsingException("Error duration string with unknown format: " + input);
}
- return ((Integer.parseInt(Utils.removeNonDigitCharacters(days)) * 24
- + Integer.parseInt(Utils.removeNonDigitCharacters(hours))) * 60
- + Integer.parseInt(Utils.removeNonDigitCharacters(minutes))) * 60
- + Integer.parseInt(Utils.removeNonDigitCharacters(seconds));
+ return ((convertDurationToInt(days) * 24
+ + convertDurationToInt(hours)) * 60
+ + convertDurationToInt(minutes)) * 60
+ + convertDurationToInt(seconds);
+ }
+
+ /**
+ * Tries to convert a duration string to an integer without throwing an exception.
+ *
+ * Helper method for {@link #parseDurationString(String)}.
+ *
+ * Note: This method is also used as a workaround for NewPipe#8034 (YT shorts no longer
+ * display any duration in channels).
+ *
+ * @param input The string to process
+ * @return The converted integer or 0 if the conversion failed.
+ */
+ private static int convertDurationToInt(final String input) {
+ if (input == null || input.isEmpty()) {
+ return 0;
+ }
+
+ final String clearedInput = Utils.removeNonDigitCharacters(input);
+ try {
+ return Integer.parseInt(clearedInput);
+ } catch (final NumberFormatException ex) {
+ return 0;
+ }
}
@Nonnull
diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java
index 67be244d0..08b769975 100644
--- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java
+++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java
@@ -138,6 +138,11 @@ public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor {
}
}
+ // NewPipe#8034 - YT returns not a correct duration for "YT shorts" videos
+ if ("SHORTS".equals(duration)) {
+ return 0;
+ }
+
return YoutubeParsingHelper.parseDurationString(duration);
}