From a67873a98a3cb837aa25ff65423d46ffc25c3ad1 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Fri, 29 Nov 2024 05:16:08 +0530 Subject: [PATCH] Use BufferedReader#lines() --- .../YoutubeSubscriptionExtractor.java | 83 +++++-------------- 1 file changed, 19 insertions(+), 64 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeSubscriptionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeSubscriptionExtractor.java index 403151f075..7293a37d5d 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeSubscriptionExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeSubscriptionExtractor.java @@ -14,9 +14,11 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.UncheckedIOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -110,7 +112,7 @@ public List fromZipInputStream(@Nonnull final InputStream cont // Return it only if it has items (it exits early if it's the wrong file // format), otherwise try the next file - if (csvItems.size() > 0) { + if (!csvItems.isEmpty()) { return csvItems; } } catch (final ExtractionException e) { @@ -138,69 +140,22 @@ public List fromCsvInputStream(@Nonnull final InputStream cont // The first line is always a header // Header names are different based on the locale // Fortunately the data is always the same order no matter what locale - - int currentLine = 0; - String line = ""; - - try (BufferedReader br = new BufferedReader(new InputStreamReader(contentInputStream))) { - final List subscriptionItems = new ArrayList<>(); - - // ignore header and skip first line - currentLine = 1; - line = br.readLine(); - - while ((line = br.readLine()) != null) { - currentLine++; - - // Exit early if we've read the first few lines and we haven't added any items - // It's likely we're in the wrong file - if (currentLine > 5 && subscriptionItems.size() == 0) { - break; - } - - // First comma - final int i1 = line.indexOf(","); - if (i1 == -1) { - continue; - } - - // Second comma - final int i2 = line.indexOf(",", i1 + 1); - if (i2 == -1) { - continue; - } - - // Third comma or line length - int i3 = line.indexOf(",", i2 + 1); - if (i3 == -1) { - i3 = line.length(); - } - - // Channel URL from second entry - final String channelUrl = line - .substring(i1 + 1, i2) - .replace("http://", "https://"); - if (!channelUrl.startsWith(BASE_CHANNEL_URL)) { - continue; - } - - // Channel title from third entry - final String channelTitle = line.substring(i2 + 1, i3); - - final SubscriptionItem newItem - = new SubscriptionItem(service.getServiceId(), channelUrl, channelTitle); - subscriptionItems.add(newItem); - } - - return subscriptionItems; - } catch (final IOException e) { - if (line == null) { - line = ""; - } else if (line.length() > 10) { - line = line.substring(0, 10) + "..."; - } - throw new InvalidSourceException("Error reading CSV file on line = \"" + line - + "\", line number = " + currentLine, e); + try (var reader = new BufferedReader(new InputStreamReader(contentInputStream))) { + return reader.lines() + .skip(1) // ignore header and skip first line + .map(line -> line.split(",")) + .filter(values -> values.length >= 3) + .map(values -> { + // Channel URL from second entry + final String channelUrl = values[1].replace("http://", "https://"); + // Channel title from third entry + final String title = values[2]; + + return new SubscriptionItem(service.getServiceId(), channelUrl, title); + }) + .collect(Collectors.toUnmodifiableList()); + } catch (final UncheckedIOException | IOException e) { + throw new InvalidSourceException("Error reading CSV file", e); } } }