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); }