Skip to content

Commit f8d6f94

Browse files
Do additional refactoring
1 parent c79afc0 commit f8d6f94

7 files changed

Lines changed: 55 additions & 88 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/localization/DateWrapper.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import javax.annotation.Nonnull;
44
import java.io.Serializable;
55
import java.time.Instant;
6+
import java.time.LocalDate;
67
import java.time.OffsetDateTime;
8+
import java.time.ZoneId;
79
import java.time.ZoneOffset;
810

911
/**
@@ -33,6 +35,14 @@ public DateWrapper(@Nonnull final Instant instant, final boolean isApproximation
3335
this.isApproximation = isApproximation;
3436
}
3537

38+
public DateWrapper(@Nonnull final LocalDate localDate) {
39+
this(localDate, true);
40+
}
41+
42+
public DateWrapper(@Nonnull final LocalDate localDate, final boolean isApproximation) {
43+
this(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant(), isApproximation);
44+
}
45+
3646
/**
3747
* @return the wrapped {@link Instant}
3848
*/
@@ -49,6 +59,14 @@ public OffsetDateTime offsetDateTime() {
4959
return instant.atOffset(ZoneOffset.UTC);
5060
}
5161

62+
/**
63+
* @return the wrapped {@link Instant} as a {@link LocalDate} in the current time zone.
64+
*/
65+
@Nonnull
66+
public LocalDate getLocalDate() {
67+
return LocalDate.ofInstant(instant, ZoneId.systemDefault());
68+
}
69+
5270
/**
5371
* @return if the date is considered is precise or just an approximation (e.g. service only
5472
* returns an approximation like 2 weeks ago instead of a precise date).

extractor/src/main/java/org/schabi/newpipe/extractor/localization/TimeAgoParser.java

Lines changed: 11 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import org.schabi.newpipe.extractor.timeago.PatternsHolder;
55
import org.schabi.newpipe.extractor.utils.Parser;
66

7-
import java.time.OffsetDateTime;
7+
import java.time.LocalDateTime;
8+
import java.time.ZoneId;
89
import java.time.temporal.ChronoUnit;
910
import java.util.Map;
1011
import java.util.regex.Pattern;
@@ -15,20 +16,7 @@
1516
*/
1617
public class TimeAgoParser {
1718
private final PatternsHolder patternsHolder;
18-
private final OffsetDateTime now;
19-
20-
/**
21-
* Creates a helper to parse upload dates in the format '2 days ago'.
22-
* <p>
23-
* Instantiate a new {@link TimeAgoParser} every time you extract a new batch of items.
24-
* </p>
25-
*
26-
* @param patternsHolder An object that holds the "time ago" patterns, special cases, and the
27-
* language word separator.
28-
*/
29-
public TimeAgoParser(final PatternsHolder patternsHolder) {
30-
this(patternsHolder, OffsetDateTime.now());
31-
}
19+
private final LocalDateTime now;
3220

3321
/**
3422
* Creates a helper to parse upload dates in the format '2 days ago'.
@@ -40,7 +28,7 @@ public TimeAgoParser(final PatternsHolder patternsHolder) {
4028
* language word separator.
4129
* @param now The current time
4230
*/
43-
public TimeAgoParser(final PatternsHolder patternsHolder, final OffsetDateTime now) {
31+
public TimeAgoParser(final PatternsHolder patternsHolder, final LocalDateTime now) {
4432
this.patternsHolder = patternsHolder;
4533
this.now = now;
4634
}
@@ -117,34 +105,15 @@ private boolean textualDateMatches(final String textualDate, final String agoPhr
117105
}
118106

119107
private DateWrapper getResultFor(final int timeAgoAmount, final ChronoUnit chronoUnit) {
120-
OffsetDateTime offsetDateTime = now;
121-
boolean isApproximation = false;
122-
123-
switch (chronoUnit) {
124-
case SECONDS:
125-
case MINUTES:
126-
case HOURS:
127-
offsetDateTime = offsetDateTime.minus(timeAgoAmount, chronoUnit);
128-
break;
129-
130-
case DAYS:
131-
case WEEKS:
132-
case MONTHS:
133-
offsetDateTime = offsetDateTime.minus(timeAgoAmount, chronoUnit);
134-
isApproximation = true;
135-
break;
136-
137-
case YEARS:
108+
final var resolvedDateTime = chronoUnit == ChronoUnit.YEARS
138109
// minusDays is needed to prevent `PrettyTime` from showing '12 months ago'.
139-
offsetDateTime = offsetDateTime.minusYears(timeAgoAmount).minusDays(1);
140-
isApproximation = true;
141-
break;
142-
}
110+
? now.minusYears(timeAgoAmount).minusDays(1)
111+
: now.minus(timeAgoAmount, chronoUnit);
143112

144-
if (isApproximation) {
145-
offsetDateTime = offsetDateTime.truncatedTo(ChronoUnit.HOURS);
113+
if (chronoUnit.isDateBased()) {
114+
return new DateWrapper(resolvedDateTime.toLocalDate());
115+
} else {
116+
return new DateWrapper(resolvedDateTime.atZone(ZoneId.systemDefault()).toInstant());
146117
}
147-
148-
return new DateWrapper(offsetDateTime, isApproximation);
149118
}
150119
}

extractor/src/main/java/org/schabi/newpipe/extractor/localization/TimeAgoPatternsManager.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import org.schabi.newpipe.extractor.timeago.PatternsHolder;
44
import org.schabi.newpipe.extractor.timeago.PatternsManager;
55

6-
import java.time.OffsetDateTime;
6+
import java.time.LocalDateTime;
77

88
import javax.annotation.Nonnull;
99
import javax.annotation.Nullable;
@@ -20,25 +20,13 @@ private static PatternsHolder getPatternsFor(@Nonnull final Localization localiz
2020

2121
@Nullable
2222
public static TimeAgoParser getTimeAgoParserFor(@Nonnull final Localization localization) {
23-
final PatternsHolder holder = getPatternsFor(localization);
24-
25-
if (holder == null) {
26-
return null;
27-
}
28-
29-
return new TimeAgoParser(holder);
23+
return getTimeAgoParserFor(localization, LocalDateTime.now());
3024
}
3125

3226
@Nullable
33-
public static TimeAgoParser getTimeAgoParserFor(
34-
@Nonnull final Localization localization,
35-
@Nonnull final OffsetDateTime now) {
27+
public static TimeAgoParser getTimeAgoParserFor(@Nonnull final Localization localization,
28+
@Nonnull final LocalDateTime now) {
3629
final PatternsHolder holder = getPatternsFor(localization);
37-
38-
if (holder == null) {
39-
return null;
40-
}
41-
42-
return new TimeAgoParser(holder, now);
30+
return holder == null ? null : new TimeAgoParser(holder, now);
4331
}
4432
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCRecentKiosk.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,10 @@ public InfoItemsPage<StreamInfoItem> getInitialPage() throws IOException, Extrac
5252

5353
// Streams in the recent kiosk are not ordered by the release date.
5454
// Sort them to have the latest stream at the beginning of the list.
55-
final Comparator<StreamInfoItem> comparator = Comparator
56-
.comparing(StreamInfoItem::getUploadDate, Comparator
57-
.nullsLast(Comparator.comparing(DateWrapper::getInstant)))
55+
final var comparator = Comparator.comparing(StreamInfoItem::getUploadDate,
56+
Comparator.nullsLast(Comparator.comparing(DateWrapper::getInstant)))
5857
.reversed();
59-
final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId(),
60-
comparator);
58+
final var collector = new StreamInfoItemsCollector(getServiceId(), comparator);
6159

6260
events.stream()
6361
.filter(JsonObject.class::isInstance)

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@
8888
import java.nio.charset.StandardCharsets;
8989
import java.time.LocalDate;
9090
import java.time.OffsetDateTime;
91-
import java.time.ZoneId;
9291
import java.time.format.DateTimeFormatter;
9392
import java.time.format.DateTimeParseException;
9493
import java.util.ArrayList;
@@ -219,22 +218,21 @@ public DateWrapper getUploadDate() throws ParsingException {
219218
try {
220219
return new DateWrapper(OffsetDateTime.parse(dateText));
221220
} catch (final DateTimeParseException e) {
221+
// Try other patterns first
222222
}
223223

224224
try { // Premiered 20 hours ago
225225
final var localization = new Localization("en");
226226
return TimeAgoPatternsManager.getTimeAgoParserFor(localization).parse(dateText);
227227
} catch (final ParsingException e) {
228+
// Try other patterns first
228229
}
229230

230231
return parseOptionalDate(dateText, "MMM dd, yyyy")
231232
.or(() -> parseOptionalDate(dateText, "dd MMM yyyy"))
232-
.map(date -> {
233-
final var instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();
234-
return new DateWrapper(instant, true);
235-
})
236-
.orElseThrow(() -> new ParsingException("Could not parse upload date \""
237-
+ dateText + "\""));
233+
.map(DateWrapper::new)
234+
.orElseThrow(() ->
235+
new ParsingException("Could not parse upload date \"" + dateText + "\""));
238236
}
239237

240238
private Optional<LocalDate> parseOptionalDate(final String date, final String pattern) {

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/kiosk/YoutubeChartsBaseKioskExtractor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public String getTextualUploadDate() {
203203
@Nonnull
204204
@Override
205205
public DateWrapper getUploadDate() {
206-
final JsonObject releaseDate = videoObject.getObject("releaseDate");
206+
final var releaseDate = videoObject.getObject("releaseDate");
207207
final var localDate = LocalDate.of(releaseDate.getInt("year"),
208208
releaseDate.getInt("month"), releaseDate.getInt("day"));
209209
// We request that times should be returned with 0 offset to UTC timezone in

extractor/src/test/java/org/schabi/newpipe/extractor/localization/TimeAgoParserTest.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@
1111

1212
import java.time.Duration;
1313
import java.time.LocalDateTime;
14-
import java.time.OffsetDateTime;
15-
import java.time.ZoneOffset;
14+
import java.time.Month;
15+
import java.time.ZoneId;
1616
import java.time.temporal.ChronoUnit;
17-
import java.util.Objects;
1817
import java.util.function.Function;
1918
import java.util.stream.Stream;
2019

@@ -41,34 +40,31 @@ public static Stream<Arguments> parseTimeAgo() {
4140
@ParameterizedTest
4241
@MethodSource
4342
void parseTimeAgo(final ParseTimeAgoTestData testData) {
44-
final OffsetDateTime now = OffsetDateTime.of(
45-
LocalDateTime.of(2020, 1, 1, 1, 1, 1),
46-
ZoneOffset.UTC);
47-
final TimeAgoParser parser = Objects.requireNonNull(
48-
TimeAgoPatternsManager.getTimeAgoParserFor(Localization.DEFAULT, now));
49-
50-
final OffsetDateTime expected = testData.getExpectedApplyToNow().apply(now);
43+
final var now = LocalDateTime.of(2020, Month.JANUARY, 1, 1, 1, 1);
44+
final var parser = TimeAgoPatternsManager.getTimeAgoParserFor(Localization.DEFAULT, now);
45+
final var expected = testData.getExpectedApplyToNow().apply(now);
46+
final var zoneId = ZoneId.systemDefault();
5147

5248
assertAll(
5349
Stream.of(
5450
testData.getTextualDateLong(),
5551
testData.getTextualDateShort())
5652
.map(textualDate -> () -> assertEquals(
5753
expected,
58-
parser.parse(textualDate).offsetDateTime(),
54+
LocalDateTime.ofInstant(parser.parse(textualDate).getInstant(), zoneId),
5955
"Expected " + expected + " for " + textualDate
6056
))
6157
);
6258
}
6359

6460
static class ParseTimeAgoTestData {
6561
public static final String AGO_SUFFIX = " ago";
66-
private final Function<OffsetDateTime, OffsetDateTime> expectedApplyToNow;
62+
private final Function<LocalDateTime, LocalDateTime> expectedApplyToNow;
6763
private final String textualDateLong;
6864
private final String textualDateShort;
6965

7066
ParseTimeAgoTestData(
71-
final Function<OffsetDateTime, OffsetDateTime> expectedApplyToNow,
67+
final Function<LocalDateTime, LocalDateTime> expectedApplyToNow,
7268
final String textualDateLong,
7369
final String textualDateShort
7470
) {
@@ -89,17 +85,17 @@ public static ParseTimeAgoTestData lessThanDay(
8985
}
9086

9187
public static ParseTimeAgoTestData greaterThanDay(
92-
final Function<OffsetDateTime, OffsetDateTime> expectedApplyToNow,
88+
final Function<LocalDateTime, LocalDateTime> expectedApplyToNow,
9389
final String textualDateLong,
9490
final String textualDateShort
9591
) {
9692
return new ParseTimeAgoTestData(
97-
d -> expectedApplyToNow.apply(d).truncatedTo(ChronoUnit.HOURS),
93+
expectedApplyToNow.andThen(d -> d.truncatedTo(ChronoUnit.DAYS)),
9894
textualDateLong + AGO_SUFFIX,
9995
textualDateShort + AGO_SUFFIX);
10096
}
10197

102-
public Function<OffsetDateTime, OffsetDateTime> getExpectedApplyToNow() {
98+
public Function<LocalDateTime, LocalDateTime> getExpectedApplyToNow() {
10399
return expectedApplyToNow;
104100
}
105101

0 commit comments

Comments
 (0)